forked from mirrors/linux
		
	ia64/xen: Remove Xen support for ia64
ia64 has not been supported by Xen since 4.2 so it's time to drop Xen/ia64 from Linux as well. Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
This commit is contained in:
		
							parent
							
								
									374b105797
								
							
						
					
					
						commit
						d52eefb47d
					
				
					 50 changed files with 2 additions and 5118 deletions
				
			
		| 
						 | 
				
			
			@ -147,9 +147,6 @@ config PARAVIRT
 | 
			
		|||
	  over full virtualization.  However, when run without a hypervisor
 | 
			
		||||
	  the kernel is theoretically slower and slightly larger.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
source "arch/ia64/xen/Kconfig"
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
| 
						 | 
				
			
			@ -175,7 +172,6 @@ config IA64_GENERIC
 | 
			
		|||
	  SGI-SN2		For SGI Altix systems
 | 
			
		||||
	  SGI-UV		For SGI UV systems
 | 
			
		||||
	  Ski-simulator		For the HP simulator <http://www.hpl.hp.com/research/linux/ski/>
 | 
			
		||||
	  Xen-domU		For xen domU system
 | 
			
		||||
 | 
			
		||||
	  If you don't know what to do, choose "generic".
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -231,14 +227,6 @@ config IA64_HP_SIM
 | 
			
		|||
	bool "Ski-simulator"
 | 
			
		||||
	select SWIOTLB
 | 
			
		||||
 | 
			
		||||
config IA64_XEN_GUEST
 | 
			
		||||
	bool "Xen guest"
 | 
			
		||||
	select SWIOTLB
 | 
			
		||||
	depends on XEN
 | 
			
		||||
	help
 | 
			
		||||
	  Build a kernel that runs on Xen guest domain. At this moment only
 | 
			
		||||
	  16KB page size in supported.
 | 
			
		||||
 | 
			
		||||
endchoice
 | 
			
		||||
 | 
			
		||||
choice
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,11 +51,9 @@ core-$(CONFIG_IA64_DIG_VTD) 	+= arch/ia64/dig/
 | 
			
		|||
core-$(CONFIG_IA64_GENERIC) 	+= arch/ia64/dig/
 | 
			
		||||
core-$(CONFIG_IA64_HP_ZX1)	+= arch/ia64/dig/
 | 
			
		||||
core-$(CONFIG_IA64_HP_ZX1_SWIOTLB) += arch/ia64/dig/
 | 
			
		||||
core-$(CONFIG_IA64_XEN_GUEST)	+= arch/ia64/dig/
 | 
			
		||||
core-$(CONFIG_IA64_SGI_SN2)	+= arch/ia64/sn/
 | 
			
		||||
core-$(CONFIG_IA64_SGI_UV)	+= arch/ia64/uv/
 | 
			
		||||
core-$(CONFIG_KVM) 		+= arch/ia64/kvm/
 | 
			
		||||
core-$(CONFIG_XEN)		+= arch/ia64/xen/
 | 
			
		||||
 | 
			
		||||
drivers-$(CONFIG_PCI)		+= arch/ia64/pci/
 | 
			
		||||
drivers-$(CONFIG_IA64_HP_SIM)	+= arch/ia64/hp/sim/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,199 +0,0 @@
 | 
			
		|||
CONFIG_EXPERIMENTAL=y
 | 
			
		||||
CONFIG_SYSVIPC=y
 | 
			
		||||
CONFIG_POSIX_MQUEUE=y
 | 
			
		||||
CONFIG_IKCONFIG=y
 | 
			
		||||
CONFIG_IKCONFIG_PROC=y
 | 
			
		||||
CONFIG_LOG_BUF_SHIFT=20
 | 
			
		||||
CONFIG_SYSFS_DEPRECATED_V2=y
 | 
			
		||||
CONFIG_BLK_DEV_INITRD=y
 | 
			
		||||
CONFIG_KALLSYMS_ALL=y
 | 
			
		||||
CONFIG_MODULES=y
 | 
			
		||||
CONFIG_MODULE_UNLOAD=y
 | 
			
		||||
CONFIG_MODVERSIONS=y
 | 
			
		||||
CONFIG_MODULE_SRCVERSION_ALL=y
 | 
			
		||||
# CONFIG_BLK_DEV_BSG is not set
 | 
			
		||||
CONFIG_PARAVIRT_GUEST=y
 | 
			
		||||
CONFIG_IA64_XEN_GUEST=y
 | 
			
		||||
CONFIG_MCKINLEY=y
 | 
			
		||||
CONFIG_IA64_CYCLONE=y
 | 
			
		||||
CONFIG_SMP=y
 | 
			
		||||
CONFIG_NR_CPUS=16
 | 
			
		||||
CONFIG_HOTPLUG_CPU=y
 | 
			
		||||
CONFIG_PERMIT_BSP_REMOVE=y
 | 
			
		||||
CONFIG_FORCE_CPEI_RETARGET=y
 | 
			
		||||
CONFIG_IA64_MCA_RECOVERY=y
 | 
			
		||||
CONFIG_PERFMON=y
 | 
			
		||||
CONFIG_IA64_PALINFO=y
 | 
			
		||||
CONFIG_KEXEC=y
 | 
			
		||||
CONFIG_EFI_VARS=y
 | 
			
		||||
CONFIG_BINFMT_MISC=m
 | 
			
		||||
CONFIG_ACPI_PROCFS=y
 | 
			
		||||
CONFIG_ACPI_BUTTON=m
 | 
			
		||||
CONFIG_ACPI_FAN=m
 | 
			
		||||
CONFIG_ACPI_PROCESSOR=m
 | 
			
		||||
CONFIG_ACPI_CONTAINER=m
 | 
			
		||||
CONFIG_HOTPLUG_PCI=y
 | 
			
		||||
CONFIG_HOTPLUG_PCI_ACPI=m
 | 
			
		||||
CONFIG_PACKET=y
 | 
			
		||||
CONFIG_UNIX=y
 | 
			
		||||
CONFIG_INET=y
 | 
			
		||||
CONFIG_IP_MULTICAST=y
 | 
			
		||||
CONFIG_ARPD=y
 | 
			
		||||
CONFIG_SYN_COOKIES=y
 | 
			
		||||
# CONFIG_INET_LRO is not set
 | 
			
		||||
# CONFIG_IPV6 is not set
 | 
			
		||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 | 
			
		||||
CONFIG_BLK_DEV_LOOP=m
 | 
			
		||||
CONFIG_BLK_DEV_CRYPTOLOOP=m
 | 
			
		||||
CONFIG_BLK_DEV_NBD=m
 | 
			
		||||
CONFIG_BLK_DEV_RAM=y
 | 
			
		||||
CONFIG_IDE=y
 | 
			
		||||
CONFIG_BLK_DEV_IDECD=y
 | 
			
		||||
CONFIG_BLK_DEV_GENERIC=y
 | 
			
		||||
CONFIG_BLK_DEV_CMD64X=y
 | 
			
		||||
CONFIG_BLK_DEV_PIIX=y
 | 
			
		||||
CONFIG_SCSI=y
 | 
			
		||||
CONFIG_BLK_DEV_SD=y
 | 
			
		||||
CONFIG_CHR_DEV_ST=m
 | 
			
		||||
CONFIG_BLK_DEV_SR=m
 | 
			
		||||
CONFIG_CHR_DEV_SG=m
 | 
			
		||||
CONFIG_SCSI_SYM53C8XX_2=y
 | 
			
		||||
CONFIG_SCSI_QLOGIC_1280=y
 | 
			
		||||
CONFIG_MD=y
 | 
			
		||||
CONFIG_BLK_DEV_MD=m
 | 
			
		||||
CONFIG_MD_LINEAR=m
 | 
			
		||||
CONFIG_MD_RAID0=m
 | 
			
		||||
CONFIG_MD_RAID1=m
 | 
			
		||||
CONFIG_MD_MULTIPATH=m
 | 
			
		||||
CONFIG_BLK_DEV_DM=m
 | 
			
		||||
CONFIG_DM_CRYPT=m
 | 
			
		||||
CONFIG_DM_SNAPSHOT=m
 | 
			
		||||
CONFIG_DM_MIRROR=m
 | 
			
		||||
CONFIG_DM_ZERO=m
 | 
			
		||||
CONFIG_FUSION=y
 | 
			
		||||
CONFIG_FUSION_SPI=y
 | 
			
		||||
CONFIG_FUSION_FC=y
 | 
			
		||||
CONFIG_FUSION_CTL=y
 | 
			
		||||
CONFIG_NETDEVICES=y
 | 
			
		||||
CONFIG_DUMMY=m
 | 
			
		||||
CONFIG_NET_ETHERNET=y
 | 
			
		||||
CONFIG_NET_TULIP=y
 | 
			
		||||
CONFIG_TULIP=m
 | 
			
		||||
CONFIG_NET_PCI=y
 | 
			
		||||
CONFIG_NET_VENDOR_INTEL=y
 | 
			
		||||
CONFIG_E100=m
 | 
			
		||||
CONFIG_E1000=y
 | 
			
		||||
CONFIG_TIGON3=y
 | 
			
		||||
CONFIG_NETCONSOLE=y
 | 
			
		||||
# CONFIG_SERIO_SERPORT is not set
 | 
			
		||||
CONFIG_GAMEPORT=m
 | 
			
		||||
CONFIG_SERIAL_NONSTANDARD=y
 | 
			
		||||
CONFIG_SERIAL_8250=y
 | 
			
		||||
CONFIG_SERIAL_8250_CONSOLE=y
 | 
			
		||||
CONFIG_SERIAL_8250_NR_UARTS=6
 | 
			
		||||
CONFIG_SERIAL_8250_EXTENDED=y
 | 
			
		||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
 | 
			
		||||
# CONFIG_HW_RANDOM is not set
 | 
			
		||||
CONFIG_EFI_RTC=y
 | 
			
		||||
CONFIG_RAW_DRIVER=m
 | 
			
		||||
CONFIG_HPET=y
 | 
			
		||||
CONFIG_AGP=m
 | 
			
		||||
CONFIG_DRM=m
 | 
			
		||||
CONFIG_DRM_TDFX=m
 | 
			
		||||
CONFIG_DRM_R128=m
 | 
			
		||||
CONFIG_DRM_RADEON=m
 | 
			
		||||
CONFIG_DRM_MGA=m
 | 
			
		||||
CONFIG_DRM_SIS=m
 | 
			
		||||
CONFIG_HID_GYRATION=y
 | 
			
		||||
CONFIG_HID_NTRIG=y
 | 
			
		||||
CONFIG_HID_PANTHERLORD=y
 | 
			
		||||
CONFIG_HID_PETALYNX=y
 | 
			
		||||
CONFIG_HID_SAMSUNG=y
 | 
			
		||||
CONFIG_HID_SONY=y
 | 
			
		||||
CONFIG_HID_SUNPLUS=y
 | 
			
		||||
CONFIG_HID_TOPSEED=y
 | 
			
		||||
CONFIG_USB=y
 | 
			
		||||
CONFIG_USB_DEVICEFS=y
 | 
			
		||||
CONFIG_USB_EHCI_HCD=m
 | 
			
		||||
CONFIG_USB_OHCI_HCD=m
 | 
			
		||||
CONFIG_USB_UHCI_HCD=y
 | 
			
		||||
CONFIG_USB_STORAGE=m
 | 
			
		||||
CONFIG_EXT2_FS=y
 | 
			
		||||
CONFIG_EXT2_FS_XATTR=y
 | 
			
		||||
CONFIG_EXT2_FS_POSIX_ACL=y
 | 
			
		||||
CONFIG_EXT2_FS_SECURITY=y
 | 
			
		||||
CONFIG_EXT3_FS=y
 | 
			
		||||
CONFIG_EXT3_FS_POSIX_ACL=y
 | 
			
		||||
CONFIG_EXT3_FS_SECURITY=y
 | 
			
		||||
CONFIG_REISERFS_FS=y
 | 
			
		||||
CONFIG_REISERFS_FS_XATTR=y
 | 
			
		||||
CONFIG_REISERFS_FS_POSIX_ACL=y
 | 
			
		||||
CONFIG_REISERFS_FS_SECURITY=y
 | 
			
		||||
CONFIG_XFS_FS=y
 | 
			
		||||
CONFIG_AUTOFS_FS=y
 | 
			
		||||
CONFIG_AUTOFS4_FS=y
 | 
			
		||||
CONFIG_ISO9660_FS=m
 | 
			
		||||
CONFIG_JOLIET=y
 | 
			
		||||
CONFIG_UDF_FS=m
 | 
			
		||||
CONFIG_VFAT_FS=y
 | 
			
		||||
CONFIG_NTFS_FS=m
 | 
			
		||||
CONFIG_PROC_KCORE=y
 | 
			
		||||
CONFIG_TMPFS=y
 | 
			
		||||
CONFIG_HUGETLBFS=y
 | 
			
		||||
CONFIG_NFS_FS=m
 | 
			
		||||
CONFIG_NFS_V3=y
 | 
			
		||||
CONFIG_NFS_V4=y
 | 
			
		||||
CONFIG_NFSD=m
 | 
			
		||||
CONFIG_NFSD_V4=y
 | 
			
		||||
CONFIG_SMB_FS=m
 | 
			
		||||
CONFIG_SMB_NLS_DEFAULT=y
 | 
			
		||||
CONFIG_CIFS=m
 | 
			
		||||
CONFIG_PARTITION_ADVANCED=y
 | 
			
		||||
CONFIG_SGI_PARTITION=y
 | 
			
		||||
CONFIG_EFI_PARTITION=y
 | 
			
		||||
CONFIG_NLS_CODEPAGE_437=y
 | 
			
		||||
CONFIG_NLS_CODEPAGE_737=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_775=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_850=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_852=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_855=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_857=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_860=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_861=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_862=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_863=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_864=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_865=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_866=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_869=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_936=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_950=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_932=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_949=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_874=m
 | 
			
		||||
CONFIG_NLS_ISO8859_8=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_1250=m
 | 
			
		||||
CONFIG_NLS_CODEPAGE_1251=m
 | 
			
		||||
CONFIG_NLS_ISO8859_1=y
 | 
			
		||||
CONFIG_NLS_ISO8859_2=m
 | 
			
		||||
CONFIG_NLS_ISO8859_3=m
 | 
			
		||||
CONFIG_NLS_ISO8859_4=m
 | 
			
		||||
CONFIG_NLS_ISO8859_5=m
 | 
			
		||||
CONFIG_NLS_ISO8859_6=m
 | 
			
		||||
CONFIG_NLS_ISO8859_7=m
 | 
			
		||||
CONFIG_NLS_ISO8859_9=m
 | 
			
		||||
CONFIG_NLS_ISO8859_13=m
 | 
			
		||||
CONFIG_NLS_ISO8859_14=m
 | 
			
		||||
CONFIG_NLS_ISO8859_15=m
 | 
			
		||||
CONFIG_NLS_KOI8_R=m
 | 
			
		||||
CONFIG_NLS_KOI8_U=m
 | 
			
		||||
CONFIG_NLS_UTF8=m
 | 
			
		||||
CONFIG_MAGIC_SYSRQ=y
 | 
			
		||||
CONFIG_DEBUG_KERNEL=y
 | 
			
		||||
CONFIG_DEBUG_MUTEXES=y
 | 
			
		||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
 | 
			
		||||
CONFIG_IA64_GRANULE_16MB=y
 | 
			
		||||
CONFIG_CRYPTO_ECB=m
 | 
			
		||||
CONFIG_CRYPTO_PCBC=m
 | 
			
		||||
CONFIG_CRYPTO_MD5=y
 | 
			
		||||
# CONFIG_CRYPTO_ANSI_CPRNG is not set
 | 
			
		||||
| 
						 | 
				
			
			@ -111,8 +111,6 @@ static inline const char *acpi_get_sysname (void)
 | 
			
		|||
	return "uv";
 | 
			
		||||
# elif defined (CONFIG_IA64_DIG)
 | 
			
		||||
	return "dig";
 | 
			
		||||
# elif defined (CONFIG_IA64_XEN_GUEST)
 | 
			
		||||
	return "xen";
 | 
			
		||||
# elif defined(CONFIG_IA64_DIG_VTD)
 | 
			
		||||
	return "dig_vtd";
 | 
			
		||||
# else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -113,8 +113,6 @@ extern void machvec_tlb_migrate_finish (struct mm_struct *);
 | 
			
		|||
#  include <asm/machvec_sn2.h>
 | 
			
		||||
# elif defined (CONFIG_IA64_SGI_UV)
 | 
			
		||||
#  include <asm/machvec_uv.h>
 | 
			
		||||
# elif defined (CONFIG_IA64_XEN_GUEST)
 | 
			
		||||
#  include <asm/machvec_xen.h>
 | 
			
		||||
# elif defined (CONFIG_IA64_GENERIC)
 | 
			
		||||
 | 
			
		||||
# ifdef MACHVEC_PLATFORM_HEADER
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,22 +0,0 @@
 | 
			
		|||
#ifndef _ASM_IA64_MACHVEC_XEN_h
 | 
			
		||||
#define _ASM_IA64_MACHVEC_XEN_h
 | 
			
		||||
 | 
			
		||||
extern ia64_mv_setup_t			dig_setup;
 | 
			
		||||
extern ia64_mv_cpu_init_t		xen_cpu_init;
 | 
			
		||||
extern ia64_mv_irq_init_t		xen_irq_init;
 | 
			
		||||
extern ia64_mv_send_ipi_t		xen_platform_send_ipi;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This stuff has dual use!
 | 
			
		||||
 *
 | 
			
		||||
 * For a generic kernel, the macros are used to initialize the
 | 
			
		||||
 * platform's machvec structure.  When compiling a non-generic kernel,
 | 
			
		||||
 * the macros are used directly.
 | 
			
		||||
 */
 | 
			
		||||
#define ia64_platform_name			"xen"
 | 
			
		||||
#define platform_setup				dig_setup
 | 
			
		||||
#define platform_cpu_init			xen_cpu_init
 | 
			
		||||
#define platform_irq_init			xen_irq_init
 | 
			
		||||
#define platform_send_ipi			xen_platform_send_ipi
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_IA64_MACHVEC_XEN_h */
 | 
			
		||||
| 
						 | 
				
			
			@ -18,7 +18,6 @@
 | 
			
		|||
 * 	- crash dumping code reserved region
 | 
			
		||||
 * 	- Kernel memory map built from EFI memory map
 | 
			
		||||
 * 	- ELF core header
 | 
			
		||||
 *	- xen start info if CONFIG_XEN
 | 
			
		||||
 *
 | 
			
		||||
 * More could be added if necessary
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -75,7 +75,6 @@ void *paravirt_get_gate_section(void);
 | 
			
		|||
#ifdef CONFIG_PARAVIRT_GUEST
 | 
			
		||||
 | 
			
		||||
#define PARAVIRT_HYPERVISOR_TYPE_DEFAULT	0
 | 
			
		||||
#define PARAVIRT_HYPERVISOR_TYPE_XEN		1
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,7 @@
 | 
			
		|||
/*
 | 
			
		||||
 * These structs MUST NOT be changed.
 | 
			
		||||
 * They are the ABI between hypervisor and guest OS.
 | 
			
		||||
 * Both Xen and KVM are using this.
 | 
			
		||||
 * KVM is using this.
 | 
			
		||||
 *
 | 
			
		||||
 * pvclock_vcpu_time_info holds the system time and the tsc timestamp
 | 
			
		||||
 * of the last update. So the guest can use the tsc delta to get a
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,51 +0,0 @@
 | 
			
		|||
#ifndef _ASM_IA64_SYNC_BITOPS_H
 | 
			
		||||
#define _ASM_IA64_SYNC_BITOPS_H
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2008 Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *
 | 
			
		||||
 * Based on synch_bitops.h which Dan Magenhaimer wrote.
 | 
			
		||||
 *
 | 
			
		||||
 * bit operations which provide guaranteed strong synchronisation
 | 
			
		||||
 * when communicating with Xen or other guest OSes running on other CPUs.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static inline void sync_set_bit(int nr, volatile void *addr)
 | 
			
		||||
{
 | 
			
		||||
	set_bit(nr, addr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void sync_clear_bit(int nr, volatile void *addr)
 | 
			
		||||
{
 | 
			
		||||
	clear_bit(nr, addr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void sync_change_bit(int nr, volatile void *addr)
 | 
			
		||||
{
 | 
			
		||||
	change_bit(nr, addr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int sync_test_and_set_bit(int nr, volatile void *addr)
 | 
			
		||||
{
 | 
			
		||||
	return test_and_set_bit(nr, addr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int sync_test_and_clear_bit(int nr, volatile void *addr)
 | 
			
		||||
{
 | 
			
		||||
	return test_and_clear_bit(nr, addr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int sync_test_and_change_bit(int nr, volatile void *addr)
 | 
			
		||||
{
 | 
			
		||||
	return test_and_change_bit(nr, addr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int sync_test_bit(int nr, const volatile void *addr)
 | 
			
		||||
{
 | 
			
		||||
	return test_bit(nr, addr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define sync_cmpxchg(ptr, old, new)				\
 | 
			
		||||
	((__typeof__(*(ptr)))cmpxchg_acq((ptr), (old), (new)))
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_IA64_SYNC_BITOPS_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,41 +0,0 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
 * arch/ia64/include/asm/xen/events.h
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *                    VA Linux Systems Japan K.K.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#ifndef _ASM_IA64_XEN_EVENTS_H
 | 
			
		||||
#define _ASM_IA64_XEN_EVENTS_H
 | 
			
		||||
 | 
			
		||||
enum ipi_vector {
 | 
			
		||||
	XEN_RESCHEDULE_VECTOR,
 | 
			
		||||
	XEN_IPI_VECTOR,
 | 
			
		||||
	XEN_CMCP_VECTOR,
 | 
			
		||||
	XEN_CPEP_VECTOR,
 | 
			
		||||
 | 
			
		||||
	XEN_NR_IPIS,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static inline int xen_irqs_disabled(struct pt_regs *regs)
 | 
			
		||||
{
 | 
			
		||||
	return !(ia64_psr(regs)->i);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define irq_ctx_init(cpu)	do { } while (0)
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_IA64_XEN_EVENTS_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,265 +0,0 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
 * hypercall.h
 | 
			
		||||
 *
 | 
			
		||||
 * Linux-specific hypervisor handling.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2002-2004, K A Fraser
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License version 2
 | 
			
		||||
 * as published by the Free Software Foundation; or, when distributed
 | 
			
		||||
 * separately from the Linux kernel or incorporated into other
 | 
			
		||||
 * software packages, subject to the following license:
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
 * of this source file (the "Software"), to deal in the Software without
 | 
			
		||||
 * restriction, including without limitation the rights to use, copy, modify,
 | 
			
		||||
 * merge, publish, distribute, sublicense, and/or sell copies of the Software,
 | 
			
		||||
 * and to permit persons to whom the Software is furnished to do so, subject to
 | 
			
		||||
 * the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 * IN THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _ASM_IA64_XEN_HYPERCALL_H
 | 
			
		||||
#define _ASM_IA64_XEN_HYPERCALL_H
 | 
			
		||||
 | 
			
		||||
#include <xen/interface/xen.h>
 | 
			
		||||
#include <xen/interface/physdev.h>
 | 
			
		||||
#include <xen/interface/sched.h>
 | 
			
		||||
#include <asm/xen/xcom_hcall.h>
 | 
			
		||||
struct xencomm_handle;
 | 
			
		||||
extern unsigned long __hypercall(unsigned long a1, unsigned long a2,
 | 
			
		||||
				 unsigned long a3, unsigned long a4,
 | 
			
		||||
				 unsigned long a5, unsigned long cmd);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Assembler stubs for hyper-calls.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define _hypercall0(type, name)					\
 | 
			
		||||
({								\
 | 
			
		||||
	long __res;						\
 | 
			
		||||
	__res = __hypercall(0, 0, 0, 0, 0, __HYPERVISOR_##name);\
 | 
			
		||||
	(type)__res;						\
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
#define _hypercall1(type, name, a1)				\
 | 
			
		||||
({								\
 | 
			
		||||
	long __res;						\
 | 
			
		||||
	__res = __hypercall((unsigned long)a1,			\
 | 
			
		||||
			     0, 0, 0, 0, __HYPERVISOR_##name);	\
 | 
			
		||||
	(type)__res;						\
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
#define _hypercall2(type, name, a1, a2)				\
 | 
			
		||||
({								\
 | 
			
		||||
	long __res;						\
 | 
			
		||||
	__res = __hypercall((unsigned long)a1,			\
 | 
			
		||||
			    (unsigned long)a2,			\
 | 
			
		||||
			    0, 0, 0, __HYPERVISOR_##name);	\
 | 
			
		||||
	(type)__res;						\
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
#define _hypercall3(type, name, a1, a2, a3)			\
 | 
			
		||||
({								\
 | 
			
		||||
	long __res;						\
 | 
			
		||||
	__res = __hypercall((unsigned long)a1,			\
 | 
			
		||||
			    (unsigned long)a2,			\
 | 
			
		||||
			    (unsigned long)a3,			\
 | 
			
		||||
			    0, 0, __HYPERVISOR_##name);		\
 | 
			
		||||
	(type)__res;						\
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
#define _hypercall4(type, name, a1, a2, a3, a4)			\
 | 
			
		||||
({								\
 | 
			
		||||
	long __res;						\
 | 
			
		||||
	__res = __hypercall((unsigned long)a1,			\
 | 
			
		||||
			    (unsigned long)a2,			\
 | 
			
		||||
			    (unsigned long)a3,			\
 | 
			
		||||
			    (unsigned long)a4,			\
 | 
			
		||||
			    0, __HYPERVISOR_##name);		\
 | 
			
		||||
	(type)__res;						\
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
#define _hypercall5(type, name, a1, a2, a3, a4, a5)		\
 | 
			
		||||
({								\
 | 
			
		||||
	long __res;						\
 | 
			
		||||
	__res = __hypercall((unsigned long)a1,			\
 | 
			
		||||
			    (unsigned long)a2,			\
 | 
			
		||||
			    (unsigned long)a3,			\
 | 
			
		||||
			    (unsigned long)a4,			\
 | 
			
		||||
			    (unsigned long)a5,			\
 | 
			
		||||
			    __HYPERVISOR_##name);		\
 | 
			
		||||
	(type)__res;						\
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
xencomm_arch_hypercall_sched_op(int cmd, struct xencomm_handle *arg)
 | 
			
		||||
{
 | 
			
		||||
	return _hypercall2(int, sched_op, cmd, arg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline long
 | 
			
		||||
HYPERVISOR_set_timer_op(u64 timeout)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long timeout_hi = (unsigned long)(timeout >> 32);
 | 
			
		||||
	unsigned long timeout_lo = (unsigned long)timeout;
 | 
			
		||||
	return _hypercall2(long, set_timer_op, timeout_lo, timeout_hi);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
xencomm_arch_hypercall_multicall(struct xencomm_handle *call_list,
 | 
			
		||||
				 int nr_calls)
 | 
			
		||||
{
 | 
			
		||||
	return _hypercall2(int, multicall, call_list, nr_calls);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
xencomm_arch_hypercall_memory_op(unsigned int cmd, struct xencomm_handle *arg)
 | 
			
		||||
{
 | 
			
		||||
	return _hypercall2(int, memory_op, cmd, arg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
xencomm_arch_hypercall_event_channel_op(int cmd, struct xencomm_handle *arg)
 | 
			
		||||
{
 | 
			
		||||
	return _hypercall2(int, event_channel_op, cmd, arg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
xencomm_arch_hypercall_xen_version(int cmd, struct xencomm_handle *arg)
 | 
			
		||||
{
 | 
			
		||||
	return _hypercall2(int, xen_version, cmd, arg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
xencomm_arch_hypercall_console_io(int cmd, int count,
 | 
			
		||||
				  struct xencomm_handle *str)
 | 
			
		||||
{
 | 
			
		||||
	return _hypercall3(int, console_io, cmd, count, str);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
xencomm_arch_hypercall_physdev_op(int cmd, struct xencomm_handle *arg)
 | 
			
		||||
{
 | 
			
		||||
	return _hypercall2(int, physdev_op, cmd, arg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
xencomm_arch_hypercall_grant_table_op(unsigned int cmd,
 | 
			
		||||
				      struct xencomm_handle *uop,
 | 
			
		||||
				      unsigned int count)
 | 
			
		||||
{
 | 
			
		||||
	return _hypercall3(int, grant_table_op, cmd, uop, count);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count);
 | 
			
		||||
 | 
			
		||||
extern int xencomm_arch_hypercall_suspend(struct xencomm_handle *arg);
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
xencomm_arch_hypercall_callback_op(int cmd, struct xencomm_handle *arg)
 | 
			
		||||
{
 | 
			
		||||
	return _hypercall2(int, callback_op, cmd, arg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline long
 | 
			
		||||
xencomm_arch_hypercall_vcpu_op(int cmd, int cpu, void *arg)
 | 
			
		||||
{
 | 
			
		||||
	return _hypercall3(long, vcpu_op, cmd, cpu, arg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
HYPERVISOR_physdev_op(int cmd, void *arg)
 | 
			
		||||
{
 | 
			
		||||
	switch (cmd) {
 | 
			
		||||
	case PHYSDEVOP_eoi:
 | 
			
		||||
		return _hypercall1(int, ia64_fast_eoi,
 | 
			
		||||
				   ((struct physdev_eoi *)arg)->irq);
 | 
			
		||||
	default:
 | 
			
		||||
		return xencomm_hypercall_physdev_op(cmd, arg);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline long
 | 
			
		||||
xencomm_arch_hypercall_opt_feature(struct xencomm_handle *arg)
 | 
			
		||||
{
 | 
			
		||||
	return _hypercall1(long, opt_feature, arg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* for balloon driver */
 | 
			
		||||
#define HYPERVISOR_update_va_mapping(va, new_val, flags) (0)
 | 
			
		||||
 | 
			
		||||
/* Use xencomm to do hypercalls.  */
 | 
			
		||||
#define HYPERVISOR_sched_op xencomm_hypercall_sched_op
 | 
			
		||||
#define HYPERVISOR_event_channel_op xencomm_hypercall_event_channel_op
 | 
			
		||||
#define HYPERVISOR_callback_op xencomm_hypercall_callback_op
 | 
			
		||||
#define HYPERVISOR_multicall xencomm_hypercall_multicall
 | 
			
		||||
#define HYPERVISOR_xen_version xencomm_hypercall_xen_version
 | 
			
		||||
#define HYPERVISOR_console_io xencomm_hypercall_console_io
 | 
			
		||||
#define HYPERVISOR_memory_op xencomm_hypercall_memory_op
 | 
			
		||||
#define HYPERVISOR_suspend xencomm_hypercall_suspend
 | 
			
		||||
#define HYPERVISOR_vcpu_op xencomm_hypercall_vcpu_op
 | 
			
		||||
#define HYPERVISOR_opt_feature xencomm_hypercall_opt_feature
 | 
			
		||||
 | 
			
		||||
/* to compile gnttab_copy_grant_page() in drivers/xen/core/gnttab.c */
 | 
			
		||||
#define HYPERVISOR_mmu_update(req, count, success_count, domid) ({ BUG(); 0; })
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
HYPERVISOR_shutdown(
 | 
			
		||||
	unsigned int reason)
 | 
			
		||||
{
 | 
			
		||||
	struct sched_shutdown sched_shutdown = {
 | 
			
		||||
		.reason = reason
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	int rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown);
 | 
			
		||||
 | 
			
		||||
	return rc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* for netfront.c, netback.c */
 | 
			
		||||
#define MULTI_UVMFLAGS_INDEX 0 /* XXX any value */
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
MULTI_update_va_mapping(
 | 
			
		||||
	struct multicall_entry *mcl, unsigned long va,
 | 
			
		||||
	pte_t new_val, unsigned long flags)
 | 
			
		||||
{
 | 
			
		||||
	mcl->op = __HYPERVISOR_update_va_mapping;
 | 
			
		||||
	mcl->result = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
MULTI_grant_table_op(struct multicall_entry *mcl, unsigned int cmd,
 | 
			
		||||
	void *uop, unsigned int count)
 | 
			
		||||
{
 | 
			
		||||
	mcl->op = __HYPERVISOR_grant_table_op;
 | 
			
		||||
	mcl->args[0] = cmd;
 | 
			
		||||
	mcl->args[1] = (unsigned long)uop;
 | 
			
		||||
	mcl->args[2] = count;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
MULTI_mmu_update(struct multicall_entry *mcl, struct mmu_update *req,
 | 
			
		||||
		 int count, int *success_count, domid_t domid)
 | 
			
		||||
{
 | 
			
		||||
	mcl->op = __HYPERVISOR_mmu_update;
 | 
			
		||||
	mcl->args[0] = (unsigned long)req;
 | 
			
		||||
	mcl->args[1] = count;
 | 
			
		||||
	mcl->args[2] = (unsigned long)success_count;
 | 
			
		||||
	mcl->args[3] = domid;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_IA64_XEN_HYPERCALL_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,61 +0,0 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
 * hypervisor.h
 | 
			
		||||
 *
 | 
			
		||||
 * Linux-specific hypervisor handling.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2002-2004, K A Fraser
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU General Public License version 2
 | 
			
		||||
 * as published by the Free Software Foundation; or, when distributed
 | 
			
		||||
 * separately from the Linux kernel or incorporated into other
 | 
			
		||||
 * software packages, subject to the following license:
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
 * of this source file (the "Software"), to deal in the Software without
 | 
			
		||||
 * restriction, including without limitation the rights to use, copy, modify,
 | 
			
		||||
 * merge, publish, distribute, sublicense, and/or sell copies of the Software,
 | 
			
		||||
 * and to permit persons to whom the Software is furnished to do so, subject to
 | 
			
		||||
 * the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 | 
			
		||||
 * IN THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _ASM_IA64_XEN_HYPERVISOR_H
 | 
			
		||||
#define _ASM_IA64_XEN_HYPERVISOR_H
 | 
			
		||||
 | 
			
		||||
#include <linux/err.h>
 | 
			
		||||
#include <xen/interface/xen.h>
 | 
			
		||||
#include <xen/interface/version.h>	/* to compile feature.c */
 | 
			
		||||
#include <xen/features.h>		/* to comiple xen-netfront.c */
 | 
			
		||||
#include <xen/xen.h>
 | 
			
		||||
#include <asm/xen/hypercall.h>
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_XEN
 | 
			
		||||
extern struct shared_info *HYPERVISOR_shared_info;
 | 
			
		||||
extern struct start_info *xen_start_info;
 | 
			
		||||
 | 
			
		||||
void __init xen_setup_vcpu_info_placement(void);
 | 
			
		||||
void force_evtchn_callback(void);
 | 
			
		||||
 | 
			
		||||
/* for drivers/xen/balloon/balloon.c */
 | 
			
		||||
#ifdef CONFIG_XEN_SCRUB_PAGES
 | 
			
		||||
#define scrub_pages(_p, _n) memset((void *)(_p), 0, (_n) << PAGE_SHIFT)
 | 
			
		||||
#else
 | 
			
		||||
#define scrub_pages(_p, _n) ((void)0)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* For setup_arch() in arch/ia64/kernel/setup.c */
 | 
			
		||||
void xen_ia64_enable_opt_feature(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_IA64_XEN_HYPERVISOR_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,486 +0,0 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
 * arch/ia64/include/asm/xen/inst.h
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *                    VA Linux Systems Japan K.K.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <asm/xen/privop.h>
 | 
			
		||||
 | 
			
		||||
#define ia64_ivt				xen_ivt
 | 
			
		||||
#define DO_SAVE_MIN				XEN_DO_SAVE_MIN
 | 
			
		||||
 | 
			
		||||
#define __paravirt_switch_to			xen_switch_to
 | 
			
		||||
#define __paravirt_leave_syscall		xen_leave_syscall
 | 
			
		||||
#define __paravirt_work_processed_syscall	xen_work_processed_syscall
 | 
			
		||||
#define __paravirt_leave_kernel			xen_leave_kernel
 | 
			
		||||
#define __paravirt_pending_syscall_end		xen_work_pending_syscall_end
 | 
			
		||||
#define __paravirt_work_processed_syscall_target \
 | 
			
		||||
						xen_work_processed_syscall
 | 
			
		||||
 | 
			
		||||
#define paravirt_fsyscall_table			xen_fsyscall_table
 | 
			
		||||
#define paravirt_fsys_bubble_down		xen_fsys_bubble_down
 | 
			
		||||
 | 
			
		||||
#define MOV_FROM_IFA(reg)	\
 | 
			
		||||
	movl reg = XSI_IFA;	\
 | 
			
		||||
	;;			\
 | 
			
		||||
	ld8 reg = [reg]
 | 
			
		||||
 | 
			
		||||
#define MOV_FROM_ITIR(reg)	\
 | 
			
		||||
	movl reg = XSI_ITIR;	\
 | 
			
		||||
	;;			\
 | 
			
		||||
	ld8 reg = [reg]
 | 
			
		||||
 | 
			
		||||
#define MOV_FROM_ISR(reg)	\
 | 
			
		||||
	movl reg = XSI_ISR;	\
 | 
			
		||||
	;;			\
 | 
			
		||||
	ld8 reg = [reg]
 | 
			
		||||
 | 
			
		||||
#define MOV_FROM_IHA(reg)	\
 | 
			
		||||
	movl reg = XSI_IHA;	\
 | 
			
		||||
	;;			\
 | 
			
		||||
	ld8 reg = [reg]
 | 
			
		||||
 | 
			
		||||
#define MOV_FROM_IPSR(pred, reg)	\
 | 
			
		||||
(pred)	movl reg = XSI_IPSR;		\
 | 
			
		||||
	;;				\
 | 
			
		||||
(pred)	ld8 reg = [reg]
 | 
			
		||||
 | 
			
		||||
#define MOV_FROM_IIM(reg)	\
 | 
			
		||||
	movl reg = XSI_IIM;	\
 | 
			
		||||
	;;			\
 | 
			
		||||
	ld8 reg = [reg]
 | 
			
		||||
 | 
			
		||||
#define MOV_FROM_IIP(reg)	\
 | 
			
		||||
	movl reg = XSI_IIP;	\
 | 
			
		||||
	;;			\
 | 
			
		||||
	ld8 reg = [reg]
 | 
			
		||||
 | 
			
		||||
.macro __MOV_FROM_IVR reg, clob
 | 
			
		||||
	.ifc "\reg", "r8"
 | 
			
		||||
		XEN_HYPER_GET_IVR
 | 
			
		||||
		.exitm
 | 
			
		||||
	.endif
 | 
			
		||||
	.ifc "\clob", "r8"
 | 
			
		||||
		XEN_HYPER_GET_IVR
 | 
			
		||||
		;;
 | 
			
		||||
		mov \reg = r8
 | 
			
		||||
		.exitm
 | 
			
		||||
	.endif
 | 
			
		||||
 | 
			
		||||
	mov \clob = r8
 | 
			
		||||
	;;
 | 
			
		||||
	XEN_HYPER_GET_IVR
 | 
			
		||||
	;;
 | 
			
		||||
	mov \reg = r8
 | 
			
		||||
	;;
 | 
			
		||||
	mov r8 = \clob
 | 
			
		||||
.endm
 | 
			
		||||
#define MOV_FROM_IVR(reg, clob)	__MOV_FROM_IVR reg, clob
 | 
			
		||||
 | 
			
		||||
.macro __MOV_FROM_PSR pred, reg, clob
 | 
			
		||||
	.ifc "\reg", "r8"
 | 
			
		||||
		(\pred)	XEN_HYPER_GET_PSR;
 | 
			
		||||
		.exitm
 | 
			
		||||
	.endif
 | 
			
		||||
	.ifc "\clob", "r8"
 | 
			
		||||
		(\pred)	XEN_HYPER_GET_PSR
 | 
			
		||||
		;;
 | 
			
		||||
		(\pred)	mov \reg = r8
 | 
			
		||||
		.exitm
 | 
			
		||||
	.endif
 | 
			
		||||
 | 
			
		||||
	(\pred)	mov \clob = r8
 | 
			
		||||
	(\pred)	XEN_HYPER_GET_PSR
 | 
			
		||||
	;;
 | 
			
		||||
	(\pred)	mov \reg = r8
 | 
			
		||||
	(\pred)	mov r8 = \clob
 | 
			
		||||
.endm
 | 
			
		||||
#define MOV_FROM_PSR(pred, reg, clob)	__MOV_FROM_PSR pred, reg, clob
 | 
			
		||||
 | 
			
		||||
/* assuming ar.itc is read with interrupt disabled. */
 | 
			
		||||
#define MOV_FROM_ITC(pred, pred_clob, reg, clob)		\
 | 
			
		||||
(pred)	movl clob = XSI_ITC_OFFSET;				\
 | 
			
		||||
	;;							\
 | 
			
		||||
(pred)	ld8 clob = [clob];					\
 | 
			
		||||
(pred)	mov reg = ar.itc;					\
 | 
			
		||||
	;;							\
 | 
			
		||||
(pred)	add reg = reg, clob;					\
 | 
			
		||||
	;;							\
 | 
			
		||||
(pred)	movl clob = XSI_ITC_LAST;				\
 | 
			
		||||
	;;							\
 | 
			
		||||
(pred)	ld8 clob = [clob];					\
 | 
			
		||||
	;;							\
 | 
			
		||||
(pred)	cmp.geu.unc pred_clob, p0 = clob, reg;			\
 | 
			
		||||
	;;							\
 | 
			
		||||
(pred_clob)	add reg = 1, clob;				\
 | 
			
		||||
	;;							\
 | 
			
		||||
(pred)	movl clob = XSI_ITC_LAST;				\
 | 
			
		||||
	;;							\
 | 
			
		||||
(pred)	st8 [clob] = reg
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define MOV_TO_IFA(reg, clob)	\
 | 
			
		||||
	movl clob = XSI_IFA;	\
 | 
			
		||||
	;;			\
 | 
			
		||||
	st8 [clob] = reg	\
 | 
			
		||||
 | 
			
		||||
#define MOV_TO_ITIR(pred, reg, clob)	\
 | 
			
		||||
(pred)	movl clob = XSI_ITIR;		\
 | 
			
		||||
	;;				\
 | 
			
		||||
(pred)	st8 [clob] = reg
 | 
			
		||||
 | 
			
		||||
#define MOV_TO_IHA(pred, reg, clob)	\
 | 
			
		||||
(pred)	movl clob = XSI_IHA;		\
 | 
			
		||||
	;;				\
 | 
			
		||||
(pred)	st8 [clob] = reg
 | 
			
		||||
 | 
			
		||||
#define MOV_TO_IPSR(pred, reg, clob)	\
 | 
			
		||||
(pred)	movl clob = XSI_IPSR;		\
 | 
			
		||||
	;;				\
 | 
			
		||||
(pred)	st8 [clob] = reg;		\
 | 
			
		||||
	;;
 | 
			
		||||
 | 
			
		||||
#define MOV_TO_IFS(pred, reg, clob)	\
 | 
			
		||||
(pred)	movl clob = XSI_IFS;		\
 | 
			
		||||
	;;				\
 | 
			
		||||
(pred)	st8 [clob] = reg;		\
 | 
			
		||||
	;;
 | 
			
		||||
 | 
			
		||||
#define MOV_TO_IIP(reg, clob)	\
 | 
			
		||||
	movl clob = XSI_IIP;	\
 | 
			
		||||
	;;			\
 | 
			
		||||
	st8 [clob] = reg
 | 
			
		||||
 | 
			
		||||
.macro ____MOV_TO_KR kr, reg, clob0, clob1
 | 
			
		||||
	.ifc "\clob0", "r9"
 | 
			
		||||
		.error "clob0 \clob0 must not be r9"
 | 
			
		||||
	.endif
 | 
			
		||||
	.ifc "\clob1", "r8"
 | 
			
		||||
		.error "clob1 \clob1 must not be r8"
 | 
			
		||||
	.endif
 | 
			
		||||
 | 
			
		||||
	.ifnc "\reg", "r9"
 | 
			
		||||
		.ifnc "\clob1", "r9"
 | 
			
		||||
			mov \clob1 = r9
 | 
			
		||||
		.endif
 | 
			
		||||
		mov r9 = \reg
 | 
			
		||||
	.endif
 | 
			
		||||
	.ifnc "\clob0", "r8"
 | 
			
		||||
		mov \clob0 = r8
 | 
			
		||||
	.endif
 | 
			
		||||
	mov r8 = \kr
 | 
			
		||||
	;;
 | 
			
		||||
	XEN_HYPER_SET_KR
 | 
			
		||||
 | 
			
		||||
	.ifnc "\reg", "r9"
 | 
			
		||||
		.ifnc "\clob1", "r9"
 | 
			
		||||
			mov r9 = \clob1
 | 
			
		||||
		.endif
 | 
			
		||||
	.endif
 | 
			
		||||
	.ifnc "\clob0", "r8"
 | 
			
		||||
		mov r8 = \clob0
 | 
			
		||||
	.endif
 | 
			
		||||
.endm
 | 
			
		||||
 | 
			
		||||
.macro __MOV_TO_KR kr, reg, clob0, clob1
 | 
			
		||||
	.ifc "\clob0", "r9"
 | 
			
		||||
		____MOV_TO_KR \kr, \reg, \clob1, \clob0
 | 
			
		||||
		.exitm
 | 
			
		||||
	.endif
 | 
			
		||||
	.ifc "\clob1", "r8"
 | 
			
		||||
		____MOV_TO_KR \kr, \reg, \clob1, \clob0
 | 
			
		||||
		.exitm
 | 
			
		||||
	.endif
 | 
			
		||||
 | 
			
		||||
	____MOV_TO_KR \kr, \reg, \clob0, \clob1
 | 
			
		||||
.endm
 | 
			
		||||
 | 
			
		||||
#define MOV_TO_KR(kr, reg, clob0, clob1) \
 | 
			
		||||
	__MOV_TO_KR IA64_KR_ ## kr, reg, clob0, clob1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.macro __ITC_I pred, reg, clob
 | 
			
		||||
	.ifc "\reg", "r8"
 | 
			
		||||
		(\pred)	XEN_HYPER_ITC_I
 | 
			
		||||
		.exitm
 | 
			
		||||
	.endif
 | 
			
		||||
	.ifc "\clob", "r8"
 | 
			
		||||
		(\pred)	mov r8 = \reg
 | 
			
		||||
		;;
 | 
			
		||||
		(\pred)	XEN_HYPER_ITC_I
 | 
			
		||||
		.exitm
 | 
			
		||||
	.endif
 | 
			
		||||
 | 
			
		||||
	(\pred)	mov \clob = r8
 | 
			
		||||
	(\pred)	mov r8 = \reg
 | 
			
		||||
	;;
 | 
			
		||||
	(\pred)	XEN_HYPER_ITC_I
 | 
			
		||||
	;;
 | 
			
		||||
	(\pred)	mov r8 = \clob
 | 
			
		||||
	;;
 | 
			
		||||
.endm
 | 
			
		||||
#define ITC_I(pred, reg, clob)	__ITC_I pred, reg, clob
 | 
			
		||||
 | 
			
		||||
.macro __ITC_D pred, reg, clob
 | 
			
		||||
	.ifc "\reg", "r8"
 | 
			
		||||
		(\pred)	XEN_HYPER_ITC_D
 | 
			
		||||
		;;
 | 
			
		||||
		.exitm
 | 
			
		||||
	.endif
 | 
			
		||||
	.ifc "\clob", "r8"
 | 
			
		||||
		(\pred)	mov r8 = \reg
 | 
			
		||||
		;;
 | 
			
		||||
		(\pred)	XEN_HYPER_ITC_D
 | 
			
		||||
		;;
 | 
			
		||||
		.exitm
 | 
			
		||||
	.endif
 | 
			
		||||
 | 
			
		||||
	(\pred)	mov \clob = r8
 | 
			
		||||
	(\pred)	mov r8 = \reg
 | 
			
		||||
	;;
 | 
			
		||||
	(\pred)	XEN_HYPER_ITC_D
 | 
			
		||||
	;;
 | 
			
		||||
	(\pred)	mov r8 = \clob
 | 
			
		||||
	;;
 | 
			
		||||
.endm
 | 
			
		||||
#define ITC_D(pred, reg, clob)	__ITC_D pred, reg, clob
 | 
			
		||||
 | 
			
		||||
.macro __ITC_I_AND_D pred_i, pred_d, reg, clob
 | 
			
		||||
	.ifc "\reg", "r8"
 | 
			
		||||
		(\pred_i)XEN_HYPER_ITC_I
 | 
			
		||||
		;;
 | 
			
		||||
		(\pred_d)XEN_HYPER_ITC_D
 | 
			
		||||
		;;
 | 
			
		||||
		.exitm
 | 
			
		||||
	.endif
 | 
			
		||||
	.ifc "\clob", "r8"
 | 
			
		||||
		mov r8 = \reg
 | 
			
		||||
		;;
 | 
			
		||||
		(\pred_i)XEN_HYPER_ITC_I
 | 
			
		||||
		;;
 | 
			
		||||
		(\pred_d)XEN_HYPER_ITC_D
 | 
			
		||||
		;;
 | 
			
		||||
		.exitm
 | 
			
		||||
	.endif
 | 
			
		||||
 | 
			
		||||
	mov \clob = r8
 | 
			
		||||
	mov r8 = \reg
 | 
			
		||||
	;;
 | 
			
		||||
	(\pred_i)XEN_HYPER_ITC_I
 | 
			
		||||
	;;
 | 
			
		||||
	(\pred_d)XEN_HYPER_ITC_D
 | 
			
		||||
	;;
 | 
			
		||||
	mov r8 = \clob
 | 
			
		||||
	;;
 | 
			
		||||
.endm
 | 
			
		||||
#define ITC_I_AND_D(pred_i, pred_d, reg, clob) \
 | 
			
		||||
	__ITC_I_AND_D pred_i, pred_d, reg, clob
 | 
			
		||||
 | 
			
		||||
.macro __THASH pred, reg0, reg1, clob
 | 
			
		||||
	.ifc "\reg0", "r8"
 | 
			
		||||
		(\pred)	mov r8 = \reg1
 | 
			
		||||
		(\pred)	XEN_HYPER_THASH
 | 
			
		||||
		.exitm
 | 
			
		||||
	.endc
 | 
			
		||||
	.ifc "\reg1", "r8"
 | 
			
		||||
		(\pred)	XEN_HYPER_THASH
 | 
			
		||||
		;;
 | 
			
		||||
		(\pred)	mov \reg0 = r8
 | 
			
		||||
		;;
 | 
			
		||||
		.exitm
 | 
			
		||||
	.endif
 | 
			
		||||
	.ifc "\clob", "r8"
 | 
			
		||||
		(\pred)	mov r8 = \reg1
 | 
			
		||||
		(\pred)	XEN_HYPER_THASH
 | 
			
		||||
		;;
 | 
			
		||||
		(\pred)	mov \reg0 = r8
 | 
			
		||||
		;;
 | 
			
		||||
		.exitm
 | 
			
		||||
	.endif
 | 
			
		||||
 | 
			
		||||
	(\pred)	mov \clob = r8
 | 
			
		||||
	(\pred)	mov r8 = \reg1
 | 
			
		||||
	(\pred)	XEN_HYPER_THASH
 | 
			
		||||
	;;
 | 
			
		||||
	(\pred)	mov \reg0 = r8
 | 
			
		||||
	(\pred)	mov r8 = \clob
 | 
			
		||||
	;;
 | 
			
		||||
.endm
 | 
			
		||||
#define THASH(pred, reg0, reg1, clob) __THASH pred, reg0, reg1, clob
 | 
			
		||||
 | 
			
		||||
#define SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(clob0, clob1)	\
 | 
			
		||||
	mov clob0 = 1;						\
 | 
			
		||||
	movl clob1 = XSI_PSR_IC;				\
 | 
			
		||||
	;;							\
 | 
			
		||||
	st4 [clob1] = clob0					\
 | 
			
		||||
	;;
 | 
			
		||||
 | 
			
		||||
#define SSM_PSR_IC_AND_SRLZ_D(clob0, clob1)	\
 | 
			
		||||
	;;					\
 | 
			
		||||
	srlz.d;					\
 | 
			
		||||
	mov clob1 = 1;				\
 | 
			
		||||
	movl clob0 = XSI_PSR_IC;		\
 | 
			
		||||
	;;					\
 | 
			
		||||
	st4 [clob0] = clob1
 | 
			
		||||
 | 
			
		||||
#define RSM_PSR_IC(clob)	\
 | 
			
		||||
	movl clob = XSI_PSR_IC;	\
 | 
			
		||||
	;;			\
 | 
			
		||||
	st4 [clob] = r0;	\
 | 
			
		||||
	;;
 | 
			
		||||
 | 
			
		||||
/* pred will be clobbered */
 | 
			
		||||
#define MASK_TO_PEND_OFS    (-1)
 | 
			
		||||
#define SSM_PSR_I(pred, pred_clob, clob)				\
 | 
			
		||||
(pred)	movl clob = XSI_PSR_I_ADDR					\
 | 
			
		||||
	;;								\
 | 
			
		||||
(pred)	ld8 clob = [clob]						\
 | 
			
		||||
	;;								\
 | 
			
		||||
	/* if (pred) vpsr.i = 1 */					\
 | 
			
		||||
	/* if (pred) (vcpu->vcpu_info->evtchn_upcall_mask)=0 */		\
 | 
			
		||||
(pred)	st1 [clob] = r0, MASK_TO_PEND_OFS				\
 | 
			
		||||
	;;								\
 | 
			
		||||
	/* if (vcpu->vcpu_info->evtchn_upcall_pending) */		\
 | 
			
		||||
(pred)	ld1 clob = [clob]						\
 | 
			
		||||
	;;								\
 | 
			
		||||
(pred)	cmp.ne.unc pred_clob, p0 = clob, r0				\
 | 
			
		||||
	;;								\
 | 
			
		||||
(pred_clob)XEN_HYPER_SSM_I	/* do areal ssm psr.i */
 | 
			
		||||
 | 
			
		||||
#define RSM_PSR_I(pred, clob0, clob1)	\
 | 
			
		||||
	movl clob0 = XSI_PSR_I_ADDR;	\
 | 
			
		||||
	mov clob1 = 1;			\
 | 
			
		||||
	;;				\
 | 
			
		||||
	ld8 clob0 = [clob0];		\
 | 
			
		||||
	;;				\
 | 
			
		||||
(pred)	st1 [clob0] = clob1
 | 
			
		||||
 | 
			
		||||
#define RSM_PSR_I_IC(clob0, clob1, clob2)		\
 | 
			
		||||
	movl clob0 = XSI_PSR_I_ADDR;			\
 | 
			
		||||
	movl clob1 = XSI_PSR_IC;			\
 | 
			
		||||
	;;						\
 | 
			
		||||
	ld8 clob0 = [clob0];				\
 | 
			
		||||
	mov clob2 = 1;					\
 | 
			
		||||
	;;						\
 | 
			
		||||
	/* note: clears both vpsr.i and vpsr.ic! */	\
 | 
			
		||||
	st1 [clob0] = clob2;				\
 | 
			
		||||
	st4 [clob1] = r0;				\
 | 
			
		||||
	;;
 | 
			
		||||
 | 
			
		||||
#define RSM_PSR_DT		\
 | 
			
		||||
	XEN_HYPER_RSM_PSR_DT
 | 
			
		||||
 | 
			
		||||
#define RSM_PSR_BE_I(clob0, clob1)	\
 | 
			
		||||
	RSM_PSR_I(p0, clob0, clob1);	\
 | 
			
		||||
	rum psr.be
 | 
			
		||||
 | 
			
		||||
#define SSM_PSR_DT_AND_SRLZ_I	\
 | 
			
		||||
	XEN_HYPER_SSM_PSR_DT
 | 
			
		||||
 | 
			
		||||
#define BSW_0(clob0, clob1, clob2)			\
 | 
			
		||||
	;;						\
 | 
			
		||||
	/* r16-r31 all now hold bank1 values */		\
 | 
			
		||||
	mov clob2 = ar.unat;				\
 | 
			
		||||
	movl clob0 = XSI_BANK1_R16;			\
 | 
			
		||||
	movl clob1 = XSI_BANK1_R16 + 8;			\
 | 
			
		||||
	;;						\
 | 
			
		||||
.mem.offset 0, 0; st8.spill [clob0] = r16, 16;		\
 | 
			
		||||
.mem.offset 8, 0; st8.spill [clob1] = r17, 16;		\
 | 
			
		||||
	;;						\
 | 
			
		||||
.mem.offset 0, 0; st8.spill [clob0] = r18, 16;		\
 | 
			
		||||
.mem.offset 8, 0; st8.spill [clob1] = r19, 16;		\
 | 
			
		||||
	;;						\
 | 
			
		||||
.mem.offset 0, 0; st8.spill [clob0] = r20, 16;		\
 | 
			
		||||
.mem.offset 8, 0; st8.spill [clob1] = r21, 16;		\
 | 
			
		||||
	;;						\
 | 
			
		||||
.mem.offset 0, 0; st8.spill [clob0] = r22, 16;		\
 | 
			
		||||
.mem.offset 8, 0; st8.spill [clob1] = r23, 16;		\
 | 
			
		||||
	;;						\
 | 
			
		||||
.mem.offset 0, 0; st8.spill [clob0] = r24, 16;		\
 | 
			
		||||
.mem.offset 8, 0; st8.spill [clob1] = r25, 16;		\
 | 
			
		||||
	;;						\
 | 
			
		||||
.mem.offset 0, 0; st8.spill [clob0] = r26, 16;		\
 | 
			
		||||
.mem.offset 8, 0; st8.spill [clob1] = r27, 16;		\
 | 
			
		||||
	;;						\
 | 
			
		||||
.mem.offset 0, 0; st8.spill [clob0] = r28, 16;		\
 | 
			
		||||
.mem.offset 8, 0; st8.spill [clob1] = r29, 16;		\
 | 
			
		||||
	;;						\
 | 
			
		||||
.mem.offset 0, 0; st8.spill [clob0] = r30, 16;		\
 | 
			
		||||
.mem.offset 8, 0; st8.spill [clob1] = r31, 16;		\
 | 
			
		||||
	;;						\
 | 
			
		||||
	mov clob1 = ar.unat;				\
 | 
			
		||||
	movl clob0 = XSI_B1NAT;				\
 | 
			
		||||
	;;						\
 | 
			
		||||
	st8 [clob0] = clob1;				\
 | 
			
		||||
	mov ar.unat = clob2;				\
 | 
			
		||||
	movl clob0 = XSI_BANKNUM;			\
 | 
			
		||||
	;;						\
 | 
			
		||||
	st4 [clob0] = r0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/* FIXME: THIS CODE IS NOT NaT SAFE! */
 | 
			
		||||
#define XEN_BSW_1(clob)			\
 | 
			
		||||
	mov clob = ar.unat;		\
 | 
			
		||||
	movl r30 = XSI_B1NAT;		\
 | 
			
		||||
	;;				\
 | 
			
		||||
	ld8 r30 = [r30];		\
 | 
			
		||||
	mov r31 = 1;			\
 | 
			
		||||
	;;				\
 | 
			
		||||
	mov ar.unat = r30;		\
 | 
			
		||||
	movl r30 = XSI_BANKNUM;		\
 | 
			
		||||
	;;				\
 | 
			
		||||
	st4 [r30] = r31;		\
 | 
			
		||||
	movl r30 = XSI_BANK1_R16;	\
 | 
			
		||||
	movl r31 = XSI_BANK1_R16+8;	\
 | 
			
		||||
	;;				\
 | 
			
		||||
	ld8.fill r16 = [r30], 16;	\
 | 
			
		||||
	ld8.fill r17 = [r31], 16;	\
 | 
			
		||||
	;;				\
 | 
			
		||||
	ld8.fill r18 = [r30], 16;	\
 | 
			
		||||
	ld8.fill r19 = [r31], 16;	\
 | 
			
		||||
	;;				\
 | 
			
		||||
	ld8.fill r20 = [r30], 16;	\
 | 
			
		||||
	ld8.fill r21 = [r31], 16;	\
 | 
			
		||||
	;;				\
 | 
			
		||||
	ld8.fill r22 = [r30], 16;	\
 | 
			
		||||
	ld8.fill r23 = [r31], 16;	\
 | 
			
		||||
	;;				\
 | 
			
		||||
	ld8.fill r24 = [r30], 16;	\
 | 
			
		||||
	ld8.fill r25 = [r31], 16;	\
 | 
			
		||||
	;;				\
 | 
			
		||||
	ld8.fill r26 = [r30], 16;	\
 | 
			
		||||
	ld8.fill r27 = [r31], 16;	\
 | 
			
		||||
	;;				\
 | 
			
		||||
	ld8.fill r28 = [r30], 16;	\
 | 
			
		||||
	ld8.fill r29 = [r31], 16;	\
 | 
			
		||||
	;;				\
 | 
			
		||||
	ld8.fill r30 = [r30];		\
 | 
			
		||||
	ld8.fill r31 = [r31];		\
 | 
			
		||||
	;;				\
 | 
			
		||||
	mov ar.unat = clob
 | 
			
		||||
 | 
			
		||||
#define BSW_1(clob0, clob1)	XEN_BSW_1(clob1)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define COVER	\
 | 
			
		||||
	XEN_HYPER_COVER
 | 
			
		||||
 | 
			
		||||
#define RFI			\
 | 
			
		||||
	XEN_HYPER_RFI;		\
 | 
			
		||||
	dv_serialize_data
 | 
			
		||||
| 
						 | 
				
			
			@ -1,363 +0,0 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
 * arch-ia64/hypervisor-if.h
 | 
			
		||||
 *
 | 
			
		||||
 * Guest OS interface to IA64 Xen.
 | 
			
		||||
 *
 | 
			
		||||
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
			
		||||
 * of this software and associated documentation files (the "Software"), to
 | 
			
		||||
 * deal in the Software without restriction, including without limitation the
 | 
			
		||||
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 | 
			
		||||
 * sell copies of the Software, and to permit persons to whom the Software is
 | 
			
		||||
 * furnished to do so, subject to the following conditions:
 | 
			
		||||
 *
 | 
			
		||||
 * The above copyright notice and this permission notice shall be included in
 | 
			
		||||
 * all copies or substantial portions of the Software.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
			
		||||
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
			
		||||
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 | 
			
		||||
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 | 
			
		||||
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 | 
			
		||||
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 | 
			
		||||
 * DEALINGS IN THE SOFTWARE.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright by those who contributed. (in alphabetical order)
 | 
			
		||||
 *
 | 
			
		||||
 * Anthony Xu <anthony.xu@intel.com>
 | 
			
		||||
 * Eddie Dong <eddie.dong@intel.com>
 | 
			
		||||
 * Fred Yang <fred.yang@intel.com>
 | 
			
		||||
 * Kevin Tian <kevin.tian@intel.com>
 | 
			
		||||
 * Alex Williamson <alex.williamson@hp.com>
 | 
			
		||||
 * Chris Wright <chrisw@sous-sol.org>
 | 
			
		||||
 * Christian Limpach <Christian.Limpach@cl.cam.ac.uk>
 | 
			
		||||
 * Dietmar Hahn <dietmar.hahn@fujitsu-siemens.com>
 | 
			
		||||
 * Hollis Blanchard <hollisb@us.ibm.com>
 | 
			
		||||
 * Isaku Yamahata <yamahata@valinux.co.jp>
 | 
			
		||||
 * Jan Beulich <jbeulich@novell.com>
 | 
			
		||||
 * John Levon <john.levon@sun.com>
 | 
			
		||||
 * Kazuhiro Suzuki <kaz@jp.fujitsu.com>
 | 
			
		||||
 * Keir Fraser <keir.fraser@citrix.com>
 | 
			
		||||
 * Kouya Shimura <kouya@jp.fujitsu.com>
 | 
			
		||||
 * Masaki Kanno <kanno.masaki@jp.fujitsu.com>
 | 
			
		||||
 * Matt Chapman <matthewc@hp.com>
 | 
			
		||||
 * Matthew Chapman <matthewc@hp.com>
 | 
			
		||||
 * Samuel Thibault <samuel.thibault@eu.citrix.com>
 | 
			
		||||
 * Tomonari Horikoshi <t.horikoshi@jp.fujitsu.com>
 | 
			
		||||
 * Tristan Gingold <tgingold@free.fr>
 | 
			
		||||
 * Tsunehisa Doi <Doi.Tsunehisa@jp.fujitsu.com>
 | 
			
		||||
 * Yutaka Ezaki <yutaka.ezaki@jp.fujitsu.com>
 | 
			
		||||
 * Zhang Xin <xing.z.zhang@intel.com>
 | 
			
		||||
 * Zhang xiantao <xiantao.zhang@intel.com>
 | 
			
		||||
 * dan.magenheimer@hp.com
 | 
			
		||||
 * ian.pratt@cl.cam.ac.uk
 | 
			
		||||
 * michael.fetterman@cl.cam.ac.uk
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _ASM_IA64_XEN_INTERFACE_H
 | 
			
		||||
#define _ASM_IA64_XEN_INTERFACE_H
 | 
			
		||||
 | 
			
		||||
#define __DEFINE_GUEST_HANDLE(name, type)	\
 | 
			
		||||
	typedef struct { type *p; } __guest_handle_ ## name
 | 
			
		||||
 | 
			
		||||
#define DEFINE_GUEST_HANDLE_STRUCT(name)	\
 | 
			
		||||
	__DEFINE_GUEST_HANDLE(name, struct name)
 | 
			
		||||
#define DEFINE_GUEST_HANDLE(name)	__DEFINE_GUEST_HANDLE(name, name)
 | 
			
		||||
#define GUEST_HANDLE(name)		__guest_handle_ ## name
 | 
			
		||||
#define GUEST_HANDLE_64(name)		GUEST_HANDLE(name)
 | 
			
		||||
#define set_xen_guest_handle(hnd, val)	do { (hnd).p = val; } while (0)
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
/* Explicitly size integers that represent pfns in the public interface
 | 
			
		||||
 * with Xen so that we could have one ABI that works for 32 and 64 bit
 | 
			
		||||
 * guests. */
 | 
			
		||||
typedef unsigned long xen_pfn_t;
 | 
			
		||||
typedef unsigned long xen_ulong_t;
 | 
			
		||||
/* Guest handles for primitive C types. */
 | 
			
		||||
__DEFINE_GUEST_HANDLE(uchar, unsigned char);
 | 
			
		||||
__DEFINE_GUEST_HANDLE(uint, unsigned int);
 | 
			
		||||
__DEFINE_GUEST_HANDLE(ulong, unsigned long);
 | 
			
		||||
 | 
			
		||||
DEFINE_GUEST_HANDLE(char);
 | 
			
		||||
DEFINE_GUEST_HANDLE(int);
 | 
			
		||||
DEFINE_GUEST_HANDLE(long);
 | 
			
		||||
DEFINE_GUEST_HANDLE(void);
 | 
			
		||||
DEFINE_GUEST_HANDLE(uint64_t);
 | 
			
		||||
DEFINE_GUEST_HANDLE(uint32_t);
 | 
			
		||||
 | 
			
		||||
DEFINE_GUEST_HANDLE(xen_pfn_t);
 | 
			
		||||
#define PRI_xen_pfn	"lx"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Arch specific VIRQs definition */
 | 
			
		||||
#define VIRQ_ITC	VIRQ_ARCH_0	/* V. Virtual itc timer */
 | 
			
		||||
#define VIRQ_MCA_CMC	VIRQ_ARCH_1	/* MCA cmc interrupt */
 | 
			
		||||
#define VIRQ_MCA_CPE	VIRQ_ARCH_2	/* MCA cpe interrupt */
 | 
			
		||||
 | 
			
		||||
/* Maximum number of virtual CPUs in multi-processor guests. */
 | 
			
		||||
/* keep sizeof(struct shared_page) <= PAGE_SIZE.
 | 
			
		||||
 * this is checked in arch/ia64/xen/hypervisor.c. */
 | 
			
		||||
#define MAX_VIRT_CPUS	64
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
 | 
			
		||||
#define INVALID_MFN	(~0UL)
 | 
			
		||||
 | 
			
		||||
union vac {
 | 
			
		||||
	unsigned long value;
 | 
			
		||||
	struct {
 | 
			
		||||
		int a_int:1;
 | 
			
		||||
		int a_from_int_cr:1;
 | 
			
		||||
		int a_to_int_cr:1;
 | 
			
		||||
		int a_from_psr:1;
 | 
			
		||||
		int a_from_cpuid:1;
 | 
			
		||||
		int a_cover:1;
 | 
			
		||||
		int a_bsw:1;
 | 
			
		||||
		long reserved:57;
 | 
			
		||||
	};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
union vdc {
 | 
			
		||||
	unsigned long value;
 | 
			
		||||
	struct {
 | 
			
		||||
		int d_vmsw:1;
 | 
			
		||||
		int d_extint:1;
 | 
			
		||||
		int d_ibr_dbr:1;
 | 
			
		||||
		int d_pmc:1;
 | 
			
		||||
		int d_to_pmd:1;
 | 
			
		||||
		int d_itm:1;
 | 
			
		||||
		long reserved:58;
 | 
			
		||||
	};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct mapped_regs {
 | 
			
		||||
	union vac vac;
 | 
			
		||||
	union vdc vdc;
 | 
			
		||||
	unsigned long virt_env_vaddr;
 | 
			
		||||
	unsigned long reserved1[29];
 | 
			
		||||
	unsigned long vhpi;
 | 
			
		||||
	unsigned long reserved2[95];
 | 
			
		||||
	union {
 | 
			
		||||
		unsigned long vgr[16];
 | 
			
		||||
		unsigned long bank1_regs[16];	/* bank1 regs (r16-r31)
 | 
			
		||||
						   when bank0 active */
 | 
			
		||||
	};
 | 
			
		||||
	union {
 | 
			
		||||
		unsigned long vbgr[16];
 | 
			
		||||
		unsigned long bank0_regs[16];	/* bank0 regs (r16-r31)
 | 
			
		||||
						   when bank1 active */
 | 
			
		||||
	};
 | 
			
		||||
	unsigned long vnat;
 | 
			
		||||
	unsigned long vbnat;
 | 
			
		||||
	unsigned long vcpuid[5];
 | 
			
		||||
	unsigned long reserved3[11];
 | 
			
		||||
	unsigned long vpsr;
 | 
			
		||||
	unsigned long vpr;
 | 
			
		||||
	unsigned long reserved4[76];
 | 
			
		||||
	union {
 | 
			
		||||
		unsigned long vcr[128];
 | 
			
		||||
		struct {
 | 
			
		||||
			unsigned long dcr;	/* CR0 */
 | 
			
		||||
			unsigned long itm;
 | 
			
		||||
			unsigned long iva;
 | 
			
		||||
			unsigned long rsv1[5];
 | 
			
		||||
			unsigned long pta;	/* CR8 */
 | 
			
		||||
			unsigned long rsv2[7];
 | 
			
		||||
			unsigned long ipsr;	/* CR16 */
 | 
			
		||||
			unsigned long isr;
 | 
			
		||||
			unsigned long rsv3;
 | 
			
		||||
			unsigned long iip;
 | 
			
		||||
			unsigned long ifa;
 | 
			
		||||
			unsigned long itir;
 | 
			
		||||
			unsigned long iipa;
 | 
			
		||||
			unsigned long ifs;
 | 
			
		||||
			unsigned long iim;	/* CR24 */
 | 
			
		||||
			unsigned long iha;
 | 
			
		||||
			unsigned long rsv4[38];
 | 
			
		||||
			unsigned long lid;	/* CR64 */
 | 
			
		||||
			unsigned long ivr;
 | 
			
		||||
			unsigned long tpr;
 | 
			
		||||
			unsigned long eoi;
 | 
			
		||||
			unsigned long irr[4];
 | 
			
		||||
			unsigned long itv;	/* CR72 */
 | 
			
		||||
			unsigned long pmv;
 | 
			
		||||
			unsigned long cmcv;
 | 
			
		||||
			unsigned long rsv5[5];
 | 
			
		||||
			unsigned long lrr0;	/* CR80 */
 | 
			
		||||
			unsigned long lrr1;
 | 
			
		||||
			unsigned long rsv6[46];
 | 
			
		||||
		};
 | 
			
		||||
	};
 | 
			
		||||
	union {
 | 
			
		||||
		unsigned long reserved5[128];
 | 
			
		||||
		struct {
 | 
			
		||||
			unsigned long precover_ifs;
 | 
			
		||||
			unsigned long unat;	/* not sure if this is needed
 | 
			
		||||
						   until NaT arch is done */
 | 
			
		||||
			int interrupt_collection_enabled; /* virtual psr.ic */
 | 
			
		||||
 | 
			
		||||
			/* virtual interrupt deliverable flag is
 | 
			
		||||
			 * evtchn_upcall_mask in shared info area now.
 | 
			
		||||
			 * interrupt_mask_addr is the address
 | 
			
		||||
			 * of evtchn_upcall_mask for current vcpu
 | 
			
		||||
			 */
 | 
			
		||||
			unsigned char *interrupt_mask_addr;
 | 
			
		||||
			int pending_interruption;
 | 
			
		||||
			unsigned char vpsr_pp;
 | 
			
		||||
			unsigned char vpsr_dfh;
 | 
			
		||||
			unsigned char hpsr_dfh;
 | 
			
		||||
			unsigned char hpsr_mfh;
 | 
			
		||||
			unsigned long reserved5_1[4];
 | 
			
		||||
			int metaphysical_mode;	/* 1 = use metaphys mapping
 | 
			
		||||
						   0 = use virtual */
 | 
			
		||||
			int banknum;		/* 0 or 1, which virtual
 | 
			
		||||
						   register bank is active */
 | 
			
		||||
			unsigned long rrs[8];	/* region registers */
 | 
			
		||||
			unsigned long krs[8];	/* kernel registers */
 | 
			
		||||
			unsigned long tmp[16];	/* temp registers
 | 
			
		||||
						   (e.g. for hyperprivops) */
 | 
			
		||||
 | 
			
		||||
			/* itc paravirtualization
 | 
			
		||||
			 * vAR.ITC = mAR.ITC + itc_offset
 | 
			
		||||
			 * itc_last is one which was lastly passed to
 | 
			
		||||
			 * the guest OS in order to prevent it from
 | 
			
		||||
			 * going backwords.
 | 
			
		||||
			 */
 | 
			
		||||
			unsigned long itc_offset;
 | 
			
		||||
			unsigned long itc_last;
 | 
			
		||||
		};
 | 
			
		||||
	};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct arch_vcpu_info {
 | 
			
		||||
	/* nothing */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This structure is used for magic page in domain pseudo physical address
 | 
			
		||||
 * space and the result of XENMEM_machine_memory_map.
 | 
			
		||||
 * As the XENMEM_machine_memory_map result,
 | 
			
		||||
 * xen_memory_map::nr_entries indicates the size in bytes
 | 
			
		||||
 * including struct xen_ia64_memmap_info. Not the number of entries.
 | 
			
		||||
 */
 | 
			
		||||
struct xen_ia64_memmap_info {
 | 
			
		||||
	uint64_t efi_memmap_size;	/* size of EFI memory map */
 | 
			
		||||
	uint64_t efi_memdesc_size;	/* size of an EFI memory map
 | 
			
		||||
					 * descriptor */
 | 
			
		||||
	uint32_t efi_memdesc_version;	/* memory descriptor version */
 | 
			
		||||
	void *memdesc[0];		/* array of efi_memory_desc_t */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct arch_shared_info {
 | 
			
		||||
	/* PFN of the start_info page.	*/
 | 
			
		||||
	unsigned long start_info_pfn;
 | 
			
		||||
 | 
			
		||||
	/* Interrupt vector for event channel.	*/
 | 
			
		||||
	int evtchn_vector;
 | 
			
		||||
 | 
			
		||||
	/* PFN of memmap_info page */
 | 
			
		||||
	unsigned int memmap_info_num_pages;	/* currently only = 1 case is
 | 
			
		||||
						   supported. */
 | 
			
		||||
	unsigned long memmap_info_pfn;
 | 
			
		||||
 | 
			
		||||
	uint64_t pad[31];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct xen_callback {
 | 
			
		||||
	unsigned long ip;
 | 
			
		||||
};
 | 
			
		||||
typedef struct xen_callback xen_callback_t;
 | 
			
		||||
 | 
			
		||||
#endif /* !__ASSEMBLY__ */
 | 
			
		||||
 | 
			
		||||
#include <asm/pvclock-abi.h>
 | 
			
		||||
 | 
			
		||||
/* Size of the shared_info area (this is not related to page size).  */
 | 
			
		||||
#define XSI_SHIFT			14
 | 
			
		||||
#define XSI_SIZE			(1 << XSI_SHIFT)
 | 
			
		||||
/* Log size of mapped_regs area (64 KB - only 4KB is used).  */
 | 
			
		||||
#define XMAPPEDREGS_SHIFT		12
 | 
			
		||||
#define XMAPPEDREGS_SIZE		(1 << XMAPPEDREGS_SHIFT)
 | 
			
		||||
/* Offset of XASI (Xen arch shared info) wrt XSI_BASE.	*/
 | 
			
		||||
#define XMAPPEDREGS_OFS			XSI_SIZE
 | 
			
		||||
 | 
			
		||||
/* Hyperprivops.  */
 | 
			
		||||
#define HYPERPRIVOP_START		0x1
 | 
			
		||||
#define HYPERPRIVOP_RFI			(HYPERPRIVOP_START + 0x0)
 | 
			
		||||
#define HYPERPRIVOP_RSM_DT		(HYPERPRIVOP_START + 0x1)
 | 
			
		||||
#define HYPERPRIVOP_SSM_DT		(HYPERPRIVOP_START + 0x2)
 | 
			
		||||
#define HYPERPRIVOP_COVER		(HYPERPRIVOP_START + 0x3)
 | 
			
		||||
#define HYPERPRIVOP_ITC_D		(HYPERPRIVOP_START + 0x4)
 | 
			
		||||
#define HYPERPRIVOP_ITC_I		(HYPERPRIVOP_START + 0x5)
 | 
			
		||||
#define HYPERPRIVOP_SSM_I		(HYPERPRIVOP_START + 0x6)
 | 
			
		||||
#define HYPERPRIVOP_GET_IVR		(HYPERPRIVOP_START + 0x7)
 | 
			
		||||
#define HYPERPRIVOP_GET_TPR		(HYPERPRIVOP_START + 0x8)
 | 
			
		||||
#define HYPERPRIVOP_SET_TPR		(HYPERPRIVOP_START + 0x9)
 | 
			
		||||
#define HYPERPRIVOP_EOI			(HYPERPRIVOP_START + 0xa)
 | 
			
		||||
#define HYPERPRIVOP_SET_ITM		(HYPERPRIVOP_START + 0xb)
 | 
			
		||||
#define HYPERPRIVOP_THASH		(HYPERPRIVOP_START + 0xc)
 | 
			
		||||
#define HYPERPRIVOP_PTC_GA		(HYPERPRIVOP_START + 0xd)
 | 
			
		||||
#define HYPERPRIVOP_ITR_D		(HYPERPRIVOP_START + 0xe)
 | 
			
		||||
#define HYPERPRIVOP_GET_RR		(HYPERPRIVOP_START + 0xf)
 | 
			
		||||
#define HYPERPRIVOP_SET_RR		(HYPERPRIVOP_START + 0x10)
 | 
			
		||||
#define HYPERPRIVOP_SET_KR		(HYPERPRIVOP_START + 0x11)
 | 
			
		||||
#define HYPERPRIVOP_FC			(HYPERPRIVOP_START + 0x12)
 | 
			
		||||
#define HYPERPRIVOP_GET_CPUID		(HYPERPRIVOP_START + 0x13)
 | 
			
		||||
#define HYPERPRIVOP_GET_PMD		(HYPERPRIVOP_START + 0x14)
 | 
			
		||||
#define HYPERPRIVOP_GET_EFLAG		(HYPERPRIVOP_START + 0x15)
 | 
			
		||||
#define HYPERPRIVOP_SET_EFLAG		(HYPERPRIVOP_START + 0x16)
 | 
			
		||||
#define HYPERPRIVOP_RSM_BE		(HYPERPRIVOP_START + 0x17)
 | 
			
		||||
#define HYPERPRIVOP_GET_PSR		(HYPERPRIVOP_START + 0x18)
 | 
			
		||||
#define HYPERPRIVOP_SET_RR0_TO_RR4	(HYPERPRIVOP_START + 0x19)
 | 
			
		||||
#define HYPERPRIVOP_MAX			(0x1a)
 | 
			
		||||
 | 
			
		||||
/* Fast and light hypercalls.  */
 | 
			
		||||
#define __HYPERVISOR_ia64_fast_eoi	__HYPERVISOR_arch_1
 | 
			
		||||
 | 
			
		||||
/* Xencomm macros.  */
 | 
			
		||||
#define XENCOMM_INLINE_MASK		0xf800000000000000UL
 | 
			
		||||
#define XENCOMM_INLINE_FLAG		0x8000000000000000UL
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Optimization features.
 | 
			
		||||
 * The hypervisor may do some special optimizations for guests. This hypercall
 | 
			
		||||
 * can be used to switch on/of these special optimizations.
 | 
			
		||||
 */
 | 
			
		||||
#define __HYPERVISOR_opt_feature	0x700UL
 | 
			
		||||
 | 
			
		||||
#define XEN_IA64_OPTF_OFF		0x0
 | 
			
		||||
#define XEN_IA64_OPTF_ON		0x1
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * If this feature is switched on, the hypervisor inserts the
 | 
			
		||||
 * tlb entries without calling the guests traphandler.
 | 
			
		||||
 * This is useful in guests using region 7 for identity mapping
 | 
			
		||||
 * like the linux kernel does.
 | 
			
		||||
 */
 | 
			
		||||
#define XEN_IA64_OPTF_IDENT_MAP_REG7	1
 | 
			
		||||
 | 
			
		||||
/* Identity mapping of region 4 addresses in HVM. */
 | 
			
		||||
#define XEN_IA64_OPTF_IDENT_MAP_REG4	2
 | 
			
		||||
 | 
			
		||||
/* Identity mapping of region 5 addresses in HVM. */
 | 
			
		||||
#define XEN_IA64_OPTF_IDENT_MAP_REG5	3
 | 
			
		||||
 | 
			
		||||
#define XEN_IA64_OPTF_IDENT_MAP_NOT_SET	 (0)
 | 
			
		||||
 | 
			
		||||
struct xen_ia64_opt_feature {
 | 
			
		||||
	unsigned long cmd;	/* Which feature */
 | 
			
		||||
	unsigned char on;	/* Switch feature on/off */
 | 
			
		||||
	union {
 | 
			
		||||
		struct {
 | 
			
		||||
			/* The page protection bit mask of the pte.
 | 
			
		||||
			 * This will be or'ed with the pte. */
 | 
			
		||||
			unsigned long pgprot;
 | 
			
		||||
			unsigned long key;	/* A protection key for itir.*/
 | 
			
		||||
		};
 | 
			
		||||
	};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif /* __ASSEMBLY__ */
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_IA64_XEN_INTERFACE_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,44 +0,0 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
 * arch/ia64/include/asm/xen/irq.h
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *                    VA Linux Systems Japan K.K.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _ASM_IA64_XEN_IRQ_H
 | 
			
		||||
#define _ASM_IA64_XEN_IRQ_H
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The flat IRQ space is divided into two regions:
 | 
			
		||||
 *  1. A one-to-one mapping of real physical IRQs. This space is only used
 | 
			
		||||
 *     if we have physical device-access privilege. This region is at the
 | 
			
		||||
 *     start of the IRQ space so that existing device drivers do not need
 | 
			
		||||
 *     to be modified to translate physical IRQ numbers into our IRQ space.
 | 
			
		||||
 *  3. A dynamic mapping of inter-domain and Xen-sourced virtual IRQs. These
 | 
			
		||||
 *     are bound using the provided bind/unbind functions.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define XEN_PIRQ_BASE		0
 | 
			
		||||
#define XEN_NR_PIRQS		256
 | 
			
		||||
 | 
			
		||||
#define XEN_DYNIRQ_BASE		(XEN_PIRQ_BASE + XEN_NR_PIRQS)
 | 
			
		||||
#define XEN_NR_DYNIRQS		(NR_CPUS * 8)
 | 
			
		||||
 | 
			
		||||
#define XEN_NR_IRQS		(XEN_NR_PIRQS + XEN_NR_DYNIRQS)
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_IA64_XEN_IRQ_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,143 +0,0 @@
 | 
			
		|||
 | 
			
		||||
#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE
 | 
			
		||||
/* read ar.itc in advance, and use it before leaving bank 0 */
 | 
			
		||||
#define XEN_ACCOUNT_GET_STAMP		\
 | 
			
		||||
	MOV_FROM_ITC(pUStk, p6, r20, r2);
 | 
			
		||||
#else
 | 
			
		||||
#define XEN_ACCOUNT_GET_STAMP
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * DO_SAVE_MIN switches to the kernel stacks (if necessary) and saves
 | 
			
		||||
 * the minimum state necessary that allows us to turn psr.ic back
 | 
			
		||||
 * on.
 | 
			
		||||
 *
 | 
			
		||||
 * Assumed state upon entry:
 | 
			
		||||
 *	psr.ic: off
 | 
			
		||||
 *	r31:	contains saved predicates (pr)
 | 
			
		||||
 *
 | 
			
		||||
 * Upon exit, the state is as follows:
 | 
			
		||||
 *	psr.ic: off
 | 
			
		||||
 *	 r2 = points to &pt_regs.r16
 | 
			
		||||
 *	 r8 = contents of ar.ccv
 | 
			
		||||
 *	 r9 = contents of ar.csd
 | 
			
		||||
 *	r10 = contents of ar.ssd
 | 
			
		||||
 *	r11 = FPSR_DEFAULT
 | 
			
		||||
 *	r12 = kernel sp (kernel virtual address)
 | 
			
		||||
 *	r13 = points to current task_struct (kernel virtual address)
 | 
			
		||||
 *	p15 = TRUE if psr.i is set in cr.ipsr
 | 
			
		||||
 *	predicate registers (other than p2, p3, and p15), b6, r3, r14, r15:
 | 
			
		||||
 *		preserved
 | 
			
		||||
 * CONFIG_XEN note: p6/p7 are not preserved
 | 
			
		||||
 *
 | 
			
		||||
 * Note that psr.ic is NOT turned on by this macro.  This is so that
 | 
			
		||||
 * we can pass interruption state as arguments to a handler.
 | 
			
		||||
 */
 | 
			
		||||
#define XEN_DO_SAVE_MIN(__COVER,SAVE_IFS,EXTRA,WORKAROUND)					\
 | 
			
		||||
	mov r16=IA64_KR(CURRENT);	/* M */							\
 | 
			
		||||
	mov r27=ar.rsc;			/* M */							\
 | 
			
		||||
	mov r20=r1;			/* A */							\
 | 
			
		||||
	mov r25=ar.unat;		/* M */							\
 | 
			
		||||
	MOV_FROM_IPSR(p0,r29);		/* M */							\
 | 
			
		||||
	MOV_FROM_IIP(r28);		/* M */							\
 | 
			
		||||
	mov r21=ar.fpsr;		/* M */							\
 | 
			
		||||
	mov r26=ar.pfs;			/* I */							\
 | 
			
		||||
	__COVER;			/* B;; (or nothing) */					\
 | 
			
		||||
	adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r16;						\
 | 
			
		||||
	;;											\
 | 
			
		||||
	ld1 r17=[r16];				/* load current->thread.on_ustack flag */	\
 | 
			
		||||
	st1 [r16]=r0;				/* clear current->thread.on_ustack flag */	\
 | 
			
		||||
	adds r1=-IA64_TASK_THREAD_ON_USTACK_OFFSET,r16						\
 | 
			
		||||
	/* switch from user to kernel RBS: */							\
 | 
			
		||||
	;;											\
 | 
			
		||||
	invala;				/* M */							\
 | 
			
		||||
	/* SAVE_IFS;*/ /* see xen special handling below */					\
 | 
			
		||||
	cmp.eq pKStk,pUStk=r0,r17;		/* are we in kernel mode already? */		\
 | 
			
		||||
	;;											\
 | 
			
		||||
(pUStk)	mov ar.rsc=0;		/* set enforced lazy mode, pl 0, little-endian, loadrs=0 */	\
 | 
			
		||||
	;;											\
 | 
			
		||||
(pUStk)	mov.m r24=ar.rnat;									\
 | 
			
		||||
(pUStk)	addl r22=IA64_RBS_OFFSET,r1;			/* compute base of RBS */		\
 | 
			
		||||
(pKStk) mov r1=sp;					/* get sp  */				\
 | 
			
		||||
	;;											\
 | 
			
		||||
(pUStk) lfetch.fault.excl.nt1 [r22];								\
 | 
			
		||||
(pUStk)	addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r1;	/* compute base of memory stack */	\
 | 
			
		||||
(pUStk)	mov r23=ar.bspstore;				/* save ar.bspstore */			\
 | 
			
		||||
	;;											\
 | 
			
		||||
(pUStk)	mov ar.bspstore=r22;				/* switch to kernel RBS */		\
 | 
			
		||||
(pKStk) addl r1=-IA64_PT_REGS_SIZE,r1;			/* if in kernel mode, use sp (r12) */	\
 | 
			
		||||
	;;											\
 | 
			
		||||
(pUStk)	mov r18=ar.bsp;										\
 | 
			
		||||
(pUStk)	mov ar.rsc=0x3;		/* set eager mode, pl 0, little-endian, loadrs=0 */		\
 | 
			
		||||
	adds r17=2*L1_CACHE_BYTES,r1;		/* really: biggest cache-line size */		\
 | 
			
		||||
	adds r16=PT(CR_IPSR),r1;								\
 | 
			
		||||
	;;											\
 | 
			
		||||
	lfetch.fault.excl.nt1 [r17],L1_CACHE_BYTES;						\
 | 
			
		||||
	st8 [r16]=r29;		/* save cr.ipsr */						\
 | 
			
		||||
	;;											\
 | 
			
		||||
	lfetch.fault.excl.nt1 [r17];								\
 | 
			
		||||
	tbit.nz p15,p0=r29,IA64_PSR_I_BIT;							\
 | 
			
		||||
	mov r29=b0										\
 | 
			
		||||
	;;											\
 | 
			
		||||
	WORKAROUND;										\
 | 
			
		||||
	adds r16=PT(R8),r1;	/* initialize first base pointer */				\
 | 
			
		||||
	adds r17=PT(R9),r1;	/* initialize second base pointer */				\
 | 
			
		||||
(pKStk)	mov r18=r0;		/* make sure r18 isn't NaT */					\
 | 
			
		||||
	;;											\
 | 
			
		||||
.mem.offset 0,0; st8.spill [r16]=r8,16;								\
 | 
			
		||||
.mem.offset 8,0; st8.spill [r17]=r9,16;								\
 | 
			
		||||
        ;;											\
 | 
			
		||||
.mem.offset 0,0; st8.spill [r16]=r10,24;							\
 | 
			
		||||
	movl r8=XSI_PRECOVER_IFS;								\
 | 
			
		||||
.mem.offset 8,0; st8.spill [r17]=r11,24;							\
 | 
			
		||||
        ;;											\
 | 
			
		||||
	/* xen special handling for possibly lazy cover */					\
 | 
			
		||||
	/* SAVE_MIN case in dispatch_ia32_handler: mov r30=r0 */				\
 | 
			
		||||
	ld8 r30=[r8];										\
 | 
			
		||||
(pUStk)	sub r18=r18,r22;	/* r18=RSE.ndirty*8 */						\
 | 
			
		||||
	st8 [r16]=r28,16;	/* save cr.iip */						\
 | 
			
		||||
	;;											\
 | 
			
		||||
	st8 [r17]=r30,16;	/* save cr.ifs */						\
 | 
			
		||||
	mov r8=ar.ccv;										\
 | 
			
		||||
	mov r9=ar.csd;										\
 | 
			
		||||
	mov r10=ar.ssd;										\
 | 
			
		||||
	movl r11=FPSR_DEFAULT;   /* L-unit */							\
 | 
			
		||||
	;;											\
 | 
			
		||||
	st8 [r16]=r25,16;	/* save ar.unat */						\
 | 
			
		||||
	st8 [r17]=r26,16;	/* save ar.pfs */						\
 | 
			
		||||
	shl r18=r18,16;		/* compute ar.rsc to be used for "loadrs" */			\
 | 
			
		||||
	;;											\
 | 
			
		||||
	st8 [r16]=r27,16;	/* save ar.rsc */						\
 | 
			
		||||
(pUStk)	st8 [r17]=r24,16;	/* save ar.rnat */						\
 | 
			
		||||
(pKStk)	adds r17=16,r17;	/* skip over ar_rnat field */					\
 | 
			
		||||
	;;			/* avoid RAW on r16 & r17 */					\
 | 
			
		||||
(pUStk)	st8 [r16]=r23,16;	/* save ar.bspstore */						\
 | 
			
		||||
	st8 [r17]=r31,16;	/* save predicates */						\
 | 
			
		||||
(pKStk)	adds r16=16,r16;	/* skip over ar_bspstore field */				\
 | 
			
		||||
	;;											\
 | 
			
		||||
	st8 [r16]=r29,16;	/* save b0 */							\
 | 
			
		||||
	st8 [r17]=r18,16;	/* save ar.rsc value for "loadrs" */				\
 | 
			
		||||
	cmp.eq pNonSys,pSys=r0,r0	/* initialize pSys=0, pNonSys=1 */			\
 | 
			
		||||
	;;											\
 | 
			
		||||
.mem.offset 0,0; st8.spill [r16]=r20,16;	/* save original r1 */				\
 | 
			
		||||
.mem.offset 8,0; st8.spill [r17]=r12,16;							\
 | 
			
		||||
	adds r12=-16,r1;	/* switch to kernel memory stack (with 16 bytes of scratch) */	\
 | 
			
		||||
	;;											\
 | 
			
		||||
.mem.offset 0,0; st8.spill [r16]=r13,16;							\
 | 
			
		||||
.mem.offset 8,0; st8.spill [r17]=r21,16;	/* save ar.fpsr */				\
 | 
			
		||||
	mov r13=IA64_KR(CURRENT);	/* establish `current' */				\
 | 
			
		||||
	;;											\
 | 
			
		||||
.mem.offset 0,0; st8.spill [r16]=r15,16;							\
 | 
			
		||||
.mem.offset 8,0; st8.spill [r17]=r14,16;							\
 | 
			
		||||
	;;											\
 | 
			
		||||
.mem.offset 0,0; st8.spill [r16]=r2,16;								\
 | 
			
		||||
.mem.offset 8,0; st8.spill [r17]=r3,16;								\
 | 
			
		||||
	XEN_ACCOUNT_GET_STAMP									\
 | 
			
		||||
	adds r2=IA64_PT_REGS_R16_OFFSET,r1;							\
 | 
			
		||||
	;;											\
 | 
			
		||||
	EXTRA;											\
 | 
			
		||||
	movl r1=__gp;		/* establish kernel global pointer */				\
 | 
			
		||||
	;;											\
 | 
			
		||||
	ACCOUNT_SYS_ENTER									\
 | 
			
		||||
	BSW_1(r3,r14);	/* switch back to bank 1 (must be last in insn group) */		\
 | 
			
		||||
	;;
 | 
			
		||||
| 
						 | 
				
			
			@ -1,38 +0,0 @@
 | 
			
		|||
#ifndef _ASM_IA64_XEN_PAGE_COHERENT_H
 | 
			
		||||
#define _ASM_IA64_XEN_PAGE_COHERENT_H
 | 
			
		||||
 | 
			
		||||
#include <asm/page.h>
 | 
			
		||||
#include <linux/dma-attrs.h>
 | 
			
		||||
#include <linux/dma-mapping.h>
 | 
			
		||||
 | 
			
		||||
static inline void *xen_alloc_coherent_pages(struct device *hwdev, size_t size,
 | 
			
		||||
		dma_addr_t *dma_handle, gfp_t flags,
 | 
			
		||||
		struct dma_attrs *attrs)
 | 
			
		||||
{
 | 
			
		||||
	void *vstart = (void*)__get_free_pages(flags, get_order(size));
 | 
			
		||||
	*dma_handle = virt_to_phys(vstart);
 | 
			
		||||
	return vstart;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void xen_free_coherent_pages(struct device *hwdev, size_t size,
 | 
			
		||||
		void *cpu_addr, dma_addr_t dma_handle,
 | 
			
		||||
		struct dma_attrs *attrs)
 | 
			
		||||
{
 | 
			
		||||
	free_pages((unsigned long) cpu_addr, get_order(size));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void xen_dma_map_page(struct device *hwdev, struct page *page,
 | 
			
		||||
	     unsigned long offset, size_t size, enum dma_data_direction dir,
 | 
			
		||||
	     struct dma_attrs *attrs) { }
 | 
			
		||||
 | 
			
		||||
static inline void xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle,
 | 
			
		||||
		size_t size, enum dma_data_direction dir,
 | 
			
		||||
		struct dma_attrs *attrs) { }
 | 
			
		||||
 | 
			
		||||
static inline void xen_dma_sync_single_for_cpu(struct device *hwdev,
 | 
			
		||||
		dma_addr_t handle, size_t size, enum dma_data_direction dir) { }
 | 
			
		||||
 | 
			
		||||
static inline void xen_dma_sync_single_for_device(struct device *hwdev,
 | 
			
		||||
		dma_addr_t handle, size_t size, enum dma_data_direction dir) { }
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_IA64_XEN_PAGE_COHERENT_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,65 +0,0 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
 * arch/ia64/include/asm/xen/page.h
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *                    VA Linux Systems Japan K.K.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _ASM_IA64_XEN_PAGE_H
 | 
			
		||||
#define _ASM_IA64_XEN_PAGE_H
 | 
			
		||||
 | 
			
		||||
#define INVALID_P2M_ENTRY	(~0UL)
 | 
			
		||||
 | 
			
		||||
static inline unsigned long mfn_to_pfn(unsigned long mfn)
 | 
			
		||||
{
 | 
			
		||||
	return mfn;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline unsigned long pfn_to_mfn(unsigned long pfn)
 | 
			
		||||
{
 | 
			
		||||
	return pfn;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define phys_to_machine_mapping_valid(_x)	(1)
 | 
			
		||||
 | 
			
		||||
static inline void *mfn_to_virt(unsigned long mfn)
 | 
			
		||||
{
 | 
			
		||||
	return __va(mfn << PAGE_SHIFT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline unsigned long virt_to_mfn(void *virt)
 | 
			
		||||
{
 | 
			
		||||
	return __pa(virt) >> PAGE_SHIFT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* for tpmfront.c */
 | 
			
		||||
static inline unsigned long virt_to_machine(void *virt)
 | 
			
		||||
{
 | 
			
		||||
	return __pa(virt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn)
 | 
			
		||||
{
 | 
			
		||||
	/* nothing */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define pte_mfn(_x)	pte_pfn(_x)
 | 
			
		||||
#define mfn_pte(_x, _y)	__pte_ma(0)		/* unmodified use */
 | 
			
		||||
#define __pte_ma(_x)	((pte_t) {(_x)})        /* unmodified use */
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_IA64_XEN_PAGE_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,38 +0,0 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
 * arch/ia64/include/asm/xen/patchlist.h
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *                    VA Linux Systems Japan K.K.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __paravirt_start_gate_fsyscall_patchlist		\
 | 
			
		||||
	__xen_start_gate_fsyscall_patchlist
 | 
			
		||||
#define __paravirt_end_gate_fsyscall_patchlist			\
 | 
			
		||||
	__xen_end_gate_fsyscall_patchlist
 | 
			
		||||
#define __paravirt_start_gate_brl_fsys_bubble_down_patchlist	\
 | 
			
		||||
	__xen_start_gate_brl_fsys_bubble_down_patchlist
 | 
			
		||||
#define __paravirt_end_gate_brl_fsys_bubble_down_patchlist	\
 | 
			
		||||
	__xen_end_gate_brl_fsys_bubble_down_patchlist
 | 
			
		||||
#define __paravirt_start_gate_vtop_patchlist			\
 | 
			
		||||
	__xen_start_gate_vtop_patchlist
 | 
			
		||||
#define __paravirt_end_gate_vtop_patchlist			\
 | 
			
		||||
	__xen_end_gate_vtop_patchlist
 | 
			
		||||
#define __paravirt_start_gate_mckinley_e9_patchlist		\
 | 
			
		||||
	__xen_start_gate_mckinley_e9_patchlist
 | 
			
		||||
#define __paravirt_end_gate_mckinley_e9_patchlist		\
 | 
			
		||||
	__xen_end_gate_mckinley_e9_patchlist
 | 
			
		||||
| 
						 | 
				
			
			@ -1,135 +0,0 @@
 | 
			
		|||
#ifndef _ASM_IA64_XEN_PRIVOP_H
 | 
			
		||||
#define _ASM_IA64_XEN_PRIVOP_H
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2005 Hewlett-Packard Co
 | 
			
		||||
 *	Dan Magenheimer <dan.magenheimer@hp.com>
 | 
			
		||||
 *
 | 
			
		||||
 * Paravirtualizations of privileged operations for Xen/ia64
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * inline privop and paravirt_alt support
 | 
			
		||||
 * Copyright (c) 2007 Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *                    VA Linux Systems Japan K.K.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
#include <linux/types.h>		/* arch-ia64.h requires uint64_t */
 | 
			
		||||
#endif
 | 
			
		||||
#include <asm/xen/interface.h>
 | 
			
		||||
 | 
			
		||||
/* At 1 MB, before per-cpu space but still addressable using addl instead
 | 
			
		||||
   of movl. */
 | 
			
		||||
#define XSI_BASE			0xfffffffffff00000
 | 
			
		||||
 | 
			
		||||
/* Address of mapped regs.  */
 | 
			
		||||
#define XMAPPEDREGS_BASE		(XSI_BASE + XSI_SIZE)
 | 
			
		||||
 | 
			
		||||
#ifdef __ASSEMBLY__
 | 
			
		||||
#define XEN_HYPER_RFI			break HYPERPRIVOP_RFI
 | 
			
		||||
#define XEN_HYPER_RSM_PSR_DT		break HYPERPRIVOP_RSM_DT
 | 
			
		||||
#define XEN_HYPER_SSM_PSR_DT		break HYPERPRIVOP_SSM_DT
 | 
			
		||||
#define XEN_HYPER_COVER			break HYPERPRIVOP_COVER
 | 
			
		||||
#define XEN_HYPER_ITC_D			break HYPERPRIVOP_ITC_D
 | 
			
		||||
#define XEN_HYPER_ITC_I			break HYPERPRIVOP_ITC_I
 | 
			
		||||
#define XEN_HYPER_SSM_I			break HYPERPRIVOP_SSM_I
 | 
			
		||||
#define XEN_HYPER_GET_IVR		break HYPERPRIVOP_GET_IVR
 | 
			
		||||
#define XEN_HYPER_THASH			break HYPERPRIVOP_THASH
 | 
			
		||||
#define XEN_HYPER_ITR_D			break HYPERPRIVOP_ITR_D
 | 
			
		||||
#define XEN_HYPER_SET_KR		break HYPERPRIVOP_SET_KR
 | 
			
		||||
#define XEN_HYPER_GET_PSR		break HYPERPRIVOP_GET_PSR
 | 
			
		||||
#define XEN_HYPER_SET_RR0_TO_RR4	break HYPERPRIVOP_SET_RR0_TO_RR4
 | 
			
		||||
 | 
			
		||||
#define XSI_IFS				(XSI_BASE + XSI_IFS_OFS)
 | 
			
		||||
#define XSI_PRECOVER_IFS		(XSI_BASE + XSI_PRECOVER_IFS_OFS)
 | 
			
		||||
#define XSI_IFA				(XSI_BASE + XSI_IFA_OFS)
 | 
			
		||||
#define XSI_ISR				(XSI_BASE + XSI_ISR_OFS)
 | 
			
		||||
#define XSI_IIM				(XSI_BASE + XSI_IIM_OFS)
 | 
			
		||||
#define XSI_ITIR			(XSI_BASE + XSI_ITIR_OFS)
 | 
			
		||||
#define XSI_PSR_I_ADDR			(XSI_BASE + XSI_PSR_I_ADDR_OFS)
 | 
			
		||||
#define XSI_PSR_IC			(XSI_BASE + XSI_PSR_IC_OFS)
 | 
			
		||||
#define XSI_IPSR			(XSI_BASE + XSI_IPSR_OFS)
 | 
			
		||||
#define XSI_IIP				(XSI_BASE + XSI_IIP_OFS)
 | 
			
		||||
#define XSI_B1NAT			(XSI_BASE + XSI_B1NATS_OFS)
 | 
			
		||||
#define XSI_BANK1_R16			(XSI_BASE + XSI_BANK1_R16_OFS)
 | 
			
		||||
#define XSI_BANKNUM			(XSI_BASE + XSI_BANKNUM_OFS)
 | 
			
		||||
#define XSI_IHA				(XSI_BASE + XSI_IHA_OFS)
 | 
			
		||||
#define XSI_ITC_OFFSET			(XSI_BASE + XSI_ITC_OFFSET_OFS)
 | 
			
		||||
#define XSI_ITC_LAST			(XSI_BASE + XSI_ITC_LAST_OFS)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
 | 
			
		||||
/************************************************/
 | 
			
		||||
/* Instructions paravirtualized for correctness */
 | 
			
		||||
/************************************************/
 | 
			
		||||
 | 
			
		||||
/* "fc" and "thash" are privilege-sensitive instructions, meaning they
 | 
			
		||||
 *  may have different semantics depending on whether they are executed
 | 
			
		||||
 *  at PL0 vs PL!=0.  When paravirtualized, these instructions mustn't
 | 
			
		||||
 *  be allowed to execute directly, lest incorrect semantics result. */
 | 
			
		||||
extern void xen_fc(void *addr);
 | 
			
		||||
extern unsigned long xen_thash(unsigned long addr);
 | 
			
		||||
 | 
			
		||||
/* Note that "ttag" and "cover" are also privilege-sensitive; "ttag"
 | 
			
		||||
 * is not currently used (though it may be in a long-format VHPT system!)
 | 
			
		||||
 * and the semantics of cover only change if psr.ic is off which is very
 | 
			
		||||
 * rare (and currently non-existent outside of assembly code */
 | 
			
		||||
 | 
			
		||||
/* There are also privilege-sensitive registers.  These registers are
 | 
			
		||||
 * readable at any privilege level but only writable at PL0. */
 | 
			
		||||
extern unsigned long xen_get_cpuid(int index);
 | 
			
		||||
extern unsigned long xen_get_pmd(int index);
 | 
			
		||||
 | 
			
		||||
#ifndef ASM_SUPPORTED
 | 
			
		||||
extern unsigned long xen_get_eflag(void);	/* see xen_ia64_getreg */
 | 
			
		||||
extern void xen_set_eflag(unsigned long);	/* see xen_ia64_setreg */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/************************************************/
 | 
			
		||||
/* Instructions paravirtualized for performance */
 | 
			
		||||
/************************************************/
 | 
			
		||||
 | 
			
		||||
/* Xen uses memory-mapped virtual privileged registers for access to many
 | 
			
		||||
 * performance-sensitive privileged registers.  Some, like the processor
 | 
			
		||||
 * status register (psr), are broken up into multiple memory locations.
 | 
			
		||||
 * Others, like "pend", are abstractions based on privileged registers.
 | 
			
		||||
 * "Pend" is guaranteed to be set if reading cr.ivr would return a
 | 
			
		||||
 * (non-spurious) interrupt. */
 | 
			
		||||
#define XEN_MAPPEDREGS ((struct mapped_regs *)XMAPPEDREGS_BASE)
 | 
			
		||||
 | 
			
		||||
#define XSI_PSR_I			\
 | 
			
		||||
	(*XEN_MAPPEDREGS->interrupt_mask_addr)
 | 
			
		||||
#define xen_get_virtual_psr_i()		\
 | 
			
		||||
	(!XSI_PSR_I)
 | 
			
		||||
#define xen_set_virtual_psr_i(_val)	\
 | 
			
		||||
	({ XSI_PSR_I = (uint8_t)(_val) ? 0 : 1; })
 | 
			
		||||
#define xen_set_virtual_psr_ic(_val)	\
 | 
			
		||||
	({ XEN_MAPPEDREGS->interrupt_collection_enabled = _val ? 1 : 0; })
 | 
			
		||||
#define xen_get_virtual_pend()		\
 | 
			
		||||
	(*(((uint8_t *)XEN_MAPPEDREGS->interrupt_mask_addr) - 1))
 | 
			
		||||
 | 
			
		||||
#ifndef ASM_SUPPORTED
 | 
			
		||||
/* Although all privileged operations can be left to trap and will
 | 
			
		||||
 * be properly handled by Xen, some are frequent enough that we use
 | 
			
		||||
 * hyperprivops for performance. */
 | 
			
		||||
extern unsigned long xen_get_psr(void);
 | 
			
		||||
extern unsigned long xen_get_ivr(void);
 | 
			
		||||
extern unsigned long xen_get_tpr(void);
 | 
			
		||||
extern void xen_hyper_ssm_i(void);
 | 
			
		||||
extern void xen_set_itm(unsigned long);
 | 
			
		||||
extern void xen_set_tpr(unsigned long);
 | 
			
		||||
extern void xen_eoi(unsigned long);
 | 
			
		||||
extern unsigned long xen_get_rr(unsigned long index);
 | 
			
		||||
extern void xen_set_rr(unsigned long index, unsigned long val);
 | 
			
		||||
extern void xen_set_rr0_to_rr4(unsigned long val0, unsigned long val1,
 | 
			
		||||
			       unsigned long val2, unsigned long val3,
 | 
			
		||||
			       unsigned long val4);
 | 
			
		||||
extern void xen_set_kr(unsigned long index, unsigned long val);
 | 
			
		||||
extern void xen_ptcga(unsigned long addr, unsigned long size);
 | 
			
		||||
#endif /* !ASM_SUPPORTED */
 | 
			
		||||
 | 
			
		||||
#endif /* !__ASSEMBLY__ */
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_IA64_XEN_PRIVOP_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,51 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (C) 2006 Tristan Gingold <tristan.gingold@bull.net>, Bull SAS
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _ASM_IA64_XEN_XCOM_HCALL_H
 | 
			
		||||
#define _ASM_IA64_XEN_XCOM_HCALL_H
 | 
			
		||||
 | 
			
		||||
/* These function creates inline or mini descriptor for the parameters and
 | 
			
		||||
   calls the corresponding xencomm_arch_hypercall_X.
 | 
			
		||||
   Architectures should defines HYPERVISOR_xxx as xencomm_hypercall_xxx unless
 | 
			
		||||
   they want to use their own wrapper.  */
 | 
			
		||||
extern int xencomm_hypercall_console_io(int cmd, int count, char *str);
 | 
			
		||||
 | 
			
		||||
extern int xencomm_hypercall_event_channel_op(int cmd, void *op);
 | 
			
		||||
 | 
			
		||||
extern int xencomm_hypercall_xen_version(int cmd, void *arg);
 | 
			
		||||
 | 
			
		||||
extern int xencomm_hypercall_physdev_op(int cmd, void *op);
 | 
			
		||||
 | 
			
		||||
extern int xencomm_hypercall_grant_table_op(unsigned int cmd, void *op,
 | 
			
		||||
					    unsigned int count);
 | 
			
		||||
 | 
			
		||||
extern int xencomm_hypercall_sched_op(int cmd, void *arg);
 | 
			
		||||
 | 
			
		||||
extern int xencomm_hypercall_multicall(void *call_list, int nr_calls);
 | 
			
		||||
 | 
			
		||||
extern int xencomm_hypercall_callback_op(int cmd, void *arg);
 | 
			
		||||
 | 
			
		||||
extern int xencomm_hypercall_memory_op(unsigned int cmd, void *arg);
 | 
			
		||||
 | 
			
		||||
extern int xencomm_hypercall_suspend(unsigned long srec);
 | 
			
		||||
 | 
			
		||||
extern long xencomm_hypercall_vcpu_op(int cmd, int cpu, void *arg);
 | 
			
		||||
 | 
			
		||||
extern long xencomm_hypercall_opt_feature(void *arg);
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_IA64_XEN_XCOM_HCALL_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,42 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (C) 2006 Hollis Blanchard <hollisb@us.ibm.com>, IBM Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _ASM_IA64_XEN_XENCOMM_H
 | 
			
		||||
#define _ASM_IA64_XEN_XENCOMM_H
 | 
			
		||||
 | 
			
		||||
#include <xen/xencomm.h>
 | 
			
		||||
#include <asm/pgtable.h>
 | 
			
		||||
 | 
			
		||||
/* Must be called before any hypercall.  */
 | 
			
		||||
extern void xencomm_initialize(void);
 | 
			
		||||
extern int xencomm_is_initialized(void);
 | 
			
		||||
 | 
			
		||||
/* Check if virtual contiguity means physical contiguity
 | 
			
		||||
 * where the passed address is a pointer value in virtual address.
 | 
			
		||||
 * On ia64, identity mapping area in region 7 or the piece of region 5
 | 
			
		||||
 * that is mapped by itr[IA64_TR_KERNEL]/dtr[IA64_TR_KERNEL]
 | 
			
		||||
 */
 | 
			
		||||
static inline int xencomm_is_phys_contiguous(unsigned long addr)
 | 
			
		||||
{
 | 
			
		||||
	return (PAGE_OFFSET <= addr &&
 | 
			
		||||
		addr < (PAGE_OFFSET + (1UL << IA64_MAX_PHYS_BITS))) ||
 | 
			
		||||
		(KERNEL_START <= addr &&
 | 
			
		||||
		 addr < KERNEL_START + KERNEL_TR_PAGE_SIZE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_IA64_XEN_XENCOMM_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -20,13 +20,4 @@
 | 
			
		|||
 */
 | 
			
		||||
#define __IA64_BREAK_SYSCALL		0x100000
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Xen specific break numbers:
 | 
			
		||||
 */
 | 
			
		||||
#define __IA64_XEN_HYPERCALL		0x1000
 | 
			
		||||
/* [__IA64_XEN_HYPERPRIVOP_START, __IA64_XEN_HYPERPRIVOP_MAX] is used
 | 
			
		||||
   for xen hyperprivops */
 | 
			
		||||
#define __IA64_XEN_HYPERPRIVOP_START	0x1
 | 
			
		||||
#define __IA64_XEN_HYPERPRIVOP_MAX	0x1a
 | 
			
		||||
 | 
			
		||||
#endif /* _ASM_IA64_BREAK_H */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -53,7 +53,6 @@
 | 
			
		|||
#include <asm/numa.h>
 | 
			
		||||
#include <asm/sal.h>
 | 
			
		||||
#include <asm/cyclone.h>
 | 
			
		||||
#include <asm/xen/hypervisor.h>
 | 
			
		||||
 | 
			
		||||
#define BAD_MADT_ENTRY(entry, end) (                                        \
 | 
			
		||||
		(!entry) || (unsigned long)entry + sizeof(*entry) > end ||  \
 | 
			
		||||
| 
						 | 
				
			
			@ -120,8 +119,6 @@ acpi_get_sysname(void)
 | 
			
		|||
			return "uv";
 | 
			
		||||
		else
 | 
			
		||||
			return "sn2";
 | 
			
		||||
	} else if (xen_pv_domain() && !strcmp(hdr->oem_id, "XEN")) {
 | 
			
		||||
		return "xen";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_INTEL_IOMMU
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,9 +16,6 @@
 | 
			
		|||
#include <asm/sigcontext.h>
 | 
			
		||||
#include <asm/mca.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/xen/interface.h>
 | 
			
		||||
#include <asm/xen/hypervisor.h>
 | 
			
		||||
 | 
			
		||||
#include "../kernel/sigframe.h"
 | 
			
		||||
#include "../kernel/fsyscall_gtod_data.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -290,33 +287,4 @@ void foo(void)
 | 
			
		|||
	DEFINE(IA64_ITC_LASTCYCLE_OFFSET,
 | 
			
		||||
		offsetof (struct itc_jitter_data_t, itc_lastcycle));
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_XEN
 | 
			
		||||
	BLANK();
 | 
			
		||||
 | 
			
		||||
	DEFINE(XEN_NATIVE_ASM, XEN_NATIVE);
 | 
			
		||||
	DEFINE(XEN_PV_DOMAIN_ASM, XEN_PV_DOMAIN);
 | 
			
		||||
 | 
			
		||||
#define DEFINE_MAPPED_REG_OFS(sym, field) \
 | 
			
		||||
	DEFINE(sym, (XMAPPEDREGS_OFS + offsetof(struct mapped_regs, field)))
 | 
			
		||||
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_PSR_I_ADDR_OFS, interrupt_mask_addr);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_IPSR_OFS, ipsr);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_IIP_OFS, iip);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_IFS_OFS, ifs);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_PRECOVER_IFS_OFS, precover_ifs);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_ISR_OFS, isr);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_IFA_OFS, ifa);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_IIPA_OFS, iipa);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_IIM_OFS, iim);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_IHA_OFS, iha);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_ITIR_OFS, itir);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_PSR_IC_OFS, interrupt_collection_enabled);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_BANKNUM_OFS, banknum);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_BANK0_R16_OFS, bank0_regs[0]);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_BANK1_R16_OFS, bank1_regs[0]);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_B0NATS_OFS, vbnat);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_B1NATS_OFS, vnat);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_ITC_OFFSET_OFS, itc_offset);
 | 
			
		||||
	DEFINE_MAPPED_REG_OFS(XSI_ITC_LAST_OFS, itc_last);
 | 
			
		||||
#endif /* CONFIG_XEN */
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -416,8 +416,6 @@ start_ap:
 | 
			
		|||
 | 
			
		||||
default_setup_hook = 0		// Currently nothing needs to be done.
 | 
			
		||||
 | 
			
		||||
	.weak xen_setup_hook
 | 
			
		||||
 | 
			
		||||
	.global hypervisor_type
 | 
			
		||||
hypervisor_type:
 | 
			
		||||
	data8		PARAVIRT_HYPERVISOR_TYPE_DEFAULT
 | 
			
		||||
| 
						 | 
				
			
			@ -426,7 +424,6 @@ hypervisor_type:
 | 
			
		|||
 | 
			
		||||
hypervisor_setup_hooks:
 | 
			
		||||
	data8		default_setup_hook
 | 
			
		||||
	data8		xen_setup_hook
 | 
			
		||||
num_hypervisor_hooks = (. - hypervisor_setup_hooks) / 8
 | 
			
		||||
	.previous
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,15 +10,11 @@
 | 
			
		|||
#include <linux/kbuild.h>
 | 
			
		||||
#include <linux/threads.h>
 | 
			
		||||
#include <asm/native/irq.h>
 | 
			
		||||
#include <asm/xen/irq.h>
 | 
			
		||||
 | 
			
		||||
void foo(void)
 | 
			
		||||
{
 | 
			
		||||
	union paravirt_nr_irqs_max {
 | 
			
		||||
		char ia64_native_nr_irqs[IA64_NATIVE_NR_IRQS];
 | 
			
		||||
#ifdef CONFIG_XEN
 | 
			
		||||
		char xen_nr_irqs[XEN_NR_IRQS];
 | 
			
		||||
#endif
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	DEFINE(NR_IRQS, sizeof (union paravirt_nr_irqs_max));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,9 +22,6 @@
 | 
			
		|||
 | 
			
		||||
#ifdef __IA64_ASM_PARAVIRTUALIZED_PVCHECK
 | 
			
		||||
#include <asm/native/pvchk_inst.h>
 | 
			
		||||
#elif defined(__IA64_ASM_PARAVIRTUALIZED_XEN)
 | 
			
		||||
#include <asm/xen/inst.h>
 | 
			
		||||
#include <asm/xen/minstate.h>
 | 
			
		||||
#else
 | 
			
		||||
#include <asm/native/inst.h>
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,9 +20,5 @@
 | 
			
		|||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if defined(__IA64_GATE_PARAVIRTUALIZED_XEN)
 | 
			
		||||
#include <asm/xen/patchlist.h>
 | 
			
		||||
#else
 | 
			
		||||
#include <asm/native/patchlist.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -182,12 +182,6 @@ SECTIONS {
 | 
			
		|||
		__start_gate_section = .;
 | 
			
		||||
		*(.data..gate)
 | 
			
		||||
		__stop_gate_section = .;
 | 
			
		||||
#ifdef CONFIG_XEN
 | 
			
		||||
		. = ALIGN(PAGE_SIZE);
 | 
			
		||||
		__xen_start_gate_section = .;
 | 
			
		||||
		*(.data..gate.xen)
 | 
			
		||||
		__xen_stop_gate_section = .;
 | 
			
		||||
#endif
 | 
			
		||||
	}
 | 
			
		||||
	/*
 | 
			
		||||
	 * make sure the gate page doesn't expose
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,25 +0,0 @@
 | 
			
		|||
#
 | 
			
		||||
# This Kconfig describes xen/ia64 options
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
config XEN
 | 
			
		||||
	bool "Xen hypervisor support"
 | 
			
		||||
	default y
 | 
			
		||||
	depends on PARAVIRT && MCKINLEY && IA64_PAGE_SIZE_16KB
 | 
			
		||||
	select XEN_XENCOMM
 | 
			
		||||
	select NO_IDLE_HZ
 | 
			
		||||
	# followings are required to save/restore.
 | 
			
		||||
	select ARCH_SUSPEND_POSSIBLE
 | 
			
		||||
	select SUSPEND
 | 
			
		||||
	select PM_SLEEP
 | 
			
		||||
	help
 | 
			
		||||
	  Enable Xen hypervisor support.  Resulting kernel runs
 | 
			
		||||
	  both as a guest OS on Xen and natively on hardware.
 | 
			
		||||
 | 
			
		||||
config XEN_XENCOMM
 | 
			
		||||
	depends on XEN
 | 
			
		||||
	bool
 | 
			
		||||
 | 
			
		||||
config NO_IDLE_HZ
 | 
			
		||||
	depends on XEN
 | 
			
		||||
	bool
 | 
			
		||||
| 
						 | 
				
			
			@ -1,37 +0,0 @@
 | 
			
		|||
#
 | 
			
		||||
# Makefile for Xen components
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
obj-y := hypercall.o xenivt.o xensetup.o xen_pv_ops.o irq_xen.o \
 | 
			
		||||
	 hypervisor.o xencomm.o xcom_hcall.o grant-table.o time.o suspend.o \
 | 
			
		||||
	 gate-data.o
 | 
			
		||||
 | 
			
		||||
obj-$(CONFIG_IA64_GENERIC) += machvec.o
 | 
			
		||||
 | 
			
		||||
# The gate DSO image is built using a special linker script.
 | 
			
		||||
include $(srctree)/arch/ia64/kernel/Makefile.gate
 | 
			
		||||
 | 
			
		||||
# tell compiled for xen
 | 
			
		||||
CPPFLAGS_gate.lds += -D__IA64_GATE_PARAVIRTUALIZED_XEN
 | 
			
		||||
AFLAGS_gate.o += -D__IA64_ASM_PARAVIRTUALIZED_XEN -D__IA64_GATE_PARAVIRTUALIZED_XEN
 | 
			
		||||
 | 
			
		||||
# use same file of native.
 | 
			
		||||
$(obj)/gate.o: $(src)/../kernel/gate.S FORCE
 | 
			
		||||
	$(call if_changed_dep,as_o_S)
 | 
			
		||||
$(obj)/gate.lds: $(src)/../kernel/gate.lds.S FORCE
 | 
			
		||||
	$(call if_changed_dep,cpp_lds_S)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
AFLAGS_xenivt.o += -D__IA64_ASM_PARAVIRTUALIZED_XEN
 | 
			
		||||
 | 
			
		||||
# xen multi compile
 | 
			
		||||
ASM_PARAVIRT_MULTI_COMPILE_SRCS = ivt.S entry.S fsys.S
 | 
			
		||||
ASM_PARAVIRT_OBJS = $(addprefix xen-,$(ASM_PARAVIRT_MULTI_COMPILE_SRCS:.S=.o))
 | 
			
		||||
obj-y += $(ASM_PARAVIRT_OBJS)
 | 
			
		||||
define paravirtualized_xen
 | 
			
		||||
AFLAGS_$(1) += -D__IA64_ASM_PARAVIRTUALIZED_XEN
 | 
			
		||||
endef
 | 
			
		||||
$(foreach o,$(ASM_PARAVIRT_OBJS),$(eval $(call paravirtualized_xen,$(o))))
 | 
			
		||||
 | 
			
		||||
$(obj)/xen-%.o: $(src)/../kernel/%.S FORCE
 | 
			
		||||
	$(call if_changed_dep,as_o_S)
 | 
			
		||||
| 
						 | 
				
			
			@ -1,3 +0,0 @@
 | 
			
		|||
	.section .data..gate.xen, "aw"
 | 
			
		||||
 | 
			
		||||
	.incbin "arch/ia64/xen/gate.so"
 | 
			
		||||
| 
						 | 
				
			
			@ -1,94 +0,0 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
 * arch/ia64/xen/grant-table.c
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *                    VA Linux Systems Japan K.K.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/module.h>
 | 
			
		||||
#include <linux/vmalloc.h>
 | 
			
		||||
#include <linux/slab.h>
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
 | 
			
		||||
#include <xen/interface/xen.h>
 | 
			
		||||
#include <xen/interface/memory.h>
 | 
			
		||||
#include <xen/grant_table.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/xen/hypervisor.h>
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * grant table hack
 | 
			
		||||
 * cmd: GNTTABOP_xxx
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int arch_gnttab_map_shared(unsigned long *frames, unsigned long nr_gframes,
 | 
			
		||||
			   unsigned long max_nr_gframes,
 | 
			
		||||
			   struct grant_entry **__shared)
 | 
			
		||||
{
 | 
			
		||||
	*__shared = __va(frames[0] << PAGE_SHIFT);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void arch_gnttab_unmap_shared(struct grant_entry *shared,
 | 
			
		||||
			      unsigned long nr_gframes)
 | 
			
		||||
{
 | 
			
		||||
	/* nothing */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
gnttab_map_grant_ref_pre(struct gnttab_map_grant_ref *uop)
 | 
			
		||||
{
 | 
			
		||||
	uint32_t flags;
 | 
			
		||||
 | 
			
		||||
	flags = uop->flags;
 | 
			
		||||
 | 
			
		||||
	if (flags & GNTMAP_host_map) {
 | 
			
		||||
		if (flags & GNTMAP_application_map) {
 | 
			
		||||
			printk(KERN_DEBUG
 | 
			
		||||
			       "GNTMAP_application_map is not supported yet: "
 | 
			
		||||
			       "flags 0x%x\n", flags);
 | 
			
		||||
			BUG();
 | 
			
		||||
		}
 | 
			
		||||
		if (flags & GNTMAP_contains_pte) {
 | 
			
		||||
			printk(KERN_DEBUG
 | 
			
		||||
			       "GNTMAP_contains_pte is not supported yet: "
 | 
			
		||||
			       "flags 0x%x\n", flags);
 | 
			
		||||
			BUG();
 | 
			
		||||
		}
 | 
			
		||||
	} else if (flags & GNTMAP_device_map) {
 | 
			
		||||
		printk("GNTMAP_device_map is not supported yet 0x%x\n", flags);
 | 
			
		||||
		BUG();	/* not yet. actually this flag is not used. */
 | 
			
		||||
	} else {
 | 
			
		||||
		BUG();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count)
 | 
			
		||||
{
 | 
			
		||||
	if (cmd == GNTTABOP_map_grant_ref) {
 | 
			
		||||
		unsigned int i;
 | 
			
		||||
		for (i = 0; i < count; i++) {
 | 
			
		||||
			gnttab_map_grant_ref_pre(
 | 
			
		||||
				(struct gnttab_map_grant_ref *)uop + i);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return xencomm_hypercall_grant_table_op(cmd, uop, count);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EXPORT_SYMBOL(HYPERVISOR_grant_table_op);
 | 
			
		||||
| 
						 | 
				
			
			@ -1,88 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Support routines for Xen hypercalls
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2005 Dan Magenheimer <dan.magenheimer@hp.com>
 | 
			
		||||
 * Copyright (C) 2008 Yaozu (Eddie) Dong <eddie.dong@intel.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <asm/asmmacro.h>
 | 
			
		||||
#include <asm/intrinsics.h>
 | 
			
		||||
#include <asm/xen/privop.h>
 | 
			
		||||
 | 
			
		||||
#ifdef __INTEL_COMPILER
 | 
			
		||||
/*
 | 
			
		||||
 * Hypercalls without parameter.
 | 
			
		||||
 */
 | 
			
		||||
#define __HCALL0(name,hcall)		\
 | 
			
		||||
	GLOBAL_ENTRY(name);		\
 | 
			
		||||
	break	hcall;			\
 | 
			
		||||
	br.ret.sptk.many rp;		\
 | 
			
		||||
	END(name)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Hypercalls with 1 parameter.
 | 
			
		||||
 */
 | 
			
		||||
#define __HCALL1(name,hcall)		\
 | 
			
		||||
	GLOBAL_ENTRY(name);		\
 | 
			
		||||
	mov r8=r32;			\
 | 
			
		||||
	break	hcall;			\
 | 
			
		||||
	br.ret.sptk.many rp;		\
 | 
			
		||||
	END(name)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Hypercalls with 2 parameters.
 | 
			
		||||
 */
 | 
			
		||||
#define __HCALL2(name,hcall)		\
 | 
			
		||||
	GLOBAL_ENTRY(name);		\
 | 
			
		||||
	mov r8=r32;			\
 | 
			
		||||
	mov r9=r33;			\
 | 
			
		||||
	break	hcall;			\
 | 
			
		||||
	br.ret.sptk.many rp;		\
 | 
			
		||||
	END(name)
 | 
			
		||||
 | 
			
		||||
__HCALL0(xen_get_psr, HYPERPRIVOP_GET_PSR)
 | 
			
		||||
__HCALL0(xen_get_ivr, HYPERPRIVOP_GET_IVR)
 | 
			
		||||
__HCALL0(xen_get_tpr, HYPERPRIVOP_GET_TPR)
 | 
			
		||||
__HCALL0(xen_hyper_ssm_i, HYPERPRIVOP_SSM_I)
 | 
			
		||||
 | 
			
		||||
__HCALL1(xen_set_tpr, HYPERPRIVOP_SET_TPR)
 | 
			
		||||
__HCALL1(xen_eoi, HYPERPRIVOP_EOI)
 | 
			
		||||
__HCALL1(xen_thash, HYPERPRIVOP_THASH)
 | 
			
		||||
__HCALL1(xen_set_itm, HYPERPRIVOP_SET_ITM)
 | 
			
		||||
__HCALL1(xen_get_rr, HYPERPRIVOP_GET_RR)
 | 
			
		||||
__HCALL1(xen_fc, HYPERPRIVOP_FC)
 | 
			
		||||
__HCALL1(xen_get_cpuid, HYPERPRIVOP_GET_CPUID)
 | 
			
		||||
__HCALL1(xen_get_pmd, HYPERPRIVOP_GET_PMD)
 | 
			
		||||
 | 
			
		||||
__HCALL2(xen_ptcga, HYPERPRIVOP_PTC_GA)
 | 
			
		||||
__HCALL2(xen_set_rr, HYPERPRIVOP_SET_RR)
 | 
			
		||||
__HCALL2(xen_set_kr, HYPERPRIVOP_SET_KR)
 | 
			
		||||
 | 
			
		||||
GLOBAL_ENTRY(xen_set_rr0_to_rr4)
 | 
			
		||||
	mov r8=r32
 | 
			
		||||
	mov r9=r33
 | 
			
		||||
	mov r10=r34
 | 
			
		||||
	mov r11=r35
 | 
			
		||||
	mov r14=r36
 | 
			
		||||
	XEN_HYPER_SET_RR0_TO_RR4
 | 
			
		||||
	br.ret.sptk.many rp
 | 
			
		||||
	;;
 | 
			
		||||
END(xen_set_rr0_to_rr4)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
GLOBAL_ENTRY(xen_send_ipi)
 | 
			
		||||
	mov r14=r32
 | 
			
		||||
	mov r15=r33
 | 
			
		||||
	mov r2=0x400
 | 
			
		||||
	break 0x1000
 | 
			
		||||
	;;
 | 
			
		||||
	br.ret.sptk.many rp
 | 
			
		||||
	;;
 | 
			
		||||
END(xen_send_ipi)
 | 
			
		||||
 | 
			
		||||
GLOBAL_ENTRY(__hypercall)
 | 
			
		||||
	mov r2=r37
 | 
			
		||||
	break 0x1000
 | 
			
		||||
	br.ret.sptk.many b0
 | 
			
		||||
	;;
 | 
			
		||||
END(__hypercall)
 | 
			
		||||
| 
						 | 
				
			
			@ -1,97 +0,0 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
 * arch/ia64/xen/hypervisor.c
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *                    VA Linux Systems Japan K.K.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/efi.h>
 | 
			
		||||
#include <linux/export.h>
 | 
			
		||||
#include <asm/xen/hypervisor.h>
 | 
			
		||||
#include <asm/xen/privop.h>
 | 
			
		||||
 | 
			
		||||
#include "irq_xen.h"
 | 
			
		||||
 | 
			
		||||
struct shared_info *HYPERVISOR_shared_info __read_mostly =
 | 
			
		||||
	(struct shared_info *)XSI_BASE;
 | 
			
		||||
EXPORT_SYMBOL(HYPERVISOR_shared_info);
 | 
			
		||||
 | 
			
		||||
DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu);
 | 
			
		||||
 | 
			
		||||
struct start_info *xen_start_info;
 | 
			
		||||
EXPORT_SYMBOL(xen_start_info);
 | 
			
		||||
 | 
			
		||||
EXPORT_SYMBOL(xen_domain_type);
 | 
			
		||||
 | 
			
		||||
EXPORT_SYMBOL(__hypercall);
 | 
			
		||||
 | 
			
		||||
/* Stolen from arch/x86/xen/enlighten.c */
 | 
			
		||||
/*
 | 
			
		||||
 * Flag to determine whether vcpu info placement is available on all
 | 
			
		||||
 * VCPUs.  We assume it is to start with, and then set it to zero on
 | 
			
		||||
 * the first failure.  This is because it can succeed on some VCPUs
 | 
			
		||||
 * and not others, since it can involve hypervisor memory allocation,
 | 
			
		||||
 * or because the guest failed to guarantee all the appropriate
 | 
			
		||||
 * constraints on all VCPUs (ie buffer can't cross a page boundary).
 | 
			
		||||
 *
 | 
			
		||||
 * Note that any particular CPU may be using a placed vcpu structure,
 | 
			
		||||
 * but we can only optimise if the all are.
 | 
			
		||||
 *
 | 
			
		||||
 * 0: not available, 1: available
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static void __init xen_vcpu_setup(int cpu)
 | 
			
		||||
{
 | 
			
		||||
	/*
 | 
			
		||||
	 * WARNING:
 | 
			
		||||
	 * before changing MAX_VIRT_CPUS,
 | 
			
		||||
	 * check that shared_info fits on a page
 | 
			
		||||
	 */
 | 
			
		||||
	BUILD_BUG_ON(sizeof(struct shared_info) > PAGE_SIZE);
 | 
			
		||||
	per_cpu(xen_vcpu, cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void __init xen_setup_vcpu_info_placement(void)
 | 
			
		||||
{
 | 
			
		||||
	int cpu;
 | 
			
		||||
 | 
			
		||||
	for_each_possible_cpu(cpu)
 | 
			
		||||
		xen_vcpu_setup(cpu);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
xen_cpu_init(void)
 | 
			
		||||
{
 | 
			
		||||
	xen_smp_intr_init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**************************************************************************
 | 
			
		||||
 * opt feature
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
xen_ia64_enable_opt_feature(void)
 | 
			
		||||
{
 | 
			
		||||
	/* Enable region 7 identity map optimizations in Xen */
 | 
			
		||||
	struct xen_ia64_opt_feature optf;
 | 
			
		||||
 | 
			
		||||
	optf.cmd = XEN_IA64_OPTF_IDENT_MAP_REG7;
 | 
			
		||||
	optf.on = XEN_IA64_OPTF_ON;
 | 
			
		||||
	optf.pgprot = pgprot_val(PAGE_KERNEL);
 | 
			
		||||
	optf.key = 0;	/* No key on linux. */
 | 
			
		||||
	HYPERVISOR_opt_feature(&optf);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,443 +0,0 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
 * arch/ia64/xen/irq_xen.c
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *                    VA Linux Systems Japan K.K.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/cpu.h>
 | 
			
		||||
 | 
			
		||||
#include <xen/interface/xen.h>
 | 
			
		||||
#include <xen/interface/callback.h>
 | 
			
		||||
#include <xen/events.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/xen/privop.h>
 | 
			
		||||
 | 
			
		||||
#include "irq_xen.h"
 | 
			
		||||
 | 
			
		||||
/***************************************************************************
 | 
			
		||||
 * pv_irq_ops
 | 
			
		||||
 * irq operations
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
xen_assign_irq_vector(int irq)
 | 
			
		||||
{
 | 
			
		||||
	struct physdev_irq irq_op;
 | 
			
		||||
 | 
			
		||||
	irq_op.irq = irq;
 | 
			
		||||
	if (HYPERVISOR_physdev_op(PHYSDEVOP_alloc_irq_vector, &irq_op))
 | 
			
		||||
		return -ENOSPC;
 | 
			
		||||
 | 
			
		||||
	return irq_op.vector;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
xen_free_irq_vector(int vector)
 | 
			
		||||
{
 | 
			
		||||
	struct physdev_irq irq_op;
 | 
			
		||||
 | 
			
		||||
	if (vector < IA64_FIRST_DEVICE_VECTOR ||
 | 
			
		||||
	    vector > IA64_LAST_DEVICE_VECTOR)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	irq_op.vector = vector;
 | 
			
		||||
	if (HYPERVISOR_physdev_op(PHYSDEVOP_free_irq_vector, &irq_op))
 | 
			
		||||
		printk(KERN_WARNING "%s: xen_free_irq_vector fail vector=%d\n",
 | 
			
		||||
		       __func__, vector);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static DEFINE_PER_CPU(int, xen_timer_irq) = -1;
 | 
			
		||||
static DEFINE_PER_CPU(int, xen_ipi_irq) = -1;
 | 
			
		||||
static DEFINE_PER_CPU(int, xen_resched_irq) = -1;
 | 
			
		||||
static DEFINE_PER_CPU(int, xen_cmc_irq) = -1;
 | 
			
		||||
static DEFINE_PER_CPU(int, xen_cmcp_irq) = -1;
 | 
			
		||||
static DEFINE_PER_CPU(int, xen_cpep_irq) = -1;
 | 
			
		||||
#define NAME_SIZE	15
 | 
			
		||||
static DEFINE_PER_CPU(char[NAME_SIZE], xen_timer_name);
 | 
			
		||||
static DEFINE_PER_CPU(char[NAME_SIZE], xen_ipi_name);
 | 
			
		||||
static DEFINE_PER_CPU(char[NAME_SIZE], xen_resched_name);
 | 
			
		||||
static DEFINE_PER_CPU(char[NAME_SIZE], xen_cmc_name);
 | 
			
		||||
static DEFINE_PER_CPU(char[NAME_SIZE], xen_cmcp_name);
 | 
			
		||||
static DEFINE_PER_CPU(char[NAME_SIZE], xen_cpep_name);
 | 
			
		||||
#undef NAME_SIZE
 | 
			
		||||
 | 
			
		||||
struct saved_irq {
 | 
			
		||||
	unsigned int irq;
 | 
			
		||||
	struct irqaction *action;
 | 
			
		||||
};
 | 
			
		||||
/* 16 should be far optimistic value, since only several percpu irqs
 | 
			
		||||
 * are registered early.
 | 
			
		||||
 */
 | 
			
		||||
#define MAX_LATE_IRQ	16
 | 
			
		||||
static struct saved_irq saved_percpu_irqs[MAX_LATE_IRQ];
 | 
			
		||||
static unsigned short late_irq_cnt;
 | 
			
		||||
static unsigned short saved_irq_cnt;
 | 
			
		||||
static int xen_slab_ready;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_SMP
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
 | 
			
		||||
/* Dummy stub. Though we may check XEN_RESCHEDULE_VECTOR before __do_IRQ,
 | 
			
		||||
 * it ends up to issue several memory accesses upon percpu data and
 | 
			
		||||
 * thus adds unnecessary traffic to other paths.
 | 
			
		||||
 */
 | 
			
		||||
static irqreturn_t
 | 
			
		||||
xen_dummy_handler(int irq, void *dev_id)
 | 
			
		||||
{
 | 
			
		||||
	return IRQ_HANDLED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static irqreturn_t
 | 
			
		||||
xen_resched_handler(int irq, void *dev_id)
 | 
			
		||||
{
 | 
			
		||||
	scheduler_ipi();
 | 
			
		||||
	return IRQ_HANDLED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct irqaction xen_ipi_irqaction = {
 | 
			
		||||
	.handler =	handle_IPI,
 | 
			
		||||
	.flags =	IRQF_DISABLED,
 | 
			
		||||
	.name =		"IPI"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct irqaction xen_resched_irqaction = {
 | 
			
		||||
	.handler =	xen_resched_handler,
 | 
			
		||||
	.flags =	IRQF_DISABLED,
 | 
			
		||||
	.name =		"resched"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct irqaction xen_tlb_irqaction = {
 | 
			
		||||
	.handler =	xen_dummy_handler,
 | 
			
		||||
	.flags =	IRQF_DISABLED,
 | 
			
		||||
	.name =		"tlb_flush"
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This is xen version percpu irq registration, which needs bind
 | 
			
		||||
 * to xen specific evtchn sub-system. One trick here is that xen
 | 
			
		||||
 * evtchn binding interface depends on kmalloc because related
 | 
			
		||||
 * port needs to be freed at device/cpu down. So we cache the
 | 
			
		||||
 * registration on BSP before slab is ready and then deal them
 | 
			
		||||
 * at later point. For rest instances happening after slab ready,
 | 
			
		||||
 * we hook them to xen evtchn immediately.
 | 
			
		||||
 *
 | 
			
		||||
 * FIXME: MCA is not supported by far, and thus "nomca" boot param is
 | 
			
		||||
 * required.
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
__xen_register_percpu_irq(unsigned int cpu, unsigned int vec,
 | 
			
		||||
			struct irqaction *action, int save)
 | 
			
		||||
{
 | 
			
		||||
	int irq = 0;
 | 
			
		||||
 | 
			
		||||
	if (xen_slab_ready) {
 | 
			
		||||
		switch (vec) {
 | 
			
		||||
		case IA64_TIMER_VECTOR:
 | 
			
		||||
			snprintf(per_cpu(xen_timer_name, cpu),
 | 
			
		||||
				 sizeof(per_cpu(xen_timer_name, cpu)),
 | 
			
		||||
				 "%s%d", action->name, cpu);
 | 
			
		||||
			irq = bind_virq_to_irqhandler(VIRQ_ITC, cpu,
 | 
			
		||||
				action->handler, action->flags,
 | 
			
		||||
				per_cpu(xen_timer_name, cpu), action->dev_id);
 | 
			
		||||
			per_cpu(xen_timer_irq, cpu) = irq;
 | 
			
		||||
			break;
 | 
			
		||||
		case IA64_IPI_RESCHEDULE:
 | 
			
		||||
			snprintf(per_cpu(xen_resched_name, cpu),
 | 
			
		||||
				 sizeof(per_cpu(xen_resched_name, cpu)),
 | 
			
		||||
				 "%s%d", action->name, cpu);
 | 
			
		||||
			irq = bind_ipi_to_irqhandler(XEN_RESCHEDULE_VECTOR, cpu,
 | 
			
		||||
				action->handler, action->flags,
 | 
			
		||||
				per_cpu(xen_resched_name, cpu), action->dev_id);
 | 
			
		||||
			per_cpu(xen_resched_irq, cpu) = irq;
 | 
			
		||||
			break;
 | 
			
		||||
		case IA64_IPI_VECTOR:
 | 
			
		||||
			snprintf(per_cpu(xen_ipi_name, cpu),
 | 
			
		||||
				 sizeof(per_cpu(xen_ipi_name, cpu)),
 | 
			
		||||
				 "%s%d", action->name, cpu);
 | 
			
		||||
			irq = bind_ipi_to_irqhandler(XEN_IPI_VECTOR, cpu,
 | 
			
		||||
				action->handler, action->flags,
 | 
			
		||||
				per_cpu(xen_ipi_name, cpu), action->dev_id);
 | 
			
		||||
			per_cpu(xen_ipi_irq, cpu) = irq;
 | 
			
		||||
			break;
 | 
			
		||||
		case IA64_CMC_VECTOR:
 | 
			
		||||
			snprintf(per_cpu(xen_cmc_name, cpu),
 | 
			
		||||
				 sizeof(per_cpu(xen_cmc_name, cpu)),
 | 
			
		||||
				 "%s%d", action->name, cpu);
 | 
			
		||||
			irq = bind_virq_to_irqhandler(VIRQ_MCA_CMC, cpu,
 | 
			
		||||
						action->handler,
 | 
			
		||||
						action->flags,
 | 
			
		||||
						per_cpu(xen_cmc_name, cpu),
 | 
			
		||||
						action->dev_id);
 | 
			
		||||
			per_cpu(xen_cmc_irq, cpu) = irq;
 | 
			
		||||
			break;
 | 
			
		||||
		case IA64_CMCP_VECTOR:
 | 
			
		||||
			snprintf(per_cpu(xen_cmcp_name, cpu),
 | 
			
		||||
				 sizeof(per_cpu(xen_cmcp_name, cpu)),
 | 
			
		||||
				 "%s%d", action->name, cpu);
 | 
			
		||||
			irq = bind_ipi_to_irqhandler(XEN_CMCP_VECTOR, cpu,
 | 
			
		||||
						action->handler,
 | 
			
		||||
						action->flags,
 | 
			
		||||
						per_cpu(xen_cmcp_name, cpu),
 | 
			
		||||
						action->dev_id);
 | 
			
		||||
			per_cpu(xen_cmcp_irq, cpu) = irq;
 | 
			
		||||
			break;
 | 
			
		||||
		case IA64_CPEP_VECTOR:
 | 
			
		||||
			snprintf(per_cpu(xen_cpep_name, cpu),
 | 
			
		||||
				 sizeof(per_cpu(xen_cpep_name, cpu)),
 | 
			
		||||
				 "%s%d", action->name, cpu);
 | 
			
		||||
			irq = bind_ipi_to_irqhandler(XEN_CPEP_VECTOR, cpu,
 | 
			
		||||
						action->handler,
 | 
			
		||||
						action->flags,
 | 
			
		||||
						per_cpu(xen_cpep_name, cpu),
 | 
			
		||||
						action->dev_id);
 | 
			
		||||
			per_cpu(xen_cpep_irq, cpu) = irq;
 | 
			
		||||
			break;
 | 
			
		||||
		case IA64_CPE_VECTOR:
 | 
			
		||||
		case IA64_MCA_RENDEZ_VECTOR:
 | 
			
		||||
		case IA64_PERFMON_VECTOR:
 | 
			
		||||
		case IA64_MCA_WAKEUP_VECTOR:
 | 
			
		||||
		case IA64_SPURIOUS_INT_VECTOR:
 | 
			
		||||
			/* No need to complain, these aren't supported. */
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			printk(KERN_WARNING "Percpu irq %d is unsupported "
 | 
			
		||||
			       "by xen!\n", vec);
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		BUG_ON(irq < 0);
 | 
			
		||||
 | 
			
		||||
		if (irq > 0) {
 | 
			
		||||
			/*
 | 
			
		||||
			 * Mark percpu.  Without this, migrate_irqs() will
 | 
			
		||||
			 * mark the interrupt for migrations and trigger it
 | 
			
		||||
			 * on cpu hotplug.
 | 
			
		||||
			 */
 | 
			
		||||
			irq_set_status_flags(irq, IRQ_PER_CPU);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* For BSP, we cache registered percpu irqs, and then re-walk
 | 
			
		||||
	 * them when initializing APs
 | 
			
		||||
	 */
 | 
			
		||||
	if (!cpu && save) {
 | 
			
		||||
		BUG_ON(saved_irq_cnt == MAX_LATE_IRQ);
 | 
			
		||||
		saved_percpu_irqs[saved_irq_cnt].irq = vec;
 | 
			
		||||
		saved_percpu_irqs[saved_irq_cnt].action = action;
 | 
			
		||||
		saved_irq_cnt++;
 | 
			
		||||
		if (!xen_slab_ready)
 | 
			
		||||
			late_irq_cnt++;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
xen_register_percpu_irq(ia64_vector vec, struct irqaction *action)
 | 
			
		||||
{
 | 
			
		||||
	__xen_register_percpu_irq(smp_processor_id(), vec, action, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
xen_bind_early_percpu_irq(void)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	xen_slab_ready = 1;
 | 
			
		||||
	/* There's no race when accessing this cached array, since only
 | 
			
		||||
	 * BSP will face with such step shortly
 | 
			
		||||
	 */
 | 
			
		||||
	for (i = 0; i < late_irq_cnt; i++)
 | 
			
		||||
		__xen_register_percpu_irq(smp_processor_id(),
 | 
			
		||||
					  saved_percpu_irqs[i].irq,
 | 
			
		||||
					  saved_percpu_irqs[i].action, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* FIXME: There's no obvious point to check whether slab is ready. So
 | 
			
		||||
 * a hack is used here by utilizing a late time hook.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_HOTPLUG_CPU
 | 
			
		||||
static int unbind_evtchn_callback(struct notifier_block *nfb,
 | 
			
		||||
				  unsigned long action, void *hcpu)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int cpu = (unsigned long)hcpu;
 | 
			
		||||
 | 
			
		||||
	if (action == CPU_DEAD) {
 | 
			
		||||
		/* Unregister evtchn.  */
 | 
			
		||||
		if (per_cpu(xen_cpep_irq, cpu) >= 0) {
 | 
			
		||||
			unbind_from_irqhandler(per_cpu(xen_cpep_irq, cpu),
 | 
			
		||||
					       NULL);
 | 
			
		||||
			per_cpu(xen_cpep_irq, cpu) = -1;
 | 
			
		||||
		}
 | 
			
		||||
		if (per_cpu(xen_cmcp_irq, cpu) >= 0) {
 | 
			
		||||
			unbind_from_irqhandler(per_cpu(xen_cmcp_irq, cpu),
 | 
			
		||||
					       NULL);
 | 
			
		||||
			per_cpu(xen_cmcp_irq, cpu) = -1;
 | 
			
		||||
		}
 | 
			
		||||
		if (per_cpu(xen_cmc_irq, cpu) >= 0) {
 | 
			
		||||
			unbind_from_irqhandler(per_cpu(xen_cmc_irq, cpu), NULL);
 | 
			
		||||
			per_cpu(xen_cmc_irq, cpu) = -1;
 | 
			
		||||
		}
 | 
			
		||||
		if (per_cpu(xen_ipi_irq, cpu) >= 0) {
 | 
			
		||||
			unbind_from_irqhandler(per_cpu(xen_ipi_irq, cpu), NULL);
 | 
			
		||||
			per_cpu(xen_ipi_irq, cpu) = -1;
 | 
			
		||||
		}
 | 
			
		||||
		if (per_cpu(xen_resched_irq, cpu) >= 0) {
 | 
			
		||||
			unbind_from_irqhandler(per_cpu(xen_resched_irq, cpu),
 | 
			
		||||
					       NULL);
 | 
			
		||||
			per_cpu(xen_resched_irq, cpu) = -1;
 | 
			
		||||
		}
 | 
			
		||||
		if (per_cpu(xen_timer_irq, cpu) >= 0) {
 | 
			
		||||
			unbind_from_irqhandler(per_cpu(xen_timer_irq, cpu),
 | 
			
		||||
					       NULL);
 | 
			
		||||
			per_cpu(xen_timer_irq, cpu) = -1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return NOTIFY_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct notifier_block unbind_evtchn_notifier = {
 | 
			
		||||
	.notifier_call = unbind_evtchn_callback,
 | 
			
		||||
	.priority = 0
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void xen_smp_intr_init_early(unsigned int cpu)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SMP
 | 
			
		||||
	unsigned int i;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < saved_irq_cnt; i++)
 | 
			
		||||
		__xen_register_percpu_irq(cpu, saved_percpu_irqs[i].irq,
 | 
			
		||||
					  saved_percpu_irqs[i].action, 0);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void xen_smp_intr_init(void)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SMP
 | 
			
		||||
	unsigned int cpu = smp_processor_id();
 | 
			
		||||
	struct callback_register event = {
 | 
			
		||||
		.type = CALLBACKTYPE_event,
 | 
			
		||||
		.address = { .ip = (unsigned long)&xen_event_callback },
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	if (cpu == 0) {
 | 
			
		||||
		/* Initialization was already done for boot cpu.  */
 | 
			
		||||
#ifdef CONFIG_HOTPLUG_CPU
 | 
			
		||||
		/* Register the notifier only once.  */
 | 
			
		||||
		register_cpu_notifier(&unbind_evtchn_notifier);
 | 
			
		||||
#endif
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* This should be piggyback when setup vcpu guest context */
 | 
			
		||||
	BUG_ON(HYPERVISOR_callback_op(CALLBACKOP_register, &event));
 | 
			
		||||
#endif /* CONFIG_SMP */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void __init
 | 
			
		||||
xen_irq_init(void)
 | 
			
		||||
{
 | 
			
		||||
	struct callback_register event = {
 | 
			
		||||
		.type = CALLBACKTYPE_event,
 | 
			
		||||
		.address = { .ip = (unsigned long)&xen_event_callback },
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	xen_init_IRQ();
 | 
			
		||||
	BUG_ON(HYPERVISOR_callback_op(CALLBACKOP_register, &event));
 | 
			
		||||
	late_time_init = xen_bind_early_percpu_irq;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
xen_platform_send_ipi(int cpu, int vector, int delivery_mode, int redirect)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SMP
 | 
			
		||||
	/* TODO: we need to call vcpu_up here */
 | 
			
		||||
	if (unlikely(vector == ap_wakeup_vector)) {
 | 
			
		||||
		/* XXX
 | 
			
		||||
		 * This should be in __cpu_up(cpu) in ia64 smpboot.c
 | 
			
		||||
		 * like x86. But don't want to modify it,
 | 
			
		||||
		 * keep it untouched.
 | 
			
		||||
		 */
 | 
			
		||||
		xen_smp_intr_init_early(cpu);
 | 
			
		||||
 | 
			
		||||
		xen_send_ipi(cpu, vector);
 | 
			
		||||
		/* vcpu_prepare_and_up(cpu); */
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	switch (vector) {
 | 
			
		||||
	case IA64_IPI_VECTOR:
 | 
			
		||||
		xen_send_IPI_one(cpu, XEN_IPI_VECTOR);
 | 
			
		||||
		break;
 | 
			
		||||
	case IA64_IPI_RESCHEDULE:
 | 
			
		||||
		xen_send_IPI_one(cpu, XEN_RESCHEDULE_VECTOR);
 | 
			
		||||
		break;
 | 
			
		||||
	case IA64_CMCP_VECTOR:
 | 
			
		||||
		xen_send_IPI_one(cpu, XEN_CMCP_VECTOR);
 | 
			
		||||
		break;
 | 
			
		||||
	case IA64_CPEP_VECTOR:
 | 
			
		||||
		xen_send_IPI_one(cpu, XEN_CPEP_VECTOR);
 | 
			
		||||
		break;
 | 
			
		||||
	case IA64_TIMER_VECTOR: {
 | 
			
		||||
		/* this is used only once by check_sal_cache_flush()
 | 
			
		||||
		   at boot time */
 | 
			
		||||
		static int used = 0;
 | 
			
		||||
		if (!used) {
 | 
			
		||||
			xen_send_ipi(cpu, IA64_TIMER_VECTOR);
 | 
			
		||||
			used = 1;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		/* fallthrough */
 | 
			
		||||
	}
 | 
			
		||||
	default:
 | 
			
		||||
		printk(KERN_WARNING "Unsupported IPI type 0x%x\n",
 | 
			
		||||
		       vector);
 | 
			
		||||
		notify_remote_via_irq(0); /* defaults to 0 irq */
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __init
 | 
			
		||||
xen_register_ipi(void)
 | 
			
		||||
{
 | 
			
		||||
#ifdef CONFIG_SMP
 | 
			
		||||
	register_percpu_irq(IA64_IPI_VECTOR, &xen_ipi_irqaction);
 | 
			
		||||
	register_percpu_irq(IA64_IPI_RESCHEDULE, &xen_resched_irqaction);
 | 
			
		||||
	register_percpu_irq(IA64_IPI_LOCAL_TLB_FLUSH, &xen_tlb_irqaction);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
xen_resend_irq(unsigned int vector)
 | 
			
		||||
{
 | 
			
		||||
	(void)resend_irq_on_evtchn(vector);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const struct pv_irq_ops xen_irq_ops __initconst = {
 | 
			
		||||
	.register_ipi = xen_register_ipi,
 | 
			
		||||
 | 
			
		||||
	.assign_irq_vector = xen_assign_irq_vector,
 | 
			
		||||
	.free_irq_vector = xen_free_irq_vector,
 | 
			
		||||
	.register_percpu_irq = xen_register_percpu_irq,
 | 
			
		||||
 | 
			
		||||
	.resend_irq = xen_resend_irq,
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -1,34 +0,0 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
 * arch/ia64/xen/irq_xen.h
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *                    VA Linux Systems Japan K.K.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef IRQ_XEN_H
 | 
			
		||||
#define IRQ_XEN_H
 | 
			
		||||
 | 
			
		||||
extern void (*late_time_init)(void);
 | 
			
		||||
extern char xen_event_callback;
 | 
			
		||||
void __init xen_init_IRQ(void);
 | 
			
		||||
 | 
			
		||||
extern const struct pv_irq_ops xen_irq_ops __initconst;
 | 
			
		||||
extern void xen_smp_intr_init(void);
 | 
			
		||||
extern void xen_send_ipi(int cpu, int vec);
 | 
			
		||||
 | 
			
		||||
#endif /* IRQ_XEN_H */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,4 +0,0 @@
 | 
			
		|||
#define MACHVEC_PLATFORM_NAME           xen
 | 
			
		||||
#define MACHVEC_PLATFORM_HEADER         <asm/machvec_xen.h>
 | 
			
		||||
#include <asm/machvec_init.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,59 +0,0 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
 * arch/ia64/xen/suspend.c
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *                    VA Linux Systems Japan K.K.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 * suspend/resume
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <xen/xen-ops.h>
 | 
			
		||||
#include <asm/xen/hypervisor.h>
 | 
			
		||||
#include "time.h"
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
xen_mm_pin_all(void)
 | 
			
		||||
{
 | 
			
		||||
	/* nothing */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
xen_mm_unpin_all(void)
 | 
			
		||||
{
 | 
			
		||||
	/* nothing */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
xen_arch_pre_suspend()
 | 
			
		||||
{
 | 
			
		||||
	/* nothing */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
xen_arch_post_suspend(int suspend_cancelled)
 | 
			
		||||
{
 | 
			
		||||
	if (suspend_cancelled)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	xen_ia64_enable_opt_feature();
 | 
			
		||||
	/* add more if necessary */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void xen_arch_resume(void)
 | 
			
		||||
{
 | 
			
		||||
	xen_timer_resume_on_aps();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,257 +0,0 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
 * arch/ia64/xen/time.c
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *                    VA Linux Systems Japan K.K.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/delay.h>
 | 
			
		||||
#include <linux/kernel_stat.h>
 | 
			
		||||
#include <linux/posix-timers.h>
 | 
			
		||||
#include <linux/irq.h>
 | 
			
		||||
#include <linux/clocksource.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/timex.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/xen/hypervisor.h>
 | 
			
		||||
 | 
			
		||||
#include <xen/interface/vcpu.h>
 | 
			
		||||
 | 
			
		||||
#include "../kernel/fsyscall_gtod_data.h"
 | 
			
		||||
 | 
			
		||||
static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate);
 | 
			
		||||
static DEFINE_PER_CPU(unsigned long, xen_stolen_time);
 | 
			
		||||
static DEFINE_PER_CPU(unsigned long, xen_blocked_time);
 | 
			
		||||
 | 
			
		||||
/* taken from i386/kernel/time-xen.c */
 | 
			
		||||
static void xen_init_missing_ticks_accounting(int cpu)
 | 
			
		||||
{
 | 
			
		||||
	struct vcpu_register_runstate_memory_area area;
 | 
			
		||||
	struct vcpu_runstate_info *runstate = &per_cpu(xen_runstate, cpu);
 | 
			
		||||
	int rc;
 | 
			
		||||
 | 
			
		||||
	memset(runstate, 0, sizeof(*runstate));
 | 
			
		||||
 | 
			
		||||
	area.addr.v = runstate;
 | 
			
		||||
	rc = HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area, cpu,
 | 
			
		||||
				&area);
 | 
			
		||||
	WARN_ON(rc && rc != -ENOSYS);
 | 
			
		||||
 | 
			
		||||
	per_cpu(xen_blocked_time, cpu) = runstate->time[RUNSTATE_blocked];
 | 
			
		||||
	per_cpu(xen_stolen_time, cpu) = runstate->time[RUNSTATE_runnable]
 | 
			
		||||
					    + runstate->time[RUNSTATE_offline];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Runstate accounting
 | 
			
		||||
 */
 | 
			
		||||
/* stolen from arch/x86/xen/time.c */
 | 
			
		||||
static void get_runstate_snapshot(struct vcpu_runstate_info *res)
 | 
			
		||||
{
 | 
			
		||||
	u64 state_time;
 | 
			
		||||
	struct vcpu_runstate_info *state;
 | 
			
		||||
 | 
			
		||||
	BUG_ON(preemptible());
 | 
			
		||||
 | 
			
		||||
	state = &__get_cpu_var(xen_runstate);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * The runstate info is always updated by the hypervisor on
 | 
			
		||||
	 * the current CPU, so there's no need to use anything
 | 
			
		||||
	 * stronger than a compiler barrier when fetching it.
 | 
			
		||||
	 */
 | 
			
		||||
	do {
 | 
			
		||||
		state_time = state->state_entry_time;
 | 
			
		||||
		rmb();
 | 
			
		||||
		*res = *state;
 | 
			
		||||
		rmb();
 | 
			
		||||
	} while (state->state_entry_time != state_time);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define NS_PER_TICK (1000000000LL/HZ)
 | 
			
		||||
 | 
			
		||||
static unsigned long
 | 
			
		||||
consider_steal_time(unsigned long new_itm)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long stolen, blocked;
 | 
			
		||||
	unsigned long delta_itm = 0, stolentick = 0;
 | 
			
		||||
	int cpu = smp_processor_id();
 | 
			
		||||
	struct vcpu_runstate_info runstate;
 | 
			
		||||
	struct task_struct *p = current;
 | 
			
		||||
 | 
			
		||||
	get_runstate_snapshot(&runstate);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Check for vcpu migration effect
 | 
			
		||||
	 * In this case, itc value is reversed.
 | 
			
		||||
	 * This causes huge stolen value.
 | 
			
		||||
	 * This function just checks and reject this effect.
 | 
			
		||||
	 */
 | 
			
		||||
	if (!time_after_eq(runstate.time[RUNSTATE_blocked],
 | 
			
		||||
			   per_cpu(xen_blocked_time, cpu)))
 | 
			
		||||
		blocked = 0;
 | 
			
		||||
 | 
			
		||||
	if (!time_after_eq(runstate.time[RUNSTATE_runnable] +
 | 
			
		||||
			   runstate.time[RUNSTATE_offline],
 | 
			
		||||
			   per_cpu(xen_stolen_time, cpu)))
 | 
			
		||||
		stolen = 0;
 | 
			
		||||
 | 
			
		||||
	if (!time_after(delta_itm + new_itm, ia64_get_itc()))
 | 
			
		||||
		stolentick = ia64_get_itc() - new_itm;
 | 
			
		||||
 | 
			
		||||
	do_div(stolentick, NS_PER_TICK);
 | 
			
		||||
	stolentick++;
 | 
			
		||||
 | 
			
		||||
	do_div(stolen, NS_PER_TICK);
 | 
			
		||||
 | 
			
		||||
	if (stolen > stolentick)
 | 
			
		||||
		stolen = stolentick;
 | 
			
		||||
 | 
			
		||||
	stolentick -= stolen;
 | 
			
		||||
	do_div(blocked, NS_PER_TICK);
 | 
			
		||||
 | 
			
		||||
	if (blocked > stolentick)
 | 
			
		||||
		blocked = stolentick;
 | 
			
		||||
 | 
			
		||||
	if (stolen > 0 || blocked > 0) {
 | 
			
		||||
		account_steal_ticks(stolen);
 | 
			
		||||
		account_idle_ticks(blocked);
 | 
			
		||||
		run_local_timers();
 | 
			
		||||
 | 
			
		||||
		rcu_check_callbacks(cpu, user_mode(get_irq_regs()));
 | 
			
		||||
 | 
			
		||||
		scheduler_tick();
 | 
			
		||||
		run_posix_cpu_timers(p);
 | 
			
		||||
		delta_itm += local_cpu_data->itm_delta * (stolen + blocked);
 | 
			
		||||
 | 
			
		||||
		if (cpu == time_keeper_id)
 | 
			
		||||
			xtime_update(stolen + blocked);
 | 
			
		||||
 | 
			
		||||
		local_cpu_data->itm_next = delta_itm + new_itm;
 | 
			
		||||
 | 
			
		||||
		per_cpu(xen_stolen_time, cpu) += NS_PER_TICK * stolen;
 | 
			
		||||
		per_cpu(xen_blocked_time, cpu) += NS_PER_TICK * blocked;
 | 
			
		||||
	}
 | 
			
		||||
	return delta_itm;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int xen_do_steal_accounting(unsigned long *new_itm)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long delta_itm;
 | 
			
		||||
	delta_itm = consider_steal_time(*new_itm);
 | 
			
		||||
	*new_itm += delta_itm;
 | 
			
		||||
	if (time_after(*new_itm, ia64_get_itc()) && delta_itm)
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void xen_itc_jitter_data_reset(void)
 | 
			
		||||
{
 | 
			
		||||
	u64 lcycle, ret;
 | 
			
		||||
 | 
			
		||||
	do {
 | 
			
		||||
		lcycle = itc_jitter_data.itc_lastcycle;
 | 
			
		||||
		ret = cmpxchg(&itc_jitter_data.itc_lastcycle, lcycle, 0);
 | 
			
		||||
	} while (unlikely(ret != lcycle));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* based on xen_sched_clock() in arch/x86/xen/time.c. */
 | 
			
		||||
/*
 | 
			
		||||
 * This relies on HAVE_UNSTABLE_SCHED_CLOCK. If it can't be defined,
 | 
			
		||||
 * something similar logic should be implemented here.
 | 
			
		||||
 */
 | 
			
		||||
/*
 | 
			
		||||
 * Xen sched_clock implementation.  Returns the number of unstolen
 | 
			
		||||
 * nanoseconds, which is nanoseconds the VCPU spent in RUNNING+BLOCKED
 | 
			
		||||
 * states.
 | 
			
		||||
 */
 | 
			
		||||
static unsigned long long xen_sched_clock(void)
 | 
			
		||||
{
 | 
			
		||||
	struct vcpu_runstate_info runstate;
 | 
			
		||||
 | 
			
		||||
	unsigned long long now;
 | 
			
		||||
	unsigned long long offset;
 | 
			
		||||
	unsigned long long ret;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Ideally sched_clock should be called on a per-cpu basis
 | 
			
		||||
	 * anyway, so preempt should already be disabled, but that's
 | 
			
		||||
	 * not current practice at the moment.
 | 
			
		||||
	 */
 | 
			
		||||
	preempt_disable();
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * both ia64_native_sched_clock() and xen's runstate are
 | 
			
		||||
	 * based on mAR.ITC. So difference of them makes sense.
 | 
			
		||||
	 */
 | 
			
		||||
	now = ia64_native_sched_clock();
 | 
			
		||||
 | 
			
		||||
	get_runstate_snapshot(&runstate);
 | 
			
		||||
 | 
			
		||||
	WARN_ON(runstate.state != RUNSTATE_running);
 | 
			
		||||
 | 
			
		||||
	offset = 0;
 | 
			
		||||
	if (now > runstate.state_entry_time)
 | 
			
		||||
		offset = now - runstate.state_entry_time;
 | 
			
		||||
	ret = runstate.time[RUNSTATE_blocked] +
 | 
			
		||||
		runstate.time[RUNSTATE_running] +
 | 
			
		||||
		offset;
 | 
			
		||||
 | 
			
		||||
	preempt_enable();
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct pv_time_ops xen_time_ops __initdata = {
 | 
			
		||||
	.init_missing_ticks_accounting	= xen_init_missing_ticks_accounting,
 | 
			
		||||
	.do_steal_accounting		= xen_do_steal_accounting,
 | 
			
		||||
	.clocksource_resume		= xen_itc_jitter_data_reset,
 | 
			
		||||
	.sched_clock			= xen_sched_clock,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Called after suspend, to resume time.  */
 | 
			
		||||
static void xen_local_tick_resume(void)
 | 
			
		||||
{
 | 
			
		||||
	/* Just trigger a tick.  */
 | 
			
		||||
	ia64_cpu_local_tick();
 | 
			
		||||
	touch_softlockup_watchdog();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
xen_timer_resume(void)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int cpu;
 | 
			
		||||
 | 
			
		||||
	xen_local_tick_resume();
 | 
			
		||||
 | 
			
		||||
	for_each_online_cpu(cpu)
 | 
			
		||||
		xen_init_missing_ticks_accounting(cpu);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ia64_cpu_local_tick_fn(void *unused)
 | 
			
		||||
{
 | 
			
		||||
	xen_local_tick_resume();
 | 
			
		||||
	xen_init_missing_ticks_accounting(smp_processor_id());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
xen_timer_resume_on_aps(void)
 | 
			
		||||
{
 | 
			
		||||
	smp_call_function(&ia64_cpu_local_tick_fn, NULL, 1);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,24 +0,0 @@
 | 
			
		|||
/******************************************************************************
 | 
			
		||||
 * arch/ia64/xen/time.h
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *                    VA Linux Systems Japan K.K.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
extern struct pv_time_ops xen_time_ops __initdata;
 | 
			
		||||
void xen_timer_resume_on_aps(void);
 | 
			
		||||
| 
						 | 
				
			
			@ -1,441 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 | 
			
		||||
 *
 | 
			
		||||
 *          Tristan Gingold <tristan.gingold@bull.net>
 | 
			
		||||
 *
 | 
			
		||||
 *          Copyright (c) 2007
 | 
			
		||||
 *          Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *                          VA Linux Systems Japan K.K.
 | 
			
		||||
 *          consolidate mini and inline version.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/module.h>
 | 
			
		||||
#include <xen/interface/xen.h>
 | 
			
		||||
#include <xen/interface/memory.h>
 | 
			
		||||
#include <xen/interface/grant_table.h>
 | 
			
		||||
#include <xen/interface/callback.h>
 | 
			
		||||
#include <xen/interface/vcpu.h>
 | 
			
		||||
#include <asm/xen/hypervisor.h>
 | 
			
		||||
#include <asm/xen/xencomm.h>
 | 
			
		||||
 | 
			
		||||
/* Xencomm notes:
 | 
			
		||||
 * This file defines hypercalls to be used by xencomm.  The hypercalls simply
 | 
			
		||||
 * create inlines or mini descriptors for pointers and then call the raw arch
 | 
			
		||||
 * hypercall xencomm_arch_hypercall_XXX
 | 
			
		||||
 *
 | 
			
		||||
 * If the arch wants to directly use these hypercalls, simply define macros
 | 
			
		||||
 * in asm/xen/hypercall.h, eg:
 | 
			
		||||
 *  #define HYPERVISOR_sched_op xencomm_hypercall_sched_op
 | 
			
		||||
 *
 | 
			
		||||
 * The arch may also define HYPERVISOR_xxx as a function and do more operations
 | 
			
		||||
 * before/after doing the hypercall.
 | 
			
		||||
 *
 | 
			
		||||
 * Note: because only inline or mini descriptors are created these functions
 | 
			
		||||
 * must only be called with in kernel memory parameters.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
xencomm_hypercall_console_io(int cmd, int count, char *str)
 | 
			
		||||
{
 | 
			
		||||
	/* xen early printk uses console io hypercall before
 | 
			
		||||
	 * xencomm initialization. In that case, we just ignore it.
 | 
			
		||||
	 */
 | 
			
		||||
	if (!xencomm_is_initialized())
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	return xencomm_arch_hypercall_console_io
 | 
			
		||||
		(cmd, count, xencomm_map_no_alloc(str, count));
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(xencomm_hypercall_console_io);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
xencomm_hypercall_event_channel_op(int cmd, void *op)
 | 
			
		||||
{
 | 
			
		||||
	struct xencomm_handle *desc;
 | 
			
		||||
	desc = xencomm_map_no_alloc(op, sizeof(struct evtchn_op));
 | 
			
		||||
	if (desc == NULL)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	return xencomm_arch_hypercall_event_channel_op(cmd, desc);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(xencomm_hypercall_event_channel_op);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
xencomm_hypercall_xen_version(int cmd, void *arg)
 | 
			
		||||
{
 | 
			
		||||
	struct xencomm_handle *desc;
 | 
			
		||||
	unsigned int argsize;
 | 
			
		||||
 | 
			
		||||
	switch (cmd) {
 | 
			
		||||
	case XENVER_version:
 | 
			
		||||
		/* do not actually pass an argument */
 | 
			
		||||
		return xencomm_arch_hypercall_xen_version(cmd, 0);
 | 
			
		||||
	case XENVER_extraversion:
 | 
			
		||||
		argsize = sizeof(struct xen_extraversion);
 | 
			
		||||
		break;
 | 
			
		||||
	case XENVER_compile_info:
 | 
			
		||||
		argsize = sizeof(struct xen_compile_info);
 | 
			
		||||
		break;
 | 
			
		||||
	case XENVER_capabilities:
 | 
			
		||||
		argsize = sizeof(struct xen_capabilities_info);
 | 
			
		||||
		break;
 | 
			
		||||
	case XENVER_changeset:
 | 
			
		||||
		argsize = sizeof(struct xen_changeset_info);
 | 
			
		||||
		break;
 | 
			
		||||
	case XENVER_platform_parameters:
 | 
			
		||||
		argsize = sizeof(struct xen_platform_parameters);
 | 
			
		||||
		break;
 | 
			
		||||
	case XENVER_get_features:
 | 
			
		||||
		argsize = (arg == NULL) ? 0 : sizeof(struct xen_feature_info);
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		printk(KERN_DEBUG
 | 
			
		||||
		       "%s: unknown version op %d\n", __func__, cmd);
 | 
			
		||||
		return -ENOSYS;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	desc = xencomm_map_no_alloc(arg, argsize);
 | 
			
		||||
	if (desc == NULL)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	return xencomm_arch_hypercall_xen_version(cmd, desc);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(xencomm_hypercall_xen_version);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
xencomm_hypercall_physdev_op(int cmd, void *op)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int argsize;
 | 
			
		||||
 | 
			
		||||
	switch (cmd) {
 | 
			
		||||
	case PHYSDEVOP_apic_read:
 | 
			
		||||
	case PHYSDEVOP_apic_write:
 | 
			
		||||
		argsize = sizeof(struct physdev_apic);
 | 
			
		||||
		break;
 | 
			
		||||
	case PHYSDEVOP_alloc_irq_vector:
 | 
			
		||||
	case PHYSDEVOP_free_irq_vector:
 | 
			
		||||
		argsize = sizeof(struct physdev_irq);
 | 
			
		||||
		break;
 | 
			
		||||
	case PHYSDEVOP_irq_status_query:
 | 
			
		||||
		argsize = sizeof(struct physdev_irq_status_query);
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		printk(KERN_DEBUG
 | 
			
		||||
		       "%s: unknown physdev op %d\n", __func__, cmd);
 | 
			
		||||
		return -ENOSYS;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return xencomm_arch_hypercall_physdev_op
 | 
			
		||||
		(cmd, xencomm_map_no_alloc(op, argsize));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
xencommize_grant_table_op(struct xencomm_mini **xc_area,
 | 
			
		||||
			  unsigned int cmd, void *op, unsigned int count,
 | 
			
		||||
			  struct xencomm_handle **desc)
 | 
			
		||||
{
 | 
			
		||||
	struct xencomm_handle *desc1;
 | 
			
		||||
	unsigned int argsize;
 | 
			
		||||
 | 
			
		||||
	switch (cmd) {
 | 
			
		||||
	case GNTTABOP_map_grant_ref:
 | 
			
		||||
		argsize = sizeof(struct gnttab_map_grant_ref);
 | 
			
		||||
		break;
 | 
			
		||||
	case GNTTABOP_unmap_grant_ref:
 | 
			
		||||
		argsize = sizeof(struct gnttab_unmap_grant_ref);
 | 
			
		||||
		break;
 | 
			
		||||
	case GNTTABOP_setup_table:
 | 
			
		||||
	{
 | 
			
		||||
		struct gnttab_setup_table *setup = op;
 | 
			
		||||
 | 
			
		||||
		argsize = sizeof(*setup);
 | 
			
		||||
 | 
			
		||||
		if (count != 1)
 | 
			
		||||
			return -EINVAL;
 | 
			
		||||
		desc1 = __xencomm_map_no_alloc
 | 
			
		||||
			(xen_guest_handle(setup->frame_list),
 | 
			
		||||
			 setup->nr_frames *
 | 
			
		||||
			 sizeof(*xen_guest_handle(setup->frame_list)),
 | 
			
		||||
			 *xc_area);
 | 
			
		||||
		if (desc1 == NULL)
 | 
			
		||||
			return -EINVAL;
 | 
			
		||||
		(*xc_area)++;
 | 
			
		||||
		set_xen_guest_handle(setup->frame_list, (void *)desc1);
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
	case GNTTABOP_dump_table:
 | 
			
		||||
		argsize = sizeof(struct gnttab_dump_table);
 | 
			
		||||
		break;
 | 
			
		||||
	case GNTTABOP_transfer:
 | 
			
		||||
		argsize = sizeof(struct gnttab_transfer);
 | 
			
		||||
		break;
 | 
			
		||||
	case GNTTABOP_copy:
 | 
			
		||||
		argsize = sizeof(struct gnttab_copy);
 | 
			
		||||
		break;
 | 
			
		||||
	case GNTTABOP_query_size:
 | 
			
		||||
		argsize = sizeof(struct gnttab_query_size);
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		printk(KERN_DEBUG "%s: unknown hypercall grant table op %d\n",
 | 
			
		||||
		       __func__, cmd);
 | 
			
		||||
		BUG();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	*desc = __xencomm_map_no_alloc(op, count * argsize, *xc_area);
 | 
			
		||||
	if (*desc == NULL)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
	(*xc_area)++;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
xencomm_hypercall_grant_table_op(unsigned int cmd, void *op,
 | 
			
		||||
				 unsigned int count)
 | 
			
		||||
{
 | 
			
		||||
	int rc;
 | 
			
		||||
	struct xencomm_handle *desc;
 | 
			
		||||
	XENCOMM_MINI_ALIGNED(xc_area, 2);
 | 
			
		||||
 | 
			
		||||
	rc = xencommize_grant_table_op(&xc_area, cmd, op, count, &desc);
 | 
			
		||||
	if (rc)
 | 
			
		||||
		return rc;
 | 
			
		||||
 | 
			
		||||
	return xencomm_arch_hypercall_grant_table_op(cmd, desc, count);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(xencomm_hypercall_grant_table_op);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
xencomm_hypercall_sched_op(int cmd, void *arg)
 | 
			
		||||
{
 | 
			
		||||
	struct xencomm_handle *desc;
 | 
			
		||||
	unsigned int argsize;
 | 
			
		||||
 | 
			
		||||
	switch (cmd) {
 | 
			
		||||
	case SCHEDOP_yield:
 | 
			
		||||
	case SCHEDOP_block:
 | 
			
		||||
		argsize = 0;
 | 
			
		||||
		break;
 | 
			
		||||
	case SCHEDOP_shutdown:
 | 
			
		||||
		argsize = sizeof(struct sched_shutdown);
 | 
			
		||||
		break;
 | 
			
		||||
	case SCHEDOP_poll:
 | 
			
		||||
	{
 | 
			
		||||
		struct sched_poll *poll = arg;
 | 
			
		||||
		struct xencomm_handle *ports;
 | 
			
		||||
 | 
			
		||||
		argsize = sizeof(struct sched_poll);
 | 
			
		||||
		ports = xencomm_map_no_alloc(xen_guest_handle(poll->ports),
 | 
			
		||||
				     sizeof(*xen_guest_handle(poll->ports)));
 | 
			
		||||
 | 
			
		||||
		set_xen_guest_handle(poll->ports, (void *)ports);
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
	default:
 | 
			
		||||
		printk(KERN_DEBUG "%s: unknown sched op %d\n", __func__, cmd);
 | 
			
		||||
		return -ENOSYS;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	desc = xencomm_map_no_alloc(arg, argsize);
 | 
			
		||||
	if (desc == NULL)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	return xencomm_arch_hypercall_sched_op(cmd, desc);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(xencomm_hypercall_sched_op);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
xencomm_hypercall_multicall(void *call_list, int nr_calls)
 | 
			
		||||
{
 | 
			
		||||
	int rc;
 | 
			
		||||
	int i;
 | 
			
		||||
	struct multicall_entry *mce;
 | 
			
		||||
	struct xencomm_handle *desc;
 | 
			
		||||
	XENCOMM_MINI_ALIGNED(xc_area, nr_calls * 2);
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < nr_calls; i++) {
 | 
			
		||||
		mce = (struct multicall_entry *)call_list + i;
 | 
			
		||||
 | 
			
		||||
		switch (mce->op) {
 | 
			
		||||
		case __HYPERVISOR_update_va_mapping:
 | 
			
		||||
		case __HYPERVISOR_mmu_update:
 | 
			
		||||
			/* No-op on ia64.  */
 | 
			
		||||
			break;
 | 
			
		||||
		case __HYPERVISOR_grant_table_op:
 | 
			
		||||
			rc = xencommize_grant_table_op
 | 
			
		||||
				(&xc_area,
 | 
			
		||||
				 mce->args[0], (void *)mce->args[1],
 | 
			
		||||
				 mce->args[2], &desc);
 | 
			
		||||
			if (rc)
 | 
			
		||||
				return rc;
 | 
			
		||||
			mce->args[1] = (unsigned long)desc;
 | 
			
		||||
			break;
 | 
			
		||||
		case __HYPERVISOR_memory_op:
 | 
			
		||||
		default:
 | 
			
		||||
			printk(KERN_DEBUG
 | 
			
		||||
			       "%s: unhandled multicall op entry op %lu\n",
 | 
			
		||||
			       __func__, mce->op);
 | 
			
		||||
			return -ENOSYS;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	desc = xencomm_map_no_alloc(call_list,
 | 
			
		||||
				    nr_calls * sizeof(struct multicall_entry));
 | 
			
		||||
	if (desc == NULL)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	return xencomm_arch_hypercall_multicall(desc, nr_calls);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(xencomm_hypercall_multicall);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
xencomm_hypercall_callback_op(int cmd, void *arg)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int argsize;
 | 
			
		||||
	switch (cmd) {
 | 
			
		||||
	case CALLBACKOP_register:
 | 
			
		||||
		argsize = sizeof(struct callback_register);
 | 
			
		||||
		break;
 | 
			
		||||
	case CALLBACKOP_unregister:
 | 
			
		||||
		argsize = sizeof(struct callback_unregister);
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		printk(KERN_DEBUG
 | 
			
		||||
		       "%s: unknown callback op %d\n", __func__, cmd);
 | 
			
		||||
		return -ENOSYS;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return xencomm_arch_hypercall_callback_op
 | 
			
		||||
		(cmd, xencomm_map_no_alloc(arg, argsize));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
xencommize_memory_reservation(struct xencomm_mini *xc_area,
 | 
			
		||||
			      struct xen_memory_reservation *mop)
 | 
			
		||||
{
 | 
			
		||||
	struct xencomm_handle *desc;
 | 
			
		||||
 | 
			
		||||
	desc = __xencomm_map_no_alloc(xen_guest_handle(mop->extent_start),
 | 
			
		||||
			mop->nr_extents *
 | 
			
		||||
			sizeof(*xen_guest_handle(mop->extent_start)),
 | 
			
		||||
			xc_area);
 | 
			
		||||
	if (desc == NULL)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	set_xen_guest_handle(mop->extent_start, (void *)desc);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
xencomm_hypercall_memory_op(unsigned int cmd, void *arg)
 | 
			
		||||
{
 | 
			
		||||
	GUEST_HANDLE(xen_pfn_t) extent_start_va[2] = { {NULL}, {NULL} };
 | 
			
		||||
	struct xen_memory_reservation *xmr = NULL;
 | 
			
		||||
	int rc;
 | 
			
		||||
	struct xencomm_handle *desc;
 | 
			
		||||
	unsigned int argsize;
 | 
			
		||||
	XENCOMM_MINI_ALIGNED(xc_area, 2);
 | 
			
		||||
 | 
			
		||||
	switch (cmd) {
 | 
			
		||||
	case XENMEM_increase_reservation:
 | 
			
		||||
	case XENMEM_decrease_reservation:
 | 
			
		||||
	case XENMEM_populate_physmap:
 | 
			
		||||
		xmr = (struct xen_memory_reservation *)arg;
 | 
			
		||||
		set_xen_guest_handle(extent_start_va[0],
 | 
			
		||||
				     xen_guest_handle(xmr->extent_start));
 | 
			
		||||
 | 
			
		||||
		argsize = sizeof(*xmr);
 | 
			
		||||
		rc = xencommize_memory_reservation(xc_area, xmr);
 | 
			
		||||
		if (rc)
 | 
			
		||||
			return rc;
 | 
			
		||||
		xc_area++;
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	case XENMEM_maximum_ram_page:
 | 
			
		||||
		argsize = 0;
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	case XENMEM_add_to_physmap:
 | 
			
		||||
		argsize = sizeof(struct xen_add_to_physmap);
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		printk(KERN_DEBUG "%s: unknown memory op %d\n", __func__, cmd);
 | 
			
		||||
		return -ENOSYS;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	desc = xencomm_map_no_alloc(arg, argsize);
 | 
			
		||||
	if (desc == NULL)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	rc = xencomm_arch_hypercall_memory_op(cmd, desc);
 | 
			
		||||
 | 
			
		||||
	switch (cmd) {
 | 
			
		||||
	case XENMEM_increase_reservation:
 | 
			
		||||
	case XENMEM_decrease_reservation:
 | 
			
		||||
	case XENMEM_populate_physmap:
 | 
			
		||||
		set_xen_guest_handle(xmr->extent_start,
 | 
			
		||||
				     xen_guest_handle(extent_start_va[0]));
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return rc;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(xencomm_hypercall_memory_op);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
xencomm_hypercall_suspend(unsigned long srec)
 | 
			
		||||
{
 | 
			
		||||
	struct sched_shutdown arg;
 | 
			
		||||
 | 
			
		||||
	arg.reason = SHUTDOWN_suspend;
 | 
			
		||||
 | 
			
		||||
	return xencomm_arch_hypercall_sched_op(
 | 
			
		||||
		SCHEDOP_shutdown, xencomm_map_no_alloc(&arg, sizeof(arg)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long
 | 
			
		||||
xencomm_hypercall_vcpu_op(int cmd, int cpu, void *arg)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int argsize;
 | 
			
		||||
	switch (cmd) {
 | 
			
		||||
	case VCPUOP_register_runstate_memory_area: {
 | 
			
		||||
		struct vcpu_register_runstate_memory_area *area =
 | 
			
		||||
			(struct vcpu_register_runstate_memory_area *)arg;
 | 
			
		||||
		argsize = sizeof(*arg);
 | 
			
		||||
		set_xen_guest_handle(area->addr.h,
 | 
			
		||||
		     (void *)xencomm_map_no_alloc(area->addr.v,
 | 
			
		||||
						  sizeof(area->addr.v)));
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		printk(KERN_DEBUG "%s: unknown vcpu op %d\n", __func__, cmd);
 | 
			
		||||
		return -ENOSYS;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return xencomm_arch_hypercall_vcpu_op(cmd, cpu,
 | 
			
		||||
					xencomm_map_no_alloc(arg, argsize));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long
 | 
			
		||||
xencomm_hypercall_opt_feature(void *arg)
 | 
			
		||||
{
 | 
			
		||||
	return xencomm_arch_hypercall_opt_feature(
 | 
			
		||||
		xencomm_map_no_alloc(arg,
 | 
			
		||||
				     sizeof(struct xen_ia64_opt_feature)));
 | 
			
		||||
}
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -1,106 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright (C) 2006 Hollis Blanchard <hollisb@us.ibm.com>, IBM Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
#include <linux/err.h>
 | 
			
		||||
 | 
			
		||||
static unsigned long kernel_virtual_offset;
 | 
			
		||||
static int is_xencomm_initialized;
 | 
			
		||||
 | 
			
		||||
/* for xen early printk. It uses console io hypercall which uses xencomm.
 | 
			
		||||
 * However early printk may use it before xencomm initialization.
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
xencomm_is_initialized(void)
 | 
			
		||||
{
 | 
			
		||||
	return is_xencomm_initialized;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
xencomm_initialize(void)
 | 
			
		||||
{
 | 
			
		||||
	kernel_virtual_offset = KERNEL_START - ia64_tpa(KERNEL_START);
 | 
			
		||||
	is_xencomm_initialized = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Translate virtual address to physical address.  */
 | 
			
		||||
unsigned long
 | 
			
		||||
xencomm_vtop(unsigned long vaddr)
 | 
			
		||||
{
 | 
			
		||||
	struct page *page;
 | 
			
		||||
	struct vm_area_struct *vma;
 | 
			
		||||
 | 
			
		||||
	if (vaddr == 0)
 | 
			
		||||
		return 0UL;
 | 
			
		||||
 | 
			
		||||
	if (REGION_NUMBER(vaddr) == 5) {
 | 
			
		||||
		pgd_t *pgd;
 | 
			
		||||
		pud_t *pud;
 | 
			
		||||
		pmd_t *pmd;
 | 
			
		||||
		pte_t *ptep;
 | 
			
		||||
 | 
			
		||||
		/* On ia64, TASK_SIZE refers to current.  It is not initialized
 | 
			
		||||
		   during boot.
 | 
			
		||||
		   Furthermore the kernel is relocatable and __pa() doesn't
 | 
			
		||||
		   work on  addresses.  */
 | 
			
		||||
		if (vaddr >= KERNEL_START
 | 
			
		||||
		    && vaddr < (KERNEL_START + KERNEL_TR_PAGE_SIZE))
 | 
			
		||||
			return vaddr - kernel_virtual_offset;
 | 
			
		||||
 | 
			
		||||
		/* In kernel area -- virtually mapped.  */
 | 
			
		||||
		pgd = pgd_offset_k(vaddr);
 | 
			
		||||
		if (pgd_none(*pgd) || pgd_bad(*pgd))
 | 
			
		||||
			return ~0UL;
 | 
			
		||||
 | 
			
		||||
		pud = pud_offset(pgd, vaddr);
 | 
			
		||||
		if (pud_none(*pud) || pud_bad(*pud))
 | 
			
		||||
			return ~0UL;
 | 
			
		||||
 | 
			
		||||
		pmd = pmd_offset(pud, vaddr);
 | 
			
		||||
		if (pmd_none(*pmd) || pmd_bad(*pmd))
 | 
			
		||||
			return ~0UL;
 | 
			
		||||
 | 
			
		||||
		ptep = pte_offset_kernel(pmd, vaddr);
 | 
			
		||||
		if (!ptep)
 | 
			
		||||
			return ~0UL;
 | 
			
		||||
 | 
			
		||||
		return (pte_val(*ptep) & _PFN_MASK) | (vaddr & ~PAGE_MASK);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (vaddr > TASK_SIZE) {
 | 
			
		||||
		/* percpu variables */
 | 
			
		||||
		if (REGION_NUMBER(vaddr) == 7 &&
 | 
			
		||||
		    REGION_OFFSET(vaddr) >= (1ULL << IA64_MAX_PHYS_BITS))
 | 
			
		||||
			ia64_tpa(vaddr);
 | 
			
		||||
 | 
			
		||||
		/* kernel address */
 | 
			
		||||
		return __pa(vaddr);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* XXX double-check (lack of) locking */
 | 
			
		||||
	vma = find_extend_vma(current->mm, vaddr);
 | 
			
		||||
	if (!vma)
 | 
			
		||||
		return ~0UL;
 | 
			
		||||
 | 
			
		||||
	/* We assume the page is modified.  */
 | 
			
		||||
	page = follow_page(vma, vaddr, FOLL_WRITE | FOLL_TOUCH);
 | 
			
		||||
	if (IS_ERR_OR_NULL(page))
 | 
			
		||||
		return ~0UL;
 | 
			
		||||
 | 
			
		||||
	return (page_to_pfn(page) << PAGE_SHIFT) | (vaddr & ~PAGE_MASK);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,52 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/ia64/xen/ivt.S
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2005 Hewlett-Packard Co
 | 
			
		||||
 *	Dan Magenheimer <dan.magenheimer@hp.com>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
 | 
			
		||||
 *                    VA Linux Systems Japan K.K.
 | 
			
		||||
 *                    pv_ops.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <asm/asmmacro.h>
 | 
			
		||||
#include <asm/kregs.h>
 | 
			
		||||
#include <asm/pgtable.h>
 | 
			
		||||
 | 
			
		||||
#include "../kernel/minstate.h"
 | 
			
		||||
 | 
			
		||||
	.section .text,"ax"
 | 
			
		||||
GLOBAL_ENTRY(xen_event_callback)
 | 
			
		||||
	mov r31=pr		// prepare to save predicates
 | 
			
		||||
	;;
 | 
			
		||||
	SAVE_MIN_WITH_COVER	// uses r31; defines r2 and r3
 | 
			
		||||
	;;
 | 
			
		||||
	movl r3=XSI_PSR_IC
 | 
			
		||||
	mov r14=1
 | 
			
		||||
	;;
 | 
			
		||||
	st4 [r3]=r14
 | 
			
		||||
	;;
 | 
			
		||||
	adds r3=8,r2		// set up second base pointer for SAVE_REST
 | 
			
		||||
	srlz.i			// ensure everybody knows psr.ic is back on
 | 
			
		||||
	;;
 | 
			
		||||
	SAVE_REST
 | 
			
		||||
	;;
 | 
			
		||||
1:
 | 
			
		||||
	alloc r14=ar.pfs,0,0,1,0 // must be first in an insn group
 | 
			
		||||
	add out0=16,sp		// pass pointer to pt_regs as first arg
 | 
			
		||||
	;;
 | 
			
		||||
	br.call.sptk.many b0=xen_evtchn_do_upcall
 | 
			
		||||
	;;
 | 
			
		||||
	movl r20=XSI_PSR_I_ADDR
 | 
			
		||||
	;;
 | 
			
		||||
	ld8 r20=[r20]
 | 
			
		||||
	;;
 | 
			
		||||
	adds r20=-1,r20		// vcpu_info->evtchn_upcall_pending
 | 
			
		||||
	;;
 | 
			
		||||
	ld1 r20=[r20]
 | 
			
		||||
	;;
 | 
			
		||||
	cmp.ne p6,p0=r20,r0	// if there are pending events,
 | 
			
		||||
	(p6) br.spnt.few 1b	// call evtchn_do_upcall again.
 | 
			
		||||
	br.sptk.many xen_leave_kernel	// we know ia64_leave_kernel is
 | 
			
		||||
					// paravirtualized as xen_leave_kernel
 | 
			
		||||
END(xen_event_callback)
 | 
			
		||||
| 
						 | 
				
			
			@ -1,80 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Support routines for Xen
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2005 Dan Magenheimer <dan.magenheimer@hp.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <asm/processor.h>
 | 
			
		||||
#include <asm/asmmacro.h>
 | 
			
		||||
#include <asm/pgtable.h>
 | 
			
		||||
#include <asm/paravirt.h>
 | 
			
		||||
#include <asm/xen/privop.h>
 | 
			
		||||
#include <linux/elfnote.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <xen/interface/elfnote.h>
 | 
			
		||||
 | 
			
		||||
	.section .data..read_mostly
 | 
			
		||||
	.align 8
 | 
			
		||||
	.global xen_domain_type
 | 
			
		||||
xen_domain_type:
 | 
			
		||||
	data4 XEN_NATIVE_ASM
 | 
			
		||||
	.previous
 | 
			
		||||
 | 
			
		||||
	__INIT
 | 
			
		||||
ENTRY(startup_xen)
 | 
			
		||||
	// Calculate load offset.
 | 
			
		||||
	// The constant, LOAD_OFFSET, can't be used because the boot
 | 
			
		||||
	// loader doesn't always load to the LMA specified by the vmlinux.lds.
 | 
			
		||||
	mov r9=ip	// must be the first instruction to make sure
 | 
			
		||||
			// that r9 = the physical address of startup_xen.
 | 
			
		||||
			// Usually r9 = startup_xen - LOAD_OFFSET
 | 
			
		||||
	movl r8=startup_xen
 | 
			
		||||
	;;
 | 
			
		||||
	sub r9=r9,r8	// Usually r9 = -LOAD_OFFSET.
 | 
			
		||||
 | 
			
		||||
	mov r10=PARAVIRT_HYPERVISOR_TYPE_XEN
 | 
			
		||||
	movl r11=_start
 | 
			
		||||
	;;
 | 
			
		||||
	add r11=r11,r9
 | 
			
		||||
	movl r8=hypervisor_type
 | 
			
		||||
	;;
 | 
			
		||||
	add r8=r8,r9
 | 
			
		||||
	mov b0=r11
 | 
			
		||||
	;;
 | 
			
		||||
	st8 [r8]=r10
 | 
			
		||||
	br.cond.sptk.many b0
 | 
			
		||||
	;;
 | 
			
		||||
END(startup_xen)
 | 
			
		||||
 | 
			
		||||
	ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS,	.asciz "linux")
 | 
			
		||||
	ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,	.asciz "2.6")
 | 
			
		||||
	ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION,	.asciz "xen-3.0")
 | 
			
		||||
	ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,		data8.ua startup_xen - LOAD_OFFSET)
 | 
			
		||||
 | 
			
		||||
#define isBP	p3	// are we the Bootstrap Processor?
 | 
			
		||||
 | 
			
		||||
GLOBAL_ENTRY(xen_setup_hook)
 | 
			
		||||
	mov r8=XEN_PV_DOMAIN_ASM
 | 
			
		||||
(isBP)	movl r9=xen_domain_type;;
 | 
			
		||||
(isBP)	st4 [r9]=r8
 | 
			
		||||
	movl r10=xen_ivt;;
 | 
			
		||||
 | 
			
		||||
	mov cr.iva=r10
 | 
			
		||||
 | 
			
		||||
	/* Set xsi base.  */
 | 
			
		||||
#define FW_HYPERCALL_SET_SHARED_INFO_VA			0x600
 | 
			
		||||
(isBP)	mov r2=FW_HYPERCALL_SET_SHARED_INFO_VA
 | 
			
		||||
(isBP)	movl r28=XSI_BASE;;
 | 
			
		||||
(isBP)	break 0x1000;;
 | 
			
		||||
 | 
			
		||||
	/* setup pv_ops */
 | 
			
		||||
(isBP)	mov r4=rp
 | 
			
		||||
	;;
 | 
			
		||||
(isBP)	br.call.sptk.many rp=xen_setup_pv_ops
 | 
			
		||||
	;;
 | 
			
		||||
(isBP)	mov rp=r4
 | 
			
		||||
	;;
 | 
			
		||||
 | 
			
		||||
	br.ret.sptk.many rp
 | 
			
		||||
	;;
 | 
			
		||||
END(xen_setup_hook)
 | 
			
		||||
| 
						 | 
				
			
			@ -36,7 +36,7 @@
 | 
			
		|||
 * @extra_args == Operation-specific extra arguments (NULL if none).
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* ia64, x86: Callback for event delivery. */
 | 
			
		||||
/* x86: Callback for event delivery. */
 | 
			
		||||
#define CALLBACKTYPE_event                 0
 | 
			
		||||
 | 
			
		||||
/* x86: Failsafe callback when guest state cannot be restored by Xen. */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,6 @@
 | 
			
		|||
 | 
			
		||||
#define XEN_IO_PROTO_ABI_X86_32     "x86_32-abi"
 | 
			
		||||
#define XEN_IO_PROTO_ABI_X86_64     "x86_64-abi"
 | 
			
		||||
#define XEN_IO_PROTO_ABI_IA64       "ia64-abi"
 | 
			
		||||
#define XEN_IO_PROTO_ABI_POWERPC64  "powerpc64-abi"
 | 
			
		||||
#define XEN_IO_PROTO_ABI_ARM        "arm-abi"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -11,8 +10,6 @@
 | 
			
		|||
# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_32
 | 
			
		||||
#elif defined(__x86_64__)
 | 
			
		||||
# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_64
 | 
			
		||||
#elif defined(__ia64__)
 | 
			
		||||
# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_IA64
 | 
			
		||||
#elif defined(__powerpc64__)
 | 
			
		||||
# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_POWERPC64
 | 
			
		||||
#elif defined(__arm__) || defined(__aarch64__)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue