diff options
Diffstat (limited to 'arch/ia64')
281 files changed, 4893 insertions, 12094 deletions
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index e0f5b6d7f84..2f3abcf8f6b 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig @@ -6,10 +6,11 @@ menu "Processor type and features"  config IA64  	bool +	select ARCH_MIGHT_HAVE_PC_PARPORT +	select ARCH_MIGHT_HAVE_PC_SERIO  	select PCI if (!IA64_HP_SIM)  	select ACPI if (!IA64_HP_SIM)  	select PM if (!IA64_HP_SIM) -	select ARCH_SUPPORTS_MSI  	select HAVE_UNSTABLE_SCHED_CLOCK  	select HAVE_IDE  	select HAVE_OPROFILE @@ -20,8 +21,32 @@ config IA64  	select HAVE_FUNCTION_TRACER  	select HAVE_DMA_ATTRS  	select HAVE_KVM +	select TTY  	select HAVE_ARCH_TRACEHOOK  	select HAVE_DMA_API_DEBUG +	select HAVE_MEMBLOCK +	select HAVE_MEMBLOCK_NODE_MAP +	select HAVE_VIRT_CPU_ACCOUNTING +	select VIRT_TO_BUS +	select ARCH_DISCARD_MEMBLOCK +	select GENERIC_IRQ_PROBE +	select GENERIC_PENDING_IRQ if SMP +	select GENERIC_IRQ_SHOW +	select GENERIC_IRQ_LEGACY +	select ARCH_WANT_OPTIONAL_GPIOLIB +	select ARCH_HAVE_NMI_SAFE_CMPXCHG +	select GENERIC_IOMAP +	select GENERIC_SMP_IDLE_THREAD +	select ARCH_INIT_TASK +	select ARCH_TASK_STRUCT_ALLOCATOR +	select ARCH_THREAD_INFO_ALLOCATOR +	select ARCH_CLOCKSOURCE_DATA +	select GENERIC_TIME_VSYSCALL_OLD +	select SYSCTL_ARCH_UNALIGN_NO_WARN +	select HAVE_MOD_ARCH_SPECIFIC +	select MODULES_USE_ELF_RELA +	select ARCH_USE_CMPXCHG_LOCKREF +	select HAVE_ARCH_AUDITSYSCALL  	default y  	help  	  The Itanium Processor Family is Intel's 64-bit successor to @@ -73,31 +98,21 @@ config HUGETLB_PAGE_SIZE_VARIABLE  	depends on HUGETLB_PAGE  	default y -config GENERIC_FIND_NEXT_BIT -	bool -	default y -  config GENERIC_CALIBRATE_DELAY  	bool  	default y -config GENERIC_TIME_VSYSCALL -	bool -	default y -  config HAVE_SETUP_PER_CPU_AREA  	def_bool y  config DMI  	bool  	default y +	select DMI_SCAN_MACHINE_NON_EFI_FALLBACK  config EFI  	bool -	default y - -config GENERIC_IOMAP -	bool +	select UCS2_STRING  	default y  config SCHED_OMIT_FRAME_POINTER @@ -118,6 +133,7 @@ config AUDIT_ARCH  menuconfig PARAVIRT_GUEST  	bool "Paravirtualized guest support" +	depends on BROKEN  	help  	  Say Y here to get to see options related to running Linux under  	  various hypervisors.  This option alone does not add any kernel code. @@ -130,17 +146,12 @@ config PARAVIRT  	bool "Enable paravirtualization code"  	depends on PARAVIRT_GUEST  	default y -	bool -	default y  	help  	  This changes the kernel so it can modify itself when it is run  	  under a hypervisor, potentially improving performance significantly  	  over full virtualization.  However, when run without a hypervisor  	  the kernel is theoretically slower and slightly larger. - -source "arch/ia64/xen/Kconfig" -  endif  choice @@ -153,7 +164,6 @@ config IA64_GENERIC  	select ACPI_NUMA  	select SWIOTLB  	select PCI_MSI -	select DMAR  	help  	  This selects the system type of your hardware.  A "generic" kernel  	  will run on any supported IA-64 system.  However, if you configure @@ -167,7 +177,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". @@ -177,7 +186,7 @@ config IA64_DIG  config IA64_DIG_VTD  	bool "DIG+Intel+IOMMU" -	select DMAR +	select INTEL_IOMMU  	select PCI_MSI  config IA64_HP_ZX1 @@ -223,14 +232,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 @@ -334,20 +335,8 @@ config FORCE_MAX_ZONEORDER  	default "17" if HUGETLB_PAGE  	default "11" -config VIRT_CPU_ACCOUNTING -	bool "Deterministic task and CPU time accounting" -	default n -	help -	  Select this option to enable more accurate task and CPU time -	  accounting.  This is done by reading a CPU counter on each -	  kernel entry and exit and on transitions within the kernel -	  between system, softirq and hardirq state, so there is a -	  small performance impact. -	  If in doubt, say N here. -  config SMP  	bool "Symmetric multi-processing support" -	select USE_GENERIC_SMP_HELPERS  	help  	  This enables support for systems with more than one CPU. If you have  	  a system with only one CPU, say N.  If you have a system with more @@ -377,9 +366,8 @@ config NR_CPUS  	  performance hit.  config HOTPLUG_CPU -	bool "Support for hot-pluggable CPUs (EXPERIMENTAL)" -	depends on SMP && EXPERIMENTAL -	select HOTPLUG +	bool "Support for hot-pluggable CPUs" +	depends on SMP  	default n  	---help---  	  Say Y here to experiment with turning CPUs off and on.  CPUs @@ -409,11 +397,11 @@ config PERMIT_BSP_REMOVE  	support.   config FORCE_CPEI_RETARGET -	bool "Force assumption that CPEI can be re-targetted" +	bool "Force assumption that CPEI can be re-targeted"  	depends on PERMIT_BSP_REMOVE  	default n  	---help--- -	Say Y if you need to force the assumption that CPEI can be re-targetted to +	Say Y if you need to force the assumption that CPEI can be re-targeted to  	any cpu in the system. This hint is available via ACPI 3.0 specifications.  	Tiger4 systems are capable of re-directing CPEI to any CPU other than BSP.  	This option it useful to enable this feature on older BIOS's as well. @@ -466,9 +454,6 @@ config NODES_SHIFT  	  MAX_NUMNODES will be 2^(This value).  	  If in doubt, use the default. -config ARCH_POPULATES_NODE_MAP -	def_bool y -  # VIRTUAL_MEM_MAP and FLAT_NODE_MEM_MAP are functionally equivalent.  # VIRTUAL_MEM_MAP has been retained for historical reasons.  config VIRTUAL_MEM_MAP @@ -560,8 +545,8 @@ config IA64_HP_AML_NFW  source "drivers/sn/Kconfig"  config KEXEC -	bool "kexec system call (EXPERIMENTAL)" -	depends on EXPERIMENTAL && !IA64_HP_SIM && (!SMP || HOTPLUG_CPU) +	bool "kexec system call" +	depends on !IA64_HP_SIM && (!SMP || HOTPLUG_CPU)  	help  	  kexec is a system call that implements the ability to shutdown your  	  current kernel, and to start another kernel.  It is like a reboot @@ -572,9 +557,9 @@ config KEXEC  	  It is an ongoing process to be certain the hardware in a machine  	  is properly shutdown, so do not be surprised if this code does not -	  initially work for you.  It may help to enable device hotplugging -	  support.  As of this writing the exact hardware interface is -	  strongly in flux, so no good recommendation can be made. +	  initially work for you.  As of this writing the exact hardware +	  interface is strongly in flux, so no good recommendation can be +	  made.  config CRASH_DUMP  	  bool "kernel crash dumps" @@ -595,9 +580,9 @@ source "kernel/power/Kconfig"  source "drivers/acpi/Kconfig"  if PM - -source "arch/ia64/kernel/cpufreq/Kconfig" - +menu "CPU Frequency scaling" +source "drivers/cpufreq/Kconfig" +endmenu  endif  endmenu @@ -626,27 +611,6 @@ source "drivers/pci/hotplug/Kconfig"  source "drivers/pcmcia/Kconfig" -config DMAR -        bool "Support for DMA Remapping Devices (EXPERIMENTAL)" -        depends on IA64_GENERIC && ACPI && EXPERIMENTAL -	help -	  DMA remapping (DMAR) devices support enables independent address -	  translations for Direct Memory Access (DMA) from devices. -	  These DMA remapping devices are reported via ACPI tables -	  and include PCI device scope covered by these DMA -	  remapping devices. - -config DMAR_DEFAULT_ON -	def_bool y -	prompt "Enable DMA Remapping Devices by default" -	depends on DMAR -	help -	  Selecting this option will enable a DMAR device at boot time if -	  one is found. If this option is not selected, DMAR support can -	  be enabled by passing intel_iommu=on to the kernel. It is -	  recommended you say N here while the DMAR code remains -	  experimental. -  endmenu  endif @@ -678,30 +642,5 @@ source "arch/ia64/kvm/Kconfig"  source "lib/Kconfig" -# -# Use the generic interrupt handling code in kernel/irq/: -# -config GENERIC_HARDIRQS -	def_bool y - -config GENERIC_HARDIRQS_NO__DO_IRQ -	def_bool y - -config GENERIC_IRQ_PROBE -	bool -	default y - -config GENERIC_PENDING_IRQ -	bool -	depends on GENERIC_HARDIRQS && SMP -	default y - -config IRQ_PER_CPU -	bool -	default y -  config IOMMU_HELPER  	def_bool (IA64_HP_ZX1 || IA64_HP_ZX1_SWIOTLB || IA64_GENERIC || SWIOTLB) - -config IOMMU_API -	def_bool (DMAR) diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile index be7bfa12b70..f37238f45bc 100644 --- a/arch/ia64/Makefile +++ b/arch/ia64/Makefile @@ -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/ diff --git a/arch/ia64/configs/bigsur_defconfig b/arch/ia64/configs/bigsur_defconfig index cf5993f05d4..4c4ac163c60 100644 --- a/arch/ia64/configs/bigsur_defconfig +++ b/arch/ia64/configs/bigsur_defconfig @@ -75,7 +75,6 @@ CONFIG_SND_PCM_OSS=m  CONFIG_SND_CS4281=m  CONFIG_USB_HIDDEV=y  CONFIG_USB=m -CONFIG_USB_DEVICEFS=y  CONFIG_USB_MON=m  CONFIG_USB_UHCI_HCD=m  CONFIG_USB_ACM=m diff --git a/arch/ia64/configs/generic_defconfig b/arch/ia64/configs/generic_defconfig index 3ded8fe6275..e8ed3ae70aa 100644 --- a/arch/ia64/configs/generic_defconfig +++ b/arch/ia64/configs/generic_defconfig @@ -25,14 +25,13 @@ CONFIG_KEXEC=y  CONFIG_CRASH_DUMP=y  CONFIG_EFI_VARS=y  CONFIG_BINFMT_MISC=m -CONFIG_ACPI_PROCFS=y  CONFIG_ACPI_BUTTON=m  CONFIG_ACPI_FAN=m  CONFIG_ACPI_DOCK=y  CONFIG_ACPI_PROCESSOR=m -CONFIG_ACPI_CONTAINER=m -CONFIG_HOTPLUG_PCI=m -CONFIG_HOTPLUG_PCI_ACPI=m +CONFIG_ACPI_CONTAINER=y +CONFIG_HOTPLUG_PCI=y +CONFIG_HOTPLUG_PCI_ACPI=y  CONFIG_PACKET=y  CONFIG_UNIX=y  CONFIG_INET=y @@ -87,6 +86,7 @@ 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_IGB=y @@ -143,7 +143,6 @@ CONFIG_HID_SAMSUNG=m  CONFIG_HID_SONY=m  CONFIG_HID_SUNPLUS=m  CONFIG_USB=m -CONFIG_USB_DEVICEFS=y  CONFIG_USB_MON=m  CONFIG_USB_EHCI_HCD=m  CONFIG_USB_OHCI_HCD=m @@ -233,3 +232,4 @@ CONFIG_CRYPTO_PCBC=m  CONFIG_CRYPTO_MD5=y  # CONFIG_CRYPTO_ANSI_CPRNG is not set  CONFIG_CRC_T10DIF=y +CONFIG_INTEL_IOMMU=y diff --git a/arch/ia64/configs/gensparse_defconfig b/arch/ia64/configs/gensparse_defconfig index 3a98b2dd58a..d663efd1e4d 100644 --- a/arch/ia64/configs/gensparse_defconfig +++ b/arch/ia64/configs/gensparse_defconfig @@ -25,7 +25,7 @@ CONFIG_ACPI_BUTTON=m  CONFIG_ACPI_FAN=m  CONFIG_ACPI_PROCESSOR=m  CONFIG_ACPI_CONTAINER=m -CONFIG_HOTPLUG_PCI=m +CONFIG_HOTPLUG_PCI=y  CONFIG_HOTPLUG_PCI_ACPI=m  CONFIG_PACKET=y  CONFIG_UNIX=y @@ -75,6 +75,7 @@ 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 @@ -125,7 +126,6 @@ CONFIG_SND_CS46XX=m  CONFIG_SND_EMU10K1=m  CONFIG_SND_FM801=m  CONFIG_USB=m -CONFIG_USB_DEVICEFS=y  CONFIG_USB_MON=m  CONFIG_USB_EHCI_HCD=m  CONFIG_USB_OHCI_HCD=m diff --git a/arch/ia64/configs/tiger_defconfig b/arch/ia64/configs/tiger_defconfig index 137a453dd50..c8a3f40e77f 100644 --- a/arch/ia64/configs/tiger_defconfig +++ b/arch/ia64/configs/tiger_defconfig @@ -26,12 +26,11 @@ 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=m +CONFIG_HOTPLUG_PCI=y  CONFIG_HOTPLUG_PCI_ACPI=m  CONFIG_PACKET=y  CONFIG_UNIX=y @@ -77,6 +76,7 @@ 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 @@ -102,7 +102,6 @@ CONFIG_DRM_RADEON=m  CONFIG_DRM_MGA=m  CONFIG_DRM_SIS=m  CONFIG_USB=y -CONFIG_USB_DEVICEFS=y  CONFIG_USB_EHCI_HCD=m  CONFIG_USB_OHCI_HCD=m  CONFIG_USB_UHCI_HCD=y diff --git a/arch/ia64/configs/xen_domu_defconfig b/arch/ia64/configs/xen_domu_defconfig deleted file mode 100644 index 2bf76e418bc..00000000000 --- a/arch/ia64/configs/xen_domu_defconfig +++ /dev/null @@ -1,198 +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=m -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_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 diff --git a/arch/ia64/configs/zx1_defconfig b/arch/ia64/configs/zx1_defconfig index 1d42827f9fa..54bc72eda30 100644 --- a/arch/ia64/configs/zx1_defconfig +++ b/arch/ia64/configs/zx1_defconfig @@ -16,7 +16,6 @@ CONFIG_IA64_PALINFO=y  CONFIG_CRASH_DUMP=y  CONFIG_EFI_VARS=y  CONFIG_BINFMT_MISC=y -CONFIG_ACPI_PROCFS=y  CONFIG_HOTPLUG_PCI=y  CONFIG_HOTPLUG_PCI_ACPI=y  CONFIG_PACKET=y @@ -57,6 +56,7 @@ CONFIG_TULIP_MMIO=y  CONFIG_TULIP_NAPI=y  CONFIG_TULIP_NAPI_HW_MITIGATION=y  CONFIG_NET_PCI=y +CONFIG_NET_VENDOR_INTEL=y  CONFIG_E100=y  CONFIG_E1000=y  CONFIG_TIGON3=y diff --git a/arch/ia64/dig/Makefile b/arch/ia64/dig/Makefile index 2f7caddf093..ae16ec4f630 100644 --- a/arch/ia64/dig/Makefile +++ b/arch/ia64/dig/Makefile @@ -6,7 +6,7 @@  #  obj-y := setup.o -ifeq ($(CONFIG_DMAR), y) +ifeq ($(CONFIG_INTEL_IOMMU), y)  obj-$(CONFIG_IA64_GENERIC) += machvec.o machvec_vtd.o  else  obj-$(CONFIG_IA64_GENERIC) += machvec.o diff --git a/arch/ia64/dig/setup.c b/arch/ia64/dig/setup.c index 9196b330ff7..98131e1db7a 100644 --- a/arch/ia64/dig/setup.c +++ b/arch/ia64/dig/setup.c @@ -22,7 +22,7 @@  #include <asm/io.h>  #include <asm/machvec.h> -#include <asm/system.h> +#include <asm/setup.h>  void __init  dig_setup (char **cmdline_p) diff --git a/arch/ia64/hp/common/aml_nfw.c b/arch/ia64/hp/common/aml_nfw.c index 22078486d35..84715fcbba0 100644 --- a/arch/ia64/hp/common/aml_nfw.c +++ b/arch/ia64/hp/common/aml_nfw.c @@ -23,15 +23,14 @@   */  #include <linux/module.h> -#include <acpi/acpi_bus.h> -#include <acpi/acpi_drivers.h> +#include <linux/acpi.h>  #include <asm/sal.h>  MODULE_AUTHOR("Bjorn Helgaas <bjorn.helgaas@hp.com>");  MODULE_LICENSE("GPL");  MODULE_DESCRIPTION("ACPI opregion handler for native firmware calls"); -static int force_register; +static bool force_register;  module_param_named(force, force_register, bool, 0);  MODULE_PARM_DESC(force, "Install opregion handler even without HPQ5001 device"); @@ -191,7 +190,7 @@ static int aml_nfw_add(struct acpi_device *device)  	return aml_nfw_add_global_handler();  } -static int aml_nfw_remove(struct acpi_device *device, int type) +static int aml_nfw_remove(struct acpi_device *device)  {  	return aml_nfw_remove_global_handler();  } diff --git a/arch/ia64/hp/common/hwsw_iommu.c b/arch/ia64/hp/common/hwsw_iommu.c index e4a80d82e3d..1e4cae5ae05 100644 --- a/arch/ia64/hp/common/hwsw_iommu.c +++ b/arch/ia64/hp/common/hwsw_iommu.c @@ -15,6 +15,7 @@  #include <linux/device.h>  #include <linux/dma-mapping.h>  #include <linux/swiotlb.h> +#include <linux/export.h>  #include <asm/machvec.h>  extern struct dma_map_ops sba_dma_ops, swiotlb_dma_ops; diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c index 4ce8d1358fe..344387a5540 100644 --- a/arch/ia64/hp/common/sba_iommu.c +++ b/arch/ia64/hp/common/sba_iommu.c @@ -37,12 +37,12 @@  #include <linux/crash_dump.h>  #include <linux/iommu-helper.h>  #include <linux/dma-mapping.h> +#include <linux/prefetch.h>  #include <asm/delay.h>		/* ia64_get_itc() */  #include <asm/io.h>  #include <asm/page.h>		/* PAGE_OFFSET */  #include <asm/dma.h> -#include <asm/system.h>		/* wmb() */  #include <asm/acpi-ext.h> @@ -242,7 +242,7 @@ struct ioc {  	struct pci_dev	*sac_only_dev;  }; -static struct ioc *ioc_list; +static struct ioc *ioc_list, *ioc_found;  static int reserve_sba_gart = 1;  static SBA_INLINE void sba_mark_invalid(struct ioc *, dma_addr_t, size_t); @@ -255,7 +255,7 @@ static u64 prefetch_spill_page;  #endif  #ifdef CONFIG_PCI -# define GET_IOC(dev)	(((dev)->bus == &pci_bus_type)						\ +# define GET_IOC(dev)	((dev_is_pci(dev))						\  			 ? ((struct ioc *) PCI_CONTROLLER(to_pci_dev(dev))->iommu) : NULL)  #else  # define GET_IOC(dev)	NULL @@ -914,7 +914,7 @@ sba_mark_invalid(struct ioc *ioc, dma_addr_t iova, size_t byte_cnt)   * @dir:  R/W or both.   * @attrs: optional dma attributes   * - * See Documentation/PCI/PCI-DMA-mapping.txt + * See Documentation/DMA-API-HOWTO.txt   */  static dma_addr_t sba_map_page(struct device *dev, struct page *page,  			       unsigned long poff, size_t size, @@ -1043,7 +1043,7 @@ sba_mark_clean(struct ioc *ioc, dma_addr_t iova, size_t size)   * @dir:  R/W or both.   * @attrs: optional dma attributes   * - * See Documentation/PCI/PCI-DMA-mapping.txt + * See Documentation/DMA-API-HOWTO.txt   */  static void sba_unmap_page(struct device *dev, dma_addr_t iova, size_t size,  			   enum dma_data_direction dir, struct dma_attrs *attrs) @@ -1063,7 +1063,7 @@ static void sba_unmap_page(struct device *dev, dma_addr_t iova, size_t size,  		/*  		** Address does not fall w/in IOVA, must be bypassing  		*/ -		DBG_BYPASS("sba_unmap_single_atttrs() bypass addr: 0x%lx\n", +		DBG_BYPASS("sba_unmap_single_attrs() bypass addr: 0x%lx\n",  			   iova);  #ifdef ENABLE_MARK_CLEAN @@ -1126,10 +1126,11 @@ void sba_unmap_single_attrs(struct device *dev, dma_addr_t iova, size_t size,   * @size:  number of bytes mapped in driver buffer.   * @dma_handle:  IOVA of new buffer.   * - * See Documentation/PCI/PCI-DMA-mapping.txt + * See Documentation/DMA-API-HOWTO.txt   */  static void * -sba_alloc_coherent (struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flags) +sba_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, +		   gfp_t flags, struct dma_attrs *attrs)  {  	struct ioc *ioc;  	void *addr; @@ -1139,11 +1140,13 @@ sba_alloc_coherent (struct device *dev, size_t size, dma_addr_t *dma_handle, gfp  #ifdef CONFIG_NUMA  	{ +		int node = ioc->node;  		struct page *page; -		page = alloc_pages_exact_node(ioc->node == MAX_NUMNODES ? -		                        numa_node_id() : ioc->node, flags, -		                        get_order(size)); +		if (node == NUMA_NO_NODE) +			node = numa_node_id(); + +		page = alloc_pages_exact_node(node, flags, get_order(size));  		if (unlikely(!page))  			return NULL; @@ -1189,10 +1192,10 @@ sba_alloc_coherent (struct device *dev, size_t size, dma_addr_t *dma_handle, gfp   * @vaddr:  virtual address IOVA of "consistent" buffer.   * @dma_handler:  IO virtual address of "consistent" buffer.   * - * See Documentation/PCI/PCI-DMA-mapping.txt + * See Documentation/DMA-API-HOWTO.txt   */ -static void sba_free_coherent (struct device *dev, size_t size, void *vaddr, -			       dma_addr_t dma_handle) +static void sba_free_coherent(struct device *dev, size_t size, void *vaddr, +			      dma_addr_t dma_handle, struct dma_attrs *attrs)  {  	sba_unmap_single_attrs(dev, dma_handle, size, 0, NULL);  	free_pages((unsigned long) vaddr, get_order(size)); @@ -1452,7 +1455,7 @@ static void sba_unmap_sg_attrs(struct device *dev, struct scatterlist *sglist,   * @dir:  R/W or both.   * @attrs: optional dma attributes   * - * See Documentation/PCI/PCI-DMA-mapping.txt + * See Documentation/DMA-API-HOWTO.txt   */  static int sba_map_sg_attrs(struct device *dev, struct scatterlist *sglist,  			    int nents, enum dma_data_direction dir, @@ -1548,7 +1551,7 @@ static int sba_map_sg_attrs(struct device *dev, struct scatterlist *sglist,   * @dir:  R/W or both.   * @attrs: optional dma attributes   * - * See Documentation/PCI/PCI-DMA-mapping.txt + * See Documentation/DMA-API-HOWTO.txt   */  static void sba_unmap_sg_attrs(struct device *dev, struct scatterlist *sglist,  			       int nents, enum dma_data_direction dir, @@ -1595,7 +1598,7 @@ static void sba_unmap_sg_attrs(struct device *dev, struct scatterlist *sglist,  *  ***************************************************************/ -static void __init +static void  ioc_iova_init(struct ioc *ioc)  {  	int tcnfg; @@ -1806,20 +1809,13 @@ static struct ioc_iommu ioc_iommu_info[] __initdata = {  	{ SX2000_IOC_ID, "sx2000", NULL },  }; -static struct ioc * __init -ioc_init(unsigned long hpa, void *handle) +static void ioc_init(unsigned long hpa, struct ioc *ioc)  { -	struct ioc *ioc;  	struct ioc_iommu *info; -	ioc = kzalloc(sizeof(*ioc), GFP_KERNEL); -	if (!ioc) -		return NULL; -  	ioc->next = ioc_list;  	ioc_list = ioc; -	ioc->handle = handle;  	ioc->ioc_hpa = ioremap(hpa, 0x1000);  	ioc->func_id = READ_REG(ioc->ioc_hpa + IOC_FUNC_ID); @@ -1860,8 +1856,6 @@ ioc_init(unsigned long hpa, void *handle)  		"%s %d.%d HPA 0x%lx IOVA space %dMb at 0x%lx\n",  		ioc->name, (ioc->rev >> 4) & 0xF, ioc->rev & 0xF,  		hpa, ioc->iov_size >> 20, ioc->ibase); - -	return ioc;  } @@ -1913,7 +1907,7 @@ ioc_show(struct seq_file *s, void *v)  	seq_printf(s, "Hewlett Packard %s IOC rev %d.%d\n",  		ioc->name, ((ioc->rev >> 4) & 0xF), (ioc->rev & 0xF));  #ifdef CONFIG_NUMA -	if (ioc->node != MAX_NUMNODES) +	if (ioc->node != NUMA_NO_NODE)  		seq_printf(s, "NUMA node       : %d\n", ioc->node);  #endif  	seq_printf(s, "IOVA size       : %ld MB\n", ((ioc->pdir_size >> 3) * iovp_size)/(1024*1024)); @@ -1991,7 +1985,7 @@ sba_connect_bus(struct pci_bus *bus)  	if (PCI_CONTROLLER(bus)->iommu)  		return; -	handle = PCI_CONTROLLER(bus)->acpi_handle; +	handle = acpi_device_handle(PCI_CONTROLLER(bus)->companion);  	if (!handle)  		return; @@ -2014,47 +2008,35 @@ sba_connect_bus(struct pci_bus *bus)  	printk(KERN_WARNING "No IOC for PCI Bus %04x:%02x in ACPI\n", pci_domain_nr(bus), bus->number);  } -#ifdef CONFIG_NUMA  static void __init  sba_map_ioc_to_node(struct ioc *ioc, acpi_handle handle)  { +#ifdef CONFIG_NUMA  	unsigned int node; -	int pxm; - -	ioc->node = MAX_NUMNODES; -	pxm = acpi_get_pxm(handle); - -	if (pxm < 0) -		return; - -	node = pxm_to_node(pxm); - -	if (node >= MAX_NUMNODES || !node_online(node)) -		return; +	node = acpi_get_node(handle); +	if (node != NUMA_NO_NODE && !node_online(node)) +		node = NUMA_NO_NODE;  	ioc->node = node; -	return; -} -#else -#define sba_map_ioc_to_node(ioc, handle)  #endif +} -static int __init -acpi_sba_ioc_add(struct acpi_device *device) +static void acpi_sba_ioc_add(struct ioc *ioc)  { -	struct ioc *ioc; +	acpi_handle handle = ioc->handle;  	acpi_status status;  	u64 hpa, length;  	struct acpi_device_info *adi; -	status = hp_acpi_csr_space(device->handle, &hpa, &length); +	ioc_found = ioc->next; +	status = hp_acpi_csr_space(handle, &hpa, &length);  	if (ACPI_FAILURE(status)) -		return 1; +		goto err; -	status = acpi_get_object_info(device->handle, &adi); +	status = acpi_get_object_info(handle, &adi);  	if (ACPI_FAILURE(status)) -		return 1; +		goto err;  	/*  	 * For HWP0001, only SBA appears in ACPI namespace.  It encloses the PCI @@ -2075,13 +2057,13 @@ acpi_sba_ioc_add(struct acpi_device *device)  	if (!iovp_shift)  		iovp_shift = 12; -	ioc = ioc_init(hpa, device->handle); -	if (!ioc) -		return 1; - +	ioc_init(hpa, ioc);  	/* setup NUMA node association */ -	sba_map_ioc_to_node(ioc, device->handle); -	return 0; +	sba_map_ioc_to_node(ioc, handle); +	return; + + err: +	kfree(ioc);  }  static const struct acpi_device_id hp_ioc_iommu_device_ids[] = { @@ -2089,14 +2071,35 @@ static const struct acpi_device_id hp_ioc_iommu_device_ids[] = {  	{"HWP0004", 0},  	{"", 0},  }; -static struct acpi_driver acpi_sba_ioc_driver = { -	.name		= "IOC IOMMU Driver", -	.ids		= hp_ioc_iommu_device_ids, -	.ops		= { -		.add	= acpi_sba_ioc_add, -	}, + +static int acpi_sba_ioc_attach(struct acpi_device *device, +			       const struct acpi_device_id *not_used) +{ +	struct ioc *ioc; + +	ioc = kzalloc(sizeof(*ioc), GFP_KERNEL); +	if (!ioc) +		return -ENOMEM; + +	ioc->next = ioc_found; +	ioc_found = ioc; +	ioc->handle = device->handle; +	return 1; +} + + +static struct acpi_scan_handler acpi_sba_ioc_handler = { +	.ids	= hp_ioc_iommu_device_ids, +	.attach	= acpi_sba_ioc_attach,  }; +static int __init acpi_sba_ioc_init_acpi(void) +{ +	return acpi_scan_add_handler(&acpi_sba_ioc_handler); +} +/* This has to run before acpi_scan_init(). */ +arch_initcall(acpi_sba_ioc_init_acpi); +  extern struct dma_map_ops swiotlb_dma_ops;  static int __init @@ -2121,7 +2124,13 @@ sba_init(void)  	}  #endif -	acpi_bus_register_driver(&acpi_sba_ioc_driver); +	/* +	 * ioc_found should be populated by the acpi_sba_ioc_handler's .attach() +	 * routine, but that only happens if acpi_scan_init() has already run. +	 */ +	while (ioc_found) +		acpi_sba_ioc_add(ioc_found); +  	if (!ioc_list) {  #ifdef CONFIG_IA64_GENERIC  		/* @@ -2212,8 +2221,8 @@ sba_page_override(char *str)  __setup("sbapagesize=",sba_page_override);  struct dma_map_ops sba_dma_ops = { -	.alloc_coherent		= sba_alloc_coherent, -	.free_coherent		= sba_free_coherent, +	.alloc			= sba_alloc_coherent, +	.free			= sba_free_coherent,  	.map_page		= sba_map_page,  	.unmap_page		= sba_unmap_page,  	.map_sg			= sba_map_sg_attrs, diff --git a/arch/ia64/hp/sim/Kconfig b/arch/ia64/hp/sim/Kconfig index 8d513a8c526..d84707d5520 100644 --- a/arch/ia64/hp/sim/Kconfig +++ b/arch/ia64/hp/sim/Kconfig @@ -8,6 +8,7 @@ config HP_SIMETH  config HP_SIMSERIAL  	bool "Simulated serial driver support" +	depends on TTY  config HP_SIMSERIAL_CONSOLE  	bool "Console for HP simulator" diff --git a/arch/ia64/hp/sim/boot/bootloader.c b/arch/ia64/hp/sim/boot/bootloader.c index c5e9baafafe..28f4b230b8c 100644 --- a/arch/ia64/hp/sim/boot/bootloader.c +++ b/arch/ia64/hp/sim/boot/bootloader.c @@ -20,7 +20,6 @@ struct task_struct;	/* forward declaration for elf.h */  #include <asm/pal.h>  #include <asm/pgtable.h>  #include <asm/sal.h> -#include <asm/system.h>  #include "ssc.h" diff --git a/arch/ia64/hp/sim/boot/fw-emu.c b/arch/ia64/hp/sim/boot/fw-emu.c index bf6d9d8c802..87bf9ad8cf0 100644 --- a/arch/ia64/hp/sim/boot/fw-emu.c +++ b/arch/ia64/hp/sim/boot/fw-emu.c @@ -13,6 +13,7 @@  #include <asm/io.h>  #include <asm/pal.h>  #include <asm/sal.h> +#include <asm/setup.h>  #include "ssc.h" @@ -160,28 +161,19 @@ sal_emulator (long index, unsigned long in1, unsigned long in2,  	 */  	status = 0;  	if (index == SAL_FREQ_BASE) { -		switch (in1) { -		      case SAL_FREQ_BASE_PLATFORM: +		if (in1 == SAL_FREQ_BASE_PLATFORM)  			r9 = 200000000; -			break; - -		      case SAL_FREQ_BASE_INTERVAL_TIMER: +		else if (in1 == SAL_FREQ_BASE_INTERVAL_TIMER) {  			/*  			 * Is this supposed to be the cr.itc frequency  			 * or something platform specific?  The SAL  			 * doc ain't exactly clear on this...  			 */  			r9 = 700000000; -			break; - -		      case SAL_FREQ_BASE_REALTIME_CLOCK: +		} else if (in1 == SAL_FREQ_BASE_REALTIME_CLOCK)  			r9 = 1; -			break; - -		      default: +		else  			status = -1; -			break; -		}  	} else if (index == SAL_SET_VECTORS) {  		;  	} else if (index == SAL_GET_STATE_INFO) { @@ -298,16 +290,16 @@ sys_fw_init (const char *args, int arglen)  	efi_runtime->hdr.signature = EFI_RUNTIME_SERVICES_SIGNATURE;  	efi_runtime->hdr.revision = EFI_RUNTIME_SERVICES_REVISION;  	efi_runtime->hdr.headersize = sizeof(efi_runtime->hdr); -	efi_runtime->get_time = __pa(&fw_efi_get_time); -	efi_runtime->set_time = __pa(&efi_unimplemented); -	efi_runtime->get_wakeup_time = __pa(&efi_unimplemented); -	efi_runtime->set_wakeup_time = __pa(&efi_unimplemented); -	efi_runtime->set_virtual_address_map = __pa(&efi_unimplemented); -	efi_runtime->get_variable = __pa(&efi_unimplemented); -	efi_runtime->get_next_variable = __pa(&efi_unimplemented); -	efi_runtime->set_variable = __pa(&efi_unimplemented); -	efi_runtime->get_next_high_mono_count = __pa(&efi_unimplemented); -	efi_runtime->reset_system = __pa(&efi_reset_system); +	efi_runtime->get_time = (void *)__pa(&fw_efi_get_time); +	efi_runtime->set_time = (void *)__pa(&efi_unimplemented); +	efi_runtime->get_wakeup_time = (void *)__pa(&efi_unimplemented); +	efi_runtime->set_wakeup_time = (void *)__pa(&efi_unimplemented); +	efi_runtime->set_virtual_address_map = (void *)__pa(&efi_unimplemented); +	efi_runtime->get_variable = (void *)__pa(&efi_unimplemented); +	efi_runtime->get_next_variable = (void *)__pa(&efi_unimplemented); +	efi_runtime->set_variable = (void *)__pa(&efi_unimplemented); +	efi_runtime->get_next_high_mono_count = (void *)__pa(&efi_unimplemented); +	efi_runtime->reset_system = (void *)__pa(&efi_reset_system);  	efi_tables->guid = SAL_SYSTEM_TABLE_GUID;  	efi_tables->table = __pa(sal_systab); diff --git a/arch/ia64/hp/sim/hpsim_irq.c b/arch/ia64/hp/sim/hpsim_irq.c index b272261d77c..0aa70ebda49 100644 --- a/arch/ia64/hp/sim/hpsim_irq.c +++ b/arch/ia64/hp/sim/hpsim_irq.c @@ -10,43 +10,66 @@  #include <linux/sched.h>  #include <linux/irq.h> +#include "hpsim_ssc.h" +  static unsigned int -hpsim_irq_startup (unsigned int irq) +hpsim_irq_startup(struct irq_data *data)  {  	return 0;  }  static void -hpsim_irq_noop (unsigned int irq) +hpsim_irq_noop(struct irq_data *data)  {  }  static int -hpsim_set_affinity_noop(unsigned int a, const struct cpumask *b) +hpsim_set_affinity_noop(struct irq_data *d, const struct cpumask *b, bool f)  {  	return 0;  }  static struct irq_chip irq_type_hp_sim = { -	.name =		"hpsim", -	.startup =	hpsim_irq_startup, -	.shutdown =	hpsim_irq_noop, -	.enable =	hpsim_irq_noop, -	.disable =	hpsim_irq_noop, -	.ack =		hpsim_irq_noop, -	.end =		hpsim_irq_noop, -	.set_affinity =	hpsim_set_affinity_noop, +	.name =			"hpsim", +	.irq_startup =		hpsim_irq_startup, +	.irq_shutdown =		hpsim_irq_noop, +	.irq_enable =		hpsim_irq_noop, +	.irq_disable =		hpsim_irq_noop, +	.irq_ack =		hpsim_irq_noop, +	.irq_set_affinity =	hpsim_set_affinity_noop,  }; +static void hpsim_irq_set_chip(int irq) +{ +	struct irq_chip *chip = irq_get_chip(irq); + +	if (chip == &no_irq_chip) +		irq_set_chip(irq, &irq_type_hp_sim); +} + +static void hpsim_connect_irq(int intr, int irq) +{ +	ia64_ssc(intr, irq, 0, 0, SSC_CONNECT_INTERRUPT); +} + +int hpsim_get_irq(int intr) +{ +	int irq = assign_irq_vector(AUTO_ASSIGN); + +	if (irq >= 0) { +		hpsim_irq_set_chip(irq); +		irq_set_handler(irq, handle_simple_irq); +		hpsim_connect_irq(intr, irq); +	} + +	return irq; +} +  void __init  hpsim_irq_init (void)  { -	struct irq_desc *idesc;  	int i; -	for (i = 0; i < NR_IRQS; ++i) { -		idesc = irq_desc + i; -		if (idesc->chip == &no_irq_chip) -			idesc->chip = &irq_type_hp_sim; -	} +	for_each_active_irq(i) +		hpsim_irq_set_chip(i);  } diff --git a/arch/ia64/hp/sim/hpsim_setup.c b/arch/ia64/hp/sim/hpsim_setup.c index f629e903ebc..664a5402a69 100644 --- a/arch/ia64/hp/sim/hpsim_setup.c +++ b/arch/ia64/hp/sim/hpsim_setup.c @@ -26,12 +26,6 @@  #include "hpsim_ssc.h"  void -ia64_ssc_connect_irq (long intr, long irq) -{ -	ia64_ssc(intr, irq, 0, 0, SSC_CONNECT_INTERRUPT); -} - -void  ia64_ctl_trace (long on)  {  	ia64_ssc(on, 0, 0, 0, SSC_CTL_TRACE); diff --git a/arch/ia64/hp/sim/simeth.c b/arch/ia64/hp/sim/simeth.c index 7e81966ce48..d1b04c4c95e 100644 --- a/arch/ia64/hp/sim/simeth.c +++ b/arch/ia64/hp/sim/simeth.c @@ -20,7 +20,6 @@  #include <linux/skbuff.h>  #include <linux/notifier.h>  #include <linux/bitops.h> -#include <asm/system.h>  #include <asm/irq.h>  #include <asm/hpsim.h> @@ -129,17 +128,6 @@ netdev_probe(char *name, unsigned char *ether)  static inline int -netdev_connect(int irq) -{ -	/* XXX Fix me -	 * this does not support multiple cards -	 * also no return value -	 */ -	ia64_ssc_connect_irq(NETWORK_INTR, irq); -	return 0; -} - -static inline int  netdev_attach(int fd, int irq, unsigned int ipaddr)  {  	/* this puts the host interface in the right mode (start interrupting) */ @@ -172,7 +160,7 @@ static const struct net_device_ops simeth_netdev_ops = {  	.ndo_stop		= simeth_close,  	.ndo_start_xmit		= simeth_tx,  	.ndo_get_stats		= simeth_get_stats, -	.ndo_set_multicast_list	= set_multicast_list, /* not yet used */ +	.ndo_set_rx_mode	= set_multicast_list, /* not yet used */  }; @@ -193,7 +181,7 @@ simeth_probe1(void)  	unsigned char mac_addr[ETH_ALEN];  	struct simeth_local *local;  	struct net_device *dev; -	int fd, i, err, rc; +	int fd, err, rc;  	/*  	 * XXX Fix me @@ -226,22 +214,16 @@ simeth_probe1(void)  		return err;  	} -	if ((rc = assign_irq_vector(AUTO_ASSIGN)) < 0) -		panic("%s: out of interrupt vectors!\n", __func__); -	dev->irq = rc; -  	/*  	 * attach the interrupt in the simulator, this does enable interrupts  	 * until a netdev_attach() is called  	 */ -	netdev_connect(dev->irq); +	if ((rc = hpsim_get_irq(NETWORK_INTR)) < 0) +		panic("%s: out of interrupt vectors!\n", __func__); +	dev->irq = rc; -	printk(KERN_INFO "%s: hosteth=%s simfd=%d, HwAddr", -	       dev->name, simeth_device, local->simfd); -	for(i = 0; i < ETH_ALEN; i++) { -		printk(" %2.2x", dev->dev_addr[i]); -	} -	printk(", IRQ %d\n", dev->irq); +	printk(KERN_INFO "%s: hosteth=%s simfd=%d, HwAddr=%pm, IRQ %d\n", +	       dev->name, simeth_device, local->simfd, dev->dev_addr, dev->irq);  	return 0;  } @@ -286,7 +268,7 @@ static __inline__ int dev_is_ethdev(struct net_device *dev)  static int  simeth_device_event(struct notifier_block *this,unsigned long event, void *ptr)  { -	struct net_device *dev = ptr; +	struct net_device *dev = netdev_notifier_info_to_dev(ptr);  	struct simeth_local *local;  	struct in_device *in_dev;  	struct in_ifaddr **ifap = NULL; diff --git a/arch/ia64/hp/sim/simscsi.c b/arch/ia64/hp/sim/simscsi.c index 3a078ad3aa4..3a428f19a00 100644 --- a/arch/ia64/hp/sim/simscsi.c +++ b/arch/ia64/hp/sim/simscsi.c @@ -88,8 +88,8 @@ simscsi_setup (char *s)  	if (strlen(s) > MAX_ROOT_LEN) {  		printk(KERN_ERR "simscsi_setup: prefix too long---using default %s\n",  		       simscsi_root); -	} -	simscsi_root = s; +	} else +		simscsi_root = s;  	return 1;  } @@ -202,7 +202,7 @@ simscsi_readwrite10 (struct scsi_cmnd *sc, int mode)  }  static int -simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)) +simscsi_queuecommand_lck (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))  {  	unsigned int target_id = sc->device->id;  	char fname[MAX_ROOT_LEN+16]; @@ -326,6 +326,8 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))  	return 0;  } +static DEF_SCSI_QCMD(simscsi_queuecommand) +  static int  simscsi_host_reset (struct scsi_cmnd *sc)  { diff --git a/arch/ia64/hp/sim/simserial.c b/arch/ia64/hp/sim/simserial.c index 13633da0d3d..e70cadec7ce 100644 --- a/arch/ia64/hp/sim/simserial.c +++ b/arch/ia64/hp/sim/simserial.c @@ -4,16 +4,11 @@   * This driver is mostly used for bringup purposes and will go away.   * It has a strong dependency on the system console. All outputs   * are rerouted to the same facility as the one used by printk which, in our - * case means sys_sim.c console (goes via the simulator). The code hereafter - * is completely leveraged from the serial.c driver. + * case means sys_sim.c console (goes via the simulator).   *   * Copyright (C) 1999-2000, 2002-2003 Hewlett-Packard Co   *	Stephane Eranian <eranian@hpl.hp.com>   *	David Mosberger-Tang <davidm@hpl.hp.com> - * - * 02/04/00 D. Mosberger	Merged in serial.c bug fixes in rs_close(). - * 02/25/00 D. Mosberger	Synced up with 2.3.99pre-5 version of serial.c. - * 07/30/02 D. Mosberger	Replace sti()/cli() with explicit spinlocks & local irq masking   */  #include <linux/init.h> @@ -27,15 +22,17 @@  #include <linux/seq_file.h>  #include <linux/slab.h>  #include <linux/capability.h> +#include <linux/circ_buf.h>  #include <linux/console.h> +#include <linux/irq.h>  #include <linux/module.h>  #include <linux/serial.h> -#include <linux/serialP.h>  #include <linux/sysrq.h> +#include <linux/uaccess.h> + +#include <asm/hpsim.h> -#include <asm/irq.h> -#include <asm/hw_irq.h> -#include <asm/uaccess.h> +#include "hpsim_ssc.h"  #undef SIMSERIAL_DEBUG	/* define this to get some debug information */ @@ -43,125 +40,51 @@  #define NR_PORTS	1	/* only one port for now */ -#define IRQ_T(info) ((info->flags & ASYNC_SHARE_IRQ) ? IRQF_SHARED : IRQF_DISABLED) - -#define SSC_GETCHAR	21 - -extern long ia64_ssc (long, long, long, long, int); -extern void ia64_ssc_connect_irq (long intr, long irq); - -static char *serial_name = "SimSerial driver"; -static char *serial_version = "0.6"; - -/* - * This has been extracted from asm/serial.h. We need one eventually but - * I don't know exactly what we're going to put in it so just fake one - * for now. - */ -#define BASE_BAUD ( 1843200 / 16 ) - -#define STD_COM_FLAGS (ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST) - -/* - * Most of the values here are meaningless to this particular driver. - * However some values must be preserved for the code (leveraged from serial.c - * to work correctly). - * port must not be 0 - * type must not be UNKNOWN - * So I picked arbitrary (guess from where?) values instead - */ -static struct serial_state rs_table[NR_PORTS]={ -  /* UART CLK   PORT IRQ     FLAGS        */ -  { 0, BASE_BAUD, 0x3F8, 0, STD_COM_FLAGS,0,PORT_16550 }  /* ttyS0 */ +struct serial_state { +	struct tty_port port; +	struct circ_buf xmit; +	int irq; +	int x_char;  }; -/* - * Just for the fun of it ! - */ -static struct serial_uart_config uart_config[] = { -	{ "unknown", 1, 0 }, -	{ "8250", 1, 0 }, -	{ "16450", 1, 0 }, -	{ "16550", 1, 0 }, -	{ "16550A", 16, UART_CLEAR_FIFO | UART_USE_FIFO }, -	{ "cirrus", 1, 0 }, -	{ "ST16650", 1, UART_CLEAR_FIFO | UART_STARTECH }, -	{ "ST16650V2", 32, UART_CLEAR_FIFO | UART_USE_FIFO | -		  UART_STARTECH }, -	{ "TI16750", 64, UART_CLEAR_FIFO | UART_USE_FIFO}, -	{ NULL, 0} -}; +static struct serial_state rs_table[NR_PORTS];  struct tty_driver *hp_simserial_driver; -static struct async_struct *IRQ_ports[NR_IRQS]; -  static struct console *console; -static unsigned char *tmp_buf; - -extern struct console *console_drivers; /* from kernel/printk.c */ - -/* - * ------------------------------------------------------------ - * rs_stop() and rs_start() - * - * This routines are called before setting or resetting tty->stopped. - * They enable or disable transmitter interrupts, as necessary. - * ------------------------------------------------------------ - */ -static void rs_stop(struct tty_struct *tty) -{ -#ifdef SIMSERIAL_DEBUG -	printk("rs_stop: tty->stopped=%d tty->hw_stopped=%d tty->flow_stopped=%d\n", -		tty->stopped, tty->hw_stopped, tty->flow_stopped); -#endif - -} - -static void rs_start(struct tty_struct *tty) -{ -#ifdef SIMSERIAL_DEBUG -	printk("rs_start: tty->stopped=%d tty->hw_stopped=%d tty->flow_stopped=%d\n", -		tty->stopped, tty->hw_stopped, tty->flow_stopped); -#endif -} - -static  void receive_chars(struct tty_struct *tty) +static void receive_chars(struct tty_port *port)  {  	unsigned char ch;  	static unsigned char seen_esc = 0;  	while ( (ch = ia64_ssc(0, 0, 0, 0, SSC_GETCHAR)) ) { -		if ( ch == 27 && seen_esc == 0 ) { +		if (ch == 27 && seen_esc == 0) {  			seen_esc = 1;  			continue; -		} else { -			if ( seen_esc==1 && ch == 'O' ) { -				seen_esc = 2; -				continue; -			} else if ( seen_esc == 2 ) { -				if ( ch == 'P' ) /* F1 */ -					show_state(); +		} else if (seen_esc == 1 && ch == 'O') { +			seen_esc = 2; +			continue; +		} else if (seen_esc == 2) { +			if (ch == 'P') /* F1 */ +				show_state();  #ifdef CONFIG_MAGIC_SYSRQ -				if ( ch == 'S' ) { /* F4 */ -					do -						ch = ia64_ssc(0, 0, 0, 0, -							      SSC_GETCHAR); -					while (!ch); -					handle_sysrq(ch); -				} -#endif -				seen_esc = 0; -				continue; +			if (ch == 'S') { /* F4 */ +				do { +					ch = ia64_ssc(0, 0, 0, 0, SSC_GETCHAR); +				} while (!ch); +				handle_sysrq(ch);  			} +#endif +			seen_esc = 0; +			continue;  		}  		seen_esc = 0; -		if (tty_insert_flip_char(tty, ch, TTY_NORMAL) == 0) +		if (tty_insert_flip_char(port, ch, TTY_NORMAL) == 0)  			break;  	} -	tty_flip_buffer_push(tty); +	tty_flip_buffer_push(port);  }  /* @@ -169,22 +92,10 @@ static  void receive_chars(struct tty_struct *tty)   */  static irqreturn_t rs_interrupt_single(int irq, void *dev_id)  { -	struct async_struct * info; +	struct serial_state *info = dev_id; + +	receive_chars(&info->port); -	/* -	 * I don't know exactly why they don't use the dev_id opaque data -	 * pointer instead of this extra lookup table -	 */ -	info = IRQ_ports[irq]; -	if (!info || !info->tty) { -		printk(KERN_INFO "simrs_interrupt_single: info|tty=0 info=%p problem\n", info); -		return IRQ_NONE; -	} -	/* -	 * pretty simple in our case, because we only get interrupts -	 * on inbound traffic -	 */ -	receive_chars(info->tty);  	return IRQ_HANDLED;  } @@ -194,17 +105,12 @@ static irqreturn_t rs_interrupt_single(int irq, void *dev_id)   * -------------------------------------------------------------------   */ -static void do_softint(struct work_struct *private_) -{ -	printk(KERN_ERR "simserial: do_softint called\n"); -} -  static int rs_put_char(struct tty_struct *tty, unsigned char ch)  { -	struct async_struct *info = (struct async_struct *)tty->driver_data; +	struct serial_state *info = tty->driver_data;  	unsigned long flags; -	if (!tty || !info->xmit.buf) +	if (!info->xmit.buf)  		return 0;  	local_irq_save(flags); @@ -218,12 +124,12 @@ static int rs_put_char(struct tty_struct *tty, unsigned char ch)  	return 1;  } -static void transmit_chars(struct async_struct *info, int *intr_done) +static void transmit_chars(struct tty_struct *tty, struct serial_state *info, +		int *intr_done)  {  	int count;  	unsigned long flags; -  	local_irq_save(flags);  	if (info->x_char) { @@ -231,16 +137,15 @@ static void transmit_chars(struct async_struct *info, int *intr_done)  		console->write(console, &c, 1); -		info->state->icount.tx++;  		info->x_char = 0;  		goto out;  	} -	if (info->xmit.head == info->xmit.tail || info->tty->stopped || info->tty->hw_stopped) { +	if (info->xmit.head == info->xmit.tail || tty->stopped) {  #ifdef SIMSERIAL_DEBUG  		printk("transmit_chars: head=%d, tail=%d, stopped=%d\n", -		       info->xmit.head, info->xmit.tail, info->tty->stopped); +		       info->xmit.head, info->xmit.tail, tty->stopped);  #endif  		goto out;  	} @@ -272,24 +177,24 @@ out:  static void rs_flush_chars(struct tty_struct *tty)  { -	struct async_struct *info = (struct async_struct *)tty->driver_data; +	struct serial_state *info = tty->driver_data; -	if (info->xmit.head == info->xmit.tail || tty->stopped || tty->hw_stopped || -	    !info->xmit.buf) +	if (info->xmit.head == info->xmit.tail || tty->stopped || +			!info->xmit.buf)  		return; -	transmit_chars(info, NULL); +	transmit_chars(tty, info, NULL);  } -  static int rs_write(struct tty_struct * tty,  		    const unsigned char *buf, int count)  { +	struct serial_state *info = tty->driver_data;  	int	c, ret = 0; -	struct async_struct *info = (struct async_struct *)tty->driver_data;  	unsigned long flags; -	if (!tty || !info->xmit.buf || !tmp_buf) return 0; +	if (!info->xmit.buf) +		return 0;  	local_irq_save(flags);  	while (1) { @@ -310,30 +215,30 @@ static int rs_write(struct tty_struct * tty,  	/*  	 * Hey, we transmit directly from here in our case  	 */ -	if (CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE) -	    && !tty->stopped && !tty->hw_stopped) { -		transmit_chars(info, NULL); -	} +	if (CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE) && +			!tty->stopped) +		transmit_chars(tty, info, NULL); +  	return ret;  }  static int rs_write_room(struct tty_struct *tty)  { -	struct async_struct *info = (struct async_struct *)tty->driver_data; +	struct serial_state *info = tty->driver_data;  	return CIRC_SPACE(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE);  }  static int rs_chars_in_buffer(struct tty_struct *tty)  { -	struct async_struct *info = (struct async_struct *)tty->driver_data; +	struct serial_state *info = tty->driver_data;  	return CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE);  }  static void rs_flush_buffer(struct tty_struct *tty)  { -	struct async_struct *info = (struct async_struct *)tty->driver_data; +	struct serial_state *info = tty->driver_data;  	unsigned long flags;  	local_irq_save(flags); @@ -349,7 +254,7 @@ static void rs_flush_buffer(struct tty_struct *tty)   */  static void rs_send_xchar(struct tty_struct *tty, char ch)  { -	struct async_struct *info = (struct async_struct *)tty->driver_data; +	struct serial_state *info = tty->driver_data;  	info->x_char = ch;  	if (ch) { @@ -357,7 +262,7 @@ static void rs_send_xchar(struct tty_struct *tty, char ch)  		 * I guess we could call console->write() directly but  		 * let's do that for now.  		 */ -		transmit_chars(info, NULL); +		transmit_chars(tty, info, NULL);  	}  } @@ -371,14 +276,15 @@ static void rs_send_xchar(struct tty_struct *tty, char ch)   */  static void rs_throttle(struct tty_struct * tty)  { -	if (I_IXOFF(tty)) rs_send_xchar(tty, STOP_CHAR(tty)); +	if (I_IXOFF(tty)) +		rs_send_xchar(tty, STOP_CHAR(tty));  	printk(KERN_INFO "simrs_throttle called\n");  }  static void rs_unthrottle(struct tty_struct * tty)  { -	struct async_struct *info = (struct async_struct *)tty->driver_data; +	struct serial_state *info = tty->driver_data;  	if (I_IXOFF(tty)) {  		if (info->x_char) @@ -389,9 +295,7 @@ static void rs_unthrottle(struct tty_struct * tty)  	printk(KERN_INFO "simrs_unthrottle called\n");  } - -static int rs_ioctl(struct tty_struct *tty, struct file * file, -		    unsigned int cmd, unsigned long arg) +static int rs_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)  {  	if ((cmd != TIOCGSERIAL) && (cmd != TIOCSSERIAL) &&  	    (cmd != TIOCSERCONFIG) && (cmd != TIOCSERGSTRUCT) && @@ -401,272 +305,67 @@ static int rs_ioctl(struct tty_struct *tty, struct file * file,  	}  	switch (cmd) { -		case TIOCGSERIAL: -			printk(KERN_INFO "simrs_ioctl TIOCGSERIAL called\n"); -			return 0; -		case TIOCSSERIAL: -			printk(KERN_INFO "simrs_ioctl TIOCSSERIAL called\n"); -			return 0; -		case TIOCSERCONFIG: -			printk(KERN_INFO "rs_ioctl: TIOCSERCONFIG called\n"); -			return -EINVAL; - -		case TIOCSERGETLSR: /* Get line status register */ -			printk(KERN_INFO "rs_ioctl: TIOCSERGETLSR called\n"); -			return  -EINVAL; - -		case TIOCSERGSTRUCT: -			printk(KERN_INFO "rs_ioctl: TIOCSERGSTRUCT called\n"); -#if 0 -			if (copy_to_user((struct async_struct *) arg, -					 info, sizeof(struct async_struct))) -				return -EFAULT; -#endif -			return 0; - -		/* -		 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change -		 * - mask passed in arg for lines of interest -		 *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking) -		 * Caller should use TIOCGICOUNT to see which one it was -		 */ -		case TIOCMIWAIT: -			printk(KERN_INFO "rs_ioctl: TIOCMIWAIT: called\n"); -			return 0; -		case TIOCSERGWILD: -		case TIOCSERSWILD: -			/* "setserial -W" is called in Debian boot */ -			printk (KERN_INFO "TIOCSER?WILD ioctl obsolete, ignored.\n"); -			return 0; - -		default: -			return -ENOIOCTLCMD; -		} -	return 0; +	case TIOCGSERIAL: +	case TIOCSSERIAL: +	case TIOCSERGSTRUCT: +	case TIOCMIWAIT: +		return 0; +	case TIOCSERCONFIG: +	case TIOCSERGETLSR: /* Get line status register */ +		return -EINVAL; +	case TIOCSERGWILD: +	case TIOCSERSWILD: +		/* "setserial -W" is called in Debian boot */ +		printk (KERN_INFO "TIOCSER?WILD ioctl obsolete, ignored.\n"); +		return 0; +	} +	return -ENOIOCTLCMD;  }  #define RELEVANT_IFLAG(iflag) (iflag & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK)) -static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios) -{ -	/* Handle turning off CRTSCTS */ -	if ((old_termios->c_cflag & CRTSCTS) && -	    !(tty->termios->c_cflag & CRTSCTS)) { -		tty->hw_stopped = 0; -		rs_start(tty); -	} -}  /*   * This routine will shutdown a serial port; interrupts are disabled, and   * DTR is dropped if the hangup on close termio flag is on.   */ -static void shutdown(struct async_struct * info) +static void shutdown(struct tty_port *port)  { -	unsigned long	flags; -	struct serial_state *state; -	int		retval; - -	if (!(info->flags & ASYNC_INITIALIZED)) return; - -	state = info->state; - -#ifdef SIMSERIAL_DEBUG -	printk("Shutting down serial port %d (irq %d)....", info->line, -	       state->irq); -#endif +	struct serial_state *info = container_of(port, struct serial_state, +			port); +	unsigned long flags;  	local_irq_save(flags); -	{ -		/* -		 * First unlink the serial port from the IRQ chain... -		 */ -		if (info->next_port) -			info->next_port->prev_port = info->prev_port; -		if (info->prev_port) -			info->prev_port->next_port = info->next_port; -		else -			IRQ_ports[state->irq] = info->next_port; - -		/* -		 * Free the IRQ, if necessary -		 */ -		if (state->irq && (!IRQ_ports[state->irq] || -				   !IRQ_ports[state->irq]->next_port)) { -			if (IRQ_ports[state->irq]) { -				free_irq(state->irq, NULL); -				retval = request_irq(state->irq, rs_interrupt_single, -						     IRQ_T(info), "serial", NULL); - -				if (retval) -					printk(KERN_ERR "serial shutdown: request_irq: error %d" -					       "  Couldn't reacquire IRQ.\n", retval); -			} else -				free_irq(state->irq, NULL); -		} +	if (info->irq) +		free_irq(info->irq, info); -		if (info->xmit.buf) { -			free_page((unsigned long) info->xmit.buf); -			info->xmit.buf = NULL; -		} - -		if (info->tty) set_bit(TTY_IO_ERROR, &info->tty->flags); - -		info->flags &= ~ASYNC_INITIALIZED; +	if (info->xmit.buf) { +		free_page((unsigned long) info->xmit.buf); +		info->xmit.buf = NULL;  	}  	local_irq_restore(flags);  } -/* - * ------------------------------------------------------------ - * rs_close() - * - * This routine is called when the serial port gets closed.  First, we - * wait for the last remaining data to be sent.  Then, we unlink its - * async structure from the interrupt chain if necessary, and we free - * that IRQ if nothing is left in the chain. - * ------------------------------------------------------------ - */  static void rs_close(struct tty_struct *tty, struct file * filp)  { -	struct async_struct * info = (struct async_struct *)tty->driver_data; -	struct serial_state *state; -	unsigned long flags; +	struct serial_state *info = tty->driver_data; -	if (!info ) return; - -	state = info->state; - -	local_irq_save(flags); -	if (tty_hung_up_p(filp)) { -#ifdef SIMSERIAL_DEBUG -		printk("rs_close: hung_up\n"); -#endif -		local_irq_restore(flags); -		return; -	} -#ifdef SIMSERIAL_DEBUG -	printk("rs_close ttys%d, count = %d\n", info->line, state->count); -#endif -	if ((tty->count == 1) && (state->count != 1)) { -		/* -		 * Uh, oh.  tty->count is 1, which means that the tty -		 * structure will be freed.  state->count should always -		 * be one in these conditions.  If it's greater than -		 * one, we've got real problems, since it means the -		 * serial port won't be shutdown. -		 */ -		printk(KERN_ERR "rs_close: bad serial port count; tty->count is 1, " -		       "state->count is %d\n", state->count); -		state->count = 1; -	} -	if (--state->count < 0) { -		printk(KERN_ERR "rs_close: bad serial port count for ttys%d: %d\n", -		       info->line, state->count); -		state->count = 0; -	} -	if (state->count) { -		local_irq_restore(flags); -		return; -	} -	info->flags |= ASYNC_CLOSING; -	local_irq_restore(flags); - -	/* -	 * Now we wait for the transmit buffer to clear; and we notify -	 * the line discipline to only process XON/XOFF characters. -	 */ -	shutdown(info); -	rs_flush_buffer(tty); -	tty_ldisc_flush(tty); -	info->event = 0; -	info->tty = NULL; -	if (info->blocked_open) { -		if (info->close_delay) -			schedule_timeout_interruptible(info->close_delay); -		wake_up_interruptible(&info->open_wait); -	} -	info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING); -	wake_up_interruptible(&info->close_wait); +	tty_port_close(&info->port, tty, filp);  } -/* - * rs_wait_until_sent() --- wait until the transmitter is empty - */ -static void rs_wait_until_sent(struct tty_struct *tty, int timeout) -{ -} - - -/* - * rs_hangup() --- called by tty_hangup() when a hangup is signaled. - */  static void rs_hangup(struct tty_struct *tty)  { -	struct async_struct * info = (struct async_struct *)tty->driver_data; -	struct serial_state *state = info->state; - -#ifdef SIMSERIAL_DEBUG -	printk("rs_hangup: called\n"); -#endif - -	state = info->state; +	struct serial_state *info = tty->driver_data;  	rs_flush_buffer(tty); -	if (info->flags & ASYNC_CLOSING) -		return; -	shutdown(info); - -	info->event = 0; -	state->count = 0; -	info->flags &= ~ASYNC_NORMAL_ACTIVE; -	info->tty = NULL; -	wake_up_interruptible(&info->open_wait); -} - - -static int get_async_struct(int line, struct async_struct **ret_info) -{ -	struct async_struct *info; -	struct serial_state *sstate; - -	sstate = rs_table + line; -	sstate->count++; -	if (sstate->info) { -		*ret_info = sstate->info; -		return 0; -	} -	info = kzalloc(sizeof(struct async_struct), GFP_KERNEL); -	if (!info) { -		sstate->count--; -		return -ENOMEM; -	} -	init_waitqueue_head(&info->open_wait); -	init_waitqueue_head(&info->close_wait); -	init_waitqueue_head(&info->delta_msr_wait); -	info->magic = SERIAL_MAGIC; -	info->port = sstate->port; -	info->flags = sstate->flags; -	info->xmit_fifo_size = sstate->xmit_fifo_size; -	info->line = line; -	INIT_WORK(&info->work, do_softint); -	info->state = sstate; -	if (sstate->info) { -		kfree(info); -		*ret_info = sstate->info; -		return 0; -	} -	*ret_info = sstate->info = info; -	return 0; +	tty_port_hangup(&info->port);  } -static int -startup(struct async_struct *info) +static int activate(struct tty_port *port, struct tty_struct *tty)  { -	unsigned long flags; -	int	retval=0; -	irq_handler_t handler; -	struct serial_state *state= info->state; -	unsigned long page; +	struct serial_state *state = container_of(port, struct serial_state, +			port); +	unsigned long flags, page; +	int retval = 0;  	page = get_zeroed_page(GFP_KERNEL);  	if (!page) @@ -674,86 +373,31 @@ startup(struct async_struct *info)  	local_irq_save(flags); -	if (info->flags & ASYNC_INITIALIZED) { -		free_page(page); -		goto errout; -	} - -	if (!state->port || !state->type) { -		if (info->tty) set_bit(TTY_IO_ERROR, &info->tty->flags); -		free_page(page); -		goto errout; -	} -	if (info->xmit.buf) +	if (state->xmit.buf)  		free_page(page);  	else -		info->xmit.buf = (unsigned char *) page; +		state->xmit.buf = (unsigned char *) page; -#ifdef SIMSERIAL_DEBUG -	printk("startup: ttys%d (irq %d)...", info->line, state->irq); -#endif - -	/* -	 * Allocate the IRQ if necessary -	 */ -	if (state->irq && (!IRQ_ports[state->irq] || -			  !IRQ_ports[state->irq]->next_port)) { -		if (IRQ_ports[state->irq]) { -			retval = -EBUSY; -			goto errout; -		} else -			handler = rs_interrupt_single; - -		retval = request_irq(state->irq, handler, IRQ_T(info), "simserial", NULL); -		if (retval) { -			if (capable(CAP_SYS_ADMIN)) { -				if (info->tty) -					set_bit(TTY_IO_ERROR, -						&info->tty->flags); -				retval = 0; -			} +	if (state->irq) { +		retval = request_irq(state->irq, rs_interrupt_single, 0, +				"simserial", state); +		if (retval)  			goto errout; -		}  	} -	/* -	 * Insert serial port into IRQ chain. -	 */ -	info->prev_port = NULL; -	info->next_port = IRQ_ports[state->irq]; -	if (info->next_port) -		info->next_port->prev_port = info; -	IRQ_ports[state->irq] = info; - -	if (info->tty) clear_bit(TTY_IO_ERROR, &info->tty->flags); - -	info->xmit.head = info->xmit.tail = 0; - -#if 0 -	/* -	 * Set up serial timers... -	 */ -	timer_table[RS_TIMER].expires = jiffies + 2*HZ/100; -	timer_active |= 1 << RS_TIMER; -#endif +	state->xmit.head = state->xmit.tail = 0;  	/*  	 * Set up the tty->alt_speed kludge  	 */ -	if (info->tty) { -		if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) -			info->tty->alt_speed = 57600; -		if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) -			info->tty->alt_speed = 115200; -		if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI) -			info->tty->alt_speed = 230400; -		if ((info->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP) -			info->tty->alt_speed = 460800; -	} - -	info->flags |= ASYNC_INITIALIZED; -	local_irq_restore(flags); -	return 0; +	if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) +		tty->alt_speed = 57600; +	if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_VHI) +		tty->alt_speed = 115200; +	if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_SHI) +		tty->alt_speed = 230400; +	if ((port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_WARP) +		tty->alt_speed = 460800;  errout:  	local_irq_restore(flags); @@ -769,56 +413,11 @@ errout:   */  static int rs_open(struct tty_struct *tty, struct file * filp)  { -	struct async_struct	*info; -	int			retval, line; -	unsigned long		page; +	struct serial_state *info = rs_table + tty->index; +	struct tty_port *port = &info->port; -	line = tty->index; -	if ((line < 0) || (line >= NR_PORTS)) -		return -ENODEV; -	retval = get_async_struct(line, &info); -	if (retval) -		return retval;  	tty->driver_data = info; -	info->tty = tty; - -#ifdef SIMSERIAL_DEBUG -	printk("rs_open %s, count = %d\n", tty->name, info->state->count); -#endif -	info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0; - -	if (!tmp_buf) { -		page = get_zeroed_page(GFP_KERNEL); -		if (!page) -			return -ENOMEM; -		if (tmp_buf) -			free_page(page); -		else -			tmp_buf = (unsigned char *) page; -	} - -	/* -	 * If the port is the middle of closing, bail out now -	 */ -	if (tty_hung_up_p(filp) || -	    (info->flags & ASYNC_CLOSING)) { -		if (info->flags & ASYNC_CLOSING) -			interruptible_sleep_on(&info->close_wait); -#ifdef SERIAL_DO_RESTART -		return ((info->flags & ASYNC_HUP_NOTIFY) ? -			-EAGAIN : -ERESTARTSYS); -#else -		return -EAGAIN; -#endif -	} - -	/* -	 * Start up serial port -	 */ -	retval = startup(info); -	if (retval) { -		return retval; -	} +	port->low_latency = (port->flags & ASYNC_LOW_LATENCY) ? 1 : 0;  	/*  	 * figure out which console to use (should be one already) @@ -829,30 +428,21 @@ static int rs_open(struct tty_struct *tty, struct file * filp)  		console = console->next;  	} -#ifdef SIMSERIAL_DEBUG -	printk("rs_open ttys%d successful\n", info->line); -#endif -	return 0; +	return tty_port_open(port, tty, filp);  }  /*   * /proc fs routines....   */ -static inline void line_info(struct seq_file *m, struct serial_state *state) -{ -	seq_printf(m, "%d: uart:%s port:%lX irq:%d\n", -		       state->line, uart_config[state->type].name, -		       state->port, state->irq); -} -  static int rs_proc_show(struct seq_file *m, void *v)  {  	int i; -	seq_printf(m, "simserinfo:1.0 driver:%s\n", serial_version); +	seq_printf(m, "simserinfo:1.0\n");  	for (i = 0; i < NR_PORTS; i++) -		line_info(m, &rs_table[i]); +		seq_printf(m, "%d: uart:16550 port:3F8 irq:%d\n", +		       i, rs_table[i].irq);  	return 0;  } @@ -869,25 +459,6 @@ static const struct file_operations rs_proc_fops = {  	.release	= single_release,  }; -/* - * --------------------------------------------------------------------- - * rs_init() and friends - * - * rs_init() is called at boot-time to initialize the serial driver. - * --------------------------------------------------------------------- - */ - -/* - * This routine prints out the appropriate serial driver version - * number, and identifies which options were configured into this - * driver. - */ -static inline void show_serial_version(void) -{ -	printk(KERN_INFO "%s version %s with", serial_name, serial_version); -	printk(KERN_INFO " no serial options enabled\n"); -} -  static const struct tty_operations hp_ops = {  	.open = rs_open,  	.close = rs_close, @@ -901,35 +472,31 @@ static const struct tty_operations hp_ops = {  	.throttle = rs_throttle,  	.unthrottle = rs_unthrottle,  	.send_xchar = rs_send_xchar, -	.set_termios = rs_set_termios, -	.stop = rs_stop, -	.start = rs_start,  	.hangup = rs_hangup, -	.wait_until_sent = rs_wait_until_sent,  	.proc_fops = &rs_proc_fops,  }; -/* - * The serial driver boot-time initialization code! - */ -static int __init -simrs_init (void) +static const struct tty_port_operations hp_port_ops = { +	.activate = activate, +	.shutdown = shutdown, +}; + +static int __init simrs_init(void)  { -	int			i, rc; -	struct serial_state	*state; +	struct serial_state *state; +	int retval;  	if (!ia64_platform_is("hpsim"))  		return -ENODEV; -	hp_simserial_driver = alloc_tty_driver(1); +	hp_simserial_driver = alloc_tty_driver(NR_PORTS);  	if (!hp_simserial_driver)  		return -ENOMEM; -	show_serial_version(); +	printk(KERN_INFO "SimSerial driver with no serial options enabled\n");  	/* Initialize the tty_driver structure */ -	hp_simserial_driver->owner = THIS_MODULE;  	hp_simserial_driver->driver_name = "simserial";  	hp_simserial_driver->name = "ttyS";  	hp_simserial_driver->major = TTY_MAJOR; @@ -942,31 +509,35 @@ simrs_init (void)  	hp_simserial_driver->flags = TTY_DRIVER_REAL_RAW;  	tty_set_operations(hp_simserial_driver, &hp_ops); -	/* -	 * Let's have a little bit of fun ! -	 */ -	for (i = 0, state = rs_table; i < NR_PORTS; i++,state++) { +	state = rs_table; +	tty_port_init(&state->port); +	state->port.ops = &hp_port_ops; +	state->port.close_delay = 0; /* XXX really 0? */ -		if (state->type == PORT_UNKNOWN) continue; +	retval = hpsim_get_irq(KEYBOARD_INTR); +	if (retval < 0) { +		printk(KERN_ERR "%s: out of interrupt vectors!\n", +				__func__); +		goto err_free_tty; +	} -		if (!state->irq) { -			if ((rc = assign_irq_vector(AUTO_ASSIGN)) < 0) -				panic("%s: out of interrupt vectors!\n", -				      __func__); -			state->irq = rc; -			ia64_ssc_connect_irq(KEYBOARD_INTR, state->irq); -		} +	state->irq = retval; -		printk(KERN_INFO "ttyS%d at 0x%04lx (irq = %d) is a %s\n", -		       state->line, -		       state->port, state->irq, -		       uart_config[state->type].name); -	} +	/* the port is imaginary */ +	printk(KERN_INFO "ttyS0 at 0x03f8 (irq = %d) is a 16550\n", state->irq); -	if (tty_register_driver(hp_simserial_driver)) -		panic("Couldn't register simserial driver\n"); +	tty_port_link_device(&state->port, hp_simserial_driver, 0); +	retval = tty_register_driver(hp_simserial_driver); +	if (retval) { +		printk(KERN_ERR "Couldn't register simserial driver\n"); +		goto err_free_tty; +	}  	return 0; +err_free_tty: +	put_tty_driver(hp_simserial_driver); +	tty_port_destroy(&state->port); +	return retval;  }  #ifndef MODULE diff --git a/arch/ia64/include/asm/Kbuild b/arch/ia64/include/asm/Kbuild index 241d1c53ba6..0da4aa2602a 100644 --- a/arch/ia64/include/asm/Kbuild +++ b/arch/ia64/include/asm/Kbuild @@ -1,14 +1,9 @@ -include include/asm-generic/Kbuild.asm -header-y += break.h -header-y += fpu.h -header-y += gcc_intrin.h -header-y += ia64regs.h -header-y += intel_intrin.h -header-y += intrinsics.h -header-y += perfmon.h -header-y += perfmon_default_smpl.h -header-y += ptrace_offsets.h -header-y += rse.h -header-y += ucontext.h -header-y += ustack.h +generic-y += clkdev.h +generic-y += exec.h +generic-y += hash.h +generic-y += kvm_para.h +generic-y += mcs_spinlock.h +generic-y += preempt.h +generic-y += trace_clock.h +generic-y += vtime.h diff --git a/arch/ia64/include/asm/acenv.h b/arch/ia64/include/asm/acenv.h new file mode 100644 index 00000000000..3f9eaeec987 --- /dev/null +++ b/arch/ia64/include/asm/acenv.h @@ -0,0 +1,56 @@ +/* + * IA64 specific ACPICA environments and implementation + * + * Copyright (C) 2014, Intel Corporation + *   Author: Lv Zheng <lv.zheng@intel.com> + * + * 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. + */ + +#ifndef _ASM_IA64_ACENV_H +#define _ASM_IA64_ACENV_H + +#include <asm/intrinsics.h> + +#define COMPILER_DEPENDENT_INT64	long +#define COMPILER_DEPENDENT_UINT64	unsigned long + +/* Asm macros */ + +#ifdef CONFIG_ACPI + +static inline int +ia64_acpi_acquire_global_lock(unsigned int *lock) +{ +	unsigned int old, new, val; +	do { +		old = *lock; +		new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1)); +		val = ia64_cmpxchg4_acq(lock, new, old); +	} while (unlikely (val != old)); +	return (new < 3) ? -1 : 0; +} + +static inline int +ia64_acpi_release_global_lock(unsigned int *lock) +{ +	unsigned int old, new, val; +	do { +		old = *lock; +		new = old & ~0x3; +		val = ia64_cmpxchg4_acq(lock, new, old); +	} while (unlikely (val != old)); +	return old & 0x1; +} + +#define ACPI_ACQUIRE_GLOBAL_LOCK(facs, Acq)				\ +	((Acq) = ia64_acpi_acquire_global_lock(&facs->global_lock)) + +#define ACPI_RELEASE_GLOBAL_LOCK(facs, Acq)				\ +	((Acq) = ia64_acpi_release_global_lock(&facs->global_lock)) + +#endif + +#endif /* _ASM_IA64_ACENV_H */ diff --git a/arch/ia64/include/asm/acpi.h b/arch/ia64/include/asm/acpi.h index 837dc82a013..75dc59a793d 100644 --- a/arch/ia64/include/asm/acpi.h +++ b/arch/ia64/include/asm/acpi.h @@ -32,64 +32,10 @@  #include <linux/init.h>  #include <linux/numa.h> -#include <asm/system.h>  #include <asm/numa.h> -#define COMPILER_DEPENDENT_INT64	long -#define COMPILER_DEPENDENT_UINT64	unsigned long - -/* - * Calling conventions: - * - * ACPI_SYSTEM_XFACE        - Interfaces to host OS (handlers, threads) - * ACPI_EXTERNAL_XFACE      - External ACPI interfaces - * ACPI_INTERNAL_XFACE      - Internal ACPI interfaces - * ACPI_INTERNAL_VAR_XFACE  - Internal variable-parameter list interfaces - */ -#define ACPI_SYSTEM_XFACE -#define ACPI_EXTERNAL_XFACE -#define ACPI_INTERNAL_XFACE -#define ACPI_INTERNAL_VAR_XFACE - -/* Asm macros */ - -#define ACPI_ASM_MACROS -#define BREAKPOINT3 -#define ACPI_DISABLE_IRQS() local_irq_disable() -#define ACPI_ENABLE_IRQS()  local_irq_enable() -#define ACPI_FLUSH_CPU_CACHE() - -static inline int -ia64_acpi_acquire_global_lock (unsigned int *lock) -{ -	unsigned int old, new, val; -	do { -		old = *lock; -		new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1)); -		val = ia64_cmpxchg4_acq(lock, new, old); -	} while (unlikely (val != old)); -	return (new < 3) ? -1 : 0; -} - -static inline int -ia64_acpi_release_global_lock (unsigned int *lock) -{ -	unsigned int old, new, val; -	do { -		old = *lock; -		new = old & ~0x3; -		val = ia64_cmpxchg4_acq(lock, new, old); -	} while (unlikely (val != old)); -	return old & 0x1; -} - -#define ACPI_ACQUIRE_GLOBAL_LOCK(facs, Acq)				\ -	((Acq) = ia64_acpi_acquire_global_lock(&facs->global_lock)) - -#define ACPI_RELEASE_GLOBAL_LOCK(facs, Acq)				\ -	((Acq) = ia64_acpi_release_global_lock(&facs->global_lock)) -  #ifdef	CONFIG_ACPI +extern int acpi_lapic;  #define acpi_disabled 0	/* ACPI always enabled on IA64 */  #define acpi_noirq 0	/* ACPI always enabled on IA64 */  #define acpi_pci_disabled 0 /* ACPI PCI always enabled on IA64 */ @@ -97,7 +43,6 @@ ia64_acpi_release_global_lock (unsigned int *lock)  #endif  #define acpi_processor_cstate_check(x) (x) /* no idle limits on IA64 :) */  static inline void disable_acpi(void) { } -static inline void pci_acpi_crs_quirks(void) { }  #ifdef CONFIG_IA64_GENERIC  const char *acpi_get_sysname (void); @@ -116,8 +61,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 @@ -128,9 +71,9 @@ static inline const char *acpi_get_sysname (void)  int acpi_request_vector (u32 int_type);  int acpi_gsi_to_irq (u32 gsi, unsigned int *irq); -/* routines for saving/restoring kernel state */ -extern int acpi_save_state_mem(void); -extern void acpi_restore_state_mem(void); +/* Low-level suspend routine. */ +extern int acpi_suspend_lowlevel(void); +  extern unsigned long acpi_wakeup_address;  /* @@ -154,7 +97,7 @@ extern int additional_cpus;  #else  #define MAX_PXM_DOMAINS (256)  #endif -extern int __devinitdata pxm_to_nid_map[MAX_PXM_DOMAINS]; +extern int pxm_to_nid_map[MAX_PXM_DOMAINS];  extern int __initdata nid_to_pxm_map[MAX_NUMNODES];  #endif diff --git a/arch/ia64/include/asm/atomic.h b/arch/ia64/include/asm/atomic.h index 44688143967..0f8bf48dadf 100644 --- a/arch/ia64/include/asm/atomic.h +++ b/arch/ia64/include/asm/atomic.h @@ -15,11 +15,11 @@  #include <linux/types.h>  #include <asm/intrinsics.h> -#include <asm/system.h> +#include <asm/barrier.h> -#define ATOMIC_INIT(i)		((atomic_t) { (i) }) -#define ATOMIC64_INIT(i)	((atomic64_t) { (i) }) +#define ATOMIC_INIT(i)		{ (i) } +#define ATOMIC64_INIT(i)	{ (i) }  #define atomic_read(v)		(*(volatile int *)&(v)->counter)  #define atomic64_read(v)	(*(volatile long *)&(v)->counter) @@ -90,7 +90,7 @@ ia64_atomic64_sub (__s64 i, atomic64_t *v)  	(cmpxchg(&((v)->counter), old, new))  #define atomic64_xchg(v, new) (xchg(&((v)->counter), new)) -static __inline__ int atomic_add_unless(atomic_t *v, int a, int u) +static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u)  {  	int c, old;  	c = atomic_read(v); @@ -102,10 +102,9 @@ static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)  			break;  		c = old;  	} -	return c != (u); +	return c;  } -#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)  static __inline__ long atomic64_add_unless(atomic64_t *v, long a, long u)  { @@ -210,11 +209,4 @@ atomic64_add_negative (__s64 i, atomic64_t *v)  #define atomic64_inc(v)			atomic64_add(1, (v))  #define atomic64_dec(v)			atomic64_sub(1, (v)) -/* Atomic operations are already serializing */ -#define smp_mb__before_atomic_dec()	barrier() -#define smp_mb__after_atomic_dec()	barrier() -#define smp_mb__before_atomic_inc()	barrier() -#define smp_mb__after_atomic_inc()	barrier() - -#include <asm-generic/atomic-long.h>  #endif /* _ASM_IA64_ATOMIC_H */ diff --git a/arch/ia64/include/asm/barrier.h b/arch/ia64/include/asm/barrier.h new file mode 100644 index 00000000000..a48957c7b44 --- /dev/null +++ b/arch/ia64/include/asm/barrier.h @@ -0,0 +1,94 @@ +/* + * Memory barrier definitions.  This is based on information published + * in the Processor Abstraction Layer and the System Abstraction Layer + * manual. + * + * Copyright (C) 1998-2003 Hewlett-Packard Co + *	David Mosberger-Tang <davidm@hpl.hp.com> + * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com> + * Copyright (C) 1999 Don Dugger <don.dugger@intel.com> + */ +#ifndef _ASM_IA64_BARRIER_H +#define _ASM_IA64_BARRIER_H + +#include <linux/compiler.h> + +/* + * Macros to force memory ordering.  In these descriptions, "previous" + * and "subsequent" refer to program order; "visible" means that all + * architecturally visible effects of a memory access have occurred + * (at a minimum, this means the memory has been read or written). + * + *   wmb():	Guarantees that all preceding stores to memory- + *		like regions are visible before any subsequent + *		stores and that all following stores will be + *		visible only after all previous stores. + *   rmb():	Like wmb(), but for reads. + *   mb():	wmb()/rmb() combo, i.e., all previous memory + *		accesses are visible before all subsequent + *		accesses and vice versa.  This is also known as + *		a "fence." + * + * Note: "mb()" and its variants cannot be used as a fence to order + * accesses to memory mapped I/O registers.  For that, mf.a needs to + * be used.  However, we don't want to always use mf.a because (a) + * it's (presumably) much slower than mf and (b) mf.a is supported for + * sequential memory pages only. + */ +#define mb()	ia64_mf() +#define rmb()	mb() +#define wmb()	mb() +#define read_barrier_depends()	do { } while(0) + +#ifdef CONFIG_SMP +# define smp_mb()	mb() +# define smp_rmb()	rmb() +# define smp_wmb()	wmb() +# define smp_read_barrier_depends()	read_barrier_depends() + +#else + +# define smp_mb()	barrier() +# define smp_rmb()	barrier() +# define smp_wmb()	barrier() +# define smp_read_barrier_depends()	do { } while(0) + +#endif + +#define smp_mb__before_atomic()	barrier() +#define smp_mb__after_atomic()	barrier() + +/* + * IA64 GCC turns volatile stores into st.rel and volatile loads into ld.acq no + * need for asm trickery! + */ + +#define smp_store_release(p, v)						\ +do {									\ +	compiletime_assert_atomic_type(*p);				\ +	barrier();							\ +	ACCESS_ONCE(*p) = (v);						\ +} while (0) + +#define smp_load_acquire(p)						\ +({									\ +	typeof(*p) ___p1 = ACCESS_ONCE(*p);				\ +	compiletime_assert_atomic_type(*p);				\ +	barrier();							\ +	___p1;								\ +}) + +/* + * XXX check on this ---I suspect what Linus really wants here is + * acquire vs release semantics but we can't discuss this stuff with + * Linus just yet.  Grrr... + */ +#define set_mb(var, value)	do { (var) = (value); mb(); } while (0) + +/* + * The group barrier in front of the rsm & ssm are necessary to ensure + * that none of the previous instructions in the same group are + * affected by the rsm/ssm. + */ + +#endif /* _ASM_IA64_BARRIER_H */ diff --git a/arch/ia64/include/asm/bitops.h b/arch/ia64/include/asm/bitops.h index 9da3df6f1a5..71e8145243e 100644 --- a/arch/ia64/include/asm/bitops.h +++ b/arch/ia64/include/asm/bitops.h @@ -16,6 +16,7 @@  #include <linux/compiler.h>  #include <linux/types.h>  #include <asm/intrinsics.h> +#include <asm/barrier.h>  /**   * set_bit - Atomically set a bit in memory @@ -65,12 +66,6 @@ __set_bit (int nr, volatile void *addr)  	*((__u32 *) addr + (nr >> 5)) |= (1 << (nr & 31));  } -/* - * clear_bit() has "acquire" semantics. - */ -#define smp_mb__before_clear_bit()	smp_mb() -#define smp_mb__after_clear_bit()	do { /* skip */; } while (0) -  /**   * clear_bit - Clears a bit in memory   * @nr: Bit to clear @@ -78,7 +73,7 @@ __set_bit (int nr, volatile void *addr)   *   * clear_bit() is atomic and may not be reordered.  However, it does   * not contain a memory barrier, so if it is used for locking purposes, - * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit() + * you should call smp_mb__before_atomic() and/or smp_mb__after_atomic()   * in order to ensure changes are visible on other processors.   */  static __inline__ void @@ -425,13 +420,7 @@ __fls (unsigned long x)  #include <asm-generic/bitops/fls64.h> -/* - * ffs: find first bit set. This is defined the same way as the libc and - * compiler builtin ffs routines, therefore differs in spirit from the above - * ffz (man ffs): it operates on "int" values only and the result value is the - * bit number + 1.  ffs(0) is defined to return zero. - */ -#define ffs(x)	__builtin_ffs(x) +#include <asm-generic/bitops/builtin-ffs.h>  /*   * hweightN: returns the hamming weight (i.e. the number @@ -456,12 +445,10 @@ static __inline__ unsigned long __arch_hweight64(unsigned long x)  #ifdef __KERNEL__ -#include <asm-generic/bitops/ext2-non-atomic.h> +#include <asm-generic/bitops/le.h> -#define ext2_set_bit_atomic(l,n,a)	test_and_set_bit(n,a) -#define ext2_clear_bit_atomic(l,n,a)	test_and_clear_bit(n,a) +#include <asm-generic/bitops/ext2-atomic-setbit.h> -#include <asm-generic/bitops/minix.h>  #include <asm-generic/bitops/sched.h>  #endif /* __KERNEL__ */ diff --git a/arch/ia64/include/asm/clocksource.h b/arch/ia64/include/asm/clocksource.h new file mode 100644 index 00000000000..5c8596e4cb0 --- /dev/null +++ b/arch/ia64/include/asm/clocksource.h @@ -0,0 +1,10 @@ +/* IA64-specific clocksource additions */ + +#ifndef _ASM_IA64_CLOCKSOURCE_H +#define _ASM_IA64_CLOCKSOURCE_H + +struct arch_clocksource_data { +	void *fsys_mmio;        /* used by fsyscall asm code */ +}; + +#endif /* _ASM_IA64_CLOCKSOURCE_H */ diff --git a/arch/ia64/include/asm/cputime.h b/arch/ia64/include/asm/cputime.h index 6073b187528..e2d3f5baf26 100644 --- a/arch/ia64/include/asm/cputime.h +++ b/arch/ia64/include/asm/cputime.h @@ -11,100 +11,19 @@   * as published by the Free Software Foundation; either version   * 2 of the License, or (at your option) any later version.   * - * If we have CONFIG_VIRT_CPU_ACCOUNTING, we measure cpu time in nsec. + * If we have CONFIG_VIRT_CPU_ACCOUNTING_NATIVE, we measure cpu time in nsec.   * Otherwise we measure cpu time in jiffies using the generic definitions.   */  #ifndef __IA64_CPUTIME_H  #define __IA64_CPUTIME_H -#ifndef CONFIG_VIRT_CPU_ACCOUNTING -#include <asm-generic/cputime.h> +#ifndef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE +# include <asm-generic/cputime.h>  #else +# include <asm/processor.h> +# include <asm-generic/cputime_nsecs.h> +extern void arch_vtime_task_switch(struct task_struct *tsk); +#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */ -#include <linux/time.h> -#include <linux/jiffies.h> -#include <asm/processor.h> - -typedef u64 cputime_t; -typedef u64 cputime64_t; - -#define cputime_zero			((cputime_t)0) -#define cputime_one_jiffy		jiffies_to_cputime(1) -#define cputime_max			((~((cputime_t)0) >> 1) - 1) -#define cputime_add(__a, __b)		((__a) +  (__b)) -#define cputime_sub(__a, __b)		((__a) -  (__b)) -#define cputime_div(__a, __n)		((__a) /  (__n)) -#define cputime_halve(__a)		((__a) >> 1) -#define cputime_eq(__a, __b)		((__a) == (__b)) -#define cputime_gt(__a, __b)		((__a) >  (__b)) -#define cputime_ge(__a, __b)		((__a) >= (__b)) -#define cputime_lt(__a, __b)		((__a) <  (__b)) -#define cputime_le(__a, __b)		((__a) <= (__b)) - -#define cputime64_zero			((cputime64_t)0) -#define cputime64_add(__a, __b)		((__a) + (__b)) -#define cputime64_sub(__a, __b)		((__a) - (__b)) -#define cputime_to_cputime64(__ct)	(__ct) - -/* - * Convert cputime <-> jiffies (HZ) - */ -#define cputime_to_jiffies(__ct)	((__ct) / (NSEC_PER_SEC / HZ)) -#define jiffies_to_cputime(__jif)	((__jif) * (NSEC_PER_SEC / HZ)) -#define cputime64_to_jiffies64(__ct)	((__ct) / (NSEC_PER_SEC / HZ)) -#define jiffies64_to_cputime64(__jif)	((__jif) * (NSEC_PER_SEC / HZ)) - -/* - * Convert cputime <-> microseconds - */ -#define cputime_to_usecs(__ct)		((__ct) / NSEC_PER_USEC) -#define usecs_to_cputime(__usecs)	((__usecs) * NSEC_PER_USEC) - -/* - * Convert cputime <-> seconds - */ -#define cputime_to_secs(__ct)		((__ct) / NSEC_PER_SEC) -#define secs_to_cputime(__secs)		((__secs) * NSEC_PER_SEC) - -/* - * Convert cputime <-> timespec (nsec) - */ -static inline cputime_t timespec_to_cputime(const struct timespec *val) -{ -	cputime_t ret = val->tv_sec * NSEC_PER_SEC; -	return (ret + val->tv_nsec); -} -static inline void cputime_to_timespec(const cputime_t ct, struct timespec *val) -{ -	val->tv_sec  = ct / NSEC_PER_SEC; -	val->tv_nsec = ct % NSEC_PER_SEC; -} - -/* - * Convert cputime <-> timeval (msec) - */ -static inline cputime_t timeval_to_cputime(struct timeval *val) -{ -	cputime_t ret = val->tv_sec * NSEC_PER_SEC; -	return (ret + val->tv_usec * NSEC_PER_USEC); -} -static inline void cputime_to_timeval(const cputime_t ct, struct timeval *val) -{ -	val->tv_sec = ct / NSEC_PER_SEC; -	val->tv_usec = (ct % NSEC_PER_SEC) / NSEC_PER_USEC; -} - -/* - * Convert cputime <-> clock (USER_HZ) - */ -#define cputime_to_clock_t(__ct)	((__ct) / (NSEC_PER_SEC / USER_HZ)) -#define clock_t_to_cputime(__x)		((__x) * (NSEC_PER_SEC / USER_HZ)) - -/* - * Convert cputime64 to clock. - */ -#define cputime64_to_clock_t(__ct)      cputime_to_clock_t((cputime_t)__ct) - -#endif /* CONFIG_VIRT_CPU_ACCOUNTING */  #endif /* __IA64_CPUTIME_H */ diff --git a/arch/ia64/include/asm/device.h b/arch/ia64/include/asm/device.h index d66d446b127..f69c32ffbe6 100644 --- a/arch/ia64/include/asm/device.h +++ b/arch/ia64/include/asm/device.h @@ -7,10 +7,7 @@  #define _ASM_IA64_DEVICE_H  struct dev_archdata { -#ifdef CONFIG_ACPI -	void	*acpi_handle; -#endif -#ifdef CONFIG_DMAR +#ifdef CONFIG_INTEL_IOMMU  	void *iommu; /* hook for IOMMU specific extension */  #endif  }; diff --git a/arch/ia64/include/asm/dma-mapping.h b/arch/ia64/include/asm/dma-mapping.h index a2e7368a015..cf3ab7e784b 100644 --- a/arch/ia64/include/asm/dma-mapping.h +++ b/arch/ia64/include/asm/dma-mapping.h @@ -12,6 +12,8 @@  #define ARCH_HAS_DMA_GET_REQUIRED_MASK +#define DMA_ERROR_CODE 0 +  extern struct dma_map_ops *dma_ops;  extern struct ia64_machine_vector ia64_mv;  extern void set_iommu_machvec(void); @@ -21,23 +23,29 @@ extern void machvec_dma_sync_single(struct device *, dma_addr_t, size_t,  extern void machvec_dma_sync_sg(struct device *, struct scatterlist *, int,  				enum dma_data_direction); -static inline void *dma_alloc_coherent(struct device *dev, size_t size, -				       dma_addr_t *daddr, gfp_t gfp) +#define dma_alloc_coherent(d,s,h,f)	dma_alloc_attrs(d,s,h,f,NULL) + +static inline void *dma_alloc_attrs(struct device *dev, size_t size, +				    dma_addr_t *daddr, gfp_t gfp, +				    struct dma_attrs *attrs)  {  	struct dma_map_ops *ops = platform_dma_get_ops(dev);  	void *caddr; -	caddr = ops->alloc_coherent(dev, size, daddr, gfp); +	caddr = ops->alloc(dev, size, daddr, gfp, attrs);  	debug_dma_alloc_coherent(dev, size, *daddr, caddr);  	return caddr;  } -static inline void dma_free_coherent(struct device *dev, size_t size, -				     void *caddr, dma_addr_t daddr) +#define dma_free_coherent(d,s,c,h) dma_free_attrs(d,s,c,h,NULL) + +static inline void dma_free_attrs(struct device *dev, size_t size, +				  void *caddr, dma_addr_t daddr, +				  struct dma_attrs *attrs)  {  	struct dma_map_ops *ops = platform_dma_get_ops(dev);  	debug_dma_free_coherent(dev, size, caddr, daddr); -	ops->free_coherent(dev, size, caddr, daddr); +	ops->free(dev, size, caddr, daddr, attrs);  }  #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) @@ -50,6 +58,7 @@ static inline void dma_free_coherent(struct device *dev, size_t size,  static inline int dma_mapping_error(struct device *dev, dma_addr_t daddr)  {  	struct dma_map_ops *ops = platform_dma_get_ops(dev); +	debug_dma_mapping_error(dev, daddr);  	return ops->mapping_error(dev, daddr);  } diff --git a/arch/ia64/include/asm/dmi.h b/arch/ia64/include/asm/dmi.h index 1ed4c8fedb8..f365a61f5c7 100644 --- a/arch/ia64/include/asm/dmi.h +++ b/arch/ia64/include/asm/dmi.h @@ -5,8 +5,10 @@  #include <asm/io.h>  /* Use normal IO mappings for DMI */ -#define dmi_ioremap ioremap -#define dmi_iounmap(x,l) iounmap(x) -#define dmi_alloc(l) kmalloc(l, GFP_ATOMIC) +#define dmi_early_remap		ioremap +#define dmi_early_unmap(x, l)	iounmap(x) +#define dmi_remap		ioremap +#define dmi_unmap		iounmap +#define dmi_alloc(l)		kzalloc(l, GFP_ATOMIC)  #endif diff --git a/arch/ia64/include/asm/elf.h b/arch/ia64/include/asm/elf.h index b5298eb09ad..5a83c5cc3dc 100644 --- a/arch/ia64/include/asm/elf.h +++ b/arch/ia64/include/asm/elf.h @@ -201,9 +201,6 @@ extern void ia64_elf_core_copy_regs (struct pt_regs *src, elf_gregset_t dst);     relevant until we have real hardware to play with... */  #define ELF_PLATFORM	NULL -#define SET_PERSONALITY(ex)	\ -	set_personality((current->personality & ~PER_MASK) | PER_LINUX) -  #define elf_read_implies_exec(ex, executable_stack)					\  	((executable_stack!=EXSTACK_DISABLE_X) && ((ex).e_flags & EF_IA_64_LINUX_EXECUTABLE_STACK) != 0) diff --git a/arch/ia64/include/asm/futex.h b/arch/ia64/include/asm/futex.h index c7f0f062239..76acbcd5c06 100644 --- a/arch/ia64/include/asm/futex.h +++ b/arch/ia64/include/asm/futex.h @@ -4,7 +4,6 @@  #include <linux/futex.h>  #include <linux/uaccess.h>  #include <asm/errno.h> -#include <asm/system.h>  #define __futex_atomic_op1(insn, ret, oldval, uaddr, oparg) \  do {									\ @@ -46,7 +45,7 @@ do {									\  } while (0)  static inline int -futex_atomic_op_inuser (int encoded_op, int __user *uaddr) +futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr)  {  	int op = (encoded_op >> 28) & 7;  	int cmp = (encoded_op >> 24) & 15; @@ -56,7 +55,7 @@ futex_atomic_op_inuser (int encoded_op, int __user *uaddr)  	if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))  		oparg = 1 << oparg; -	if (! access_ok (VERIFY_WRITE, uaddr, sizeof(int))) +	if (! access_ok (VERIFY_WRITE, uaddr, sizeof(u32)))  		return -EFAULT;  	pagefault_disable(); @@ -100,23 +99,26 @@ futex_atomic_op_inuser (int encoded_op, int __user *uaddr)  }  static inline int -futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) +futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, +			      u32 oldval, u32 newval)  { -	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) +	if (!access_ok(VERIFY_WRITE, uaddr, sizeof(u32)))  		return -EFAULT;  	{ -		register unsigned long r8 __asm ("r8"); +		register unsigned long r8 __asm ("r8") = 0; +		unsigned long prev;  		__asm__ __volatile__(  			"	mf;;					\n" -			"	mov ar.ccv=%3;;				\n" -			"[1:]	cmpxchg4.acq %0=[%1],%2,ar.ccv		\n" +			"	mov ar.ccv=%4;;				\n" +			"[1:]	cmpxchg4.acq %1=[%2],%3,ar.ccv		\n"  			"	.xdata4 \"__ex_table\", 1b-., 2f-.	\n"  			"[2:]" -			: "=r" (r8) +			: "+r" (r8), "=&r" (prev)  			: "r" (uaddr), "r" (newval),  			  "rO" ((long) (unsigned) oldval)  			: "memory"); +		*uval = prev;  		return r8;  	}  } diff --git a/arch/ia64/include/asm/gcc_intrin.h b/arch/ia64/include/asm/gcc_intrin.h index 21ddee54ada..f9495b1757a 100644 --- a/arch/ia64/include/asm/gcc_intrin.h +++ b/arch/ia64/include/asm/gcc_intrin.h @@ -1,621 +1,12 @@ -#ifndef _ASM_IA64_GCC_INTRIN_H -#define _ASM_IA64_GCC_INTRIN_H  /*   *   * Copyright (C) 2002,2003 Jun Nakajima <jun.nakajima@intel.com>   * Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@intel.com>   */ +#ifndef _ASM_IA64_GCC_INTRIN_H +#define _ASM_IA64_GCC_INTRIN_H -#include <linux/types.h> -#include <linux/compiler.h> - -/* define this macro to get some asm stmts included in 'c' files */ -#define ASM_SUPPORTED - -/* Optimization barrier */ -/* The "volatile" is due to gcc bugs */ -#define ia64_barrier()	asm volatile ("":::"memory") - -#define ia64_stop()	asm volatile (";;"::) - -#define ia64_invala_gr(regnum)	asm volatile ("invala.e r%0" :: "i"(regnum)) - -#define ia64_invala_fr(regnum)	asm volatile ("invala.e f%0" :: "i"(regnum)) - -#define ia64_flushrs() asm volatile ("flushrs;;":::"memory") - -#define ia64_loadrs() asm volatile ("loadrs;;":::"memory") - -extern void ia64_bad_param_for_setreg (void); -extern void ia64_bad_param_for_getreg (void); +#include <uapi/asm/gcc_intrin.h> -#ifdef __KERNEL__  register unsigned long ia64_r13 asm ("r13") __used; -#endif - -#define ia64_native_setreg(regnum, val)						\ -({										\ -	switch (regnum) {							\ -	    case _IA64_REG_PSR_L:						\ -		    asm volatile ("mov psr.l=%0" :: "r"(val) : "memory");	\ -		    break;							\ -	    case _IA64_REG_AR_KR0 ... _IA64_REG_AR_EC:				\ -		    asm volatile ("mov ar%0=%1" ::				\ -		    			  "i" (regnum - _IA64_REG_AR_KR0),	\ -					  "r"(val): "memory");			\ -		    break;							\ -	    case _IA64_REG_CR_DCR ... _IA64_REG_CR_LRR1:			\ -		    asm volatile ("mov cr%0=%1" ::				\ -				          "i" (regnum - _IA64_REG_CR_DCR),	\ -					  "r"(val): "memory" );			\ -		    break;							\ -	    case _IA64_REG_SP:							\ -		    asm volatile ("mov r12=%0" ::				\ -			    		  "r"(val): "memory");			\ -		    break;							\ -	    case _IA64_REG_GP:							\ -		    asm volatile ("mov gp=%0" :: "r"(val) : "memory");		\ -		break;								\ -	    default:								\ -		    ia64_bad_param_for_setreg();				\ -		    break;							\ -	}									\ -}) - -#define ia64_native_getreg(regnum)						\ -({										\ -	__u64 ia64_intri_res;							\ -										\ -	switch (regnum) {							\ -	case _IA64_REG_GP:							\ -		asm volatile ("mov %0=gp" : "=r"(ia64_intri_res));		\ -		break;								\ -	case _IA64_REG_IP:							\ -		asm volatile ("mov %0=ip" : "=r"(ia64_intri_res));		\ -		break;								\ -	case _IA64_REG_PSR:							\ -		asm volatile ("mov %0=psr" : "=r"(ia64_intri_res));		\ -		break;								\ -	case _IA64_REG_TP:	/* for current() */				\ -		ia64_intri_res = ia64_r13;					\ -		break;								\ -	case _IA64_REG_AR_KR0 ... _IA64_REG_AR_EC:				\ -		asm volatile ("mov %0=ar%1" : "=r" (ia64_intri_res)		\ -				      : "i"(regnum - _IA64_REG_AR_KR0));	\ -		break;								\ -	case _IA64_REG_CR_DCR ... _IA64_REG_CR_LRR1:				\ -		asm volatile ("mov %0=cr%1" : "=r" (ia64_intri_res)		\ -				      : "i" (regnum - _IA64_REG_CR_DCR));	\ -		break;								\ -	case _IA64_REG_SP:							\ -		asm volatile ("mov %0=sp" : "=r" (ia64_intri_res));		\ -		break;								\ -	default:								\ -		ia64_bad_param_for_getreg();					\ -		break;								\ -	}									\ -	ia64_intri_res;								\ -}) - -#define ia64_hint_pause 0 - -#define ia64_hint(mode)						\ -({								\ -	switch (mode) {						\ -	case ia64_hint_pause:					\ -		asm volatile ("hint @pause" ::: "memory");	\ -		break;						\ -	}							\ -}) - - -/* Integer values for mux1 instruction */ -#define ia64_mux1_brcst 0 -#define ia64_mux1_mix   8 -#define ia64_mux1_shuf  9 -#define ia64_mux1_alt  10 -#define ia64_mux1_rev  11 - -#define ia64_mux1(x, mode)							\ -({										\ -	__u64 ia64_intri_res;							\ -										\ -	switch (mode) {								\ -	case ia64_mux1_brcst:							\ -		asm ("mux1 %0=%1,@brcst" : "=r" (ia64_intri_res) : "r" (x));	\ -		break;								\ -	case ia64_mux1_mix:							\ -		asm ("mux1 %0=%1,@mix" : "=r" (ia64_intri_res) : "r" (x));	\ -		break;								\ -	case ia64_mux1_shuf:							\ -		asm ("mux1 %0=%1,@shuf" : "=r" (ia64_intri_res) : "r" (x));	\ -		break;								\ -	case ia64_mux1_alt:							\ -		asm ("mux1 %0=%1,@alt" : "=r" (ia64_intri_res) : "r" (x));	\ -		break;								\ -	case ia64_mux1_rev:							\ -		asm ("mux1 %0=%1,@rev" : "=r" (ia64_intri_res) : "r" (x));	\ -		break;								\ -	}									\ -	ia64_intri_res;								\ -}) - -#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) -# define ia64_popcnt(x)		__builtin_popcountl(x) -#else -# define ia64_popcnt(x)						\ -  ({								\ -	__u64 ia64_intri_res;					\ -	asm ("popcnt %0=%1" : "=r" (ia64_intri_res) : "r" (x));	\ -								\ -	ia64_intri_res;						\ -  }) -#endif - -#define ia64_getf_exp(x)					\ -({								\ -	long ia64_intri_res;					\ -								\ -	asm ("getf.exp %0=%1" : "=r"(ia64_intri_res) : "f"(x));	\ -								\ -	ia64_intri_res;						\ -}) - -#define ia64_shrp(a, b, count)								\ -({											\ -	__u64 ia64_intri_res;								\ -	asm ("shrp %0=%1,%2,%3" : "=r"(ia64_intri_res) : "r"(a), "r"(b), "i"(count));	\ -	ia64_intri_res;									\ -}) - -#define ia64_ldfs(regnum, x)					\ -({								\ -	register double __f__ asm ("f"#regnum);			\ -	asm volatile ("ldfs %0=[%1]" :"=f"(__f__): "r"(x));	\ -}) - -#define ia64_ldfd(regnum, x)					\ -({								\ -	register double __f__ asm ("f"#regnum);			\ -	asm volatile ("ldfd %0=[%1]" :"=f"(__f__): "r"(x));	\ -}) - -#define ia64_ldfe(regnum, x)					\ -({								\ -	register double __f__ asm ("f"#regnum);			\ -	asm volatile ("ldfe %0=[%1]" :"=f"(__f__): "r"(x));	\ -}) - -#define ia64_ldf8(regnum, x)					\ -({								\ -	register double __f__ asm ("f"#regnum);			\ -	asm volatile ("ldf8 %0=[%1]" :"=f"(__f__): "r"(x));	\ -}) - -#define ia64_ldf_fill(regnum, x)				\ -({								\ -	register double __f__ asm ("f"#regnum);			\ -	asm volatile ("ldf.fill %0=[%1]" :"=f"(__f__): "r"(x));	\ -}) - -#define ia64_st4_rel_nta(m, val)					\ -({									\ -	asm volatile ("st4.rel.nta [%0] = %1\n\t" :: "r"(m), "r"(val));	\ -}) - -#define ia64_stfs(x, regnum)						\ -({									\ -	register double __f__ asm ("f"#regnum);				\ -	asm volatile ("stfs [%0]=%1" :: "r"(x), "f"(__f__) : "memory");	\ -}) - -#define ia64_stfd(x, regnum)						\ -({									\ -	register double __f__ asm ("f"#regnum);				\ -	asm volatile ("stfd [%0]=%1" :: "r"(x), "f"(__f__) : "memory");	\ -}) - -#define ia64_stfe(x, regnum)						\ -({									\ -	register double __f__ asm ("f"#regnum);				\ -	asm volatile ("stfe [%0]=%1" :: "r"(x), "f"(__f__) : "memory");	\ -}) - -#define ia64_stf8(x, regnum)						\ -({									\ -	register double __f__ asm ("f"#regnum);				\ -	asm volatile ("stf8 [%0]=%1" :: "r"(x), "f"(__f__) : "memory");	\ -}) - -#define ia64_stf_spill(x, regnum)						\ -({										\ -	register double __f__ asm ("f"#regnum);					\ -	asm volatile ("stf.spill [%0]=%1" :: "r"(x), "f"(__f__) : "memory");	\ -}) - -#define ia64_fetchadd4_acq(p, inc)						\ -({										\ -										\ -	__u64 ia64_intri_res;							\ -	asm volatile ("fetchadd4.acq %0=[%1],%2"				\ -				: "=r"(ia64_intri_res) : "r"(p), "i" (inc)	\ -				: "memory");					\ -										\ -	ia64_intri_res;								\ -}) - -#define ia64_fetchadd4_rel(p, inc)						\ -({										\ -	__u64 ia64_intri_res;							\ -	asm volatile ("fetchadd4.rel %0=[%1],%2"				\ -				: "=r"(ia64_intri_res) : "r"(p), "i" (inc)	\ -				: "memory");					\ -										\ -	ia64_intri_res;								\ -}) - -#define ia64_fetchadd8_acq(p, inc)						\ -({										\ -										\ -	__u64 ia64_intri_res;							\ -	asm volatile ("fetchadd8.acq %0=[%1],%2"				\ -				: "=r"(ia64_intri_res) : "r"(p), "i" (inc)	\ -				: "memory");					\ -										\ -	ia64_intri_res;								\ -}) - -#define ia64_fetchadd8_rel(p, inc)						\ -({										\ -	__u64 ia64_intri_res;							\ -	asm volatile ("fetchadd8.rel %0=[%1],%2"				\ -				: "=r"(ia64_intri_res) : "r"(p), "i" (inc)	\ -				: "memory");					\ -										\ -	ia64_intri_res;								\ -}) - -#define ia64_xchg1(ptr,x)							\ -({										\ -	__u64 ia64_intri_res;							\ -	asm volatile ("xchg1 %0=[%1],%2"					\ -		      : "=r" (ia64_intri_res) : "r" (ptr), "r" (x) : "memory");	\ -	ia64_intri_res;								\ -}) - -#define ia64_xchg2(ptr,x)						\ -({									\ -	__u64 ia64_intri_res;						\ -	asm volatile ("xchg2 %0=[%1],%2" : "=r" (ia64_intri_res)	\ -		      : "r" (ptr), "r" (x) : "memory");			\ -	ia64_intri_res;							\ -}) - -#define ia64_xchg4(ptr,x)						\ -({									\ -	__u64 ia64_intri_res;						\ -	asm volatile ("xchg4 %0=[%1],%2" : "=r" (ia64_intri_res)	\ -		      : "r" (ptr), "r" (x) : "memory");			\ -	ia64_intri_res;							\ -}) - -#define ia64_xchg8(ptr,x)						\ -({									\ -	__u64 ia64_intri_res;						\ -	asm volatile ("xchg8 %0=[%1],%2" : "=r" (ia64_intri_res)	\ -		      : "r" (ptr), "r" (x) : "memory");			\ -	ia64_intri_res;							\ -}) - -#define ia64_cmpxchg1_acq(ptr, new, old)						\ -({											\ -	__u64 ia64_intri_res;								\ -	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ -	asm volatile ("cmpxchg1.acq %0=[%1],%2,ar.ccv":					\ -			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ -	ia64_intri_res;									\ -}) - -#define ia64_cmpxchg1_rel(ptr, new, old)						\ -({											\ -	__u64 ia64_intri_res;								\ -	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ -	asm volatile ("cmpxchg1.rel %0=[%1],%2,ar.ccv":					\ -			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ -	ia64_intri_res;									\ -}) - -#define ia64_cmpxchg2_acq(ptr, new, old)						\ -({											\ -	__u64 ia64_intri_res;								\ -	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ -	asm volatile ("cmpxchg2.acq %0=[%1],%2,ar.ccv":					\ -			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ -	ia64_intri_res;									\ -}) - -#define ia64_cmpxchg2_rel(ptr, new, old)						\ -({											\ -	__u64 ia64_intri_res;								\ -	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ -											\ -	asm volatile ("cmpxchg2.rel %0=[%1],%2,ar.ccv":					\ -			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ -	ia64_intri_res;									\ -}) - -#define ia64_cmpxchg4_acq(ptr, new, old)						\ -({											\ -	__u64 ia64_intri_res;								\ -	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ -	asm volatile ("cmpxchg4.acq %0=[%1],%2,ar.ccv":					\ -			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ -	ia64_intri_res;									\ -}) - -#define ia64_cmpxchg4_rel(ptr, new, old)						\ -({											\ -	__u64 ia64_intri_res;								\ -	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ -	asm volatile ("cmpxchg4.rel %0=[%1],%2,ar.ccv":					\ -			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ -	ia64_intri_res;									\ -}) - -#define ia64_cmpxchg8_acq(ptr, new, old)						\ -({											\ -	__u64 ia64_intri_res;								\ -	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ -	asm volatile ("cmpxchg8.acq %0=[%1],%2,ar.ccv":					\ -			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ -	ia64_intri_res;									\ -}) - -#define ia64_cmpxchg8_rel(ptr, new, old)						\ -({											\ -	__u64 ia64_intri_res;								\ -	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ -											\ -	asm volatile ("cmpxchg8.rel %0=[%1],%2,ar.ccv":					\ -			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ -	ia64_intri_res;									\ -}) - -#define ia64_mf()	asm volatile ("mf" ::: "memory") -#define ia64_mfa()	asm volatile ("mf.a" ::: "memory") - -#define ia64_invala() asm volatile ("invala" ::: "memory") - -#define ia64_native_thash(addr)							\ -({										\ -	unsigned long ia64_intri_res;						\ -	asm volatile ("thash %0=%1" : "=r"(ia64_intri_res) : "r" (addr));	\ -	ia64_intri_res;								\ -}) - -#define ia64_srlz_i()	asm volatile (";; srlz.i ;;" ::: "memory") -#define ia64_srlz_d()	asm volatile (";; srlz.d" ::: "memory"); - -#ifdef HAVE_SERIALIZE_DIRECTIVE -# define ia64_dv_serialize_data()		asm volatile (".serialize.data"); -# define ia64_dv_serialize_instruction()	asm volatile (".serialize.instruction"); -#else -# define ia64_dv_serialize_data() -# define ia64_dv_serialize_instruction() -#endif - -#define ia64_nop(x)	asm volatile ("nop %0"::"i"(x)); - -#define ia64_itci(addr)	asm volatile ("itc.i %0;;" :: "r"(addr) : "memory") - -#define ia64_itcd(addr)	asm volatile ("itc.d %0;;" :: "r"(addr) : "memory") - - -#define ia64_itri(trnum, addr) asm volatile ("itr.i itr[%0]=%1"				\ -					     :: "r"(trnum), "r"(addr) : "memory") - -#define ia64_itrd(trnum, addr) asm volatile ("itr.d dtr[%0]=%1"				\ -					     :: "r"(trnum), "r"(addr) : "memory") - -#define ia64_tpa(addr)								\ -({										\ -	unsigned long ia64_pa;							\ -	asm volatile ("tpa %0 = %1" : "=r"(ia64_pa) : "r"(addr) : "memory");	\ -	ia64_pa;								\ -}) - -#define __ia64_set_dbr(index, val)						\ -	asm volatile ("mov dbr[%0]=%1" :: "r"(index), "r"(val) : "memory") - -#define ia64_set_ibr(index, val)						\ -	asm volatile ("mov ibr[%0]=%1" :: "r"(index), "r"(val) : "memory") - -#define ia64_set_pkr(index, val)						\ -	asm volatile ("mov pkr[%0]=%1" :: "r"(index), "r"(val) : "memory") - -#define ia64_set_pmc(index, val)						\ -	asm volatile ("mov pmc[%0]=%1" :: "r"(index), "r"(val) : "memory") - -#define ia64_set_pmd(index, val)						\ -	asm volatile ("mov pmd[%0]=%1" :: "r"(index), "r"(val) : "memory") - -#define ia64_native_set_rr(index, val)							\ -	asm volatile ("mov rr[%0]=%1" :: "r"(index), "r"(val) : "memory"); - -#define ia64_native_get_cpuid(index)							\ -({											\ -	unsigned long ia64_intri_res;							\ -	asm volatile ("mov %0=cpuid[%r1]" : "=r"(ia64_intri_res) : "rO"(index));	\ -	ia64_intri_res;									\ -}) - -#define __ia64_get_dbr(index)							\ -({										\ -	unsigned long ia64_intri_res;						\ -	asm volatile ("mov %0=dbr[%1]" : "=r"(ia64_intri_res) : "r"(index));	\ -	ia64_intri_res;								\ -}) - -#define ia64_get_ibr(index)							\ -({										\ -	unsigned long ia64_intri_res;						\ -	asm volatile ("mov %0=ibr[%1]" : "=r"(ia64_intri_res) : "r"(index));	\ -	ia64_intri_res;								\ -}) - -#define ia64_get_pkr(index)							\ -({										\ -	unsigned long ia64_intri_res;						\ -	asm volatile ("mov %0=pkr[%1]" : "=r"(ia64_intri_res) : "r"(index));	\ -	ia64_intri_res;								\ -}) - -#define ia64_get_pmc(index)							\ -({										\ -	unsigned long ia64_intri_res;						\ -	asm volatile ("mov %0=pmc[%1]" : "=r"(ia64_intri_res) : "r"(index));	\ -	ia64_intri_res;								\ -}) - - -#define ia64_native_get_pmd(index)						\ -({										\ -	unsigned long ia64_intri_res;						\ -	asm volatile ("mov %0=pmd[%1]" : "=r"(ia64_intri_res) : "r"(index));	\ -	ia64_intri_res;								\ -}) - -#define ia64_native_get_rr(index)						\ -({										\ -	unsigned long ia64_intri_res;						\ -	asm volatile ("mov %0=rr[%1]" : "=r"(ia64_intri_res) : "r" (index));	\ -	ia64_intri_res;								\ -}) - -#define ia64_native_fc(addr)	asm volatile ("fc %0" :: "r"(addr) : "memory") - - -#define ia64_sync_i()	asm volatile (";; sync.i" ::: "memory") - -#define ia64_native_ssm(mask)	asm volatile ("ssm %0":: "i"((mask)) : "memory") -#define ia64_native_rsm(mask)	asm volatile ("rsm %0":: "i"((mask)) : "memory") -#define ia64_sum(mask)	asm volatile ("sum %0":: "i"((mask)) : "memory") -#define ia64_rum(mask)	asm volatile ("rum %0":: "i"((mask)) : "memory") - -#define ia64_ptce(addr)	asm volatile ("ptc.e %0" :: "r"(addr)) - -#define ia64_native_ptcga(addr, size)						\ -do {										\ -	asm volatile ("ptc.ga %0,%1" :: "r"(addr), "r"(size) : "memory");	\ -	ia64_dv_serialize_data();						\ -} while (0) - -#define ia64_ptcl(addr, size)							\ -do {										\ -	asm volatile ("ptc.l %0,%1" :: "r"(addr), "r"(size) : "memory");	\ -	ia64_dv_serialize_data();						\ -} while (0) - -#define ia64_ptri(addr, size)						\ -	asm volatile ("ptr.i %0,%1" :: "r"(addr), "r"(size) : "memory") - -#define ia64_ptrd(addr, size)						\ -	asm volatile ("ptr.d %0,%1" :: "r"(addr), "r"(size) : "memory") - -#define ia64_ttag(addr)							\ -({									  \ -	__u64 ia64_intri_res;						   \ -	asm volatile ("ttag %0=%1" : "=r"(ia64_intri_res) : "r" (addr));   \ -	ia64_intri_res;							 \ -}) - - -/* Values for lfhint in ia64_lfetch and ia64_lfetch_fault */ - -#define ia64_lfhint_none   0 -#define ia64_lfhint_nt1    1 -#define ia64_lfhint_nt2    2 -#define ia64_lfhint_nta    3 - -#define ia64_lfetch(lfhint, y)					\ -({								\ -        switch (lfhint) {					\ -        case ia64_lfhint_none:					\ -                asm volatile ("lfetch [%0]" : : "r"(y));	\ -                break;						\ -        case ia64_lfhint_nt1:					\ -                asm volatile ("lfetch.nt1 [%0]" : : "r"(y));	\ -                break;						\ -        case ia64_lfhint_nt2:					\ -                asm volatile ("lfetch.nt2 [%0]" : : "r"(y));	\ -                break;						\ -        case ia64_lfhint_nta:					\ -                asm volatile ("lfetch.nta [%0]" : : "r"(y));	\ -                break;						\ -        }							\ -}) - -#define ia64_lfetch_excl(lfhint, y)					\ -({									\ -        switch (lfhint) {						\ -        case ia64_lfhint_none:						\ -                asm volatile ("lfetch.excl [%0]" :: "r"(y));		\ -                break;							\ -        case ia64_lfhint_nt1:						\ -                asm volatile ("lfetch.excl.nt1 [%0]" :: "r"(y));	\ -                break;							\ -        case ia64_lfhint_nt2:						\ -                asm volatile ("lfetch.excl.nt2 [%0]" :: "r"(y));	\ -                break;							\ -        case ia64_lfhint_nta:						\ -                asm volatile ("lfetch.excl.nta [%0]" :: "r"(y));	\ -                break;							\ -        }								\ -}) - -#define ia64_lfetch_fault(lfhint, y)					\ -({									\ -        switch (lfhint) {						\ -        case ia64_lfhint_none:						\ -                asm volatile ("lfetch.fault [%0]" : : "r"(y));		\ -                break;							\ -        case ia64_lfhint_nt1:						\ -                asm volatile ("lfetch.fault.nt1 [%0]" : : "r"(y));	\ -                break;							\ -        case ia64_lfhint_nt2:						\ -                asm volatile ("lfetch.fault.nt2 [%0]" : : "r"(y));	\ -                break;							\ -        case ia64_lfhint_nta:						\ -                asm volatile ("lfetch.fault.nta [%0]" : : "r"(y));	\ -                break;							\ -        }								\ -}) - -#define ia64_lfetch_fault_excl(lfhint, y)				\ -({									\ -        switch (lfhint) {						\ -        case ia64_lfhint_none:						\ -                asm volatile ("lfetch.fault.excl [%0]" :: "r"(y));	\ -                break;							\ -        case ia64_lfhint_nt1:						\ -                asm volatile ("lfetch.fault.excl.nt1 [%0]" :: "r"(y));	\ -                break;							\ -        case ia64_lfhint_nt2:						\ -                asm volatile ("lfetch.fault.excl.nt2 [%0]" :: "r"(y));	\ -                break;							\ -        case ia64_lfhint_nta:						\ -                asm volatile ("lfetch.fault.excl.nta [%0]" :: "r"(y));	\ -                break;							\ -        }								\ -}) - -#define ia64_native_intrin_local_irq_restore(x)			\ -do {								\ -	asm volatile (";;   cmp.ne p6,p7=%0,r0;;"		\ -		      "(p6) ssm psr.i;"				\ -		      "(p7) rsm psr.i;;"			\ -		      "(p6) srlz.d"				\ -		      :: "r"((x)) : "p6", "p7", "memory");	\ -} while (0) -  #endif /* _ASM_IA64_GCC_INTRIN_H */ diff --git a/arch/ia64/include/asm/gpio.h b/arch/ia64/include/asm/gpio.h new file mode 100644 index 00000000000..b3799d88ffc --- /dev/null +++ b/arch/ia64/include/asm/gpio.h @@ -0,0 +1,4 @@ +#ifndef __LINUX_GPIO_H +#warning Include linux/gpio.h instead of asm/gpio.h +#include <linux/gpio.h> +#endif diff --git a/arch/ia64/include/asm/hpsim.h b/arch/ia64/include/asm/hpsim.h index 892ab198a9d..0fe50225daa 100644 --- a/arch/ia64/include/asm/hpsim.h +++ b/arch/ia64/include/asm/hpsim.h @@ -10,7 +10,7 @@ int simcons_register(void);  struct tty_driver;  extern struct tty_driver *hp_simserial_driver; -void ia64_ssc_connect_irq(long intr, long irq); +extern int hpsim_get_irq(int intr);  void ia64_ctl_trace(long on);  #endif diff --git a/arch/ia64/include/asm/hugetlb.h b/arch/ia64/include/asm/hugetlb.h index da55c63728e..aa910054b8e 100644 --- a/arch/ia64/include/asm/hugetlb.h +++ b/arch/ia64/include/asm/hugetlb.h @@ -2,6 +2,7 @@  #define _ASM_IA64_HUGETLB_H  #include <asm/page.h> +#include <asm-generic/hugetlb.h>  void hugetlb_free_pgd_range(struct mmu_gather *tlb, unsigned long addr, @@ -77,4 +78,8 @@ static inline void arch_release_hugepage(struct page *page)  {  } +static inline void arch_clear_hugepage_flags(struct page *page) +{ +} +  #endif /* _ASM_IA64_HUGETLB_H */ diff --git a/arch/ia64/include/asm/hw_irq.h b/arch/ia64/include/asm/hw_irq.h index bf2e37493e0..029bab36cd9 100644 --- a/arch/ia64/include/asm/hw_irq.h +++ b/arch/ia64/include/asm/hw_irq.h @@ -132,7 +132,6 @@ extern int reserve_irq_vector (int vector);  extern void __setup_vector_irq(int cpu);  extern void ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect);  extern void ia64_native_register_percpu_irq (ia64_vector vec, struct irqaction *action); -extern int check_irq_used (int irq);  extern void destroy_and_reserve_irq (unsigned int irq);  #if defined(CONFIG_SMP) && (defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_DIG)) @@ -151,9 +150,6 @@ static inline void ia64_native_resend_irq(unsigned int vector)  /*   * Default implementations for the irq-descriptor API:   */ - -extern struct irq_desc irq_desc[NR_IRQS]; -  #ifndef CONFIG_IA64_GENERIC  static inline ia64_vector __ia64_irq_to_vector(int irq)  { diff --git a/arch/ia64/include/asm/intrinsics.h b/arch/ia64/include/asm/intrinsics.h index 111ed522289..20477ea111b 100644 --- a/arch/ia64/include/asm/intrinsics.h +++ b/arch/ia64/include/asm/intrinsics.h @@ -1,246 +1,25 @@ -#ifndef _ASM_IA64_INTRINSICS_H -#define _ASM_IA64_INTRINSICS_H -  /*   * Compiler-dependent intrinsics.   *   * Copyright (C) 2002-2003 Hewlett-Packard Co   *	David Mosberger-Tang <davidm@hpl.hp.com>   */ +#ifndef _ASM_IA64_INTRINSICS_H +#define _ASM_IA64_INTRINSICS_H -#ifndef __ASSEMBLY__ - -#include <linux/types.h> -/* include compiler specific intrinsics */ -#include <asm/ia64regs.h> -#ifdef __INTEL_COMPILER -# include <asm/intel_intrin.h> -#else -# include <asm/gcc_intrin.h> -#endif - -#define ia64_native_get_psr_i()	(ia64_native_getreg(_IA64_REG_PSR) & IA64_PSR_I) - -#define ia64_native_set_rr0_to_rr4(val0, val1, val2, val3, val4)	\ -do {									\ -	ia64_native_set_rr(0x0000000000000000UL, (val0));		\ -	ia64_native_set_rr(0x2000000000000000UL, (val1));		\ -	ia64_native_set_rr(0x4000000000000000UL, (val2));		\ -	ia64_native_set_rr(0x6000000000000000UL, (val3));		\ -	ia64_native_set_rr(0x8000000000000000UL, (val4));		\ -} while (0) - -/* - * Force an unresolved reference if someone tries to use - * ia64_fetch_and_add() with a bad value. - */ -extern unsigned long __bad_size_for_ia64_fetch_and_add (void); -extern unsigned long __bad_increment_for_ia64_fetch_and_add (void); - -#define IA64_FETCHADD(tmp,v,n,sz,sem)						\ -({										\ -	switch (sz) {								\ -	      case 4:								\ -	        tmp = ia64_fetchadd4_##sem((unsigned int *) v, n);		\ -		break;								\ -										\ -	      case 8:								\ -	        tmp = ia64_fetchadd8_##sem((unsigned long *) v, n);		\ -		break;								\ -										\ -	      default:								\ -		__bad_size_for_ia64_fetch_and_add();				\ -	}									\ -}) - -#define ia64_fetchadd(i,v,sem)								\ -({											\ -	__u64 _tmp;									\ -	volatile __typeof__(*(v)) *_v = (v);						\ -	/* Can't use a switch () here: gcc isn't always smart enough for that... */	\ -	if ((i) == -16)									\ -		IA64_FETCHADD(_tmp, _v, -16, sizeof(*(v)), sem);			\ -	else if ((i) == -8)								\ -		IA64_FETCHADD(_tmp, _v, -8, sizeof(*(v)), sem);				\ -	else if ((i) == -4)								\ -		IA64_FETCHADD(_tmp, _v, -4, sizeof(*(v)), sem);				\ -	else if ((i) == -1)								\ -		IA64_FETCHADD(_tmp, _v, -1, sizeof(*(v)), sem);				\ -	else if ((i) == 1)								\ -		IA64_FETCHADD(_tmp, _v, 1, sizeof(*(v)), sem);				\ -	else if ((i) == 4)								\ -		IA64_FETCHADD(_tmp, _v, 4, sizeof(*(v)), sem);				\ -	else if ((i) == 8)								\ -		IA64_FETCHADD(_tmp, _v, 8, sizeof(*(v)), sem);				\ -	else if ((i) == 16)								\ -		IA64_FETCHADD(_tmp, _v, 16, sizeof(*(v)), sem);				\ -	else										\ -		_tmp = __bad_increment_for_ia64_fetch_and_add();			\ -	(__typeof__(*(v))) (_tmp);	/* return old value */				\ -}) - -#define ia64_fetch_and_add(i,v)	(ia64_fetchadd(i, v, rel) + (i)) /* return new value */ - -/* - * This function doesn't exist, so you'll get a linker error if - * something tries to do an invalid xchg(). - */ -extern void ia64_xchg_called_with_bad_pointer (void); - -#define __xchg(x,ptr,size)						\ -({									\ -	unsigned long __xchg_result;					\ -									\ -	switch (size) {							\ -	      case 1:							\ -		__xchg_result = ia64_xchg1((__u8 *)ptr, x);		\ -		break;							\ -									\ -	      case 2:							\ -		__xchg_result = ia64_xchg2((__u16 *)ptr, x);		\ -		break;							\ -									\ -	      case 4:							\ -		__xchg_result = ia64_xchg4((__u32 *)ptr, x);		\ -		break;							\ -									\ -	      case 8:							\ -		__xchg_result = ia64_xchg8((__u64 *)ptr, x);		\ -		break;							\ -	      default:							\ -		ia64_xchg_called_with_bad_pointer();			\ -	}								\ -	__xchg_result;							\ -}) - -#define xchg(ptr,x)							     \ -  ((__typeof__(*(ptr))) __xchg ((unsigned long) (x), (ptr), sizeof(*(ptr)))) - -/* - * Atomic compare and exchange.  Compare OLD with MEM, if identical, - * store NEW in MEM.  Return the initial value in MEM.  Success is - * indicated by comparing RETURN with OLD. - */ - -#define __HAVE_ARCH_CMPXCHG 1 - -/* - * This function doesn't exist, so you'll get a linker error - * if something tries to do an invalid cmpxchg(). - */ -extern long ia64_cmpxchg_called_with_bad_pointer (void); - -#define ia64_cmpxchg(sem,ptr,old,new,size)						\ -({											\ -	__u64 _o_, _r_;									\ -											\ -	switch (size) {									\ -	      case 1: _o_ = (__u8 ) (long) (old); break;				\ -	      case 2: _o_ = (__u16) (long) (old); break;				\ -	      case 4: _o_ = (__u32) (long) (old); break;				\ -	      case 8: _o_ = (__u64) (long) (old); break;				\ -	      default: break;								\ -	}										\ -	switch (size) {									\ -	      case 1:									\ -	      	_r_ = ia64_cmpxchg1_##sem((__u8 *) ptr, new, _o_);			\ -		break;									\ -											\ -	      case 2:									\ -	       _r_ = ia64_cmpxchg2_##sem((__u16 *) ptr, new, _o_);			\ -		break;									\ -											\ -	      case 4:									\ -	      	_r_ = ia64_cmpxchg4_##sem((__u32 *) ptr, new, _o_);			\ -		break;									\ -											\ -	      case 8:									\ -		_r_ = ia64_cmpxchg8_##sem((__u64 *) ptr, new, _o_);			\ -		break;									\ -											\ -	      default:									\ -		_r_ = ia64_cmpxchg_called_with_bad_pointer();				\ -		break;									\ -	}										\ -	(__typeof__(old)) _r_;								\ -}) - -#define cmpxchg_acq(ptr, o, n)	\ -	ia64_cmpxchg(acq, (ptr), (o), (n), sizeof(*(ptr))) -#define cmpxchg_rel(ptr, o, n)	\ -	ia64_cmpxchg(rel, (ptr), (o), (n), sizeof(*(ptr))) - -/* for compatibility with other platforms: */ -#define cmpxchg(ptr, o, n)	cmpxchg_acq((ptr), (o), (n)) -#define cmpxchg64(ptr, o, n)	cmpxchg_acq((ptr), (o), (n)) - -#define cmpxchg_local		cmpxchg -#define cmpxchg64_local		cmpxchg64 - -#ifdef CONFIG_IA64_DEBUG_CMPXCHG -# define CMPXCHG_BUGCHECK_DECL	int _cmpxchg_bugcheck_count = 128; -# define CMPXCHG_BUGCHECK(v)							\ -  do {										\ -	if (_cmpxchg_bugcheck_count-- <= 0) {					\ -		void *ip;							\ -		extern int printk(const char *fmt, ...);			\ -		ip = (void *) ia64_getreg(_IA64_REG_IP);			\ -		printk("CMPXCHG_BUGCHECK: stuck at %p on word %p\n", ip, (v));	\ -		break;								\ -	}									\ -  } while (0) -#else /* !CONFIG_IA64_DEBUG_CMPXCHG */ -# define CMPXCHG_BUGCHECK_DECL -# define CMPXCHG_BUGCHECK(v) -#endif /* !CONFIG_IA64_DEBUG_CMPXCHG */ - -#endif - -#ifdef __KERNEL__  #include <asm/paravirt_privop.h> -#endif +#include <uapi/asm/intrinsics.h>  #ifndef __ASSEMBLY__ -#if defined(CONFIG_PARAVIRT) && defined(__KERNEL__) -#ifdef ASM_SUPPORTED -# define IA64_INTRINSIC_API(name)	paravirt_ ## name -#else -# define IA64_INTRINSIC_API(name)	pv_cpu_ops.name -#endif +#if defined(CONFIG_PARAVIRT) +# undef IA64_INTRINSIC_API +# undef IA64_INTRINSIC_MACRO +# ifdef ASM_SUPPORTED +#  define IA64_INTRINSIC_API(name)	paravirt_ ## name +# else +#  define IA64_INTRINSIC_API(name)	pv_cpu_ops.name +# endif  #define IA64_INTRINSIC_MACRO(name)	paravirt_ ## name -#else -#define IA64_INTRINSIC_API(name)	ia64_native_ ## name -#define IA64_INTRINSIC_MACRO(name)	ia64_native_ ## name  #endif - -/************************************************/ -/* Instructions paravirtualized for correctness */ -/************************************************/ -/* fc, thash, get_cpuid, get_pmd, get_eflags, set_eflags */ -/* Note that "ttag" and "cover" are also privilege-sensitive; "ttag" - * is not currently used (though it may be in a long-format VHPT system!) - */ -#define ia64_fc				IA64_INTRINSIC_API(fc) -#define ia64_thash			IA64_INTRINSIC_API(thash) -#define ia64_get_cpuid			IA64_INTRINSIC_API(get_cpuid) -#define ia64_get_pmd			IA64_INTRINSIC_API(get_pmd) - - -/************************************************/ -/* Instructions paravirtualized for performance */ -/************************************************/ -#define ia64_ssm			IA64_INTRINSIC_MACRO(ssm) -#define ia64_rsm			IA64_INTRINSIC_MACRO(rsm) -#define ia64_getreg			IA64_INTRINSIC_MACRO(getreg) -#define ia64_setreg			IA64_INTRINSIC_API(setreg) -#define ia64_set_rr			IA64_INTRINSIC_API(set_rr) -#define ia64_get_rr			IA64_INTRINSIC_API(get_rr) -#define ia64_ptcga			IA64_INTRINSIC_API(ptcga) -#define ia64_get_psr_i			IA64_INTRINSIC_API(get_psr_i) -#define ia64_intrin_local_irq_restore	\ -	IA64_INTRINSIC_API(intrin_local_irq_restore) -#define ia64_set_rr0_to_rr4		IA64_INTRINSIC_API(set_rr0_to_rr4) -  #endif /* !__ASSEMBLY__ */ -  #endif /* _ASM_IA64_INTRINSICS_H */ diff --git a/arch/ia64/include/asm/io.h b/arch/ia64/include/asm/io.h index cc8335eb311..0d2bcb37ec3 100644 --- a/arch/ia64/include/asm/io.h +++ b/arch/ia64/include/asm/io.h @@ -71,7 +71,6 @@ extern unsigned int num_io_spaces;  #include <asm/intrinsics.h>  #include <asm/machvec.h>  #include <asm/page.h> -#include <asm/system.h>  #include <asm-generic/iomap.h>  /* @@ -91,7 +90,7 @@ phys_to_virt (unsigned long address)  #define ARCH_HAS_VALID_PHYS_ADDR_RANGE  extern u64 kern_mem_attribute (unsigned long phys_addr, unsigned long size); -extern int valid_phys_addr_range (unsigned long addr, size_t count); /* efi.c */ +extern int valid_phys_addr_range (phys_addr_t addr, size_t count); /* efi.c */  extern int valid_mmap_phys_addr_range (unsigned long pfn, size_t count);  /* @@ -425,7 +424,13 @@ extern void __iomem * ioremap(unsigned long offset, unsigned long size);  extern void __iomem * ioremap_nocache (unsigned long offset, unsigned long size);  extern void iounmap (volatile void __iomem *addr);  extern void __iomem * early_ioremap (unsigned long phys_addr, unsigned long size); +#define early_memremap(phys_addr, size)        early_ioremap(phys_addr, size)  extern void early_iounmap (volatile void __iomem *addr, unsigned long size); +static inline void __iomem * ioremap_cache (unsigned long phys_addr, unsigned long size) +{ +	return ioremap(phys_addr, size); +} +  /*   * String version of IO memory access ops: diff --git a/arch/ia64/include/asm/iommu.h b/arch/ia64/include/asm/iommu.h index 745e095fe82..105c93b00b1 100644 --- a/arch/ia64/include/asm/iommu.h +++ b/arch/ia64/include/asm/iommu.h @@ -7,12 +7,14 @@  extern void pci_iommu_shutdown(void);  extern void no_iommu_init(void); +#ifdef	CONFIG_INTEL_IOMMU  extern int force_iommu, no_iommu; -extern int iommu_detected; -#ifdef	CONFIG_DMAR  extern int iommu_pass_through; +extern int iommu_detected;  #else  #define iommu_pass_through	(0) +#define no_iommu		(1) +#define iommu_detected		(0)  #endif  extern void iommu_dma_init(void);  extern void machvec_init(const char *name); diff --git a/arch/ia64/include/asm/iosapic.h b/arch/ia64/include/asm/iosapic.h index b9c102e15f2..94c89a2d97f 100644 --- a/arch/ia64/include/asm/iosapic.h +++ b/arch/ia64/include/asm/iosapic.h @@ -87,18 +87,13 @@ static inline void iosapic_eoi(char __iomem *iosapic, u32 vector)  }  extern void __init iosapic_system_init (int pcat_compat); -extern int __devinit iosapic_init (unsigned long address, -				    unsigned int gsi_base); -#ifdef CONFIG_HOTPLUG +extern int iosapic_init (unsigned long address, unsigned int gsi_base);  extern int iosapic_remove (unsigned int gsi_base); -#else -#define iosapic_remove(gsi_base)				(-EINVAL) -#endif /* CONFIG_HOTPLUG */  extern int gsi_to_irq (unsigned int gsi);  extern int iosapic_register_intr (unsigned int gsi, unsigned long polarity,  				  unsigned long trigger);  extern void iosapic_unregister_intr (unsigned int irq); -extern void __devinit iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi, +extern void iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,  				      unsigned long polarity,  				      unsigned long trigger);  extern int __init iosapic_register_platform_intr (u32 int_type, @@ -109,7 +104,7 @@ extern int __init iosapic_register_platform_intr (u32 int_type,  					   unsigned long trigger);  #ifdef CONFIG_NUMA -extern void __devinit map_iosapic_to_node (unsigned int, int); +extern void map_iosapic_to_node (unsigned int, int);  #endif  #else  #define iosapic_system_init(pcat_compat)			do { } while (0) diff --git a/arch/ia64/include/asm/ipcbuf.h b/arch/ia64/include/asm/ipcbuf.h deleted file mode 100644 index 079899ae7d3..00000000000 --- a/arch/ia64/include/asm/ipcbuf.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _ASM_IA64_IPCBUF_H -#define _ASM_IA64_IPCBUF_H - -/* - * The ipc64_perm structure for IA-64 architecture. - * Note extra padding because this structure is passed back and forth - * between kernel and user space. - * - * Pad space is left for: - * - 32-bit seq - * - 2 miscellaneous 64-bit values - */ - -struct ipc64_perm -{ -	__kernel_key_t	key; -	__kernel_uid_t	uid; -	__kernel_gid_t	gid; -	__kernel_uid_t	cuid; -	__kernel_gid_t	cgid; -	__kernel_mode_t	mode; -	unsigned short	seq; -	unsigned short	__pad1; -	unsigned long	__unused1; -	unsigned long	__unused2; -}; - -#endif /* _ASM_IA64_IPCBUF_H */ diff --git a/arch/ia64/include/asm/irq.h b/arch/ia64/include/asm/irq.h index 91b920fd7d5..820667cbea7 100644 --- a/arch/ia64/include/asm/irq.h +++ b/arch/ia64/include/asm/irq.h @@ -31,4 +31,7 @@ bool is_affinity_mask_valid(const struct cpumask *cpumask);  #define is_affinity_mask_valid is_affinity_mask_valid +int create_irq(void); +void destroy_irq(unsigned int irq); +  #endif /* _ASM_IA64_IRQ_H */ diff --git a/arch/ia64/include/asm/irq_remapping.h b/arch/ia64/include/asm/irq_remapping.h new file mode 100644 index 00000000000..e3b3556e2e1 --- /dev/null +++ b/arch/ia64/include/asm/irq_remapping.h @@ -0,0 +1,6 @@ +#ifndef __IA64_INTR_REMAPPING_H +#define __IA64_INTR_REMAPPING_H +#define irq_remapping_enabled 0 +#define dmar_alloc_hwirq	create_irq +#define dmar_free_hwirq		destroy_irq +#endif diff --git a/arch/ia64/include/asm/irqflags.h b/arch/ia64/include/asm/irqflags.h index f82d6be2ecd..cec6c06b52c 100644 --- a/arch/ia64/include/asm/irqflags.h +++ b/arch/ia64/include/asm/irqflags.h @@ -10,6 +10,9 @@  #ifndef _ASM_IA64_IRQFLAGS_H  #define _ASM_IA64_IRQFLAGS_H +#include <asm/pal.h> +#include <asm/kregs.h> +  #ifdef CONFIG_IA64_DEBUG_IRQ  extern unsigned long last_cli_ip;  static inline void arch_maybe_save_ip(unsigned long flags) @@ -87,6 +90,7 @@ static inline bool arch_irqs_disabled(void)  static inline void arch_safe_halt(void)  { +	arch_local_irq_enable();  	ia64_pal_halt_light();	/* PAL_HALT_LIGHT */  } diff --git a/arch/ia64/include/asm/kexec.h b/arch/ia64/include/asm/kexec.h index e1d58f819d7..aea2b81b03a 100644 --- a/arch/ia64/include/asm/kexec.h +++ b/arch/ia64/include/asm/kexec.h @@ -1,6 +1,7 @@  #ifndef _ASM_IA64_KEXEC_H  #define _ASM_IA64_KEXEC_H +#include <asm/setup.h>  /* Maximum physical address we can use pages from */  #define KEXEC_SOURCE_MEMORY_LIMIT (-1UL) diff --git a/arch/ia64/include/asm/kvm_host.h b/arch/ia64/include/asm/kvm_host.h index 2f229e5de49..db95f570705 100644 --- a/arch/ia64/include/asm/kvm_host.h +++ b/arch/ia64/include/asm/kvm_host.h @@ -23,11 +23,10 @@  #ifndef __ASM_KVM_HOST_H  #define __ASM_KVM_HOST_H -#define KVM_MEMORY_SLOTS 32 -/* memory slots that does not exposed to userspace */ -#define KVM_PRIVATE_MEM_SLOTS 4 +#define KVM_USER_MEM_SLOTS 32  #define KVM_COALESCED_MMIO_PAGE_OFFSET 1 +#define KVM_IRQCHIP_NUM_PINS  KVM_IOAPIC_NUM_PINS  /* define exit reasons from vmm to kvm*/  #define EXIT_REASON_VM_PANIC		0 @@ -235,10 +234,6 @@ struct kvm_vm_data {  #define KVM_REQ_PTC_G		32  #define KVM_REQ_RESUME		33 -#define KVM_HPAGE_GFN_SHIFT(x)	0 -#define KVM_NR_PAGE_SIZES	1 -#define KVM_PAGES_PER_HPAGE(x)	1 -  struct kvm;  struct kvm_vcpu; @@ -365,6 +360,7 @@ struct thash_cb {  };  struct kvm_vcpu_stat { +	u32 halt_wakeup;  };  struct kvm_vcpu_arch { @@ -448,6 +444,8 @@ struct kvm_vcpu_arch {  	char log_buf[VMM_LOG_LEN];  	union context host;  	union context guest; + +	char mmio_data[8];  };  struct kvm_vm_stat { @@ -459,6 +457,9 @@ struct kvm_sal_data {  	unsigned long boot_gp;  }; +struct kvm_arch_memory_slot { +}; +  struct kvm_arch {  	spinlock_t dirty_log_lock; @@ -475,7 +476,7 @@ struct kvm_arch {  	struct list_head assigned_dev_head;  	struct iommu_domain *iommu_domain; -	int iommu_flags; +	bool iommu_noncoherent;  	unsigned long irq_sources_bitmap;  	unsigned long irq_states[KVM_IOAPIC_NUM_PINS]; @@ -590,6 +591,10 @@ int kvm_emulate_halt(struct kvm_vcpu *vcpu);  int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run);  void kvm_sal_emul(struct kvm_vcpu *vcpu); +#define __KVM_HAVE_ARCH_VM_ALLOC 1 +struct kvm *kvm_arch_alloc_vm(void); +void kvm_arch_free_vm(struct kvm *kvm); +  #endif /* __ASSEMBLY__*/  #endif diff --git a/arch/ia64/include/asm/kvm_para.h b/arch/ia64/include/asm/kvm_para.h deleted file mode 100644 index 1588aee781a..00000000000 --- a/arch/ia64/include/asm/kvm_para.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef __IA64_KVM_PARA_H -#define __IA64_KVM_PARA_H - -/* - * Copyright (C) 2007 Xiantao Zhang <xiantao.zhang@intel.com> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope 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. - * - */ - -#ifdef __KERNEL__ - -static inline unsigned int kvm_arch_para_features(void) -{ -	return 0; -} - -#endif - -#endif diff --git a/arch/ia64/include/asm/linkage.h b/arch/ia64/include/asm/linkage.h index ef22a45c189..787575701f1 100644 --- a/arch/ia64/include/asm/linkage.h +++ b/arch/ia64/include/asm/linkage.h @@ -11,4 +11,8 @@  #endif +#define cond_syscall(x) asm(".weak\t" #x "#\n" #x "#\t=\tsys_ni_syscall#") +#define SYSCALL_ALIAS(alias, name)					\ +	asm ( #alias "# = " #name "#\n\t.globl " #alias "#") +  #endif diff --git a/arch/ia64/include/asm/machvec.h b/arch/ia64/include/asm/machvec.h index 367d299d993..9c39bdfc2da 100644 --- a/arch/ia64/include/asm/machvec.h +++ b/arch/ia64/include/asm/machvec.h @@ -113,14 +113,12 @@ 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  #  include MACHVEC_PLATFORM_HEADER  # else -#  define platform_name		ia64_mv.name +#  define ia64_platform_name	ia64_mv.name  #  define platform_setup	ia64_mv.setup  #  define platform_cpu_init	ia64_mv.cpu_init  #  define platform_irq_init	ia64_mv.irq_init diff --git a/arch/ia64/include/asm/machvec_dig.h b/arch/ia64/include/asm/machvec_dig.h index 8a0752f4098..1f7403a2fbe 100644 --- a/arch/ia64/include/asm/machvec_dig.h +++ b/arch/ia64/include/asm/machvec_dig.h @@ -10,7 +10,7 @@ extern ia64_mv_setup_t dig_setup;   * platform's machvec structure.  When compiling a non-generic kernel,   * the macros are used directly.   */ -#define platform_name		"dig" +#define ia64_platform_name	"dig"  #define platform_setup		dig_setup  #endif /* _ASM_IA64_MACHVEC_DIG_h */ diff --git a/arch/ia64/include/asm/machvec_dig_vtd.h b/arch/ia64/include/asm/machvec_dig_vtd.h index 6ab1de5c45e..44308b4c3f6 100644 --- a/arch/ia64/include/asm/machvec_dig_vtd.h +++ b/arch/ia64/include/asm/machvec_dig_vtd.h @@ -11,7 +11,7 @@ extern ia64_mv_dma_init			pci_iommu_alloc;   * platform's machvec structure.  When compiling a non-generic kernel,   * the macros are used directly.   */ -#define platform_name				"dig_vtd" +#define ia64_platform_name			"dig_vtd"  #define platform_setup				dig_setup  #define platform_dma_init			pci_iommu_alloc diff --git a/arch/ia64/include/asm/machvec_hpsim.h b/arch/ia64/include/asm/machvec_hpsim.h index cf72fc87fdf..e7571127936 100644 --- a/arch/ia64/include/asm/machvec_hpsim.h +++ b/arch/ia64/include/asm/machvec_hpsim.h @@ -11,7 +11,7 @@ extern ia64_mv_irq_init_t hpsim_irq_init;   * platform's machvec structure.  When compiling a non-generic kernel,   * the macros are used directly.   */ -#define platform_name		"hpsim" +#define ia64_platform_name	"hpsim"  #define platform_setup		hpsim_setup  #define platform_irq_init	hpsim_irq_init diff --git a/arch/ia64/include/asm/machvec_hpzx1.h b/arch/ia64/include/asm/machvec_hpzx1.h index 3bd83d78a41..c74d3159e9e 100644 --- a/arch/ia64/include/asm/machvec_hpzx1.h +++ b/arch/ia64/include/asm/machvec_hpzx1.h @@ -11,7 +11,7 @@ extern ia64_mv_dma_init			sba_dma_init;   * platform's machvec structure.  When compiling a non-generic kernel,   * the macros are used directly.   */ -#define platform_name				"hpzx1" +#define ia64_platform_name			"hpzx1"  #define platform_setup				dig_setup  #define platform_dma_init			sba_dma_init diff --git a/arch/ia64/include/asm/machvec_hpzx1_swiotlb.h b/arch/ia64/include/asm/machvec_hpzx1_swiotlb.h index 1091ac39740..906ef621077 100644 --- a/arch/ia64/include/asm/machvec_hpzx1_swiotlb.h +++ b/arch/ia64/include/asm/machvec_hpzx1_swiotlb.h @@ -11,7 +11,7 @@ extern ia64_mv_dma_get_ops			hwsw_dma_get_ops;   * platform's machvec structure.  When compiling a non-generic kernel,   * the macros are used directly.   */ -#define platform_name				"hpzx1_swiotlb" +#define ia64_platform_name			"hpzx1_swiotlb"  #define platform_setup				dig_setup  #define platform_dma_init			machvec_noop  #define platform_dma_get_ops			hwsw_dma_get_ops diff --git a/arch/ia64/include/asm/machvec_sn2.h b/arch/ia64/include/asm/machvec_sn2.h index f061a30aac4..ece9fa85be8 100644 --- a/arch/ia64/include/asm/machvec_sn2.h +++ b/arch/ia64/include/asm/machvec_sn2.h @@ -71,7 +71,7 @@ extern ia64_mv_pci_fixup_bus_t		sn_pci_fixup_bus;   * platform's machvec structure.  When compiling a non-generic kernel,   * the macros are used directly.   */ -#define platform_name			"sn2" +#define ia64_platform_name		"sn2"  #define platform_setup			sn_setup  #define platform_cpu_init		sn_cpu_init  #define platform_irq_init		sn_irq_init diff --git a/arch/ia64/include/asm/machvec_uv.h b/arch/ia64/include/asm/machvec_uv.h index 2931447f381..2c50853f35a 100644 --- a/arch/ia64/include/asm/machvec_uv.h +++ b/arch/ia64/include/asm/machvec_uv.h @@ -20,7 +20,7 @@ extern ia64_mv_setup_t uv_setup;   * platform's machvec structure.  When compiling a non-generic kernel,   * the macros are used directly.   */ -#define platform_name			"uv" +#define ia64_platform_name		"uv"  #define platform_setup			uv_setup  #endif /* _ASM_IA64_MACHVEC_UV_H */ diff --git a/arch/ia64/include/asm/machvec_xen.h b/arch/ia64/include/asm/machvec_xen.h deleted file mode 100644 index 55f9228056c..00000000000 --- a/arch/ia64/include/asm/machvec_xen.h +++ /dev/null @@ -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 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 */ diff --git a/arch/ia64/include/asm/mca.h b/arch/ia64/include/asm/mca.h index 43f96ab18fa..8c709616871 100644 --- a/arch/ia64/include/asm/mca.h +++ b/arch/ia64/include/asm/mca.h @@ -143,6 +143,7 @@ extern unsigned long __per_cpu_mca[NR_CPUS];  extern int cpe_vector;  extern int ia64_cpe_irq;  extern void ia64_mca_init(void); +extern void ia64_mca_irq_init(void);  extern void ia64_mca_cpu_init(void *);  extern void ia64_os_mca_dispatch(void);  extern void ia64_os_mca_dispatch_end(void); diff --git a/arch/ia64/include/asm/mca_asm.h b/arch/ia64/include/asm/mca_asm.h index dd2a5b13439..13c1d4994d4 100644 --- a/arch/ia64/include/asm/mca_asm.h +++ b/arch/ia64/include/asm/mca_asm.h @@ -15,6 +15,8 @@  #ifndef _ASM_IA64_MCA_ASM_H  #define _ASM_IA64_MCA_ASM_H +#include <asm/percpu.h> +  #define PSR_IC		13  #define PSR_I		14  #define	PSR_DT		17 diff --git a/arch/ia64/include/asm/meminit.h b/arch/ia64/include/asm/meminit.h index 61c7b1750b1..092f1c91b36 100644 --- a/arch/ia64/include/asm/meminit.h +++ b/arch/ia64/include/asm/meminit.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   */ diff --git a/arch/ia64/include/asm/mman.h b/arch/ia64/include/asm/mman.h index 4459028e5aa..fdd5f5229f7 100644 --- a/arch/ia64/include/asm/mman.h +++ b/arch/ia64/include/asm/mman.h @@ -1,23 +1,17 @@ -#ifndef _ASM_IA64_MMAN_H -#define _ASM_IA64_MMAN_H -  /*   * Based on <asm-i386/mman.h>.   *   * Modified 1998-2000, 2002   *	David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co   */ +#ifndef _ASM_IA64_MMAN_H +#define _ASM_IA64_MMAN_H -#include <asm-generic/mman.h> - -#define MAP_GROWSUP	0x0200		/* register stack-like segment */ +#include <uapi/asm/mman.h> -#ifdef __KERNEL__  #ifndef __ASSEMBLY__  #define arch_mmap_check	ia64_mmap_check  int ia64_mmap_check(unsigned long addr, unsigned long len,  		unsigned long flags);  #endif -#endif -  #endif /* _ASM_IA64_MMAN_H */ diff --git a/arch/ia64/include/asm/module.h b/arch/ia64/include/asm/module.h index 908eaef42a0..dfba22a872c 100644 --- a/arch/ia64/include/asm/module.h +++ b/arch/ia64/include/asm/module.h @@ -1,6 +1,8 @@  #ifndef _ASM_IA64_MODULE_H  #define _ASM_IA64_MODULE_H +#include <asm-generic/module.h> +  /*   * IA-64-specific support for kernel module loader.   * @@ -29,10 +31,6 @@ struct mod_arch_specific {  	unsigned int next_got_entry;	/* index of next available got entry */  }; -#define Elf_Shdr	Elf64_Shdr -#define Elf_Sym		Elf64_Sym -#define Elf_Ehdr	Elf64_Ehdr -  #define MODULE_PROC_FAMILY	"ia64"  #define MODULE_ARCH_VERMAGIC	MODULE_PROC_FAMILY \  	"gcc-" __stringify(__GNUC__) "." __stringify(__GNUC_MINOR__) diff --git a/arch/ia64/include/asm/mutex.h b/arch/ia64/include/asm/mutex.h index bed73a643a5..f41e66d65e3 100644 --- a/arch/ia64/include/asm/mutex.h +++ b/arch/ia64/include/asm/mutex.h @@ -29,17 +29,15 @@ __mutex_fastpath_lock(atomic_t *count, void (*fail_fn)(atomic_t *))   *  __mutex_fastpath_lock_retval - try to take the lock by moving the count   *                                 from 1 to a 0 value   *  @count: pointer of type atomic_t - *  @fail_fn: function to call if the original value was not 1   * - * Change the count from 1 to a value lower than 1, and call <fail_fn> if - * it wasn't 1 originally. This function returns 0 if the fastpath succeeds, - * or anything the slow path function returns. + * Change the count from 1 to a value lower than 1. This function returns 0 + * if the fastpath succeeds, or -1 otherwise.   */  static inline int -__mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *)) +__mutex_fastpath_lock_retval(atomic_t *count)  {  	if (unlikely(ia64_fetchadd4_acq(count, -1) != 1)) -		return fail_fn(count); +		return -1;  	return 0;  } diff --git a/arch/ia64/include/asm/numa.h b/arch/ia64/include/asm/numa.h index 6a8a27cfae3..2db0a6c6daa 100644 --- a/arch/ia64/include/asm/numa.h +++ b/arch/ia64/include/asm/numa.h @@ -59,7 +59,7 @@ extern struct node_cpuid_s node_cpuid[NR_CPUS];   */  extern u8 numa_slit[MAX_NUMNODES * MAX_NUMNODES]; -#define node_distance(from,to) (numa_slit[(from) * num_online_nodes() + (to)]) +#define node_distance(from,to) (numa_slit[(from) * MAX_NUMNODES + (to)])  extern int paddr_to_nid(unsigned long paddr); @@ -67,14 +67,13 @@ extern int paddr_to_nid(unsigned long paddr);  extern void map_cpu_to_node(int cpu, int nid);  extern void unmap_cpu_from_node(int cpu, int nid); - +extern void numa_clear_node(int cpu);  #else /* !CONFIG_NUMA */  #define map_cpu_to_node(cpu, nid)	do{}while(0)  #define unmap_cpu_from_node(cpu, nid)	do{}while(0) -  #define paddr_to_nid(addr)	0 - +#define numa_clear_node(cpu)	do { } while (0)  #endif /* CONFIG_NUMA */  #endif /* _ASM_IA64_NUMA_H */ diff --git a/arch/ia64/include/asm/page.h b/arch/ia64/include/asm/page.h index 41b6d31110f..f1e1b2e3cdb 100644 --- a/arch/ia64/include/asm/page.h +++ b/arch/ia64/include/asm/page.h @@ -189,6 +189,7 @@ get_order (unsigned long size)  # define pgprot_val(x)	((x).pgprot)  # define __pte(x)	((pte_t) { (x) } ) +# define __pmd(x)	((pmd_t) { (x) } )  # define __pgprot(x)	((pgprot_t) { (x) } )  #else /* !STRICT_MM_TYPECHECKS */ @@ -220,4 +221,14 @@ get_order (unsigned long size)  					 (((current->personality & READ_IMPLIES_EXEC) != 0)	\  					  ? VM_EXEC : 0)) +#define GATE_ADDR		RGN_BASE(RGN_GATE) + +/* + * 0xa000000000000000+2*PERCPU_PAGE_SIZE + * - 0xa000000000000000+3*PERCPU_PAGE_SIZE remain unmapped (guard page) + */ +#define KERNEL_START		 (GATE_ADDR+__IA64_UL_CONST(0x100000000)) +#define PERCPU_ADDR		(-PERCPU_PAGE_SIZE) +#define LOAD_OFFSET		(KERNEL_START - KERNEL_TR_PAGE_SIZE) +  #endif /* _ASM_IA64_PAGE_H */ diff --git a/arch/ia64/include/asm/pal.h b/arch/ia64/include/asm/pal.h index 6a292505b39..2e69284df8e 100644 --- a/arch/ia64/include/asm/pal.h +++ b/arch/ia64/include/asm/pal.h @@ -1669,7 +1669,7 @@ typedef union pal_vp_info_u {  } pal_vp_info_u_t;  /* - * Returns infomation about virtual processor features + * Returns information about virtual processor features   */  static inline s64  ia64_pal_vp_info (u64 feature_set, u64 vp_buffer, u64 *vp_info, u64 *vmm_id) diff --git a/arch/ia64/include/asm/param.h b/arch/ia64/include/asm/param.h index 0964c32c135..1295913d6a8 100644 --- a/arch/ia64/include/asm/param.h +++ b/arch/ia64/include/asm/param.h @@ -1,6 +1,3 @@ -#ifndef _ASM_IA64_PARAM_H -#define _ASM_IA64_PARAM_H -  /*   * Fundamental kernel parameters.   * @@ -9,25 +6,12 @@   * Modified 1998, 1999, 2002-2003   *	David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co   */ +#ifndef _ASM_IA64_PARAM_H +#define _ASM_IA64_PARAM_H -#define EXEC_PAGESIZE	65536 - -#ifndef NOGROUP -# define NOGROUP	(-1) -#endif - -#define MAXHOSTNAMELEN	64	/* max length of hostname */ +#include <uapi/asm/param.h> -#ifdef __KERNEL__  # define HZ		CONFIG_HZ  # define USER_HZ	HZ  # define CLOCKS_PER_SEC	HZ	/* frequency at which times() counts */ -#else -   /* -    * Technically, this is wrong, but some old apps still refer to it.  The proper way to -    * get the HZ value is via sysconf(_SC_CLK_TCK). -    */ -# define HZ 1024 -#endif -  #endif /* _ASM_IA64_PARAM_H */ diff --git a/arch/ia64/include/asm/paravirt.h b/arch/ia64/include/asm/paravirt.h index 2eb0a981a09..b53518a9802 100644 --- a/arch/ia64/include/asm/paravirt.h +++ b/arch/ia64/include/asm/paravirt.h @@ -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__ @@ -281,6 +280,10 @@ paravirt_init_missing_ticks_accounting(int cpu)  		pv_time_ops.init_missing_ticks_accounting(cpu);  } +struct static_key; +extern struct static_key paravirt_steal_enabled; +extern struct static_key paravirt_steal_rq_enabled; +  static inline int  paravirt_do_steal_accounting(unsigned long *new_itm)  { diff --git a/arch/ia64/include/asm/parport.h b/arch/ia64/include/asm/parport.h index 67e16adfcd2..638b4d271b9 100644 --- a/arch/ia64/include/asm/parport.h +++ b/arch/ia64/include/asm/parport.h @@ -9,10 +9,9 @@  #ifndef _ASM_IA64_PARPORT_H  #define _ASM_IA64_PARPORT_H 1 -static int __devinit parport_pc_find_isa_ports (int autoirq, int autodma); +static int parport_pc_find_isa_ports(int autoirq, int autodma); -static int __devinit -parport_pc_find_nonpci_ports (int autoirq, int autodma) +static int parport_pc_find_nonpci_ports(int autoirq, int autodma)  {  	return parport_pc_find_isa_ports(autoirq, autodma);  } diff --git a/arch/ia64/include/asm/pci.h b/arch/ia64/include/asm/pci.h index 73b5f785e70..52af5ed9f60 100644 --- a/arch/ia64/include/asm/pci.h +++ b/arch/ia64/include/asm/pci.h @@ -11,6 +11,14 @@  #include <asm/scatterlist.h>  #include <asm/hw_irq.h> +struct pci_vector_struct { +	__u16 segment;	/* PCI Segment number */ +	__u16 bus;	/* PCI Bus number */ +	__u32 pci_id;	/* ACPI split 16 bits device, 16 bits function (see section 6.1.1) */ +	__u8 pin;	/* PCI PIN (0 = A, 1 = B, 2 = C, 3 = D) */ +	__u32 irq;	/* IRQ assigned */ +}; +  /*   * Can be used to override the logic in pci_scan_bus for skipping already-configured bus   * numbers - to be used for buggy BIOSes or architectures with incomplete PCI setup by the @@ -42,18 +50,6 @@ struct pci_dev;  extern unsigned long ia64_max_iommu_merge_mask;  #define PCI_DMA_BUS_IS_PHYS	(ia64_max_iommu_merge_mask == ~0UL) -static inline void -pcibios_set_master (struct pci_dev *dev) -{ -	/* No special bus mastering setup handling */ -} - -static inline void -pcibios_penalize_isa_irq (int irq, int active) -{ -	/* We don't do dynamic PCI IRQ allocation */ -} -  #include <asm-generic/pci-dma-compat.h>  #ifdef CONFIG_PCI @@ -87,23 +83,21 @@ extern int pci_mmap_legacy_page_range(struct pci_bus *bus,  #define pci_legacy_read platform_pci_legacy_read  #define pci_legacy_write platform_pci_legacy_write -struct pci_window { -	struct resource resource; -	u64 offset; +struct iospace_resource { +	struct list_head list; +	struct resource res;  };  struct pci_controller { -	void *acpi_handle; +	struct acpi_device *companion;  	void *iommu;  	int segment; -	int node;		/* nearest node with memory or -1 for global allocation */ - -	unsigned int windows; -	struct pci_window *window; +	int node;		/* nearest node with memory or NUMA_NO_NODE for global allocation */  	void *platform_data;  }; +  #define PCI_CONTROLLER(busdev) ((struct pci_controller *) busdev->sysdata)  #define pci_domain_nr(busdev)    (PCI_CONTROLLER(busdev)->segment) @@ -114,12 +108,6 @@ static inline int pci_proc_domain(struct pci_bus *bus)  	return (pci_domain_nr(bus) != 0);  } -extern void pcibios_resource_to_bus(struct pci_dev *dev, -		struct pci_bus_region *region, struct resource *res); - -extern void pcibios_bus_to_resource(struct pci_dev *dev, -		struct resource *res, struct pci_bus_region *region); -  static inline struct resource *  pcibios_select_root(struct pci_dev *pdev, struct resource *res)  { @@ -139,7 +127,7 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)  	return channel ? isa_irq_to_vector(15) : isa_irq_to_vector(14);  } -#ifdef CONFIG_DMAR +#ifdef CONFIG_INTEL_IOMMU  extern void pci_iommu_alloc(void);  #endif  #endif /* _ASM_IA64_PCI_H */ diff --git a/arch/ia64/include/asm/perfmon.h b/arch/ia64/include/asm/perfmon.h index 7f3333dd00e..15476dd3a8b 100644 --- a/arch/ia64/include/asm/perfmon.h +++ b/arch/ia64/include/asm/perfmon.h @@ -2,179 +2,12 @@   * Copyright (C) 2001-2003 Hewlett-Packard Co   *               Stephane Eranian <eranian@hpl.hp.com>   */ -  #ifndef _ASM_IA64_PERFMON_H  #define _ASM_IA64_PERFMON_H -/* - * perfmon comamnds supported on all CPU models - */ -#define PFM_WRITE_PMCS		0x01 -#define PFM_WRITE_PMDS		0x02 -#define PFM_READ_PMDS		0x03 -#define PFM_STOP		0x04 -#define PFM_START		0x05 -#define PFM_ENABLE		0x06 /* obsolete */ -#define PFM_DISABLE		0x07 /* obsolete */ -#define PFM_CREATE_CONTEXT	0x08 -#define PFM_DESTROY_CONTEXT	0x09 /* obsolete use close() */ -#define PFM_RESTART		0x0a -#define PFM_PROTECT_CONTEXT	0x0b /* obsolete */ -#define PFM_GET_FEATURES	0x0c -#define PFM_DEBUG		0x0d -#define PFM_UNPROTECT_CONTEXT	0x0e /* obsolete */ -#define PFM_GET_PMC_RESET_VAL	0x0f -#define PFM_LOAD_CONTEXT	0x10 -#define PFM_UNLOAD_CONTEXT	0x11 - -/* - * PMU model specific commands (may not be supported on all PMU models) - */ -#define PFM_WRITE_IBRS		0x20 -#define PFM_WRITE_DBRS		0x21 - -/* - * context flags - */ -#define PFM_FL_NOTIFY_BLOCK    	 0x01	/* block task on user level notifications */ -#define PFM_FL_SYSTEM_WIDE	 0x02	/* create a system wide context */ -#define PFM_FL_OVFL_NO_MSG	 0x80   /* do not post overflow/end messages for notification */ - -/* - * event set flags - */ -#define PFM_SETFL_EXCL_IDLE      0x01   /* exclude idle task (syswide only) XXX: DO NOT USE YET */ - -/* - * PMC flags - */ -#define PFM_REGFL_OVFL_NOTIFY	0x1	/* send notification on overflow */ -#define PFM_REGFL_RANDOM	0x2	/* randomize sampling interval   */ - -/* - * PMD/PMC/IBR/DBR return flags (ignored on input) - * - * Those flags are used on output and must be checked in case EAGAIN is returned - * by any of the calls using a pfarg_reg_t or pfarg_dbreg_t structure. - */ -#define PFM_REG_RETFL_NOTAVAIL	(1UL<<31) /* set if register is implemented but not available */ -#define PFM_REG_RETFL_EINVAL	(1UL<<30) /* set if register entry is invalid */ -#define PFM_REG_RETFL_MASK	(PFM_REG_RETFL_NOTAVAIL|PFM_REG_RETFL_EINVAL) - -#define PFM_REG_HAS_ERROR(flag)	(((flag) & PFM_REG_RETFL_MASK) != 0) - -typedef unsigned char pfm_uuid_t[16];	/* custom sampling buffer identifier type */ - -/* - * Request structure used to define a context - */ -typedef struct { -	pfm_uuid_t     ctx_smpl_buf_id;	 /* which buffer format to use (if needed) */ -	unsigned long  ctx_flags;	 /* noblock/block */ -	unsigned short ctx_nextra_sets;	 /* number of extra event sets (you always get 1) */ -	unsigned short ctx_reserved1;	 /* for future use */ -	int	       ctx_fd;		 /* return arg: unique identification for context */ -	void	       *ctx_smpl_vaddr;	 /* return arg: virtual address of sampling buffer, is used */ -	unsigned long  ctx_reserved2[11];/* for future use */ -} pfarg_context_t; - -/* - * Request structure used to write/read a PMC or PMD - */ -typedef struct { -	unsigned int	reg_num;	   /* which register */ -	unsigned short	reg_set;	   /* event set for this register */ -	unsigned short	reg_reserved1;	   /* for future use */ - -	unsigned long	reg_value;	   /* initial pmc/pmd value */ -	unsigned long	reg_flags;	   /* input: pmc/pmd flags, return: reg error */ - -	unsigned long	reg_long_reset;	   /* reset after buffer overflow notification */ -	unsigned long	reg_short_reset;   /* reset after counter overflow */ - -	unsigned long	reg_reset_pmds[4]; /* which other counters to reset on overflow */ -	unsigned long	reg_random_seed;   /* seed value when randomization is used */ -	unsigned long	reg_random_mask;   /* bitmask used to limit random value */ -	unsigned long   reg_last_reset_val;/* return: PMD last reset value */ - -	unsigned long	reg_smpl_pmds[4];  /* which pmds are accessed when PMC overflows */ -	unsigned long	reg_smpl_eventid;  /* opaque sampling event identifier */ - -	unsigned long   reg_reserved2[3];   /* for future use */ -} pfarg_reg_t; - -typedef struct { -	unsigned int	dbreg_num;		/* which debug register */ -	unsigned short	dbreg_set;		/* event set for this register */ -	unsigned short	dbreg_reserved1;	/* for future use */ -	unsigned long	dbreg_value;		/* value for debug register */ -	unsigned long	dbreg_flags;		/* return: dbreg error */ -	unsigned long	dbreg_reserved2[1];	/* for future use */ -} pfarg_dbreg_t; - -typedef struct { -	unsigned int	ft_version;	/* perfmon: major [16-31], minor [0-15] */ -	unsigned int	ft_reserved;	/* reserved for future use */ -	unsigned long	reserved[4];	/* for future use */ -} pfarg_features_t; - -typedef struct { -	pid_t		load_pid;	   /* process to load the context into */ -	unsigned short	load_set;	   /* first event set to load */ -	unsigned short	load_reserved1;	   /* for future use */ -	unsigned long	load_reserved2[3]; /* for future use */ -} pfarg_load_t; - -typedef struct { -	int		msg_type;		/* generic message header */ -	int		msg_ctx_fd;		/* generic message header */ -	unsigned long	msg_ovfl_pmds[4];	/* which PMDs overflowed */ -	unsigned short  msg_active_set;		/* active set at the time of overflow */ -	unsigned short  msg_reserved1;		/* for future use */ -	unsigned int    msg_reserved2;		/* for future use */ -	unsigned long	msg_tstamp;		/* for perf tuning/debug */ -} pfm_ovfl_msg_t; - -typedef struct { -	int		msg_type;		/* generic message header */ -	int		msg_ctx_fd;		/* generic message header */ -	unsigned long	msg_tstamp;		/* for perf tuning */ -} pfm_end_msg_t; - -typedef struct { -	int		msg_type;		/* type of the message */ -	int		msg_ctx_fd;		/* unique identifier for the context */ -	unsigned long	msg_tstamp;		/* for perf tuning */ -} pfm_gen_msg_t; - -#define PFM_MSG_OVFL	1	/* an overflow happened */ -#define PFM_MSG_END	2	/* task to which context was attached ended */ - -typedef union { -	pfm_ovfl_msg_t	pfm_ovfl_msg; -	pfm_end_msg_t	pfm_end_msg; -	pfm_gen_msg_t	pfm_gen_msg; -} pfm_msg_t; - -/* - * Define the version numbers for both perfmon as a whole and the sampling buffer format. - */ -#define PFM_VERSION_MAJ		 2U -#define PFM_VERSION_MIN		 0U -#define PFM_VERSION		 (((PFM_VERSION_MAJ&0xffff)<<16)|(PFM_VERSION_MIN & 0xffff)) -#define PFM_VERSION_MAJOR(x)	 (((x)>>16) & 0xffff) -#define PFM_VERSION_MINOR(x)	 ((x) & 0xffff) +#include <uapi/asm/perfmon.h> -/* - * miscellaneous architected definitions - */ -#define PMU_FIRST_COUNTER	4	/* first counting monitor (PMC/PMD) */ -#define PMU_MAX_PMCS		256	/* maximum architected number of PMC registers */ -#define PMU_MAX_PMDS		256	/* maximum architected number of PMD registers */ - -#ifdef __KERNEL__ -  extern long perfmonctl(int fd, int cmd, void *arg, int narg);  typedef struct { @@ -274,6 +107,4 @@ typedef struct {  extern pfm_sysctl_t pfm_sysctl; -#endif /* __KERNEL__ */ -  #endif /* _ASM_IA64_PERFMON_H */ diff --git a/arch/ia64/include/asm/pgalloc.h b/arch/ia64/include/asm/pgalloc.h index 96a8d927db2..5767cdfc08d 100644 --- a/arch/ia64/include/asm/pgalloc.h +++ b/arch/ia64/include/asm/pgalloc.h @@ -91,7 +91,10 @@ static inline pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long addr)  	if (!pg)  		return NULL;  	page = virt_to_page(pg); -	pgtable_page_ctor(page); +	if (!pgtable_page_ctor(page)) { +		quicklist_free(0, NULL, pg); +		return NULL; +	}  	return page;  } diff --git a/arch/ia64/include/asm/pgtable.h b/arch/ia64/include/asm/pgtable.h index 1a97af31ef1..7935115398a 100644 --- a/arch/ia64/include/asm/pgtable.h +++ b/arch/ia64/include/asm/pgtable.h @@ -16,7 +16,6 @@  #include <asm/mman.h>  #include <asm/page.h>  #include <asm/processor.h> -#include <asm/system.h>  #include <asm/types.h>  #define IA64_MAX_PHYS_BITS	50	/* max. number of physical address bits (architected) */ @@ -494,9 +493,6 @@ extern void paging_init (void);  #define pte_to_pgoff(pte)		((pte_val(pte) << 1) >> 3)  #define pgoff_to_pte(off)		((pte_t) { ((off) << 2) | _PAGE_FILE }) -#define io_remap_pfn_range(vma, vaddr, pfn, size, prot)		\ -		remap_pfn_range(vma, vaddr, pfn, size, prot) -  /*   * ZERO_PAGE is a global shared page that is always zero: used   * for zero-mapped memory areas etc.. diff --git a/arch/ia64/include/asm/posix_types.h b/arch/ia64/include/asm/posix_types.h deleted file mode 100644 index 17885567b73..00000000000 --- a/arch/ia64/include/asm/posix_types.h +++ /dev/null @@ -1,126 +0,0 @@ -#ifndef _ASM_IA64_POSIX_TYPES_H -#define _ASM_IA64_POSIX_TYPES_H - -/* - * This file is generally used by user-level software, so you need to - * be a little careful about namespace pollution etc.  Also, we cannot - * assume GCC is being used. - * - * Based on <asm-alpha/posix_types.h>. - * - * Modified 1998-2000, 2003 - *	David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co - */ - -typedef unsigned long	__kernel_ino_t; -typedef unsigned int	__kernel_mode_t; -typedef unsigned int	__kernel_nlink_t; -typedef long		__kernel_off_t; -typedef long long	__kernel_loff_t; -typedef int		__kernel_pid_t; -typedef int		__kernel_ipc_pid_t; -typedef unsigned int	__kernel_uid_t; -typedef unsigned int	__kernel_gid_t; -typedef unsigned long	__kernel_size_t; -typedef long		__kernel_ssize_t; -typedef long		__kernel_ptrdiff_t; -typedef long		__kernel_time_t; -typedef long		__kernel_suseconds_t; -typedef long		__kernel_clock_t; -typedef int		__kernel_timer_t; -typedef int		__kernel_clockid_t; -typedef int		__kernel_daddr_t; -typedef char *		__kernel_caddr_t; -typedef unsigned long	__kernel_sigset_t;	/* at least 32 bits */ -typedef unsigned short	__kernel_uid16_t; -typedef unsigned short	__kernel_gid16_t; - -typedef struct { -	int	val[2]; -} __kernel_fsid_t; - -typedef __kernel_uid_t __kernel_old_uid_t; -typedef __kernel_gid_t __kernel_old_gid_t; -typedef __kernel_uid_t __kernel_uid32_t; -typedef __kernel_gid_t __kernel_gid32_t; - -typedef unsigned int	__kernel_old_dev_t; - -# ifdef __KERNEL__ - -#  ifndef __GNUC__ - -#define	__FD_SET(d, set)	((set)->fds_bits[__FDELT(d)] |= __FDMASK(d)) -#define	__FD_CLR(d, set)	((set)->fds_bits[__FDELT(d)] &= ~__FDMASK(d)) -#define	__FD_ISSET(d, set)	(((set)->fds_bits[__FDELT(d)] & __FDMASK(d)) != 0) -#define	__FD_ZERO(set)	\ -  ((void) memset ((void *) (set), 0, sizeof (__kernel_fd_set))) - -#  else /* !__GNUC__ */ - -/* With GNU C, use inline functions instead so args are evaluated only once: */ - -#undef __FD_SET -static __inline__ void __FD_SET(unsigned long fd, __kernel_fd_set *fdsetp) -{ -	unsigned long _tmp = fd / __NFDBITS; -	unsigned long _rem = fd % __NFDBITS; -	fdsetp->fds_bits[_tmp] |= (1UL<<_rem); -} - -#undef __FD_CLR -static __inline__ void __FD_CLR(unsigned long fd, __kernel_fd_set *fdsetp) -{ -	unsigned long _tmp = fd / __NFDBITS; -	unsigned long _rem = fd % __NFDBITS; -	fdsetp->fds_bits[_tmp] &= ~(1UL<<_rem); -} - -#undef __FD_ISSET -static __inline__ int __FD_ISSET(unsigned long fd, const __kernel_fd_set *p) -{  -	unsigned long _tmp = fd / __NFDBITS; -	unsigned long _rem = fd % __NFDBITS; -	return (p->fds_bits[_tmp] & (1UL<<_rem)) != 0; -} - -/* - * This will unroll the loop for the normal constant case (8 ints, - * for a 256-bit fd_set) - */ -#undef __FD_ZERO -static __inline__ void __FD_ZERO(__kernel_fd_set *p) -{ -	unsigned long *tmp = p->fds_bits; -	int i; - -	if (__builtin_constant_p(__FDSET_LONGS)) { -		switch (__FDSET_LONGS) { -		      case 16: -			tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; -			tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; -			tmp[ 8] = 0; tmp[ 9] = 0; tmp[10] = 0; tmp[11] = 0; -			tmp[12] = 0; tmp[13] = 0; tmp[14] = 0; tmp[15] = 0; -			return; - -		      case 8: -			tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; -			tmp[ 4] = 0; tmp[ 5] = 0; tmp[ 6] = 0; tmp[ 7] = 0; -			return; - -		      case 4: -			tmp[ 0] = 0; tmp[ 1] = 0; tmp[ 2] = 0; tmp[ 3] = 0; -			return; -		} -	} -	i = __FDSET_LONGS; -	while (i) { -		i--; -		*tmp = 0; -		tmp++; -	} -} - -#  endif /* !__GNUC__ */ -# endif /* __KERNEL__ */ -#endif /* _ASM_IA64_POSIX_TYPES_H */ diff --git a/arch/ia64/include/asm/processor.h b/arch/ia64/include/asm/processor.h index 348e44d08ce..efd1b927ccb 100644 --- a/arch/ia64/include/asm/processor.h +++ b/arch/ia64/include/asm/processor.h @@ -19,6 +19,9 @@  #include <asm/ptrace.h>  #include <asm/ustack.h> +#define __ARCH_WANT_UNLOCKED_CTXSW +#define ARCH_HAS_PREFETCH_SWITCH_STACK +  #define IA64_NUM_PHYS_STACK_REG	96  #define IA64_NUM_DBG_REGS	8 @@ -31,8 +34,7 @@   * each (assuming 8KB page size), for a total of 8TB of user virtual   * address space.   */ -#define TASK_SIZE_OF(tsk)	((tsk)->thread.task_size) -#define TASK_SIZE       	TASK_SIZE_OF(current) +#define TASK_SIZE       	DEFAULT_TASK_SIZE  /*   * This decides where the kernel will search for a free chunk of vm @@ -69,13 +71,14 @@  #include <linux/compiler.h>  #include <linux/threads.h>  #include <linux/types.h> +#include <linux/bitops.h>  #include <asm/fpu.h>  #include <asm/page.h>  #include <asm/percpu.h>  #include <asm/rse.h>  #include <asm/unwind.h> -#include <asm/atomic.h> +#include <linux/atomic.h>  #ifdef CONFIG_NUMA  #include <asm/nodedata.h>  #endif @@ -277,7 +280,6 @@ struct thread_struct {  	__u8 pad[3];  	__u64 ksp;			/* kernel stack pointer */  	__u64 map_base;			/* base address for get_unmapped_area() */ -	__u64 task_size;		/* limit for task size */  	__u64 rbs_bot;			/* the base address for the RBS */  	int last_fph_cpu;		/* CPU that may hold the contents of f32-f127 */ @@ -300,7 +302,6 @@ struct thread_struct {  	.ksp =		0,					\  	.map_base =	DEFAULT_MAP_BASE,			\  	.rbs_bot =	STACK_TOP - DEFAULT_USER_STACK_SIZE,	\ -	.task_size =	DEFAULT_TASK_SIZE,			\  	.last_fph_cpu =  -1,					\  	INIT_THREAD_PM						\  	.dbr =		{0, },					\ @@ -309,7 +310,6 @@ struct thread_struct {  }  #define start_thread(regs,new_ip,new_sp) do {							\ -	set_fs(USER_DS);									\  	regs->cr_ipsr = ((regs->cr_ipsr | (IA64_PSR_BITS_TO_SET | IA64_PSR_CPL))		\  			 & ~(IA64_PSR_BITS_TO_CLEAR | IA64_PSR_RI | IA64_PSR_IS));		\  	regs->cr_iip = new_ip;									\ @@ -320,7 +320,7 @@ struct thread_struct {  	regs->loadrs = 0;									\  	regs->r8 = get_dumpable(current->mm);	/* set "don't zap registers" flag */		\  	regs->r12 = new_sp - 16;	/* allocate 16 byte scratch area */			\ -	if (unlikely(!get_dumpable(current->mm))) {							\ +	if (unlikely(get_dumpable(current->mm) != SUID_DUMP_USER)) {	\  		/*										\  		 * Zap scratch regs to avoid leaking bits between processes with different	\  		 * uid/privileges.								\ @@ -341,25 +341,6 @@ struct task_struct;   */  #define release_thread(dead_task) -/* Prepare to copy thread state - unlazy all lazy status */ -#define prepare_to_copy(tsk)	do { } while (0) - -/* - * This is the mechanism for creating a new kernel thread. - * - * NOTE 1: Only a kernel-only process (ie the swapper or direct - * descendants who haven't done an "execve()") should use this: it - * will work within a system call from a "real" process, but the - * process memory space will not be free'd until both the parent and - * the child have exited. - * - * NOTE 2: This MUST NOT be an inlined function.  Otherwise, we get - * into trouble in init/main.c when the child thread returns to - * do_basic_setup() and the timing is such that free_initmem() has - * been called already. - */ -extern pid_t kernel_thread (int (*fn)(void *), void *arg, unsigned long flags); -  /* Get wait channel for task P.  */  extern unsigned long get_wchan (struct task_struct *p); @@ -717,8 +698,13 @@ prefetchw (const void *x)  #define spin_lock_prefetch(x)	prefetchw(x)  extern unsigned long boot_option_idle_override; -extern unsigned long idle_halt; -extern unsigned long idle_nomwait; + +enum idle_boot_override {IDLE_NO_OVERRIDE=0, IDLE_HALT, IDLE_FORCE_MWAIT, +			 IDLE_NOMWAIT, IDLE_POLL}; + +void default_idle(void); + +#define ia64_platform_is(x) (strcmp(x, ia64_platform_name) == 0)  #endif /* !__ASSEMBLY__ */ diff --git a/arch/ia64/include/asm/ptrace.h b/arch/ia64/include/asm/ptrace.h index 7ae9c3f15a1..845143990a1 100644 --- a/arch/ia64/include/asm/ptrace.h +++ b/arch/ia64/include/asm/ptrace.h @@ -1,6 +1,3 @@ -#ifndef _ASM_IA64_PTRACE_H -#define _ASM_IA64_PTRACE_H -  /*   * Copyright (C) 1998-2004 Hewlett-Packard Co   *	David Mosberger-Tang <davidm@hpl.hp.com> @@ -15,52 +12,13 @@   *  6/17/99	D. Mosberger	added second unat member to "struct switch_stack"   *   */ -/* - * When a user process is blocked, its state looks as follows: - * - *            +----------------------+	-------	IA64_STK_OFFSET - *     	      |			     |	 ^ - *            | struct pt_regs       |	 | - *	      |			     |	 | - *            +----------------------+	 | - *	      |			     |	 | - *     	      |	   memory stack	     |	 | - *	      |	(growing downwards)  |	 | - *	      //.....................//	 | - *					 | - *	      //.....................//	 | - *	      |			     |	 | - *            +----------------------+	 | - *            | struct switch_stack  |	 | - *	      |			     |	 | - *	      +----------------------+	 | - *	      |			     |	 | - *	      //.....................//	 | - *					 | - *	      //.....................//	 | - *	      |			     |	 | - *	      |	 register stack	     |	 | - *	      |	(growing upwards)    |	 | - *            |			     |	 | - *	      +----------------------+	 |  ---	IA64_RBS_OFFSET - *            |  struct thread_info  |	 |  ^ - *	      +----------------------+	 |  | - *	      |			     |	 |  | - *            |  struct task_struct  |	 |  | - * current -> |			     |   |  | - *	      +----------------------+ ------- - * - * Note that ar.ec is not saved explicitly in pt_reg or switch_stack. - * This is because ar.ec is saved as part of ar.pfs. - */ - - -#include <asm/fpu.h> +#ifndef _ASM_IA64_PTRACE_H +#define _ASM_IA64_PTRACE_H -#ifdef __KERNEL__  #ifndef ASM_OFFSETS_C  #include <asm/asm-offsets.h>  #endif +#include <uapi/asm/ptrace.h>  /*   * Base-2 logarithm of number of pages to allocate per task structure @@ -81,155 +39,8 @@  #define KERNEL_STACK_SIZE		IA64_STK_OFFSET -#endif /* __KERNEL__ */ -  #ifndef __ASSEMBLY__ -/* - * This struct defines the way the registers are saved on system - * calls. - * - * We don't save all floating point register because the kernel - * is compiled to use only a very small subset, so the other are - * untouched. - * - * THIS STRUCTURE MUST BE A MULTIPLE 16-BYTE IN SIZE - * (because the memory stack pointer MUST ALWAYS be aligned this way) - * - */ -struct pt_regs { -	/* The following registers are saved by SAVE_MIN: */ -	unsigned long b6;		/* scratch */ -	unsigned long b7;		/* scratch */ - -	unsigned long ar_csd;           /* used by cmp8xchg16 (scratch) */ -	unsigned long ar_ssd;           /* reserved for future use (scratch) */ - -	unsigned long r8;		/* scratch (return value register 0) */ -	unsigned long r9;		/* scratch (return value register 1) */ -	unsigned long r10;		/* scratch (return value register 2) */ -	unsigned long r11;		/* scratch (return value register 3) */ - -	unsigned long cr_ipsr;		/* interrupted task's psr */ -	unsigned long cr_iip;		/* interrupted task's instruction pointer */ -	/* -	 * interrupted task's function state; if bit 63 is cleared, it -	 * contains syscall's ar.pfs.pfm: -	 */ -	unsigned long cr_ifs; - -	unsigned long ar_unat;		/* interrupted task's NaT register (preserved) */ -	unsigned long ar_pfs;		/* prev function state  */ -	unsigned long ar_rsc;		/* RSE configuration */ -	/* The following two are valid only if cr_ipsr.cpl > 0 || ti->flags & _TIF_MCA_INIT */ -	unsigned long ar_rnat;		/* RSE NaT */ -	unsigned long ar_bspstore;	/* RSE bspstore */ - -	unsigned long pr;		/* 64 predicate registers (1 bit each) */ -	unsigned long b0;		/* return pointer (bp) */ -	unsigned long loadrs;		/* size of dirty partition << 16 */ - -	unsigned long r1;		/* the gp pointer */ -	unsigned long r12;		/* interrupted task's memory stack pointer */ -	unsigned long r13;		/* thread pointer */ - -	unsigned long ar_fpsr;		/* floating point status (preserved) */ -	unsigned long r15;		/* scratch */ - -	/* The remaining registers are NOT saved for system calls.  */ - -	unsigned long r14;		/* scratch */ -	unsigned long r2;		/* scratch */ -	unsigned long r3;		/* scratch */ - -	/* The following registers are saved by SAVE_REST: */ -	unsigned long r16;		/* scratch */ -	unsigned long r17;		/* scratch */ -	unsigned long r18;		/* scratch */ -	unsigned long r19;		/* scratch */ -	unsigned long r20;		/* scratch */ -	unsigned long r21;		/* scratch */ -	unsigned long r22;		/* scratch */ -	unsigned long r23;		/* scratch */ -	unsigned long r24;		/* scratch */ -	unsigned long r25;		/* scratch */ -	unsigned long r26;		/* scratch */ -	unsigned long r27;		/* scratch */ -	unsigned long r28;		/* scratch */ -	unsigned long r29;		/* scratch */ -	unsigned long r30;		/* scratch */ -	unsigned long r31;		/* scratch */ - -	unsigned long ar_ccv;		/* compare/exchange value (scratch) */ - -	/* -	 * Floating point registers that the kernel considers scratch: -	 */ -	struct ia64_fpreg f6;		/* scratch */ -	struct ia64_fpreg f7;		/* scratch */ -	struct ia64_fpreg f8;		/* scratch */ -	struct ia64_fpreg f9;		/* scratch */ -	struct ia64_fpreg f10;		/* scratch */ -	struct ia64_fpreg f11;		/* scratch */ -}; - -/* - * This structure contains the addition registers that need to - * preserved across a context switch.  This generally consists of - * "preserved" registers. - */ -struct switch_stack { -	unsigned long caller_unat;	/* user NaT collection register (preserved) */ -	unsigned long ar_fpsr;		/* floating-point status register */ - -	struct ia64_fpreg f2;		/* preserved */ -	struct ia64_fpreg f3;		/* preserved */ -	struct ia64_fpreg f4;		/* preserved */ -	struct ia64_fpreg f5;		/* preserved */ - -	struct ia64_fpreg f12;		/* scratch, but untouched by kernel */ -	struct ia64_fpreg f13;		/* scratch, but untouched by kernel */ -	struct ia64_fpreg f14;		/* scratch, but untouched by kernel */ -	struct ia64_fpreg f15;		/* scratch, but untouched by kernel */ -	struct ia64_fpreg f16;		/* preserved */ -	struct ia64_fpreg f17;		/* preserved */ -	struct ia64_fpreg f18;		/* preserved */ -	struct ia64_fpreg f19;		/* preserved */ -	struct ia64_fpreg f20;		/* preserved */ -	struct ia64_fpreg f21;		/* preserved */ -	struct ia64_fpreg f22;		/* preserved */ -	struct ia64_fpreg f23;		/* preserved */ -	struct ia64_fpreg f24;		/* preserved */ -	struct ia64_fpreg f25;		/* preserved */ -	struct ia64_fpreg f26;		/* preserved */ -	struct ia64_fpreg f27;		/* preserved */ -	struct ia64_fpreg f28;		/* preserved */ -	struct ia64_fpreg f29;		/* preserved */ -	struct ia64_fpreg f30;		/* preserved */ -	struct ia64_fpreg f31;		/* preserved */ - -	unsigned long r4;		/* preserved */ -	unsigned long r5;		/* preserved */ -	unsigned long r6;		/* preserved */ -	unsigned long r7;		/* preserved */ - -	unsigned long b0;		/* so we can force a direct return in copy_thread */ -	unsigned long b1; -	unsigned long b2; -	unsigned long b3; -	unsigned long b4; -	unsigned long b5; - -	unsigned long ar_pfs;		/* previous function state */ -	unsigned long ar_lc;		/* loop counter (preserved) */ -	unsigned long ar_unat;		/* NaT bits for r4-r7 */ -	unsigned long ar_rnat;		/* RSE NaT collection register */ -	unsigned long ar_bspstore;	/* RSE dirty base (preserved) */ -	unsigned long pr;		/* 64 predicate registers (1 bit each) */ -}; - -#ifdef __KERNEL__ -  #include <asm/current.h>  #include <asm/page.h> @@ -246,7 +57,18 @@ static inline unsigned long user_stack_pointer(struct pt_regs *regs)  	return regs->ar_bspstore;  } -#define regs_return_value(regs) ((regs)->r8) +static inline int is_syscall_success(struct pt_regs *regs) +{ +	return regs->r10 != -1; +} + +static inline long regs_return_value(struct pt_regs *regs) +{ +	if (is_syscall_success(regs)) +		return regs->r8; +	else +		return -regs->r8; +}  /* Conserve space in histogram by encoding slot bits in address   * bits 2 and 3 rather than bits 0 and 1. @@ -256,6 +78,11 @@ static inline unsigned long user_stack_pointer(struct pt_regs *regs)  	unsigned long __ip = instruction_pointer(regs);			\  	(__ip & ~3UL) + ((__ip & 3UL) << 2);				\  }) +/* + * Why not default?  Because user_stack_pointer() on ia64 gives register + * stack backing store instead... + */ +#define current_user_stack_pointer() (current_pt_regs()->r12)    /* given a pointer to a task_struct, return the user's pt_regs */  # define task_pt_regs(t)		(((struct pt_regs *) ((char *) (t) + IA64_STK_OFFSET)) - 1) @@ -286,7 +113,6 @@ static inline unsigned long user_stack_pointer(struct pt_regs *regs)    struct task_struct;			/* forward decl */    struct unw_frame_info;		/* forward decl */ -  extern void show_regs (struct pt_regs *);    extern void ia64_do_show_stack (struct unw_frame_info *, void *);    extern unsigned long ia64_get_user_rbs_end (struct task_struct *, struct pt_regs *,  					      unsigned long *); @@ -321,46 +147,5 @@ static inline unsigned long user_stack_pointer(struct pt_regs *regs)    #define arch_has_single_step()  (1)    #define arch_has_block_step()   (1) -#endif /* !__KERNEL__ */ - -/* pt_all_user_regs is used for PTRACE_GETREGS PTRACE_SETREGS */ -struct pt_all_user_regs { -	unsigned long nat; -	unsigned long cr_iip; -	unsigned long cfm; -	unsigned long cr_ipsr; -	unsigned long pr; - -	unsigned long gr[32]; -	unsigned long br[8]; -	unsigned long ar[128]; -	struct ia64_fpreg fr[128]; -}; -  #endif /* !__ASSEMBLY__ */ - -/* indices to application-registers array in pt_all_user_regs */ -#define PT_AUR_RSC	16 -#define PT_AUR_BSP	17 -#define PT_AUR_BSPSTORE	18 -#define PT_AUR_RNAT	19 -#define PT_AUR_CCV	32 -#define PT_AUR_UNAT	36 -#define PT_AUR_FPSR	40 -#define PT_AUR_PFS	64 -#define PT_AUR_LC	65 -#define PT_AUR_EC	66 - -/* - * The numbers chosen here are somewhat arbitrary but absolutely MUST - * not overlap with any of the number assigned in <linux/ptrace.h>. - */ -#define PTRACE_SINGLEBLOCK	12	/* resume execution until next branch */ -#define PTRACE_OLD_GETSIGINFO	13	/* (replaced by PTRACE_GETSIGINFO in <linux/ptrace.h>)  */ -#define PTRACE_OLD_SETSIGINFO	14	/* (replaced by PTRACE_SETSIGINFO in <linux/ptrace.h>)  */ -#define PTRACE_GETREGS		18	/* get all registers (pt_all_user_regs) in one shot */ -#define PTRACE_SETREGS		19	/* set all registers (pt_all_user_regs) in one shot */ - -#define PTRACE_OLDSETOPTIONS	21 -  #endif /* _ASM_IA64_PTRACE_H */ diff --git a/arch/ia64/include/asm/pvclock-abi.h b/arch/ia64/include/asm/pvclock-abi.h index 44ef9ef8f5b..42b233bedeb 100644 --- a/arch/ia64/include/asm/pvclock-abi.h +++ b/arch/ia64/include/asm/pvclock-abi.h @@ -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 diff --git a/arch/ia64/include/asm/rwsem.h b/arch/ia64/include/asm/rwsem.h index 215d5454c7d..3027e7516d8 100644 --- a/arch/ia64/include/asm/rwsem.h +++ b/arch/ia64/include/asm/rwsem.h @@ -25,20 +25,8 @@  #error "Please don't include <asm/rwsem.h> directly, use <linux/rwsem.h> instead."  #endif -#include <linux/list.h> -#include <linux/spinlock.h> -  #include <asm/intrinsics.h> -/* - * the semaphore definition - */ -struct rw_semaphore { -	signed long		count; -	spinlock_t		wait_lock; -	struct list_head	wait_list; -}; -  #define RWSEM_UNLOCKED_VALUE		__IA64_UL_CONST(0x0000000000000000)  #define RWSEM_ACTIVE_BIAS		(1L)  #define RWSEM_ACTIVE_MASK		(0xffffffffL) @@ -46,26 +34,6 @@ struct rw_semaphore {  #define RWSEM_ACTIVE_READ_BIAS		RWSEM_ACTIVE_BIAS  #define RWSEM_ACTIVE_WRITE_BIAS		(RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS) -#define __RWSEM_INITIALIZER(name) \ -	{ RWSEM_UNLOCKED_VALUE, __SPIN_LOCK_UNLOCKED((name).wait_lock), \ -	  LIST_HEAD_INIT((name).wait_list) } - -#define DECLARE_RWSEM(name) \ -	struct rw_semaphore name = __RWSEM_INITIALIZER(name) - -extern struct rw_semaphore *rwsem_down_read_failed(struct rw_semaphore *sem); -extern struct rw_semaphore *rwsem_down_write_failed(struct rw_semaphore *sem); -extern struct rw_semaphore *rwsem_wake(struct rw_semaphore *sem); -extern struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem); - -static inline void -init_rwsem (struct rw_semaphore *sem) -{ -	sem->count = RWSEM_UNLOCKED_VALUE; -	spin_lock_init(&sem->wait_lock); -	INIT_LIST_HEAD(&sem->wait_list); -} -  /*   * lock for reading   */ @@ -174,9 +142,4 @@ __downgrade_write (struct rw_semaphore *sem)  #define rwsem_atomic_add(delta, sem)	atomic64_add(delta, (atomic64_t *)(&(sem)->count))  #define rwsem_atomic_update(delta, sem)	atomic64_add_return(delta, (atomic64_t *)(&(sem)->count)) -static inline int rwsem_is_locked(struct rw_semaphore *sem) -{ -	return (sem->count != 0); -} -  #endif /* _ASM_IA64_RWSEM_H */ diff --git a/arch/ia64/include/asm/sal.h b/arch/ia64/include/asm/sal.h index d19ddba4e32..e504f382115 100644 --- a/arch/ia64/include/asm/sal.h +++ b/arch/ia64/include/asm/sal.h @@ -40,7 +40,6 @@  #include <linux/efi.h>  #include <asm/pal.h> -#include <asm/system.h>  #include <asm/fpu.h>  extern spinlock_t sal_lock; diff --git a/arch/ia64/include/asm/setup.h b/arch/ia64/include/asm/setup.h deleted file mode 100644 index 4399a44355b..00000000000 --- a/arch/ia64/include/asm/setup.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef __IA64_SETUP_H -#define __IA64_SETUP_H - -#define COMMAND_LINE_SIZE	2048 - -#endif diff --git a/arch/ia64/include/asm/siginfo.h b/arch/ia64/include/asm/siginfo.h index c8fcaa2ac48..6f2e2dd0f28 100644 --- a/arch/ia64/include/asm/siginfo.h +++ b/arch/ia64/include/asm/siginfo.h @@ -1,124 +1,14 @@ -#ifndef _ASM_IA64_SIGINFO_H -#define _ASM_IA64_SIGINFO_H -  /*   * Based on <asm-i386/siginfo.h>.   *   * Modified 1998-2002   *	David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co   */ +#ifndef _ASM_IA64_SIGINFO_H +#define _ASM_IA64_SIGINFO_H -#define __ARCH_SI_PREAMBLE_SIZE	(4 * sizeof(int)) - -#define HAVE_ARCH_SIGINFO_T -#define HAVE_ARCH_COPY_SIGINFO -#define HAVE_ARCH_COPY_SIGINFO_TO_USER - -#include <asm-generic/siginfo.h> - -typedef struct siginfo { -	int si_signo; -	int si_errno; -	int si_code; -	int __pad0; - -	union { -		int _pad[SI_PAD_SIZE]; - -		/* kill() */ -		struct { -			pid_t _pid;		/* sender's pid */ -			uid_t _uid;		/* sender's uid */ -		} _kill; - -		/* POSIX.1b timers */ -		struct { -			timer_t _tid;		/* timer id */ -			int _overrun;		/* overrun count */ -			char _pad[sizeof(__ARCH_SI_UID_T) - sizeof(int)]; -			sigval_t _sigval;	/* must overlay ._rt._sigval! */ -			int _sys_private;	/* not to be passed to user */ -		} _timer; - -		/* POSIX.1b signals */ -		struct { -			pid_t _pid;		/* sender's pid */ -			uid_t _uid;		/* sender's uid */ -			sigval_t _sigval; -		} _rt; - -		/* SIGCHLD */ -		struct { -			pid_t _pid;		/* which child */ -			uid_t _uid;		/* sender's uid */ -			int _status;		/* exit code */ -			clock_t _utime; -			clock_t _stime; -		} _sigchld; - -		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ -		struct { -			void __user *_addr;	/* faulting insn/memory ref. */ -			int _imm;		/* immediate value for "break" */ -			unsigned int _flags;	/* see below */ -			unsigned long _isr;	/* isr */ -			short _addr_lsb;	/* lsb of faulting address */ -		} _sigfault; - -		/* SIGPOLL */ -		struct { -			long _band;	/* POLL_IN, POLL_OUT, POLL_MSG (XPG requires a "long") */ -			int _fd; -		} _sigpoll; -	} _sifields; -} siginfo_t; - -#define si_imm		_sifields._sigfault._imm	/* as per UNIX SysV ABI spec */ -#define si_flags	_sifields._sigfault._flags -/* - * si_isr is valid for SIGILL, SIGFPE, SIGSEGV, SIGBUS, and SIGTRAP provided that - * si_code is non-zero and __ISR_VALID is set in si_flags. - */ -#define si_isr		_sifields._sigfault._isr - -/* - * Flag values for si_flags: - */ -#define __ISR_VALID_BIT	0 -#define __ISR_VALID	(1 << __ISR_VALID_BIT) - -/* - * SIGILL si_codes - */ -#define ILL_BADIADDR	(__SI_FAULT|9)	/* unimplemented instruction address */ -#define __ILL_BREAK	(__SI_FAULT|10)	/* illegal break */ -#define __ILL_BNDMOD	(__SI_FAULT|11)	/* bundle-update (modification) in progress */ -#undef NSIGILL -#define NSIGILL		11 - -/* - * SIGFPE si_codes - */ -#define __FPE_DECOVF	(__SI_FAULT|9)	/* decimal overflow */ -#define __FPE_DECDIV	(__SI_FAULT|10)	/* decimal division by zero */ -#define __FPE_DECERR	(__SI_FAULT|11)	/* packed decimal error */ -#define __FPE_INVASC	(__SI_FAULT|12)	/* invalid ASCII digit */ -#define __FPE_INVDEC	(__SI_FAULT|13)	/* invalid decimal digit */ -#undef NSIGFPE -#define NSIGFPE		13 - -/* - * SIGSEGV si_codes - */ -#define __SEGV_PSTKOVF	(__SI_FAULT|3)	/* paragraph stack overflow */ -#undef NSIGSEGV -#define NSIGSEGV	3 - -#undef NSIGTRAP -#define NSIGTRAP	4 - -#ifdef __KERNEL__  #include <linux/string.h> +#include <uapi/asm/siginfo.h>  static inline void  copy_siginfo (siginfo_t *to, siginfo_t *from) @@ -130,6 +20,4 @@ copy_siginfo (siginfo_t *to, siginfo_t *from)  		memcpy(to, from, 4*sizeof(int) + sizeof(from->_sifields._sigchld));  } -#endif /* __KERNEL__ */ -  #endif /* _ASM_IA64_SIGINFO_H */ diff --git a/arch/ia64/include/asm/signal.h b/arch/ia64/include/asm/signal.h index b166248d49a..c62afa4a0dc 100644 --- a/arch/ia64/include/asm/signal.h +++ b/arch/ia64/include/asm/signal.h @@ -1,6 +1,3 @@ -#ifndef _ASM_IA64_SIGNAL_H -#define _ASM_IA64_SIGNAL_H -  /*   * Modified 1998-2001, 2003   *	David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co @@ -8,129 +5,18 @@   * Unfortunately, this file is being included by bits/signal.h in   * glibc-2.x.  Hence the #ifdef __KERNEL__ ugliness.   */ +#ifndef _ASM_IA64_SIGNAL_H +#define _ASM_IA64_SIGNAL_H -#define SIGHUP		 1 -#define SIGINT		 2 -#define SIGQUIT		 3 -#define SIGILL		 4 -#define SIGTRAP		 5 -#define SIGABRT		 6 -#define SIGIOT		 6 -#define SIGBUS		 7 -#define SIGFPE		 8 -#define SIGKILL		 9 -#define SIGUSR1		10 -#define SIGSEGV		11 -#define SIGUSR2		12 -#define SIGPIPE		13 -#define SIGALRM		14 -#define SIGTERM		15 -#define SIGSTKFLT	16 -#define SIGCHLD		17 -#define SIGCONT		18 -#define SIGSTOP		19 -#define SIGTSTP		20 -#define SIGTTIN		21 -#define SIGTTOU		22 -#define SIGURG		23 -#define SIGXCPU		24 -#define SIGXFSZ		25 -#define SIGVTALRM	26 -#define SIGPROF		27 -#define SIGWINCH	28 -#define SIGIO		29 -#define SIGPOLL		SIGIO -/* -#define SIGLOST		29 -*/ -#define SIGPWR		30 -#define SIGSYS		31 -/* signal 31 is no longer "unused", but the SIGUNUSED macro remains for backwards compatibility */ -#define	SIGUNUSED	31 - -/* These should not be considered constants from userland.  */ -#define SIGRTMIN	32 -#define SIGRTMAX	_NSIG - -/* - * SA_FLAGS values: - * - * SA_ONSTACK indicates that a registered stack_t will be used. - * SA_RESTART flag to get restarting signals (which were the default long ago) - * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. - * SA_RESETHAND clears the handler when the signal is delivered. - * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. - * SA_NODEFER prevents the current signal from being masked in the handler. - * - * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single - * Unix names RESETHAND and NODEFER respectively. - */ -#define SA_NOCLDSTOP	0x00000001 -#define SA_NOCLDWAIT	0x00000002 -#define SA_SIGINFO	0x00000004 -#define SA_ONSTACK	0x08000000 -#define SA_RESTART	0x10000000 -#define SA_NODEFER	0x40000000 -#define SA_RESETHAND	0x80000000 - -#define SA_NOMASK	SA_NODEFER -#define SA_ONESHOT	SA_RESETHAND - -#define SA_RESTORER	0x04000000 - -/* - * sigaltstack controls - */ -#define SS_ONSTACK	1 -#define SS_DISABLE	2 - -/* - * The minimum stack size needs to be fairly large because we want to - * be sure that an app compiled for today's CPUs will continue to run - * on all future CPU models.  The CPU model matters because the signal - * frame needs to have space for the complete machine state, including - * all physical stacked registers.  The number of physical stacked - * registers is CPU model dependent, but given that the width of - * ar.rsc.loadrs is 14 bits, we can assume that they'll never take up - * more than 16KB of space. - */ -#if 1 -  /* -   * This is a stupid typo: the value was _meant_ to be 131072 (0x20000), but I typed it -   * in wrong. ;-(  To preserve backwards compatibility, we leave the kernel at the -   * incorrect value and fix libc only. -   */ -# define MINSIGSTKSZ	131027	/* min. stack size for sigaltstack() */ -#else -# define MINSIGSTKSZ	131072	/* min. stack size for sigaltstack() */ -#endif -#define SIGSTKSZ	262144	/* default stack size for sigaltstack() */ +#include <uapi/asm/signal.h> -#ifdef __KERNEL__  #define _NSIG		64  #define _NSIG_BPW	64  #define _NSIG_WORDS	(_NSIG / _NSIG_BPW) -#endif /* __KERNEL__ */ - -#include <asm-generic/signal-defs.h> -  # ifndef __ASSEMBLY__ -#  include <linux/types.h> - -/* Avoid too many header ordering problems.  */ -struct siginfo; - -typedef struct sigaltstack { -	void __user *ss_sp; -	int ss_flags; -	size_t ss_size; -} stack_t; - -#ifdef __KERNEL__ -  /* Most things should be clean enough to redefine this at will, if care     is taken to make libc match.  */ @@ -140,21 +26,7 @@ typedef struct {  	unsigned long sig[_NSIG_WORDS];  } sigset_t; -struct sigaction { -	__sighandler_t sa_handler; -	unsigned long sa_flags; -	sigset_t sa_mask;		/* mask last for extensibility */ -}; - -struct k_sigaction { -	struct sigaction sa; -}; -  #  include <asm/sigcontext.h> -#define ptrace_signal_deliver(regs, cookie) do { } while (0) - -#endif /* __KERNEL__ */ -  # endif /* !__ASSEMBLY__ */  #endif /* _ASM_IA64_SIGNAL_H */ diff --git a/arch/ia64/include/asm/smp.h b/arch/ia64/include/asm/smp.h index 0b3b3997dec..fea21e98602 100644 --- a/arch/ia64/include/asm/smp.h +++ b/arch/ia64/include/asm/smp.h @@ -55,7 +55,7 @@ extern struct smp_boot_data {  	int cpu_phys_id[NR_CPUS];  } smp_boot_data __initdata; -extern char no_int_routing __devinitdata; +extern char no_int_routing;  extern cpumask_t cpu_core_map[NR_CPUS];  DECLARE_PER_CPU_SHARED_ALIGNED(cpumask_t, cpu_sibling_map); diff --git a/arch/ia64/include/asm/sn/bte.h b/arch/ia64/include/asm/sn/bte.h index 96798d2da7c..cc6c4dbf53a 100644 --- a/arch/ia64/include/asm/sn/bte.h +++ b/arch/ia64/include/asm/sn/bte.h @@ -216,7 +216,7 @@ extern void bte_error_handler(unsigned long);  	bte_copy(0, dest, len, ((mode) | BTE_ZERO_FILL), notification)  /* - * The following is the prefered way of calling bte_unaligned_copy + * The following is the preferred way of calling bte_unaligned_copy   * If the copy is fully cache line aligned, then bte_copy is   * used instead.  Since bte_copy is inlined, this saves a call   * stack.  NOTE: bte_copy is called synchronously and does block diff --git a/arch/ia64/include/asm/sn/pda.h b/arch/ia64/include/asm/sn/pda.h index 1c5108d44d8..22ae358c8d1 100644 --- a/arch/ia64/include/asm/sn/pda.h +++ b/arch/ia64/include/asm/sn/pda.h @@ -10,7 +10,6 @@  #include <linux/cache.h>  #include <asm/percpu.h> -#include <asm/system.h>  /* diff --git a/arch/ia64/include/asm/sn/shub_mmr.h b/arch/ia64/include/asm/sn/shub_mmr.h index 7de1d1d4b71..a84d870f429 100644 --- a/arch/ia64/include/asm/sn/shub_mmr.h +++ b/arch/ia64/include/asm/sn/shub_mmr.h @@ -459,7 +459,7 @@  /* ==================================================================== */  /* Some MMRs are functionally identical (or close enough) on both SHUB1 */  /* and SHUB2 that it makes sense to define a geberic name for the MMR.  */ -/* It is acceptible to use (for example) SH_IPI_INT to reference the    */ +/* It is acceptable to use (for example) SH_IPI_INT to reference the    */  /* the IPI MMR. The value of SH_IPI_INT is determined at runtime based  */  /* on the type of the SHUB. Do not use these #defines in performance    */  /* critical code  or loops - there is a small performance penalty.      */ diff --git a/arch/ia64/include/asm/sn/shubio.h b/arch/ia64/include/asm/sn/shubio.h index 6052422a22b..ecb8a49476b 100644 --- a/arch/ia64/include/asm/sn/shubio.h +++ b/arch/ia64/include/asm/sn/shubio.h @@ -1383,7 +1383,7 @@ typedef union ii_ibcr_u {   * response is capture in IXSM and IXSS, and IXSS[VALID] is set. The    *   * errant header is thereby captured, and no further spurious read      *   * respones are captured until IXSS[VALID] is cleared by setting the    * - * appropriate bit in IECLR.Everytime a spurious read response is       * + * appropriate bit in IECLR. Every time a spurious read response is     *   * detected, the SPUR_RD bit of the PRB corresponding to the incoming   *   * message's SIDN field is set. This always happens, regarless of       *   * whether a header is captured. The programmer should check            * @@ -2738,7 +2738,7 @@ typedef union ii_ippr_u {  /************************************************************************   *									*   * The following defines which were not formed into structures are	* - * probably indentical to another register, and the name of the		* + * probably identical to another register, and the name of the		*   * register is provided against each of these registers. This		*   * information needs to be checked carefully				*   *									* diff --git a/arch/ia64/include/asm/sn/tioce.h b/arch/ia64/include/asm/sn/tioce.h index 893468e1b41..6eae8ada90f 100644 --- a/arch/ia64/include/asm/sn/tioce.h +++ b/arch/ia64/include/asm/sn/tioce.h @@ -467,7 +467,7 @@ typedef volatile struct tioce {  #define CE_LSI_GB_CFG1_RXL0S_THS_SHFT	0  #define CE_LSI_GB_CFG1_RXL0S_THS_MASK	(0xffULL << 0)  #define CE_LSI_GB_CFG1_RXL0S_SMP_SHFT	8 -#define CE_LSI_GB_CFG1_RXL0S_SMP_MASK	(0xfULL << 8); +#define CE_LSI_GB_CFG1_RXL0S_SMP_MASK	(0xfULL << 8)  #define CE_LSI_GB_CFG1_RXL0S_ADJ_SHFT	12  #define CE_LSI_GB_CFG1_RXL0S_ADJ_MASK	(0x7ULL << 12)  #define CE_LSI_GB_CFG1_RXL0S_FLT_SHFT	15 diff --git a/arch/ia64/include/asm/spinlock.h b/arch/ia64/include/asm/spinlock.h index 1a91c9121d1..45698cd15b7 100644 --- a/arch/ia64/include/asm/spinlock.h +++ b/arch/ia64/include/asm/spinlock.h @@ -13,9 +13,8 @@  #include <linux/kernel.h>  #include <linux/bitops.h> -#include <asm/atomic.h> +#include <linux/atomic.h>  #include <asm/intrinsics.h> -#include <asm/system.h>  #define arch_spin_lock_init(x)			((x)->lock = 0) @@ -103,6 +102,11 @@ static inline int __ticket_spin_is_contended(arch_spinlock_t *lock)  	return ((tmp - (tmp >> TICKET_SHIFT)) & TICKET_MASK) > 1;  } +static __always_inline int arch_spin_value_unlocked(arch_spinlock_t lock) +{ +	return !(((lock.lock >> TICKET_SHIFT) ^ lock.lock) & TICKET_MASK); +} +  static inline int arch_spin_is_locked(arch_spinlock_t *lock)  {  	return __ticket_spin_is_locked(lock); diff --git a/arch/ia64/include/asm/switch_to.h b/arch/ia64/include/asm/switch_to.h new file mode 100644 index 00000000000..d38c7ea5eea --- /dev/null +++ b/arch/ia64/include/asm/switch_to.h @@ -0,0 +1,79 @@ +/* + * Low-level task switching. This is based on information published in + * the Processor Abstraction Layer and the System Abstraction Layer + * manual. + * + * Copyright (C) 1998-2003 Hewlett-Packard Co + *	David Mosberger-Tang <davidm@hpl.hp.com> + * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com> + * Copyright (C) 1999 Don Dugger <don.dugger@intel.com> + */ +#ifndef _ASM_IA64_SWITCH_TO_H +#define _ASM_IA64_SWITCH_TO_H + +#include <linux/percpu.h> + +struct task_struct; + +/* + * Context switch from one thread to another.  If the two threads have + * different address spaces, schedule() has already taken care of + * switching to the new address space by calling switch_mm(). + * + * Disabling access to the fph partition and the debug-register + * context switch MUST be done before calling ia64_switch_to() since a + * newly created thread returns directly to + * ia64_ret_from_syscall_clear_r8. + */ +extern struct task_struct *ia64_switch_to (void *next_task); + +extern void ia64_save_extra (struct task_struct *task); +extern void ia64_load_extra (struct task_struct *task); + +#ifdef CONFIG_PERFMON +  DECLARE_PER_CPU(unsigned long, pfm_syst_info); +# define PERFMON_IS_SYSWIDE() (__get_cpu_var(pfm_syst_info) & 0x1) +#else +# define PERFMON_IS_SYSWIDE() (0) +#endif + +#define IA64_HAS_EXTRA_STATE(t)							\ +	((t)->thread.flags & (IA64_THREAD_DBG_VALID|IA64_THREAD_PM_VALID)	\ +	 || PERFMON_IS_SYSWIDE()) + +#define __switch_to(prev,next,last) do {							 \ +	if (IA64_HAS_EXTRA_STATE(prev))								 \ +		ia64_save_extra(prev);								 \ +	if (IA64_HAS_EXTRA_STATE(next))								 \ +		ia64_load_extra(next);								 \ +	ia64_psr(task_pt_regs(next))->dfh = !ia64_is_local_fpu_owner(next);			 \ +	(last) = ia64_switch_to((next));							 \ +} while (0) + +#ifdef CONFIG_SMP +/* + * In the SMP case, we save the fph state when context-switching away from a thread that + * modified fph.  This way, when the thread gets scheduled on another CPU, the CPU can + * pick up the state from task->thread.fph, avoiding the complication of having to fetch + * the latest fph state from another CPU.  In other words: eager save, lazy restore. + */ +# define switch_to(prev,next,last) do {						\ +	if (ia64_psr(task_pt_regs(prev))->mfh && ia64_is_local_fpu_owner(prev)) {				\ +		ia64_psr(task_pt_regs(prev))->mfh = 0;			\ +		(prev)->thread.flags |= IA64_THREAD_FPH_VALID;			\ +		__ia64_save_fpu((prev)->thread.fph);				\ +	}									\ +	__switch_to(prev, next, last);						\ +	/* "next" in old context is "current" in new context */			\ +	if (unlikely((current->thread.flags & IA64_THREAD_MIGRATION) &&	       \ +		     (task_cpu(current) !=				       \ +		      		      task_thread_info(current)->last_cpu))) { \ +		platform_migrate(current);				       \ +		task_thread_info(current)->last_cpu = task_cpu(current);       \ +	}								       \ +} while (0) +#else +# define switch_to(prev,next,last)	__switch_to(prev, next, last) +#endif + +#endif /* _ASM_IA64_SWITCH_TO_H */ diff --git a/arch/ia64/include/asm/sync_bitops.h b/arch/ia64/include/asm/sync_bitops.h deleted file mode 100644 index 593c12eeb27..00000000000 --- a/arch/ia64/include/asm/sync_bitops.h +++ /dev/null @@ -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 */ diff --git a/arch/ia64/include/asm/system.h b/arch/ia64/include/asm/system.h deleted file mode 100644 index 6cca30705d5..00000000000 --- a/arch/ia64/include/asm/system.h +++ /dev/null @@ -1,203 +0,0 @@ -#ifndef _ASM_IA64_SYSTEM_H -#define _ASM_IA64_SYSTEM_H - -/* - * System defines. Note that this is included both from .c and .S - * files, so it does only defines, not any C code.  This is based - * on information published in the Processor Abstraction Layer - * and the System Abstraction Layer manual. - * - * Copyright (C) 1998-2003 Hewlett-Packard Co - *	David Mosberger-Tang <davidm@hpl.hp.com> - * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com> - * Copyright (C) 1999 Don Dugger <don.dugger@intel.com> - */ - -#include <asm/kregs.h> -#include <asm/page.h> -#include <asm/pal.h> -#include <asm/percpu.h> - -#define GATE_ADDR		RGN_BASE(RGN_GATE) - -/* - * 0xa000000000000000+2*PERCPU_PAGE_SIZE - * - 0xa000000000000000+3*PERCPU_PAGE_SIZE remain unmapped (guard page) - */ -#define KERNEL_START		 (GATE_ADDR+__IA64_UL_CONST(0x100000000)) -#define PERCPU_ADDR		(-PERCPU_PAGE_SIZE) -#define LOAD_OFFSET		(KERNEL_START - KERNEL_TR_PAGE_SIZE) - -#ifndef __ASSEMBLY__ - -#include <linux/kernel.h> -#include <linux/types.h> - -#define AT_VECTOR_SIZE_ARCH 2 /* entries in ARCH_DLINFO */ - -struct pci_vector_struct { -	__u16 segment;	/* PCI Segment number */ -	__u16 bus;	/* PCI Bus number */ -	__u32 pci_id;	/* ACPI split 16 bits device, 16 bits function (see section 6.1.1) */ -	__u8 pin;	/* PCI PIN (0 = A, 1 = B, 2 = C, 3 = D) */ -	__u32 irq;	/* IRQ assigned */ -}; - -extern struct ia64_boot_param { -	__u64 command_line;		/* physical address of command line arguments */ -	__u64 efi_systab;		/* physical address of EFI system table */ -	__u64 efi_memmap;		/* physical address of EFI memory map */ -	__u64 efi_memmap_size;		/* size of EFI memory map */ -	__u64 efi_memdesc_size;		/* size of an EFI memory map descriptor */ -	__u32 efi_memdesc_version;	/* memory descriptor version */ -	struct { -		__u16 num_cols;	/* number of columns on console output device */ -		__u16 num_rows;	/* number of rows on console output device */ -		__u16 orig_x;	/* cursor's x position */ -		__u16 orig_y;	/* cursor's y position */ -	} console_info; -	__u64 fpswa;		/* physical address of the fpswa interface */ -	__u64 initrd_start; -	__u64 initrd_size; -} *ia64_boot_param; - -/* - * Macros to force memory ordering.  In these descriptions, "previous" - * and "subsequent" refer to program order; "visible" means that all - * architecturally visible effects of a memory access have occurred - * (at a minimum, this means the memory has been read or written). - * - *   wmb():	Guarantees that all preceding stores to memory- - *		like regions are visible before any subsequent - *		stores and that all following stores will be - *		visible only after all previous stores. - *   rmb():	Like wmb(), but for reads. - *   mb():	wmb()/rmb() combo, i.e., all previous memory - *		accesses are visible before all subsequent - *		accesses and vice versa.  This is also known as - *		a "fence." - * - * Note: "mb()" and its variants cannot be used as a fence to order - * accesses to memory mapped I/O registers.  For that, mf.a needs to - * be used.  However, we don't want to always use mf.a because (a) - * it's (presumably) much slower than mf and (b) mf.a is supported for - * sequential memory pages only. - */ -#define mb()	ia64_mf() -#define rmb()	mb() -#define wmb()	mb() -#define read_barrier_depends()	do { } while(0) - -#ifdef CONFIG_SMP -# define smp_mb()	mb() -# define smp_rmb()	rmb() -# define smp_wmb()	wmb() -# define smp_read_barrier_depends()	read_barrier_depends() -#else -# define smp_mb()	barrier() -# define smp_rmb()	barrier() -# define smp_wmb()	barrier() -# define smp_read_barrier_depends()	do { } while(0) -#endif - -/* - * XXX check on this ---I suspect what Linus really wants here is - * acquire vs release semantics but we can't discuss this stuff with - * Linus just yet.  Grrr... - */ -#define set_mb(var, value)	do { (var) = (value); mb(); } while (0) - -/* - * The group barrier in front of the rsm & ssm are necessary to ensure - * that none of the previous instructions in the same group are - * affected by the rsm/ssm. - */ - -#ifdef __KERNEL__ - -/* - * Context switch from one thread to another.  If the two threads have - * different address spaces, schedule() has already taken care of - * switching to the new address space by calling switch_mm(). - * - * Disabling access to the fph partition and the debug-register - * context switch MUST be done before calling ia64_switch_to() since a - * newly created thread returns directly to - * ia64_ret_from_syscall_clear_r8. - */ -extern struct task_struct *ia64_switch_to (void *next_task); - -struct task_struct; - -extern void ia64_save_extra (struct task_struct *task); -extern void ia64_load_extra (struct task_struct *task); - -#ifdef CONFIG_VIRT_CPU_ACCOUNTING -extern void ia64_account_on_switch (struct task_struct *prev, struct task_struct *next); -# define IA64_ACCOUNT_ON_SWITCH(p,n) ia64_account_on_switch(p,n) -#else -# define IA64_ACCOUNT_ON_SWITCH(p,n) -#endif - -#ifdef CONFIG_PERFMON -  DECLARE_PER_CPU(unsigned long, pfm_syst_info); -# define PERFMON_IS_SYSWIDE() (__get_cpu_var(pfm_syst_info) & 0x1) -#else -# define PERFMON_IS_SYSWIDE() (0) -#endif - -#define IA64_HAS_EXTRA_STATE(t)							\ -	((t)->thread.flags & (IA64_THREAD_DBG_VALID|IA64_THREAD_PM_VALID)	\ -	 || PERFMON_IS_SYSWIDE()) - -#define __switch_to(prev,next,last) do {							 \ -	IA64_ACCOUNT_ON_SWITCH(prev, next);							 \ -	if (IA64_HAS_EXTRA_STATE(prev))								 \ -		ia64_save_extra(prev);								 \ -	if (IA64_HAS_EXTRA_STATE(next))								 \ -		ia64_load_extra(next);								 \ -	ia64_psr(task_pt_regs(next))->dfh = !ia64_is_local_fpu_owner(next);			 \ -	(last) = ia64_switch_to((next));							 \ -} while (0) - -#ifdef CONFIG_SMP -/* - * In the SMP case, we save the fph state when context-switching away from a thread that - * modified fph.  This way, when the thread gets scheduled on another CPU, the CPU can - * pick up the state from task->thread.fph, avoiding the complication of having to fetch - * the latest fph state from another CPU.  In other words: eager save, lazy restore. - */ -# define switch_to(prev,next,last) do {						\ -	if (ia64_psr(task_pt_regs(prev))->mfh && ia64_is_local_fpu_owner(prev)) {				\ -		ia64_psr(task_pt_regs(prev))->mfh = 0;			\ -		(prev)->thread.flags |= IA64_THREAD_FPH_VALID;			\ -		__ia64_save_fpu((prev)->thread.fph);				\ -	}									\ -	__switch_to(prev, next, last);						\ -	/* "next" in old context is "current" in new context */			\ -	if (unlikely((current->thread.flags & IA64_THREAD_MIGRATION) &&	       \ -		     (task_cpu(current) !=				       \ -		      		      task_thread_info(current)->last_cpu))) { \ -		platform_migrate(current);				       \ -		task_thread_info(current)->last_cpu = task_cpu(current);       \ -	}								       \ -} while (0) -#else -# define switch_to(prev,next,last)	__switch_to(prev, next, last) -#endif - -#define __ARCH_WANT_UNLOCKED_CTXSW -#define ARCH_HAS_PREFETCH_SWITCH_STACK -#define ia64_platform_is(x) (strcmp(x, platform_name) == 0) - -void cpu_idle_wait(void); - -#define arch_align_stack(x) (x) - -void default_idle(void); - -#endif /* __KERNEL__ */ - -#endif /* __ASSEMBLY__ */ - -#endif /* _ASM_IA64_SYSTEM_H */ diff --git a/arch/ia64/include/asm/termios.h b/arch/ia64/include/asm/termios.h index 689d218c0c2..a42f870ca4f 100644 --- a/arch/ia64/include/asm/termios.h +++ b/arch/ia64/include/asm/termios.h @@ -1,52 +1,14 @@ -#ifndef _ASM_IA64_TERMIOS_H -#define _ASM_IA64_TERMIOS_H -  /*   * Modified 1999   *	David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co   *   * 99/01/28	Added N_IRDA and N_SMSBLOCK   */ +#ifndef _ASM_IA64_TERMIOS_H +#define _ASM_IA64_TERMIOS_H -#include <asm/termbits.h> -#include <asm/ioctls.h> - -struct winsize { -	unsigned short ws_row; -	unsigned short ws_col; -	unsigned short ws_xpixel; -	unsigned short ws_ypixel; -}; - -#define NCC 8 -struct termio { -	unsigned short c_iflag;		/* input mode flags */ -	unsigned short c_oflag;		/* output mode flags */ -	unsigned short c_cflag;		/* control mode flags */ -	unsigned short c_lflag;		/* local mode flags */ -	unsigned char c_line;		/* line discipline */ -	unsigned char c_cc[NCC];	/* control characters */ -}; - -/* modem lines */ -#define TIOCM_LE	0x001 -#define TIOCM_DTR	0x002 -#define TIOCM_RTS	0x004 -#define TIOCM_ST	0x008 -#define TIOCM_SR	0x010 -#define TIOCM_CTS	0x020 -#define TIOCM_CAR	0x040 -#define TIOCM_RNG	0x080 -#define TIOCM_DSR	0x100 -#define TIOCM_CD	TIOCM_CAR -#define TIOCM_RI	TIOCM_RNG -#define TIOCM_OUT1	0x2000 -#define TIOCM_OUT2	0x4000 -#define TIOCM_LOOP	0x8000 - -/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ +#include <uapi/asm/termios.h> -# ifdef __KERNEL__  /*	intr=^C		quit=^\		erase=del	kill=^U  	eof=^D		vtime=\0	vmin=\1		sxtc=\0 @@ -92,6 +54,4 @@ struct termio {  #define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios))  #define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios)) -# endif /* __KERNEL__ */ -  #endif /* _ASM_IA64_TERMIOS_H */ diff --git a/arch/ia64/include/asm/thread_info.h b/arch/ia64/include/asm/thread_info.h index b6a5ba2aca3..5b17418b422 100644 --- a/arch/ia64/include/asm/thread_info.h +++ b/arch/ia64/include/asm/thread_info.h @@ -11,9 +11,6 @@  #include <asm/processor.h>  #include <asm/ptrace.h> -#define PREEMPT_ACTIVE_BIT 30 -#define PREEMPT_ACTIVE	(1 << PREEMPT_ACTIVE_BIT) -  #ifndef __ASSEMBLY__  /* @@ -31,7 +28,7 @@ struct thread_info {  	mm_segment_t addr_limit;	/* user-level address space limit */  	int preempt_count;		/* 0=premptable, <0=BUG; will also serve as bh-counter */  	struct restart_block restart_block; -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	__u64 ac_stamp;  	__u64 ac_leave;  	__u64 ac_stime; @@ -54,23 +51,22 @@ struct thread_info {  	},					\  } -#define __HAVE_ARCH_THREAD_INFO_ALLOCATOR -  #ifndef ASM_OFFSETS_C  /* how to get the thread information struct from C */  #define current_thread_info()	((struct thread_info *) ((char *) current + IA64_TASK_SIZE)) -#define alloc_thread_info(tsk)	((struct thread_info *) ((char *) (tsk) + IA64_TASK_SIZE)) +#define alloc_thread_info_node(tsk, node)	\ +		((struct thread_info *) ((char *) (tsk) + IA64_TASK_SIZE))  #define task_thread_info(tsk)	((struct thread_info *) ((char *) (tsk) + IA64_TASK_SIZE))  #else  #define current_thread_info()	((struct thread_info *) 0) -#define alloc_thread_info(tsk)	((struct thread_info *) 0) +#define alloc_thread_info_node(tsk, node)	((struct thread_info *) 0)  #define task_thread_info(tsk)	((struct thread_info *) 0)  #endif  #define free_thread_info(ti)	/* nothing */  #define task_stack_page(tsk)	((void *)(tsk))  #define __HAVE_THREAD_FUNCTIONS -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  #define setup_thread_stack(p, org)			\  	*task_thread_info(p) = *task_thread_info(org);	\  	task_thread_info(p)->ac_stime = 0;		\ @@ -83,8 +79,14 @@ struct thread_info {  #endif  #define end_of_stack(p) (unsigned long *)((void *)(p) + IA64_RBS_OFFSET) -#define __HAVE_ARCH_TASK_STRUCT_ALLOCATOR -#define alloc_task_struct()	((struct task_struct *)__get_free_pages(GFP_KERNEL | __GFP_COMP, KERNEL_STACK_SIZE_ORDER)) +#define alloc_task_struct_node(node)						\ +({										\ +	struct page *page = alloc_pages_node(node, GFP_KERNEL | __GFP_COMP,	\ +					     KERNEL_STACK_SIZE_ORDER);		\ +	struct task_struct *ret = page ? page_address(page) : NULL;		\ +										\ +	ret;									\ +})  #define free_task_struct(tsk)	free_pages((unsigned long) (tsk), KERNEL_STACK_SIZE_ORDER)  #endif /* !__ASSEMBLY */ @@ -101,12 +103,11 @@ struct thread_info {  #define TIF_SYSCALL_AUDIT	3	/* syscall auditing active */  #define TIF_SINGLESTEP		4	/* restore singlestep on return to user mode */  #define TIF_NOTIFY_RESUME	6	/* resumption notification requested */ -#define TIF_POLLING_NRFLAG	16	/* true if poll_idle() is polling TIF_NEED_RESCHED */  #define TIF_MEMDIE		17	/* is terminating due to OOM killer */  #define TIF_MCA_INIT		18	/* this task is processing MCA or INIT */  #define TIF_DB_DISABLED		19	/* debug trap disabled for fsyscall */ -#define TIF_FREEZE		20	/* is freezing for suspend */  #define TIF_RESTORE_RSE		21	/* user RBS is newer than kernel RBS */ +#define TIF_POLLING_NRFLAG	22	/* idle is polling for TIF_NEED_RESCHED */  #define _TIF_SYSCALL_TRACE	(1 << TIF_SYSCALL_TRACE)  #define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT) @@ -115,11 +116,10 @@ struct thread_info {  #define _TIF_NOTIFY_RESUME	(1 << TIF_NOTIFY_RESUME)  #define _TIF_SIGPENDING		(1 << TIF_SIGPENDING)  #define _TIF_NEED_RESCHED	(1 << TIF_NEED_RESCHED) -#define _TIF_POLLING_NRFLAG	(1 << TIF_POLLING_NRFLAG)  #define _TIF_MCA_INIT		(1 << TIF_MCA_INIT)  #define _TIF_DB_DISABLED	(1 << TIF_DB_DISABLED) -#define _TIF_FREEZE		(1 << TIF_FREEZE)  #define _TIF_RESTORE_RSE	(1 << TIF_RESTORE_RSE) +#define _TIF_POLLING_NRFLAG	(1 << TIF_POLLING_NRFLAG)  /* "work to do on user-return" bits */  #define TIF_ALLWORK_MASK	(_TIF_SIGPENDING|_TIF_NOTIFY_RESUME|_TIF_SYSCALL_AUDIT|\ @@ -127,18 +127,31 @@ struct thread_info {  /* like TIF_ALLWORK_BITS but sans TIF_SYSCALL_TRACE or TIF_SYSCALL_AUDIT */  #define TIF_WORK_MASK		(TIF_ALLWORK_MASK&~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)) -#define TS_POLLING		1 	/* true if in idle loop and not sleeping */  #define TS_RESTORE_SIGMASK	2	/* restore signal mask in do_signal() */ -#define tsk_is_polling(t) (task_thread_info(t)->status & TS_POLLING) -  #ifndef __ASSEMBLY__  #define HAVE_SET_RESTORE_SIGMASK	1  static inline void set_restore_sigmask(void)  {  	struct thread_info *ti = current_thread_info();  	ti->status |= TS_RESTORE_SIGMASK; -	set_bit(TIF_SIGPENDING, &ti->flags); +	WARN_ON(!test_bit(TIF_SIGPENDING, &ti->flags)); +} +static inline void clear_restore_sigmask(void) +{ +	current_thread_info()->status &= ~TS_RESTORE_SIGMASK; +} +static inline bool test_restore_sigmask(void) +{ +	return current_thread_info()->status & TS_RESTORE_SIGMASK; +} +static inline bool test_and_clear_restore_sigmask(void) +{ +	struct thread_info *ti = current_thread_info(); +	if (!(ti->status & TS_RESTORE_SIGMASK)) +		return false; +	ti->status &= ~TS_RESTORE_SIGMASK; +	return true;  }  #endif	/* !__ASSEMBLY__ */ diff --git a/arch/ia64/include/asm/tlb.h b/arch/ia64/include/asm/tlb.h index 23cce999eb1..39d64e0df1d 100644 --- a/arch/ia64/include/asm/tlb.h +++ b/arch/ia64/include/asm/tlb.h @@ -22,7 +22,7 @@   * unmapping a portion of the virtual address space, these hooks are called according to   * the following template:   * - *	tlb <- tlb_gather_mmu(mm, full_mm_flush);	// start unmap for address space MM + *	tlb <- tlb_gather_mmu(mm, start, end);		// start unmap for address space MM   *	{   *	  for each vma that needs a shootdown do {   *	    tlb_start_vma(tlb, vma); @@ -46,22 +46,23 @@  #include <asm/tlbflush.h>  #include <asm/machvec.h> -#ifdef CONFIG_SMP -# define FREE_PTE_NR		2048 -# define tlb_fast_mode(tlb)	((tlb)->nr == ~0U) -#else -# define FREE_PTE_NR		0 -# define tlb_fast_mode(tlb)	(1) -#endif +/* + * If we can't allocate a page to make a big batch of page pointers + * to work on, then just handle a few from the on-stack structure. + */ +#define	IA64_GATHER_BUNDLE	8  struct mmu_gather {  	struct mm_struct	*mm; -	unsigned int		nr;		/* == ~0U => fast mode */ +	unsigned int		nr; +	unsigned int		max;  	unsigned char		fullmm;		/* non-zero means full mm flush */  	unsigned char		need_flush;	/* really unmapped some PTEs? */ +	unsigned long		start, end;  	unsigned long		start_addr;  	unsigned long		end_addr; -	struct page 		*pages[FREE_PTE_NR]; +	struct page		**pages; +	struct page		*local[IA64_GATHER_BUNDLE];  };  struct ia64_tr_entry { @@ -90,20 +91,9 @@ extern struct ia64_tr_entry *ia64_idtrs[NR_CPUS];  #define RR_RID_MASK	0x00000000ffffff00L  #define RR_TO_RID(val) 	((val >> 8) & 0xffffff) -/* Users of the generic TLB shootdown code must declare this storage space. */ -DECLARE_PER_CPU(struct mmu_gather, mmu_gathers); - -/* - * Flush the TLB for address range START to END and, if not in fast mode, release the - * freed pages that where gathered up to this point. - */  static inline void -ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long end) +ia64_tlb_flush_mmu_tlbonly(struct mmu_gather *tlb, unsigned long start, unsigned long end)  { -	unsigned int nr; - -	if (!tlb->need_flush) -		return;  	tlb->need_flush = 0;  	if (tlb->fullmm) { @@ -136,43 +126,58 @@ ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long e  		flush_tlb_range(&vma, ia64_thash(start), ia64_thash(end));  	} +} + +static inline void +ia64_tlb_flush_mmu_free(struct mmu_gather *tlb) +{ +	unsigned long i; +	unsigned int nr; +  	/* lastly, release the freed pages */  	nr = tlb->nr; -	if (!tlb_fast_mode(tlb)) { -		unsigned long i; -		tlb->nr = 0; -		tlb->start_addr = ~0UL; -		for (i = 0; i < nr; ++i) -			free_page_and_swap_cache(tlb->pages[i]); -	} + +	tlb->nr = 0; +	tlb->start_addr = ~0UL; +	for (i = 0; i < nr; ++i) +		free_page_and_swap_cache(tlb->pages[i]);  }  /* - * Return a pointer to an initialized struct mmu_gather. + * Flush the TLB for address range START to END and, if not in fast mode, release the + * freed pages that where gathered up to this point.   */ -static inline struct mmu_gather * -tlb_gather_mmu (struct mm_struct *mm, unsigned int full_mm_flush) +static inline void +ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long end)  { -	struct mmu_gather *tlb = &get_cpu_var(mmu_gathers); +	if (!tlb->need_flush) +		return; +	ia64_tlb_flush_mmu_tlbonly(tlb, start, end); +	ia64_tlb_flush_mmu_free(tlb); +} +static inline void __tlb_alloc_page(struct mmu_gather *tlb) +{ +	unsigned long addr = __get_free_pages(GFP_NOWAIT | __GFP_NOWARN, 0); + +	if (addr) { +		tlb->pages = (void *)addr; +		tlb->max = PAGE_SIZE / sizeof(void *); +	} +} + + +static inline void +tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned long start, unsigned long end) +{  	tlb->mm = mm; -	/* -	 * Use fast mode if only 1 CPU is online. -	 * -	 * It would be tempting to turn on fast-mode for full_mm_flush as well.  But this -	 * doesn't work because of speculative accesses and software prefetching: the page -	 * table of "mm" may (and usually is) the currently active page table and even -	 * though the kernel won't do any user-space accesses during the TLB shoot down, a -	 * compiler might use speculation or lfetch.fault on what happens to be a valid -	 * user-space address.  This in turn could trigger a TLB miss fault (or a VHPT -	 * walk) and re-insert a TLB entry we just removed.  Slow mode avoids such -	 * problems.  (We could make fast-mode work by switching the current task to a -	 * different "mm" during the shootdown.) --davidm 08/02/2002 -	 */ -	tlb->nr = (num_online_cpus() == 1) ? ~0U : 0; -	tlb->fullmm = full_mm_flush; +	tlb->max = ARRAY_SIZE(tlb->local); +	tlb->pages = tlb->local; +	tlb->nr = 0; +	tlb->fullmm = !(start | (end+1)); +	tlb->start = start; +	tlb->end = end;  	tlb->start_addr = ~0UL; -	return tlb;  }  /* @@ -180,7 +185,7 @@ tlb_gather_mmu (struct mm_struct *mm, unsigned int full_mm_flush)   * collected.   */  static inline void -tlb_finish_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long end) +tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end)  {  	/*  	 * Note: tlb->nr may be 0 at this point, so we can't rely on tlb->start_addr and @@ -191,7 +196,8 @@ tlb_finish_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long end)  	/* keep the page table cache within bounds */  	check_pgt_cache(); -	put_cpu_var(mmu_gathers); +	if (tlb->pages != tlb->local) +		free_pages((unsigned long)tlb->pages, 0);  }  /* @@ -199,18 +205,38 @@ tlb_finish_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long end)   * must be delayed until after the TLB has been flushed (see comments at the beginning of   * this file).   */ -static inline void -tlb_remove_page (struct mmu_gather *tlb, struct page *page) +static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page)  {  	tlb->need_flush = 1; -	if (tlb_fast_mode(tlb)) { -		free_page_and_swap_cache(page); -		return; -	} +	if (!tlb->nr && tlb->pages == tlb->local) +		__tlb_alloc_page(tlb); +  	tlb->pages[tlb->nr++] = page; -	if (tlb->nr >= FREE_PTE_NR) -		ia64_tlb_flush_mmu(tlb, tlb->start_addr, tlb->end_addr); +	VM_BUG_ON(tlb->nr > tlb->max); + +	return tlb->max - tlb->nr; +} + +static inline void tlb_flush_mmu_tlbonly(struct mmu_gather *tlb) +{ +	ia64_tlb_flush_mmu_tlbonly(tlb, tlb->start_addr, tlb->end_addr); +} + +static inline void tlb_flush_mmu_free(struct mmu_gather *tlb) +{ +	ia64_tlb_flush_mmu_free(tlb); +} + +static inline void tlb_flush_mmu(struct mmu_gather *tlb) +{ +	ia64_tlb_flush_mmu(tlb, tlb->start_addr, tlb->end_addr); +} + +static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page) +{ +	if (!__tlb_remove_page(tlb, page)) +		tlb_flush_mmu(tlb);  }  /* diff --git a/arch/ia64/include/asm/topology.h b/arch/ia64/include/asm/topology.h index 09f646753d1..6437ca21f61 100644 --- a/arch/ia64/include/asm/topology.h +++ b/arch/ia64/include/asm/topology.h @@ -21,7 +21,8 @@  #define PENALTY_FOR_NODE_WITH_CPUS 255  /* - * Distance above which we begin to use zone reclaim + * Nodes within this distance are eligible for reclaim by zone_reclaim() when + * zone_reclaim_mode is enabled.   */  #define RECLAIM_DISTANCE 15 @@ -46,55 +47,6 @@  void build_cpu_to_node_map(void); -#define SD_CPU_INIT (struct sched_domain) {		\ -	.parent			= NULL,			\ -	.child			= NULL,			\ -	.groups			= NULL,			\ -	.min_interval		= 1,			\ -	.max_interval		= 4,			\ -	.busy_factor		= 64,			\ -	.imbalance_pct		= 125,			\ -	.cache_nice_tries	= 2,			\ -	.busy_idx		= 2,			\ -	.idle_idx		= 1,			\ -	.newidle_idx		= 0,			\ -	.wake_idx		= 0,			\ -	.forkexec_idx		= 0,			\ -	.flags			= SD_LOAD_BALANCE	\ -				| SD_BALANCE_NEWIDLE	\ -				| SD_BALANCE_EXEC	\ -				| SD_BALANCE_FORK	\ -				| SD_WAKE_AFFINE,	\ -	.last_balance		= jiffies,		\ -	.balance_interval	= 1,			\ -	.nr_balance_failed	= 0,			\ -} - -/* sched_domains SD_NODE_INIT for IA64 NUMA machines */ -#define SD_NODE_INIT (struct sched_domain) {		\ -	.parent			= NULL,			\ -	.child			= NULL,			\ -	.groups			= NULL,			\ -	.min_interval		= 8,			\ -	.max_interval		= 8*(min(num_online_cpus(), 32U)), \ -	.busy_factor		= 64,			\ -	.imbalance_pct		= 125,			\ -	.cache_nice_tries	= 2,			\ -	.busy_idx		= 3,			\ -	.idle_idx		= 2,			\ -	.newidle_idx		= 0,			\ -	.wake_idx		= 0,			\ -	.forkexec_idx		= 0,			\ -	.flags			= SD_LOAD_BALANCE	\ -				| SD_BALANCE_NEWIDLE	\ -				| SD_BALANCE_EXEC	\ -				| SD_BALANCE_FORK	\ -				| SD_SERIALIZE,		\ -	.last_balance		= jiffies,		\ -	.balance_interval	= 64,			\ -	.nr_balance_failed	= 0,			\ -} -  #endif /* CONFIG_NUMA */  #ifdef CONFIG_SMP @@ -102,7 +54,6 @@ void build_cpu_to_node_map(void);  #define topology_core_id(cpu)			(cpu_data(cpu)->core_id)  #define topology_core_cpumask(cpu)		(&cpu_core_map[cpu])  #define topology_thread_cpumask(cpu)		(&per_cpu(cpu_sibling_map, cpu)) -#define smt_capable() 				(smp_num_siblings > 1)  #endif  extern void arch_fix_phys_package_id(int num, u32 slot); diff --git a/arch/ia64/include/asm/types.h b/arch/ia64/include/asm/types.h index 93773fd37be..4c351b169da 100644 --- a/arch/ia64/include/asm/types.h +++ b/arch/ia64/include/asm/types.h @@ -1,6 +1,3 @@ -#ifndef _ASM_IA64_TYPES_H -#define _ASM_IA64_TYPES_H -  /*   * This file is never included by application software unless explicitly   * requested (e.g., via linux/types.h) in which case the application is @@ -13,37 +10,22 @@   * Modified 1998-2000, 2002   *	David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co   */ +#ifndef _ASM_IA64_TYPES_H +#define _ASM_IA64_TYPES_H -#ifdef __KERNEL__  #include <asm-generic/int-ll64.h> -#else -#include <asm-generic/int-l64.h> -#endif +#include <uapi/asm/types.h>  #ifdef __ASSEMBLY__ -# define __IA64_UL(x)		(x) -# define __IA64_UL_CONST(x)	x -  #else -# define __IA64_UL(x)		((unsigned long)(x)) -# define __IA64_UL_CONST(x)	x##UL - -typedef unsigned int umode_t; -  /*   * These aren't exported outside the kernel to avoid name space clashes   */ -# ifdef __KERNEL__  struct fnptr {  	unsigned long ip;  	unsigned long gp;  }; -/* DMA addresses are 64-bits wide, in general.  */ -typedef u64 dma_addr_t; - -# endif /* __KERNEL__ */  #endif /* !__ASSEMBLY__ */ -  #endif /* _ASM_IA64_TYPES_H */ diff --git a/arch/ia64/include/asm/unistd.h b/arch/ia64/include/asm/unistd.h index 954d398a54b..fb13dc5e8f8 100644 --- a/arch/ia64/include/asm/unistd.h +++ b/arch/ia64/include/asm/unistd.h @@ -1,325 +1,17 @@ -#ifndef _ASM_IA64_UNISTD_H -#define _ASM_IA64_UNISTD_H -  /*   * IA-64 Linux syscall numbers and inline-functions.   *   * Copyright (C) 1998-2005 Hewlett-Packard Co   *	David Mosberger-Tang <davidm@hpl.hp.com>   */ +#ifndef _ASM_IA64_UNISTD_H +#define _ASM_IA64_UNISTD_H -#include <asm/break.h> - -#define __BREAK_SYSCALL			__IA64_BREAK_SYSCALL - -#define __NR_ni_syscall			1024 -#define __NR_exit			1025 -#define __NR_read			1026 -#define __NR_write			1027 -#define __NR_open			1028 -#define __NR_close			1029 -#define __NR_creat			1030 -#define __NR_link			1031 -#define __NR_unlink			1032 -#define __NR_execve			1033 -#define __NR_chdir			1034 -#define __NR_fchdir			1035 -#define __NR_utimes			1036 -#define __NR_mknod			1037 -#define __NR_chmod			1038 -#define __NR_chown			1039 -#define __NR_lseek			1040 -#define __NR_getpid			1041 -#define __NR_getppid			1042 -#define __NR_mount			1043 -#define __NR_umount			1044 -#define __NR_setuid			1045 -#define __NR_getuid			1046 -#define __NR_geteuid			1047 -#define __NR_ptrace			1048 -#define __NR_access			1049 -#define __NR_sync			1050 -#define __NR_fsync			1051 -#define __NR_fdatasync			1052 -#define __NR_kill			1053 -#define __NR_rename			1054 -#define __NR_mkdir			1055 -#define __NR_rmdir			1056 -#define __NR_dup			1057 -#define __NR_pipe			1058 -#define __NR_times			1059 -#define __NR_brk			1060 -#define __NR_setgid			1061 -#define __NR_getgid			1062 -#define __NR_getegid			1063 -#define __NR_acct			1064 -#define __NR_ioctl			1065 -#define __NR_fcntl			1066 -#define __NR_umask			1067 -#define __NR_chroot			1068 -#define __NR_ustat			1069 -#define __NR_dup2			1070 -#define __NR_setreuid			1071 -#define __NR_setregid			1072 -#define __NR_getresuid			1073 -#define __NR_setresuid			1074 -#define __NR_getresgid			1075 -#define __NR_setresgid			1076 -#define __NR_getgroups			1077 -#define __NR_setgroups			1078 -#define __NR_getpgid			1079 -#define __NR_setpgid			1080 -#define __NR_setsid			1081 -#define __NR_getsid			1082 -#define __NR_sethostname		1083 -#define __NR_setrlimit			1084 -#define __NR_getrlimit			1085 -#define __NR_getrusage			1086 -#define __NR_gettimeofday		1087 -#define __NR_settimeofday		1088 -#define __NR_select			1089 -#define __NR_poll			1090 -#define __NR_symlink			1091 -#define __NR_readlink			1092 -#define __NR_uselib			1093 -#define __NR_swapon			1094 -#define __NR_swapoff			1095 -#define __NR_reboot			1096 -#define __NR_truncate			1097 -#define __NR_ftruncate			1098 -#define __NR_fchmod			1099 -#define __NR_fchown			1100 -#define __NR_getpriority		1101 -#define __NR_setpriority		1102 -#define __NR_statfs			1103 -#define __NR_fstatfs			1104 -#define __NR_gettid			1105 -#define __NR_semget			1106 -#define __NR_semop			1107 -#define __NR_semctl			1108 -#define __NR_msgget			1109 -#define __NR_msgsnd			1110 -#define __NR_msgrcv			1111 -#define __NR_msgctl			1112 -#define __NR_shmget			1113 -#define __NR_shmat			1114 -#define __NR_shmdt			1115 -#define __NR_shmctl			1116 -/* also known as klogctl() in GNU libc: */ -#define __NR_syslog			1117 -#define __NR_setitimer			1118 -#define __NR_getitimer			1119 -/* 1120 was __NR_old_stat */ -/* 1121 was __NR_old_lstat */ -/* 1122 was __NR_old_fstat */ -#define __NR_vhangup			1123 -#define __NR_lchown			1124 -#define __NR_remap_file_pages		1125 -#define __NR_wait4			1126 -#define __NR_sysinfo			1127 -#define __NR_clone			1128 -#define __NR_setdomainname		1129 -#define __NR_uname			1130 -#define __NR_adjtimex			1131 -/* 1132 was __NR_create_module */ -#define __NR_init_module		1133 -#define __NR_delete_module		1134 -/* 1135 was __NR_get_kernel_syms */ -/* 1136 was __NR_query_module */ -#define __NR_quotactl			1137 -#define __NR_bdflush			1138 -#define __NR_sysfs			1139 -#define __NR_personality		1140 -#define __NR_afs_syscall		1141 -#define __NR_setfsuid			1142 -#define __NR_setfsgid			1143 -#define __NR_getdents			1144 -#define __NR_flock			1145 -#define __NR_readv			1146 -#define __NR_writev			1147 -#define __NR_pread64			1148 -#define __NR_pwrite64			1149 -#define __NR__sysctl			1150 -#define __NR_mmap			1151 -#define __NR_munmap			1152 -#define __NR_mlock			1153 -#define __NR_mlockall			1154 -#define __NR_mprotect			1155 -#define __NR_mremap			1156 -#define __NR_msync			1157 -#define __NR_munlock			1158 -#define __NR_munlockall			1159 -#define __NR_sched_getparam		1160 -#define __NR_sched_setparam		1161 -#define __NR_sched_getscheduler		1162 -#define __NR_sched_setscheduler		1163 -#define __NR_sched_yield		1164 -#define __NR_sched_get_priority_max	1165 -#define __NR_sched_get_priority_min	1166 -#define __NR_sched_rr_get_interval	1167 -#define __NR_nanosleep			1168 -#define __NR_nfsservctl			1169 -#define __NR_prctl			1170 -/* 1171 is reserved for backwards compatibility with old __NR_getpagesize */ -#define __NR_mmap2			1172 -#define __NR_pciconfig_read		1173 -#define __NR_pciconfig_write		1174 -#define __NR_perfmonctl			1175 -#define __NR_sigaltstack		1176 -#define __NR_rt_sigaction		1177 -#define __NR_rt_sigpending		1178 -#define __NR_rt_sigprocmask		1179 -#define __NR_rt_sigqueueinfo		1180 -#define __NR_rt_sigreturn		1181 -#define __NR_rt_sigsuspend		1182 -#define __NR_rt_sigtimedwait		1183 -#define __NR_getcwd			1184 -#define __NR_capget			1185 -#define __NR_capset			1186 -#define __NR_sendfile			1187 -#define __NR_getpmsg			1188 -#define __NR_putpmsg			1189 -#define __NR_socket			1190 -#define __NR_bind			1191 -#define __NR_connect			1192 -#define __NR_listen			1193 -#define __NR_accept			1194 -#define __NR_getsockname		1195 -#define __NR_getpeername		1196 -#define __NR_socketpair			1197 -#define __NR_send			1198 -#define __NR_sendto			1199 -#define __NR_recv			1200 -#define __NR_recvfrom			1201 -#define __NR_shutdown			1202 -#define __NR_setsockopt			1203 -#define __NR_getsockopt			1204 -#define __NR_sendmsg			1205 -#define __NR_recvmsg			1206 -#define __NR_pivot_root			1207 -#define __NR_mincore			1208 -#define __NR_madvise			1209 -#define __NR_stat			1210 -#define __NR_lstat			1211 -#define __NR_fstat			1212 -#define __NR_clone2			1213 -#define __NR_getdents64			1214 -#define __NR_getunwind			1215 -#define __NR_readahead			1216 -#define __NR_setxattr			1217 -#define __NR_lsetxattr			1218 -#define __NR_fsetxattr			1219 -#define __NR_getxattr			1220 -#define __NR_lgetxattr			1221 -#define __NR_fgetxattr			1222 -#define __NR_listxattr			1223 -#define __NR_llistxattr			1224 -#define __NR_flistxattr			1225 -#define __NR_removexattr		1226 -#define __NR_lremovexattr		1227 -#define __NR_fremovexattr		1228 -#define __NR_tkill			1229 -#define __NR_futex			1230 -#define __NR_sched_setaffinity		1231 -#define __NR_sched_getaffinity		1232 -#define __NR_set_tid_address		1233 -#define __NR_fadvise64			1234 -#define __NR_tgkill			1235 -#define __NR_exit_group			1236 -#define __NR_lookup_dcookie		1237 -#define __NR_io_setup			1238 -#define __NR_io_destroy			1239 -#define __NR_io_getevents		1240 -#define __NR_io_submit			1241 -#define __NR_io_cancel			1242 -#define __NR_epoll_create		1243 -#define __NR_epoll_ctl			1244 -#define __NR_epoll_wait			1245 -#define __NR_restart_syscall		1246 -#define __NR_semtimedop			1247 -#define __NR_timer_create		1248 -#define __NR_timer_settime		1249 -#define __NR_timer_gettime		1250 -#define __NR_timer_getoverrun		1251 -#define __NR_timer_delete		1252 -#define __NR_clock_settime		1253 -#define __NR_clock_gettime		1254 -#define __NR_clock_getres		1255 -#define __NR_clock_nanosleep		1256 -#define __NR_fstatfs64			1257 -#define __NR_statfs64			1258 -#define __NR_mbind			1259 -#define __NR_get_mempolicy		1260 -#define __NR_set_mempolicy		1261 -#define __NR_mq_open			1262 -#define __NR_mq_unlink			1263 -#define __NR_mq_timedsend		1264 -#define __NR_mq_timedreceive		1265 -#define __NR_mq_notify			1266 -#define __NR_mq_getsetattr		1267 -#define __NR_kexec_load			1268 -#define __NR_vserver			1269 -#define __NR_waitid			1270 -#define __NR_add_key			1271 -#define __NR_request_key		1272 -#define __NR_keyctl			1273 -#define __NR_ioprio_set			1274 -#define __NR_ioprio_get			1275 -#define __NR_move_pages			1276 -#define __NR_inotify_init		1277 -#define __NR_inotify_add_watch		1278 -#define __NR_inotify_rm_watch		1279 -#define __NR_migrate_pages		1280 -#define __NR_openat			1281 -#define __NR_mkdirat			1282 -#define __NR_mknodat			1283 -#define __NR_fchownat			1284 -#define __NR_futimesat			1285 -#define __NR_newfstatat			1286 -#define __NR_unlinkat			1287 -#define __NR_renameat			1288 -#define __NR_linkat			1289 -#define __NR_symlinkat			1290 -#define __NR_readlinkat			1291 -#define __NR_fchmodat			1292 -#define __NR_faccessat			1293 -#define __NR_pselect6			1294 -#define __NR_ppoll			1295 -#define __NR_unshare			1296 -#define __NR_splice			1297 -#define __NR_set_robust_list		1298 -#define __NR_get_robust_list		1299 -#define __NR_sync_file_range		1300 -#define __NR_tee			1301 -#define __NR_vmsplice			1302 -#define __NR_fallocate			1303 -#define __NR_getcpu			1304 -#define __NR_epoll_pwait		1305 -#define __NR_utimensat			1306 -#define __NR_signalfd			1307 -#define __NR_timerfd			1308 -#define __NR_eventfd			1309 -#define __NR_timerfd_create		1310 -#define __NR_timerfd_settime		1311 -#define __NR_timerfd_gettime		1312 -#define __NR_signalfd4			1313 -#define __NR_eventfd2			1314 -#define __NR_epoll_create1		1315 -#define __NR_dup3			1316 -#define __NR_pipe2			1317 -#define __NR_inotify_init1		1318 -#define __NR_preadv			1319 -#define __NR_pwritev			1320 -#define __NR_rt_tgsigqueueinfo		1321 -#define __NR_recvmmsg			1322 -#define __NR_fanotify_init		1323 -#define __NR_fanotify_mark		1324 -#define __NR_prlimit64			1325 +#include <uapi/asm/unistd.h> -#ifdef __KERNEL__ -#define NR_syscalls			302 /* length of syscall table */ +#define NR_syscalls			315 /* length of syscall table */  /*   * The following defines stop scripts/checksyscalls.sh from complaining about @@ -335,9 +27,6 @@  #define __IGNORE_vfork		/* clone() */  #define __IGNORE_umount2	/* umount() */ -#define __ARCH_WANT_SYS_RT_SIGACTION -#define __ARCH_WANT_SYS_RT_SIGSUSPEND -  #if !defined(__ASSEMBLY__) && !defined(ASSEMBLER)  #include <linux/types.h> @@ -355,23 +44,7 @@ asmlinkage unsigned long sys_mmap2(  				int prot, int flags,  				int fd, long pgoff);  struct pt_regs; -struct sigaction;  asmlinkage long sys_ia64_pipe(void); -asmlinkage long sys_rt_sigaction(int sig, -				 const struct sigaction __user *act, -				 struct sigaction __user *oact, -				 size_t sigsetsize); - -/* - * "Conditional" syscalls - * - * Note, this macro can only be used in the file which defines sys_ni_syscall, i.e., in - * kernel/sys_ni.c.  This version causes warnings because the declaration isn't a - * proper prototype, but we can't use __typeof__ either, because not all cond_syscall() - * declarations have prototypes at the moment. - */ -#define cond_syscall(x) asmlinkage long x (void) __attribute__((weak,alias("sys_ni_syscall")))  #endif /* !__ASSEMBLY__ */ -#endif /* __KERNEL__ */  #endif /* _ASM_IA64_UNISTD_H */ diff --git a/arch/ia64/include/asm/ustack.h b/arch/ia64/include/asm/ustack.h index 504167c35b8..b275401b96d 100644 --- a/arch/ia64/include/asm/ustack.h +++ b/arch/ia64/include/asm/ustack.h @@ -1,20 +1,11 @@  #ifndef _ASM_IA64_USTACK_H  #define _ASM_IA64_USTACK_H -/* - * Constants for the user stack size - */ - -#ifdef __KERNEL__  #include <asm/page.h> +#include <uapi/asm/ustack.h>  /* The absolute hard limit for stack size is 1/2 of the mappable space in the region */  #define MAX_USER_STACK_SIZE	(RGN_MAP_LIMIT/2)  #define STACK_TOP		(0x6000000000000000UL + RGN_MAP_LIMIT)  #define STACK_TOP_MAX		STACK_TOP -#endif - -/* Make a default stack size of 2GiB */ -#define DEFAULT_USER_STACK_SIZE	(1UL << 31) -  #endif /* _ASM_IA64_USTACK_H */ diff --git a/arch/ia64/include/asm/uv/uv.h b/arch/ia64/include/asm/uv/uv.h index 61b5bdfd980..8f6cbaa742e 100644 --- a/arch/ia64/include/asm/uv/uv.h +++ b/arch/ia64/include/asm/uv/uv.h @@ -1,7 +1,6 @@  #ifndef _ASM_IA64_UV_UV_H  #define _ASM_IA64_UV_UV_H -#include <asm/system.h>  #include <asm/sn/simulator.h>  static inline int is_uv_system(void) diff --git a/arch/ia64/include/asm/xen/events.h b/arch/ia64/include/asm/xen/events.h deleted file mode 100644 index baa74c82aa7..00000000000 --- a/arch/ia64/include/asm/xen/events.h +++ /dev/null @@ -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 */ diff --git a/arch/ia64/include/asm/xen/grant_table.h b/arch/ia64/include/asm/xen/grant_table.h deleted file mode 100644 index 2b1fae0e2d1..00000000000 --- a/arch/ia64/include/asm/xen/grant_table.h +++ /dev/null @@ -1,29 +0,0 @@ -/****************************************************************************** - * arch/ia64/include/asm/xen/grant_table.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_GRANT_TABLE_H -#define _ASM_IA64_XEN_GRANT_TABLE_H - -struct vm_struct *xen_alloc_vm_area(unsigned long size); -void xen_free_vm_area(struct vm_struct *area); - -#endif /* _ASM_IA64_XEN_GRANT_TABLE_H */ diff --git a/arch/ia64/include/asm/xen/hypercall.h b/arch/ia64/include/asm/xen/hypercall.h deleted file mode 100644 index 96fc62366aa..00000000000 --- a/arch/ia64/include/asm/xen/hypercall.h +++ /dev/null @@ -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_new, 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 */ diff --git a/arch/ia64/include/asm/xen/hypervisor.h b/arch/ia64/include/asm/xen/hypervisor.h deleted file mode 100644 index 67455c2ed2b..00000000000 --- a/arch/ia64/include/asm/xen/hypervisor.h +++ /dev/null @@ -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 */ diff --git a/arch/ia64/include/asm/xen/inst.h b/arch/ia64/include/asm/xen/inst.h deleted file mode 100644 index c53a4761120..00000000000 --- a/arch/ia64/include/asm/xen/inst.h +++ /dev/null @@ -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 diff --git a/arch/ia64/include/asm/xen/interface.h b/arch/ia64/include/asm/xen/interface.h deleted file mode 100644 index e951e740bdf..00000000000 --- a/arch/ia64/include/asm/xen/interface.h +++ /dev/null @@ -1,355 +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__ -/* 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(u64, unsigned long); -DEFINE_GUEST_HANDLE(char); -DEFINE_GUEST_HANDLE(int); -DEFINE_GUEST_HANDLE(long); -DEFINE_GUEST_HANDLE(void); - -typedef unsigned long xen_pfn_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__ */ - -/* 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 */ diff --git a/arch/ia64/include/asm/xen/irq.h b/arch/ia64/include/asm/xen/irq.h deleted file mode 100644 index a9045098300..00000000000 --- a/arch/ia64/include/asm/xen/irq.h +++ /dev/null @@ -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 */ diff --git a/arch/ia64/include/asm/xen/minstate.h b/arch/ia64/include/asm/xen/minstate.h deleted file mode 100644 index c57fa910f2c..00000000000 --- a/arch/ia64/include/asm/xen/minstate.h +++ /dev/null @@ -1,143 +0,0 @@ - -#ifdef CONFIG_VIRT_CPU_ACCOUNTING -/* 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) */		\ -	;; diff --git a/arch/ia64/include/asm/xen/page.h b/arch/ia64/include/asm/xen/page.h deleted file mode 100644 index 03441a780b5..00000000000 --- a/arch/ia64/include/asm/xen/page.h +++ /dev/null @@ -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 */ diff --git a/arch/ia64/include/asm/xen/patchlist.h b/arch/ia64/include/asm/xen/patchlist.h deleted file mode 100644 index eae944e8884..00000000000 --- a/arch/ia64/include/asm/xen/patchlist.h +++ /dev/null @@ -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 diff --git a/arch/ia64/include/asm/xen/privop.h b/arch/ia64/include/asm/xen/privop.h deleted file mode 100644 index fb4ec5e0b06..00000000000 --- a/arch/ia64/include/asm/xen/privop.h +++ /dev/null @@ -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 */ diff --git a/arch/ia64/include/asm/xen/xcom_hcall.h b/arch/ia64/include/asm/xen/xcom_hcall.h deleted file mode 100644 index 20b2950c71b..00000000000 --- a/arch/ia64/include/asm/xen/xcom_hcall.h +++ /dev/null @@ -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 */ diff --git a/arch/ia64/include/asm/xen/xencomm.h b/arch/ia64/include/asm/xen/xencomm.h deleted file mode 100644 index cded677bebf..00000000000 --- a/arch/ia64/include/asm/xen/xencomm.h +++ /dev/null @@ -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 */ diff --git a/arch/ia64/include/uapi/asm/Kbuild b/arch/ia64/include/uapi/asm/Kbuild new file mode 100644 index 00000000000..1b3f5eb5fcd --- /dev/null +++ b/arch/ia64/include/uapi/asm/Kbuild @@ -0,0 +1,50 @@ +# UAPI Header export list +include include/uapi/asm-generic/Kbuild.asm + +generic-y += kvm_para.h + +header-y += auxvec.h +header-y += bitsperlong.h +header-y += break.h +header-y += byteorder.h +header-y += cmpxchg.h +header-y += errno.h +header-y += fcntl.h +header-y += fpu.h +header-y += gcc_intrin.h +header-y += ia64regs.h +header-y += intel_intrin.h +header-y += intrinsics.h +header-y += ioctl.h +header-y += ioctls.h +header-y += ipcbuf.h +header-y += kvm.h +header-y += kvm_para.h +header-y += mman.h +header-y += msgbuf.h +header-y += param.h +header-y += perfmon.h +header-y += perfmon_default_smpl.h +header-y += poll.h +header-y += posix_types.h +header-y += ptrace.h +header-y += ptrace_offsets.h +header-y += resource.h +header-y += rse.h +header-y += sembuf.h +header-y += setup.h +header-y += shmbuf.h +header-y += sigcontext.h +header-y += siginfo.h +header-y += signal.h +header-y += socket.h +header-y += sockios.h +header-y += stat.h +header-y += statfs.h +header-y += swab.h +header-y += termbits.h +header-y += termios.h +header-y += types.h +header-y += ucontext.h +header-y += unistd.h +header-y += ustack.h diff --git a/arch/ia64/include/asm/auxvec.h b/arch/ia64/include/uapi/asm/auxvec.h index 23cebe5685b..58277fc650e 100644 --- a/arch/ia64/include/asm/auxvec.h +++ b/arch/ia64/include/uapi/asm/auxvec.h @@ -8,4 +8,6 @@  #define AT_SYSINFO	32  #define AT_SYSINFO_EHDR	33 +#define AT_VECTOR_SIZE_ARCH 2 /* entries in ARCH_DLINFO */ +  #endif /* _ASM_IA64_AUXVEC_H */ diff --git a/arch/ia64/include/asm/bitsperlong.h b/arch/ia64/include/uapi/asm/bitsperlong.h index ec4db3c970b..ec4db3c970b 100644 --- a/arch/ia64/include/asm/bitsperlong.h +++ b/arch/ia64/include/uapi/asm/bitsperlong.h diff --git a/arch/ia64/include/asm/break.h b/arch/ia64/include/uapi/asm/break.h index e90c40ec9ed..f0340203989 100644 --- a/arch/ia64/include/asm/break.h +++ b/arch/ia64/include/uapi/asm/break.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 */ diff --git a/arch/ia64/include/asm/byteorder.h b/arch/ia64/include/uapi/asm/byteorder.h index a8dd7355815..a8dd7355815 100644 --- a/arch/ia64/include/asm/byteorder.h +++ b/arch/ia64/include/uapi/asm/byteorder.h diff --git a/arch/ia64/include/uapi/asm/cmpxchg.h b/arch/ia64/include/uapi/asm/cmpxchg.h new file mode 100644 index 00000000000..f35109b1d90 --- /dev/null +++ b/arch/ia64/include/uapi/asm/cmpxchg.h @@ -0,0 +1,156 @@ +#ifndef _ASM_IA64_CMPXCHG_H +#define _ASM_IA64_CMPXCHG_H + +/* + * Compare/Exchange, forked from asm/intrinsics.h + * which was: + * + *	Copyright (C) 2002-2003 Hewlett-Packard Co + *	David Mosberger-Tang <davidm@hpl.hp.com> + */ + +#ifndef __ASSEMBLY__ + +#include <linux/types.h> +/* include compiler specific intrinsics */ +#include <asm/ia64regs.h> +#ifdef __INTEL_COMPILER +# include <asm/intel_intrin.h> +#else +# include <asm/gcc_intrin.h> +#endif + +/* + * This function doesn't exist, so you'll get a linker error if + * something tries to do an invalid xchg(). + */ +extern void ia64_xchg_called_with_bad_pointer(void); + +#define __xchg(x, ptr, size)						\ +({									\ +	unsigned long __xchg_result;					\ +									\ +	switch (size) {							\ +	case 1:								\ +		__xchg_result = ia64_xchg1((__u8 *)ptr, x);		\ +		break;							\ +									\ +	case 2:								\ +		__xchg_result = ia64_xchg2((__u16 *)ptr, x);		\ +		break;							\ +									\ +	case 4:								\ +		__xchg_result = ia64_xchg4((__u32 *)ptr, x);		\ +		break;							\ +									\ +	case 8:								\ +		__xchg_result = ia64_xchg8((__u64 *)ptr, x);		\ +		break;							\ +	default:							\ +		ia64_xchg_called_with_bad_pointer();			\ +	}								\ +	__xchg_result;							\ +}) + +#define xchg(ptr, x)							\ +((__typeof__(*(ptr))) __xchg((unsigned long) (x), (ptr), sizeof(*(ptr)))) + +/* + * Atomic compare and exchange.  Compare OLD with MEM, if identical, + * store NEW in MEM.  Return the initial value in MEM.  Success is + * indicated by comparing RETURN with OLD. + */ + +#define __HAVE_ARCH_CMPXCHG 1 + +/* + * This function doesn't exist, so you'll get a linker error + * if something tries to do an invalid cmpxchg(). + */ +extern long ia64_cmpxchg_called_with_bad_pointer(void); + +#define ia64_cmpxchg(sem, ptr, old, new, size)				\ +({									\ +	__u64 _o_, _r_;							\ +									\ +	switch (size) {							\ +	case 1:								\ +		_o_ = (__u8) (long) (old);				\ +		break;							\ +	case 2:								\ +		_o_ = (__u16) (long) (old);				\ +		break;							\ +	case 4:								\ +		_o_ = (__u32) (long) (old);				\ +		break;							\ +	case 8:								\ +		_o_ = (__u64) (long) (old);				\ +		break;							\ +	default:							\ +		break;							\ +	}								\ +	switch (size) {							\ +	case 1:								\ +		_r_ = ia64_cmpxchg1_##sem((__u8 *) ptr, new, _o_);	\ +		break;							\ +									\ +	case 2:								\ +		_r_ = ia64_cmpxchg2_##sem((__u16 *) ptr, new, _o_);	\ +		break;							\ +									\ +	case 4:								\ +		_r_ = ia64_cmpxchg4_##sem((__u32 *) ptr, new, _o_);	\ +		break;							\ +									\ +	case 8:								\ +		_r_ = ia64_cmpxchg8_##sem((__u64 *) ptr, new, _o_);	\ +		break;							\ +									\ +	default:							\ +		_r_ = ia64_cmpxchg_called_with_bad_pointer();		\ +		break;							\ +	}								\ +	(__typeof__(old)) _r_;						\ +}) + +#define cmpxchg_acq(ptr, o, n)	\ +	ia64_cmpxchg(acq, (ptr), (o), (n), sizeof(*(ptr))) +#define cmpxchg_rel(ptr, o, n)	\ +	ia64_cmpxchg(rel, (ptr), (o), (n), sizeof(*(ptr))) + +/* + * Worse still - early processor implementations actually just ignored + * the acquire/release and did a full fence all the time.  Unfortunately + * this meant a lot of badly written code that used .acq when they really + * wanted .rel became legacy out in the wild - so when we made a cpu + * that strictly did the .acq or .rel ... all that code started breaking - so + * we had to back-pedal and keep the "legacy" behavior of a full fence :-( + */ + +/* for compatibility with other platforms: */ +#define cmpxchg(ptr, o, n)	cmpxchg_acq((ptr), (o), (n)) +#define cmpxchg64(ptr, o, n)	cmpxchg_acq((ptr), (o), (n)) + +#define cmpxchg_local		cmpxchg +#define cmpxchg64_local		cmpxchg64 + +#ifdef CONFIG_IA64_DEBUG_CMPXCHG +# define CMPXCHG_BUGCHECK_DECL	int _cmpxchg_bugcheck_count = 128; +# define CMPXCHG_BUGCHECK(v)						\ +do {									\ +	if (_cmpxchg_bugcheck_count-- <= 0) {				\ +		void *ip;						\ +		extern int printk(const char *fmt, ...);		\ +		ip = (void *) ia64_getreg(_IA64_REG_IP);		\ +		printk("CMPXCHG_BUGCHECK: stuck at %p on word %p\n", ip, (v));\ +		break;							\ +	}								\ +} while (0) +#else /* !CONFIG_IA64_DEBUG_CMPXCHG */ +# define CMPXCHG_BUGCHECK_DECL +# define CMPXCHG_BUGCHECK(v) +#endif /* !CONFIG_IA64_DEBUG_CMPXCHG */ + +#endif /* !__ASSEMBLY__ */ + +#endif /* _ASM_IA64_CMPXCHG_H */ diff --git a/arch/ia64/include/asm/errno.h b/arch/ia64/include/uapi/asm/errno.h index 4c82b503d92..4c82b503d92 100644 --- a/arch/ia64/include/asm/errno.h +++ b/arch/ia64/include/uapi/asm/errno.h diff --git a/arch/ia64/include/asm/fcntl.h b/arch/ia64/include/uapi/asm/fcntl.h index 1dd275dc8f6..7b485876cad 100644 --- a/arch/ia64/include/asm/fcntl.h +++ b/arch/ia64/include/uapi/asm/fcntl.h @@ -8,6 +8,7 @@  #define force_o_largefile()	\  		(personality(current->personality) != PER_LINUX32) +#include <linux/personality.h>  #include <asm-generic/fcntl.h>  #endif /* _ASM_IA64_FCNTL_H */ diff --git a/arch/ia64/include/asm/fpu.h b/arch/ia64/include/uapi/asm/fpu.h index b6395ad1500..b6395ad1500 100644 --- a/arch/ia64/include/asm/fpu.h +++ b/arch/ia64/include/uapi/asm/fpu.h diff --git a/arch/ia64/include/uapi/asm/gcc_intrin.h b/arch/ia64/include/uapi/asm/gcc_intrin.h new file mode 100644 index 00000000000..61d0d011197 --- /dev/null +++ b/arch/ia64/include/uapi/asm/gcc_intrin.h @@ -0,0 +1,618 @@ +/* + * + * Copyright (C) 2002,2003 Jun Nakajima <jun.nakajima@intel.com> + * Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@intel.com> + */ +#ifndef _UAPI_ASM_IA64_GCC_INTRIN_H +#define _UAPI_ASM_IA64_GCC_INTRIN_H + +#include <linux/types.h> +#include <linux/compiler.h> + +/* define this macro to get some asm stmts included in 'c' files */ +#define ASM_SUPPORTED + +/* Optimization barrier */ +/* The "volatile" is due to gcc bugs */ +#define ia64_barrier()	asm volatile ("":::"memory") + +#define ia64_stop()	asm volatile (";;"::) + +#define ia64_invala_gr(regnum)	asm volatile ("invala.e r%0" :: "i"(regnum)) + +#define ia64_invala_fr(regnum)	asm volatile ("invala.e f%0" :: "i"(regnum)) + +#define ia64_flushrs() asm volatile ("flushrs;;":::"memory") + +#define ia64_loadrs() asm volatile ("loadrs;;":::"memory") + +extern void ia64_bad_param_for_setreg (void); +extern void ia64_bad_param_for_getreg (void); + + +#define ia64_native_setreg(regnum, val)						\ +({										\ +	switch (regnum) {							\ +	    case _IA64_REG_PSR_L:						\ +		    asm volatile ("mov psr.l=%0" :: "r"(val) : "memory");	\ +		    break;							\ +	    case _IA64_REG_AR_KR0 ... _IA64_REG_AR_EC:				\ +		    asm volatile ("mov ar%0=%1" ::				\ +		    			  "i" (regnum - _IA64_REG_AR_KR0),	\ +					  "r"(val): "memory");			\ +		    break;							\ +	    case _IA64_REG_CR_DCR ... _IA64_REG_CR_LRR1:			\ +		    asm volatile ("mov cr%0=%1" ::				\ +				          "i" (regnum - _IA64_REG_CR_DCR),	\ +					  "r"(val): "memory" );			\ +		    break;							\ +	    case _IA64_REG_SP:							\ +		    asm volatile ("mov r12=%0" ::				\ +			    		  "r"(val): "memory");			\ +		    break;							\ +	    case _IA64_REG_GP:							\ +		    asm volatile ("mov gp=%0" :: "r"(val) : "memory");		\ +		break;								\ +	    default:								\ +		    ia64_bad_param_for_setreg();				\ +		    break;							\ +	}									\ +}) + +#define ia64_native_getreg(regnum)						\ +({										\ +	__u64 ia64_intri_res;							\ +										\ +	switch (regnum) {							\ +	case _IA64_REG_GP:							\ +		asm volatile ("mov %0=gp" : "=r"(ia64_intri_res));		\ +		break;								\ +	case _IA64_REG_IP:							\ +		asm volatile ("mov %0=ip" : "=r"(ia64_intri_res));		\ +		break;								\ +	case _IA64_REG_PSR:							\ +		asm volatile ("mov %0=psr" : "=r"(ia64_intri_res));		\ +		break;								\ +	case _IA64_REG_TP:	/* for current() */				\ +		ia64_intri_res = ia64_r13;					\ +		break;								\ +	case _IA64_REG_AR_KR0 ... _IA64_REG_AR_EC:				\ +		asm volatile ("mov %0=ar%1" : "=r" (ia64_intri_res)		\ +				      : "i"(regnum - _IA64_REG_AR_KR0));	\ +		break;								\ +	case _IA64_REG_CR_DCR ... _IA64_REG_CR_LRR1:				\ +		asm volatile ("mov %0=cr%1" : "=r" (ia64_intri_res)		\ +				      : "i" (regnum - _IA64_REG_CR_DCR));	\ +		break;								\ +	case _IA64_REG_SP:							\ +		asm volatile ("mov %0=sp" : "=r" (ia64_intri_res));		\ +		break;								\ +	default:								\ +		ia64_bad_param_for_getreg();					\ +		break;								\ +	}									\ +	ia64_intri_res;								\ +}) + +#define ia64_hint_pause 0 + +#define ia64_hint(mode)						\ +({								\ +	switch (mode) {						\ +	case ia64_hint_pause:					\ +		asm volatile ("hint @pause" ::: "memory");	\ +		break;						\ +	}							\ +}) + + +/* Integer values for mux1 instruction */ +#define ia64_mux1_brcst 0 +#define ia64_mux1_mix   8 +#define ia64_mux1_shuf  9 +#define ia64_mux1_alt  10 +#define ia64_mux1_rev  11 + +#define ia64_mux1(x, mode)							\ +({										\ +	__u64 ia64_intri_res;							\ +										\ +	switch (mode) {								\ +	case ia64_mux1_brcst:							\ +		asm ("mux1 %0=%1,@brcst" : "=r" (ia64_intri_res) : "r" (x));	\ +		break;								\ +	case ia64_mux1_mix:							\ +		asm ("mux1 %0=%1,@mix" : "=r" (ia64_intri_res) : "r" (x));	\ +		break;								\ +	case ia64_mux1_shuf:							\ +		asm ("mux1 %0=%1,@shuf" : "=r" (ia64_intri_res) : "r" (x));	\ +		break;								\ +	case ia64_mux1_alt:							\ +		asm ("mux1 %0=%1,@alt" : "=r" (ia64_intri_res) : "r" (x));	\ +		break;								\ +	case ia64_mux1_rev:							\ +		asm ("mux1 %0=%1,@rev" : "=r" (ia64_intri_res) : "r" (x));	\ +		break;								\ +	}									\ +	ia64_intri_res;								\ +}) + +#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) +# define ia64_popcnt(x)		__builtin_popcountl(x) +#else +# define ia64_popcnt(x)						\ +  ({								\ +	__u64 ia64_intri_res;					\ +	asm ("popcnt %0=%1" : "=r" (ia64_intri_res) : "r" (x));	\ +								\ +	ia64_intri_res;						\ +  }) +#endif + +#define ia64_getf_exp(x)					\ +({								\ +	long ia64_intri_res;					\ +								\ +	asm ("getf.exp %0=%1" : "=r"(ia64_intri_res) : "f"(x));	\ +								\ +	ia64_intri_res;						\ +}) + +#define ia64_shrp(a, b, count)								\ +({											\ +	__u64 ia64_intri_res;								\ +	asm ("shrp %0=%1,%2,%3" : "=r"(ia64_intri_res) : "r"(a), "r"(b), "i"(count));	\ +	ia64_intri_res;									\ +}) + +#define ia64_ldfs(regnum, x)					\ +({								\ +	register double __f__ asm ("f"#regnum);			\ +	asm volatile ("ldfs %0=[%1]" :"=f"(__f__): "r"(x));	\ +}) + +#define ia64_ldfd(regnum, x)					\ +({								\ +	register double __f__ asm ("f"#regnum);			\ +	asm volatile ("ldfd %0=[%1]" :"=f"(__f__): "r"(x));	\ +}) + +#define ia64_ldfe(regnum, x)					\ +({								\ +	register double __f__ asm ("f"#regnum);			\ +	asm volatile ("ldfe %0=[%1]" :"=f"(__f__): "r"(x));	\ +}) + +#define ia64_ldf8(regnum, x)					\ +({								\ +	register double __f__ asm ("f"#regnum);			\ +	asm volatile ("ldf8 %0=[%1]" :"=f"(__f__): "r"(x));	\ +}) + +#define ia64_ldf_fill(regnum, x)				\ +({								\ +	register double __f__ asm ("f"#regnum);			\ +	asm volatile ("ldf.fill %0=[%1]" :"=f"(__f__): "r"(x));	\ +}) + +#define ia64_st4_rel_nta(m, val)					\ +({									\ +	asm volatile ("st4.rel.nta [%0] = %1\n\t" :: "r"(m), "r"(val));	\ +}) + +#define ia64_stfs(x, regnum)						\ +({									\ +	register double __f__ asm ("f"#regnum);				\ +	asm volatile ("stfs [%0]=%1" :: "r"(x), "f"(__f__) : "memory");	\ +}) + +#define ia64_stfd(x, regnum)						\ +({									\ +	register double __f__ asm ("f"#regnum);				\ +	asm volatile ("stfd [%0]=%1" :: "r"(x), "f"(__f__) : "memory");	\ +}) + +#define ia64_stfe(x, regnum)						\ +({									\ +	register double __f__ asm ("f"#regnum);				\ +	asm volatile ("stfe [%0]=%1" :: "r"(x), "f"(__f__) : "memory");	\ +}) + +#define ia64_stf8(x, regnum)						\ +({									\ +	register double __f__ asm ("f"#regnum);				\ +	asm volatile ("stf8 [%0]=%1" :: "r"(x), "f"(__f__) : "memory");	\ +}) + +#define ia64_stf_spill(x, regnum)						\ +({										\ +	register double __f__ asm ("f"#regnum);					\ +	asm volatile ("stf.spill [%0]=%1" :: "r"(x), "f"(__f__) : "memory");	\ +}) + +#define ia64_fetchadd4_acq(p, inc)						\ +({										\ +										\ +	__u64 ia64_intri_res;							\ +	asm volatile ("fetchadd4.acq %0=[%1],%2"				\ +				: "=r"(ia64_intri_res) : "r"(p), "i" (inc)	\ +				: "memory");					\ +										\ +	ia64_intri_res;								\ +}) + +#define ia64_fetchadd4_rel(p, inc)						\ +({										\ +	__u64 ia64_intri_res;							\ +	asm volatile ("fetchadd4.rel %0=[%1],%2"				\ +				: "=r"(ia64_intri_res) : "r"(p), "i" (inc)	\ +				: "memory");					\ +										\ +	ia64_intri_res;								\ +}) + +#define ia64_fetchadd8_acq(p, inc)						\ +({										\ +										\ +	__u64 ia64_intri_res;							\ +	asm volatile ("fetchadd8.acq %0=[%1],%2"				\ +				: "=r"(ia64_intri_res) : "r"(p), "i" (inc)	\ +				: "memory");					\ +										\ +	ia64_intri_res;								\ +}) + +#define ia64_fetchadd8_rel(p, inc)						\ +({										\ +	__u64 ia64_intri_res;							\ +	asm volatile ("fetchadd8.rel %0=[%1],%2"				\ +				: "=r"(ia64_intri_res) : "r"(p), "i" (inc)	\ +				: "memory");					\ +										\ +	ia64_intri_res;								\ +}) + +#define ia64_xchg1(ptr,x)							\ +({										\ +	__u64 ia64_intri_res;							\ +	asm volatile ("xchg1 %0=[%1],%2"					\ +		      : "=r" (ia64_intri_res) : "r" (ptr), "r" (x) : "memory");	\ +	ia64_intri_res;								\ +}) + +#define ia64_xchg2(ptr,x)						\ +({									\ +	__u64 ia64_intri_res;						\ +	asm volatile ("xchg2 %0=[%1],%2" : "=r" (ia64_intri_res)	\ +		      : "r" (ptr), "r" (x) : "memory");			\ +	ia64_intri_res;							\ +}) + +#define ia64_xchg4(ptr,x)						\ +({									\ +	__u64 ia64_intri_res;						\ +	asm volatile ("xchg4 %0=[%1],%2" : "=r" (ia64_intri_res)	\ +		      : "r" (ptr), "r" (x) : "memory");			\ +	ia64_intri_res;							\ +}) + +#define ia64_xchg8(ptr,x)						\ +({									\ +	__u64 ia64_intri_res;						\ +	asm volatile ("xchg8 %0=[%1],%2" : "=r" (ia64_intri_res)	\ +		      : "r" (ptr), "r" (x) : "memory");			\ +	ia64_intri_res;							\ +}) + +#define ia64_cmpxchg1_acq(ptr, new, old)						\ +({											\ +	__u64 ia64_intri_res;								\ +	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ +	asm volatile ("cmpxchg1.acq %0=[%1],%2,ar.ccv":					\ +			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ +	ia64_intri_res;									\ +}) + +#define ia64_cmpxchg1_rel(ptr, new, old)						\ +({											\ +	__u64 ia64_intri_res;								\ +	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ +	asm volatile ("cmpxchg1.rel %0=[%1],%2,ar.ccv":					\ +			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ +	ia64_intri_res;									\ +}) + +#define ia64_cmpxchg2_acq(ptr, new, old)						\ +({											\ +	__u64 ia64_intri_res;								\ +	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ +	asm volatile ("cmpxchg2.acq %0=[%1],%2,ar.ccv":					\ +			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ +	ia64_intri_res;									\ +}) + +#define ia64_cmpxchg2_rel(ptr, new, old)						\ +({											\ +	__u64 ia64_intri_res;								\ +	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ +											\ +	asm volatile ("cmpxchg2.rel %0=[%1],%2,ar.ccv":					\ +			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ +	ia64_intri_res;									\ +}) + +#define ia64_cmpxchg4_acq(ptr, new, old)						\ +({											\ +	__u64 ia64_intri_res;								\ +	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ +	asm volatile ("cmpxchg4.acq %0=[%1],%2,ar.ccv":					\ +			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ +	ia64_intri_res;									\ +}) + +#define ia64_cmpxchg4_rel(ptr, new, old)						\ +({											\ +	__u64 ia64_intri_res;								\ +	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ +	asm volatile ("cmpxchg4.rel %0=[%1],%2,ar.ccv":					\ +			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ +	ia64_intri_res;									\ +}) + +#define ia64_cmpxchg8_acq(ptr, new, old)						\ +({											\ +	__u64 ia64_intri_res;								\ +	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ +	asm volatile ("cmpxchg8.acq %0=[%1],%2,ar.ccv":					\ +			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ +	ia64_intri_res;									\ +}) + +#define ia64_cmpxchg8_rel(ptr, new, old)						\ +({											\ +	__u64 ia64_intri_res;								\ +	asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));					\ +											\ +	asm volatile ("cmpxchg8.rel %0=[%1],%2,ar.ccv":					\ +			      "=r"(ia64_intri_res) : "r"(ptr), "r"(new) : "memory");	\ +	ia64_intri_res;									\ +}) + +#define ia64_mf()	asm volatile ("mf" ::: "memory") +#define ia64_mfa()	asm volatile ("mf.a" ::: "memory") + +#define ia64_invala() asm volatile ("invala" ::: "memory") + +#define ia64_native_thash(addr)							\ +({										\ +	unsigned long ia64_intri_res;						\ +	asm volatile ("thash %0=%1" : "=r"(ia64_intri_res) : "r" (addr));	\ +	ia64_intri_res;								\ +}) + +#define ia64_srlz_i()	asm volatile (";; srlz.i ;;" ::: "memory") +#define ia64_srlz_d()	asm volatile (";; srlz.d" ::: "memory"); + +#ifdef HAVE_SERIALIZE_DIRECTIVE +# define ia64_dv_serialize_data()		asm volatile (".serialize.data"); +# define ia64_dv_serialize_instruction()	asm volatile (".serialize.instruction"); +#else +# define ia64_dv_serialize_data() +# define ia64_dv_serialize_instruction() +#endif + +#define ia64_nop(x)	asm volatile ("nop %0"::"i"(x)); + +#define ia64_itci(addr)	asm volatile ("itc.i %0;;" :: "r"(addr) : "memory") + +#define ia64_itcd(addr)	asm volatile ("itc.d %0;;" :: "r"(addr) : "memory") + + +#define ia64_itri(trnum, addr) asm volatile ("itr.i itr[%0]=%1"				\ +					     :: "r"(trnum), "r"(addr) : "memory") + +#define ia64_itrd(trnum, addr) asm volatile ("itr.d dtr[%0]=%1"				\ +					     :: "r"(trnum), "r"(addr) : "memory") + +#define ia64_tpa(addr)								\ +({										\ +	unsigned long ia64_pa;							\ +	asm volatile ("tpa %0 = %1" : "=r"(ia64_pa) : "r"(addr) : "memory");	\ +	ia64_pa;								\ +}) + +#define __ia64_set_dbr(index, val)						\ +	asm volatile ("mov dbr[%0]=%1" :: "r"(index), "r"(val) : "memory") + +#define ia64_set_ibr(index, val)						\ +	asm volatile ("mov ibr[%0]=%1" :: "r"(index), "r"(val) : "memory") + +#define ia64_set_pkr(index, val)						\ +	asm volatile ("mov pkr[%0]=%1" :: "r"(index), "r"(val) : "memory") + +#define ia64_set_pmc(index, val)						\ +	asm volatile ("mov pmc[%0]=%1" :: "r"(index), "r"(val) : "memory") + +#define ia64_set_pmd(index, val)						\ +	asm volatile ("mov pmd[%0]=%1" :: "r"(index), "r"(val) : "memory") + +#define ia64_native_set_rr(index, val)							\ +	asm volatile ("mov rr[%0]=%1" :: "r"(index), "r"(val) : "memory"); + +#define ia64_native_get_cpuid(index)							\ +({											\ +	unsigned long ia64_intri_res;							\ +	asm volatile ("mov %0=cpuid[%r1]" : "=r"(ia64_intri_res) : "rO"(index));	\ +	ia64_intri_res;									\ +}) + +#define __ia64_get_dbr(index)							\ +({										\ +	unsigned long ia64_intri_res;						\ +	asm volatile ("mov %0=dbr[%1]" : "=r"(ia64_intri_res) : "r"(index));	\ +	ia64_intri_res;								\ +}) + +#define ia64_get_ibr(index)							\ +({										\ +	unsigned long ia64_intri_res;						\ +	asm volatile ("mov %0=ibr[%1]" : "=r"(ia64_intri_res) : "r"(index));	\ +	ia64_intri_res;								\ +}) + +#define ia64_get_pkr(index)							\ +({										\ +	unsigned long ia64_intri_res;						\ +	asm volatile ("mov %0=pkr[%1]" : "=r"(ia64_intri_res) : "r"(index));	\ +	ia64_intri_res;								\ +}) + +#define ia64_get_pmc(index)							\ +({										\ +	unsigned long ia64_intri_res;						\ +	asm volatile ("mov %0=pmc[%1]" : "=r"(ia64_intri_res) : "r"(index));	\ +	ia64_intri_res;								\ +}) + + +#define ia64_native_get_pmd(index)						\ +({										\ +	unsigned long ia64_intri_res;						\ +	asm volatile ("mov %0=pmd[%1]" : "=r"(ia64_intri_res) : "r"(index));	\ +	ia64_intri_res;								\ +}) + +#define ia64_native_get_rr(index)						\ +({										\ +	unsigned long ia64_intri_res;						\ +	asm volatile ("mov %0=rr[%1]" : "=r"(ia64_intri_res) : "r" (index));	\ +	ia64_intri_res;								\ +}) + +#define ia64_native_fc(addr)	asm volatile ("fc %0" :: "r"(addr) : "memory") + + +#define ia64_sync_i()	asm volatile (";; sync.i" ::: "memory") + +#define ia64_native_ssm(mask)	asm volatile ("ssm %0":: "i"((mask)) : "memory") +#define ia64_native_rsm(mask)	asm volatile ("rsm %0":: "i"((mask)) : "memory") +#define ia64_sum(mask)	asm volatile ("sum %0":: "i"((mask)) : "memory") +#define ia64_rum(mask)	asm volatile ("rum %0":: "i"((mask)) : "memory") + +#define ia64_ptce(addr)	asm volatile ("ptc.e %0" :: "r"(addr)) + +#define ia64_native_ptcga(addr, size)						\ +do {										\ +	asm volatile ("ptc.ga %0,%1" :: "r"(addr), "r"(size) : "memory");	\ +	ia64_dv_serialize_data();						\ +} while (0) + +#define ia64_ptcl(addr, size)							\ +do {										\ +	asm volatile ("ptc.l %0,%1" :: "r"(addr), "r"(size) : "memory");	\ +	ia64_dv_serialize_data();						\ +} while (0) + +#define ia64_ptri(addr, size)						\ +	asm volatile ("ptr.i %0,%1" :: "r"(addr), "r"(size) : "memory") + +#define ia64_ptrd(addr, size)						\ +	asm volatile ("ptr.d %0,%1" :: "r"(addr), "r"(size) : "memory") + +#define ia64_ttag(addr)							\ +({									  \ +	__u64 ia64_intri_res;						   \ +	asm volatile ("ttag %0=%1" : "=r"(ia64_intri_res) : "r" (addr));   \ +	ia64_intri_res;							 \ +}) + + +/* Values for lfhint in ia64_lfetch and ia64_lfetch_fault */ + +#define ia64_lfhint_none   0 +#define ia64_lfhint_nt1    1 +#define ia64_lfhint_nt2    2 +#define ia64_lfhint_nta    3 + +#define ia64_lfetch(lfhint, y)					\ +({								\ +        switch (lfhint) {					\ +        case ia64_lfhint_none:					\ +                asm volatile ("lfetch [%0]" : : "r"(y));	\ +                break;						\ +        case ia64_lfhint_nt1:					\ +                asm volatile ("lfetch.nt1 [%0]" : : "r"(y));	\ +                break;						\ +        case ia64_lfhint_nt2:					\ +                asm volatile ("lfetch.nt2 [%0]" : : "r"(y));	\ +                break;						\ +        case ia64_lfhint_nta:					\ +                asm volatile ("lfetch.nta [%0]" : : "r"(y));	\ +                break;						\ +        }							\ +}) + +#define ia64_lfetch_excl(lfhint, y)					\ +({									\ +        switch (lfhint) {						\ +        case ia64_lfhint_none:						\ +                asm volatile ("lfetch.excl [%0]" :: "r"(y));		\ +                break;							\ +        case ia64_lfhint_nt1:						\ +                asm volatile ("lfetch.excl.nt1 [%0]" :: "r"(y));	\ +                break;							\ +        case ia64_lfhint_nt2:						\ +                asm volatile ("lfetch.excl.nt2 [%0]" :: "r"(y));	\ +                break;							\ +        case ia64_lfhint_nta:						\ +                asm volatile ("lfetch.excl.nta [%0]" :: "r"(y));	\ +                break;							\ +        }								\ +}) + +#define ia64_lfetch_fault(lfhint, y)					\ +({									\ +        switch (lfhint) {						\ +        case ia64_lfhint_none:						\ +                asm volatile ("lfetch.fault [%0]" : : "r"(y));		\ +                break;							\ +        case ia64_lfhint_nt1:						\ +                asm volatile ("lfetch.fault.nt1 [%0]" : : "r"(y));	\ +                break;							\ +        case ia64_lfhint_nt2:						\ +                asm volatile ("lfetch.fault.nt2 [%0]" : : "r"(y));	\ +                break;							\ +        case ia64_lfhint_nta:						\ +                asm volatile ("lfetch.fault.nta [%0]" : : "r"(y));	\ +                break;							\ +        }								\ +}) + +#define ia64_lfetch_fault_excl(lfhint, y)				\ +({									\ +        switch (lfhint) {						\ +        case ia64_lfhint_none:						\ +                asm volatile ("lfetch.fault.excl [%0]" :: "r"(y));	\ +                break;							\ +        case ia64_lfhint_nt1:						\ +                asm volatile ("lfetch.fault.excl.nt1 [%0]" :: "r"(y));	\ +                break;							\ +        case ia64_lfhint_nt2:						\ +                asm volatile ("lfetch.fault.excl.nt2 [%0]" :: "r"(y));	\ +                break;							\ +        case ia64_lfhint_nta:						\ +                asm volatile ("lfetch.fault.excl.nta [%0]" :: "r"(y));	\ +                break;							\ +        }								\ +}) + +#define ia64_native_intrin_local_irq_restore(x)			\ +do {								\ +	asm volatile (";;   cmp.ne p6,p7=%0,r0;;"		\ +		      "(p6) ssm psr.i;"				\ +		      "(p7) rsm psr.i;;"			\ +		      "(p6) srlz.d"				\ +		      :: "r"((x)) : "p6", "p7", "memory");	\ +} while (0) + +#endif /* _UAPI_ASM_IA64_GCC_INTRIN_H */ diff --git a/arch/ia64/include/asm/ia64regs.h b/arch/ia64/include/uapi/asm/ia64regs.h index 1757f1c11ad..1757f1c11ad 100644 --- a/arch/ia64/include/asm/ia64regs.h +++ b/arch/ia64/include/uapi/asm/ia64regs.h diff --git a/arch/ia64/include/asm/intel_intrin.h b/arch/ia64/include/uapi/asm/intel_intrin.h index 53cec577558..53cec577558 100644 --- a/arch/ia64/include/asm/intel_intrin.h +++ b/arch/ia64/include/uapi/asm/intel_intrin.h diff --git a/arch/ia64/include/uapi/asm/intrinsics.h b/arch/ia64/include/uapi/asm/intrinsics.h new file mode 100644 index 00000000000..5829978ff46 --- /dev/null +++ b/arch/ia64/include/uapi/asm/intrinsics.h @@ -0,0 +1,124 @@ +/* + * Compiler-dependent intrinsics. + * + * Copyright (C) 2002-2003 Hewlett-Packard Co + *	David Mosberger-Tang <davidm@hpl.hp.com> + */ +#ifndef _UAPI_ASM_IA64_INTRINSICS_H +#define _UAPI_ASM_IA64_INTRINSICS_H + + +#ifndef __ASSEMBLY__ + +#include <linux/types.h> +/* include compiler specific intrinsics */ +#include <asm/ia64regs.h> +#ifdef __INTEL_COMPILER +# include <asm/intel_intrin.h> +#else +# include <asm/gcc_intrin.h> +#endif +#include <asm/cmpxchg.h> + +#define ia64_native_get_psr_i()	(ia64_native_getreg(_IA64_REG_PSR) & IA64_PSR_I) + +#define ia64_native_set_rr0_to_rr4(val0, val1, val2, val3, val4)	\ +do {									\ +	ia64_native_set_rr(0x0000000000000000UL, (val0));		\ +	ia64_native_set_rr(0x2000000000000000UL, (val1));		\ +	ia64_native_set_rr(0x4000000000000000UL, (val2));		\ +	ia64_native_set_rr(0x6000000000000000UL, (val3));		\ +	ia64_native_set_rr(0x8000000000000000UL, (val4));		\ +} while (0) + +/* + * Force an unresolved reference if someone tries to use + * ia64_fetch_and_add() with a bad value. + */ +extern unsigned long __bad_size_for_ia64_fetch_and_add (void); +extern unsigned long __bad_increment_for_ia64_fetch_and_add (void); + +#define IA64_FETCHADD(tmp,v,n,sz,sem)						\ +({										\ +	switch (sz) {								\ +	      case 4:								\ +	        tmp = ia64_fetchadd4_##sem((unsigned int *) v, n);		\ +		break;								\ +										\ +	      case 8:								\ +	        tmp = ia64_fetchadd8_##sem((unsigned long *) v, n);		\ +		break;								\ +										\ +	      default:								\ +		__bad_size_for_ia64_fetch_and_add();				\ +	}									\ +}) + +#define ia64_fetchadd(i,v,sem)								\ +({											\ +	__u64 _tmp;									\ +	volatile __typeof__(*(v)) *_v = (v);						\ +	/* Can't use a switch () here: gcc isn't always smart enough for that... */	\ +	if ((i) == -16)									\ +		IA64_FETCHADD(_tmp, _v, -16, sizeof(*(v)), sem);			\ +	else if ((i) == -8)								\ +		IA64_FETCHADD(_tmp, _v, -8, sizeof(*(v)), sem);				\ +	else if ((i) == -4)								\ +		IA64_FETCHADD(_tmp, _v, -4, sizeof(*(v)), sem);				\ +	else if ((i) == -1)								\ +		IA64_FETCHADD(_tmp, _v, -1, sizeof(*(v)), sem);				\ +	else if ((i) == 1)								\ +		IA64_FETCHADD(_tmp, _v, 1, sizeof(*(v)), sem);				\ +	else if ((i) == 4)								\ +		IA64_FETCHADD(_tmp, _v, 4, sizeof(*(v)), sem);				\ +	else if ((i) == 8)								\ +		IA64_FETCHADD(_tmp, _v, 8, sizeof(*(v)), sem);				\ +	else if ((i) == 16)								\ +		IA64_FETCHADD(_tmp, _v, 16, sizeof(*(v)), sem);				\ +	else										\ +		_tmp = __bad_increment_for_ia64_fetch_and_add();			\ +	(__typeof__(*(v))) (_tmp);	/* return old value */				\ +}) + +#define ia64_fetch_and_add(i,v)	(ia64_fetchadd(i, v, rel) + (i)) /* return new value */ + +#endif + + +#ifndef __ASSEMBLY__ + +#define IA64_INTRINSIC_API(name)	ia64_native_ ## name +#define IA64_INTRINSIC_MACRO(name)	ia64_native_ ## name + + +/************************************************/ +/* Instructions paravirtualized for correctness */ +/************************************************/ +/* fc, thash, get_cpuid, get_pmd, get_eflags, set_eflags */ +/* Note that "ttag" and "cover" are also privilege-sensitive; "ttag" + * is not currently used (though it may be in a long-format VHPT system!) + */ +#define ia64_fc				IA64_INTRINSIC_API(fc) +#define ia64_thash			IA64_INTRINSIC_API(thash) +#define ia64_get_cpuid			IA64_INTRINSIC_API(get_cpuid) +#define ia64_get_pmd			IA64_INTRINSIC_API(get_pmd) + + +/************************************************/ +/* Instructions paravirtualized for performance */ +/************************************************/ +#define ia64_ssm			IA64_INTRINSIC_MACRO(ssm) +#define ia64_rsm			IA64_INTRINSIC_MACRO(rsm) +#define ia64_getreg			IA64_INTRINSIC_MACRO(getreg) +#define ia64_setreg			IA64_INTRINSIC_API(setreg) +#define ia64_set_rr			IA64_INTRINSIC_API(set_rr) +#define ia64_get_rr			IA64_INTRINSIC_API(get_rr) +#define ia64_ptcga			IA64_INTRINSIC_API(ptcga) +#define ia64_get_psr_i			IA64_INTRINSIC_API(get_psr_i) +#define ia64_intrin_local_irq_restore	\ +	IA64_INTRINSIC_API(intrin_local_irq_restore) +#define ia64_set_rr0_to_rr4		IA64_INTRINSIC_API(set_rr0_to_rr4) + +#endif /* !__ASSEMBLY__ */ + +#endif /* _UAPI_ASM_IA64_INTRINSICS_H */ diff --git a/arch/ia64/include/asm/ioctl.h b/arch/ia64/include/uapi/asm/ioctl.h index b279fe06dfe..b279fe06dfe 100644 --- a/arch/ia64/include/asm/ioctl.h +++ b/arch/ia64/include/uapi/asm/ioctl.h diff --git a/arch/ia64/include/asm/ioctls.h b/arch/ia64/include/uapi/asm/ioctls.h index f3aab5512e9..f3aab5512e9 100644 --- a/arch/ia64/include/asm/ioctls.h +++ b/arch/ia64/include/uapi/asm/ioctls.h diff --git a/arch/ia64/include/uapi/asm/ipcbuf.h b/arch/ia64/include/uapi/asm/ipcbuf.h new file mode 100644 index 00000000000..84c7e51cb6d --- /dev/null +++ b/arch/ia64/include/uapi/asm/ipcbuf.h @@ -0,0 +1 @@ +#include <asm-generic/ipcbuf.h> diff --git a/arch/ia64/include/asm/kvm.h b/arch/ia64/include/uapi/asm/kvm.h index bc90c75adf6..99503c28440 100644 --- a/arch/ia64/include/asm/kvm.h +++ b/arch/ia64/include/uapi/asm/kvm.h @@ -26,7 +26,7 @@  /* Select x86 specific features in <linux/kvm.h> */  #define __KVM_HAVE_IOAPIC -#define __KVM_HAVE_DEVICE_ASSIGNMENT +#define __KVM_HAVE_IRQ_LINE  /* Architectural interrupt line count. */  #define KVM_NR_INTERRUPTS 256 @@ -261,4 +261,8 @@ struct kvm_debug_exit_arch {  struct kvm_guest_debug_arch {  }; +/* definition of registers in kvm_run */ +struct kvm_sync_regs { +}; +  #endif diff --git a/arch/ia64/include/uapi/asm/mman.h b/arch/ia64/include/uapi/asm/mman.h new file mode 100644 index 00000000000..8740819adc5 --- /dev/null +++ b/arch/ia64/include/uapi/asm/mman.h @@ -0,0 +1,16 @@ +/* + * Based on <asm-i386/mman.h>. + * + * Modified 1998-2000, 2002 + *	David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co + */ +#ifndef _UAPI_ASM_IA64_MMAN_H +#define _UAPI_ASM_IA64_MMAN_H + + +#include <asm-generic/mman.h> + +#define MAP_GROWSUP	0x0200		/* register stack-like segment */ + + +#endif /* _UAPI_ASM_IA64_MMAN_H */ diff --git a/arch/ia64/include/asm/msgbuf.h b/arch/ia64/include/uapi/asm/msgbuf.h index 6c64c0d2aae..6c64c0d2aae 100644 --- a/arch/ia64/include/asm/msgbuf.h +++ b/arch/ia64/include/uapi/asm/msgbuf.h diff --git a/arch/ia64/include/uapi/asm/param.h b/arch/ia64/include/uapi/asm/param.h new file mode 100644 index 00000000000..d7da41d9497 --- /dev/null +++ b/arch/ia64/include/uapi/asm/param.h @@ -0,0 +1,29 @@ +/* + * Fundamental kernel parameters. + * + * Based on <asm-i386/param.h>. + * + * Modified 1998, 1999, 2002-2003 + *	David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co + */ +#ifndef _UAPI_ASM_IA64_PARAM_H +#define _UAPI_ASM_IA64_PARAM_H + + +#define EXEC_PAGESIZE	65536 + +#ifndef NOGROUP +# define NOGROUP	(-1) +#endif + +#define MAXHOSTNAMELEN	64	/* max length of hostname */ + +#ifndef __KERNEL__ +   /* +    * Technically, this is wrong, but some old apps still refer to it.  The proper way to +    * get the HZ value is via sysconf(_SC_CLK_TCK). +    */ +# define HZ 1024 +#endif + +#endif /* _UAPI_ASM_IA64_PARAM_H */ diff --git a/arch/ia64/include/uapi/asm/perfmon.h b/arch/ia64/include/uapi/asm/perfmon.h new file mode 100644 index 00000000000..1a10a2dd58a --- /dev/null +++ b/arch/ia64/include/uapi/asm/perfmon.h @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2001-2003 Hewlett-Packard Co + *               Stephane Eranian <eranian@hpl.hp.com> + */ + +#ifndef _UAPI_ASM_IA64_PERFMON_H +#define _UAPI_ASM_IA64_PERFMON_H + +/* + * perfmon commands supported on all CPU models + */ +#define PFM_WRITE_PMCS		0x01 +#define PFM_WRITE_PMDS		0x02 +#define PFM_READ_PMDS		0x03 +#define PFM_STOP		0x04 +#define PFM_START		0x05 +#define PFM_ENABLE		0x06 /* obsolete */ +#define PFM_DISABLE		0x07 /* obsolete */ +#define PFM_CREATE_CONTEXT	0x08 +#define PFM_DESTROY_CONTEXT	0x09 /* obsolete use close() */ +#define PFM_RESTART		0x0a +#define PFM_PROTECT_CONTEXT	0x0b /* obsolete */ +#define PFM_GET_FEATURES	0x0c +#define PFM_DEBUG		0x0d +#define PFM_UNPROTECT_CONTEXT	0x0e /* obsolete */ +#define PFM_GET_PMC_RESET_VAL	0x0f +#define PFM_LOAD_CONTEXT	0x10 +#define PFM_UNLOAD_CONTEXT	0x11 + +/* + * PMU model specific commands (may not be supported on all PMU models) + */ +#define PFM_WRITE_IBRS		0x20 +#define PFM_WRITE_DBRS		0x21 + +/* + * context flags + */ +#define PFM_FL_NOTIFY_BLOCK    	 0x01	/* block task on user level notifications */ +#define PFM_FL_SYSTEM_WIDE	 0x02	/* create a system wide context */ +#define PFM_FL_OVFL_NO_MSG	 0x80   /* do not post overflow/end messages for notification */ + +/* + * event set flags + */ +#define PFM_SETFL_EXCL_IDLE      0x01   /* exclude idle task (syswide only) XXX: DO NOT USE YET */ + +/* + * PMC flags + */ +#define PFM_REGFL_OVFL_NOTIFY	0x1	/* send notification on overflow */ +#define PFM_REGFL_RANDOM	0x2	/* randomize sampling interval   */ + +/* + * PMD/PMC/IBR/DBR return flags (ignored on input) + * + * Those flags are used on output and must be checked in case EAGAIN is returned + * by any of the calls using a pfarg_reg_t or pfarg_dbreg_t structure. + */ +#define PFM_REG_RETFL_NOTAVAIL	(1UL<<31) /* set if register is implemented but not available */ +#define PFM_REG_RETFL_EINVAL	(1UL<<30) /* set if register entry is invalid */ +#define PFM_REG_RETFL_MASK	(PFM_REG_RETFL_NOTAVAIL|PFM_REG_RETFL_EINVAL) + +#define PFM_REG_HAS_ERROR(flag)	(((flag) & PFM_REG_RETFL_MASK) != 0) + +typedef unsigned char pfm_uuid_t[16];	/* custom sampling buffer identifier type */ + +/* + * Request structure used to define a context + */ +typedef struct { +	pfm_uuid_t     ctx_smpl_buf_id;	 /* which buffer format to use (if needed) */ +	unsigned long  ctx_flags;	 /* noblock/block */ +	unsigned short ctx_nextra_sets;	 /* number of extra event sets (you always get 1) */ +	unsigned short ctx_reserved1;	 /* for future use */ +	int	       ctx_fd;		 /* return arg: unique identification for context */ +	void	       *ctx_smpl_vaddr;	 /* return arg: virtual address of sampling buffer, is used */ +	unsigned long  ctx_reserved2[11];/* for future use */ +} pfarg_context_t; + +/* + * Request structure used to write/read a PMC or PMD + */ +typedef struct { +	unsigned int	reg_num;	   /* which register */ +	unsigned short	reg_set;	   /* event set for this register */ +	unsigned short	reg_reserved1;	   /* for future use */ + +	unsigned long	reg_value;	   /* initial pmc/pmd value */ +	unsigned long	reg_flags;	   /* input: pmc/pmd flags, return: reg error */ + +	unsigned long	reg_long_reset;	   /* reset after buffer overflow notification */ +	unsigned long	reg_short_reset;   /* reset after counter overflow */ + +	unsigned long	reg_reset_pmds[4]; /* which other counters to reset on overflow */ +	unsigned long	reg_random_seed;   /* seed value when randomization is used */ +	unsigned long	reg_random_mask;   /* bitmask used to limit random value */ +	unsigned long   reg_last_reset_val;/* return: PMD last reset value */ + +	unsigned long	reg_smpl_pmds[4];  /* which pmds are accessed when PMC overflows */ +	unsigned long	reg_smpl_eventid;  /* opaque sampling event identifier */ + +	unsigned long   reg_reserved2[3];   /* for future use */ +} pfarg_reg_t; + +typedef struct { +	unsigned int	dbreg_num;		/* which debug register */ +	unsigned short	dbreg_set;		/* event set for this register */ +	unsigned short	dbreg_reserved1;	/* for future use */ +	unsigned long	dbreg_value;		/* value for debug register */ +	unsigned long	dbreg_flags;		/* return: dbreg error */ +	unsigned long	dbreg_reserved2[1];	/* for future use */ +} pfarg_dbreg_t; + +typedef struct { +	unsigned int	ft_version;	/* perfmon: major [16-31], minor [0-15] */ +	unsigned int	ft_reserved;	/* reserved for future use */ +	unsigned long	reserved[4];	/* for future use */ +} pfarg_features_t; + +typedef struct { +	pid_t		load_pid;	   /* process to load the context into */ +	unsigned short	load_set;	   /* first event set to load */ +	unsigned short	load_reserved1;	   /* for future use */ +	unsigned long	load_reserved2[3]; /* for future use */ +} pfarg_load_t; + +typedef struct { +	int		msg_type;		/* generic message header */ +	int		msg_ctx_fd;		/* generic message header */ +	unsigned long	msg_ovfl_pmds[4];	/* which PMDs overflowed */ +	unsigned short  msg_active_set;		/* active set at the time of overflow */ +	unsigned short  msg_reserved1;		/* for future use */ +	unsigned int    msg_reserved2;		/* for future use */ +	unsigned long	msg_tstamp;		/* for perf tuning/debug */ +} pfm_ovfl_msg_t; + +typedef struct { +	int		msg_type;		/* generic message header */ +	int		msg_ctx_fd;		/* generic message header */ +	unsigned long	msg_tstamp;		/* for perf tuning */ +} pfm_end_msg_t; + +typedef struct { +	int		msg_type;		/* type of the message */ +	int		msg_ctx_fd;		/* unique identifier for the context */ +	unsigned long	msg_tstamp;		/* for perf tuning */ +} pfm_gen_msg_t; + +#define PFM_MSG_OVFL	1	/* an overflow happened */ +#define PFM_MSG_END	2	/* task to which context was attached ended */ + +typedef union { +	pfm_ovfl_msg_t	pfm_ovfl_msg; +	pfm_end_msg_t	pfm_end_msg; +	pfm_gen_msg_t	pfm_gen_msg; +} pfm_msg_t; + +/* + * Define the version numbers for both perfmon as a whole and the sampling buffer format. + */ +#define PFM_VERSION_MAJ		 2U +#define PFM_VERSION_MIN		 0U +#define PFM_VERSION		 (((PFM_VERSION_MAJ&0xffff)<<16)|(PFM_VERSION_MIN & 0xffff)) +#define PFM_VERSION_MAJOR(x)	 (((x)>>16) & 0xffff) +#define PFM_VERSION_MINOR(x)	 ((x) & 0xffff) + + +/* + * miscellaneous architected definitions + */ +#define PMU_FIRST_COUNTER	4	/* first counting monitor (PMC/PMD) */ +#define PMU_MAX_PMCS		256	/* maximum architected number of PMC registers */ +#define PMU_MAX_PMDS		256	/* maximum architected number of PMD registers */ + + +#endif /* _UAPI_ASM_IA64_PERFMON_H */ diff --git a/arch/ia64/include/asm/perfmon_default_smpl.h b/arch/ia64/include/uapi/asm/perfmon_default_smpl.h index 74724b24c2b..a2d560c6723 100644 --- a/arch/ia64/include/asm/perfmon_default_smpl.h +++ b/arch/ia64/include/uapi/asm/perfmon_default_smpl.h @@ -67,8 +67,8 @@ typedef struct {          unsigned long   ip;                     /* where did the overflow interrupt happened  */          unsigned long   tstamp;                 /* ar.itc when entering perfmon intr. handler */ -        unsigned short  cpu;                    /* cpu on which the overflow occured */ -        unsigned short  set;                    /* event set active when overflow ocurred   */ +        unsigned short  cpu;                    /* cpu on which the overflow occurred */ +        unsigned short  set;                    /* event set active when overflow occurred   */          int    		tgid;              	/* thread group id (for NPTL, this is getpid()) */  } pfm_default_smpl_entry_t; diff --git a/arch/ia64/include/asm/poll.h b/arch/ia64/include/uapi/asm/poll.h index c98509d3149..c98509d3149 100644 --- a/arch/ia64/include/asm/poll.h +++ b/arch/ia64/include/uapi/asm/poll.h diff --git a/arch/ia64/include/uapi/asm/posix_types.h b/arch/ia64/include/uapi/asm/posix_types.h new file mode 100644 index 00000000000..99ee1d6510c --- /dev/null +++ b/arch/ia64/include/uapi/asm/posix_types.h @@ -0,0 +1,8 @@ +#ifndef _ASM_IA64_POSIX_TYPES_H +#define _ASM_IA64_POSIX_TYPES_H + +typedef unsigned long	__kernel_sigset_t;	/* at least 32 bits */ + +#include <asm-generic/posix_types.h> + +#endif /* _ASM_IA64_POSIX_TYPES_H */ diff --git a/arch/ia64/include/uapi/asm/ptrace.h b/arch/ia64/include/uapi/asm/ptrace.h new file mode 100644 index 00000000000..0a02f634e12 --- /dev/null +++ b/arch/ia64/include/uapi/asm/ptrace.h @@ -0,0 +1,247 @@ +/* + * Copyright (C) 1998-2004 Hewlett-Packard Co + *	David Mosberger-Tang <davidm@hpl.hp.com> + *	Stephane Eranian <eranian@hpl.hp.com> + * Copyright (C) 2003 Intel Co + *	Suresh Siddha <suresh.b.siddha@intel.com> + *	Fenghua Yu <fenghua.yu@intel.com> + *	Arun Sharma <arun.sharma@intel.com> + * + * 12/07/98	S. Eranian	added pt_regs & switch_stack + * 12/21/98	D. Mosberger	updated to match latest code + *  6/17/99	D. Mosberger	added second unat member to "struct switch_stack" + * + */ +#ifndef _UAPI_ASM_IA64_PTRACE_H +#define _UAPI_ASM_IA64_PTRACE_H + +/* + * When a user process is blocked, its state looks as follows: + * + *            +----------------------+	-------	IA64_STK_OFFSET + *     	      |			     |	 ^ + *            | struct pt_regs       |	 | + *	      |			     |	 | + *            +----------------------+	 | + *	      |			     |	 | + *     	      |	   memory stack	     |	 | + *	      |	(growing downwards)  |	 | + *	      //.....................//	 | + *					 | + *	      //.....................//	 | + *	      |			     |	 | + *            +----------------------+	 | + *            | struct switch_stack  |	 | + *	      |			     |	 | + *	      +----------------------+	 | + *	      |			     |	 | + *	      //.....................//	 | + *					 | + *	      //.....................//	 | + *	      |			     |	 | + *	      |	 register stack	     |	 | + *	      |	(growing upwards)    |	 | + *            |			     |	 | + *	      +----------------------+	 |  ---	IA64_RBS_OFFSET + *            |  struct thread_info  |	 |  ^ + *	      +----------------------+	 |  | + *	      |			     |	 |  | + *            |  struct task_struct  |	 |  | + * current -> |			     |   |  | + *	      +----------------------+ ------- + * + * Note that ar.ec is not saved explicitly in pt_reg or switch_stack. + * This is because ar.ec is saved as part of ar.pfs. + */ + + +#include <asm/fpu.h> + + +#ifndef __ASSEMBLY__ + +/* + * This struct defines the way the registers are saved on system + * calls. + * + * We don't save all floating point register because the kernel + * is compiled to use only a very small subset, so the other are + * untouched. + * + * THIS STRUCTURE MUST BE A MULTIPLE 16-BYTE IN SIZE + * (because the memory stack pointer MUST ALWAYS be aligned this way) + * + */ +struct pt_regs { +	/* The following registers are saved by SAVE_MIN: */ +	unsigned long b6;		/* scratch */ +	unsigned long b7;		/* scratch */ + +	unsigned long ar_csd;           /* used by cmp8xchg16 (scratch) */ +	unsigned long ar_ssd;           /* reserved for future use (scratch) */ + +	unsigned long r8;		/* scratch (return value register 0) */ +	unsigned long r9;		/* scratch (return value register 1) */ +	unsigned long r10;		/* scratch (return value register 2) */ +	unsigned long r11;		/* scratch (return value register 3) */ + +	unsigned long cr_ipsr;		/* interrupted task's psr */ +	unsigned long cr_iip;		/* interrupted task's instruction pointer */ +	/* +	 * interrupted task's function state; if bit 63 is cleared, it +	 * contains syscall's ar.pfs.pfm: +	 */ +	unsigned long cr_ifs; + +	unsigned long ar_unat;		/* interrupted task's NaT register (preserved) */ +	unsigned long ar_pfs;		/* prev function state  */ +	unsigned long ar_rsc;		/* RSE configuration */ +	/* The following two are valid only if cr_ipsr.cpl > 0 || ti->flags & _TIF_MCA_INIT */ +	unsigned long ar_rnat;		/* RSE NaT */ +	unsigned long ar_bspstore;	/* RSE bspstore */ + +	unsigned long pr;		/* 64 predicate registers (1 bit each) */ +	unsigned long b0;		/* return pointer (bp) */ +	unsigned long loadrs;		/* size of dirty partition << 16 */ + +	unsigned long r1;		/* the gp pointer */ +	unsigned long r12;		/* interrupted task's memory stack pointer */ +	unsigned long r13;		/* thread pointer */ + +	unsigned long ar_fpsr;		/* floating point status (preserved) */ +	unsigned long r15;		/* scratch */ + +	/* The remaining registers are NOT saved for system calls.  */ + +	unsigned long r14;		/* scratch */ +	unsigned long r2;		/* scratch */ +	unsigned long r3;		/* scratch */ + +	/* The following registers are saved by SAVE_REST: */ +	unsigned long r16;		/* scratch */ +	unsigned long r17;		/* scratch */ +	unsigned long r18;		/* scratch */ +	unsigned long r19;		/* scratch */ +	unsigned long r20;		/* scratch */ +	unsigned long r21;		/* scratch */ +	unsigned long r22;		/* scratch */ +	unsigned long r23;		/* scratch */ +	unsigned long r24;		/* scratch */ +	unsigned long r25;		/* scratch */ +	unsigned long r26;		/* scratch */ +	unsigned long r27;		/* scratch */ +	unsigned long r28;		/* scratch */ +	unsigned long r29;		/* scratch */ +	unsigned long r30;		/* scratch */ +	unsigned long r31;		/* scratch */ + +	unsigned long ar_ccv;		/* compare/exchange value (scratch) */ + +	/* +	 * Floating point registers that the kernel considers scratch: +	 */ +	struct ia64_fpreg f6;		/* scratch */ +	struct ia64_fpreg f7;		/* scratch */ +	struct ia64_fpreg f8;		/* scratch */ +	struct ia64_fpreg f9;		/* scratch */ +	struct ia64_fpreg f10;		/* scratch */ +	struct ia64_fpreg f11;		/* scratch */ +}; + +/* + * This structure contains the addition registers that need to + * preserved across a context switch.  This generally consists of + * "preserved" registers. + */ +struct switch_stack { +	unsigned long caller_unat;	/* user NaT collection register (preserved) */ +	unsigned long ar_fpsr;		/* floating-point status register */ + +	struct ia64_fpreg f2;		/* preserved */ +	struct ia64_fpreg f3;		/* preserved */ +	struct ia64_fpreg f4;		/* preserved */ +	struct ia64_fpreg f5;		/* preserved */ + +	struct ia64_fpreg f12;		/* scratch, but untouched by kernel */ +	struct ia64_fpreg f13;		/* scratch, but untouched by kernel */ +	struct ia64_fpreg f14;		/* scratch, but untouched by kernel */ +	struct ia64_fpreg f15;		/* scratch, but untouched by kernel */ +	struct ia64_fpreg f16;		/* preserved */ +	struct ia64_fpreg f17;		/* preserved */ +	struct ia64_fpreg f18;		/* preserved */ +	struct ia64_fpreg f19;		/* preserved */ +	struct ia64_fpreg f20;		/* preserved */ +	struct ia64_fpreg f21;		/* preserved */ +	struct ia64_fpreg f22;		/* preserved */ +	struct ia64_fpreg f23;		/* preserved */ +	struct ia64_fpreg f24;		/* preserved */ +	struct ia64_fpreg f25;		/* preserved */ +	struct ia64_fpreg f26;		/* preserved */ +	struct ia64_fpreg f27;		/* preserved */ +	struct ia64_fpreg f28;		/* preserved */ +	struct ia64_fpreg f29;		/* preserved */ +	struct ia64_fpreg f30;		/* preserved */ +	struct ia64_fpreg f31;		/* preserved */ + +	unsigned long r4;		/* preserved */ +	unsigned long r5;		/* preserved */ +	unsigned long r6;		/* preserved */ +	unsigned long r7;		/* preserved */ + +	unsigned long b0;		/* so we can force a direct return in copy_thread */ +	unsigned long b1; +	unsigned long b2; +	unsigned long b3; +	unsigned long b4; +	unsigned long b5; + +	unsigned long ar_pfs;		/* previous function state */ +	unsigned long ar_lc;		/* loop counter (preserved) */ +	unsigned long ar_unat;		/* NaT bits for r4-r7 */ +	unsigned long ar_rnat;		/* RSE NaT collection register */ +	unsigned long ar_bspstore;	/* RSE dirty base (preserved) */ +	unsigned long pr;		/* 64 predicate registers (1 bit each) */ +}; + + +/* pt_all_user_regs is used for PTRACE_GETREGS PTRACE_SETREGS */ +struct pt_all_user_regs { +	unsigned long nat; +	unsigned long cr_iip; +	unsigned long cfm; +	unsigned long cr_ipsr; +	unsigned long pr; + +	unsigned long gr[32]; +	unsigned long br[8]; +	unsigned long ar[128]; +	struct ia64_fpreg fr[128]; +}; + +#endif /* !__ASSEMBLY__ */ + +/* indices to application-registers array in pt_all_user_regs */ +#define PT_AUR_RSC	16 +#define PT_AUR_BSP	17 +#define PT_AUR_BSPSTORE	18 +#define PT_AUR_RNAT	19 +#define PT_AUR_CCV	32 +#define PT_AUR_UNAT	36 +#define PT_AUR_FPSR	40 +#define PT_AUR_PFS	64 +#define PT_AUR_LC	65 +#define PT_AUR_EC	66 + +/* + * The numbers chosen here are somewhat arbitrary but absolutely MUST + * not overlap with any of the number assigned in <linux/ptrace.h>. + */ +#define PTRACE_SINGLEBLOCK	12	/* resume execution until next branch */ +#define PTRACE_OLD_GETSIGINFO	13	/* (replaced by PTRACE_GETSIGINFO in <linux/ptrace.h>)  */ +#define PTRACE_OLD_SETSIGINFO	14	/* (replaced by PTRACE_SETSIGINFO in <linux/ptrace.h>)  */ +#define PTRACE_GETREGS		18	/* get all registers (pt_all_user_regs) in one shot */ +#define PTRACE_SETREGS		19	/* set all registers (pt_all_user_regs) in one shot */ + +#define PTRACE_OLDSETOPTIONS	21 + +#endif /* _UAPI_ASM_IA64_PTRACE_H */ diff --git a/arch/ia64/include/asm/ptrace_offsets.h b/arch/ia64/include/uapi/asm/ptrace_offsets.h index b712773c759..b712773c759 100644 --- a/arch/ia64/include/asm/ptrace_offsets.h +++ b/arch/ia64/include/uapi/asm/ptrace_offsets.h diff --git a/arch/ia64/include/asm/resource.h b/arch/ia64/include/uapi/asm/resource.h index ba2272a87fc..ba2272a87fc 100644 --- a/arch/ia64/include/asm/resource.h +++ b/arch/ia64/include/uapi/asm/resource.h diff --git a/arch/ia64/include/asm/rse.h b/arch/ia64/include/uapi/asm/rse.h index 02830a3b019..02830a3b019 100644 --- a/arch/ia64/include/asm/rse.h +++ b/arch/ia64/include/uapi/asm/rse.h diff --git a/arch/ia64/include/asm/sembuf.h b/arch/ia64/include/uapi/asm/sembuf.h index 1340fbc04d3..1340fbc04d3 100644 --- a/arch/ia64/include/asm/sembuf.h +++ b/arch/ia64/include/uapi/asm/sembuf.h diff --git a/arch/ia64/include/uapi/asm/setup.h b/arch/ia64/include/uapi/asm/setup.h new file mode 100644 index 00000000000..8d56458310b --- /dev/null +++ b/arch/ia64/include/uapi/asm/setup.h @@ -0,0 +1,24 @@ +#ifndef __IA64_SETUP_H +#define __IA64_SETUP_H + +#define COMMAND_LINE_SIZE	2048 + +extern struct ia64_boot_param { +	__u64 command_line;		/* physical address of command line arguments */ +	__u64 efi_systab;		/* physical address of EFI system table */ +	__u64 efi_memmap;		/* physical address of EFI memory map */ +	__u64 efi_memmap_size;		/* size of EFI memory map */ +	__u64 efi_memdesc_size;		/* size of an EFI memory map descriptor */ +	__u32 efi_memdesc_version;	/* memory descriptor version */ +	struct { +		__u16 num_cols;	/* number of columns on console output device */ +		__u16 num_rows;	/* number of rows on console output device */ +		__u16 orig_x;	/* cursor's x position */ +		__u16 orig_y;	/* cursor's y position */ +	} console_info; +	__u64 fpswa;		/* physical address of the fpswa interface */ +	__u64 initrd_start; +	__u64 initrd_size; +} *ia64_boot_param; + +#endif diff --git a/arch/ia64/include/asm/shmbuf.h b/arch/ia64/include/uapi/asm/shmbuf.h index 585002a77ac..585002a77ac 100644 --- a/arch/ia64/include/asm/shmbuf.h +++ b/arch/ia64/include/uapi/asm/shmbuf.h diff --git a/arch/ia64/include/asm/sigcontext.h b/arch/ia64/include/uapi/asm/sigcontext.h index 57ff777bcc4..57ff777bcc4 100644 --- a/arch/ia64/include/asm/sigcontext.h +++ b/arch/ia64/include/uapi/asm/sigcontext.h diff --git a/arch/ia64/include/uapi/asm/siginfo.h b/arch/ia64/include/uapi/asm/siginfo.h new file mode 100644 index 00000000000..4ea6225196b --- /dev/null +++ b/arch/ia64/include/uapi/asm/siginfo.h @@ -0,0 +1,121 @@ +/* + * Based on <asm-i386/siginfo.h>. + * + * Modified 1998-2002 + *	David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co + */ +#ifndef _UAPI_ASM_IA64_SIGINFO_H +#define _UAPI_ASM_IA64_SIGINFO_H + + +#define __ARCH_SI_PREAMBLE_SIZE	(4 * sizeof(int)) + +#define HAVE_ARCH_SIGINFO_T +#define HAVE_ARCH_COPY_SIGINFO +#define HAVE_ARCH_COPY_SIGINFO_TO_USER + +#include <asm-generic/siginfo.h> + +typedef struct siginfo { +	int si_signo; +	int si_errno; +	int si_code; +	int __pad0; + +	union { +		int _pad[SI_PAD_SIZE]; + +		/* kill() */ +		struct { +			pid_t _pid;		/* sender's pid */ +			uid_t _uid;		/* sender's uid */ +		} _kill; + +		/* POSIX.1b timers */ +		struct { +			timer_t _tid;		/* timer id */ +			int _overrun;		/* overrun count */ +			char _pad[sizeof(__ARCH_SI_UID_T) - sizeof(int)]; +			sigval_t _sigval;	/* must overlay ._rt._sigval! */ +			int _sys_private;	/* not to be passed to user */ +		} _timer; + +		/* POSIX.1b signals */ +		struct { +			pid_t _pid;		/* sender's pid */ +			uid_t _uid;		/* sender's uid */ +			sigval_t _sigval; +		} _rt; + +		/* SIGCHLD */ +		struct { +			pid_t _pid;		/* which child */ +			uid_t _uid;		/* sender's uid */ +			int _status;		/* exit code */ +			clock_t _utime; +			clock_t _stime; +		} _sigchld; + +		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ +		struct { +			void __user *_addr;	/* faulting insn/memory ref. */ +			int _imm;		/* immediate value for "break" */ +			unsigned int _flags;	/* see below */ +			unsigned long _isr;	/* isr */ +			short _addr_lsb;	/* lsb of faulting address */ +		} _sigfault; + +		/* SIGPOLL */ +		struct { +			long _band;	/* POLL_IN, POLL_OUT, POLL_MSG (XPG requires a "long") */ +			int _fd; +		} _sigpoll; +	} _sifields; +} siginfo_t; + +#define si_imm		_sifields._sigfault._imm	/* as per UNIX SysV ABI spec */ +#define si_flags	_sifields._sigfault._flags +/* + * si_isr is valid for SIGILL, SIGFPE, SIGSEGV, SIGBUS, and SIGTRAP provided that + * si_code is non-zero and __ISR_VALID is set in si_flags. + */ +#define si_isr		_sifields._sigfault._isr + +/* + * Flag values for si_flags: + */ +#define __ISR_VALID_BIT	0 +#define __ISR_VALID	(1 << __ISR_VALID_BIT) + +/* + * SIGILL si_codes + */ +#define ILL_BADIADDR	(__SI_FAULT|9)	/* unimplemented instruction address */ +#define __ILL_BREAK	(__SI_FAULT|10)	/* illegal break */ +#define __ILL_BNDMOD	(__SI_FAULT|11)	/* bundle-update (modification) in progress */ +#undef NSIGILL +#define NSIGILL		11 + +/* + * SIGFPE si_codes + */ +#define __FPE_DECOVF	(__SI_FAULT|9)	/* decimal overflow */ +#define __FPE_DECDIV	(__SI_FAULT|10)	/* decimal division by zero */ +#define __FPE_DECERR	(__SI_FAULT|11)	/* packed decimal error */ +#define __FPE_INVASC	(__SI_FAULT|12)	/* invalid ASCII digit */ +#define __FPE_INVDEC	(__SI_FAULT|13)	/* invalid decimal digit */ +#undef NSIGFPE +#define NSIGFPE		13 + +/* + * SIGSEGV si_codes + */ +#define __SEGV_PSTKOVF	(__SI_FAULT|3)	/* paragraph stack overflow */ +#undef NSIGSEGV +#define NSIGSEGV	3 + +#undef NSIGTRAP +#define NSIGTRAP	4 + + +#endif /* _UAPI_ASM_IA64_SIGINFO_H */ diff --git a/arch/ia64/include/uapi/asm/signal.h b/arch/ia64/include/uapi/asm/signal.h new file mode 100644 index 00000000000..c0ea2855e96 --- /dev/null +++ b/arch/ia64/include/uapi/asm/signal.h @@ -0,0 +1,121 @@ +/* + * Modified 1998-2001, 2003 + *	David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co + * + * Unfortunately, this file is being included by bits/signal.h in + * glibc-2.x.  Hence the #ifdef __KERNEL__ ugliness. + */ +#ifndef _UAPI_ASM_IA64_SIGNAL_H +#define _UAPI_ASM_IA64_SIGNAL_H + + +#define SIGHUP		 1 +#define SIGINT		 2 +#define SIGQUIT		 3 +#define SIGILL		 4 +#define SIGTRAP		 5 +#define SIGABRT		 6 +#define SIGIOT		 6 +#define SIGBUS		 7 +#define SIGFPE		 8 +#define SIGKILL		 9 +#define SIGUSR1		10 +#define SIGSEGV		11 +#define SIGUSR2		12 +#define SIGPIPE		13 +#define SIGALRM		14 +#define SIGTERM		15 +#define SIGSTKFLT	16 +#define SIGCHLD		17 +#define SIGCONT		18 +#define SIGSTOP		19 +#define SIGTSTP		20 +#define SIGTTIN		21 +#define SIGTTOU		22 +#define SIGURG		23 +#define SIGXCPU		24 +#define SIGXFSZ		25 +#define SIGVTALRM	26 +#define SIGPROF		27 +#define SIGWINCH	28 +#define SIGIO		29 +#define SIGPOLL		SIGIO +/* +#define SIGLOST		29 +*/ +#define SIGPWR		30 +#define SIGSYS		31 +/* signal 31 is no longer "unused", but the SIGUNUSED macro remains for backwards compatibility */ +#define	SIGUNUSED	31 + +/* These should not be considered constants from userland.  */ +#define SIGRTMIN	32 +#define SIGRTMAX	_NSIG + +/* + * SA_FLAGS values: + * + * SA_ONSTACK indicates that a registered stack_t will be used. + * SA_RESTART flag to get restarting signals (which were the default long ago) + * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. + * SA_RESETHAND clears the handler when the signal is delivered. + * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. + * SA_NODEFER prevents the current signal from being masked in the handler. + * + * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single + * Unix names RESETHAND and NODEFER respectively. + */ +#define SA_NOCLDSTOP	0x00000001 +#define SA_NOCLDWAIT	0x00000002 +#define SA_SIGINFO	0x00000004 +#define SA_ONSTACK	0x08000000 +#define SA_RESTART	0x10000000 +#define SA_NODEFER	0x40000000 +#define SA_RESETHAND	0x80000000 + +#define SA_NOMASK	SA_NODEFER +#define SA_ONESHOT	SA_RESETHAND + +#define SA_RESTORER	0x04000000 + +/* + * The minimum stack size needs to be fairly large because we want to + * be sure that an app compiled for today's CPUs will continue to run + * on all future CPU models.  The CPU model matters because the signal + * frame needs to have space for the complete machine state, including + * all physical stacked registers.  The number of physical stacked + * registers is CPU model dependent, but given that the width of + * ar.rsc.loadrs is 14 bits, we can assume that they'll never take up + * more than 16KB of space. + */ +#if 1 +  /* +   * This is a stupid typo: the value was _meant_ to be 131072 (0x20000), but I typed it +   * in wrong. ;-(  To preserve backwards compatibility, we leave the kernel at the +   * incorrect value and fix libc only. +   */ +# define MINSIGSTKSZ	131027	/* min. stack size for sigaltstack() */ +#else +# define MINSIGSTKSZ	131072	/* min. stack size for sigaltstack() */ +#endif +#define SIGSTKSZ	262144	/* default stack size for sigaltstack() */ + + +#include <asm-generic/signal-defs.h> + +# ifndef __ASSEMBLY__ + +#  include <linux/types.h> + +/* Avoid too many header ordering problems.  */ +struct siginfo; + +typedef struct sigaltstack { +	void __user *ss_sp; +	int ss_flags; +	size_t ss_size; +} stack_t; + + +# endif /* !__ASSEMBLY__ */ +#endif /* _UAPI_ASM_IA64_SIGNAL_H */ diff --git a/arch/ia64/include/asm/socket.h b/arch/ia64/include/uapi/asm/socket.h index 51427eaa51b..a1b49bac795 100644 --- a/arch/ia64/include/asm/socket.h +++ b/arch/ia64/include/uapi/asm/socket.h @@ -31,7 +31,7 @@  #define SO_PRIORITY	12  #define SO_LINGER	13  #define SO_BSDCOMPAT	14 -/* To add :#define SO_REUSEPORT 15 */ +#define SO_REUSEPORT	15  #define SO_PASSCRED	16  #define SO_PEERCRED	17  #define SO_RCVLOWAT	18 @@ -49,6 +49,7 @@  /* Socket filtering */  #define SO_ATTACH_FILTER	26  #define SO_DETACH_FILTER	27 +#define SO_GET_FILTER		SO_ATTACH_FILTER  #define SO_PEERNAME		28  #define SO_TIMESTAMP		29 @@ -71,4 +72,21 @@  #define SO_RXQ_OVFL             40 +#define SO_WIFI_STATUS		41 +#define SCM_WIFI_STATUS		SO_WIFI_STATUS +#define SO_PEEK_OFF		42 + +/* Instruct lower device to use last 4-bytes of skb data as FCS */ +#define SO_NOFCS		43 + +#define SO_LOCK_FILTER		44 + +#define SO_SELECT_ERR_QUEUE	45 + +#define SO_BUSY_POLL		46 + +#define SO_MAX_PACING_RATE	47 + +#define SO_BPF_EXTENSIONS	48 +  #endif /* _ASM_IA64_SOCKET_H */ diff --git a/arch/ia64/include/asm/sockios.h b/arch/ia64/include/uapi/asm/sockios.h index 15c92468ad3..15c92468ad3 100644 --- a/arch/ia64/include/asm/sockios.h +++ b/arch/ia64/include/uapi/asm/sockios.h diff --git a/arch/ia64/include/asm/stat.h b/arch/ia64/include/uapi/asm/stat.h index 367bb90cdff..367bb90cdff 100644 --- a/arch/ia64/include/asm/stat.h +++ b/arch/ia64/include/uapi/asm/stat.h diff --git a/arch/ia64/include/asm/statfs.h b/arch/ia64/include/uapi/asm/statfs.h index 1e589669de5..1e589669de5 100644 --- a/arch/ia64/include/asm/statfs.h +++ b/arch/ia64/include/uapi/asm/statfs.h diff --git a/arch/ia64/include/asm/swab.h b/arch/ia64/include/uapi/asm/swab.h index c89a8cb5d8a..c89a8cb5d8a 100644 --- a/arch/ia64/include/asm/swab.h +++ b/arch/ia64/include/uapi/asm/swab.h diff --git a/arch/ia64/include/asm/termbits.h b/arch/ia64/include/uapi/asm/termbits.h index c009b94e58d..c009b94e58d 100644 --- a/arch/ia64/include/asm/termbits.h +++ b/arch/ia64/include/uapi/asm/termbits.h diff --git a/arch/ia64/include/uapi/asm/termios.h b/arch/ia64/include/uapi/asm/termios.h new file mode 100644 index 00000000000..d59b48c307f --- /dev/null +++ b/arch/ia64/include/uapi/asm/termios.h @@ -0,0 +1,50 @@ +/* + * Modified 1999 + *	David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co + * + * 99/01/28	Added N_IRDA and N_SMSBLOCK + */ +#ifndef _UAPI_ASM_IA64_TERMIOS_H +#define _UAPI_ASM_IA64_TERMIOS_H + + +#include <asm/termbits.h> +#include <asm/ioctls.h> + +struct winsize { +	unsigned short ws_row; +	unsigned short ws_col; +	unsigned short ws_xpixel; +	unsigned short ws_ypixel; +}; + +#define NCC 8 +struct termio { +	unsigned short c_iflag;		/* input mode flags */ +	unsigned short c_oflag;		/* output mode flags */ +	unsigned short c_cflag;		/* control mode flags */ +	unsigned short c_lflag;		/* local mode flags */ +	unsigned char c_line;		/* line discipline */ +	unsigned char c_cc[NCC];	/* control characters */ +}; + +/* modem lines */ +#define TIOCM_LE	0x001 +#define TIOCM_DTR	0x002 +#define TIOCM_RTS	0x004 +#define TIOCM_ST	0x008 +#define TIOCM_SR	0x010 +#define TIOCM_CTS	0x020 +#define TIOCM_CAR	0x040 +#define TIOCM_RNG	0x080 +#define TIOCM_DSR	0x100 +#define TIOCM_CD	TIOCM_CAR +#define TIOCM_RI	TIOCM_RNG +#define TIOCM_OUT1	0x2000 +#define TIOCM_OUT2	0x4000 +#define TIOCM_LOOP	0x8000 + +/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ + + +#endif /* _UAPI_ASM_IA64_TERMIOS_H */ diff --git a/arch/ia64/include/uapi/asm/types.h b/arch/ia64/include/uapi/asm/types.h new file mode 100644 index 00000000000..321193b05ee --- /dev/null +++ b/arch/ia64/include/uapi/asm/types.h @@ -0,0 +1,31 @@ +/* + * This file is never included by application software unless explicitly + * requested (e.g., via linux/types.h) in which case the application is + * Linux specific so (user-) name space pollution is not a major issue. + * However, for interoperability, libraries still need to be careful to + * avoid naming clashes. + * + * Based on <asm-alpha/types.h>. + * + * Modified 1998-2000, 2002 + *	David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co + */ +#ifndef _UAPI_ASM_IA64_TYPES_H +#define _UAPI_ASM_IA64_TYPES_H + + +#ifndef __KERNEL__ +#include <asm-generic/int-l64.h> +#endif + +#ifdef __ASSEMBLY__ +# define __IA64_UL(x)		(x) +# define __IA64_UL_CONST(x)	x + +#else +# define __IA64_UL(x)		((unsigned long)(x)) +# define __IA64_UL_CONST(x)	x##UL + +#endif /* !__ASSEMBLY__ */ + +#endif /* _UAPI_ASM_IA64_TYPES_H */ diff --git a/arch/ia64/include/asm/ucontext.h b/arch/ia64/include/uapi/asm/ucontext.h index bf573dc8ca6..bf573dc8ca6 100644 --- a/arch/ia64/include/asm/ucontext.h +++ b/arch/ia64/include/uapi/asm/ucontext.h diff --git a/arch/ia64/include/uapi/asm/unistd.h b/arch/ia64/include/uapi/asm/unistd.h new file mode 100644 index 00000000000..7de0a2d65da --- /dev/null +++ b/arch/ia64/include/uapi/asm/unistd.h @@ -0,0 +1,332 @@ +/* + * IA-64 Linux syscall numbers and inline-functions. + * + * Copyright (C) 1998-2005 Hewlett-Packard Co + *	David Mosberger-Tang <davidm@hpl.hp.com> + */ +#ifndef _UAPI_ASM_IA64_UNISTD_H +#define _UAPI_ASM_IA64_UNISTD_H + + +#include <asm/break.h> + +#define __BREAK_SYSCALL			__IA64_BREAK_SYSCALL + +#define __NR_ni_syscall			1024 +#define __NR_exit			1025 +#define __NR_read			1026 +#define __NR_write			1027 +#define __NR_open			1028 +#define __NR_close			1029 +#define __NR_creat			1030 +#define __NR_link			1031 +#define __NR_unlink			1032 +#define __NR_execve			1033 +#define __NR_chdir			1034 +#define __NR_fchdir			1035 +#define __NR_utimes			1036 +#define __NR_mknod			1037 +#define __NR_chmod			1038 +#define __NR_chown			1039 +#define __NR_lseek			1040 +#define __NR_getpid			1041 +#define __NR_getppid			1042 +#define __NR_mount			1043 +#define __NR_umount			1044 +#define __NR_setuid			1045 +#define __NR_getuid			1046 +#define __NR_geteuid			1047 +#define __NR_ptrace			1048 +#define __NR_access			1049 +#define __NR_sync			1050 +#define __NR_fsync			1051 +#define __NR_fdatasync			1052 +#define __NR_kill			1053 +#define __NR_rename			1054 +#define __NR_mkdir			1055 +#define __NR_rmdir			1056 +#define __NR_dup			1057 +#define __NR_pipe			1058 +#define __NR_times			1059 +#define __NR_brk			1060 +#define __NR_setgid			1061 +#define __NR_getgid			1062 +#define __NR_getegid			1063 +#define __NR_acct			1064 +#define __NR_ioctl			1065 +#define __NR_fcntl			1066 +#define __NR_umask			1067 +#define __NR_chroot			1068 +#define __NR_ustat			1069 +#define __NR_dup2			1070 +#define __NR_setreuid			1071 +#define __NR_setregid			1072 +#define __NR_getresuid			1073 +#define __NR_setresuid			1074 +#define __NR_getresgid			1075 +#define __NR_setresgid			1076 +#define __NR_getgroups			1077 +#define __NR_setgroups			1078 +#define __NR_getpgid			1079 +#define __NR_setpgid			1080 +#define __NR_setsid			1081 +#define __NR_getsid			1082 +#define __NR_sethostname		1083 +#define __NR_setrlimit			1084 +#define __NR_getrlimit			1085 +#define __NR_getrusage			1086 +#define __NR_gettimeofday		1087 +#define __NR_settimeofday		1088 +#define __NR_select			1089 +#define __NR_poll			1090 +#define __NR_symlink			1091 +#define __NR_readlink			1092 +#define __NR_uselib			1093 +#define __NR_swapon			1094 +#define __NR_swapoff			1095 +#define __NR_reboot			1096 +#define __NR_truncate			1097 +#define __NR_ftruncate			1098 +#define __NR_fchmod			1099 +#define __NR_fchown			1100 +#define __NR_getpriority		1101 +#define __NR_setpriority		1102 +#define __NR_statfs			1103 +#define __NR_fstatfs			1104 +#define __NR_gettid			1105 +#define __NR_semget			1106 +#define __NR_semop			1107 +#define __NR_semctl			1108 +#define __NR_msgget			1109 +#define __NR_msgsnd			1110 +#define __NR_msgrcv			1111 +#define __NR_msgctl			1112 +#define __NR_shmget			1113 +#define __NR_shmat			1114 +#define __NR_shmdt			1115 +#define __NR_shmctl			1116 +/* also known as klogctl() in GNU libc: */ +#define __NR_syslog			1117 +#define __NR_setitimer			1118 +#define __NR_getitimer			1119 +/* 1120 was __NR_old_stat */ +/* 1121 was __NR_old_lstat */ +/* 1122 was __NR_old_fstat */ +#define __NR_vhangup			1123 +#define __NR_lchown			1124 +#define __NR_remap_file_pages		1125 +#define __NR_wait4			1126 +#define __NR_sysinfo			1127 +#define __NR_clone			1128 +#define __NR_setdomainname		1129 +#define __NR_uname			1130 +#define __NR_adjtimex			1131 +/* 1132 was __NR_create_module */ +#define __NR_init_module		1133 +#define __NR_delete_module		1134 +/* 1135 was __NR_get_kernel_syms */ +/* 1136 was __NR_query_module */ +#define __NR_quotactl			1137 +#define __NR_bdflush			1138 +#define __NR_sysfs			1139 +#define __NR_personality		1140 +#define __NR_afs_syscall		1141 +#define __NR_setfsuid			1142 +#define __NR_setfsgid			1143 +#define __NR_getdents			1144 +#define __NR_flock			1145 +#define __NR_readv			1146 +#define __NR_writev			1147 +#define __NR_pread64			1148 +#define __NR_pwrite64			1149 +#define __NR__sysctl			1150 +#define __NR_mmap			1151 +#define __NR_munmap			1152 +#define __NR_mlock			1153 +#define __NR_mlockall			1154 +#define __NR_mprotect			1155 +#define __NR_mremap			1156 +#define __NR_msync			1157 +#define __NR_munlock			1158 +#define __NR_munlockall			1159 +#define __NR_sched_getparam		1160 +#define __NR_sched_setparam		1161 +#define __NR_sched_getscheduler		1162 +#define __NR_sched_setscheduler		1163 +#define __NR_sched_yield		1164 +#define __NR_sched_get_priority_max	1165 +#define __NR_sched_get_priority_min	1166 +#define __NR_sched_rr_get_interval	1167 +#define __NR_nanosleep			1168 +#define __NR_nfsservctl			1169 +#define __NR_prctl			1170 +/* 1171 is reserved for backwards compatibility with old __NR_getpagesize */ +#define __NR_mmap2			1172 +#define __NR_pciconfig_read		1173 +#define __NR_pciconfig_write		1174 +#define __NR_perfmonctl			1175 +#define __NR_sigaltstack		1176 +#define __NR_rt_sigaction		1177 +#define __NR_rt_sigpending		1178 +#define __NR_rt_sigprocmask		1179 +#define __NR_rt_sigqueueinfo		1180 +#define __NR_rt_sigreturn		1181 +#define __NR_rt_sigsuspend		1182 +#define __NR_rt_sigtimedwait		1183 +#define __NR_getcwd			1184 +#define __NR_capget			1185 +#define __NR_capset			1186 +#define __NR_sendfile			1187 +#define __NR_getpmsg			1188 +#define __NR_putpmsg			1189 +#define __NR_socket			1190 +#define __NR_bind			1191 +#define __NR_connect			1192 +#define __NR_listen			1193 +#define __NR_accept			1194 +#define __NR_getsockname		1195 +#define __NR_getpeername		1196 +#define __NR_socketpair			1197 +#define __NR_send			1198 +#define __NR_sendto			1199 +#define __NR_recv			1200 +#define __NR_recvfrom			1201 +#define __NR_shutdown			1202 +#define __NR_setsockopt			1203 +#define __NR_getsockopt			1204 +#define __NR_sendmsg			1205 +#define __NR_recvmsg			1206 +#define __NR_pivot_root			1207 +#define __NR_mincore			1208 +#define __NR_madvise			1209 +#define __NR_stat			1210 +#define __NR_lstat			1211 +#define __NR_fstat			1212 +#define __NR_clone2			1213 +#define __NR_getdents64			1214 +#define __NR_getunwind			1215 +#define __NR_readahead			1216 +#define __NR_setxattr			1217 +#define __NR_lsetxattr			1218 +#define __NR_fsetxattr			1219 +#define __NR_getxattr			1220 +#define __NR_lgetxattr			1221 +#define __NR_fgetxattr			1222 +#define __NR_listxattr			1223 +#define __NR_llistxattr			1224 +#define __NR_flistxattr			1225 +#define __NR_removexattr		1226 +#define __NR_lremovexattr		1227 +#define __NR_fremovexattr		1228 +#define __NR_tkill			1229 +#define __NR_futex			1230 +#define __NR_sched_setaffinity		1231 +#define __NR_sched_getaffinity		1232 +#define __NR_set_tid_address		1233 +#define __NR_fadvise64			1234 +#define __NR_tgkill			1235 +#define __NR_exit_group			1236 +#define __NR_lookup_dcookie		1237 +#define __NR_io_setup			1238 +#define __NR_io_destroy			1239 +#define __NR_io_getevents		1240 +#define __NR_io_submit			1241 +#define __NR_io_cancel			1242 +#define __NR_epoll_create		1243 +#define __NR_epoll_ctl			1244 +#define __NR_epoll_wait			1245 +#define __NR_restart_syscall		1246 +#define __NR_semtimedop			1247 +#define __NR_timer_create		1248 +#define __NR_timer_settime		1249 +#define __NR_timer_gettime		1250 +#define __NR_timer_getoverrun		1251 +#define __NR_timer_delete		1252 +#define __NR_clock_settime		1253 +#define __NR_clock_gettime		1254 +#define __NR_clock_getres		1255 +#define __NR_clock_nanosleep		1256 +#define __NR_fstatfs64			1257 +#define __NR_statfs64			1258 +#define __NR_mbind			1259 +#define __NR_get_mempolicy		1260 +#define __NR_set_mempolicy		1261 +#define __NR_mq_open			1262 +#define __NR_mq_unlink			1263 +#define __NR_mq_timedsend		1264 +#define __NR_mq_timedreceive		1265 +#define __NR_mq_notify			1266 +#define __NR_mq_getsetattr		1267 +#define __NR_kexec_load			1268 +#define __NR_vserver			1269 +#define __NR_waitid			1270 +#define __NR_add_key			1271 +#define __NR_request_key		1272 +#define __NR_keyctl			1273 +#define __NR_ioprio_set			1274 +#define __NR_ioprio_get			1275 +#define __NR_move_pages			1276 +#define __NR_inotify_init		1277 +#define __NR_inotify_add_watch		1278 +#define __NR_inotify_rm_watch		1279 +#define __NR_migrate_pages		1280 +#define __NR_openat			1281 +#define __NR_mkdirat			1282 +#define __NR_mknodat			1283 +#define __NR_fchownat			1284 +#define __NR_futimesat			1285 +#define __NR_newfstatat			1286 +#define __NR_unlinkat			1287 +#define __NR_renameat			1288 +#define __NR_linkat			1289 +#define __NR_symlinkat			1290 +#define __NR_readlinkat			1291 +#define __NR_fchmodat			1292 +#define __NR_faccessat			1293 +#define __NR_pselect6			1294 +#define __NR_ppoll			1295 +#define __NR_unshare			1296 +#define __NR_splice			1297 +#define __NR_set_robust_list		1298 +#define __NR_get_robust_list		1299 +#define __NR_sync_file_range		1300 +#define __NR_tee			1301 +#define __NR_vmsplice			1302 +#define __NR_fallocate			1303 +#define __NR_getcpu			1304 +#define __NR_epoll_pwait		1305 +#define __NR_utimensat			1306 +#define __NR_signalfd			1307 +#define __NR_timerfd			1308 +#define __NR_eventfd			1309 +#define __NR_timerfd_create		1310 +#define __NR_timerfd_settime		1311 +#define __NR_timerfd_gettime		1312 +#define __NR_signalfd4			1313 +#define __NR_eventfd2			1314 +#define __NR_epoll_create1		1315 +#define __NR_dup3			1316 +#define __NR_pipe2			1317 +#define __NR_inotify_init1		1318 +#define __NR_preadv			1319 +#define __NR_pwritev			1320 +#define __NR_rt_tgsigqueueinfo		1321 +#define __NR_recvmmsg			1322 +#define __NR_fanotify_init		1323 +#define __NR_fanotify_mark		1324 +#define __NR_prlimit64			1325 +#define __NR_name_to_handle_at		1326 +#define __NR_open_by_handle_at  	1327 +#define __NR_clock_adjtime		1328 +#define __NR_syncfs			1329 +#define __NR_setns			1330 +#define __NR_sendmmsg			1331 +#define __NR_process_vm_readv		1332 +#define __NR_process_vm_writev		1333 +#define __NR_accept4			1334 +#define __NR_finit_module		1335 +#define __NR_sched_setattr		1336 +#define __NR_sched_getattr		1337 +#define __NR_renameat2			1338 + +#endif /* _UAPI_ASM_IA64_UNISTD_H */ diff --git a/arch/ia64/include/uapi/asm/ustack.h b/arch/ia64/include/uapi/asm/ustack.h new file mode 100644 index 00000000000..1dfebc62269 --- /dev/null +++ b/arch/ia64/include/uapi/asm/ustack.h @@ -0,0 +1,12 @@ +#ifndef _UAPI_ASM_IA64_USTACK_H +#define _UAPI_ASM_IA64_USTACK_H + +/* + * Constants for the user stack size + */ + + +/* Make a default stack size of 2GiB */ +#define DEFAULT_USER_STACK_SIZE	(1UL << 31) + +#endif /* _UAPI_ASM_IA64_USTACK_H */ diff --git a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile index 395c2f216dd..20678a9ed11 100644 --- a/arch/ia64/kernel/Makefile +++ b/arch/ia64/kernel/Makefile @@ -23,7 +23,6 @@ obj-$(CONFIG_SMP)		+= smp.o smpboot.o  obj-$(CONFIG_NUMA)		+= numa.o  obj-$(CONFIG_PERFMON)		+= perfmon_default_smpl.o  obj-$(CONFIG_IA64_CYCLONE)	+= cyclone.o -obj-$(CONFIG_CPU_FREQ)		+= cpufreq/  obj-$(CONFIG_IA64_MCA_RECOVERY)	+= mca_recovery.o  obj-$(CONFIG_KPROBES)		+= kprobes.o jprobes.o  obj-$(CONFIG_DYNAMIC_FTRACE)	+= ftrace.o @@ -43,7 +42,7 @@ obj-$(CONFIG_IA64_ESI)		+= esi.o  ifneq ($(CONFIG_IA64_ESI),)  obj-y				+= esi_stub.o	# must be in kernel proper  endif -obj-$(CONFIG_DMAR)		+= pci-dma.o +obj-$(CONFIG_INTEL_IOMMU)	+= pci-dma.o  obj-$(CONFIG_SWIOTLB)		+= pci-swiotlb.o  obj-$(CONFIG_BINFMT_ELF)	+= elfcore.o diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index c6c90f39f4d..615ef81def4 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c @@ -50,19 +50,13 @@  #include <asm/iosapic.h>  #include <asm/machvec.h>  #include <asm/page.h> -#include <asm/system.h>  #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 ||  \ -		((struct acpi_subtable_header *)entry)->length < sizeof(*entry))  #define PREFIX			"ACPI: " -u32 acpi_rsdt_forced; +int acpi_lapic;  unsigned int acpi_cpei_override;  unsigned int acpi_cpei_phys_cpuid; @@ -88,7 +82,7 @@ acpi_get_sysname(void)  	struct acpi_table_rsdp *rsdp;  	struct acpi_table_xsdt *xsdt;  	struct acpi_table_header *hdr; -#ifdef CONFIG_DMAR +#ifdef CONFIG_INTEL_IOMMU  	u64 i, nentries;  #endif @@ -121,11 +115,9 @@ acpi_get_sysname(void)  			return "uv";  		else  			return "sn2"; -	} else if (xen_pv_domain() && !strcmp(hdr->oem_id, "XEN")) { -		return "xen";  	} -#ifdef CONFIG_DMAR +#ifdef CONFIG_INTEL_IOMMU  	/* Look for Intel IOMMU */  	nentries = (hdr->length - sizeof(*hdr)) /  			 sizeof(xsdt->table_offset_entry[0]); @@ -349,11 +341,11 @@ acpi_parse_int_src_ovr(struct acpi_subtable_header * header,  	iosapic_override_isa_irq(p->source_irq, p->global_irq,  				 ((p->inti_flags & ACPI_MADT_POLARITY_MASK) == -				  ACPI_MADT_POLARITY_ACTIVE_HIGH) ? -				 IOSAPIC_POL_HIGH : IOSAPIC_POL_LOW, +				  ACPI_MADT_POLARITY_ACTIVE_LOW) ? +				 IOSAPIC_POL_LOW : IOSAPIC_POL_HIGH,  				 ((p->inti_flags & ACPI_MADT_TRIGGER_MASK) == -				 ACPI_MADT_TRIGGER_EDGE) ? -				 IOSAPIC_EDGE : IOSAPIC_LEVEL); +				 ACPI_MADT_TRIGGER_LEVEL) ? +				 IOSAPIC_LEVEL : IOSAPIC_EDGE);  	return 0;  } @@ -423,28 +415,30 @@ static int __init acpi_parse_madt(struct acpi_table_header *table)  #define PXM_FLAG_LEN ((MAX_PXM_DOMAINS + 1)/32)  static int __initdata srat_num_cpus;	/* number of cpus */ -static u32 __devinitdata pxm_flag[PXM_FLAG_LEN]; +static u32 pxm_flag[PXM_FLAG_LEN];  #define pxm_bit_set(bit)	(set_bit(bit,(void *)pxm_flag))  #define pxm_bit_test(bit)	(test_bit(bit,(void *)pxm_flag))  static struct acpi_table_slit __initdata *slit_table;  cpumask_t early_cpu_possible_map = CPU_MASK_NONE; -static int get_processor_proximity_domain(struct acpi_srat_cpu_affinity *pa) +static int __init +get_processor_proximity_domain(struct acpi_srat_cpu_affinity *pa)  {  	int pxm;  	pxm = pa->proximity_domain_lo; -	if (ia64_platform_is("sn2")) +	if (ia64_platform_is("sn2") || acpi_srat_revision >= 2)  		pxm += pa->proximity_domain_hi[0] << 8;  	return pxm;  } -static int get_memory_proximity_domain(struct acpi_srat_mem_affinity *ma) +static int __init +get_memory_proximity_domain(struct acpi_srat_mem_affinity *ma)  {  	int pxm;  	pxm = ma->proximity_domain; -	if (!ia64_platform_is("sn2")) +	if (!ia64_platform_is("sn2") && acpi_srat_revision <= 1)  		pxm &= 0xff;  	return pxm; @@ -477,6 +471,12 @@ acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)  	if (!(pa->flags & ACPI_SRAT_CPU_ENABLED))  		return; +	if (srat_num_cpus >= ARRAY_SIZE(node_cpuid)) { +		printk_once(KERN_WARNING +			    "node_cpuid[%ld] is too small, may not be able to use all cpus\n", +			    ARRAY_SIZE(node_cpuid)); +		return; +	}  	pxm = get_processor_proximity_domain(pa);  	/* record this node in proximity bitmap */ @@ -490,7 +490,7 @@ acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)  	srat_num_cpus++;  } -void __init +int __init  acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)  {  	unsigned long paddr, size; @@ -505,7 +505,7 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)  	/* Ignore disabled entries */  	if (!(ma->flags & ACPI_SRAT_MEM_ENABLED)) -		return; +		return -1;  	/* record this node in proximity bitmap */  	pxm_bit_set(pxm); @@ -524,6 +524,7 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)  	p->size = size;  	p->nid = pxm;  	num_node_memblks++; +	return 0;  }  void __init acpi_numa_arch_fixup(void) @@ -625,6 +626,7 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int triggering, int polarity)  				      ACPI_EDGE_SENSITIVE) ? IOSAPIC_EDGE :  				     IOSAPIC_LEVEL);  } +EXPORT_SYMBOL_GPL(acpi_register_gsi);  void acpi_unregister_gsi(u32 gsi)  { @@ -636,6 +638,7 @@ void acpi_unregister_gsi(u32 gsi)  	iosapic_unregister_intr(gsi);  } +EXPORT_SYMBOL_GPL(acpi_unregister_gsi);  static int __init acpi_parse_fadt(struct acpi_table_header *table)  { @@ -674,6 +677,8 @@ int __init early_acpi_boot_init(void)  	if (ret < 1)  		printk(KERN_ERR PREFIX  		       "Error parsing MADT - no LAPIC entries\n"); +	else +		acpi_lapic = 1;  #ifdef CONFIG_SMP  	if (available_cpus == 0) { @@ -797,14 +802,9 @@ int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi)   *  ACPI based hotplug CPU support   */  #ifdef CONFIG_ACPI_HOTPLUG_CPU -static -int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) +static int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)  {  #ifdef CONFIG_ACPI_NUMA -	int pxm_id; -	int nid; - -	pxm_id = acpi_get_pxm(handle);  	/*  	 * We don't have cpu-only-node hotadd. But if the system equips  	 * SRAT table, pxm is already found and node is ready. @@ -812,11 +812,10 @@ int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)  	 * This code here is for the system which doesn't have full SRAT    	 * table for possible cpus.  	 */ -	nid = acpi_map_pxm_to_node(pxm_id);  	node_cpuid[cpu].phys_id = physid; -	node_cpuid[cpu].nid = nid; +	node_cpuid[cpu].nid = acpi_get_node(handle);  #endif -	return (0); +	return 0;  }  int additional_cpus __initdata = -1; @@ -832,11 +831,11 @@ static __init int setup_additional_cpus(char *s)  early_param("additional_cpus", setup_additional_cpus);  /* - * cpu_possible_map should be static, it cannot change as CPUs + * cpu_possible_mask should be static, it cannot change as CPUs   * are onlined, or offlined. The reason is per-cpu data-structures   * are allocated by some modules at init time, and dont expect to   * do this dynamically on cpu arrival/departure. - * cpu_present_map on the other hand can change dynamically. + * cpu_present_mask on the other hand can change dynamically.   * In case when cpu_hotplug is not compiled, then we resort to current   * behaviour, which is cpu_possible == cpu_present.   * - Ashok Raj @@ -872,40 +871,10 @@ __init void prefill_possible_map(void)  		set_cpu_possible(i, true);  } -int acpi_map_lsapic(acpi_handle handle, int *pcpu) +static int _acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu)  { -	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; -	union acpi_object *obj; -	struct acpi_madt_local_sapic *lsapic;  	cpumask_t tmp_map; -	int cpu, physid; - -	if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer))) -		return -EINVAL; - -	if (!buffer.length || !buffer.pointer) -		return -EINVAL; - -	obj = buffer.pointer; -	if (obj->type != ACPI_TYPE_BUFFER) -	{ -		kfree(buffer.pointer); -		return -EINVAL; -	} - -	lsapic = (struct acpi_madt_local_sapic *)obj->buffer.pointer; - -	if ((lsapic->header.type != ACPI_MADT_TYPE_LOCAL_SAPIC) || -	    (!(lsapic->lapic_flags & ACPI_MADT_ENABLED))) { -		kfree(buffer.pointer); -		return -EINVAL; -	} - -	physid = ((lsapic->id << 8) | (lsapic->eid)); - -	kfree(buffer.pointer); -	buffer.length = ACPI_ALLOCATE_BUFFER; -	buffer.pointer = NULL; +	int cpu;  	cpumask_complement(&tmp_map, cpu_present_mask);  	cpu = cpumask_first(&tmp_map); @@ -914,7 +883,7 @@ int acpi_map_lsapic(acpi_handle handle, int *pcpu)  	acpi_map_cpu2node(handle, cpu, physid); -	cpu_set(cpu, cpu_present_map); +	set_cpu_present(cpu, true);  	ia64_cpu_to_sapicid[cpu] = physid;  	acpi_processor_set_pdc(handle); @@ -923,12 +892,17 @@ int acpi_map_lsapic(acpi_handle handle, int *pcpu)  	return (0);  } +/* wrapper to silence section mismatch warning */ +int __ref acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu) +{ +	return _acpi_map_lsapic(handle, physid, pcpu); +}  EXPORT_SYMBOL(acpi_map_lsapic);  int acpi_unmap_lsapic(int cpu)  {  	ia64_cpu_to_sapicid[cpu] = -1; -	cpu_clear(cpu, cpu_present_map); +	set_cpu_present(cpu, false);  #ifdef CONFIG_ACPI_NUMA  	/* NUMA specific cleanup's */ @@ -941,14 +915,14 @@ EXPORT_SYMBOL(acpi_unmap_lsapic);  #endif				/* CONFIG_ACPI_HOTPLUG_CPU */  #ifdef CONFIG_ACPI_NUMA -static acpi_status __devinit -acpi_map_iosapic(acpi_handle handle, u32 depth, void *context, void **ret) +static acpi_status acpi_map_iosapic(acpi_handle handle, u32 depth, +				    void *context, void **ret)  {  	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };  	union acpi_object *obj;  	struct acpi_madt_io_sapic *iosapic;  	unsigned int gsi_base; -	int pxm, node; +	int node;  	/* Only care about objects w/ a method that returns the MADT */  	if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer))) @@ -975,17 +949,9 @@ acpi_map_iosapic(acpi_handle handle, u32 depth, void *context, void **ret)  	kfree(buffer.pointer); -	/* -	 * OK, it's an IOSAPIC MADT entry, look for a _PXM value to tell -	 * us which node to associate this with. -	 */ -	pxm = acpi_get_pxm(handle); -	if (pxm < 0) -		return AE_OK; - -	node = pxm_to_node(pxm); - -	if (node >= MAX_NUMNODES || !node_online(node) || +	/* OK, it's an IOSAPIC MADT entry; associate it with a node */ +	node = acpi_get_node(handle); +	if (node == NUMA_NO_NODE || !node_online(node) ||  	    cpumask_empty(cpumask_of_node(node)))  		return AE_OK; @@ -1028,18 +994,8 @@ int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base)  EXPORT_SYMBOL(acpi_unregister_ioapic);  /* - * acpi_save_state_mem() - save kernel state + * acpi_suspend_lowlevel() - save kernel state and suspend.   *   * TBD when when IA64 starts to support suspend...   */ -int acpi_save_state_mem(void) { return 0; }  - -/* - * acpi_restore_state() - */ -void acpi_restore_state_mem(void) {} - -/* - * do_suspend_lowlevel() - */ -void do_suspend_lowlevel(void) {} +int acpi_suspend_lowlevel(void) { return 0; } diff --git a/arch/ia64/kernel/asm-offsets.c b/arch/ia64/kernel/asm-offsets.c index af565016904..60ef83e6db7 100644 --- a/arch/ia64/kernel/asm-offsets.c +++ b/arch/ia64/kernel/asm-offsets.c @@ -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" @@ -41,7 +38,7 @@ void foo(void)  	DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));  	DEFINE(TI_CPU, offsetof(struct thread_info, cpu));  	DEFINE(TI_PRE_COUNT, offsetof(struct thread_info, preempt_count)); -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	DEFINE(TI_AC_STAMP, offsetof(struct thread_info, ac_stamp));  	DEFINE(TI_AC_LEAVE, offsetof(struct thread_info, ac_leave));  	DEFINE(TI_AC_STIME, offsetof(struct thread_info, ac_stime)); @@ -269,8 +266,8 @@ void foo(void)  	BLANK();  	/* used by fsys_gettimeofday in arch/ia64/kernel/fsys.S */ -	DEFINE(IA64_GTOD_LOCK_OFFSET, -		offsetof (struct fsyscall_gtod_data_t, lock)); +	DEFINE(IA64_GTOD_SEQ_OFFSET, +	       offsetof (struct fsyscall_gtod_data_t, seq));  	DEFINE(IA64_GTOD_WALL_TIME_OFFSET,  		offsetof (struct fsyscall_gtod_data_t, wall_time));  	DEFINE(IA64_GTOD_MONO_TIME_OFFSET, @@ -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 */  } diff --git a/arch/ia64/kernel/cpufreq/Kconfig b/arch/ia64/kernel/cpufreq/Kconfig deleted file mode 100644 index 2d9d5279b98..00000000000 --- a/arch/ia64/kernel/cpufreq/Kconfig +++ /dev/null @@ -1,29 +0,0 @@ - -# -# CPU Frequency scaling -# - -menu "CPU Frequency scaling" - -source "drivers/cpufreq/Kconfig" - -if CPU_FREQ - -comment "CPUFreq processor drivers" - -config IA64_ACPI_CPUFREQ -	tristate "ACPI Processor P-States driver" -	select CPU_FREQ_TABLE -	depends on ACPI_PROCESSOR -	help -	This driver adds a CPUFreq driver which utilizes the ACPI -	Processor Performance States. - -	For details, take a look at <file:Documentation/cpu-freq/>. - -	If in doubt, say N. - -endif   # CPU_FREQ - -endmenu - diff --git a/arch/ia64/kernel/cpufreq/Makefile b/arch/ia64/kernel/cpufreq/Makefile deleted file mode 100644 index 4838f2a57c7..00000000000 --- a/arch/ia64/kernel/cpufreq/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -obj-$(CONFIG_IA64_ACPI_CPUFREQ)		+= acpi-cpufreq.o - diff --git a/arch/ia64/kernel/cpufreq/acpi-cpufreq.c b/arch/ia64/kernel/cpufreq/acpi-cpufreq.c deleted file mode 100644 index 22f61526a8e..00000000000 --- a/arch/ia64/kernel/cpufreq/acpi-cpufreq.c +++ /dev/null @@ -1,439 +0,0 @@ -/* - * arch/ia64/kernel/cpufreq/acpi-cpufreq.c - * This file provides the ACPI based P-state support. This - * module works with generic cpufreq infrastructure. Most of - * the code is based on i386 version - * (arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c) - * - * Copyright (C) 2005 Intel Corp - *      Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> - */ - -#include <linux/kernel.h> -#include <linux/slab.h> -#include <linux/module.h> -#include <linux/init.h> -#include <linux/cpufreq.h> -#include <linux/proc_fs.h> -#include <linux/seq_file.h> -#include <asm/io.h> -#include <asm/uaccess.h> -#include <asm/pal.h> - -#include <linux/acpi.h> -#include <acpi/processor.h> - -#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "acpi-cpufreq", msg) - -MODULE_AUTHOR("Venkatesh Pallipadi"); -MODULE_DESCRIPTION("ACPI Processor P-States Driver"); -MODULE_LICENSE("GPL"); - - -struct cpufreq_acpi_io { -	struct acpi_processor_performance	acpi_data; -	struct cpufreq_frequency_table		*freq_table; -	unsigned int				resume; -}; - -static struct cpufreq_acpi_io	*acpi_io_data[NR_CPUS]; - -static struct cpufreq_driver acpi_cpufreq_driver; - - -static int -processor_set_pstate ( -	u32	value) -{ -	s64 retval; - -	dprintk("processor_set_pstate\n"); - -	retval = ia64_pal_set_pstate((u64)value); - -	if (retval) { -		dprintk("Failed to set freq to 0x%x, with error 0x%lx\n", -		        value, retval); -		return -ENODEV; -	} -	return (int)retval; -} - - -static int -processor_get_pstate ( -	u32	*value) -{ -	u64	pstate_index = 0; -	s64 	retval; - -	dprintk("processor_get_pstate\n"); - -	retval = ia64_pal_get_pstate(&pstate_index, -	                             PAL_GET_PSTATE_TYPE_INSTANT); -	*value = (u32) pstate_index; - -	if (retval) -		dprintk("Failed to get current freq with " -			"error 0x%lx, idx 0x%x\n", retval, *value); - -	return (int)retval; -} - - -/* To be used only after data->acpi_data is initialized */ -static unsigned -extract_clock ( -	struct cpufreq_acpi_io *data, -	unsigned value, -	unsigned int cpu) -{ -	unsigned long i; - -	dprintk("extract_clock\n"); - -	for (i = 0; i < data->acpi_data.state_count; i++) { -		if (value == data->acpi_data.states[i].status) -			return data->acpi_data.states[i].core_frequency; -	} -	return data->acpi_data.states[i-1].core_frequency; -} - - -static unsigned int -processor_get_freq ( -	struct cpufreq_acpi_io	*data, -	unsigned int		cpu) -{ -	int			ret = 0; -	u32			value = 0; -	cpumask_t		saved_mask; -	unsigned long 		clock_freq; - -	dprintk("processor_get_freq\n"); - -	saved_mask = current->cpus_allowed; -	set_cpus_allowed_ptr(current, cpumask_of(cpu)); -	if (smp_processor_id() != cpu) -		goto migrate_end; - -	/* processor_get_pstate gets the instantaneous frequency */ -	ret = processor_get_pstate(&value); - -	if (ret) { -		set_cpus_allowed_ptr(current, &saved_mask); -		printk(KERN_WARNING "get performance failed with error %d\n", -		       ret); -		ret = 0; -		goto migrate_end; -	} -	clock_freq = extract_clock(data, value, cpu); -	ret = (clock_freq*1000); - -migrate_end: -	set_cpus_allowed_ptr(current, &saved_mask); -	return ret; -} - - -static int -processor_set_freq ( -	struct cpufreq_acpi_io	*data, -	unsigned int		cpu, -	int			state) -{ -	int			ret = 0; -	u32			value = 0; -	struct cpufreq_freqs    cpufreq_freqs; -	cpumask_t		saved_mask; -	int			retval; - -	dprintk("processor_set_freq\n"); - -	saved_mask = current->cpus_allowed; -	set_cpus_allowed_ptr(current, cpumask_of(cpu)); -	if (smp_processor_id() != cpu) { -		retval = -EAGAIN; -		goto migrate_end; -	} - -	if (state == data->acpi_data.state) { -		if (unlikely(data->resume)) { -			dprintk("Called after resume, resetting to P%d\n", state); -			data->resume = 0; -		} else { -			dprintk("Already at target state (P%d)\n", state); -			retval = 0; -			goto migrate_end; -		} -	} - -	dprintk("Transitioning from P%d to P%d\n", -		data->acpi_data.state, state); - -	/* cpufreq frequency struct */ -	cpufreq_freqs.cpu = cpu; -	cpufreq_freqs.old = data->freq_table[data->acpi_data.state].frequency; -	cpufreq_freqs.new = data->freq_table[state].frequency; - -	/* notify cpufreq */ -	cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE); - -	/* -	 * First we write the target state's 'control' value to the -	 * control_register. -	 */ - -	value = (u32) data->acpi_data.states[state].control; - -	dprintk("Transitioning to state: 0x%08x\n", value); - -	ret = processor_set_pstate(value); -	if (ret) { -		unsigned int tmp = cpufreq_freqs.new; -		cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE); -		cpufreq_freqs.new = cpufreq_freqs.old; -		cpufreq_freqs.old = tmp; -		cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_PRECHANGE); -		cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE); -		printk(KERN_WARNING "Transition failed with error %d\n", ret); -		retval = -ENODEV; -		goto migrate_end; -	} - -	cpufreq_notify_transition(&cpufreq_freqs, CPUFREQ_POSTCHANGE); - -	data->acpi_data.state = state; - -	retval = 0; - -migrate_end: -	set_cpus_allowed_ptr(current, &saved_mask); -	return (retval); -} - - -static unsigned int -acpi_cpufreq_get ( -	unsigned int		cpu) -{ -	struct cpufreq_acpi_io *data = acpi_io_data[cpu]; - -	dprintk("acpi_cpufreq_get\n"); - -	return processor_get_freq(data, cpu); -} - - -static int -acpi_cpufreq_target ( -	struct cpufreq_policy   *policy, -	unsigned int target_freq, -	unsigned int relation) -{ -	struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu]; -	unsigned int next_state = 0; -	unsigned int result = 0; - -	dprintk("acpi_cpufreq_setpolicy\n"); - -	result = cpufreq_frequency_table_target(policy, -			data->freq_table, target_freq, relation, &next_state); -	if (result) -		return (result); - -	result = processor_set_freq(data, policy->cpu, next_state); - -	return (result); -} - - -static int -acpi_cpufreq_verify ( -	struct cpufreq_policy   *policy) -{ -	unsigned int result = 0; -	struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu]; - -	dprintk("acpi_cpufreq_verify\n"); - -	result = cpufreq_frequency_table_verify(policy, -			data->freq_table); - -	return (result); -} - - -static int -acpi_cpufreq_cpu_init ( -	struct cpufreq_policy   *policy) -{ -	unsigned int		i; -	unsigned int		cpu = policy->cpu; -	struct cpufreq_acpi_io	*data; -	unsigned int		result = 0; - -	dprintk("acpi_cpufreq_cpu_init\n"); - -	data = kzalloc(sizeof(struct cpufreq_acpi_io), GFP_KERNEL); -	if (!data) -		return (-ENOMEM); - -	acpi_io_data[cpu] = data; - -	result = acpi_processor_register_performance(&data->acpi_data, cpu); - -	if (result) -		goto err_free; - -	/* capability check */ -	if (data->acpi_data.state_count <= 1) { -		dprintk("No P-States\n"); -		result = -ENODEV; -		goto err_unreg; -	} - -	if ((data->acpi_data.control_register.space_id != -					ACPI_ADR_SPACE_FIXED_HARDWARE) || -	    (data->acpi_data.status_register.space_id != -					ACPI_ADR_SPACE_FIXED_HARDWARE)) { -		dprintk("Unsupported address space [%d, %d]\n", -			(u32) (data->acpi_data.control_register.space_id), -			(u32) (data->acpi_data.status_register.space_id)); -		result = -ENODEV; -		goto err_unreg; -	} - -	/* alloc freq_table */ -	data->freq_table = kmalloc(sizeof(struct cpufreq_frequency_table) * -	                           (data->acpi_data.state_count + 1), -	                           GFP_KERNEL); -	if (!data->freq_table) { -		result = -ENOMEM; -		goto err_unreg; -	} - -	/* detect transition latency */ -	policy->cpuinfo.transition_latency = 0; -	for (i=0; i<data->acpi_data.state_count; i++) { -		if ((data->acpi_data.states[i].transition_latency * 1000) > -		    policy->cpuinfo.transition_latency) { -			policy->cpuinfo.transition_latency = -			    data->acpi_data.states[i].transition_latency * 1000; -		} -	} -	policy->cur = processor_get_freq(data, policy->cpu); - -	/* table init */ -	for (i = 0; i <= data->acpi_data.state_count; i++) -	{ -		data->freq_table[i].index = i; -		if (i < data->acpi_data.state_count) { -			data->freq_table[i].frequency = -			      data->acpi_data.states[i].core_frequency * 1000; -		} else { -			data->freq_table[i].frequency = CPUFREQ_TABLE_END; -		} -	} - -	result = cpufreq_frequency_table_cpuinfo(policy, data->freq_table); -	if (result) { -		goto err_freqfree; -	} - -	/* notify BIOS that we exist */ -	acpi_processor_notify_smm(THIS_MODULE); - -	printk(KERN_INFO "acpi-cpufreq: CPU%u - ACPI performance management " -	       "activated.\n", cpu); - -	for (i = 0; i < data->acpi_data.state_count; i++) -		dprintk("     %cP%d: %d MHz, %d mW, %d uS, %d uS, 0x%x 0x%x\n", -			(i == data->acpi_data.state?'*':' '), i, -			(u32) data->acpi_data.states[i].core_frequency, -			(u32) data->acpi_data.states[i].power, -			(u32) data->acpi_data.states[i].transition_latency, -			(u32) data->acpi_data.states[i].bus_master_latency, -			(u32) data->acpi_data.states[i].status, -			(u32) data->acpi_data.states[i].control); - -	cpufreq_frequency_table_get_attr(data->freq_table, policy->cpu); - -	/* the first call to ->target() should result in us actually -	 * writing something to the appropriate registers. */ -	data->resume = 1; - -	return (result); - - err_freqfree: -	kfree(data->freq_table); - err_unreg: -	acpi_processor_unregister_performance(&data->acpi_data, cpu); - err_free: -	kfree(data); -	acpi_io_data[cpu] = NULL; - -	return (result); -} - - -static int -acpi_cpufreq_cpu_exit ( -	struct cpufreq_policy   *policy) -{ -	struct cpufreq_acpi_io *data = acpi_io_data[policy->cpu]; - -	dprintk("acpi_cpufreq_cpu_exit\n"); - -	if (data) { -		cpufreq_frequency_table_put_attr(policy->cpu); -		acpi_io_data[policy->cpu] = NULL; -		acpi_processor_unregister_performance(&data->acpi_data, -		                                      policy->cpu); -		kfree(data); -	} - -	return (0); -} - - -static struct freq_attr* acpi_cpufreq_attr[] = { -	&cpufreq_freq_attr_scaling_available_freqs, -	NULL, -}; - - -static struct cpufreq_driver acpi_cpufreq_driver = { -	.verify 	= acpi_cpufreq_verify, -	.target 	= acpi_cpufreq_target, -	.get 		= acpi_cpufreq_get, -	.init		= acpi_cpufreq_cpu_init, -	.exit		= acpi_cpufreq_cpu_exit, -	.name		= "acpi-cpufreq", -	.owner		= THIS_MODULE, -	.attr           = acpi_cpufreq_attr, -}; - - -static int __init -acpi_cpufreq_init (void) -{ -	dprintk("acpi_cpufreq_init\n"); - - 	return cpufreq_register_driver(&acpi_cpufreq_driver); -} - - -static void __exit -acpi_cpufreq_exit (void) -{ -	dprintk("acpi_cpufreq_exit\n"); - -	cpufreq_unregister_driver(&acpi_cpufreq_driver); -	return; -} - - -late_initcall(acpi_cpufreq_init); -module_exit(acpi_cpufreq_exit); - diff --git a/arch/ia64/kernel/crash.c b/arch/ia64/kernel/crash.c index b942f4032d7..2955f359e2a 100644 --- a/arch/ia64/kernel/crash.c +++ b/arch/ia64/kernel/crash.c @@ -237,7 +237,7 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data)  }  #ifdef CONFIG_SYSCTL -static ctl_table kdump_ctl_table[] = { +static struct ctl_table kdump_ctl_table[] = {  	{  		.procname = "kdump_on_init",  		.data = &kdump_on_init, @@ -255,7 +255,7 @@ static ctl_table kdump_ctl_table[] = {  	{ }  }; -static ctl_table sys_table[] = { +static struct ctl_table sys_table[] = {  	{  	  .procname = "kernel",  	  .mode = 0555, diff --git a/arch/ia64/kernel/crash_dump.c b/arch/ia64/kernel/crash_dump.c index 23e91290e41..c8c9298666f 100644 --- a/arch/ia64/kernel/crash_dump.c +++ b/arch/ia64/kernel/crash_dump.c @@ -13,9 +13,6 @@  #include <asm/page.h>  #include <asm/uaccess.h> -/* Stores the physical address of elf header of crash image. */ -unsigned long long elfcorehdr_addr = ELFCORE_ADDR_MAX; -  /**   * copy_oldmem_page - copy one page from "oldmem"   * @pfn: page frame number to be copied diff --git a/arch/ia64/kernel/cyclone.c b/arch/ia64/kernel/cyclone.c index d52f1f78eff..4826ff957a3 100644 --- a/arch/ia64/kernel/cyclone.c +++ b/arch/ia64/kernel/cyclone.c @@ -31,8 +31,6 @@ static struct clocksource clocksource_cyclone = {          .rating         = 300,          .read           = read_cyclone,          .mask           = (1LL << 40) - 1, -        .mult           = 0, /*to be caluclated*/ -        .shift          = 16,          .flags          = CLOCK_SOURCE_IS_CONTINUOUS,  }; @@ -117,10 +115,8 @@ int __init init_cyclone_clock(void)  	}  	/* initialize last tick */  	cyclone_mc = cyclone_timer; -	clocksource_cyclone.fsys_mmio = cyclone_timer; -	clocksource_cyclone.mult = clocksource_hz2mult(CYCLONE_TIMER_FREQ, -						clocksource_cyclone.shift); -	clocksource_register(&clocksource_cyclone); +	clocksource_cyclone.archdata.fsys_mmio = cyclone_timer; +	clocksource_register_hz(&clocksource_cyclone, CYCLONE_TIMER_FREQ);  	return 0;  } diff --git a/arch/ia64/kernel/dma-mapping.c b/arch/ia64/kernel/dma-mapping.c index f2c1600da09..7f791623820 100644 --- a/arch/ia64/kernel/dma-mapping.c +++ b/arch/ia64/kernel/dma-mapping.c @@ -1,4 +1,5 @@  #include <linux/dma-mapping.h> +#include <linux/export.h>  /* Set this to 1 if there is a HW IOMMU in the system */  int iommu_detected __read_mostly; diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c index a0f00192850..741b99c1a0b 100644 --- a/arch/ia64/kernel/efi.c +++ b/arch/ia64/kernel/efi.c @@ -23,6 +23,7 @@   */  #include <linux/module.h>  #include <linux/bootmem.h> +#include <linux/crash_dump.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/types.h> @@ -38,14 +39,20 @@  #include <asm/pgtable.h>  #include <asm/processor.h>  #include <asm/mca.h> +#include <asm/setup.h>  #include <asm/tlbflush.h>  #define EFI_DEBUG	0 +static __initdata unsigned long palo_phys; + +static __initdata efi_config_table_type_t arch_tables[] = { +	{PROCESSOR_ABSTRACTION_LAYER_OVERWRITE_GUID, "PALO", &palo_phys}, +	{NULL_GUID, NULL, 0}, +}; +  extern efi_status_t efi_call_phys (void *, ...); -struct efi efi; -EXPORT_SYMBOL(efi);  static efi_runtime_services_t *runtime;  static u64 mem_limit = ~0UL, max_addr = ~0UL, min_addr = 0UL; @@ -155,7 +162,7 @@ prefix##_get_next_variable (unsigned long *name_size, efi_char16_t *name,      \  #define STUB_SET_VARIABLE(prefix, adjust_arg)				       \  static efi_status_t							       \  prefix##_set_variable (efi_char16_t *name, efi_guid_t *vendor,		       \ -		       unsigned long attr, unsigned long data_size,	       \ +		       u32 attr, unsigned long data_size,		       \  		       void *data)					       \  {									       \  	struct ia64_fpreg fr[6];					       \ @@ -421,9 +428,9 @@ static u8 __init palo_checksum(u8 *buffer, u32 length)   * Parse and handle PALO table which is published at:   * http://www.dig64.org/home/DIG64_PALO_R1_0.pdf   */ -static void __init handle_palo(unsigned long palo_phys) +static void __init handle_palo(unsigned long phys_addr)  { -	struct palo_table *palo = __va(palo_phys); +	struct palo_table *palo = __va(phys_addr);  	u8  checksum;  	if (strncmp(palo->signature, PALO_SIG, sizeof(PALO_SIG) - 1)) { @@ -465,12 +472,13 @@ void __init  efi_init (void)  {  	void *efi_map_start, *efi_map_end; -	efi_config_table_t *config_tables;  	efi_char16_t *c16;  	u64 efi_desc_size;  	char *cp, vendor[100] = "unknown";  	int i; -	unsigned long palo_phys; + +	set_bit(EFI_BOOT, &efi.flags); +	set_bit(EFI_64BIT, &efi.flags);  	/*  	 * It's too early to be able to use the standard kernel command line @@ -512,8 +520,6 @@ efi_init (void)  		       efi.systab->hdr.revision >> 16,  		       efi.systab->hdr.revision & 0xffff); -	config_tables = __va(efi.systab->tables); -  	/* Show what we know for posterity */  	c16 = __va(efi.systab->fw_vendor);  	if (c16) { @@ -526,43 +532,12 @@ efi_init (void)  	       efi.systab->hdr.revision >> 16,  	       efi.systab->hdr.revision & 0xffff, vendor); -	efi.mps        = EFI_INVALID_TABLE_ADDR; -	efi.acpi       = EFI_INVALID_TABLE_ADDR; -	efi.acpi20     = EFI_INVALID_TABLE_ADDR; -	efi.smbios     = EFI_INVALID_TABLE_ADDR; -	efi.sal_systab = EFI_INVALID_TABLE_ADDR; -	efi.boot_info  = EFI_INVALID_TABLE_ADDR; -	efi.hcdp       = EFI_INVALID_TABLE_ADDR; -	efi.uga        = EFI_INVALID_TABLE_ADDR; +	set_bit(EFI_SYSTEM_TABLES, &efi.flags);  	palo_phys      = EFI_INVALID_TABLE_ADDR; -	for (i = 0; i < (int) efi.systab->nr_tables; i++) { -		if (efi_guidcmp(config_tables[i].guid, MPS_TABLE_GUID) == 0) { -			efi.mps = config_tables[i].table; -			printk(" MPS=0x%lx", config_tables[i].table); -		} else if (efi_guidcmp(config_tables[i].guid, ACPI_20_TABLE_GUID) == 0) { -			efi.acpi20 = config_tables[i].table; -			printk(" ACPI 2.0=0x%lx", config_tables[i].table); -		} else if (efi_guidcmp(config_tables[i].guid, ACPI_TABLE_GUID) == 0) { -			efi.acpi = config_tables[i].table; -			printk(" ACPI=0x%lx", config_tables[i].table); -		} else if (efi_guidcmp(config_tables[i].guid, SMBIOS_TABLE_GUID) == 0) { -			efi.smbios = config_tables[i].table; -			printk(" SMBIOS=0x%lx", config_tables[i].table); -		} else if (efi_guidcmp(config_tables[i].guid, SAL_SYSTEM_TABLE_GUID) == 0) { -			efi.sal_systab = config_tables[i].table; -			printk(" SALsystab=0x%lx", config_tables[i].table); -		} else if (efi_guidcmp(config_tables[i].guid, HCDP_TABLE_GUID) == 0) { -			efi.hcdp = config_tables[i].table; -			printk(" HCDP=0x%lx", config_tables[i].table); -		} else if (efi_guidcmp(config_tables[i].guid, -			 PROCESSOR_ABSTRACTION_LAYER_OVERWRITE_GUID) == 0) { -			palo_phys = config_tables[i].table; -			printk(" PALO=0x%lx", config_tables[i].table); -		} -	} -	printk("\n"); +	if (efi_config_init(arch_tables) != 0) +		return;  	if (palo_phys != EFI_INVALID_TABLE_ADDR)  		handle_palo(palo_phys); @@ -687,6 +662,8 @@ efi_enter_virtual_mode (void)  		return;  	} +	set_bit(EFI_RUNTIME_SERVICES, &efi.flags); +  	/*  	 * Now that EFI is in virtual mode, we call the EFI functions more  	 * efficiently: @@ -868,7 +845,7 @@ kern_mem_attribute (unsigned long phys_addr, unsigned long size)  EXPORT_SYMBOL(kern_mem_attribute);  int -valid_phys_addr_range (unsigned long phys_addr, unsigned long size) +valid_phys_addr_range (phys_addr_t phys_addr, unsigned long size)  {  	u64 attr; @@ -1114,11 +1091,6 @@ efi_memmap_init(u64 *s, u64 *e)  		if (!is_memory_available(md))  			continue; -#ifdef CONFIG_CRASH_DUMP -		/* saved_max_pfn should ignore max_addr= command line arg */ -		if (saved_max_pfn < (efi_md_end(md) >> PAGE_SHIFT)) -			saved_max_pfn = (efi_md_end(md) >> PAGE_SHIFT); -#endif  		/*  		 * Round ends inward to granule boundaries  		 * Give trimmings to uncached allocator diff --git a/arch/ia64/kernel/elfcore.c b/arch/ia64/kernel/elfcore.c index bac1639bc32..04bc8fd5f89 100644 --- a/arch/ia64/kernel/elfcore.c +++ b/arch/ia64/kernel/elfcore.c @@ -11,8 +11,7 @@ Elf64_Half elf_core_extra_phdrs(void)  	return GATE_EHDR->e_phnum;  } -int elf_core_write_extra_phdrs(struct file *file, loff_t offset, size_t *size, -			       unsigned long limit) +int elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset)  {  	const struct elf_phdr *const gate_phdrs =  		(const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff); @@ -35,15 +34,13 @@ int elf_core_write_extra_phdrs(struct file *file, loff_t offset, size_t *size,  			phdr.p_offset += ofs;  		}  		phdr.p_paddr = 0; /* match other core phdrs */ -		*size += sizeof(phdr); -		if (*size > limit || !dump_write(file, &phdr, sizeof(phdr))) +		if (!dump_emit(cprm, &phdr, sizeof(phdr)))  			return 0;  	}  	return 1;  } -int elf_core_write_extra_data(struct file *file, size_t *size, -			      unsigned long limit) +int elf_core_write_extra_data(struct coredump_params *cprm)  {  	const struct elf_phdr *const gate_phdrs =  		(const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff); @@ -54,8 +51,7 @@ int elf_core_write_extra_data(struct file *file, size_t *size,  			void *addr = (void *)gate_phdrs[i].p_vaddr;  			size_t memsz = PAGE_ALIGN(gate_phdrs[i].p_memsz); -			*size += memsz; -			if (*size > limit || !dump_write(file, addr, memsz)) +			if (!dump_emit(cprm, addr, memsz))  				return 0;  			break;  		} diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 244704a174d..ba3d03503e8 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S @@ -61,14 +61,13 @@ ENTRY(ia64_execve)  	 * Allocate 8 input registers since ptrace() may clobber them  	 */  	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8) -	alloc loc1=ar.pfs,8,2,4,0 +	alloc loc1=ar.pfs,8,2,3,0  	mov loc0=rp  	.body  	mov out0=in0			// filename  	;;				// stop bit between alloc and call  	mov out1=in1			// argv  	mov out2=in2			// envp -	add out3=16,sp			// regs  	br.call.sptk.many rp=sys_execve  .ret0:  	cmp4.ge p6,p7=r8,r0 @@ -76,7 +75,6 @@ ENTRY(ia64_execve)  	sxt4 r8=r8			// return 64-bit result  	;;  	stf.spill [sp]=f0 -(p6)	cmp.ne pKStk,pUStk=r0,r0	// a successful execve() lands us in user-mode...  	mov rp=loc0  (p6)	mov ar.pfs=r0			// clear ar.pfs on success  (p7)	br.ret.sptk.many rp @@ -118,13 +116,12 @@ GLOBAL_ENTRY(sys_clone2)  	mov loc1=r16				// save ar.pfs across do_fork  	.body  	mov out1=in1 -	mov out3=in2 +	mov out2=in2  	tbit.nz p6,p0=in0,CLONE_SETTLS_BIT -	mov out4=in3	// parent_tidptr: valid only w/CLONE_PARENT_SETTID +	mov out3=in3	// parent_tidptr: valid only w/CLONE_PARENT_SETTID  	;;  (p6)	st8 [r2]=in5				// store TLS in r16 for copy_thread() -	mov out5=in4	// child_tidptr:  valid only w/CLONE_CHILD_SETTID or CLONE_CHILD_CLEARTID -	adds out2=IA64_SWITCH_STACK_SIZE+16,sp	// out2 = ®s +	mov out4=in4	// child_tidptr:  valid only w/CLONE_CHILD_SETTID or CLONE_CHILD_CLEARTID  	mov out0=in0				// out0 = clone_flags  	br.call.sptk.many rp=do_fork  .ret1:	.restore sp @@ -150,13 +147,12 @@ GLOBAL_ENTRY(sys_clone)  	mov loc1=r16				// save ar.pfs across do_fork  	.body  	mov out1=in1 -	mov out3=16				// stacksize (compensates for 16-byte scratch area) +	mov out2=16				// stacksize (compensates for 16-byte scratch area)  	tbit.nz p6,p0=in0,CLONE_SETTLS_BIT -	mov out4=in2	// parent_tidptr: valid only w/CLONE_PARENT_SETTID +	mov out3=in2	// parent_tidptr: valid only w/CLONE_PARENT_SETTID  	;;  (p6)	st8 [r2]=in4				// store TLS in r13 (tp) -	mov out5=in3	// child_tidptr:  valid only w/CLONE_CHILD_SETTID or CLONE_CHILD_CLEARTID -	adds out2=IA64_SWITCH_STACK_SIZE+16,sp	// out2 = ®s +	mov out4=in3	// child_tidptr:  valid only w/CLONE_CHILD_SETTID or CLONE_CHILD_CLEARTID  	mov out0=in0				// out0 = clone_flags  	br.call.sptk.many rp=do_fork  .ret2:	.restore sp @@ -484,19 +480,6 @@ GLOBAL_ENTRY(prefetch_stack)  	br.ret.sptk.many rp  END(prefetch_stack) -GLOBAL_ENTRY(kernel_execve) -	rum psr.ac -	mov r15=__NR_execve			// put syscall number in place -	break __BREAK_SYSCALL -	br.ret.sptk.many rp -END(kernel_execve) - -GLOBAL_ENTRY(clone) -	mov r15=__NR_clone			// put syscall number in place -	break __BREAK_SYSCALL -	br.ret.sptk.many rp -END(clone) -  	/*  	 * Invoke a system call, but do some tracing before and after the call.  	 * We MUST preserve the current register frame throughout this routine @@ -600,6 +583,27 @@ GLOBAL_ENTRY(ia64_strace_leave_kernel)  .ret4:	br.cond.sptk ia64_leave_kernel  END(ia64_strace_leave_kernel) +ENTRY(call_payload) +	.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(0) +	/* call the kernel_thread payload; fn is in r4, arg - in r5 */ +	alloc loc1=ar.pfs,0,3,1,0 +	mov loc0=rp +	mov loc2=gp +	mov out0=r5		// arg +	ld8 r14 = [r4], 8	// fn.address +	;; +	mov b6 = r14 +	ld8 gp = [r4]		// fn.gp +	;; +	br.call.sptk.many rp=b6	// fn(arg) +.ret12:	mov gp=loc2 +	mov rp=loc0 +	mov ar.pfs=loc1 +	/* ... and if it has returned, we are going to userland */ +	cmp.ne pKStk,pUStk=r0,r0 +	br.ret.sptk.many rp +END(call_payload) +  GLOBAL_ENTRY(ia64_ret_from_clone)  	PT_REGS_UNWIND_INFO(0)  {	/* @@ -616,6 +620,7 @@ GLOBAL_ENTRY(ia64_ret_from_clone)  	br.call.sptk.many rp=ia64_invoke_schedule_tail  }  .ret8: +(pKStk)	br.call.sptk.many rp=call_payload  	adds r2=TI_FLAGS+IA64_TASK_SIZE,r13  	;;  	ld4 r2=[r2] @@ -719,7 +724,7 @@ GLOBAL_ENTRY(__paravirt_leave_syscall)  #endif  .global __paravirt_work_processed_syscall;  __paravirt_work_processed_syscall: -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	adds r2=PT(LOADRS)+16,r12  	MOV_FROM_ITC(pUStk, p9, r22, r19)	// fetch time at leave  	adds r18=TI_FLAGS+IA64_TASK_SIZE,r13 @@ -757,7 +762,7 @@ __paravirt_work_processed_syscall:  	ld8 r29=[r2],16		// M0|1 load cr.ipsr  	ld8 r28=[r3],16		// M0|1 load cr.iip -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  (pUStk) add r14=TI_AC_LEAVE+IA64_TASK_SIZE,r13  	;;  	ld8 r30=[r2],16		// M0|1 load cr.ifs @@ -788,7 +793,7 @@ __paravirt_work_processed_syscall:  	ld8.fill r1=[r3],16			// M0|1 load r1  (pUStk) mov r17=1				// A  	;; -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  (pUStk) st1 [r15]=r17				// M2|3  #else  (pUStk) st1 [r14]=r17				// M2|3 @@ -808,7 +813,7 @@ __paravirt_work_processed_syscall:  	shr.u r18=r19,16		// I0|1 get byte size of existing "dirty" partition  	COVER				// B    add current frame into dirty partition & set cr.ifs  	;; -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	mov r19=ar.bsp			// M2   get new backing store pointer  	st8 [r14]=r22			// M	save time at leave  	mov f10=f0			// F    clear f10 @@ -943,7 +948,7 @@ GLOBAL_ENTRY(__paravirt_leave_kernel)  	adds r16=PT(CR_IPSR)+16,r12  	adds r17=PT(CR_IIP)+16,r12 -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	.pred.rel.mutex pUStk,pKStk  	MOV_FROM_PSR(pKStk, r22, r29)	// M2 read PSR now that interrupts are disabled  	MOV_FROM_ITC(pUStk, p9, r22, r29)	// M  fetch time at leave @@ -976,7 +981,7 @@ GLOBAL_ENTRY(__paravirt_leave_kernel)  	;;  	ld8.fill r12=[r16],16  	ld8.fill r13=[r17],16 -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  (pUStk)	adds r3=TI_AC_LEAVE+IA64_TASK_SIZE,r18  #else  (pUStk)	adds r18=IA64_TASK_THREAD_ON_USTACK_OFFSET,r18 @@ -984,7 +989,7 @@ GLOBAL_ENTRY(__paravirt_leave_kernel)  	;;  	ld8 r20=[r16],16	// ar.fpsr  	ld8.fill r15=[r17],16 -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  (pUStk)	adds r18=IA64_TASK_THREAD_ON_USTACK_OFFSET,r18	// deferred  #endif  	;; @@ -992,7 +997,7 @@ GLOBAL_ENTRY(__paravirt_leave_kernel)  	ld8.fill r2=[r17]  (pUStk)	mov r17=1  	;; -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	//  mmi_ :  ld8 st1 shr;;         mmi_ : st8 st1 shr;;  	//  mib  :  mov add br        ->  mib  : ld8 add br  	//  bbb_ :  br  nop cover;;       mbb_ : mov br  cover;; @@ -1164,21 +1169,8 @@ skip_rbs_switch:  .work_pending:  	tbit.z p6,p0=r31,TIF_NEED_RESCHED	// is resched not needed?  (p6)	br.cond.sptk.few .notify -#ifdef CONFIG_PREEMPT -(pKStk) dep r21=-1,r0,PREEMPT_ACTIVE_BIT,1 -	;; -(pKStk) st4 [r20]=r21 -#endif -	SSM_PSR_I(p0, p6, r2)	// enable interrupts -	br.call.spnt.many rp=schedule +	br.call.spnt.many rp=preempt_schedule_irq  .ret9:	cmp.eq p6,p0=r0,r0	// p6 <- 1 (re-check) -	RSM_PSR_I(p0, r2, r20)	// disable interrupts -	;; -#ifdef CONFIG_PREEMPT -(pKStk)	adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13 -	;; -(pKStk)	st4 [r20]=r0		// preempt_count() <- 0 -#endif  (pLvSys)br.cond.sptk.few  __paravirt_pending_syscall_end  	br.cond.sptk.many .work_processed_kernel @@ -1614,7 +1606,7 @@ sys_call_table:  	data8 sys_sched_get_priority_min  	data8 sys_sched_rr_get_interval  	data8 sys_nanosleep -	data8 sys_nfsservctl +	data8 sys_ni_syscall			// old nfsservctl  	data8 sys_prctl				// 1170  	data8 sys_getpagesize  	data8 sys_mmap2 @@ -1771,6 +1763,19 @@ sys_call_table:  	data8 sys_fanotify_init  	data8 sys_fanotify_mark  	data8 sys_prlimit64			// 1325 +	data8 sys_name_to_handle_at +	data8 sys_open_by_handle_at +	data8 sys_clock_adjtime +	data8 sys_syncfs +	data8 sys_setns				// 1330 +	data8 sys_sendmmsg +	data8 sys_process_vm_readv +	data8 sys_process_vm_writev +	data8 sys_accept4 +	data8 sys_finit_module			// 1335 +	data8 sys_sched_setattr +	data8 sys_sched_getattr +	data8 sys_renameat2  	.org sys_call_table + 8*NR_syscalls	// guard against failures to increase NR_syscalls  #endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */ diff --git a/arch/ia64/kernel/err_inject.c b/arch/ia64/kernel/err_inject.c index c539c689493..0c161ed6d18 100644 --- a/arch/ia64/kernel/err_inject.c +++ b/arch/ia64/kernel/err_inject.c @@ -24,7 +24,7 @@   * Copyright (C) 2006, Intel Corp.  All rights reserved.   *   */ -#include <linux/sysdev.h> +#include <linux/device.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/cpu.h> @@ -35,10 +35,10 @@  #define ERR_DATA_BUFFER_SIZE 3 		// Three 8-byte;  #define define_one_ro(name) 						\ -static SYSDEV_ATTR(name, 0444, show_##name, NULL) +static DEVICE_ATTR(name, 0444, show_##name, NULL)  #define define_one_rw(name) 						\ -static SYSDEV_ATTR(name, 0644, show_##name, store_##name) +static DEVICE_ATTR(name, 0644, show_##name, store_##name)  static u64 call_start[NR_CPUS];  static u64 phys_addr[NR_CPUS]; @@ -55,7 +55,7 @@ static u64 resources[NR_CPUS];  #define show(name) 							\  static ssize_t 								\ -show_##name(struct sys_device *dev, struct sysdev_attribute *attr,	\ +show_##name(struct device *dev, struct device_attribute *attr,	\  		char *buf)						\  {									\  	u32 cpu=dev->id;						\ @@ -64,7 +64,7 @@ show_##name(struct sys_device *dev, struct sysdev_attribute *attr,	\  #define store(name)							\  static ssize_t 								\ -store_##name(struct sys_device *dev, struct sysdev_attribute *attr,	\ +store_##name(struct device *dev, struct device_attribute *attr,	\  					const char *buf, size_t size)	\  {									\  	unsigned int cpu=dev->id;					\ @@ -78,7 +78,7 @@ show(call_start)   * processor. The cpu number in driver is only used for storing data.   */  static ssize_t -store_call_start(struct sys_device *dev, struct sysdev_attribute *attr, +store_call_start(struct device *dev, struct device_attribute *attr,  		const char *buf, size_t size)  {  	unsigned int cpu=dev->id; @@ -127,7 +127,7 @@ show(err_type_info)  store(err_type_info)  static ssize_t -show_virtual_to_phys(struct sys_device *dev, struct sysdev_attribute *attr, +show_virtual_to_phys(struct device *dev, struct device_attribute *attr,  			char *buf)  {  	unsigned int cpu=dev->id; @@ -135,7 +135,7 @@ show_virtual_to_phys(struct sys_device *dev, struct sysdev_attribute *attr,  }  static ssize_t -store_virtual_to_phys(struct sys_device *dev, struct sysdev_attribute *attr, +store_virtual_to_phys(struct device *dev, struct device_attribute *attr,  			const char *buf, size_t size)  {  	unsigned int cpu=dev->id; @@ -159,8 +159,8 @@ show(err_struct_info)  store(err_struct_info)  static ssize_t -show_err_data_buffer(struct sys_device *dev, -			struct sysdev_attribute *attr, char *buf) +show_err_data_buffer(struct device *dev, +			struct device_attribute *attr, char *buf)  {  	unsigned int cpu=dev->id; @@ -171,8 +171,8 @@ show_err_data_buffer(struct sys_device *dev,  }  static ssize_t -store_err_data_buffer(struct sys_device *dev, -			struct sysdev_attribute *attr, +store_err_data_buffer(struct device *dev, +			struct device_attribute *attr,  			const char *buf, size_t size)  {  	unsigned int cpu=dev->id; @@ -209,14 +209,14 @@ define_one_ro(capabilities);  define_one_ro(resources);  static struct attribute *default_attrs[] = { -	&attr_call_start.attr, -	&attr_virtual_to_phys.attr, -	&attr_err_type_info.attr, -	&attr_err_struct_info.attr, -	&attr_err_data_buffer.attr, -	&attr_status.attr, -	&attr_capabilities.attr, -	&attr_resources.attr, +	&dev_attr_call_start.attr, +	&dev_attr_virtual_to_phys.attr, +	&dev_attr_err_type_info.attr, +	&dev_attr_err_struct_info.attr, +	&dev_attr_err_data_buffer.attr, +	&dev_attr_status.attr, +	&dev_attr_capabilities.attr, +	&dev_attr_resources.attr,  	NULL  }; @@ -225,23 +225,23 @@ static struct attribute_group err_inject_attr_group = {  	.name = "err_inject"  };  /* Add/Remove err_inject interface for CPU device */ -static int __cpuinit err_inject_add_dev(struct sys_device * sys_dev) +static int err_inject_add_dev(struct device *sys_dev)  {  	return sysfs_create_group(&sys_dev->kobj, &err_inject_attr_group);  } -static int __cpuinit err_inject_remove_dev(struct sys_device * sys_dev) +static int err_inject_remove_dev(struct device *sys_dev)  {  	sysfs_remove_group(&sys_dev->kobj, &err_inject_attr_group);  	return 0;  } -static int __cpuinit err_inject_cpu_callback(struct notifier_block *nfb, +static int err_inject_cpu_callback(struct notifier_block *nfb,  		unsigned long action, void *hcpu)  {  	unsigned int cpu = (unsigned long)hcpu; -	struct sys_device *sys_dev; +	struct device *sys_dev; -	sys_dev = get_cpu_sysdev(cpu); +	sys_dev = get_cpu_device(cpu);  	switch (action) {  	case CPU_ONLINE:  	case CPU_ONLINE_FROZEN: @@ -256,7 +256,7 @@ static int __cpuinit err_inject_cpu_callback(struct notifier_block *nfb,  	return NOTIFY_OK;  } -static struct notifier_block __cpuinitdata err_inject_cpu_notifier = +static struct notifier_block err_inject_cpu_notifier =  {  	.notifier_call = err_inject_cpu_callback,  }; @@ -269,12 +269,17 @@ err_inject_init(void)  #ifdef ERR_INJ_DEBUG  	printk(KERN_INFO "Enter error injection driver.\n");  #endif + +	cpu_notifier_register_begin(); +  	for_each_online_cpu(i) {  		err_inject_cpu_callback(&err_inject_cpu_notifier, CPU_ONLINE,  				(void *)(long)i);  	} -	register_hotcpu_notifier(&err_inject_cpu_notifier); +	__register_hotcpu_notifier(&err_inject_cpu_notifier); + +	cpu_notifier_register_done();  	return 0;  } @@ -283,16 +288,22 @@ static void __exit  err_inject_exit(void)  {  	int i; -	struct sys_device *sys_dev; +	struct device *sys_dev;  #ifdef ERR_INJ_DEBUG  	printk(KERN_INFO "Exit error injection driver.\n");  #endif + +	cpu_notifier_register_begin(); +  	for_each_online_cpu(i) { -		sys_dev = get_cpu_sysdev(i); +		sys_dev = get_cpu_device(i);  		sysfs_remove_group(&sys_dev->kobj, &err_inject_attr_group);  	} -	unregister_hotcpu_notifier(&err_inject_cpu_notifier); + +	__unregister_hotcpu_notifier(&err_inject_cpu_notifier); + +	cpu_notifier_register_done();  }  module_init(err_inject_init); diff --git a/arch/ia64/kernel/fsys.S b/arch/ia64/kernel/fsys.S index 331d42bda77..abc6dee3799 100644 --- a/arch/ia64/kernel/fsys.S +++ b/arch/ia64/kernel/fsys.S @@ -21,7 +21,6 @@  #include <asm/thread_info.h>  #include <asm/sal.h>  #include <asm/signal.h> -#include <asm/system.h>  #include <asm/unistd.h>  #include "entry.h" @@ -91,53 +90,6 @@ ENTRY(fsys_getpid)  	FSYS_RETURN  END(fsys_getpid) -ENTRY(fsys_getppid) -	.prologue -	.altrp b6 -	.body -	add r17=IA64_TASK_GROUP_LEADER_OFFSET,r16 -	;; -	ld8 r17=[r17]				// r17 = current->group_leader -	add r9=TI_FLAGS+IA64_TASK_SIZE,r16 -	;; - -	ld4 r9=[r9] -	add r17=IA64_TASK_REAL_PARENT_OFFSET,r17 // r17 = ¤t->group_leader->real_parent -	;; -	and r9=TIF_ALLWORK_MASK,r9 - -1:	ld8 r18=[r17]				// r18 = current->group_leader->real_parent -	;; -	cmp.ne p8,p0=0,r9 -	add r8=IA64_TASK_TGID_OFFSET,r18	// r8 = ¤t->group_leader->real_parent->tgid -	;; - -	/* -	 * The .acq is needed to ensure that the read of tgid has returned its data before -	 * we re-check "real_parent". -	 */ -	ld4.acq r8=[r8]				// r8 = current->group_leader->real_parent->tgid -#ifdef CONFIG_SMP -	/* -	 * Re-read current->group_leader->real_parent. -	 */ -	ld8 r19=[r17]				// r19 = current->group_leader->real_parent -(p8)	br.spnt.many fsys_fallback_syscall -	;; -	cmp.ne p6,p0=r18,r19			// did real_parent change? -	mov r19=0			// i must not leak kernel bits... -(p6)	br.cond.spnt.few 1b			// yes -> redo the read of tgid and the check -	;; -	mov r17=0			// i must not leak kernel bits... -	mov r18=0			// i must not leak kernel bits... -#else -	mov r17=0			// i must not leak kernel bits... -	mov r18=0			// i must not leak kernel bits... -	mov r19=0			// i must not leak kernel bits... -#endif -	FSYS_RETURN -END(fsys_getppid) -  ENTRY(fsys_set_tid_address)  	.prologue  	.altrp b6 @@ -174,7 +126,7 @@ ENTRY(fsys_set_tid_address)  	FSYS_RETURN  END(fsys_set_tid_address) -#if IA64_GTOD_LOCK_OFFSET !=0 +#if IA64_GTOD_SEQ_OFFSET !=0  #error fsys_gettimeofday incompatible with changes to struct fsyscall_gtod_data_t  #endif  #if IA64_ITC_JITTER_OFFSET !=0 @@ -373,175 +325,6 @@ ENTRY(fsys_clock_gettime)  END(fsys_clock_gettime)  /* - * long fsys_rt_sigprocmask (int how, sigset_t *set, sigset_t *oset, size_t sigsetsize). - */ -#if _NSIG_WORDS != 1 -# error Sorry, fsys_rt_sigprocmask() needs to be updated for _NSIG_WORDS != 1. -#endif -ENTRY(fsys_rt_sigprocmask) -	.prologue -	.altrp b6 -	.body - -	add r2=IA64_TASK_BLOCKED_OFFSET,r16 -	add r9=TI_FLAGS+IA64_TASK_SIZE,r16 -	cmp4.ltu p6,p0=SIG_SETMASK,r32 - -	cmp.ne p15,p0=r0,r34			// oset != NULL? -	tnat.nz p8,p0=r34 -	add r31=IA64_TASK_SIGHAND_OFFSET,r16 -	;; -	ld8 r3=[r2]				// read/prefetch current->blocked -	ld4 r9=[r9] -	tnat.nz.or p6,p0=r35 - -	cmp.ne.or p6,p0=_NSIG_WORDS*8,r35 -	tnat.nz.or p6,p0=r32 -(p6)	br.spnt.few .fail_einval		// fail with EINVAL -	;; -#ifdef CONFIG_SMP -	ld8 r31=[r31]				// r31 <- current->sighand -#endif -	and r9=TIF_ALLWORK_MASK,r9 -	tnat.nz.or p8,p0=r33 -	;; -	cmp.ne p7,p0=0,r9 -	cmp.eq p6,p0=r0,r33			// set == NULL? -	add r31=IA64_SIGHAND_SIGLOCK_OFFSET,r31	// r31 <- current->sighand->siglock -(p8)	br.spnt.few .fail_efault		// fail with EFAULT -(p7)	br.spnt.many fsys_fallback_syscall	// got pending kernel work... -(p6)	br.dpnt.many .store_mask		// -> short-circuit to just reading the signal mask - -	/* Argh, we actually have to do some work and _update_ the signal mask: */ - -EX(.fail_efault, probe.r.fault r33, 3)		// verify user has read-access to *set -EX(.fail_efault, ld8 r14=[r33])			// r14 <- *set -	mov r17=(1 << (SIGKILL - 1)) | (1 << (SIGSTOP - 1)) -	;; - -	RSM_PSR_I(p0, r18, r19)			// mask interrupt delivery -	andcm r14=r14,r17			// filter out SIGKILL & SIGSTOP -	mov r8=EINVAL			// default to EINVAL - -#ifdef CONFIG_SMP -	// __ticket_spin_trylock(r31) -	ld4 r17=[r31] -	;; -	mov.m ar.ccv=r17 -	extr.u r9=r17,17,15 -	adds r19=1,r17 -	extr.u r18=r17,0,15 -	;; -	cmp.eq p6,p7=r9,r18 -	;; -(p6)	cmpxchg4.acq r9=[r31],r19,ar.ccv -(p6)	dep.z r20=r19,1,15		// next serving ticket for unlock -(p7)	br.cond.spnt.many .lock_contention -	;; -	cmp4.eq p0,p7=r9,r17 -	adds r31=2,r31 -(p7)	br.cond.spnt.many .lock_contention -	ld8 r3=[r2]			// re-read current->blocked now that we hold the lock -	;; -#else -	ld8 r3=[r2]			// re-read current->blocked now that we hold the lock -#endif -	add r18=IA64_TASK_PENDING_OFFSET+IA64_SIGPENDING_SIGNAL_OFFSET,r16 -	add r19=IA64_TASK_SIGNAL_OFFSET,r16 -	cmp4.eq p6,p0=SIG_BLOCK,r32 -	;; -	ld8 r19=[r19]			// r19 <- current->signal -	cmp4.eq p7,p0=SIG_UNBLOCK,r32 -	cmp4.eq p8,p0=SIG_SETMASK,r32 -	;; -	ld8 r18=[r18]			// r18 <- current->pending.signal -	.pred.rel.mutex p6,p7,p8 -(p6)	or r14=r3,r14			// SIG_BLOCK -(p7)	andcm r14=r3,r14		// SIG_UNBLOCK - -(p8)	mov r14=r14			// SIG_SETMASK -(p6)	mov r8=0			// clear error code -	// recalc_sigpending() -	add r17=IA64_SIGNAL_GROUP_STOP_COUNT_OFFSET,r19 - -	add r19=IA64_SIGNAL_SHARED_PENDING_OFFSET+IA64_SIGPENDING_SIGNAL_OFFSET,r19 -	;; -	ld4 r17=[r17]		// r17 <- current->signal->group_stop_count -(p7)	mov r8=0		// clear error code - -	ld8 r19=[r19]		// r19 <- current->signal->shared_pending -	;; -	cmp4.gt p6,p7=r17,r0	// p6/p7 <- (current->signal->group_stop_count > 0)? -(p8)	mov r8=0		// clear error code - -	or r18=r18,r19		// r18 <- current->pending | current->signal->shared_pending -	;; -	// r18 <- (current->pending | current->signal->shared_pending) & ~current->blocked: -	andcm r18=r18,r14 -	add r9=TI_FLAGS+IA64_TASK_SIZE,r16 -	;; - -(p7)	cmp.ne.or.andcm p6,p7=r18,r0		// p6/p7 <- signal pending -	mov r19=0					// i must not leak kernel bits... -(p6)	br.cond.dpnt.many .sig_pending -	;; - -1:	ld4 r17=[r9]				// r17 <- current->thread_info->flags -	;; -	mov ar.ccv=r17 -	and r18=~_TIF_SIGPENDING,r17		// r18 <- r17 & ~(1 << TIF_SIGPENDING) -	;; - -	st8 [r2]=r14				// update current->blocked with new mask -	cmpxchg4.acq r8=[r9],r18,ar.ccv		// current->thread_info->flags <- r18 -	;; -	cmp.ne p6,p0=r17,r8			// update failed? -(p6)	br.cond.spnt.few 1b			// yes -> retry - -#ifdef CONFIG_SMP -	// __ticket_spin_unlock(r31) -	st2.rel [r31]=r20 -	mov r20=0					// i must not leak kernel bits... -#endif -	SSM_PSR_I(p0, p9, r31) -	;; - -	srlz.d					// ensure psr.i is set again -	mov r18=0					// i must not leak kernel bits... - -.store_mask: -EX(.fail_efault, (p15) probe.w.fault r34, 3)	// verify user has write-access to *oset -EX(.fail_efault, (p15) st8 [r34]=r3) -	mov r2=0					// i must not leak kernel bits... -	mov r3=0					// i must not leak kernel bits... -	mov r8=0				// return 0 -	mov r9=0					// i must not leak kernel bits... -	mov r14=0					// i must not leak kernel bits... -	mov r17=0					// i must not leak kernel bits... -	mov r31=0					// i must not leak kernel bits... -	FSYS_RETURN - -.sig_pending: -#ifdef CONFIG_SMP -	// __ticket_spin_unlock(r31) -	st2.rel [r31]=r20			// release the lock -#endif -	SSM_PSR_I(p0, p9, r17) -	;; -	srlz.d -	br.sptk.many fsys_fallback_syscall	// with signal pending, do the heavy-weight syscall - -#ifdef CONFIG_SMP -.lock_contention: -	/* Rather than spinning here, fall back on doing a heavy-weight syscall.  */ -	SSM_PSR_I(p0, p9, r17) -	;; -	srlz.d -	br.sptk.many fsys_fallback_syscall -#endif -END(fsys_rt_sigprocmask) - -/*   * fsys_getcpu doesn't use the third parameter in this implementation. It reads   * current_thread_info()->cpu and corresponding node in cpu_to_node_map.   */ @@ -560,11 +343,15 @@ ENTRY(fsys_getcpu)  	;;  	tnat.nz p7,p0 = r33			// I guard against NaT argument  (p7)    br.cond.spnt.few .fail_einval		// B +	;; +	cmp.ne p6,p0=r32,r0 +	cmp.ne p7,p0=r33,r0 +	;;  #ifdef CONFIG_NUMA  	movl r17=cpu_to_node_map  	;; -EX(.fail_efault, probe.w.fault r32, 3)		// M This takes 5 cycles -EX(.fail_efault, probe.w.fault r33, 3)		// M This takes 5 cycles +EX(.fail_efault, (p6) probe.w.fault r32, 3)		// M This takes 5 cycles +EX(.fail_efault, (p7) probe.w.fault r33, 3)		// M This takes 5 cycles  	shladd r18=r3,1,r17  	;;  	ld2 r20=[r18]				// r20 = cpu_to_node_map[cpu] @@ -574,20 +361,20 @@ EX(.fail_efault, probe.w.fault r33, 3)		// M This takes 5 cycles  (p8)	br.spnt.many fsys_fallback_syscall  	;;  	;; -EX(.fail_efault, st4 [r32] = r3) -EX(.fail_efault, st2 [r33] = r20) +EX(.fail_efault, (p6) st4 [r32] = r3) +EX(.fail_efault, (p7) st2 [r33] = r20)  	mov r8=0  	;;  #else -EX(.fail_efault, probe.w.fault r32, 3)		// M This takes 5 cycles -EX(.fail_efault, probe.w.fault r33, 3)		// M This takes 5 cycles +EX(.fail_efault, (p6) probe.w.fault r32, 3)		// M This takes 5 cycles +EX(.fail_efault, (p7) probe.w.fault r33, 3)		// M This takes 5 cycles  	and r2 = TIF_ALLWORK_MASK,r2  	;;  	cmp.ne p8,p0=0,r2  (p8)	br.spnt.many fsys_fallback_syscall  	;; -EX(.fail_efault, st4 [r32] = r3) -EX(.fail_efault, st2 [r33] = r0) +EX(.fail_efault, (p6) st4 [r32] = r3) +EX(.fail_efault, (p7) st2 [r33] = r0)  	mov r8=0  	;;  #endif @@ -695,7 +482,7 @@ GLOBAL_ENTRY(paravirt_fsys_bubble_down)  	nop.i 0  	;;  	mov ar.rsc=0				// M2   set enforced lazy mode, pl 0, LE, loadrs=0 -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	MOV_FROM_ITC(p0, p6, r30, r23)		// M    get cycle for accounting  #else  	nop.m 0 @@ -721,7 +508,7 @@ GLOBAL_ENTRY(paravirt_fsys_bubble_down)  	cmp.ne pKStk,pUStk=r0,r0		// A    set pKStk <- 0, pUStk <- 1  	br.call.sptk.many b7=ia64_syscall_setup	// B  	;; -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	// mov.m r30=ar.itc is called in advance  	add r16=TI_AC_STAMP+IA64_TASK_SIZE,r2  	add r17=TI_AC_LEAVE+IA64_TASK_SIZE,r2 @@ -780,7 +567,7 @@ paravirt_fsyscall_table:  	data8 0				// chown  	data8 0				// lseek		// 1040  	data8 fsys_getpid		// getpid -	data8 fsys_getppid		// getppid +	data8 0				// getppid  	data8 0				// mount  	data8 0				// umount  	data8 0				// setuid		// 1045 @@ -917,7 +704,7 @@ paravirt_fsyscall_table:  	data8 0				// sigaltstack  	data8 0				// rt_sigaction  	data8 0				// rt_sigpending -	data8 fsys_rt_sigprocmask	// rt_sigprocmask +	data8 0				// rt_sigprocmask  	data8 0				// rt_sigqueueinfo	// 1180  	data8 0				// rt_sigreturn  	data8 0				// rt_sigsuspend diff --git a/arch/ia64/kernel/fsyscall_gtod_data.h b/arch/ia64/kernel/fsyscall_gtod_data.h index 57d2ee6c83e..146b15b5fec 100644 --- a/arch/ia64/kernel/fsyscall_gtod_data.h +++ b/arch/ia64/kernel/fsyscall_gtod_data.h @@ -6,7 +6,7 @@   */  struct fsyscall_gtod_data_t { -	seqlock_t	lock; +	seqcount_t	seq;  	struct timespec	wall_time;  	struct timespec monotonic_time;  	cycle_t		clk_mask; diff --git a/arch/ia64/kernel/ftrace.c b/arch/ia64/kernel/ftrace.c index 7fc8c961b1f..3b0c2aa0785 100644 --- a/arch/ia64/kernel/ftrace.c +++ b/arch/ia64/kernel/ftrace.c @@ -198,9 +198,7 @@ int ftrace_update_ftrace_func(ftrace_func_t func)  }  /* run from kstop_machine */ -int __init ftrace_dyn_arch_init(void *data) +int __init ftrace_dyn_arch_init(void)  { -	*(unsigned long *)data = 0; -  	return 0;  } diff --git a/arch/ia64/kernel/gate.S b/arch/ia64/kernel/gate.S index 245d3e1ec7e..b5f8bdd8618 100644 --- a/arch/ia64/kernel/gate.S +++ b/arch/ia64/kernel/gate.S @@ -11,8 +11,9 @@  #include <asm/errno.h>  #include <asm/asm-offsets.h>  #include <asm/sigcontext.h> -#include <asm/system.h>  #include <asm/unistd.h> +#include <asm/kregs.h> +#include <asm/page.h>  #include "paravirt_inst.h"  /* diff --git a/arch/ia64/kernel/gate.lds.S b/arch/ia64/kernel/gate.lds.S index d32b0855110..e518f7902af 100644 --- a/arch/ia64/kernel/gate.lds.S +++ b/arch/ia64/kernel/gate.lds.S @@ -5,8 +5,7 @@   * its layout.   */ - -#include <asm/system.h> +#include <asm/page.h>  #include "paravirt_patchlist.h"  SECTIONS diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S index 17a9fba3893..a4acddad0c7 100644 --- a/arch/ia64/kernel/head.S +++ b/arch/ia64/kernel/head.S @@ -30,7 +30,6 @@  #include <asm/pgtable.h>  #include <asm/processor.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/mca_asm.h>  #include <linux/init.h>  #include <linux/linkage.h> @@ -260,7 +259,7 @@ start_ap:  	 * Switch into virtual mode:  	 */  	movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \ -		  |IA64_PSR_DI|IA64_PSR_AC) +		  |IA64_PSR_DI)  	;;  	mov cr.ipsr=r16  	movl r17=1f @@ -417,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 @@ -427,7 +424,6 @@ hypervisor_type:  hypervisor_setup_hooks:  	data8		default_setup_hook -	data8		xen_setup_hook  num_hypervisor_hooks = (. - hypervisor_setup_hooks) / 8  	.previous @@ -1036,7 +1032,7 @@ END(ia64_delay_loop)   * Return a CPU-local timestamp in nano-seconds.  This timestamp is   * NOT synchronized across CPUs its return value must never be   * compared against the values returned on another CPU.  The usage in - * kernel/sched.c ensures that. + * kernel/sched/core.c ensures that.   *   * The return-value of sched_clock() is NOT supposed to wrap-around.   * If it did, it would cause some scheduling hiccups (at the worst). @@ -1074,7 +1070,7 @@ END(ia64_native_sched_clock)  sched_clock = ia64_native_sched_clock  #endif -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  GLOBAL_ENTRY(cycle_to_cputime)  	alloc r16=ar.pfs,1,0,0,0  	addl r8=THIS_CPU(ia64_cpu_info) + IA64_CPUINFO_NSEC_PER_CYC_OFFSET,r0 @@ -1092,20 +1088,7 @@ GLOBAL_ENTRY(cycle_to_cputime)  	shrp r8=r9,r8,IA64_NSEC_PER_CYC_SHIFT  	br.ret.sptk.many rp  END(cycle_to_cputime) -#endif /* CONFIG_VIRT_CPU_ACCOUNTING */ - -GLOBAL_ENTRY(start_kernel_thread) -	.prologue -	.save rp, r0				// this is the end of the call-chain -	.body -	alloc r2 = ar.pfs, 0, 0, 2, 0 -	mov out0 = r9 -	mov out1 = r11;; -	br.call.sptk.many rp = kernel_thread_helper;; -	mov out0 = r8 -	br.call.sptk.many rp = sys_exit;; -1:	br.sptk.few 1b				// not reached -END(start_kernel_thread) +#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */  #ifdef CONFIG_IA64_BRL_EMU diff --git a/arch/ia64/kernel/ia64_ksyms.c b/arch/ia64/kernel/ia64_ksyms.c index 7f4a0ed2415..5b7791dd396 100644 --- a/arch/ia64/kernel/ia64_ksyms.c +++ b/arch/ia64/kernel/ia64_ksyms.c @@ -12,7 +12,7 @@ EXPORT_SYMBOL(memset);  EXPORT_SYMBOL(memcpy);  EXPORT_SYMBOL(strlen); -#include<asm/pgtable.h> +#include <asm/pgtable.h>  EXPORT_SYMBOL_GPL(empty_zero_page);  #include <asm/checksum.h> diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index 22c38404f53..cd44a57c73b 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c @@ -76,7 +76,7 @@   *	PCI pin -> global system interrupt (GSI) -> IA-64 vector <-> IRQ   *   * Note: The term "IRQ" is loosely used everywhere in Linux kernel to - * describeinterrupts.  Now we use "IRQ" only for Linux IRQ's.  ISA IRQ + * describe interrupts.  Now we use "IRQ" only for Linux IRQ's.  ISA IRQ   * (isa_irq) is the only exception in this source code.   */ @@ -98,7 +98,6 @@  #include <asm/machvec.h>  #include <asm/processor.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #undef DEBUG_INTERRUPT_ROUTING @@ -148,7 +147,7 @@ static struct iosapic_intr_info {  	unsigned char	trigger	: 1;	/* trigger mode (see iosapic.h) */  } iosapic_intr_info[NR_IRQS]; -static unsigned char pcat_compat __devinitdata;	/* 8259 compatibility flag */ +static unsigned char pcat_compat;	/* 8259 compatibility flag */  static inline void  iosapic_write(struct iosapic *iosapic, unsigned int reg, u32 val) @@ -257,7 +256,7 @@ set_rte (unsigned int gsi, unsigned int irq, unsigned int dest, int mask)  }  static void -nop (unsigned int irq) +nop (struct irq_data *data)  {  	/* do nothing... */  } @@ -287,8 +286,9 @@ kexec_disable_iosapic(void)  #endif  static void -mask_irq (unsigned int irq) +mask_irq (struct irq_data *data)  { +	unsigned int irq = data->irq;  	u32 low32;  	int rte_index;  	struct iosapic_rte_info *rte; @@ -305,8 +305,9 @@ mask_irq (unsigned int irq)  }  static void -unmask_irq (unsigned int irq) +unmask_irq (struct irq_data *data)  { +	unsigned int irq = data->irq;  	u32 low32;  	int rte_index;  	struct iosapic_rte_info *rte; @@ -323,9 +324,11 @@ unmask_irq (unsigned int irq)  static int -iosapic_set_affinity(unsigned int irq, const struct cpumask *mask) +iosapic_set_affinity(struct irq_data *data, const struct cpumask *mask, +		     bool force)  {  #ifdef CONFIG_SMP +	unsigned int irq = data->irq;  	u32 high32, low32;  	int cpu, dest, rte_index;  	int redir = (irq & IA64_IRQ_REDIRECTED) ? 1 : 0; @@ -379,32 +382,33 @@ iosapic_set_affinity(unsigned int irq, const struct cpumask *mask)   */  static unsigned int -iosapic_startup_level_irq (unsigned int irq) +iosapic_startup_level_irq (struct irq_data *data)  { -	unmask_irq(irq); +	unmask_irq(data);  	return 0;  }  static void -iosapic_unmask_level_irq (unsigned int irq) +iosapic_unmask_level_irq (struct irq_data *data)  { +	unsigned int irq = data->irq;  	ia64_vector vec = irq_to_vector(irq);  	struct iosapic_rte_info *rte;  	int do_unmask_irq = 0;  	irq_complete_move(irq); -	if (unlikely(irq_desc[irq].status & IRQ_MOVE_PENDING)) { +	if (unlikely(irqd_is_setaffinity_pending(data))) {  		do_unmask_irq = 1; -		mask_irq(irq); +		mask_irq(data);  	} else -		unmask_irq(irq); +		unmask_irq(data);  	list_for_each_entry(rte, &iosapic_intr_info[irq].rtes, rte_list)  		iosapic_eoi(rte->iosapic->addr, vec);  	if (unlikely(do_unmask_irq)) { -		move_masked_irq(irq); -		unmask_irq(irq); +		irq_move_masked_irq(data); +		unmask_irq(data);  	}  } @@ -414,15 +418,15 @@ iosapic_unmask_level_irq (unsigned int irq)  #define iosapic_ack_level_irq		nop  static struct irq_chip irq_type_iosapic_level = { -	.name =		"IO-SAPIC-level", -	.startup =	iosapic_startup_level_irq, -	.shutdown =	iosapic_shutdown_level_irq, -	.enable =	iosapic_enable_level_irq, -	.disable =	iosapic_disable_level_irq, -	.ack =		iosapic_ack_level_irq, -	.mask =		mask_irq, -	.unmask =	iosapic_unmask_level_irq, -	.set_affinity =	iosapic_set_affinity +	.name =			"IO-SAPIC-level", +	.irq_startup =		iosapic_startup_level_irq, +	.irq_shutdown =		iosapic_shutdown_level_irq, +	.irq_enable =		iosapic_enable_level_irq, +	.irq_disable =		iosapic_disable_level_irq, +	.irq_ack =		iosapic_ack_level_irq, +	.irq_mask =		mask_irq, +	.irq_unmask =		iosapic_unmask_level_irq, +	.irq_set_affinity =	iosapic_set_affinity  };  /* @@ -430,9 +434,9 @@ static struct irq_chip irq_type_iosapic_level = {   */  static unsigned int -iosapic_startup_edge_irq (unsigned int irq) +iosapic_startup_edge_irq (struct irq_data *data)  { -	unmask_irq(irq); +	unmask_irq(data);  	/*  	 * IOSAPIC simply drops interrupts pended while the  	 * corresponding pin was masked, so we can't know if an @@ -442,37 +446,25 @@ iosapic_startup_edge_irq (unsigned int irq)  }  static void -iosapic_ack_edge_irq (unsigned int irq) +iosapic_ack_edge_irq (struct irq_data *data)  { -	struct irq_desc *idesc = irq_desc + irq; - -	irq_complete_move(irq); -	move_native_irq(irq); -	/* -	 * Once we have recorded IRQ_PENDING already, we can mask the -	 * interrupt for real. This prevents IRQ storms from unhandled -	 * devices. -	 */ -	if ((idesc->status & (IRQ_PENDING|IRQ_DISABLED)) == -	    (IRQ_PENDING|IRQ_DISABLED)) -		mask_irq(irq); +	irq_complete_move(data->irq); +	irq_move_irq(data);  }  #define iosapic_enable_edge_irq		unmask_irq  #define iosapic_disable_edge_irq	nop -#define iosapic_end_edge_irq		nop  static struct irq_chip irq_type_iosapic_edge = { -	.name =		"IO-SAPIC-edge", -	.startup =	iosapic_startup_edge_irq, -	.shutdown =	iosapic_disable_edge_irq, -	.enable =	iosapic_enable_edge_irq, -	.disable =	iosapic_disable_edge_irq, -	.ack =		iosapic_ack_edge_irq, -	.end =		iosapic_end_edge_irq, -	.mask =		mask_irq, -	.unmask =	unmask_irq, -	.set_affinity =	iosapic_set_affinity +	.name =			"IO-SAPIC-edge", +	.irq_startup =		iosapic_startup_edge_irq, +	.irq_shutdown =		iosapic_disable_edge_irq, +	.irq_enable =		iosapic_enable_edge_irq, +	.irq_disable =		iosapic_disable_edge_irq, +	.irq_ack =		iosapic_ack_edge_irq, +	.irq_mask =		mask_irq, +	.irq_unmask =		unmask_irq, +	.irq_set_affinity =	iosapic_set_affinity  };  static unsigned int @@ -562,8 +554,7 @@ static int  register_intr (unsigned int gsi, int irq, unsigned char delivery,  	       unsigned long polarity, unsigned long trigger)  { -	struct irq_desc *idesc; -	struct irq_chip *irq_type; +	struct irq_chip *chip, *irq_type;  	int index;  	struct iosapic_rte_info *rte; @@ -610,19 +601,18 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery,  	irq_type = iosapic_get_irq_chip(trigger); -	idesc = irq_desc + irq; -	if (irq_type != NULL && idesc->chip != irq_type) { -		if (idesc->chip != &no_irq_chip) +	chip = irq_get_chip(irq); +	if (irq_type != NULL && chip != irq_type) { +		if (chip != &no_irq_chip)  			printk(KERN_WARNING  			       "%s: changing vector %d from %s to %s\n",  			       __func__, irq_to_vector(irq), -			       idesc->chip->name, irq_type->name); -		idesc->chip = irq_type; +			       chip->name, irq_type->name); +		chip = irq_type;  	} -	if (trigger == IOSAPIC_EDGE) -		__set_irq_handler_unlocked(irq, handle_edge_irq); -	else -		__set_irq_handler_unlocked(irq, handle_level_irq); +	__irq_set_chip_handler_name_locked(irq, chip, trigger == IOSAPIC_EDGE ? +					   handle_edge_irq : handle_level_irq, +					   NULL);  	return 0;  } @@ -732,6 +722,7 @@ iosapic_register_intr (unsigned int gsi,  	struct iosapic_rte_info *rte;  	u32 low32;  	unsigned char dmode; +	struct irq_desc *desc;  	/*  	 * If this GSI has already been registered (i.e., it's a @@ -744,7 +735,7 @@ iosapic_register_intr (unsigned int gsi,  		rte = find_rte(irq, gsi);  		if(iosapic_intr_info[irq].count == 0) {  			assign_irq_vector(irq); -			dynamic_irq_init(irq); +			irq_init_desc(irq);  		} else if (rte->refcnt != NO_REF_RTE) {  			rte->refcnt++;  			goto unlock_iosapic_lock; @@ -759,12 +750,13 @@ iosapic_register_intr (unsigned int gsi,  			goto unlock_iosapic_lock;  	} -	raw_spin_lock(&irq_desc[irq].lock); +	desc = irq_to_desc(irq); +	raw_spin_lock(&desc->lock);  	dest = get_target_cpu(gsi, irq);  	dmode = choose_dmode();  	err = register_intr(gsi, irq, dmode, polarity, trigger);  	if (err < 0) { -		raw_spin_unlock(&irq_desc[irq].lock); +		raw_spin_unlock(&desc->lock);  		irq = err;  		goto unlock_iosapic_lock;  	} @@ -783,7 +775,7 @@ iosapic_register_intr (unsigned int gsi,  	       (polarity == IOSAPIC_POL_HIGH ? "high" : "low"),  	       cpu_logical_id(dest), dest, irq_to_vector(irq)); -	raw_spin_unlock(&irq_desc[irq].lock); +	raw_spin_unlock(&desc->lock);   unlock_iosapic_lock:  	spin_unlock_irqrestore(&iosapic_lock, flags);  	return irq; @@ -794,7 +786,6 @@ iosapic_unregister_intr (unsigned int gsi)  {  	unsigned long flags;  	int irq, index; -	struct irq_desc *idesc;  	u32 low32;  	unsigned long trigger, polarity;  	unsigned int dest; @@ -824,7 +815,6 @@ iosapic_unregister_intr (unsigned int gsi)  	if (--rte->refcnt > 0)  		goto out; -	idesc = irq_desc + irq;  	rte->refcnt = NO_REF_RTE;  	/* Mask the interrupt */ @@ -848,7 +838,7 @@ iosapic_unregister_intr (unsigned int gsi)  	if (iosapic_intr_info[irq].count == 0) {  #ifdef CONFIG_SMP  		/* Clear affinity */ -		cpumask_setall(idesc->affinity); +		cpumask_setall(irq_get_irq_data(irq)->affinity);  #endif  		/* Clear the interrupt information */  		iosapic_intr_info[irq].dest = 0; @@ -924,10 +914,8 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi,  /*   * ACPI calls this when it finds an entry for a legacy ISA IRQ override.   */ -void __devinit -iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi, -			  unsigned long polarity, -			  unsigned long trigger) +void iosapic_override_isa_irq(unsigned int isa_irq, unsigned int gsi, +			      unsigned long polarity, unsigned long trigger)  {  	int vector, irq;  	unsigned int dest = cpu_physical_id(smp_processor_id()); @@ -1022,8 +1010,27 @@ iosapic_check_gsi_range (unsigned int gsi_base, unsigned int ver)  	return 0;  } -int __devinit -iosapic_init (unsigned long phys_addr, unsigned int gsi_base) +static int +iosapic_delete_rte(unsigned int irq, unsigned int gsi) +{ +	struct iosapic_rte_info *rte, *temp; + +	list_for_each_entry_safe(rte, temp, &iosapic_intr_info[irq].rtes, +								rte_list) { +		if (rte->iosapic->gsi_base + rte->rte_index == gsi) { +			if (rte->refcnt) +				return -EBUSY; + +			list_del(&rte->rte_list); +			kfree(rte); +			return 0; +		} +	} + +	return -EINVAL; +} + +int iosapic_init(unsigned long phys_addr, unsigned int gsi_base)  {  	int num_rte, err, index;  	unsigned int isa_irq, ver; @@ -1080,11 +1087,9 @@ iosapic_init (unsigned long phys_addr, unsigned int gsi_base)  	return 0;  } -#ifdef CONFIG_HOTPLUG -int -iosapic_remove (unsigned int gsi_base) +int iosapic_remove(unsigned int gsi_base)  { -	int index, err = 0; +	int i, irq, index, err = 0;  	unsigned long flags;  	spin_lock_irqsave(&iosapic_lock, flags); @@ -1102,17 +1107,25 @@ iosapic_remove (unsigned int gsi_base)  		goto out;  	} +	for (i = gsi_base; i < gsi_base + iosapic_lists[index].num_rte; i++) { +		irq = __gsi_to_irq(i); +		if (irq < 0) +			continue; + +		err = iosapic_delete_rte(irq, i); +		if (err) +			goto out; +	} +  	iounmap(iosapic_lists[index].addr);  	iosapic_free(index);   out:  	spin_unlock_irqrestore(&iosapic_lock, flags);  	return err;  } -#endif /* CONFIG_HOTPLUG */  #ifdef CONFIG_NUMA -void __devinit -map_iosapic_to_node(unsigned int gsi_base, int node) +void map_iosapic_to_node(unsigned int gsi_base, int node)  {  	int index; diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c index 94ee9d067cb..f2c41828113 100644 --- a/arch/ia64/kernel/irq.c +++ b/arch/ia64/kernel/irq.c @@ -23,6 +23,8 @@  #include <linux/interrupt.h>  #include <linux/kernel_stat.h> +#include <asm/mca.h> +  /*   * 'what should we do if we get a hw irq event on an illegal vector'.   * each architecture has to answer this themselves. @@ -53,47 +55,9 @@ atomic_t irq_err_count;  /*   * /proc/interrupts printing:   */ - -int show_interrupts(struct seq_file *p, void *v) +int arch_show_interrupts(struct seq_file *p, int prec)  { -	int i = *(loff_t *) v, j; -	struct irqaction * action; -	unsigned long flags; - -	if (i == 0) { -		char cpuname[16]; -		seq_printf(p, "     "); -		for_each_online_cpu(j) { -			snprintf(cpuname, 10, "CPU%d", j); -			seq_printf(p, "%10s ", cpuname); -		} -		seq_putc(p, '\n'); -	} - -	if (i < NR_IRQS) { -		raw_spin_lock_irqsave(&irq_desc[i].lock, flags); -		action = irq_desc[i].action; -		if (!action) -			goto skip; -		seq_printf(p, "%3d: ",i); -#ifndef CONFIG_SMP -		seq_printf(p, "%10u ", kstat_irqs(i)); -#else -		for_each_online_cpu(j) { -			seq_printf(p, "%10u ", kstat_irqs_cpu(i, j)); -		} -#endif -		seq_printf(p, " %14s", irq_desc[i].chip->name); -		seq_printf(p, "  %s", action->name); - -		for (action=action->next; action; action = action->next) -			seq_printf(p, ", %s", action->name); - -		seq_putc(p, '\n'); -skip: -		raw_spin_unlock_irqrestore(&irq_desc[i].lock, flags); -	} else if (i == NR_IRQS) -		seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); +	seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));  	return 0;  } @@ -103,7 +67,7 @@ static char irq_redir [NR_IRQS]; // = { [0 ... NR_IRQS-1] = 1 };  void set_irq_affinity_info (unsigned int irq, int hwid, int redir)  {  	if (irq < NR_IRQS) { -		cpumask_copy(irq_desc[irq].affinity, +		cpumask_copy(irq_get_irq_data(irq)->affinity,  			     cpumask_of(cpu_logical_id(hwid)));  		irq_redir[irq] = (char) (redir & 0xff);  	} @@ -121,6 +85,12 @@ bool is_affinity_mask_valid(const struct cpumask *cpumask)  #endif /* CONFIG_SMP */ +int __init arch_early_irq_init(void) +{ +	ia64_mca_irq_init(); +	return 0; +} +  #ifdef CONFIG_HOTPLUG_CPU  unsigned int vectors_in_migration[NR_IRQS]; @@ -130,13 +100,14 @@ unsigned int vectors_in_migration[NR_IRQS];   */  static void migrate_irqs(void)  { -	struct irq_desc *desc;  	int 		irq, new_cpu;  	for (irq=0; irq < NR_IRQS; irq++) { -		desc = irq_desc + irq; +		struct irq_desc *desc = irq_to_desc(irq); +		struct irq_data *data = irq_desc_get_irq_data(desc); +		struct irq_chip *chip = irq_data_get_irq_chip(data); -		if (desc->status == IRQ_DISABLED) +		if (irqd_irq_disabled(data))  			continue;  		/* @@ -145,10 +116,10 @@ static void migrate_irqs(void)  		 * tell CPU not to respond to these local intr sources.  		 * such as ITV,CPEI,MCA etc.  		 */ -		if (desc->status == IRQ_PER_CPU) +		if (irqd_is_per_cpu(data))  			continue; -		if (cpumask_any_and(irq_desc[irq].affinity, cpu_online_mask) +		if (cpumask_any_and(data->affinity, cpu_online_mask)  		    >= nr_cpu_ids) {  			/*  			 * Save it for phase 2 processing @@ -160,16 +131,16 @@ static void migrate_irqs(void)  			/*  			 * Al three are essential, currently WARN_ON.. maybe panic?  			 */ -			if (desc->chip && desc->chip->disable && -				desc->chip->enable && desc->chip->set_affinity) { -				desc->chip->disable(irq); -				desc->chip->set_affinity(irq, -							 cpumask_of(new_cpu)); -				desc->chip->enable(irq); +			if (chip && chip->irq_disable && +				chip->irq_enable && chip->irq_set_affinity) { +				chip->irq_disable(data); +				chip->irq_set_affinity(data, +						       cpumask_of(new_cpu), false); +				chip->irq_enable(data);  			} else { -				WARN_ON((!(desc->chip) || !(desc->chip->disable) || -						!(desc->chip->enable) || -						!(desc->chip->set_affinity))); +				WARN_ON((!chip || !chip->irq_disable || +					 !chip->irq_enable || +					 !chip->irq_set_affinity));  			}  		}  	} diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c index 9a26015c3e5..03ea78ed64a 100644 --- a/arch/ia64/kernel/irq_ia64.c +++ b/arch/ia64/kernel/irq_ia64.c @@ -23,7 +23,6 @@  #include <linux/ioport.h>  #include <linux/kernel_stat.h>  #include <linux/ptrace.h> -#include <linux/random.h>	/* for rand_initialize_irq() */  #include <linux/signal.h>  #include <linux/smp.h>  #include <linux/threads.h> @@ -31,6 +30,7 @@  #include <linux/irq.h>  #include <linux/ratelimit.h>  #include <linux/acpi.h> +#include <linux/sched.h>  #include <asm/delay.h>  #include <asm/intrinsics.h> @@ -38,7 +38,6 @@  #include <asm/hw_irq.h>  #include <asm/machvec.h>  #include <asm/pgtable.h> -#include <asm/system.h>  #include <asm/tlbflush.h>  #ifdef CONFIG_PERFMON @@ -94,14 +93,6 @@ static int irq_status[NR_IRQS] = {  	[0 ... NR_IRQS -1] = IRQ_UNUSED  }; -int check_irq_used(int irq) -{ -	if (irq_status[irq] == IRQ_USED) -		return 1; - -	return -1; -} -  static inline int find_unassigned_irq(void)  {  	int irq; @@ -117,7 +108,7 @@ static inline int find_unassigned_vector(cpumask_t domain)  	cpumask_t mask;  	int pos, vector; -	cpus_and(mask, domain, cpu_online_map); +	cpumask_and(&mask, &domain, cpu_online_mask);  	if (cpus_empty(mask))  		return -EINVAL; @@ -140,7 +131,7 @@ static int __bind_irq_vector(int irq, int vector, cpumask_t domain)  	BUG_ON((unsigned)irq >= NR_IRQS);  	BUG_ON((unsigned)vector >= IA64_NUM_VECTORS); -	cpus_and(mask, domain, cpu_online_map); +	cpumask_and(&mask, &domain, cpu_online_mask);  	if (cpus_empty(mask))  		return -EINVAL;  	if ((cfg->vector == vector) && cpus_equal(cfg->domain, domain)) @@ -178,7 +169,7 @@ static void __clear_irq_vector(int irq)  	BUG_ON(cfg->vector == IRQ_VECTOR_UNASSIGNED);  	vector = cfg->vector;  	domain = cfg->domain; -	cpus_and(mask, cfg->domain, cpu_online_map); +	cpumask_and(&mask, &cfg->domain, cpu_online_mask);  	for_each_cpu_mask(cpu, mask)  		per_cpu(vector_irq, cpu)[vector] = -1;  	cfg->vector = IRQ_VECTOR_UNASSIGNED; @@ -321,7 +312,7 @@ void irq_complete_move(unsigned irq)  	if (unlikely(cpu_isset(smp_processor_id(), cfg->old_domain)))  		return; -	cpus_and(cleanup_mask, cfg->old_domain, cpu_online_map); +	cpumask_and(&cleanup_mask, &cfg->old_domain, cpu_online_mask);  	cfg->move_cleanup_count = cpus_weight(cleanup_mask);  	for_each_cpu_mask(i, cleanup_mask)  		platform_send_ipi(i, IA64_IRQ_MOVE_VECTOR, IA64_IPI_DM_INT, 0); @@ -343,7 +334,7 @@ static irqreturn_t smp_irq_move_cleanup_interrupt(int irq, void *dev_id)  		if (irq < 0)  			continue; -		desc = irq_desc + irq; +		desc = irq_to_desc(irq);  		cfg = irq_cfg + irq;  		raw_spin_lock(&desc->lock);  		if (!cfg->move_cleanup_count) @@ -365,7 +356,6 @@ static irqreturn_t smp_irq_move_cleanup_interrupt(int irq, void *dev_id)  static struct irqaction irq_move_irqaction = {  	.handler =	smp_irq_move_cleanup_interrupt, -	.flags =	IRQF_DISABLED,  	.name =		"irq_move"  }; @@ -392,8 +382,7 @@ void destroy_and_reserve_irq(unsigned int irq)  {  	unsigned long flags; -	dynamic_irq_cleanup(irq); - +	irq_init_desc(irq);  	spin_lock_irqsave(&vector_lock, flags);  	__clear_irq_vector(irq);  	irq_status[irq] = IRQ_RSVD; @@ -426,13 +415,13 @@ int create_irq(void)   out:  	spin_unlock_irqrestore(&vector_lock, flags);  	if (irq >= 0) -		dynamic_irq_init(irq); +		irq_init_desc(irq);  	return irq;  }  void destroy_irq(unsigned int irq)  { -	dynamic_irq_cleanup(irq); +	irq_init_desc(irq);  	clear_irq_vector(irq);  } @@ -490,13 +479,13 @@ ia64_handle_irq (ia64_vector vector, struct pt_regs *regs)  	ia64_srlz_d();  	while (vector != IA64_SPURIOUS_INT_VECTOR) {  		int irq = local_vector_to_irq(vector); -		struct irq_desc *desc = irq_to_desc(irq);  		if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) {  			smp_local_flush_tlb(); -			kstat_incr_irqs_this_cpu(irq, desc); +			kstat_incr_irq_this_cpu(irq);  		} else if (unlikely(IS_RESCHEDULE(vector))) { -			kstat_incr_irqs_this_cpu(irq, desc); +			scheduler_ipi(); +			kstat_incr_irq_this_cpu(irq);  		} else {  			ia64_setreg(_IA64_REG_CR_TPR, vector);  			ia64_srlz_d(); @@ -549,13 +538,12 @@ void ia64_process_pending_intr(void)  	  */  	while (vector != IA64_SPURIOUS_INT_VECTOR) {  		int irq = local_vector_to_irq(vector); -		struct irq_desc *desc = irq_to_desc(irq);  		if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) {  			smp_local_flush_tlb(); -			kstat_incr_irqs_this_cpu(irq, desc); +			kstat_incr_irq_this_cpu(irq);  		} else if (unlikely(IS_RESCHEDULE(vector))) { -			kstat_incr_irqs_this_cpu(irq, desc); +			kstat_incr_irq_this_cpu(irq);  		} else {  			struct pt_regs *old_regs = set_irq_regs(NULL); @@ -602,7 +590,6 @@ static irqreturn_t dummy_handler (int irq, void *dev_id)  static struct irqaction ipi_irqaction = {  	.handler =	handle_IPI, -	.flags =	IRQF_DISABLED,  	.name =		"IPI"  }; @@ -611,13 +598,11 @@ static struct irqaction ipi_irqaction = {   */  static struct irqaction resched_irqaction = {  	.handler =	dummy_handler, -	.flags =	IRQF_DISABLED,  	.name =		"resched"  };  static struct irqaction tlb_irqaction = {  	.handler =	dummy_handler, -	.flags =	IRQF_DISABLED,  	.name =		"tlb_flush"  }; @@ -626,17 +611,15 @@ static struct irqaction tlb_irqaction = {  void  ia64_native_register_percpu_irq (ia64_vector vec, struct irqaction *action)  { -	struct irq_desc *desc;  	unsigned int irq;  	irq = vec;  	BUG_ON(bind_irq_vector(irq, vec, CPU_MASK_ALL)); -	desc = irq_desc + irq; -	desc->status |= IRQ_PER_CPU; -	desc->chip = &irq_type_ia64_lsapic; +	irq_set_status_flags(irq, IRQ_PER_CPU); +	irq_set_chip(irq, &irq_type_ia64_lsapic);  	if (action)  		setup_irq(irq, action); -	set_irq_handler(irq, handle_percpu_irq); +	irq_set_handler(irq, handle_percpu_irq);  }  void __init diff --git a/arch/ia64/kernel/irq_lsapic.c b/arch/ia64/kernel/irq_lsapic.c index fc1549d4564..1b3a776e516 100644 --- a/arch/ia64/kernel/irq_lsapic.c +++ b/arch/ia64/kernel/irq_lsapic.c @@ -15,31 +15,30 @@  #include <linux/irq.h>  static unsigned int -lsapic_noop_startup (unsigned int irq) +lsapic_noop_startup (struct irq_data *data)  {  	return 0;  }  static void -lsapic_noop (unsigned int irq) +lsapic_noop (struct irq_data *data)  {  	/* nothing to do... */  } -static int lsapic_retrigger(unsigned int irq) +static int lsapic_retrigger(struct irq_data *data)  { -	ia64_resend_irq(irq); +	ia64_resend_irq(data->irq);  	return 1;  }  struct irq_chip irq_type_ia64_lsapic = { -	.name =		"LSAPIC", -	.startup =	lsapic_noop_startup, -	.shutdown =	lsapic_noop, -	.enable =	lsapic_noop, -	.disable =	lsapic_noop, -	.ack =		lsapic_noop, -	.end =		lsapic_noop, -	.retrigger =	lsapic_retrigger, +	.name =			"LSAPIC", +	.irq_startup =		lsapic_noop_startup, +	.irq_shutdown =		lsapic_noop, +	.irq_enable =		lsapic_noop, +	.irq_disable =		lsapic_noop, +	.irq_ack =		lsapic_noop, +	.irq_retrigger =	lsapic_retrigger,  }; diff --git a/arch/ia64/kernel/ivt.S b/arch/ia64/kernel/ivt.S index d93e396bf59..18e794a5724 100644 --- a/arch/ia64/kernel/ivt.S +++ b/arch/ia64/kernel/ivt.S @@ -54,12 +54,11 @@  #include <asm/pgtable.h>  #include <asm/processor.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/thread_info.h>  #include <asm/unistd.h>  #include <asm/errno.h> -#if 1 +#if 0  # define PSR_DEFAULT_BITS	psr.ac  #else  # define PSR_DEFAULT_BITS	0 @@ -785,7 +784,7 @@ ENTRY(break_fault)  (p8)	adds r28=16,r28				// A    switch cr.iip to next bundle  (p9)	adds r8=1,r8				// A    increment ei to next slot -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	;;  	mov b6=r30				// I0   setup syscall handler branch reg early  #else @@ -802,7 +801,7 @@ ENTRY(break_fault)  	//  ///////////////////////////////////////////////////////////////////////  	st1 [r16]=r0				// M2|3 clear current->thread.on_ustack flag -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	MOV_FROM_ITC(p0, p14, r30, r18)		// M    get cycle for accounting  #else  	mov b6=r30				// I0   setup syscall handler branch reg early @@ -818,7 +817,7 @@ ENTRY(break_fault)  	cmp.eq p14,p0=r9,r0			// A    are syscalls being traced/audited?  	br.call.sptk.many b7=ia64_syscall_setup	// B  1: -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  	// mov.m r30=ar.itc is called in advance, and r13 is current  	add r16=TI_AC_STAMP+IA64_TASK_SIZE,r13	// A  	add r17=TI_AC_LEAVE+IA64_TASK_SIZE,r13	// A @@ -1044,7 +1043,7 @@ END(ia64_syscall_setup)  	DBG_FAULT(16)  	FAULT(16) -#if defined(CONFIG_VIRT_CPU_ACCOUNTING) && defined(__IA64_ASM_PARAVIRTUALIZED_NATIVE) +#if defined(CONFIG_VIRT_CPU_ACCOUNTING_NATIVE) && defined(__IA64_ASM_PARAVIRTUALIZED_NATIVE)  	/*  	 * There is no particular reason for this code to be here, other than  	 * that there happens to be space here that would go unused otherwise. diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c index 7026b29e277..074fde49c9e 100644 --- a/arch/ia64/kernel/kprobes.c +++ b/arch/ia64/kernel/kprobes.c @@ -423,7 +423,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)  {  	struct kretprobe_instance *ri = NULL;  	struct hlist_head *head, empty_rp; -	struct hlist_node *node, *tmp; +	struct hlist_node *tmp;  	unsigned long flags, orig_ret_address = 0;  	unsigned long trampoline_address =  		((struct fnptr *)kretprobe_trampoline)->ip; @@ -444,7 +444,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)  	 *       real return address, and all the rest will point to  	 *       kretprobe_trampoline  	 */ -	hlist_for_each_entry_safe(ri, node, tmp, head, hlist) { +	hlist_for_each_entry_safe(ri, tmp, head, hlist) {  		if (ri->task != current)  			/* another task is sharing our hash bucket */  			continue; @@ -461,7 +461,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)  	regs->cr_iip = orig_ret_address; -	hlist_for_each_entry_safe(ri, node, tmp, head, hlist) { +	hlist_for_each_entry_safe(ri, tmp, head, hlist) {  		if (ri->task != current)  			/* another task is sharing our hash bucket */  			continue; @@ -487,7 +487,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)  	kretprobe_hash_unlock(current, &flags);  	preempt_enable_no_resched(); -	hlist_for_each_entry_safe(ri, node, tmp, &empty_rp, hlist) { +	hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {  		hlist_del(&ri->hlist);  		kfree(ri);  	} @@ -947,7 +947,7 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)  	case KPROBE_HIT_SSDONE:  		/*  		 * We increment the nmissed count for accounting, -		 * we can also use npre/npostfault count for accouting +		 * we can also use npre/npostfault count for accounting  		 * these specific fault cases.  		 */  		kprobes_inc_nmissed_count(cur); diff --git a/arch/ia64/kernel/machine_kexec.c b/arch/ia64/kernel/machine_kexec.c index 3d3aeef4694..5151a649c96 100644 --- a/arch/ia64/kernel/machine_kexec.c +++ b/arch/ia64/kernel/machine_kexec.c @@ -27,11 +27,11 @@  #include <asm/sal.h>  #include <asm/mca.h> -typedef NORET_TYPE void (*relocate_new_kernel_t)( +typedef void (*relocate_new_kernel_t)(  					unsigned long indirection_page,  					unsigned long start_address,  					struct ia64_boot_param *boot_param, -					unsigned long pal_addr) ATTRIB_NORET; +					unsigned long pal_addr) __noreturn;  struct kimage *ia64_kimage; @@ -85,12 +85,13 @@ static void ia64_machine_kexec(struct unw_frame_info *info, void *arg)  	struct kimage *image = arg;  	relocate_new_kernel_t rnk;  	void *pal_addr = efi_get_pal_addr(); -	unsigned long code_addr = (unsigned long)page_address(image->control_code_page); +	unsigned long code_addr;  	int ii;  	u64 fp, gp;  	ia64_fptr_t *init_handler = (ia64_fptr_t *)ia64_os_init_on_kdump;  	BUG_ON(!image); +	code_addr = (unsigned long)page_address(image->control_code_page);  	if (image->type == KEXEC_TYPE_CRASH) {  		crash_save_this_cpu();  		current->thread.ksp = (__u64)info->sw - 16; @@ -157,7 +158,7 @@ void arch_crash_save_vmcoreinfo(void)  #endif  #ifdef CONFIG_PGTABLE_3  	VMCOREINFO_CONFIG(PGTABLE_3); -#elif  CONFIG_PGTABLE_4 +#elif defined(CONFIG_PGTABLE_4)  	VMCOREINFO_CONFIG(PGTABLE_4);  #endif  } diff --git a/arch/ia64/kernel/machvec.c b/arch/ia64/kernel/machvec.c index d41a40ef80c..f5a1e5246b3 100644 --- a/arch/ia64/kernel/machvec.c +++ b/arch/ia64/kernel/machvec.c @@ -1,7 +1,6 @@  #include <linux/module.h>  #include <linux/dma-mapping.h>  #include <asm/machvec.h> -#include <asm/system.h>  #ifdef CONFIG_IA64_GENERIC diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index 1753f6a30d5..db7b36bb068 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c @@ -92,7 +92,6 @@  #include <asm/meminit.h>  #include <asm/page.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/sal.h>  #include <asm/mca.h>  #include <asm/kexec.h> @@ -218,7 +217,7 @@ void ia64_mca_printk(const char *fmt, ...)  	/* Copy the output into mlogbuf */  	if (oops_in_progress) {  		/* mlogbuf was abandoned, use printk directly instead. */ -		printk(temp_buf); +		printk("%s", temp_buf);  	} else {  		spin_lock(&mlogbuf_wlock);  		for (p = temp_buf; *p; p++) { @@ -269,7 +268,7 @@ void ia64_mlogbuf_dump(void)  		}  		*p = '\0';  		if (temp_buf[0]) -			printk(temp_buf); +			printk("%s", temp_buf);  		mlogbuf_start = index;  		mlogbuf_timestamp = 0; @@ -582,6 +581,8 @@ out:  	/* Get the CPE error record and log it */  	ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CPE); +	local_irq_disable(); +  	return IRQ_HANDLED;  } @@ -630,7 +631,7 @@ ia64_mca_register_cpev (int cpev)   * Outputs   *	None   */ -void __cpuinit +void  ia64_mca_cmc_vector_setup (void)  {  	cmcv_reg_t	cmcv; @@ -1445,6 +1446,8 @@ out:  	/* Get the CMC error record and log it */  	ia64_mca_log_sal_error_record(SAL_INFO_TYPE_CMC); +	local_irq_disable(); +  	return IRQ_HANDLED;  } @@ -1511,7 +1514,8 @@ static void  ia64_mca_cmc_poll (unsigned long dummy)  {  	/* Trigger a CMC interrupt cascade  */ -	platform_send_ipi(first_cpu(cpu_online_map), IA64_CMCP_VECTOR, IA64_IPI_DM_INT, 0); +	platform_send_ipi(cpumask_first(cpu_online_mask), IA64_CMCP_VECTOR, +							IA64_IPI_DM_INT, 0);  }  /* @@ -1587,7 +1591,8 @@ static void  ia64_mca_cpe_poll (unsigned long dummy)  {  	/* Trigger a CPE interrupt cascade  */ -	platform_send_ipi(first_cpu(cpu_online_map), IA64_CPEP_VECTOR, IA64_IPI_DM_INT, 0); +	platform_send_ipi(cpumask_first(cpu_online_mask), IA64_CPEP_VECTOR, +							IA64_IPI_DM_INT, 0);  }  #endif /* CONFIG_ACPI */ @@ -1767,38 +1772,32 @@ __setup("disable_cpe_poll", ia64_mca_disable_cpe_polling);  static struct irqaction cmci_irqaction = {  	.handler =	ia64_mca_cmc_int_handler, -	.flags =	IRQF_DISABLED,  	.name =		"cmc_hndlr"  };  static struct irqaction cmcp_irqaction = {  	.handler =	ia64_mca_cmc_int_caller, -	.flags =	IRQF_DISABLED,  	.name =		"cmc_poll"  };  static struct irqaction mca_rdzv_irqaction = {  	.handler =	ia64_mca_rendez_int_handler, -	.flags =	IRQF_DISABLED,  	.name =		"mca_rdzv"  };  static struct irqaction mca_wkup_irqaction = {  	.handler =	ia64_mca_wakeup_int_handler, -	.flags =	IRQF_DISABLED,  	.name =		"mca_wkup"  };  #ifdef CONFIG_ACPI  static struct irqaction mca_cpe_irqaction = {  	.handler =	ia64_mca_cpe_int_handler, -	.flags =	IRQF_DISABLED,  	.name =		"cpe_hndlr"  };  static struct irqaction mca_cpep_irqaction = {  	.handler =	ia64_mca_cpe_int_caller, -	.flags =	IRQF_DISABLED,  	.name =		"cpe_poll"  };  #endif /* CONFIG_ACPI */ @@ -1809,7 +1808,7 @@ static struct irqaction mca_cpep_irqaction = {   * format most of the fields.   */ -static void __cpuinit +static void  format_mca_init_stack(void *mca_data, unsigned long offset,  		const char *type, int cpu)  { @@ -1839,7 +1838,7 @@ static void * __init_refok mca_bootmem(void)  }  /* Do per-CPU MCA-related initialization.  */ -void __cpuinit +void  ia64_mca_cpu_init(void *cpu_data)  {  	void *pal_vaddr; @@ -1859,7 +1858,8 @@ ia64_mca_cpu_init(void *cpu_data)  			data = mca_bootmem();  			first_time = 0;  		} else -			data = __get_free_pages(GFP_KERNEL, get_order(sz)); +			data = (void *)__get_free_pages(GFP_KERNEL, +							get_order(sz));  		if (!data)  			panic("Could not allocate MCA memory for cpu %d\n",  					cpu); @@ -1890,7 +1890,7 @@ ia64_mca_cpu_init(void *cpu_data)  							      PAGE_KERNEL));  } -static void __cpuinit ia64_mca_cmc_vector_adjust(void *dummy) +static void ia64_mca_cmc_vector_adjust(void *dummy)  {  	unsigned long flags; @@ -1900,7 +1900,7 @@ static void __cpuinit ia64_mca_cmc_vector_adjust(void *dummy)  	local_irq_restore(flags);  } -static int __cpuinit mca_cpu_callback(struct notifier_block *nfb, +static int mca_cpu_callback(struct notifier_block *nfb,  				      unsigned long action,  				      void *hcpu)  { @@ -1916,7 +1916,7 @@ static int __cpuinit mca_cpu_callback(struct notifier_block *nfb,  	return NOTIFY_OK;  } -static struct notifier_block mca_cpu_notifier __cpuinitdata = { +static struct notifier_block mca_cpu_notifier = {  	.notifier_call = mca_cpu_callback  }; @@ -2068,22 +2068,16 @@ ia64_mca_init(void)  	printk(KERN_INFO "MCA related initialization done\n");  } +  /* - * ia64_mca_late_init - * - *	Opportunity to setup things that require initialization later - *	than ia64_mca_init.  Setup a timer to poll for CPEs if the - *	platform doesn't support an interrupt driven mechanism. - * - *  Inputs  :   None - *  Outputs :   Status + * These pieces cannot be done in ia64_mca_init() because it is called before + * early_irq_init() which would wipe out our percpu irq registrations. But we + * cannot leave them until ia64_mca_late_init() because by then all the other + * processors have been brought online and have set their own CMC vectors to + * point at a non-existant action. Called from arch_early_irq_init().   */ -static int __init -ia64_mca_late_init(void) +void __init ia64_mca_irq_init(void)  { -	if (!mca_init) -		return 0; -  	/*  	 *  Configure the CMCI/P vector and handler. Interrupts for CMC are  	 *  per-processor, so AP CMC interrupts are setup in smp_callin() (smpboot.c). @@ -2102,6 +2096,23 @@ ia64_mca_late_init(void)  	/* Setup the CPEI/P handler */  	register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction);  #endif +} + +/* + * ia64_mca_late_init + * + *	Opportunity to setup things that require initialization later + *	than ia64_mca_init.  Setup a timer to poll for CPEs if the + *	platform doesn't support an interrupt driven mechanism. + * + *  Inputs  :   None + *  Outputs :   Status + */ +static int __init +ia64_mca_late_init(void) +{ +	if (!mca_init) +		return 0;  	register_hotcpu_notifier(&mca_cpu_notifier); @@ -2122,7 +2133,6 @@ ia64_mca_late_init(void)  	cpe_poll_timer.function = ia64_mca_cpe_poll;  	{ -		struct irq_desc *desc;  		unsigned int irq;  		if (cpe_vector >= 0) { @@ -2130,8 +2140,7 @@ ia64_mca_late_init(void)  			irq = local_vector_to_irq(cpe_vector);  			if (irq > 0) {  				cpe_poll_enabled = 0; -				desc = irq_desc + irq; -				desc->status |= IRQ_PER_CPU; +				irq_set_status_flags(irq, IRQ_PER_CPU);  				setup_irq(irq, &mca_cpe_irqaction);  				ia64_cpe_irq = irq;  				ia64_mca_register_cpev(cpe_vector); diff --git a/arch/ia64/kernel/mca_drv.c b/arch/ia64/kernel/mca_drv.c index 09b4d6828c4..94f8bf777af 100644 --- a/arch/ia64/kernel/mca_drv.c +++ b/arch/ia64/kernel/mca_drv.c @@ -28,7 +28,6 @@  #include <asm/machvec.h>  #include <asm/page.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/sal.h>  #include <asm/mca.h> @@ -159,7 +158,8 @@ mca_handler_bh(unsigned long paddr, void *iip, unsigned long ipsr)  	ia64_mlogbuf_dump();  	printk(KERN_ERR "OS_MCA: process [cpu %d, pid: %d, uid: %d, "  		"iip: %p, psr: 0x%lx,paddr: 0x%lx](%s) encounters MCA.\n", -	       raw_smp_processor_id(), current->pid, current_uid(), +	       raw_smp_processor_id(), current->pid, +		from_kuid(&init_user_ns, current_uid()),  		iip, ipsr, paddr, current->comm);  	spin_lock(&mca_bh_lock); @@ -349,7 +349,7 @@ init_record_index_pools(void)  	/* - 3 - */  	slidx_pool.max_idx = (rec_max_size/sect_min_size) * 2 + 1; -	slidx_pool.buffer = (slidx_list_t *) +	slidx_pool.buffer =  		kmalloc(slidx_pool.max_idx * sizeof(slidx_list_t), GFP_KERNEL);  	return slidx_pool.buffer ? 0 : -ENOMEM; diff --git a/arch/ia64/kernel/minstate.h b/arch/ia64/kernel/minstate.h index d56753a1163..cc82a7d744c 100644 --- a/arch/ia64/kernel/minstate.h +++ b/arch/ia64/kernel/minstate.h @@ -4,7 +4,7 @@  #include "entry.h"  #include "paravirt_inst.h" -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  /* read ar.itc in advance, and use it before leaving bank 0 */  #define ACCOUNT_GET_STAMP				\  (pUStk) mov.m r20=ar.itc; diff --git a/arch/ia64/kernel/module.c b/arch/ia64/kernel/module.c index 1481b0a28ca..24603be24c1 100644 --- a/arch/ia64/kernel/module.c +++ b/arch/ia64/kernel/module.c @@ -304,14 +304,6 @@ plt_target (struct plt_entry *plt)  #endif /* !USE_BRL */ -void * -module_alloc (unsigned long size) -{ -	if (!size) -		return NULL; -	return vmalloc(size); -} -  void  module_free (struct module *mod, void *module_region)  { @@ -853,14 +845,6 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind  	return 0;  } -int -apply_relocate (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symindex, -		unsigned int relsec, struct module *mod) -{ -	printk(KERN_ERR "module %s: REL relocs in section %u unsupported\n", mod->name, relsec); -	return -ENOEXEC; -} -  /*   * Modules contain a single unwind table which covers both the core and the init text   * sections but since the two are not contiguous, we need to split this table up such that diff --git a/arch/ia64/kernel/msi_ia64.c b/arch/ia64/kernel/msi_ia64.c index 00b19a416ea..c430f9198d1 100644 --- a/arch/ia64/kernel/msi_ia64.c +++ b/arch/ia64/kernel/msi_ia64.c @@ -12,15 +12,13 @@  static struct irq_chip	ia64_msi_chip;  #ifdef CONFIG_SMP -static int ia64_set_msi_irq_affinity(unsigned int irq, -				      const cpumask_t *cpu_mask) +static int ia64_set_msi_irq_affinity(struct irq_data *idata, +				     const cpumask_t *cpu_mask, bool force)  {  	struct msi_msg msg;  	u32 addr, data; -	int cpu = first_cpu(*cpu_mask); - -	if (!cpu_online(cpu)) -		return -1; +	int cpu = cpumask_first_and(cpu_mask, cpu_online_mask); +	unsigned int irq = idata->irq;  	if (irq_prepare_move(irq, cpu))  		return -1; @@ -38,7 +36,7 @@ static int ia64_set_msi_irq_affinity(unsigned int irq,  	msg.data = data;  	write_msi_msg(irq, &msg); -	cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu)); +	cpumask_copy(idata->affinity, cpumask_of(cpu));  	return 0;  } @@ -55,8 +53,8 @@ int ia64_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)  	if (irq < 0)  		return irq; -	set_irq_msi(irq, desc); -	cpus_and(mask, irq_to_domain(irq), cpu_online_map); +	irq_set_msi_desc(irq, desc); +	cpumask_and(&mask, &(irq_to_domain(irq)), cpu_online_mask);  	dest_phys_id = cpu_physical_id(first_cpu(mask));  	vector = irq_to_vector(irq); @@ -74,7 +72,7 @@ int ia64_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)  		MSI_DATA_VECTOR(vector);  	write_msi_msg(irq, &msg); -	set_irq_chip_and_handler(irq, &ia64_msi_chip, handle_edge_irq); +	irq_set_chip_and_handler(irq, &ia64_msi_chip, handle_edge_irq);  	return 0;  } @@ -84,16 +82,16 @@ void ia64_teardown_msi_irq(unsigned int irq)  	destroy_irq(irq);  } -static void ia64_ack_msi_irq(unsigned int irq) +static void ia64_ack_msi_irq(struct irq_data *data)  { -	irq_complete_move(irq); -	move_native_irq(irq); +	irq_complete_move(data->irq); +	irq_move_irq(data);  	ia64_eoi();  } -static int ia64_msi_retrigger_irq(unsigned int irq) +static int ia64_msi_retrigger_irq(struct irq_data *data)  { -	unsigned int vector = irq_to_vector(irq); +	unsigned int vector = irq_to_vector(data->irq);  	ia64_resend_irq(vector);  	return 1; @@ -103,14 +101,14 @@ static int ia64_msi_retrigger_irq(unsigned int irq)   * Generic ops used on most IA64 platforms.   */  static struct irq_chip ia64_msi_chip = { -	.name		= "PCI-MSI", -	.irq_mask	= mask_msi_irq, -	.irq_unmask	= unmask_msi_irq, -	.ack		= ia64_ack_msi_irq, +	.name			= "PCI-MSI", +	.irq_mask		= mask_msi_irq, +	.irq_unmask		= unmask_msi_irq, +	.irq_ack		= ia64_ack_msi_irq,  #ifdef CONFIG_SMP -	.set_affinity	= ia64_set_msi_irq_affinity, +	.irq_set_affinity	= ia64_set_msi_irq_affinity,  #endif -	.retrigger	= ia64_msi_retrigger_irq, +	.irq_retrigger		= ia64_msi_retrigger_irq,  }; @@ -130,16 +128,15 @@ void arch_teardown_msi_irq(unsigned int irq)  	return ia64_teardown_msi_irq(irq);  } -#ifdef CONFIG_DMAR +#ifdef CONFIG_INTEL_IOMMU  #ifdef CONFIG_SMP -static int dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) +static int dmar_msi_set_affinity(struct irq_data *data, +				 const struct cpumask *mask, bool force)  { +	unsigned int irq = data->irq;  	struct irq_cfg *cfg = irq_cfg + irq;  	struct msi_msg msg; -	int cpu = cpumask_first(mask); - -	if (!cpu_online(cpu)) -		return -1; +	int cpu = cpumask_first_and(mask, cpu_online_mask);  	if (irq_prepare_move(irq, cpu))  		return -1; @@ -152,7 +149,7 @@ static int dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask)  	msg.address_lo |= MSI_ADDR_DEST_ID_CPU(cpu_physical_id(cpu));  	dmar_msi_write(irq, &msg); -	cpumask_copy(irq_desc[irq].affinity, mask); +	cpumask_copy(data->affinity, mask);  	return 0;  } @@ -162,11 +159,11 @@ static struct irq_chip dmar_msi_type = {  	.name = "DMAR_MSI",  	.irq_unmask = dmar_msi_unmask,  	.irq_mask = dmar_msi_mask, -	.ack = ia64_ack_msi_irq, +	.irq_ack = ia64_ack_msi_irq,  #ifdef CONFIG_SMP -	.set_affinity = dmar_msi_set_affinity, +	.irq_set_affinity = dmar_msi_set_affinity,  #endif -	.retrigger = ia64_msi_retrigger_irq, +	.irq_retrigger = ia64_msi_retrigger_irq,  };  static int @@ -176,7 +173,7 @@ msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_msg *msg)  	unsigned dest;  	cpumask_t mask; -	cpus_and(mask, irq_to_domain(irq), cpu_online_map); +	cpumask_and(&mask, &(irq_to_domain(irq)), cpu_online_mask);  	dest = cpu_physical_id(first_cpu(mask));  	msg->address_hi = 0; @@ -203,9 +200,9 @@ int arch_setup_dmar_msi(unsigned int irq)  	if (ret < 0)  		return ret;  	dmar_msi_write(irq, &msg); -	set_irq_chip_and_handler_name(irq, &dmar_msi_type, handle_edge_irq, -		"edge"); +	irq_set_chip_and_handler_name(irq, &dmar_msi_type, handle_edge_irq, +				      "edge");  	return 0;  } -#endif /* CONFIG_DMAR */ +#endif /* CONFIG_INTEL_IOMMU */ diff --git a/arch/ia64/kernel/nr-irqs.c b/arch/ia64/kernel/nr-irqs.c index ee564575148..f6769cd54bd 100644 --- a/arch/ia64/kernel/nr-irqs.c +++ b/arch/ia64/kernel/nr-irqs.c @@ -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)); diff --git a/arch/ia64/kernel/numa.c b/arch/ia64/kernel/numa.c index c93420c9740..d288cde9360 100644 --- a/arch/ia64/kernel/numa.c +++ b/arch/ia64/kernel/numa.c @@ -30,7 +30,7 @@ EXPORT_SYMBOL(cpu_to_node_map);  cpumask_t node_to_cpu_mask[MAX_NUMNODES] __cacheline_aligned;  EXPORT_SYMBOL(node_to_cpu_mask); -void __cpuinit map_cpu_to_node(int cpu, int nid) +void map_cpu_to_node(int cpu, int nid)  {  	int oldnid;  	if (nid < 0) { /* just initialize by zero */ @@ -51,7 +51,7 @@ void __cpuinit map_cpu_to_node(int cpu, int nid)  	return;  } -void __cpuinit unmap_cpu_from_node(int cpu, int nid) +void unmap_cpu_from_node(int cpu, int nid)  {  	WARN_ON(!cpu_isset(cpu, node_to_cpu_mask[nid]));  	WARN_ON(cpu_to_node_map[cpu] != nid); diff --git a/arch/ia64/kernel/palinfo.c b/arch/ia64/kernel/palinfo.c index 77597e5ea60..c39c3cd3ac3 100644 --- a/arch/ia64/kernel/palinfo.c +++ b/arch/ia64/kernel/palinfo.c @@ -22,6 +22,7 @@  #include <linux/errno.h>  #include <linux/init.h>  #include <linux/proc_fs.h> +#include <linux/seq_file.h>  #include <linux/mm.h>  #include <linux/module.h>  #include <linux/efi.h> @@ -41,7 +42,7 @@ MODULE_LICENSE("GPL");  #define PALINFO_VERSION "0.5" -typedef int (*palinfo_func_t)(char*); +typedef int (*palinfo_func_t)(struct seq_file *);  typedef struct {  	const char		*name;		/* name of the proc entry */ @@ -54,7 +55,7 @@ typedef struct {   *  A bunch of string array to get pretty printing   */ -static char *cache_types[] = { +static const char *cache_types[] = {  	"",			/* not used */  	"Instruction",  	"Data", @@ -122,19 +123,16 @@ static const char *mem_attrib[]={   *	- a pointer to the end of the buffer   *   */ -static char * -bitvector_process(char *p, u64 vector) +static void bitvector_process(struct seq_file *m, u64 vector)  {  	int i,j; -	const char *units[]={ "", "K", "M", "G", "T" }; +	static const char *units[]={ "", "K", "M", "G", "T" };  	for (i=0, j=0; i < 64; i++ , j=i/10) { -		if (vector & 0x1) { -			p += sprintf(p, "%d%s ", 1 << (i-j*10), units[j]); -		} +		if (vector & 0x1) +			seq_printf(m, "%d%s ", 1 << (i-j*10), units[j]);  		vector >>= 1;  	} -	return p;  }  /* @@ -149,8 +147,7 @@ bitvector_process(char *p, u64 vector)   *	- a pointer to the end of the buffer   *   */ -static char * -bitregister_process(char *p, u64 *reg_info, int max) +static void bitregister_process(struct seq_file *m, u64 *reg_info, int max)  {  	int i, begin, skip = 0;  	u64 value = reg_info[0]; @@ -163,9 +160,9 @@ bitregister_process(char *p, u64 *reg_info, int max)  		if ((value & 0x1) == 0 && skip == 0) {  			if (begin  <= i - 2) -				p += sprintf(p, "%d-%d ", begin, i-1); +				seq_printf(m, "%d-%d ", begin, i-1);  			else -				p += sprintf(p, "%d ", i-1); +				seq_printf(m, "%d ", i-1);  			skip  = 1;  			begin = -1;  		} else if ((value & 0x1) && skip == 1) { @@ -176,19 +173,15 @@ bitregister_process(char *p, u64 *reg_info, int max)  	}  	if (begin > -1) {  		if (begin < 127) -			p += sprintf(p, "%d-127", begin); +			seq_printf(m, "%d-127", begin);  		else -			p += sprintf(p, "127"); +			seq_puts(m, "127");  	} - -	return p;  } -static int -power_info(char *page) +static int power_info(struct seq_file *m)  {  	s64 status; -	char *p = page;  	u64 halt_info_buffer[8];  	pal_power_mgmt_info_u_t *halt_info =(pal_power_mgmt_info_u_t *)halt_info_buffer;  	int i; @@ -198,26 +191,25 @@ power_info(char *page)  	for (i=0; i < 8 ; i++ ) {  		if (halt_info[i].pal_power_mgmt_info_s.im == 1) { -			p += sprintf(p,	"Power level %d:\n" -				     "\tentry_latency       : %d cycles\n" -				     "\texit_latency        : %d cycles\n" -				     "\tpower consumption   : %d mW\n" -				     "\tCache+TLB coherency : %s\n", i, -				     halt_info[i].pal_power_mgmt_info_s.entry_latency, -				     halt_info[i].pal_power_mgmt_info_s.exit_latency, -				     halt_info[i].pal_power_mgmt_info_s.power_consumption, -				     halt_info[i].pal_power_mgmt_info_s.co ? "Yes" : "No"); +			seq_printf(m, +				   "Power level %d:\n" +				   "\tentry_latency       : %d cycles\n" +				   "\texit_latency        : %d cycles\n" +				   "\tpower consumption   : %d mW\n" +				   "\tCache+TLB coherency : %s\n", i, +				   halt_info[i].pal_power_mgmt_info_s.entry_latency, +				   halt_info[i].pal_power_mgmt_info_s.exit_latency, +				   halt_info[i].pal_power_mgmt_info_s.power_consumption, +				   halt_info[i].pal_power_mgmt_info_s.co ? "Yes" : "No");  		} else { -			p += sprintf(p,"Power level %d: not implemented\n",i); +			seq_printf(m,"Power level %d: not implemented\n", i);  		}  	} -	return p - page; +	return 0;  } -static int -cache_info(char *page) +static int cache_info(struct seq_file *m)  { -	char *p = page;  	unsigned long i, levels, unique_caches;  	pal_cache_config_info_t cci;  	int j, k; @@ -228,73 +220,74 @@ cache_info(char *page)  		return 0;  	} -	p += sprintf(p, "Cache levels  : %ld\nUnique caches : %ld\n\n", levels, unique_caches); +	seq_printf(m, "Cache levels  : %ld\nUnique caches : %ld\n\n", +		   levels, unique_caches);  	for (i=0; i < levels; i++) { -  		for (j=2; j >0 ; j--) { -  			/* even without unification some level may not be present */ -			if ((status=ia64_pal_cache_config_info(i,j, &cci)) != 0) { +			if ((status=ia64_pal_cache_config_info(i,j, &cci)) != 0)  				continue; -			} -			p += sprintf(p, -				     "%s Cache level %lu:\n" -				     "\tSize           : %u bytes\n" -				     "\tAttributes     : ", -				     cache_types[j+cci.pcci_unified], i+1, -				     cci.pcci_cache_size); - -			if (cci.pcci_unified) p += sprintf(p, "Unified "); - -			p += sprintf(p, "%s\n", cache_mattrib[cci.pcci_cache_attr]); - -			p += sprintf(p, -				     "\tAssociativity  : %d\n" -				     "\tLine size      : %d bytes\n" -				     "\tStride         : %d bytes\n", -				     cci.pcci_assoc, 1<<cci.pcci_line_size, 1<<cci.pcci_stride); + +			seq_printf(m, +				   "%s Cache level %lu:\n" +				   "\tSize           : %u bytes\n" +				   "\tAttributes     : ", +				   cache_types[j+cci.pcci_unified], i+1, +				   cci.pcci_cache_size); + +			if (cci.pcci_unified) +				seq_puts(m, "Unified "); + +			seq_printf(m, "%s\n", cache_mattrib[cci.pcci_cache_attr]); + +			seq_printf(m, +				   "\tAssociativity  : %d\n" +				   "\tLine size      : %d bytes\n" +				   "\tStride         : %d bytes\n", +				   cci.pcci_assoc, +				   1<<cci.pcci_line_size, +				   1<<cci.pcci_stride);  			if (j == 1) -				p += sprintf(p, "\tStore latency  : N/A\n"); +				seq_puts(m, "\tStore latency  : N/A\n");  			else -				p += sprintf(p, "\tStore latency  : %d cycle(s)\n", -						cci.pcci_st_latency); +				seq_printf(m, "\tStore latency  : %d cycle(s)\n", +					   cci.pcci_st_latency); -			p += sprintf(p, -				     "\tLoad latency   : %d cycle(s)\n" -				     "\tStore hints    : ", cci.pcci_ld_latency); +			seq_printf(m, +				   "\tLoad latency   : %d cycle(s)\n" +				   "\tStore hints    : ", cci.pcci_ld_latency);  			for(k=0; k < 8; k++ ) {  				if ( cci.pcci_st_hints & 0x1) -					p += sprintf(p, "[%s]", cache_st_hints[k]); +					seq_printf(m, "[%s]", cache_st_hints[k]);  				cci.pcci_st_hints >>=1;  			} -			p += sprintf(p, "\n\tLoad hints     : "); +			seq_puts(m, "\n\tLoad hints     : ");  			for(k=0; k < 8; k++ ) {  				if (cci.pcci_ld_hints & 0x1) -					p += sprintf(p, "[%s]", cache_ld_hints[k]); +					seq_printf(m, "[%s]", cache_ld_hints[k]);  				cci.pcci_ld_hints >>=1;  			} -			p += sprintf(p, -				     "\n\tAlias boundary : %d byte(s)\n" -				     "\tTag LSB        : %d\n" -				     "\tTag MSB        : %d\n", -				     1<<cci.pcci_alias_boundary, cci.pcci_tag_lsb, -				     cci.pcci_tag_msb); +			seq_printf(m, +				   "\n\tAlias boundary : %d byte(s)\n" +				   "\tTag LSB        : %d\n" +				   "\tTag MSB        : %d\n", +				   1<<cci.pcci_alias_boundary, cci.pcci_tag_lsb, +				   cci.pcci_tag_msb);  			/* when unified, data(j=2) is enough */ -			if (cci.pcci_unified) break; +			if (cci.pcci_unified) +				break;  		}  	} -	return p - page; +	return 0;  } -static int -vm_info(char *page) +static int vm_info(struct seq_file *m)  { -	char *p = page;  	u64 tr_pages =0, vw_pages=0, tc_pages;  	u64 attrib;  	pal_vm_info_1_u_t vm_info_1; @@ -309,7 +302,7 @@ vm_info(char *page)  		printk(KERN_ERR "ia64_pal_vm_summary=%ld\n", status);  	} else { -		p += sprintf(p, +		seq_printf(m,  		     "Physical Address Space         : %d bits\n"  		     "Virtual Address Space          : %d bits\n"  		     "Protection Key Registers(PKR)  : %d\n" @@ -324,49 +317,49 @@ vm_info(char *page)  		     vm_info_1.pal_vm_info_1_s.hash_tag_id,  		     vm_info_2.pal_vm_info_2_s.rid_size);  		if (vm_info_2.pal_vm_info_2_s.max_purges == PAL_MAX_PURGES) -			p += sprintf(p, "unlimited\n"); +			seq_puts(m, "unlimited\n");  		else -			p += sprintf(p, "%d\n", +			seq_printf(m, "%d\n",  		     		vm_info_2.pal_vm_info_2_s.max_purges ?  				vm_info_2.pal_vm_info_2_s.max_purges : 1);  	}  	if (ia64_pal_mem_attrib(&attrib) == 0) { -		p += sprintf(p, "Supported memory attributes    : "); +		seq_puts(m, "Supported memory attributes    : ");  		sep = "";  		for (i = 0; i < 8; i++) {  			if (attrib & (1 << i)) { -				p += sprintf(p, "%s%s", sep, mem_attrib[i]); +				seq_printf(m, "%s%s", sep, mem_attrib[i]);  				sep = ", ";  			}  		} -		p += sprintf(p, "\n"); +		seq_putc(m, '\n');  	}  	if ((status = ia64_pal_vm_page_size(&tr_pages, &vw_pages)) !=0) {  		printk(KERN_ERR "ia64_pal_vm_page_size=%ld\n", status);  	} else { -		p += sprintf(p, -			     "\nTLB walker                     : %simplemented\n" -			     "Number of DTR                  : %d\n" -			     "Number of ITR                  : %d\n" -			     "TLB insertable page sizes      : ", -			     vm_info_1.pal_vm_info_1_s.vw ? "" : "not ", -			     vm_info_1.pal_vm_info_1_s.max_dtr_entry+1, -			     vm_info_1.pal_vm_info_1_s.max_itr_entry+1); +		seq_printf(m, +			   "\nTLB walker                     : %simplemented\n" +			   "Number of DTR                  : %d\n" +			   "Number of ITR                  : %d\n" +			   "TLB insertable page sizes      : ", +			   vm_info_1.pal_vm_info_1_s.vw ? "" : "not ", +			   vm_info_1.pal_vm_info_1_s.max_dtr_entry+1, +			   vm_info_1.pal_vm_info_1_s.max_itr_entry+1); +		bitvector_process(m, tr_pages); -		p = bitvector_process(p, tr_pages); +		seq_puts(m, "\nTLB purgeable page sizes       : "); -		p += sprintf(p, "\nTLB purgeable page sizes       : "); - -		p = bitvector_process(p, vw_pages); +		bitvector_process(m, vw_pages);  	} -	if ((status=ia64_get_ptce(&ptce)) != 0) { + +	if ((status = ia64_get_ptce(&ptce)) != 0) {  		printk(KERN_ERR "ia64_get_ptce=%ld\n", status);  	} else { -		p += sprintf(p, +		seq_printf(m,  		     "\nPurge base address             : 0x%016lx\n"  		     "Purge outer loop count         : %d\n"  		     "Purge inner loop count         : %d\n" @@ -375,7 +368,7 @@ vm_info(char *page)  		     ptce.base, ptce.count[0], ptce.count[1],  		     ptce.stride[0], ptce.stride[1]); -		p += sprintf(p, +		seq_printf(m,  		     "TC Levels                      : %d\n"  		     "Unique TC(s)                   : %d\n",  		     vm_info_1.pal_vm_info_1_s.num_tc_levels, @@ -385,13 +378,11 @@ vm_info(char *page)  			for (j=2; j>0 ; j--) {  				tc_pages = 0; /* just in case */ -  				/* even without unification, some levels may not be present */ -				if ((status=ia64_pal_vm_info(i,j, &tc_info, &tc_pages)) != 0) { +				if ((status=ia64_pal_vm_info(i,j, &tc_info, &tc_pages)) != 0)  					continue; -				} -				p += sprintf(p, +				seq_printf(m,  				     "\n%s Translation Cache Level %d:\n"  				     "\tHash sets           : %d\n"  				     "\tAssociativity       : %d\n" @@ -403,15 +394,15 @@ vm_info(char *page)  				     tc_info.tc_num_entries);  				if (tc_info.tc_pf) -					p += sprintf(p, "PreferredPageSizeOptimized "); +					seq_puts(m, "PreferredPageSizeOptimized ");  				if (tc_info.tc_unified) -					p += sprintf(p, "Unified "); +					seq_puts(m, "Unified ");  				if (tc_info.tc_reduce_tr) -					p += sprintf(p, "TCReduction"); +					seq_puts(m, "TCReduction"); -				p += sprintf(p, "\n\tSupported page sizes: "); +				seq_puts(m, "\n\tSupported page sizes: "); -				p = bitvector_process(p, tc_pages); +				bitvector_process(m, tc_pages);  				/* when unified date (j=2) is enough */  				if (tc_info.tc_unified) @@ -419,16 +410,14 @@ vm_info(char *page)  			}  		}  	} -	p += sprintf(p, "\n"); -	return p - page; +	seq_putc(m, '\n'); +	return 0;  } -static int -register_info(char *page) +static int register_info(struct seq_file *m)  { -	char *p = page;  	u64 reg_info[2];  	u64 info;  	unsigned long phys_stacked; @@ -442,35 +431,31 @@ register_info(char *page)  	};  	for(info=0; info < 4; info++) { - -		if (ia64_pal_register_info(info, ®_info[0], ®_info[1]) != 0) return 0; - -		p += sprintf(p, "%-32s : ", info_type[info]); - -		p = bitregister_process(p, reg_info, 128); - -		p += sprintf(p, "\n"); +		if (ia64_pal_register_info(info, ®_info[0], ®_info[1]) != 0) +			return 0; +		seq_printf(m, "%-32s : ", info_type[info]); +		bitregister_process(m, reg_info, 128); +		seq_putc(m, '\n');  	} -	if (ia64_pal_rse_info(&phys_stacked, &hints) == 0) { +	if (ia64_pal_rse_info(&phys_stacked, &hints) == 0) +		seq_printf(m, +			   "RSE stacked physical registers   : %ld\n" +			   "RSE load/store hints             : %ld (%s)\n", +			   phys_stacked, hints.ph_data, +			   hints.ph_data < RSE_HINTS_COUNT ? rse_hints[hints.ph_data]: "(??)"); -	p += sprintf(p, -		     "RSE stacked physical registers   : %ld\n" -		     "RSE load/store hints             : %ld (%s)\n", -		     phys_stacked, hints.ph_data, -		     hints.ph_data < RSE_HINTS_COUNT ? rse_hints[hints.ph_data]: "(??)"); -	}  	if (ia64_pal_debug_info(&iregs, &dregs))  		return 0; -	p += sprintf(p, -		     "Instruction debug register pairs : %ld\n" -		     "Data debug register pairs        : %ld\n", iregs, dregs); +	seq_printf(m, +		   "Instruction debug register pairs : %ld\n" +		   "Data debug register pairs        : %ld\n", iregs, dregs); -	return p - page; +	return 0;  } -static char *proc_features_0[]={		/* Feature set 0 */ +static const char *const proc_features_0[]={		/* Feature set 0 */  	NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  	NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,  	NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, @@ -502,7 +487,7 @@ static char *proc_features_0[]={		/* Feature set 0 */  	"Enable BERR promotion"  }; -static char *proc_features_16[]={		/* Feature set 16 */ +static const char *const proc_features_16[]={		/* Feature set 16 */  	"Disable ETM",  	"Enable ETM",  	"Enable MCA on half-way timer", @@ -522,7 +507,7 @@ static char *proc_features_16[]={		/* Feature set 16 */  	NULL, NULL, NULL, NULL, NULL  }; -static char **proc_features[]={ +static const char *const *const proc_features[]={  	proc_features_0,  	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  	NULL, NULL, NULL, NULL, @@ -530,11 +515,10 @@ static char **proc_features[]={  	NULL, NULL, NULL, NULL,  }; -static char * feature_set_info(char *page, u64 avail, u64 status, u64 control, -							unsigned long set) +static void feature_set_info(struct seq_file *m, u64 avail, u64 status, u64 control, +			     unsigned long set)  { -	char *p = page; -	char **vf, **v; +	const char *const *vf, *const *v;  	int i;  	vf = v = proc_features[set]; @@ -547,13 +531,13 @@ static char * feature_set_info(char *page, u64 avail, u64 status, u64 control,  		if (vf)  			v = vf + i;  		if ( v && *v ) { -			p += sprintf(p, "%-40s : %s %s\n", *v, +			seq_printf(m, "%-40s : %s %s\n", *v,  				avail & 0x1 ? (status & 0x1 ? -						"On " : "Off"): "", +					      "On " : "Off"): "",  				avail & 0x1 ? (control & 0x1 ?  						"Ctrl" : "NoCtrl"): "");  		} else { -			p += sprintf(p, "Feature set %2ld bit %2d\t\t\t" +			seq_printf(m, "Feature set %2ld bit %2d\t\t\t"  					" : %s %s\n",  				set, i,  				avail & 0x1 ? (status & 0x1 ? @@ -562,36 +546,32 @@ static char * feature_set_info(char *page, u64 avail, u64 status, u64 control,  						"Ctrl" : "NoCtrl"): "");  		}  	} -	return p;  } -static int -processor_info(char *page) +static int processor_info(struct seq_file *m)  { -	char *p = page;  	u64 avail=1, status=1, control=1, feature_set=0;  	s64 ret;  	do {  		ret = ia64_pal_proc_get_features(&avail, &status, &control,  						feature_set); -		if (ret < 0) { -			return p - page; -		} +		if (ret < 0) +			return 0; +  		if (ret == 1) {  			feature_set++;  			continue;  		} -		p = feature_set_info(p, avail, status, control, feature_set); - +		feature_set_info(m, avail, status, control, feature_set);  		feature_set++;  	} while(1); -	return p - page; +	return 0;  } -static const char *bus_features[]={ +static const char *const bus_features[]={  	NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,  	NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,  	NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, @@ -617,125 +597,118 @@ static const char *bus_features[]={  }; -static int -bus_info(char *page) +static int bus_info(struct seq_file *m)  { -	char *p = page; -	const char **v = bus_features; +	const char *const *v = bus_features;  	pal_bus_features_u_t av, st, ct;  	u64 avail, status, control;  	int i;  	s64 ret; -	if ((ret=ia64_pal_bus_get_features(&av, &st, &ct)) != 0) return 0; +	if ((ret=ia64_pal_bus_get_features(&av, &st, &ct)) != 0) +		return 0;  	avail   = av.pal_bus_features_val;  	status  = st.pal_bus_features_val;  	control = ct.pal_bus_features_val;  	for(i=0; i < 64; i++, v++, avail >>=1, status >>=1, control >>=1) { -		if ( ! *v ) continue; -		p += sprintf(p, "%-48s : %s%s %s\n", *v, -				avail & 0x1 ? "" : "NotImpl", -				avail & 0x1 ? (status  & 0x1 ? "On" : "Off"): "", -				avail & 0x1 ? (control & 0x1 ? "Ctrl" : "NoCtrl"): ""); +		if ( ! *v ) +			continue; +		seq_printf(m, "%-48s : %s%s %s\n", *v, +			   avail & 0x1 ? "" : "NotImpl", +			   avail & 0x1 ? (status  & 0x1 ? "On" : "Off"): "", +			   avail & 0x1 ? (control & 0x1 ? "Ctrl" : "NoCtrl"): "");  	} -	return p - page; +	return 0;  } -static int -version_info(char *page) +static int version_info(struct seq_file *m)  {  	pal_version_u_t min_ver, cur_ver; -	char *p = page;  	if (ia64_pal_version(&min_ver, &cur_ver) != 0)  		return 0; -	p += sprintf(p, -		     "PAL_vendor : 0x%02x (min=0x%02x)\n" -		     "PAL_A      : %02x.%02x (min=%02x.%02x)\n" -		     "PAL_B      : %02x.%02x (min=%02x.%02x)\n", -		     cur_ver.pal_version_s.pv_pal_vendor, -		     min_ver.pal_version_s.pv_pal_vendor, -		     cur_ver.pal_version_s.pv_pal_a_model, -		     cur_ver.pal_version_s.pv_pal_a_rev, -		     min_ver.pal_version_s.pv_pal_a_model, -		     min_ver.pal_version_s.pv_pal_a_rev, -		     cur_ver.pal_version_s.pv_pal_b_model, -		     cur_ver.pal_version_s.pv_pal_b_rev, -		     min_ver.pal_version_s.pv_pal_b_model, -		     min_ver.pal_version_s.pv_pal_b_rev); -	return p - page; +	seq_printf(m, +		   "PAL_vendor : 0x%02x (min=0x%02x)\n" +		   "PAL_A      : %02x.%02x (min=%02x.%02x)\n" +		   "PAL_B      : %02x.%02x (min=%02x.%02x)\n", +		   cur_ver.pal_version_s.pv_pal_vendor, +		   min_ver.pal_version_s.pv_pal_vendor, +		   cur_ver.pal_version_s.pv_pal_a_model, +		   cur_ver.pal_version_s.pv_pal_a_rev, +		   min_ver.pal_version_s.pv_pal_a_model, +		   min_ver.pal_version_s.pv_pal_a_rev, +		   cur_ver.pal_version_s.pv_pal_b_model, +		   cur_ver.pal_version_s.pv_pal_b_rev, +		   min_ver.pal_version_s.pv_pal_b_model, +		   min_ver.pal_version_s.pv_pal_b_rev); +	return 0;  } -static int -perfmon_info(char *page) +static int perfmon_info(struct seq_file *m)  { -	char *p = page;  	u64 pm_buffer[16];  	pal_perf_mon_info_u_t pm_info; -	if (ia64_pal_perf_mon_info(pm_buffer, &pm_info) != 0) return 0; - -	p += sprintf(p, -		     "PMC/PMD pairs                 : %d\n" -		     "Counter width                 : %d bits\n" -		     "Cycle event number            : %d\n" -		     "Retired event number          : %d\n" -		     "Implemented PMC               : ", -		     pm_info.pal_perf_mon_info_s.generic, pm_info.pal_perf_mon_info_s.width, -		     pm_info.pal_perf_mon_info_s.cycles, pm_info.pal_perf_mon_info_s.retired); +	if (ia64_pal_perf_mon_info(pm_buffer, &pm_info) != 0) +		return 0; -	p = bitregister_process(p, pm_buffer, 256); -	p += sprintf(p, "\nImplemented PMD               : "); -	p = bitregister_process(p, pm_buffer+4, 256); -	p += sprintf(p, "\nCycles count capable          : "); -	p = bitregister_process(p, pm_buffer+8, 256); -	p += sprintf(p, "\nRetired bundles count capable : "); +	seq_printf(m, +		   "PMC/PMD pairs                 : %d\n" +		   "Counter width                 : %d bits\n" +		   "Cycle event number            : %d\n" +		   "Retired event number          : %d\n" +		   "Implemented PMC               : ", +		   pm_info.pal_perf_mon_info_s.generic, +		   pm_info.pal_perf_mon_info_s.width, +		   pm_info.pal_perf_mon_info_s.cycles, +		   pm_info.pal_perf_mon_info_s.retired); + +	bitregister_process(m, pm_buffer, 256); +	seq_puts(m, "\nImplemented PMD               : "); +	bitregister_process(m, pm_buffer+4, 256); +	seq_puts(m, "\nCycles count capable          : "); +	bitregister_process(m, pm_buffer+8, 256); +	seq_puts(m, "\nRetired bundles count capable : ");  #ifdef CONFIG_ITANIUM  	/*  	 * PAL_PERF_MON_INFO reports that only PMC4 can be used to count CPU_CYCLES  	 * which is wrong, both PMC4 and PMD5 support it.  	 */ -	if (pm_buffer[12] == 0x10) pm_buffer[12]=0x30; +	if (pm_buffer[12] == 0x10) +		pm_buffer[12]=0x30;  #endif -	p = bitregister_process(p, pm_buffer+12, 256); - -	p += sprintf(p, "\n"); - -	return p - page; +	bitregister_process(m, pm_buffer+12, 256); +	seq_putc(m, '\n'); +	return 0;  } -static int -frequency_info(char *page) +static int frequency_info(struct seq_file *m)  { -	char *p = page;  	struct pal_freq_ratio proc, itc, bus;  	unsigned long base;  	if (ia64_pal_freq_base(&base) == -1) -		p += sprintf(p, "Output clock            : not implemented\n"); +		seq_puts(m, "Output clock            : not implemented\n");  	else -		p += sprintf(p, "Output clock            : %ld ticks/s\n", base); +		seq_printf(m, "Output clock            : %ld ticks/s\n", base);  	if (ia64_pal_freq_ratios(&proc, &bus, &itc) != 0) return 0; -	p += sprintf(p, +	seq_printf(m,  		     "Processor/Clock ratio   : %d/%d\n"  		     "Bus/Clock ratio         : %d/%d\n"  		     "ITC/Clock ratio         : %d/%d\n",  		     proc.num, proc.den, bus.num, bus.den, itc.num, itc.den); - -	return p - page; +	return 0;  } -static int -tr_info(char *page) +static int tr_info(struct seq_file *m)  { -	char *p = page;  	long status;  	pal_tr_valid_u_t tr_valid;  	u64 tr_buffer[4]; @@ -794,39 +767,40 @@ tr_info(char *page)  		ifa_reg  = (struct ifa_reg *)&tr_buffer[2]; -		if (ifa_reg->valid == 0) continue; +		if (ifa_reg->valid == 0) +			continue;  		gr_reg   = (struct gr_reg *)tr_buffer;  		itir_reg = (struct itir_reg *)&tr_buffer[1];  		rid_reg  = (struct rid_reg *)&tr_buffer[3];  		pgm	 = -1 << (itir_reg->ps - 12); -		p += sprintf(p, -			     "%cTR%lu: av=%d pv=%d dv=%d mv=%d\n" -			     "\tppn  : 0x%lx\n" -			     "\tvpn  : 0x%lx\n" -			     "\tps   : ", -			     "ID"[i], j, -			     tr_valid.pal_tr_valid_s.access_rights_valid, -			     tr_valid.pal_tr_valid_s.priv_level_valid, -			     tr_valid.pal_tr_valid_s.dirty_bit_valid, -			     tr_valid.pal_tr_valid_s.mem_attr_valid, -			     (gr_reg->ppn & pgm)<< 12, (ifa_reg->vpn & pgm)<< 12); - -		p = bitvector_process(p, 1<< itir_reg->ps); - -		p += sprintf(p, -			     "\n\tpl   : %d\n" -			     "\tar   : %d\n" -			     "\trid  : %x\n" -			     "\tp    : %d\n" -			     "\tma   : %d\n" -			     "\td    : %d\n", -			     gr_reg->pl, gr_reg->ar, rid_reg->rid, gr_reg->p, gr_reg->ma, -			     gr_reg->d); +		seq_printf(m, +			   "%cTR%lu: av=%d pv=%d dv=%d mv=%d\n" +			   "\tppn  : 0x%lx\n" +			   "\tvpn  : 0x%lx\n" +			   "\tps   : ", +			   "ID"[i], j, +			   tr_valid.pal_tr_valid_s.access_rights_valid, +			   tr_valid.pal_tr_valid_s.priv_level_valid, +			   tr_valid.pal_tr_valid_s.dirty_bit_valid, +			   tr_valid.pal_tr_valid_s.mem_attr_valid, +			   (gr_reg->ppn & pgm)<< 12, (ifa_reg->vpn & pgm)<< 12); + +		bitvector_process(m, 1<< itir_reg->ps); + +		seq_printf(m, +			   "\n\tpl   : %d\n" +			   "\tar   : %d\n" +			   "\trid  : %x\n" +			   "\tp    : %d\n" +			   "\tma   : %d\n" +			   "\td    : %d\n", +			   gr_reg->pl, gr_reg->ar, rid_reg->rid, gr_reg->p, gr_reg->ma, +			   gr_reg->d);  		}  	} -	return p - page; +	return 0;  } @@ -834,7 +808,7 @@ tr_info(char *page)  /*   * List {name,function} pairs for every entry in /proc/palinfo/cpu*   */ -static palinfo_entry_t palinfo_entries[]={ +static const palinfo_entry_t palinfo_entries[]={  	{ "version_info",	version_info, },  	{ "vm_info",		vm_info, },  	{ "cache_info",		cache_info, }, @@ -849,17 +823,6 @@ static palinfo_entry_t palinfo_entries[]={  #define NR_PALINFO_ENTRIES	(int) ARRAY_SIZE(palinfo_entries) -/* - * this array is used to keep track of the proc entries we create. This is - * required in the module mode when we need to remove all entries. The procfs code - * does not do recursion of deletion - * - * Notes: - *	- +1 accounts for the cpuN directory entry in /proc/pal - */ -#define NR_PALINFO_PROC_ENTRIES	(NR_CPUS*(NR_PALINFO_ENTRIES+1)) - -static struct proc_dir_entry *palinfo_proc_entries[NR_PALINFO_PROC_ENTRIES];  static struct proc_dir_entry *palinfo_dir;  /* @@ -887,7 +850,7 @@ typedef union {   */  typedef struct {  	palinfo_func_t	func;	/* pointer to function to call */ -	char		*page;	/* buffer to store results */ +	struct seq_file *m;	/* buffer to store results */  	int		ret;	/* return value from call */  } palinfo_smp_data_t; @@ -900,7 +863,7 @@ static void  palinfo_smp_call(void *info)  {  	palinfo_smp_data_t *data = (palinfo_smp_data_t *)info; -	data->ret = (*data->func)(data->page); +	data->ret = (*data->func)(data->m);  }  /* @@ -910,13 +873,13 @@ palinfo_smp_call(void *info)   *	otherwise how many bytes in the "page" buffer were written   */  static -int palinfo_handle_smp(pal_func_cpu_u_t *f, char *page) +int palinfo_handle_smp(struct seq_file *m, pal_func_cpu_u_t *f)  {  	palinfo_smp_data_t ptr;  	int ret;  	ptr.func = palinfo_entries[f->func_id].proc_read; -	ptr.page = page; +	ptr.m = m;  	ptr.ret  = 0; /* just in case */ @@ -930,7 +893,7 @@ int palinfo_handle_smp(pal_func_cpu_u_t *f, char *page)  }  #else /* ! CONFIG_SMP */  static -int palinfo_handle_smp(pal_func_cpu_u_t *f, char *page) +int palinfo_handle_smp(struct seq_file *m, pal_func_cpu_u_t *f)  {  	printk(KERN_ERR "palinfo: should not be called with non SMP kernel\n");  	return 0; @@ -940,94 +903,66 @@ int palinfo_handle_smp(pal_func_cpu_u_t *f, char *page)  /*   * Entry point routine: all calls go through this function   */ -static int -palinfo_read_entry(char *page, char **start, off_t off, int count, int *eof, void *data) +static int proc_palinfo_show(struct seq_file *m, void *v)  { -	int len=0; -	pal_func_cpu_u_t *f = (pal_func_cpu_u_t *)&data; +	pal_func_cpu_u_t *f = (pal_func_cpu_u_t *)&m->private;  	/*  	 * in SMP mode, we may need to call another CPU to get correct  	 * information. PAL, by definition, is processor specific  	 */  	if (f->req_cpu == get_cpu()) -		len = (*palinfo_entries[f->func_id].proc_read)(page); +		(*palinfo_entries[f->func_id].proc_read)(m);  	else -		len = palinfo_handle_smp(f, page); +		palinfo_handle_smp(m, f);  	put_cpu(); +	return 0; +} -	if (len <= off+count) *eof = 1; - -	*start = page + off; -	len   -= off; - -	if (len>count) len = count; -	if (len<0) len = 0; - -	return len; +static int proc_palinfo_open(struct inode *inode, struct file *file) +{ +	return single_open(file, proc_palinfo_show, PDE_DATA(inode));  } -static void __cpuinit +static const struct file_operations proc_palinfo_fops = { +	.open		= proc_palinfo_open, +	.read		= seq_read, +	.llseek		= seq_lseek, +	.release	= single_release, +}; + +static void  create_palinfo_proc_entries(unsigned int cpu)  { -#	define CPUSTR	"cpu%d" -  	pal_func_cpu_u_t f; -	struct proc_dir_entry **pdir;  	struct proc_dir_entry *cpu_dir;  	int j; -	char cpustr[sizeof(CPUSTR)]; - - -	/* -	 * we keep track of created entries in a depth-first order for -	 * cleanup purposes. Each entry is stored into palinfo_proc_entries -	 */ -	sprintf(cpustr,CPUSTR, cpu); +	char cpustr[3+4+1];	/* cpu numbers are up to 4095 on itanic */ +	sprintf(cpustr, "cpu%d", cpu);  	cpu_dir = proc_mkdir(cpustr, palinfo_dir); +	if (!cpu_dir) +		return;  	f.req_cpu = cpu; -	/* -	 * Compute the location to store per cpu entries -	 * We dont store the top level entry in this list, but -	 * remove it finally after removing all cpu entries. -	 */ -	pdir = &palinfo_proc_entries[cpu*(NR_PALINFO_ENTRIES+1)]; -	*pdir++ = cpu_dir;  	for (j=0; j < NR_PALINFO_ENTRIES; j++) {  		f.func_id = j; -		*pdir = create_proc_read_entry( -				palinfo_entries[j].name, 0, cpu_dir, -				palinfo_read_entry, (void *)f.value); -		pdir++; +		proc_create_data(palinfo_entries[j].name, 0, cpu_dir, +				 &proc_palinfo_fops, (void *)f.value);  	}  }  static void  remove_palinfo_proc_entries(unsigned int hcpu)  { -	int j; -	struct proc_dir_entry *cpu_dir, **pdir; - -	pdir = &palinfo_proc_entries[hcpu*(NR_PALINFO_ENTRIES+1)]; -	cpu_dir = *pdir; -	*pdir++=NULL; -	for (j=0; j < (NR_PALINFO_ENTRIES); j++) { -		if ((*pdir)) { -			remove_proc_entry ((*pdir)->name, cpu_dir); -			*pdir ++= NULL; -		} -	} - -	if (cpu_dir) { -		remove_proc_entry(cpu_dir->name, palinfo_dir); -	} +	char cpustr[3+4+1];	/* cpu numbers are up to 4095 on itanic */ +	sprintf(cpustr, "cpu%d", hcpu); +	remove_proc_subtree(cpustr, palinfo_dir);  } -static int __cpuinit palinfo_cpu_callback(struct notifier_block *nfb, +static int palinfo_cpu_callback(struct notifier_block *nfb,  					unsigned long action, void *hcpu)  {  	unsigned int hotcpu = (unsigned long)hcpu; @@ -1058,6 +993,10 @@ palinfo_init(void)  	printk(KERN_INFO "PAL Information Facility v%s\n", PALINFO_VERSION);  	palinfo_dir = proc_mkdir("pal", NULL); +	if (!palinfo_dir) +		return -ENOMEM; + +	cpu_notifier_register_begin();  	/* Create palinfo dirs in /proc for all online cpus */  	for_each_online_cpu(i) { @@ -1065,7 +1004,9 @@ palinfo_init(void)  	}  	/* Register for future delivery via notify registration */ -	register_hotcpu_notifier(&palinfo_cpu_notifier); +	__register_hotcpu_notifier(&palinfo_cpu_notifier); + +	cpu_notifier_register_done();  	return 0;  } @@ -1073,22 +1014,8 @@ palinfo_init(void)  static void __exit  palinfo_exit(void)  { -	int i = 0; - -	/* remove all nodes: depth first pass. Could optimize this  */ -	for_each_online_cpu(i) { -		remove_palinfo_proc_entries(i); -	} - -	/* -	 * Remove the top level entry finally -	 */ -	remove_proc_entry(palinfo_dir->name, NULL); - -	/* -	 * Unregister from cpu notifier callbacks -	 */  	unregister_hotcpu_notifier(&palinfo_cpu_notifier); +	remove_proc_subtree("pal", NULL);  }  module_init(palinfo_init); diff --git a/arch/ia64/kernel/paravirt.c b/arch/ia64/kernel/paravirt.c index a21d7bb9c69..1b22f6de293 100644 --- a/arch/ia64/kernel/paravirt.c +++ b/arch/ia64/kernel/paravirt.c @@ -634,6 +634,8 @@ struct pv_irq_ops pv_irq_ops = {   * pv_time_ops   * time operations   */ +struct static_key paravirt_steal_enabled; +struct static_key paravirt_steal_rq_enabled;  static int  ia64_native_do_steal_accounting(unsigned long *new_itm) diff --git a/arch/ia64/kernel/paravirt_inst.h b/arch/ia64/kernel/paravirt_inst.h index 64d6d810c64..1ad7512b5f6 100644 --- a/arch/ia64/kernel/paravirt_inst.h +++ b/arch/ia64/kernel/paravirt_inst.h @@ -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 diff --git a/arch/ia64/kernel/paravirt_patchlist.h b/arch/ia64/kernel/paravirt_patchlist.h index 0684aa6c650..67cffc3643a 100644 --- a/arch/ia64/kernel/paravirt_patchlist.h +++ b/arch/ia64/kernel/paravirt_patchlist.h @@ -20,9 +20,5 @@   *   */ -#if defined(__IA64_GATE_PARAVIRTUALIZED_XEN) -#include <asm/xen/patchlist.h> -#else  #include <asm/native/patchlist.h> -#endif diff --git a/arch/ia64/kernel/patch.c b/arch/ia64/kernel/patch.c index 68a1311db80..1cf09179371 100644 --- a/arch/ia64/kernel/patch.c +++ b/arch/ia64/kernel/patch.c @@ -11,7 +11,6 @@  #include <asm/patch.h>  #include <asm/processor.h>  #include <asm/sections.h> -#include <asm/system.h>  #include <asm/unistd.h>  /* diff --git a/arch/ia64/kernel/pci-dma.c b/arch/ia64/kernel/pci-dma.c index f6b1ff0aea7..992c1098c52 100644 --- a/arch/ia64/kernel/pci-dma.c +++ b/arch/ia64/kernel/pci-dma.c @@ -12,9 +12,8 @@  #include <asm/machvec.h>  #include <linux/dma-mapping.h> -#include <asm/system.h> -#ifdef CONFIG_DMAR +#ifdef CONFIG_INTEL_IOMMU  #include <linux/kernel.h> @@ -34,15 +33,6 @@ int force_iommu __read_mostly;  int iommu_pass_through; -/* Dummy device used for NULL arguments (normally ISA). Better would -   be probably a smaller DMA mask, but this is bug-to-bug compatible -   to i386. */ -struct device fallback_dev = { -	.init_name = "fallback device", -	.coherent_dma_mask = DMA_BIT_MASK(32), -	.dma_mask = &fallback_dev.coherent_dma_mask, -}; -  extern struct dma_map_ops intel_dma_ops;  static int __init pci_iommu_init(void) diff --git a/arch/ia64/kernel/pci-swiotlb.c b/arch/ia64/kernel/pci-swiotlb.c index d9485d952ed..939260aeac9 100644 --- a/arch/ia64/kernel/pci-swiotlb.c +++ b/arch/ia64/kernel/pci-swiotlb.c @@ -15,16 +15,24 @@ int swiotlb __read_mostly;  EXPORT_SYMBOL(swiotlb);  static void *ia64_swiotlb_alloc_coherent(struct device *dev, size_t size, -					 dma_addr_t *dma_handle, gfp_t gfp) +					 dma_addr_t *dma_handle, gfp_t gfp, +					 struct dma_attrs *attrs)  {  	if (dev->coherent_dma_mask != DMA_BIT_MASK(64))  		gfp |= GFP_DMA;  	return swiotlb_alloc_coherent(dev, size, dma_handle, gfp);  } +static void ia64_swiotlb_free_coherent(struct device *dev, size_t size, +				       void *vaddr, dma_addr_t dma_addr, +				       struct dma_attrs *attrs) +{ +	swiotlb_free_coherent(dev, size, vaddr, dma_addr); +} +  struct dma_map_ops swiotlb_dma_ops = { -	.alloc_coherent = ia64_swiotlb_alloc_coherent, -	.free_coherent = swiotlb_free_coherent, +	.alloc = ia64_swiotlb_alloc_coherent, +	.free = ia64_swiotlb_free_coherent,  	.map_page = swiotlb_map_page,  	.unmap_page = swiotlb_unmap_page,  	.map_sg = swiotlb_map_sg_attrs, diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index 39e534f5a3b..5845ffea67c 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c @@ -42,6 +42,7 @@  #include <linux/completion.h>  #include <linux/tracehook.h>  #include <linux/slab.h> +#include <linux/cpu.h>  #include <asm/errno.h>  #include <asm/intrinsics.h> @@ -49,7 +50,6 @@  #include <asm/perfmon.h>  #include <asm/processor.h>  #include <asm/signal.h> -#include <asm/system.h>  #include <asm/uaccess.h>  #include <asm/delay.h> @@ -521,7 +521,7 @@ static pmu_config_t		*pmu_conf;  pfm_sysctl_t pfm_sysctl;  EXPORT_SYMBOL(pfm_sysctl); -static ctl_table pfm_ctl_table[]={ +static struct ctl_table pfm_ctl_table[] = {  	{  		.procname	= "debug",  		.data		= &pfm_sysctl.debug, @@ -552,7 +552,7 @@ static ctl_table pfm_ctl_table[]={  	},  	{}  }; -static ctl_table pfm_sysctl_dir[] = { +static struct ctl_table pfm_sysctl_dir[] = {  	{  		.procname	= "perfmon",  		.mode		= 0555, @@ -560,7 +560,7 @@ static ctl_table pfm_sysctl_dir[] = {  	},   	{}  }; -static ctl_table pfm_sysctl_root[] = { +static struct ctl_table pfm_sysctl_root[] = {  	{  		.procname	= "kernel",  		.mode		= 0555, @@ -605,23 +605,14 @@ pfm_unprotect_ctx_ctxsw(pfm_context_t *x, unsigned long f)  	spin_unlock(&(x)->ctx_lock);  } -static inline unsigned int -pfm_do_munmap(struct mm_struct *mm, unsigned long addr, size_t len, int acct) -{ -	return do_munmap(mm, addr, len); -} - -static inline unsigned long  -pfm_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags, unsigned long exec) -{ -	return get_unmapped_area(file, addr, len, pgoff, flags); -} - +/* forward declaration */ +static const struct dentry_operations pfmfs_dentry_operations;  static struct dentry *  pfmfs_mount(struct file_system_type *fs_type, int flags, const char *dev_name, void *data)  { -	return mount_pseudo(fs_type, "pfm:", NULL, PFMFS_MAGIC); +	return mount_pseudo(fs_type, "pfm:", NULL, &pfmfs_dentry_operations, +			PFMFS_MAGIC);  }  static struct file_system_type pfm_fs_type = { @@ -629,6 +620,7 @@ static struct file_system_type pfm_fs_type = {  	.mount    = pfmfs_mount,  	.kill_sb  = kill_anon_super,  }; +MODULE_ALIAS_FS("pfmfs");  DEFINE_PER_CPU(unsigned long, pfm_syst_info);  DEFINE_PER_CPU(struct task_struct *, pmu_owner); @@ -829,10 +821,9 @@ pfm_rvmalloc(unsigned long size)  	unsigned long addr;  	size = PAGE_ALIGN(size); -	mem  = vmalloc(size); +	mem  = vzalloc(size);  	if (mem) {  		//printk("perfmon: CPU%d pfm_rvmalloc(%ld)=%p\n", smp_processor_id(), size, mem); -		memset(mem, 0, size);  		addr = (unsigned long)mem;  		while (size > 0) {  			pfm_reserve_page(addr); @@ -1332,8 +1323,6 @@ out:  }  EXPORT_SYMBOL(pfm_unregister_buffer_fmt); -extern void update_pal_halt_status(int); -  static int  pfm_reserve_session(struct task_struct *task, int is_syswide, unsigned int cpu)  { @@ -1381,9 +1370,9 @@ pfm_reserve_session(struct task_struct *task, int is_syswide, unsigned int cpu)  		cpu));  	/* -	 * disable default_idle() to go to PAL_HALT +	 * Force idle() into poll mode  	 */ -	update_pal_halt_status(0); +	cpu_idle_poll_ctrl(true);  	UNLOCK_PFS(flags); @@ -1440,11 +1429,8 @@ pfm_unreserve_session(pfm_context_t *ctx, int is_syswide, unsigned int cpu)  		is_syswide,  		cpu)); -	/* -	 * if possible, enable default_idle() to go into PAL_HALT -	 */ -	if (pfm_sessions.pfs_task_sessions == 0 && pfm_sessions.pfs_sys_sessions == 0) -		update_pal_halt_status(1); +	/* Undo forced polling. Last session reenables pal_halt */ +	cpu_idle_poll_ctrl(false);  	UNLOCK_PFS(flags); @@ -1457,8 +1443,9 @@ pfm_unreserve_session(pfm_context_t *ctx, int is_syswide, unsigned int cpu)   * a PROTECT_CTX() section.   */  static int -pfm_remove_smpl_mapping(struct task_struct *task, void *vaddr, unsigned long size) +pfm_remove_smpl_mapping(void *vaddr, unsigned long size)  { +	struct task_struct *task = current;  	int r;  	/* sanity checks */ @@ -1472,13 +1459,8 @@ pfm_remove_smpl_mapping(struct task_struct *task, void *vaddr, unsigned long siz  	/*  	 * does the actual unmapping  	 */ -	down_write(&task->mm->mmap_sem); - -	DPRINT(("down_write done smpl_vaddr=%p size=%lu\n", vaddr, size)); - -	r = pfm_do_munmap(task->mm, (unsigned long)vaddr, size, 0); +	r = vm_munmap((unsigned long)vaddr, size); -	up_write(&task->mm->mmap_sem);  	if (r !=0) {  		printk(KERN_ERR "perfmon: [%d] unable to unmap sampling buffer @%p size=%lu\n", task_pid_nr(task), vaddr, size);  	} @@ -1542,7 +1524,7 @@ pfm_exit_smpl_buffer(pfm_buffer_fmt_t *fmt)   * any operations on the root directory. However, we need a non-trivial   * d_name - pfm: will go nicely and kill the special-casing in procfs.   */ -static struct vfsmount *pfmfs_mnt; +static struct vfsmount *pfmfs_mnt __read_mostly;  static int __init  init_pfm_fs(void) @@ -1944,7 +1926,7 @@ pfm_flush(struct file *filp, fl_owner_t id)  	 * because some VM function reenables interrupts.  	 *  	 */ -	if (smpl_buf_vaddr) pfm_remove_smpl_mapping(current, smpl_buf_vaddr, smpl_buf_size); +	if (smpl_buf_vaddr) pfm_remove_smpl_mapping(smpl_buf_vaddr, smpl_buf_size);  	return 0;  } @@ -2184,12 +2166,6 @@ static const struct file_operations pfm_file_ops = {  	.flush		= pfm_flush  }; -static int -pfmfs_delete_dentry(struct dentry *dentry) -{ -	return 1; -} -  static char *pfmfs_dname(struct dentry *dentry, char *buffer, int buflen)  {  	return dynamic_dname(dentry, buffer, buflen, "pfm:[%lu]", @@ -2197,7 +2173,7 @@ static char *pfmfs_dname(struct dentry *dentry, char *buffer, int buflen)  }  static const struct dentry_operations pfmfs_dentry_operations = { -	.d_delete = pfmfs_delete_dentry, +	.d_delete = always_delete_dentry,  	.d_dname = pfmfs_dname,  }; @@ -2226,20 +2202,19 @@ pfm_alloc_file(pfm_context_t *ctx)  	/*  	 * allocate a new dcache entry  	 */ -	path.dentry = d_alloc(pfmfs_mnt->mnt_sb->s_root, &this); +	path.dentry = d_alloc(pfmfs_mnt->mnt_root, &this);  	if (!path.dentry) {  		iput(inode);  		return ERR_PTR(-ENOMEM);  	}  	path.mnt = mntget(pfmfs_mnt); -	path.dentry->d_op = &pfmfs_dentry_operations;  	d_add(path.dentry, inode);  	file = alloc_file(&path, FMODE_READ, &pfm_file_ops); -	if (!file) { +	if (IS_ERR(file)) {  		path_put(&path); -		return ERR_PTR(-ENFILE); +		return file;  	}  	file->f_flags = O_RDONLY; @@ -2322,8 +2297,8 @@ pfm_smpl_buffer_alloc(struct task_struct *task, struct file *filp, pfm_context_t  	 * partially initialize the vma for the sampling buffer  	 */  	vma->vm_mm	     = mm; -	vma->vm_file	     = filp; -	vma->vm_flags	     = VM_READ| VM_MAYREAD |VM_RESERVED; +	vma->vm_file	     = get_file(filp); +	vma->vm_flags	     = VM_READ|VM_MAYREAD|VM_DONTEXPAND|VM_DONTDUMP;  	vma->vm_page_prot    = PAGE_READONLY; /* XXX may need to change */  	/* @@ -2343,8 +2318,8 @@ pfm_smpl_buffer_alloc(struct task_struct *task, struct file *filp, pfm_context_t  	down_write(&task->mm->mmap_sem);  	/* find some free area in address space, must have mmap sem held */ -	vma->vm_start = pfm_get_unmapped_area(NULL, 0, size, 0, MAP_PRIVATE|MAP_ANONYMOUS, 0); -	if (vma->vm_start == 0UL) { +	vma->vm_start = get_unmapped_area(NULL, 0, size, 0, MAP_PRIVATE|MAP_ANONYMOUS); +	if (IS_ERR_VALUE(vma->vm_start)) {  		DPRINT(("Cannot find unmapped area for size %ld\n", size));  		up_write(&task->mm->mmap_sem);  		goto error; @@ -2361,15 +2336,12 @@ pfm_smpl_buffer_alloc(struct task_struct *task, struct file *filp, pfm_context_t  		goto error;  	} -	get_file(filp); -  	/*  	 * now insert the vma in the vm list for the process, must be  	 * done with mmap lock held  	 */  	insert_vm_struct(mm, vma); -	mm->total_vm  += size >> PAGE_SHIFT;  	vm_stat_account(vma->vm_mm, vma->vm_flags, vma->vm_file,  							vma_pages(vma));  	up_write(&task->mm->mmap_sem); @@ -2397,8 +2369,8 @@ static int  pfm_bad_permissions(struct task_struct *task)  {  	const struct cred *tcred; -	uid_t uid = current_uid(); -	gid_t gid = current_gid(); +	kuid_t uid = current_uid(); +	kgid_t gid = current_gid();  	int ret;  	rcu_read_lock(); @@ -2406,20 +2378,20 @@ pfm_bad_permissions(struct task_struct *task)  	/* inspired by ptrace_attach() */  	DPRINT(("cur: uid=%d gid=%d task: euid=%d suid=%d uid=%d egid=%d sgid=%d\n", -		uid, -		gid, -		tcred->euid, -		tcred->suid, -		tcred->uid, -		tcred->egid, -		tcred->sgid)); - -	ret = ((uid != tcred->euid) -	       || (uid != tcred->suid) -	       || (uid != tcred->uid) -	       || (gid != tcred->egid) -	       || (gid != tcred->sgid) -	       || (gid != tcred->gid)) && !capable(CAP_SYS_PTRACE); +		from_kuid(&init_user_ns, uid), +		from_kgid(&init_user_ns, gid), +		from_kuid(&init_user_ns, tcred->euid), +		from_kuid(&init_user_ns, tcred->suid), +		from_kuid(&init_user_ns, tcred->uid), +		from_kgid(&init_user_ns, tcred->egid), +		from_kgid(&init_user_ns, tcred->sgid))); + +	ret = ((!uid_eq(uid, tcred->euid)) +	       || (!uid_eq(uid, tcred->suid)) +	       || (!uid_eq(uid, tcred->uid)) +	       || (!gid_eq(gid, tcred->egid)) +	       || (!gid_eq(gid, tcred->sgid)) +	       || (!gid_eq(gid, tcred->gid))) && !capable(CAP_SYS_PTRACE);  	rcu_read_unlock();  	return ret; @@ -4799,7 +4771,7 @@ recheck:  asmlinkage long  sys_perfmonctl (int fd, int cmd, void __user *arg, int count)  { -	struct file *file = NULL; +	struct fd f = {NULL, 0};  	pfm_context_t *ctx = NULL;  	unsigned long flags = 0UL;  	void *args_k = NULL; @@ -4896,17 +4868,17 @@ restart_args:  	ret = -EBADF; -	file = fget(fd); -	if (unlikely(file == NULL)) { +	f = fdget(fd); +	if (unlikely(f.file == NULL)) {  		DPRINT(("invalid fd %d\n", fd));  		goto error_args;  	} -	if (unlikely(PFM_IS_FILE(file) == 0)) { +	if (unlikely(PFM_IS_FILE(f.file) == 0)) {  		DPRINT(("fd %d not related to perfmon\n", fd));  		goto error_args;  	} -	ctx = file->private_data; +	ctx = f.file->private_data;  	if (unlikely(ctx == NULL)) {  		DPRINT(("no context for fd %d\n", fd));  		goto error_args; @@ -4936,8 +4908,8 @@ abort_locked:  	if (call_made && PFM_CMD_RW_ARG(cmd) && copy_to_user(arg, args_k, base_sz*count)) ret = -EFAULT;  error_args: -	if (file) -		fput(file); +	if (f.file) +		fdput(f);  	kfree(args_k); @@ -5669,24 +5641,8 @@ pfm_proc_show_header(struct seq_file *m)  	list_for_each(pos, &pfm_buffer_fmt_list) {  		entry = list_entry(pos, pfm_buffer_fmt_t, fmt_list); -		seq_printf(m, "format                    : %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x %s\n", -			entry->fmt_uuid[0], -			entry->fmt_uuid[1], -			entry->fmt_uuid[2], -			entry->fmt_uuid[3], -			entry->fmt_uuid[4], -			entry->fmt_uuid[5], -			entry->fmt_uuid[6], -			entry->fmt_uuid[7], -			entry->fmt_uuid[8], -			entry->fmt_uuid[9], -			entry->fmt_uuid[10], -			entry->fmt_uuid[11], -			entry->fmt_uuid[12], -			entry->fmt_uuid[13], -			entry->fmt_uuid[14], -			entry->fmt_uuid[15], -			entry->fmt_name); +		seq_printf(m, "format                    : %16phD %s\n", +			   entry->fmt_uuid, entry->fmt_name);  	}  	spin_unlock(&pfm_buffer_fmt_lock); @@ -6431,7 +6387,6 @@ pfm_flush_pmds(struct task_struct *task, pfm_context_t *ctx)  static struct irqaction perfmon_irqaction = {  	.handler = pfm_interrupt_handler, -	.flags   = IRQF_DISABLED,  	.name    = "perfmon"  }; diff --git a/arch/ia64/kernel/perfmon_default_smpl.c b/arch/ia64/kernel/perfmon_default_smpl.c index 5f637bbfccc..30c644ea44c 100644 --- a/arch/ia64/kernel/perfmon_default_smpl.c +++ b/arch/ia64/kernel/perfmon_default_smpl.c @@ -150,7 +150,7 @@ default_handler(struct task_struct *task, void *buf, pfm_ovfl_arg_t *arg, struct  	 * current = task running at the time of the overflow.  	 *  	 * per-task mode: -	 * 	- this is ususally the task being monitored. +	 * 	- this is usually the task being monitored.  	 * 	  Under certain conditions, it might be a different task  	 *  	 * system-wide: diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c index 16f1c7b04c6..55d4ba47a90 100644 --- a/arch/ia64/kernel/process.c +++ b/arch/ia64/kernel/process.c @@ -29,6 +29,7 @@  #include <linux/kdebug.h>  #include <linux/utsname.h>  #include <linux/tracehook.h> +#include <linux/rcupdate.h>  #include <asm/cpu.h>  #include <asm/delay.h> @@ -38,6 +39,7 @@  #include <asm/pgalloc.h>  #include <asm/processor.h>  #include <asm/sal.h> +#include <asm/switch_to.h>  #include <asm/tlbflush.h>  #include <asm/uaccess.h>  #include <asm/unwind.h> @@ -53,14 +55,8 @@  void (*ia64_mark_idle)(int); -unsigned long boot_option_idle_override = 0; +unsigned long boot_option_idle_override = IDLE_NO_OVERRIDE;  EXPORT_SYMBOL(boot_option_idle_override); -unsigned long idle_halt; -EXPORT_SYMBOL(idle_halt); -unsigned long idle_nomwait; -EXPORT_SYMBOL(idle_nomwait); -void (*pm_idle) (void); -EXPORT_SYMBOL(pm_idle);  void (*pm_power_off) (void);  EXPORT_SYMBOL(pm_power_off); @@ -100,21 +96,13 @@ show_stack (struct task_struct *task, unsigned long *sp)  }  void -dump_stack (void) -{ -	show_stack(NULL, NULL); -} - -EXPORT_SYMBOL(dump_stack); - -void  show_regs (struct pt_regs *regs)  {  	unsigned long ip = regs->cr_iip + ia64_psr(regs)->ri;  	print_modules(); -	printk("\nPid: %d, CPU %d, comm: %20s\n", task_pid_nr(current), -			smp_processor_id(), current->comm); +	printk("\n"); +	show_regs_print_info(KERN_DEFAULT);  	printk("psr : %016lx ifs : %016lx ip  : [<%016lx>]    %s (%s)\n",  	       regs->cr_ipsr, regs->cr_ifs, ip, print_tainted(),  	       init_utsname()->release); @@ -199,11 +187,9 @@ do_notify_resume_user(sigset_t *unused, struct sigscratch *scr, long in_syscall)  		ia64_do_signal(scr, in_syscall);  	} -	if (test_thread_flag(TIF_NOTIFY_RESUME)) { -		clear_thread_flag(TIF_NOTIFY_RESUME); +	if (test_and_clear_thread_flag(TIF_NOTIFY_RESUME)) { +		local_irq_enable();	/* force interrupt enable */  		tracehook_notify_resume(&scr->pt); -		if (current->replacement_session_keyring) -			key_replace_session_keyring();  	}  	/* copy user rbs to kernel rbs */ @@ -215,41 +201,13 @@ do_notify_resume_user(sigset_t *unused, struct sigscratch *scr, long in_syscall)  	local_irq_disable();	/* force interrupt disable */  } -static int pal_halt        = 1; -static int can_do_pal_halt = 1; -  static int __init nohalt_setup(char * str)  { -	pal_halt = can_do_pal_halt = 0; +	cpu_idle_poll_ctrl(true);  	return 1;  }  __setup("nohalt", nohalt_setup); -void -update_pal_halt_status(int status) -{ -	can_do_pal_halt = pal_halt && status; -} - -/* - * We use this if we don't have any better idle routine.. - */ -void -default_idle (void) -{ -	local_irq_enable(); -	while (!need_resched()) { -		if (can_do_pal_halt) { -			local_irq_disable(); -			if (!need_resched()) { -				safe_halt(); -			} -			local_irq_enable(); -		} else -			cpu_relax(); -	} -} -  #ifdef CONFIG_HOTPLUG_CPU  /* We don't actually take CPU down, just spin without interrupts. */  static inline void play_dead(void) @@ -276,71 +234,29 @@ static inline void play_dead(void)  }  #endif /* CONFIG_HOTPLUG_CPU */ -static void do_nothing(void *unused) -{ -} - -/* - * cpu_idle_wait - Used to ensure that all the CPUs discard old value of - * pm_idle and update to new pm_idle value. Required while changing pm_idle - * handler on SMP systems. - * - * Caller must have changed pm_idle to the new value before the call. Old - * pm_idle value will not be used by any CPU after the return of this function. - */ -void cpu_idle_wait(void) +void arch_cpu_idle_dead(void)  { -	smp_mb(); -	/* kick all the CPUs so that they exit out of pm_idle */ -	smp_call_function(do_nothing, NULL, 1); +	play_dead();  } -EXPORT_SYMBOL_GPL(cpu_idle_wait); -void __attribute__((noreturn)) -cpu_idle (void) +void arch_cpu_idle(void)  {  	void (*mark_idle)(int) = ia64_mark_idle; -  	int cpu = smp_processor_id(); - -	/* endless idle loop with no priority at all */ -	while (1) { -		if (can_do_pal_halt) { -			current_thread_info()->status &= ~TS_POLLING; -			/* -			 * TS_POLLING-cleared state must be visible before we -			 * test NEED_RESCHED: -			 */ -			smp_mb(); -		} else { -			current_thread_info()->status |= TS_POLLING; -		} -		if (!need_resched()) { -			void (*idle)(void);  #ifdef CONFIG_SMP -			min_xtp(); +	min_xtp();  #endif -			rmb(); -			if (mark_idle) -				(*mark_idle)(1); - -			idle = pm_idle; -			if (!idle) -				idle = default_idle; -			(*idle)(); -			if (mark_idle) -				(*mark_idle)(0); +	rmb(); +	if (mark_idle) +		(*mark_idle)(1); + +	safe_halt(); + +	if (mark_idle) +		(*mark_idle)(0);  #ifdef CONFIG_SMP -			normal_xtp(); +	normal_xtp();  #endif -		} -		preempt_enable_no_resched(); -		schedule(); -		preempt_disable(); -		check_pgt_cache(); -		if (cpu_is_offline(cpu)) -			play_dead(); -	}  }  void @@ -417,72 +333,24 @@ ia64_load_extra (struct task_struct *task)  int  copy_thread(unsigned long clone_flags,  	     unsigned long user_stack_base, unsigned long user_stack_size, -	     struct task_struct *p, struct pt_regs *regs) +	     struct task_struct *p)  {  	extern char ia64_ret_from_clone;  	struct switch_stack *child_stack, *stack;  	unsigned long rbs, child_rbs, rbs_size;  	struct pt_regs *child_ptregs; +	struct pt_regs *regs = current_pt_regs();  	int retval = 0; -#ifdef CONFIG_SMP -	/* -	 * For SMP idle threads, fork_by_hand() calls do_fork with -	 * NULL regs. -	 */ -	if (!regs) -		return 0; -#endif - -	stack = ((struct switch_stack *) regs) - 1; -  	child_ptregs = (struct pt_regs *) ((unsigned long) p + IA64_STK_OFFSET) - 1;  	child_stack = (struct switch_stack *) child_ptregs - 1; -	/* copy parent's switch_stack & pt_regs to child: */ -	memcpy(child_stack, stack, sizeof(*child_ptregs) + sizeof(*child_stack)); -  	rbs = (unsigned long) current + IA64_RBS_OFFSET;  	child_rbs = (unsigned long) p + IA64_RBS_OFFSET; -	rbs_size = stack->ar_bspstore - rbs; - -	/* copy the parent's register backing store to the child: */ -	memcpy((void *) child_rbs, (void *) rbs, rbs_size); - -	if (likely(user_mode(child_ptregs))) { -		if (clone_flags & CLONE_SETTLS) -			child_ptregs->r13 = regs->r16;	/* see sys_clone2() in entry.S */ -		if (user_stack_base) { -			child_ptregs->r12 = user_stack_base + user_stack_size - 16; -			child_ptregs->ar_bspstore = user_stack_base; -			child_ptregs->ar_rnat = 0; -			child_ptregs->loadrs = 0; -		} -	} else { -		/* -		 * Note: we simply preserve the relative position of -		 * the stack pointer here.  There is no need to -		 * allocate a scratch area here, since that will have -		 * been taken care of by the caller of sys_clone() -		 * already. -		 */ -		child_ptregs->r12 = (unsigned long) child_ptregs - 16; /* kernel sp */ -		child_ptregs->r13 = (unsigned long) p;		/* set `current' pointer */ -	} -	child_stack->ar_bspstore = child_rbs + rbs_size; -	child_stack->b0 = (unsigned long) &ia64_ret_from_clone;  	/* copy parts of thread_struct: */  	p->thread.ksp = (unsigned long) child_stack - 16; -	/* stop some PSR bits from being inherited. -	 * the psr.up/psr.pp bits must be cleared on fork but inherited on execve() -	 * therefore we must specify them explicitly here and not include them in -	 * IA64_PSR_BITS_TO_CLEAR. -	 */ -	child_ptregs->cr_ipsr = ((child_ptregs->cr_ipsr | IA64_PSR_BITS_TO_SET) -				 & ~(IA64_PSR_BITS_TO_CLEAR | IA64_PSR_PP | IA64_PSR_UP)); -  	/*  	 * NOTE: The calling convention considers all floating point  	 * registers in the high partition (fph) to be scratch.  Since @@ -504,8 +372,66 @@ copy_thread(unsigned long clone_flags,  #	define THREAD_FLAGS_TO_SET	0  	p->thread.flags = ((current->thread.flags & ~THREAD_FLAGS_TO_CLEAR)  			   | THREAD_FLAGS_TO_SET); +  	ia64_drop_fpu(p);	/* don't pick up stale state from a CPU's fph */ +	if (unlikely(p->flags & PF_KTHREAD)) { +		if (unlikely(!user_stack_base)) { +			/* fork_idle() called us */ +			return 0; +		} +		memset(child_stack, 0, sizeof(*child_ptregs) + sizeof(*child_stack)); +		child_stack->r4 = user_stack_base;	/* payload */ +		child_stack->r5 = user_stack_size;	/* argument */ +		/* +		 * Preserve PSR bits, except for bits 32-34 and 37-45, +		 * which we can't read. +		 */ +		child_ptregs->cr_ipsr = ia64_getreg(_IA64_REG_PSR) | IA64_PSR_BN; +		/* mark as valid, empty frame */ +		child_ptregs->cr_ifs = 1UL << 63; +		child_stack->ar_fpsr = child_ptregs->ar_fpsr +			= ia64_getreg(_IA64_REG_AR_FPSR); +		child_stack->pr = (1 << PRED_KERNEL_STACK); +		child_stack->ar_bspstore = child_rbs; +		child_stack->b0 = (unsigned long) &ia64_ret_from_clone; + +		/* stop some PSR bits from being inherited. +		 * the psr.up/psr.pp bits must be cleared on fork but inherited on execve() +		 * therefore we must specify them explicitly here and not include them in +		 * IA64_PSR_BITS_TO_CLEAR. +		 */ +		child_ptregs->cr_ipsr = ((child_ptregs->cr_ipsr | IA64_PSR_BITS_TO_SET) +				 & ~(IA64_PSR_BITS_TO_CLEAR | IA64_PSR_PP | IA64_PSR_UP)); + +		return 0; +	} +	stack = ((struct switch_stack *) regs) - 1; +	/* copy parent's switch_stack & pt_regs to child: */ +	memcpy(child_stack, stack, sizeof(*child_ptregs) + sizeof(*child_stack)); + +	/* copy the parent's register backing store to the child: */ +	rbs_size = stack->ar_bspstore - rbs; +	memcpy((void *) child_rbs, (void *) rbs, rbs_size); +	if (clone_flags & CLONE_SETTLS) +		child_ptregs->r13 = regs->r16;	/* see sys_clone2() in entry.S */ +	if (user_stack_base) { +		child_ptregs->r12 = user_stack_base + user_stack_size - 16; +		child_ptregs->ar_bspstore = user_stack_base; +		child_ptregs->ar_rnat = 0; +		child_ptregs->loadrs = 0; +	} +	child_stack->ar_bspstore = child_rbs + rbs_size; +	child_stack->b0 = (unsigned long) &ia64_ret_from_clone; + +	/* stop some PSR bits from being inherited. +	 * the psr.up/psr.pp bits must be cleared on fork but inherited on execve() +	 * therefore we must specify them explicitly here and not include them in +	 * IA64_PSR_BITS_TO_CLEAR. +	 */ +	child_ptregs->cr_ipsr = ((child_ptregs->cr_ipsr | IA64_PSR_BITS_TO_SET) +				 & ~(IA64_PSR_BITS_TO_CLEAR | IA64_PSR_PP | IA64_PSR_UP)); +  #ifdef CONFIG_PERFMON  	if (current->thread.pfm_context)  		pfm_inherit(p, child_ptregs); @@ -632,57 +558,6 @@ dump_fpu (struct pt_regs *pt, elf_fpregset_t dst)  	return 1;	/* f0-f31 are always valid so we always return 1 */  } -long -sys_execve (const char __user *filename, -	    const char __user *const __user *argv, -	    const char __user *const __user *envp, -	    struct pt_regs *regs) -{ -	char *fname; -	int error; - -	fname = getname(filename); -	error = PTR_ERR(fname); -	if (IS_ERR(fname)) -		goto out; -	error = do_execve(fname, argv, envp, regs); -	putname(fname); -out: -	return error; -} - -pid_t -kernel_thread (int (*fn)(void *), void *arg, unsigned long flags) -{ -	extern void start_kernel_thread (void); -	unsigned long *helper_fptr = (unsigned long *) &start_kernel_thread; -	struct { -		struct switch_stack sw; -		struct pt_regs pt; -	} regs; - -	memset(®s, 0, sizeof(regs)); -	regs.pt.cr_iip = helper_fptr[0];	/* set entry point (IP) */ -	regs.pt.r1 = helper_fptr[1];		/* set GP */ -	regs.pt.r9 = (unsigned long) fn;	/* 1st argument */ -	regs.pt.r11 = (unsigned long) arg;	/* 2nd argument */ -	/* Preserve PSR bits, except for bits 32-34 and 37-45, which we can't read.  */ -	regs.pt.cr_ipsr = ia64_getreg(_IA64_REG_PSR) | IA64_PSR_BN; -	regs.pt.cr_ifs = 1UL << 63;		/* mark as valid, empty frame */ -	regs.sw.ar_fpsr = regs.pt.ar_fpsr = ia64_getreg(_IA64_REG_AR_FPSR); -	regs.sw.ar_bspstore = (unsigned long) current + IA64_RBS_OFFSET; -	regs.sw.pr = (1 << PRED_KERNEL_STACK); -	return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s.pt, 0, NULL, NULL); -} -EXPORT_SYMBOL(kernel_thread); - -/* This gets called from kernel_thread() via ia64_invoke_thread_helper().  */ -int -kernel_thread_helper (int (*fn)(void *), void *arg) -{ -	return (*fn)(arg); -} -  /*   * Flush thread state.  This is called when a thread does an execve().   */ diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c index 8848f43d819..b7a5fffe092 100644 --- a/arch/ia64/kernel/ptrace.c +++ b/arch/ia64/kernel/ptrace.c @@ -26,7 +26,6 @@  #include <asm/processor.h>  #include <asm/ptrace_offsets.h>  #include <asm/rse.h> -#include <asm/system.h>  #include <asm/uaccess.h>  #include <asm/unwind.h>  #ifdef CONFIG_PERFMON @@ -673,33 +672,6 @@ ptrace_attach_sync_user_rbs (struct task_struct *child)  	read_unlock(&tasklist_lock);  } -static inline int -thread_matches (struct task_struct *thread, unsigned long addr) -{ -	unsigned long thread_rbs_end; -	struct pt_regs *thread_regs; - -	if (ptrace_check_attach(thread, 0) < 0) -		/* -		 * If the thread is not in an attachable state, we'll -		 * ignore it.  The net effect is that if ADDR happens -		 * to overlap with the portion of the thread's -		 * register backing store that is currently residing -		 * on the thread's kernel stack, then ptrace() may end -		 * up accessing a stale value.  But if the thread -		 * isn't stopped, that's a problem anyhow, so we're -		 * doing as well as we can... -		 */ -		return 0; - -	thread_regs = task_pt_regs(thread); -	thread_rbs_end = ia64_get_user_rbs_end(thread, thread_regs, NULL); -	if (!on_kernel_rbs(addr, thread_regs->ar_bspstore, thread_rbs_end)) -		return 0; - -	return 1;	/* looks like we've got a winner */ -} -  /*   * Write f32-f127 back to task->thread.fph if it has been modified.   */ @@ -1246,15 +1218,8 @@ syscall_trace_enter (long arg0, long arg1, long arg2, long arg3,  	if (test_thread_flag(TIF_RESTORE_RSE))  		ia64_sync_krbs(); -	if (unlikely(current->audit_context)) { -		long syscall; -		int arch; -		syscall = regs.r15; -		arch = AUDIT_ARCH_IA64; - -		audit_syscall_entry(arch, syscall, arg0, arg1, arg2, arg3); -	} +	audit_syscall_entry(AUDIT_ARCH_IA64, regs.r15, arg0, arg1, arg2, arg3);  	return 0;  } @@ -1268,14 +1233,7 @@ syscall_trace_leave (long arg0, long arg1, long arg2, long arg3,  {  	int step; -	if (unlikely(current->audit_context)) { -		int success = AUDITSC_RESULT(regs.r10); -		long result = regs.r8; - -		if (success != AUDITSC_SUCCESS) -			result = -result; -		audit_syscall_exit(success, result); -	} +	audit_syscall_exit(®s);  	step = test_thread_flag(TIF_SINGLESTEP);  	if (step || test_thread_flag(TIF_SYSCALL_TRACE)) diff --git a/arch/ia64/kernel/salinfo.c b/arch/ia64/kernel/salinfo.c index 79802e540e5..ee9719eebb1 100644 --- a/arch/ia64/kernel/salinfo.c +++ b/arch/ia64/kernel/salinfo.c @@ -40,6 +40,7 @@  #include <linux/cpu.h>  #include <linux/types.h>  #include <linux/proc_fs.h> +#include <linux/seq_file.h>  #include <linux/module.h>  #include <linux/smp.h>  #include <linux/timer.h> @@ -53,7 +54,7 @@ MODULE_AUTHOR("Jesse Barnes <jbarnes@sgi.com>");  MODULE_DESCRIPTION("/proc interface to IA-64 SAL features");  MODULE_LICENSE("GPL"); -static int salinfo_read(char *page, char **start, off_t off, int count, int *eof, void *data); +static const struct file_operations proc_salinfo_fops;  typedef struct {  	const char		*name;		/* name of the proc entry */ @@ -65,7 +66,7 @@ typedef struct {   * List {name,feature} pairs for every entry in /proc/sal/<feature>   * that this module exports   */ -static salinfo_entry_t salinfo_entries[]={ +static const salinfo_entry_t salinfo_entries[]={  	{ "bus_lock",           IA64_SAL_PLATFORM_FEATURE_BUS_LOCK, },  	{ "irq_redirection",	IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT, },  	{ "ipi_redirection",	IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT, }, @@ -301,9 +302,7 @@ salinfo_event_open(struct inode *inode, struct file *file)  static ssize_t  salinfo_event_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)  { -	struct inode *inode = file->f_path.dentry->d_inode; -	struct proc_dir_entry *entry = PDE(inode); -	struct salinfo_data *data = entry->data; +	struct salinfo_data *data = PDE_DATA(file_inode(file));  	char cmd[32];  	size_t size;  	int i, n, cpu = -1; @@ -360,8 +359,7 @@ static const struct file_operations salinfo_event_fops = {  static int  salinfo_log_open(struct inode *inode, struct file *file)  { -	struct proc_dir_entry *entry = PDE(inode); -	struct salinfo_data *data = entry->data; +	struct salinfo_data *data = PDE_DATA(inode);  	if (!capable(CAP_SYS_ADMIN))  		return -EPERM; @@ -386,8 +384,7 @@ salinfo_log_open(struct inode *inode, struct file *file)  static int  salinfo_log_release(struct inode *inode, struct file *file)  { -	struct proc_dir_entry *entry = PDE(inode); -	struct salinfo_data *data = entry->data; +	struct salinfo_data *data = PDE_DATA(inode);  	if (data->state == STATE_NO_DATA) {  		vfree(data->log_buffer); @@ -463,9 +460,7 @@ retry:  static ssize_t  salinfo_log_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)  { -	struct inode *inode = file->f_path.dentry->d_inode; -	struct proc_dir_entry *entry = PDE(inode); -	struct salinfo_data *data = entry->data; +	struct salinfo_data *data = PDE_DATA(file_inode(file));  	u8 *buf;  	u64 bufsize; @@ -524,9 +519,7 @@ salinfo_log_clear(struct salinfo_data *data, int cpu)  static ssize_t  salinfo_log_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)  { -	struct inode *inode = file->f_path.dentry->d_inode; -	struct proc_dir_entry *entry = PDE(inode); -	struct salinfo_data *data = entry->data; +	struct salinfo_data *data = PDE_DATA(file_inode(file));  	char cmd[32];  	size_t size;  	u32 offset; @@ -575,7 +568,7 @@ static const struct file_operations salinfo_data_fops = {  	.llseek  = default_llseek,  }; -static int __cpuinit +static int  salinfo_cpu_callback(struct notifier_block *nb, unsigned long action, void *hcpu)  {  	unsigned int i, cpu = (unsigned long)hcpu; @@ -616,7 +609,7 @@ salinfo_cpu_callback(struct notifier_block *nb, unsigned long action, void *hcpu  	return NOTIFY_OK;  } -static struct notifier_block salinfo_cpu_notifier __cpuinitdata = +static struct notifier_block salinfo_cpu_notifier =  {  	.notifier_call = salinfo_cpu_callback,  	.priority = 0, @@ -637,10 +630,13 @@ salinfo_init(void)  	for (i=0; i < NR_SALINFO_ENTRIES; i++) {  		/* pass the feature bit in question as misc data */ -		*sdir++ = create_proc_read_entry (salinfo_entries[i].name, 0, salinfo_dir, -						  salinfo_read, (void *)salinfo_entries[i].feature); +		*sdir++ = proc_create_data(salinfo_entries[i].name, 0, salinfo_dir, +					   &proc_salinfo_fops, +					   (void *)salinfo_entries[i].feature);  	} +	cpu_notifier_register_begin(); +  	for (i = 0; i < ARRAY_SIZE(salinfo_log_name); i++) {  		data = salinfo_data + i;  		data->type = i; @@ -675,7 +671,9 @@ salinfo_init(void)  	salinfo_timer.function = &salinfo_timeout;  	add_timer(&salinfo_timer); -	register_hotcpu_notifier(&salinfo_cpu_notifier); +	__register_hotcpu_notifier(&salinfo_cpu_notifier); + +	cpu_notifier_register_done();  	return 0;  } @@ -684,22 +682,23 @@ salinfo_init(void)   * 'data' contains an integer that corresponds to the feature we're   * testing   */ -static int -salinfo_read(char *page, char **start, off_t off, int count, int *eof, void *data) +static int proc_salinfo_show(struct seq_file *m, void *v)  { -	int len = 0; - -	len = sprintf(page, (sal_platform_features & (unsigned long)data) ? "1\n" : "0\n"); - -	if (len <= off+count) *eof = 1; - -	*start = page + off; -	len   -= off; - -	if (len>count) len = count; -	if (len<0) len = 0; +	unsigned long data = (unsigned long)v; +	seq_puts(m, (sal_platform_features & data) ? "1\n" : "0\n"); +	return 0; +} -	return len; +static int proc_salinfo_open(struct inode *inode, struct file *file) +{ +	return single_open(file, proc_salinfo_show, PDE_DATA(inode));  } +static const struct file_operations proc_salinfo_fops = { +	.open		= proc_salinfo_open, +	.read		= seq_read, +	.llseek		= seq_lseek, +	.release	= single_release, +}; +  module_init(salinfo_init); diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index 911cf974970..d86669bcdfb 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c @@ -59,7 +59,6 @@  #include <asm/sections.h>  #include <asm/setup.h>  #include <asm/smp.h> -#include <asm/system.h>  #include <asm/tlbflush.h>  #include <asm/unistd.h>  #include <asm/hpsim.h> @@ -220,6 +219,23 @@ sort_regions (struct rsvd_region *rsvd_region, int max)  	}  } +/* merge overlaps */ +static int __init +merge_regions (struct rsvd_region *rsvd_region, int max) +{ +	int i; +	for (i = 1; i < max; ++i) { +		if (rsvd_region[i].start >= rsvd_region[i-1].end) +			continue; +		if (rsvd_region[i].end > rsvd_region[i-1].end) +			rsvd_region[i-1].end = rsvd_region[i].end; +		--max; +		memmove(&rsvd_region[i], &rsvd_region[i+1], +			(max - i) * sizeof(struct rsvd_region)); +	} +	return max; +} +  /*   * Request address space for all standard resources   */ @@ -270,6 +286,7 @@ static void __init setup_crashkernel(unsigned long total, int *n)  	if (ret == 0 && size > 0) {  		if (!base) {  			sort_regions(rsvd_region, *n); +			*n = merge_regions(rsvd_region, *n);  			base = kdump_find_rsvd_region(size,  					rsvd_region, *n);  		} @@ -373,6 +390,7 @@ reserve_memory (void)  	BUG_ON(IA64_MAX_RSVD_REGIONS + 1 < n);  	sort_regions(rsvd_region, num_rsvd_regions); +	num_rsvd_regions = merge_regions(rsvd_region, num_rsvd_regions);  } @@ -467,7 +485,7 @@ mark_bsp_online (void)  {  #ifdef CONFIG_SMP  	/* If we register an early console, allow CPU 0 to printk */ -	cpu_set(smp_processor_id(), cpu_online_map); +	set_cpu_online(smp_processor_id(), true);  #endif  } @@ -479,25 +497,7 @@ static __init int setup_nomca(char *s)  }  early_param("nomca", setup_nomca); -/* - * Note: elfcorehdr_addr is not just limited to vmcore. It is also used by - * is_kdump_kernel() to determine if we are booting after a panic. Hence - * ifdef it under CONFIG_CRASH_DUMP and not CONFIG_PROC_VMCORE. - */  #ifdef CONFIG_CRASH_DUMP -/* elfcorehdr= specifies the location of elf core header - * stored by the crashed kernel. - */ -static int __init parse_elfcorehdr(char *arg) -{ -	if (!arg) -		return -EINVAL; - -        elfcorehdr_addr = memparse(arg, &arg); -	return 0; -} -early_param("elfcorehdr", parse_elfcorehdr); -  int __init reserve_elfcorehdr(u64 *start, u64 *end)  {  	u64 length; @@ -748,7 +748,7 @@ const struct seq_operations cpuinfo_op = {  #define MAX_BRANDS	8  static char brandname[MAX_BRANDS][128]; -static char * __cpuinit +static char *  get_model_name(__u8 family, __u8 model)  {  	static int overflow; @@ -778,7 +778,7 @@ get_model_name(__u8 family, __u8 model)  	return "Unknown";  } -static void __cpuinit +static void  identify_cpu (struct cpuinfo_ia64 *c)  {  	union { @@ -850,7 +850,7 @@ identify_cpu (struct cpuinfo_ia64 *c)   * 2. the minimum of the i-cache stride sizes for "flush_icache_range()".   * 3. the minimum of the cache stride sizes for "clflush_cache_range()".   */ -static void __cpuinit +static void  get_cache_info(void)  {  	unsigned long line_size, max = 1; @@ -915,10 +915,10 @@ get_cache_info(void)   * cpu_init() initializes state that is per-CPU.  This function acts   * as a 'CPU state barrier', nothing should get across.   */ -void __cpuinit +void  cpu_init (void)  { -	extern void __cpuinit ia64_mmu_init (void *); +	extern void ia64_mmu_init(void *);  	static unsigned long max_num_phys_stacked = IA64_NUM_PHYS_STACK_REG;  	unsigned long num_phys_stacked;  	pal_vm_info_2_u_t vmi; @@ -1051,7 +1051,6 @@ cpu_init (void)  		max_num_phys_stacked = num_phys_stacked;  	}  	platform_cpu_init(); -	pm_idle = default_idle;  }  void __init @@ -1064,6 +1063,8 @@ check_bugs (void)  static int __init run_dmi_scan(void)  {  	dmi_scan_machine(); +	dmi_memdev_walk(); +	dmi_set_dump_stack_arch_desc();  	return 0;  }  core_initcall(run_dmi_scan); diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c index 7bdafc8788b..33cab9a8adf 100644 --- a/arch/ia64/kernel/signal.c +++ b/arch/ia64/kernel/signal.c @@ -30,7 +30,6 @@  #define DEBUG_SIG	0  #define STACK_ALIGN	16		/* minimal alignment for stack pointer */ -#define _BLOCKABLE	(~(sigmask(SIGKILL) | sigmask(SIGSTOP)))  #if _NSIG_WORDS > 1  # define PUT_SIGSET(k,u)	__copy_to_user((u)->sig, (k)->sig, sizeof(sigset_t)) @@ -40,14 +39,6 @@  # define GET_SIGSET(k,u)	__get_user((k)->sig[0], &(u)->sig[0])  #endif -asmlinkage long -sys_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, long arg2, -		 long arg3, long arg4, long arg5, long arg6, long arg7, -		 struct pt_regs regs) -{ -	return do_sigaltstack(uss, uoss, regs.r12); -} -  static long  restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)  { @@ -114,7 +105,7 @@ restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)  }  int -copy_siginfo_to_user (siginfo_t __user *to, siginfo_t *from) +copy_siginfo_to_user (siginfo_t __user *to, const siginfo_t *from)  {  	if (!access_ok(VERIFY_WRITE, to, sizeof(siginfo_t)))  		return -EFAULT; @@ -200,14 +191,7 @@ ia64_rt_sigreturn (struct sigscratch *scr)  	if (GET_SIGSET(&set, &sc->sc_mask))  		goto give_sigsegv; -	sigdelsetmask(&set, ~_BLOCKABLE); - -	spin_lock_irq(¤t->sighand->siglock); -	{ -		current->blocked = set; -		recalc_sigpending(); -	} -	spin_unlock_irq(¤t->sighand->siglock); +	set_current_blocked(&set);  	if (restore_sigcontext(sc, scr))  		goto give_sigsegv; @@ -216,11 +200,8 @@ ia64_rt_sigreturn (struct sigscratch *scr)  	printk("SIG return (%s:%d): sp=%lx ip=%lx\n",  	       current->comm, current->pid, scr->pt.r12, scr->pt.cr_iip);  #endif -	/* -	 * It is more difficult to avoid calling this function than to -	 * call it and ignore errors. -	 */ -	do_sigaltstack(&sc->sc_stack, NULL, scr->pt.r12); +	if (restore_altstack(&sc->sc_stack)) +		goto give_sigsegv;  	return retval;    give_sigsegv: @@ -228,7 +209,7 @@ ia64_rt_sigreturn (struct sigscratch *scr)  	si.si_errno = 0;  	si.si_code = SI_KERNEL;  	si.si_pid = task_pid_vnr(current); -	si.si_uid = current_uid(); +	si.si_uid = from_kuid_munged(current_user_ns(), current_uid());  	si.si_addr = sc;  	force_sig_info(SIGSEGV, &si, current);  	return retval; @@ -325,7 +306,7 @@ force_sigsegv_info (int sig, void __user *addr)  	si.si_errno = 0;  	si.si_code = SI_KERNEL;  	si.si_pid = task_pid_vnr(current); -	si.si_uid = current_uid(); +	si.si_uid = from_kuid_munged(current_user_ns(), current_uid());  	si.si_addr = addr;  	force_sig_info(SIGSEGV, &si, current);  	return 0; @@ -384,9 +365,7 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set,  	err |= copy_siginfo_to_user(&frame->info, info); -	err |= __put_user(current->sas_ss_sp, &frame->sc.sc_stack.ss_sp); -	err |= __put_user(current->sas_ss_size, &frame->sc.sc_stack.ss_size); -	err |= __put_user(sas_ss_flags(scr->pt.r12), &frame->sc.sc_stack.ss_flags); +	err |= __save_altstack(&frame->sc.sc_stack, scr->pt.r12);  	err |= setup_sigcontext(&frame->sc, set, scr);  	if (unlikely(err)) @@ -421,23 +400,13 @@ setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set,  }  static long -handle_signal (unsigned long sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *oldset, +handle_signal (unsigned long sig, struct k_sigaction *ka, siginfo_t *info,  	       struct sigscratch *scr)  { -	if (!setup_frame(sig, ka, info, oldset, scr)) +	if (!setup_frame(sig, ka, info, sigmask_to_save(), scr))  		return 0; -	spin_lock_irq(¤t->sighand->siglock); -	sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask); -	if (!(ka->sa.sa_flags & SA_NODEFER)) -		sigaddset(¤t->blocked, sig); -	recalc_sigpending(); -	spin_unlock_irq(¤t->sighand->siglock); - -	/* -	 * Let tracing know that we've done the handler setup. -	 */ -	tracehook_signal_handler(sig, info, ka, &scr->pt, +	signal_delivered(sig, info, ka, &scr->pt,  				 test_thread_flag(TIF_SINGLESTEP));  	return 1; @@ -451,25 +420,11 @@ void  ia64_do_signal (struct sigscratch *scr, long in_syscall)  {  	struct k_sigaction ka; -	sigset_t *oldset;  	siginfo_t info;  	long restart = in_syscall;  	long errno = scr->pt.r8;  	/* -	 * In the ia64_leave_kernel code path, we want the common case to go fast, which -	 * is why we may in certain cases get here from kernel mode. Just return without -	 * doing anything if so. -	 */ -	if (!user_mode(&scr->pt)) -		return; - -	if (current_thread_info()->status & TS_RESTORE_SIGMASK) -		oldset = ¤t->saved_sigmask; -	else -		oldset = ¤t->blocked; - -	/*  	 * This only loops in the rare cases of handle_signal() failing, in which case we  	 * need to push through a forced SIGSEGV.  	 */ @@ -518,16 +473,8 @@ ia64_do_signal (struct sigscratch *scr, long in_syscall)  		 * Whee!  Actually deliver the signal.  If the delivery failed, we need to  		 * continue to iterate in this loop so we can deliver the SIGSEGV...  		 */ -		if (handle_signal(signr, &ka, &info, oldset, scr)) { -			/* -			 * A signal was successfully delivered; the saved -			 * sigmask will have been stored in the signal frame, -			 * and will be restored by sigreturn, so we can simply -			 * clear the TS_RESTORE_SIGMASK flag. -			 */ -			current_thread_info()->status &= ~TS_RESTORE_SIGMASK; +		if (handle_signal(signr, &ka, &info, scr))  			return; -		}  	}  	/* Did we come from a system call? */ @@ -549,8 +496,5 @@ ia64_do_signal (struct sigscratch *scr, long in_syscall)  	/* if there's no signal to deliver, we just put the saved sigmask  	 * back */ -	if (current_thread_info()->status & TS_RESTORE_SIGMASK) { -		current_thread_info()->status &= ~TS_RESTORE_SIGMASK; -		sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL); -	} +	restore_saved_sigmask();  } diff --git a/arch/ia64/kernel/smp.c b/arch/ia64/kernel/smp.c index dabeefe2113..9fcd4e63048 100644 --- a/arch/ia64/kernel/smp.c +++ b/arch/ia64/kernel/smp.c @@ -32,7 +32,7 @@  #include <linux/bitops.h>  #include <linux/kexec.h> -#include <asm/atomic.h> +#include <linux/atomic.h>  #include <asm/current.h>  #include <asm/delay.h>  #include <asm/machvec.h> @@ -44,7 +44,6 @@  #include <asm/processor.h>  #include <asm/ptrace.h>  #include <asm/sal.h> -#include <asm/system.h>  #include <asm/tlbflush.h>  #include <asm/unistd.h>  #include <asm/mca.h> @@ -77,7 +76,7 @@ stop_this_cpu(void)  	/*  	 * Remove this CPU:  	 */ -	cpu_clear(smp_processor_id(), cpu_online_map); +	set_cpu_online(smp_processor_id(), false);  	max_xtp();  	local_irq_disable();  	cpu_halt(); @@ -293,6 +292,7 @@ smp_flush_tlb_all (void)  void  smp_flush_tlb_mm (struct mm_struct *mm)  { +	cpumask_var_t cpus;  	preempt_disable();  	/* this happens for the common case of a single-threaded fork():  */  	if (likely(mm == current->active_mm && atomic_read(&mm->mm_users) == 1)) @@ -301,9 +301,15 @@ smp_flush_tlb_mm (struct mm_struct *mm)  		preempt_enable();  		return;  	} - -	smp_call_function_many(mm_cpumask(mm), -		(void (*)(void *))local_finish_flush_tlb_mm, mm, 1); +	if (!alloc_cpumask_var(&cpus, GFP_ATOMIC)) { +		smp_call_function((void (*)(void *))local_finish_flush_tlb_mm, +			mm, 1); +	} else { +		cpumask_copy(cpus, mm_cpumask(mm)); +		smp_call_function_many(cpus, +			(void (*)(void *))local_finish_flush_tlb_mm, mm, 1); +		free_cpumask_var(cpus); +	}  	local_irq_disable();  	local_finish_flush_tlb_mm(mm);  	local_irq_enable(); diff --git a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c index d003b502a43..547a48d78bd 100644 --- a/arch/ia64/kernel/smpboot.c +++ b/arch/ia64/kernel/smpboot.c @@ -40,7 +40,7 @@  #include <linux/percpu.h>  #include <linux/bitops.h> -#include <asm/atomic.h> +#include <linux/atomic.h>  #include <asm/cache.h>  #include <asm/current.h>  #include <asm/delay.h> @@ -55,7 +55,6 @@  #include <asm/processor.h>  #include <asm/ptrace.h>  #include <asm/sal.h> -#include <asm/system.h>  #include <asm/tlbflush.h>  #include <asm/unistd.h>  #include <asm/sn/arch.h> @@ -76,13 +75,6 @@  #endif  /* - * Store all idle threads, this can be reused instead of creating - * a new thread. Also avoids complicated thread destroy functionality - * for idle threads. - */ -struct task_struct *idle_thread_array[NR_CPUS]; - -/*   * Global array allocated for NR_CPUS at boot time   */  struct sal_to_os_boot sal_boot_rendez_state[NR_CPUS]; @@ -95,13 +87,7 @@ struct sal_to_os_boot *sal_state_for_booting_cpu = &sal_boot_rendez_state[0];  #define set_brendez_area(x) (sal_state_for_booting_cpu = &sal_boot_rendez_state[(x)]); -#define get_idle_for_cpu(x)		(idle_thread_array[(x)]) -#define set_idle_for_cpu(x,p)	(idle_thread_array[(x)] = (p)) -  #else - -#define get_idle_for_cpu(x)		(NULL) -#define set_idle_for_cpu(x,p)  #define set_brendez_area(x)  #endif @@ -361,12 +347,11 @@ ia64_sync_itc (unsigned int master)  /*   * Ideally sets up per-cpu profiling hooks.  Doesn't do much now...   */ -static inline void __devinit -smp_setup_percpu_timer (void) +static inline void smp_setup_percpu_timer(void)  {  } -static void __cpuinit +static void  smp_callin (void)  {  	int cpuid, phys_id, itc_master; @@ -396,15 +381,13 @@ smp_callin (void)  	set_numa_node(cpu_to_node_map[cpuid]);  	set_numa_mem(local_memory_node(cpu_to_node_map[cpuid])); -	ipi_call_lock_irq();  	spin_lock(&vector_lock);  	/* Setup the per cpu irq handling data structures */  	__setup_vector_irq(cpuid);  	notify_cpu_starting(cpuid); -	cpu_set(cpuid, cpu_online_map); +	set_cpu_online(cpuid, true);  	per_cpu(cpu_state, cpuid) = CPU_ONLINE;  	spin_unlock(&vector_lock); -	ipi_call_unlock_irq();  	smp_setup_percpu_timer(); @@ -459,7 +442,7 @@ smp_callin (void)  /*   * Activate a secondary processor.  head.S calls this.   */ -int __cpuinit +int  start_secondary (void *unused)  {  	/* Early console may use I/O ports */ @@ -472,63 +455,16 @@ start_secondary (void *unused)  	preempt_disable();  	smp_callin(); -	cpu_idle(); +	cpu_startup_entry(CPUHP_ONLINE);  	return 0;  } -struct pt_regs * __cpuinit idle_regs(struct pt_regs *regs) -{ -	return NULL; -} - -struct create_idle { -	struct work_struct work; -	struct task_struct *idle; -	struct completion done; -	int cpu; -}; - -void __cpuinit -do_fork_idle(struct work_struct *work) -{ -	struct create_idle *c_idle = -		container_of(work, struct create_idle, work); - -	c_idle->idle = fork_idle(c_idle->cpu); -	complete(&c_idle->done); -} - -static int __cpuinit -do_boot_cpu (int sapicid, int cpu) +static int +do_boot_cpu (int sapicid, int cpu, struct task_struct *idle)  {  	int timeout; -	struct create_idle c_idle = { -		.work = __WORK_INITIALIZER(c_idle.work, do_fork_idle), -		.cpu	= cpu, -		.done	= COMPLETION_INITIALIZER(c_idle.done), -	}; - -	/* -	 * We can't use kernel_thread since we must avoid to -	 * reschedule the child. -	 */ - 	c_idle.idle = get_idle_for_cpu(cpu); - 	if (c_idle.idle) { -		init_idle(c_idle.idle, cpu); - 		goto do_rest; -	} - -	schedule_work(&c_idle.work); -	wait_for_completion(&c_idle.done); - -	if (IS_ERR(c_idle.idle)) -		panic("failed fork for CPU %d", cpu); - -	set_idle_for_cpu(cpu, c_idle.idle); - -do_rest: -	task_for_booting_cpu = c_idle.idle; +	task_for_booting_cpu = idle;  	Dprintk("Sending wakeup vector %lu to AP 0x%x/0x%x.\n", ap_wakeup_vector, cpu, sapicid);  	set_brendez_area(cpu); @@ -548,7 +484,7 @@ do_rest:  	if (!cpu_isset(cpu, cpu_callin_map)) {  		printk(KERN_ERR "Processor 0x%x/0x%x is stuck.\n", cpu, sapicid);  		ia64_cpu_to_sapicid[cpu] = -1; -		cpu_clear(cpu, cpu_online_map);  /* was set in smp_callin() */ +		set_cpu_online(cpu, false);  /* was set in smp_callin() */  		return -EINVAL;  	}  	return 0; @@ -578,8 +514,7 @@ smp_build_cpu_map (void)  	}  	ia64_cpu_to_sapicid[0] = boot_cpu_id; -	cpus_clear(cpu_present_map); -	set_cpu_present(0, true); +	init_cpu_present(cpumask_of(0));  	set_cpu_possible(0, true);  	for (cpu = 1, i = 0; i < smp_boot_data.cpu_count; i++) {  		sapicid = smp_boot_data.cpu_phys_id[i]; @@ -606,10 +541,6 @@ smp_prepare_cpus (unsigned int max_cpus)  	smp_setup_percpu_timer(); -	/* -	 * We have the boot CPU online for sure. -	 */ -	cpu_set(0, cpu_online_map);  	cpu_set(0, cpu_callin_map);  	local_cpu_data->loops_per_jiffy = loops_per_jiffy; @@ -631,9 +562,9 @@ smp_prepare_cpus (unsigned int max_cpus)  	}  } -void __devinit smp_prepare_boot_cpu(void) +void smp_prepare_boot_cpu(void)  { -	cpu_set(smp_processor_id(), cpu_online_map); +	set_cpu_online(smp_processor_id(), true);  	cpu_set(smp_processor_id(), cpu_callin_map);  	set_numa_node(cpu_to_node_map[smp_processor_id()]);  	per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE; @@ -677,7 +608,7 @@ extern void fixup_irqs(void);  int migrate_platform_irqs(unsigned int cpu)  {  	int new_cpei_cpu; -	struct irq_desc *desc = NULL; +	struct irq_data *data = NULL;  	const struct cpumask *mask;  	int 		retval = 0; @@ -690,23 +621,23 @@ int migrate_platform_irqs(unsigned int cpu)  			/*  			 * Now re-target the CPEI to a different processor  			 */ -			new_cpei_cpu = any_online_cpu(cpu_online_map); +			new_cpei_cpu = cpumask_any(cpu_online_mask);  			mask = cpumask_of(new_cpei_cpu);  			set_cpei_target_cpu(new_cpei_cpu); -			desc = irq_desc + ia64_cpe_irq; +			data = irq_get_irq_data(ia64_cpe_irq);  			/*  			 * Switch for now, immediately, we need to do fake intr  			 * as other interrupts, but need to study CPEI behaviour with  			 * polling before making changes.  			 */ -			if (desc) { -				desc->chip->disable(ia64_cpe_irq); -				desc->chip->set_affinity(ia64_cpe_irq, mask); -				desc->chip->enable(ia64_cpe_irq); -				printk ("Re-targetting CPEI to cpu %d\n", new_cpei_cpu); +			if (data && data->chip) { +				data->chip->irq_disable(data); +				data->chip->irq_set_affinity(data, mask, false); +				data->chip->irq_enable(data); +				printk ("Re-targeting CPEI to cpu %d\n", new_cpei_cpu);  			}  		} -		if (!desc) { +		if (!data) {  			printk ("Unable to retarget CPEI, offline cpu [%d] failed\n", cpu);  			retval = -EBUSY;  		} @@ -732,10 +663,10 @@ int __cpu_disable(void)  			return -EBUSY;  	} -	cpu_clear(cpu, cpu_online_map); +	set_cpu_online(cpu, false);  	if (migrate_platform_irqs(cpu)) { -		cpu_set(cpu, cpu_online_map); +		set_cpu_online(cpu, true);  		return -EBUSY;  	} @@ -781,8 +712,7 @@ smp_cpus_done (unsigned int dummy)  	       (int)num_online_cpus(), bogosum/(500000/HZ), (bogosum/(5000/HZ))%100);  } -static inline void __devinit -set_cpu_sibling_map(int cpu) +static inline void set_cpu_sibling_map(int cpu)  {  	int i; @@ -798,8 +728,8 @@ set_cpu_sibling_map(int cpu)  	}  } -int __cpuinit -__cpu_up (unsigned int cpu) +int +__cpu_up(unsigned int cpu, struct task_struct *tidle)  {  	int ret;  	int sapicid; @@ -817,7 +747,7 @@ __cpu_up (unsigned int cpu)  	per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;  	/* Processor goes to start_secondary(), sets online flag */ -	ret = do_boot_cpu(sapicid, cpu); +	ret = do_boot_cpu(sapicid, cpu, tidle);  	if (ret < 0)  		return ret; @@ -861,8 +791,7 @@ init_smp_config(void)   * identify_siblings(cpu) gets called from identify_cpu. This populates the    * information related to logical execution units in per_cpu_data structure.   */ -void __devinit -identify_siblings(struct cpuinfo_ia64 *c) +void identify_siblings(struct cpuinfo_ia64 *c)  {  	long status;  	u16 pltid; diff --git a/arch/ia64/kernel/sys_ia64.c b/arch/ia64/kernel/sys_ia64.c index 609d50056a6..41e33f84c18 100644 --- a/arch/ia64/kernel/sys_ia64.c +++ b/arch/ia64/kernel/sys_ia64.c @@ -25,9 +25,9 @@ arch_get_unmapped_area (struct file *filp, unsigned long addr, unsigned long len  			unsigned long pgoff, unsigned long flags)  {  	long map_shared = (flags & MAP_SHARED); -	unsigned long start_addr, align_mask = PAGE_SIZE - 1; +	unsigned long align_mask = 0;  	struct mm_struct *mm = current->mm; -	struct vm_area_struct *vma; +	struct vm_unmapped_area_info info;  	if (len > RGN_MAP_LIMIT)  		return -ENOMEM; @@ -44,7 +44,7 @@ arch_get_unmapped_area (struct file *filp, unsigned long addr, unsigned long len  		addr = 0;  #endif  	if (!addr) -		addr = mm->free_area_cache; +		addr = TASK_UNMAPPED_BASE;  	if (map_shared && (TASK_SIZE > 0xfffffffful))  		/* @@ -53,28 +53,15 @@ arch_get_unmapped_area (struct file *filp, unsigned long addr, unsigned long len  		 * tasks, we prefer to avoid exhausting the address space too quickly by  		 * limiting alignment to a single page.  		 */ -		align_mask = SHMLBA - 1; - -  full_search: -	start_addr = addr = (addr + align_mask) & ~align_mask; - -	for (vma = find_vma(mm, addr); ; vma = vma->vm_next) { -		/* At this point:  (!vma || addr < vma->vm_end). */ -		if (TASK_SIZE - len < addr || RGN_MAP_LIMIT - len < REGION_OFFSET(addr)) { -			if (start_addr != TASK_UNMAPPED_BASE) { -				/* Start a new search --- just in case we missed some holes.  */ -				addr = TASK_UNMAPPED_BASE; -				goto full_search; -			} -			return -ENOMEM; -		} -		if (!vma || addr + len <= vma->vm_start) { -			/* Remember the address where we stopped this search:  */ -			mm->free_area_cache = addr + len; -			return addr; -		} -		addr = (vma->vm_end + align_mask) & ~align_mask; -	} +		align_mask = PAGE_MASK & (SHMLBA - 1); + +	info.flags = 0; +	info.length = len; +	info.low_limit = addr; +	info.high_limit = TASK_SIZE; +	info.align_mask = align_mask; +	info.align_offset = 0; +	return vm_unmapped_area(&info);  }  asmlinkage long @@ -171,22 +158,9 @@ asmlinkage unsigned long  ia64_mremap (unsigned long addr, unsigned long old_len, unsigned long new_len, unsigned long flags,  	     unsigned long new_addr)  { -	extern unsigned long do_mremap (unsigned long addr, -					unsigned long old_len, -					unsigned long new_len, -					unsigned long flags, -					unsigned long new_addr); - -	down_write(¤t->mm->mmap_sem); -	{ -		addr = do_mremap(addr, old_len, new_len, flags, new_addr); -	} -	up_write(¤t->mm->mmap_sem); - -	if (IS_ERR((void *) addr)) -		return addr; - -	force_successful_syscall_return(); +	addr = sys_mremap(addr, old_len, new_len, flags, new_addr); +	if (!IS_ERR((void *) addr)) +		force_successful_syscall_return();  	return addr;  } diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c index ed6f22eb5b1..71c52bc7c28 100644 --- a/arch/ia64/kernel/time.c +++ b/arch/ia64/kernel/time.c @@ -19,7 +19,7 @@  #include <linux/interrupt.h>  #include <linux/efi.h>  #include <linux/timex.h> -#include <linux/clocksource.h> +#include <linux/timekeeper_internal.h>  #include <linux/platform_device.h>  #include <asm/machvec.h> @@ -29,15 +29,12 @@  #include <asm/ptrace.h>  #include <asm/sal.h>  #include <asm/sections.h> -#include <asm/system.h>  #include "fsyscall_gtod_data.h"  static cycle_t itc_get_cycles(struct clocksource *cs); -struct fsyscall_gtod_data_t fsyscall_gtod_data = { -	.lock = SEQLOCK_UNLOCKED, -}; +struct fsyscall_gtod_data_t fsyscall_gtod_data;  struct itc_jitter_data_t itc_jitter_data; @@ -73,8 +70,6 @@ static struct clocksource clocksource_itc = {  	.rating         = 350,  	.read           = itc_get_cycles,  	.mask           = CLOCKSOURCE_MASK(64), -	.mult           = 0, /*to be calculated*/ -	.shift          = 16,  	.flags          = CLOCK_SOURCE_IS_CONTINUOUS,  #ifdef CONFIG_PARAVIRT  	.resume		= paravirt_clocksource_resume, @@ -82,38 +77,35 @@ static struct clocksource clocksource_itc = {  };  static struct clocksource *itc_clocksource; -#ifdef CONFIG_VIRT_CPU_ACCOUNTING +#ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE  #include <linux/kernel_stat.h>  extern cputime_t cycle_to_cputime(u64 cyc); +void vtime_account_user(struct task_struct *tsk) +{ +	cputime_t delta_utime; +	struct thread_info *ti = task_thread_info(tsk); + +	if (ti->ac_utime) { +		delta_utime = cycle_to_cputime(ti->ac_utime); +		account_user_time(tsk, delta_utime, delta_utime); +		ti->ac_utime = 0; +	} +} +  /*   * Called from the context switch with interrupts disabled, to charge all   * accumulated times to the current process, and to prepare accounting on   * the next process.   */ -void ia64_account_on_switch(struct task_struct *prev, struct task_struct *next) +void arch_vtime_task_switch(struct task_struct *prev)  {  	struct thread_info *pi = task_thread_info(prev); -	struct thread_info *ni = task_thread_info(next); -	cputime_t delta_stime, delta_utime; -	__u64 now; - -	now = ia64_get_itc(); - -	delta_stime = cycle_to_cputime(pi->ac_stime + (now - pi->ac_stamp)); -	if (idle_task(smp_processor_id()) != prev) -		account_system_time(prev, 0, delta_stime, delta_stime); -	else -		account_idle_time(delta_stime); +	struct thread_info *ni = task_thread_info(current); -	if (pi->ac_utime) { -		delta_utime = cycle_to_cputime(pi->ac_utime); -		account_user_time(prev, delta_utime, delta_utime); -	} - -	pi->ac_stamp = ni->ac_stamp = now; +	pi->ac_stamp = ni->ac_stamp;  	ni->ac_stime = ni->ac_utime = 0;  } @@ -121,54 +113,44 @@ void ia64_account_on_switch(struct task_struct *prev, struct task_struct *next)   * Account time for a transition between system, hard irq or soft irq state.   * Note that this function is called with interrupts enabled.   */ -void account_system_vtime(struct task_struct *tsk) +static cputime_t vtime_delta(struct task_struct *tsk)  {  	struct thread_info *ti = task_thread_info(tsk); -	unsigned long flags;  	cputime_t delta_stime;  	__u64 now; -	local_irq_save(flags); +	WARN_ON_ONCE(!irqs_disabled());  	now = ia64_get_itc();  	delta_stime = cycle_to_cputime(ti->ac_stime + (now - ti->ac_stamp)); -	if (irq_count() || idle_task(smp_processor_id()) != tsk) -		account_system_time(tsk, 0, delta_stime, delta_stime); -	else -		account_idle_time(delta_stime);  	ti->ac_stime = 0; -  	ti->ac_stamp = now; -	local_irq_restore(flags); +	return delta_stime;  } -EXPORT_SYMBOL_GPL(account_system_vtime); -/* - * Called from the timer interrupt handler to charge accumulated user time - * to the current process.  Must be called with interrupts disabled. - */ -void account_process_tick(struct task_struct *p, int user_tick) +void vtime_account_system(struct task_struct *tsk)  { -	struct thread_info *ti = task_thread_info(p); -	cputime_t delta_utime; +	cputime_t delta = vtime_delta(tsk); -	if (ti->ac_utime) { -		delta_utime = cycle_to_cputime(ti->ac_utime); -		account_user_time(p, delta_utime, delta_utime); -		ti->ac_utime = 0; -	} +	account_system_time(tsk, 0, delta, delta);  } +EXPORT_SYMBOL_GPL(vtime_account_system); -#endif /* CONFIG_VIRT_CPU_ACCOUNTING */ +void vtime_account_idle(struct task_struct *tsk) +{ +	account_idle_time(vtime_delta(tsk)); +} + +#endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */  static irqreturn_t  timer_interrupt (int irq, void *dev_id)  {  	unsigned long new_itm; -	if (unlikely(cpu_is_offline(smp_processor_id()))) { +	if (cpu_is_offline(smp_processor_id())) {  		return IRQ_HANDLED;  	} @@ -190,19 +172,10 @@ timer_interrupt (int irq, void *dev_id)  		new_itm += local_cpu_data->itm_delta; -		if (smp_processor_id() == time_keeper_id) { -			/* -			 * Here we are in the timer irq handler. We have irqs locally -			 * disabled, but we don't know if the timer_bh is running on -			 * another CPU. We need to avoid to SMP race by acquiring the -			 * xtime_lock. -			 */ -			write_seqlock(&xtime_lock); -			do_timer(1); -			local_cpu_data->itm_next = new_itm; -			write_sequnlock(&xtime_lock); -		} else -			local_cpu_data->itm_next = new_itm; +		if (smp_processor_id() == time_keeper_id) +			xtime_update(1); + +		local_cpu_data->itm_next = new_itm;  		if (time_after(new_itm, ia64_get_itc()))  			break; @@ -222,7 +195,7 @@ skip_process_time_accounting:  		 * comfort, we increase the safety margin by  		 * intentionally dropping the next tick(s).  We do NOT  		 * update itm.next because that would force us to call -		 * do_timer() which in turn would let our clock run +		 * xtime_update() which in turn would let our clock run  		 * too fast (with the potentially devastating effect  		 * of losing monotony of time).  		 */ @@ -271,8 +244,7 @@ static int __init nojitter_setup(char *str)  __setup("nojitter", nojitter_setup); -void __devinit -ia64_init_itm (void) +void ia64_init_itm(void)  {  	unsigned long platform_base_freq, itc_freq;  	struct pal_freq_ratio itc_ratio, proc_ratio; @@ -374,11 +346,8 @@ ia64_init_itm (void)  	ia64_cpu_local_tick();  	if (!itc_clocksource) { -		/* Sort out mult/shift values: */ -		clocksource_itc.mult = -			clocksource_hz2mult(local_cpu_data->itc_freq, -						clocksource_itc.shift); -		clocksource_register(&clocksource_itc); +		clocksource_register_hz(&clocksource_itc, +						local_cpu_data->itc_freq);  		itc_clocksource = &clocksource_itc;  	}  } @@ -411,7 +380,7 @@ static cycle_t itc_get_cycles(struct clocksource *cs)  static struct irqaction timer_irqaction = {  	.handler =	timer_interrupt, -	.flags =	IRQF_DISABLED | IRQF_IRQPOLL, +	.flags =	IRQF_IRQPOLL,  	.name =		"timer"  }; @@ -471,18 +440,16 @@ void update_vsyscall_tz(void)  {  } -void update_vsyscall(struct timespec *wall, struct timespec *wtm, +void update_vsyscall_old(struct timespec *wall, struct timespec *wtm,  			struct clocksource *c, u32 mult)  { -        unsigned long flags; - -        write_seqlock_irqsave(&fsyscall_gtod_data.lock, flags); +	write_seqcount_begin(&fsyscall_gtod_data.seq);          /* copy fsyscall clock data */          fsyscall_gtod_data.clk_mask = c->mask;          fsyscall_gtod_data.clk_mult = mult;          fsyscall_gtod_data.clk_shift = c->shift; -        fsyscall_gtod_data.clk_fsys_mmio = c->fsys_mmio; +        fsyscall_gtod_data.clk_fsys_mmio = c->archdata.fsys_mmio;          fsyscall_gtod_data.clk_cycle_last = c->cycle_last;  	/* copy kernel time structures */ @@ -499,6 +466,6 @@ void update_vsyscall(struct timespec *wall, struct timespec *wtm,  		fsyscall_gtod_data.monotonic_time.tv_sec++;  	} -        write_sequnlock_irqrestore(&fsyscall_gtod_data.lock, flags); +	write_seqcount_end(&fsyscall_gtod_data.seq);  } diff --git a/arch/ia64/kernel/topology.c b/arch/ia64/kernel/topology.c index 0baa1bbb65f..f295f9abba4 100644 --- a/arch/ia64/kernel/topology.c +++ b/arch/ia64/kernel/topology.c @@ -22,6 +22,7 @@  #include <linux/bootmem.h>  #include <linux/nodemask.h>  #include <linux/notifier.h> +#include <linux/export.h>  #include <asm/mmzone.h>  #include <asm/numa.h>  #include <asm/cpu.h> @@ -43,7 +44,7 @@ int __ref arch_register_cpu(int num)  {  #ifdef CONFIG_ACPI  	/* -	 * If CPEI can be re-targetted or if this is not +	 * If CPEI can be re-targeted or if this is not  	 * CPEI target, then it is hotpluggable  	 */  	if (can_cpei_retarget() || !is_cpu_cpei_target(num)) @@ -134,11 +135,11 @@ struct cpu_cache_info {  	struct kobject kobj;  }; -static struct cpu_cache_info	all_cpu_cache_info[NR_CPUS] __cpuinitdata; +static struct cpu_cache_info	all_cpu_cache_info[NR_CPUS];  #define LEAF_KOBJECT_PTR(x,y)    (&all_cpu_cache_info[x].cache_leaves[y])  #ifdef CONFIG_SMP -static void __cpuinit cache_shared_cpu_map_setup( unsigned int cpu, +static void cache_shared_cpu_map_setup(unsigned int cpu,  		struct cache_info * this_leaf)  {  	pal_cache_shared_info_t	csi; @@ -173,7 +174,7 @@ static void __cpuinit cache_shared_cpu_map_setup( unsigned int cpu,  				&csi) == PAL_STATUS_SUCCESS);  }  #else -static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, +static void cache_shared_cpu_map_setup(unsigned int cpu,  		struct cache_info * this_leaf)  {  	cpu_set(cpu, this_leaf->shared_cpu_map); @@ -219,7 +220,8 @@ static ssize_t show_shared_cpu_map(struct cache_info *this_leaf, char *buf)  	ssize_t	len;  	cpumask_t shared_cpu_map; -	cpus_and(shared_cpu_map, this_leaf->shared_cpu_map, cpu_online_map); +	cpumask_and(&shared_cpu_map, +				&this_leaf->shared_cpu_map, cpu_online_mask);  	len = cpumask_scnprintf(buf, NR_CPUS+1, &shared_cpu_map);  	len += sprintf(buf+len, "\n");  	return len; @@ -273,7 +275,7 @@ static struct attribute * cache_default_attrs[] = {  #define to_object(k) container_of(k, struct cache_info, kobj)  #define to_attr(a) container_of(a, struct cache_attr, attr) -static ssize_t cache_show(struct kobject * kobj, struct attribute * attr, char * buf) +static ssize_t ia64_cache_show(struct kobject * kobj, struct attribute * attr, char * buf)  {  	struct cache_attr *fattr = to_attr(attr);  	struct cache_info *this_leaf = to_object(kobj); @@ -284,7 +286,7 @@ static ssize_t cache_show(struct kobject * kobj, struct attribute * attr, char *  }  static const struct sysfs_ops cache_sysfs_ops = { -	.show   = cache_show +	.show   = ia64_cache_show  };  static struct kobj_type cache_ktype = { @@ -296,7 +298,7 @@ static struct kobj_type cache_ktype_percpu_entry = {  	.sysfs_ops	= &cache_sysfs_ops,  }; -static void __cpuinit cpu_cache_sysfs_exit(unsigned int cpu) +static void cpu_cache_sysfs_exit(unsigned int cpu)  {  	kfree(all_cpu_cache_info[cpu].cache_leaves);  	all_cpu_cache_info[cpu].cache_leaves = NULL; @@ -305,7 +307,7 @@ static void __cpuinit cpu_cache_sysfs_exit(unsigned int cpu)  	return;  } -static int __cpuinit cpu_cache_sysfs_init(unsigned int cpu) +static int cpu_cache_sysfs_init(unsigned int cpu)  {  	unsigned long i, levels, unique_caches;  	pal_cache_config_info_t cci; @@ -349,7 +351,7 @@ static int __cpuinit cpu_cache_sysfs_init(unsigned int cpu)  }  /* Add cache interface for CPU device */ -static int __cpuinit cache_add_dev(struct sys_device * sys_dev) +static int cache_add_dev(struct device *sys_dev)  {  	unsigned int cpu = sys_dev->id;  	unsigned long i, j; @@ -399,7 +401,7 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev)  }  /* Remove cache interface for CPU device */ -static int __cpuinit cache_remove_dev(struct sys_device * sys_dev) +static int cache_remove_dev(struct device *sys_dev)  {  	unsigned int cpu = sys_dev->id;  	unsigned long i; @@ -423,13 +425,13 @@ static int __cpuinit cache_remove_dev(struct sys_device * sys_dev)   * When a cpu is hot-plugged, do a check and initiate   * cache kobject if necessary   */ -static int __cpuinit cache_cpu_callback(struct notifier_block *nfb, +static int cache_cpu_callback(struct notifier_block *nfb,  		unsigned long action, void *hcpu)  {  	unsigned int cpu = (unsigned long)hcpu; -	struct sys_device *sys_dev; +	struct device *sys_dev; -	sys_dev = get_cpu_sysdev(cpu); +	sys_dev = get_cpu_device(cpu);  	switch (action) {  	case CPU_ONLINE:  	case CPU_ONLINE_FROZEN: @@ -443,7 +445,7 @@ static int __cpuinit cache_cpu_callback(struct notifier_block *nfb,  	return NOTIFY_OK;  } -static struct notifier_block __cpuinitdata cache_cpu_notifier = +static struct notifier_block cache_cpu_notifier =  {  	.notifier_call = cache_cpu_callback  }; @@ -452,12 +454,16 @@ static int __init cache_sysfs_init(void)  {  	int i; +	cpu_notifier_register_begin(); +  	for_each_online_cpu(i) { -		struct sys_device *sys_dev = get_cpu_sysdev((unsigned int)i); +		struct device *sys_dev = get_cpu_device((unsigned int)i);  		cache_add_dev(sys_dev);  	} -	register_hotcpu_notifier(&cache_cpu_notifier); +	__register_hotcpu_notifier(&cache_cpu_notifier); + +	cpu_notifier_register_done();  	return 0;  } diff --git a/arch/ia64/kernel/traps.c b/arch/ia64/kernel/traps.c index fd80e70018a..d3636e67a98 100644 --- a/arch/ia64/kernel/traps.c +++ b/arch/ia64/kernel/traps.c @@ -22,6 +22,7 @@  #include <asm/intrinsics.h>  #include <asm/processor.h>  #include <asm/uaccess.h> +#include <asm/setup.h>  fpswa_interface_t *fpswa_interface;  EXPORT_SYMBOL(fpswa_interface); @@ -71,7 +72,7 @@ die (const char *str, struct pt_regs *regs, long err)  	bust_spinlocks(0);  	die.lock_owner = -1; -	add_taint(TAINT_DIE); +	add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);  	spin_unlock_irq(&die.lock);  	if (!regs) @@ -629,7 +630,7 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,  		printk(KERN_ERR "  iip - 0x%lx, ifa - 0x%lx, isr - 0x%lx\n",  		       iip, ifa, isr);  		force_sig(SIGSEGV, current); -		break; +		return;  	      case 46:  		printk(KERN_ERR "Unexpected IA-32 intercept trap (Trap 46)\n"); diff --git a/arch/ia64/kernel/uncached.c b/arch/ia64/kernel/uncached.c index c4696d217ce..20e8a9b21d7 100644 --- a/arch/ia64/kernel/uncached.c +++ b/arch/ia64/kernel/uncached.c @@ -23,9 +23,8 @@  #include <linux/gfp.h>  #include <asm/page.h>  #include <asm/pal.h> -#include <asm/system.h>  #include <asm/pgtable.h> -#include <asm/atomic.h> +#include <linux/atomic.h>  #include <asm/tlbflush.h>  #include <asm/sn/arch.h> @@ -99,7 +98,7 @@ static int uncached_add_chunk(struct uncached_pool *uc_pool, int nid)  	/* attempt to allocate a granule's worth of cached memory pages */  	page = alloc_pages_exact_node(nid, -				GFP_KERNEL | __GFP_ZERO | GFP_THISNODE, +				GFP_KERNEL | __GFP_ZERO | __GFP_THISNODE,  				IA64_GRANULE_SHIFT-PAGE_SHIFT);  	if (!page) {  		mutex_unlock(&uc_pool->add_chunk_mutex); diff --git a/arch/ia64/kernel/unwind.c b/arch/ia64/kernel/unwind.c index fed6afa2e8a..8f66195999e 100644 --- a/arch/ia64/kernel/unwind.c +++ b/arch/ia64/kernel/unwind.c @@ -41,7 +41,6 @@  #include <asm/ptrace_offsets.h>  #include <asm/rse.h>  #include <asm/sections.h> -#include <asm/system.h>  #include <asm/uaccess.h>  #include "entry.h" diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S index 5a4d044dcb1..84f8a52ac5a 100644 --- a/arch/ia64/kernel/vmlinux.lds.S +++ b/arch/ia64/kernel/vmlinux.lds.S @@ -1,7 +1,6 @@  #include <asm/cache.h>  #include <asm/ptrace.h> -#include <asm/system.h>  #include <asm/pgtable.h>  #include <asm-generic/vmlinux.lds.h> @@ -183,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 @@ -198,7 +191,7 @@ SECTIONS {  	/* Per-cpu data: */  	. = ALIGN(PERCPU_PAGE_SIZE); -	PERCPU_VADDR(PERCPU_ADDR, :percpu) +	PERCPU_VADDR(SMP_CACHE_BYTES, PERCPU_ADDR, :percpu)  	__phys_per_cpu_start = __per_cpu_load;  	/*  	 * ensure percpu data fits @@ -209,6 +202,7 @@ SECTIONS {  	data : {  	} :data  	.data : AT(ADDR(.data) - LOAD_OFFSET) { +		_sdata  =  .;  		INIT_TASK_DATA(PAGE_SIZE)  		CACHELINE_ALIGNED_DATA(SMP_CACHE_BYTES)  		READ_MOSTLY_DATA(SMP_CACHE_BYTES) diff --git a/arch/ia64/kvm/Kconfig b/arch/ia64/kvm/Kconfig index fa4d1e59deb..990b86420cc 100644 --- a/arch/ia64/kvm/Kconfig +++ b/arch/ia64/kvm/Kconfig @@ -19,12 +19,13 @@ if VIRTUALIZATION  config KVM  	tristate "Kernel-based Virtual Machine (KVM) support" -	depends on HAVE_KVM && MODULES && EXPERIMENTAL -	# for device assignment: -	depends on PCI +	depends on BROKEN +	depends on HAVE_KVM && MODULES +	depends on BROKEN  	select PREEMPT_NOTIFIERS  	select ANON_INODES  	select HAVE_KVM_IRQCHIP +	select HAVE_KVM_IRQ_ROUTING  	select KVM_APIC_ARCHITECTURE  	select KVM_MMIO  	---help--- @@ -48,7 +49,17 @@ config KVM_INTEL  	  Provides support for KVM on Itanium 2 processors equipped with the VT  	  extensions. +config KVM_DEVICE_ASSIGNMENT +	bool "KVM legacy PCI device assignment support" +	depends on KVM && PCI && IOMMU_API +	default y +	---help--- +	  Provide support for legacy PCI device assignment through KVM.  The +	  kernel now also supports a full featured userspace device driver +	  framework through VFIO, which supersedes much of this support. + +	  If unsure, say Y. +  source drivers/vhost/Kconfig -source drivers/virtio/Kconfig  endif # VIRTUALIZATION diff --git a/arch/ia64/kvm/Makefile b/arch/ia64/kvm/Makefile index 1089b3e918a..18e45ec49bb 100644 --- a/arch/ia64/kvm/Makefile +++ b/arch/ia64/kvm/Makefile @@ -45,14 +45,15 @@ FORCE : $(obj)/$(offsets-file)  # Makefile for Kernel-based Virtual Machine module  # -EXTRA_CFLAGS += -Ivirt/kvm -Iarch/ia64/kvm/ -EXTRA_AFLAGS += -Ivirt/kvm -Iarch/ia64/kvm/ +ccflags-y := -Ivirt/kvm -Iarch/ia64/kvm/ +asflags-y := -Ivirt/kvm -Iarch/ia64/kvm/ +KVM := ../../../virt/kvm -common-objs = $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o \ -		coalesced_mmio.o irq_comm.o assigned-dev.o) +common-objs = $(KVM)/kvm_main.o $(KVM)/ioapic.o \ +		$(KVM)/coalesced_mmio.o $(KVM)/irq_comm.o -ifeq ($(CONFIG_IOMMU_API),y) -common-objs += $(addprefix ../../../virt/kvm/, iommu.o) +ifeq ($(CONFIG_KVM_DEVICE_ASSIGNMENT),y) +common-objs += $(KVM)/assigned-dev.o $(KVM)/iommu.o  endif  kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c index f56a6316e13..6a4309bb821 100644 --- a/arch/ia64/kvm/kvm-ia64.c +++ b/arch/ia64/kvm/kvm-ia64.c @@ -1,5 +1,5 @@  /* - * kvm_ia64.c: Basic KVM suppport On Itanium series processors + * kvm_ia64.c: Basic KVM support On Itanium series processors   *   *   * 	Copyright (C) 2007, Intel Corporation. @@ -33,6 +33,7 @@  #include <linux/uaccess.h>  #include <linux/iommu.h>  #include <linux/intel-iommu.h> +#include <linux/pci.h>  #include <asm/pgtable.h>  #include <asm/gcc_intrin.h> @@ -198,14 +199,17 @@ int kvm_dev_ioctl_check_extension(long ext)  	case KVM_CAP_IRQCHIP:  	case KVM_CAP_MP_STATE:  	case KVM_CAP_IRQ_INJECT_STATUS: +	case KVM_CAP_IOAPIC_POLARITY_IGNORED:  		r = 1;  		break;  	case KVM_CAP_COALESCED_MMIO:  		r = KVM_COALESCED_MMIO_PAGE_OFFSET;  		break; +#ifdef CONFIG_KVM_DEVICE_ASSIGNMENT  	case KVM_CAP_IOMMU: -		r = iommu_found(); +		r = iommu_present(&pci_bus_type);  		break; +#endif  	default:  		r = 0;  	} @@ -231,12 +235,12 @@ static int handle_mmio(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)  	if ((p->addr & PAGE_MASK) == IOAPIC_DEFAULT_BASE_ADDRESS)  		goto mmio;  	vcpu->mmio_needed = 1; -	vcpu->mmio_phys_addr = kvm_run->mmio.phys_addr = p->addr; -	vcpu->mmio_size = kvm_run->mmio.len = p->size; +	vcpu->mmio_fragments[0].gpa = kvm_run->mmio.phys_addr = p->addr; +	vcpu->mmio_fragments[0].len = kvm_run->mmio.len = p->size;  	vcpu->mmio_is_write = kvm_run->mmio.is_write = !p->dir;  	if (vcpu->mmio_is_write) -		memcpy(vcpu->mmio_data, &p->data, p->size); +		memcpy(vcpu->arch.mmio_data, &p->data, p->size);  	memcpy(kvm_run->mmio.data, &p->data, p->size);  	kvm_run->exit_reason = KVM_EXIT_MMIO;  	return 0; @@ -662,6 +666,7 @@ again:  		goto vcpu_run_fail;  	srcu_read_unlock(&vcpu->kvm->srcu, idx); +	vcpu->mode = IN_GUEST_MODE;  	kvm_guest_enter();  	/* @@ -683,6 +688,7 @@ again:  	 */  	barrier();  	kvm_guest_exit(); +	vcpu->mode = OUTSIDE_GUEST_MODE;  	preempt_enable();  	idx = srcu_read_lock(&vcpu->kvm->srcu); @@ -697,7 +703,7 @@ again:  out:  	srcu_read_unlock(&vcpu->kvm->srcu, idx);  	if (r > 0) { -		kvm_resched(vcpu); +		cond_resched();  		idx = srcu_read_lock(&vcpu->kvm->srcu);  		goto again;  	} @@ -716,7 +722,7 @@ static void kvm_set_mmio_data(struct kvm_vcpu *vcpu)  	struct kvm_mmio_req *p = kvm_get_vcpu_ioreq(vcpu);  	if (!vcpu->mmio_is_write) -		memcpy(&p->data, vcpu->mmio_data, 8); +		memcpy(&p->data, vcpu->arch.mmio_data, 8);  	p->state = STATE_IORESP_READY;  } @@ -736,7 +742,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)  	}  	if (vcpu->mmio_needed) { -		memcpy(vcpu->mmio_data, kvm_run->mmio.data, 8); +		memcpy(vcpu->arch.mmio_data, kvm_run->mmio.data, 8);  		kvm_set_mmio_data(vcpu);  		vcpu->mmio_read_completed = 1;  		vcpu->mmio_needed = 0; @@ -749,7 +755,7 @@ out:  	return r;  } -static struct kvm *kvm_alloc_kvm(void) +struct kvm *kvm_arch_alloc_vm(void)  {  	struct kvm *kvm; @@ -760,7 +766,7 @@ static struct kvm *kvm_alloc_kvm(void)  	vm_base = __get_free_pages(GFP_KERNEL, get_order(KVM_VM_DATA_SIZE));  	if (!vm_base) -		return ERR_PTR(-ENOMEM); +		return NULL;  	memset((void *)vm_base, 0, KVM_VM_DATA_SIZE);  	kvm = (struct kvm *)(vm_base + @@ -771,13 +777,13 @@ static struct kvm *kvm_alloc_kvm(void)  	return kvm;  } -struct kvm_io_range { +struct kvm_ia64_io_range {  	unsigned long start;  	unsigned long size;  	unsigned long type;  }; -static const struct kvm_io_range io_ranges[] = { +static const struct kvm_ia64_io_range io_ranges[] = {  	{VGA_IO_START, VGA_IO_SIZE, GPFN_FRAME_BUFFER},  	{MMIO_START, MMIO_SIZE, GPFN_LOW_MMIO},  	{LEGACY_IO_START, LEGACY_IO_SIZE, GPFN_LEGACY_IO}, @@ -806,10 +812,15 @@ static void kvm_build_io_pmt(struct kvm *kvm)  #define GUEST_PHYSICAL_RR4	0x2739  #define VMM_INIT_RR		0x1660 -static void kvm_init_vm(struct kvm *kvm) +int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)  {  	BUG_ON(!kvm); +	if (type) +		return -EINVAL; + +	kvm->arch.is_sn2 = ia64_platform_is("sn2"); +  	kvm->arch.metaphysical_rr0 = GUEST_PHYSICAL_RR0;  	kvm->arch.metaphysical_rr4 = GUEST_PHYSICAL_RR4;  	kvm->arch.vmm_init_rr = VMM_INIT_RR; @@ -823,21 +834,8 @@ static void kvm_init_vm(struct kvm *kvm)  	/* Reserve bit 0 of irq_sources_bitmap for userspace irq source */  	set_bit(KVM_USERSPACE_IRQ_SOURCE_ID, &kvm->arch.irq_sources_bitmap); -} - -struct  kvm *kvm_arch_create_vm(void) -{ -	struct kvm *kvm = kvm_alloc_kvm(); - -	if (IS_ERR(kvm)) -		return ERR_PTR(-ENOMEM); - -	kvm->arch.is_sn2 = ia64_platform_is("sn2"); - -	kvm_init_vm(kvm); - -	return kvm; +	return 0;  }  static int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, @@ -929,6 +927,18 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)  	return 0;  } +int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_event, +		bool line_status) +{ +	if (!irqchip_in_kernel(kvm)) +		return -ENXIO; + +	irq_event->status = kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, +					irq_event->irq, irq_event->level, +					line_status); +	return 0; +} +  long kvm_arch_vm_ioctl(struct file *filp,  		unsigned int ioctl, unsigned long arg)  { @@ -937,24 +947,6 @@ long kvm_arch_vm_ioctl(struct file *filp,  	int r = -ENOTTY;  	switch (ioctl) { -	case KVM_SET_MEMORY_REGION: { -		struct kvm_memory_region kvm_mem; -		struct kvm_userspace_memory_region kvm_userspace_mem; - -		r = -EFAULT; -		if (copy_from_user(&kvm_mem, argp, sizeof kvm_mem)) -			goto out; -		kvm_userspace_mem.slot = kvm_mem.slot; -		kvm_userspace_mem.flags = kvm_mem.flags; -		kvm_userspace_mem.guest_phys_addr = -					kvm_mem.guest_phys_addr; -		kvm_userspace_mem.memory_size = kvm_mem.memory_size; -		r = kvm_vm_ioctl_set_memory_region(kvm, -					&kvm_userspace_mem, 0); -		if (r) -			goto out; -		break; -		}  	case KVM_CREATE_IRQCHIP:  		r = -EFAULT;  		r = kvm_ioapic_init(kvm); @@ -962,33 +954,12 @@ long kvm_arch_vm_ioctl(struct file *filp,  			goto out;  		r = kvm_setup_default_irq_routing(kvm);  		if (r) { +			mutex_lock(&kvm->slots_lock);  			kvm_ioapic_destroy(kvm); +			mutex_unlock(&kvm->slots_lock);  			goto out;  		}  		break; -	case KVM_IRQ_LINE_STATUS: -	case KVM_IRQ_LINE: { -		struct kvm_irq_level irq_event; - -		r = -EFAULT; -		if (copy_from_user(&irq_event, argp, sizeof irq_event)) -			goto out; -		r = -ENXIO; -		if (irqchip_in_kernel(kvm)) { -			__s32 status; -			status = kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, -				    irq_event.irq, irq_event.level); -			if (ioctl == KVM_IRQ_LINE_STATUS) { -				r = -EFAULT; -				irq_event.status = status; -				if (copy_to_user(argp, &irq_event, -							sizeof irq_event)) -					goto out; -			} -			r = 0; -		} -		break; -		}  	case KVM_GET_IRQCHIP: {  		/* 0: PIC master, 1: PIC slave, 2: IOAPIC */  		struct kvm_irqchip chip; @@ -1175,6 +1146,11 @@ out:  #define PALE_RESET_ENTRY    0x80000000ffffffb0UL +bool kvm_vcpu_compatible(struct kvm_vcpu *vcpu) +{ +	return irqchip_in_kernel(vcpu->kvm) == (vcpu->arch.apic != NULL); +} +  int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)  {  	struct kvm_vcpu *v; @@ -1341,6 +1317,11 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)  	return 0;  } +int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) +{ +	return 0; +} +  int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)  {  	return -EINVAL; @@ -1357,7 +1338,7 @@ int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,  	return -EINVAL;  } -static void free_kvm(struct kvm *kvm) +void kvm_arch_free_vm(struct kvm *kvm)  {  	unsigned long vm_base = kvm->arch.vm_base; @@ -1372,14 +1353,10 @@ static void kvm_release_vm_pages(struct kvm *kvm)  {  	struct kvm_memslots *slots;  	struct kvm_memory_slot *memslot; -	int i, j; -	unsigned long base_gfn; +	int j;  	slots = kvm_memslots(kvm); -	for (i = 0; i < slots->nmemslots; i++) { -		memslot = &slots->memslots[i]; -		base_gfn = memslot->base_gfn; - +	kvm_for_each_memslot(memslot, slots) {  		for (j = 0; j < memslot->npages; j++) {  			if (memslot->rmap[j])  				put_page((struct page *)memslot->rmap[j]); @@ -1394,14 +1371,9 @@ void kvm_arch_sync_events(struct kvm *kvm)  void kvm_arch_destroy_vm(struct kvm *kvm)  {  	kvm_iommu_unmap_guest(kvm); -#ifdef  KVM_CAP_DEVICE_ASSIGNMENT  	kvm_free_all_assigned_devices(kvm); -#endif  	kfree(kvm->arch.vioapic);  	kvm_release_vm_pages(kvm); -	kvm_free_physmem(kvm); -	cleanup_srcu_struct(&kvm->srcu); -	free_kvm(kvm);  }  void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu) @@ -1574,11 +1546,30 @@ out:  	return r;  } +int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf) +{ +	return VM_FAULT_SIGBUS; +} + +void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *free, +			   struct kvm_memory_slot *dont) +{ +} + +int kvm_arch_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot, +			    unsigned long npages) +{ +	return 0; +} + +void kvm_arch_memslots_updated(struct kvm *kvm) +{ +} +  int kvm_arch_prepare_memory_region(struct kvm *kvm,  		struct kvm_memory_slot *memslot, -		struct kvm_memory_slot old,  		struct kvm_userspace_memory_region *mem, -		int user_alloc) +		enum kvm_mr_change change)  {  	unsigned long i;  	unsigned long pfn; @@ -1608,17 +1599,23 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,  void kvm_arch_commit_memory_region(struct kvm *kvm,  		struct kvm_userspace_memory_region *mem, -		struct kvm_memory_slot old, -		int user_alloc) +		const struct kvm_memory_slot *old, +		enum kvm_mr_change change)  {  	return;  } -void kvm_arch_flush_shadow(struct kvm *kvm) +void kvm_arch_flush_shadow_all(struct kvm *kvm)  {  	kvm_flush_remote_tlbs(kvm);  } +void kvm_arch_flush_shadow_memslot(struct kvm *kvm, +				   struct kvm_memory_slot *slot) +{ +	kvm_arch_flush_shadow_all(); +} +  long kvm_arch_dev_ioctl(struct file *filp,  			unsigned int ioctl, unsigned long arg)  { @@ -1826,10 +1823,10 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,  	mutex_lock(&kvm->slots_lock);  	r = -EINVAL; -	if (log->slot >= KVM_MEMORY_SLOTS) +	if (log->slot >= KVM_USER_MEM_SLOTS)  		goto out; -	memslot = &kvm->memslots->memslots[log->slot]; +	memslot = id_to_memslot(kvm->memslots, log->slot);  	r = -ENOENT;  	if (!memslot->dirty_bitmap)  		goto out; @@ -1860,21 +1857,6 @@ void kvm_arch_hardware_unsetup(void)  {  } -void kvm_vcpu_kick(struct kvm_vcpu *vcpu) -{ -	int me; -	int cpu = vcpu->cpu; - -	if (waitqueue_active(&vcpu->wq)) -		wake_up_interruptible(&vcpu->wq); - -	me = get_cpu(); -	if (cpu != me && (unsigned) cpu < nr_cpu_ids && cpu_online(cpu)) -		if (!test_and_set_bit(KVM_REQ_KICK, &vcpu->requests)) -			smp_send_reschedule(cpu); -	put_cpu(); -} -  int kvm_apic_set_irq(struct kvm_vcpu *vcpu, struct kvm_lapic_irq *irq)  {  	return __apic_accept_irq(vcpu, irq->vector); @@ -1944,6 +1926,11 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)  		(kvm_highest_pending_irq(vcpu) != -1);  } +int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu) +{ +	return (!test_and_set_bit(KVM_REQ_KICK, &vcpu->requests)); +} +  int kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,  				    struct kvm_mp_state *mp_state)  { diff --git a/arch/ia64/kvm/mmio.c b/arch/ia64/kvm/mmio.c index fb8f9f59a1e..f1e17d3d6cd 100644 --- a/arch/ia64/kvm/mmio.c +++ b/arch/ia64/kvm/mmio.c @@ -130,7 +130,7 @@ static void mmio_access(struct kvm_vcpu *vcpu, u64 src_pa, u64 *dest,  	local_irq_save(psr); -	/*Intercept the acces for PIB range*/ +	/*Intercept the access for PIB range*/  	if (iot == GPFN_PIB) {  		if (!dir)  			lsapic_write(vcpu, src_pa, s, *dest); diff --git a/arch/ia64/kvm/process.c b/arch/ia64/kvm/process.c index bb862fb224f..b0398740b48 100644 --- a/arch/ia64/kvm/process.c +++ b/arch/ia64/kvm/process.c @@ -987,7 +987,7 @@ static void vmm_sanity_check(struct kvm_vcpu *vcpu)  static void kvm_do_resume_op(struct kvm_vcpu *vcpu)  { -	vmm_sanity_check(vcpu); /*Guarantee vcpu runing on healthy vmm!*/ +	vmm_sanity_check(vcpu); /*Guarantee vcpu running on healthy vmm!*/  	if (test_and_clear_bit(KVM_REQ_RESUME, &vcpu->requests)) {  		vcpu_do_resume(vcpu); diff --git a/arch/ia64/kvm/vmm.c b/arch/ia64/kvm/vmm.c index f0b9cac8241..176a12cd56d 100644 --- a/arch/ia64/kvm/vmm.c +++ b/arch/ia64/kvm/vmm.c @@ -20,9 +20,9 @@   */ -#include<linux/kernel.h> -#include<linux/module.h> -#include<asm/fpswa.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <asm/fpswa.h>  #include "vcpu.h" diff --git a/arch/ia64/kvm/vmm_ivt.S b/arch/ia64/kvm/vmm_ivt.S index 24018484c6e..397e34a63e1 100644 --- a/arch/ia64/kvm/vmm_ivt.S +++ b/arch/ia64/kvm/vmm_ivt.S @@ -64,7 +64,7 @@  #include "kvm_minstate.h"  #include "vti.h" -#if 1 +#if 0  # define PSR_DEFAULT_BITS   psr.ac  #else  # define PSR_DEFAULT_BITS   0 diff --git a/arch/ia64/kvm/vti.h b/arch/ia64/kvm/vti.h index f6c5617e16a..b214b5b0432 100644 --- a/arch/ia64/kvm/vti.h +++ b/arch/ia64/kvm/vti.h @@ -83,13 +83,13 @@  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; +		unsigned int a_int:1; +		unsigned int a_from_int_cr:1; +		unsigned int a_to_int_cr:1; +		unsigned int a_from_psr:1; +		unsigned int a_from_cpuid:1; +		unsigned int a_cover:1; +		unsigned int a_bsw:1;  		long reserved:57;  	};  }; @@ -97,12 +97,12 @@ union vac {  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; +		unsigned int d_vmsw:1; +		unsigned int d_extint:1; +		unsigned int d_ibr_dbr:1; +		unsigned int d_pmc:1; +		unsigned int d_to_pmd:1; +		unsigned int d_itm:1;  		long reserved:58;  	};  }; diff --git a/arch/ia64/kvm/vtlb.c b/arch/ia64/kvm/vtlb.c index 4332f7ee520..a7869f8f49a 100644 --- a/arch/ia64/kvm/vtlb.c +++ b/arch/ia64/kvm/vtlb.c @@ -256,7 +256,7 @@ u64 guest_vhpt_lookup(u64 iha, u64 *pte)  			"srlz.d;;"  			"ssm psr.i;;"  			"srlz.d;;" -			: "=r"(ret) : "r"(iha), "r"(pte):"memory"); +			: "=&r"(ret) : "r"(iha), "r"(pte) : "memory");  	return ret;  } diff --git a/arch/ia64/lib/do_csum.S b/arch/ia64/lib/do_csum.S index 6bec2fc9f5b..1a431a5cf86 100644 --- a/arch/ia64/lib/do_csum.S +++ b/arch/ia64/lib/do_csum.S @@ -201,7 +201,7 @@ GLOBAL_ENTRY(do_csum)  	;;  (p6)	adds result1[0]=1,result1[0]  (p9)	br.cond.sptk .do_csum_exit	// if (count == 1) exit -	// Fall through to caluculate the checksum, feeding result1[0] as +	// Fall through to calculate the checksum, feeding result1[0] as  	// the initial value in result1[0].  	//  	// Calculate the checksum loading two 8-byte words per loop. diff --git a/arch/ia64/mm/contig.c b/arch/ia64/mm/contig.c index 54bf5405981..52715a71aed 100644 --- a/arch/ia64/mm/contig.c +++ b/arch/ia64/mm/contig.c @@ -16,6 +16,7 @@   */  #include <linux/bootmem.h>  #include <linux/efi.h> +#include <linux/memblock.h>  #include <linux/mm.h>  #include <linux/nmi.h>  #include <linux/swap.h> @@ -30,70 +31,6 @@  static unsigned long max_gap;  #endif -/** - * show_mem - give short summary of memory stats - * - * Shows a simple page count of reserved and used pages in the system. - * For discontig machines, it does this on a per-pgdat basis. - */ -void show_mem(void) -{ -	int i, total_reserved = 0; -	int total_shared = 0, total_cached = 0; -	unsigned long total_present = 0; -	pg_data_t *pgdat; - -	printk(KERN_INFO "Mem-info:\n"); -	show_free_areas(); -	printk(KERN_INFO "Node memory in pages:\n"); -	for_each_online_pgdat(pgdat) { -		unsigned long present; -		unsigned long flags; -		int shared = 0, cached = 0, reserved = 0; - -		pgdat_resize_lock(pgdat, &flags); -		present = pgdat->node_present_pages; -		for(i = 0; i < pgdat->node_spanned_pages; i++) { -			struct page *page; -			if (unlikely(i % MAX_ORDER_NR_PAGES == 0)) -				touch_nmi_watchdog(); -			if (pfn_valid(pgdat->node_start_pfn + i)) -				page = pfn_to_page(pgdat->node_start_pfn + i); -			else { -#ifdef CONFIG_VIRTUAL_MEM_MAP -				if (max_gap < LARGE_GAP) -					continue; -#endif -				i = vmemmap_find_next_valid_pfn(pgdat->node_id, -					 i) - 1; -				continue; -			} -			if (PageReserved(page)) -				reserved++; -			else if (PageSwapCache(page)) -				cached++; -			else if (page_count(page)) -				shared += page_count(page)-1; -		} -		pgdat_resize_unlock(pgdat, &flags); -		total_present += present; -		total_reserved += reserved; -		total_cached += cached; -		total_shared += shared; -		printk(KERN_INFO "Node %4d:  RAM: %11ld, rsvd: %8d, " -		       "shrd: %10d, swpd: %10d\n", pgdat->node_id, -		       present, reserved, shared, cached); -	} -	printk(KERN_INFO "%ld pages of RAM\n", total_present); -	printk(KERN_INFO "%d reserved pages\n", total_reserved); -	printk(KERN_INFO "%d pages shared\n", total_shared); -	printk(KERN_INFO "%d pages swap cached\n", total_cached); -	printk(KERN_INFO "Total of %ld pages in page table cache\n", -	       quicklist_total_size()); -	printk(KERN_INFO "%d free buffer pages\n", nr_free_buffer_pages()); -} - -  /* physical address where the bootmem map is located */  unsigned long bootmap_start; @@ -151,8 +88,7 @@ static void *cpu_data;   *   * Allocate and setup per-cpu data areas.   */ -void * __cpuinit -per_cpu_init (void) +void *per_cpu_init(void)  {  	static bool first_time = true;  	void *cpu0_data = __cpu0_per_cpu; @@ -290,14 +226,6 @@ find_memory (void)  	alloc_per_cpu_data();  } -static int count_pages(u64 start, u64 end, void *arg) -{ -	unsigned long *count = arg; - -	*count += (end - start) >> PAGE_SHIFT; -	return 0; -} -  /*   * Set up the page tables.   */ @@ -308,9 +236,6 @@ paging_init (void)  	unsigned long max_dma;  	unsigned long max_zone_pfns[MAX_NR_ZONES]; -	num_physpages = 0; -	efi_memmap_walk(count_pages, &num_physpages); -  	memset(max_zone_pfns, 0, sizeof(max_zone_pfns));  #ifdef CONFIG_ZONE_DMA  	max_dma = virt_to_phys((void *) MAX_DMA_ADDRESS) >> PAGE_SHIFT; @@ -346,7 +271,7 @@ paging_init (void)  		printk("Virtual mem_map starts at 0x%p\n", mem_map);  	}  #else /* !CONFIG_VIRTUAL_MEM_MAP */ -	add_active_range(0, 0, max_low_pfn); +	memblock_add_node(0, PFN_PHYS(max_low_pfn), 0);  	free_area_init_nodes(max_zone_pfns);  #endif /* !CONFIG_VIRTUAL_MEM_MAP */  	zero_page_memmap_ptr = virt_to_page(ia64_imva(empty_zero_page)); diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c index 61620323bb6..87862680536 100644 --- a/arch/ia64/mm/discontig.c +++ b/arch/ia64/mm/discontig.c @@ -37,7 +37,6 @@ struct early_node_data {  	struct ia64_node_data *node_data;  	unsigned long pernode_addr;  	unsigned long pernode_size; -	unsigned long num_physpages;  #ifdef CONFIG_ZONE_DMA  	unsigned long num_dma_physpages;  #endif @@ -593,7 +592,7 @@ void __init find_memory(void)   * find_pernode_space() does most of this already, we just need to set   * local_per_cpu_offset   */ -void __cpuinit *per_cpu_init(void) +void *per_cpu_init(void)  {  	int cpu;  	static int first_time = 1; @@ -609,65 +608,6 @@ void __cpuinit *per_cpu_init(void)  #endif /* CONFIG_SMP */  /** - * show_mem - give short summary of memory stats - * - * Shows a simple page count of reserved and used pages in the system. - * For discontig machines, it does this on a per-pgdat basis. - */ -void show_mem(void) -{ -	int i, total_reserved = 0; -	int total_shared = 0, total_cached = 0; -	unsigned long total_present = 0; -	pg_data_t *pgdat; - -	printk(KERN_INFO "Mem-info:\n"); -	show_free_areas(); -	printk(KERN_INFO "Node memory in pages:\n"); -	for_each_online_pgdat(pgdat) { -		unsigned long present; -		unsigned long flags; -		int shared = 0, cached = 0, reserved = 0; - -		pgdat_resize_lock(pgdat, &flags); -		present = pgdat->node_present_pages; -		for(i = 0; i < pgdat->node_spanned_pages; i++) { -			struct page *page; -			if (unlikely(i % MAX_ORDER_NR_PAGES == 0)) -				touch_nmi_watchdog(); -			if (pfn_valid(pgdat->node_start_pfn + i)) -				page = pfn_to_page(pgdat->node_start_pfn + i); -			else { -				i = vmemmap_find_next_valid_pfn(pgdat->node_id, -					 i) - 1; -				continue; -			} -			if (PageReserved(page)) -				reserved++; -			else if (PageSwapCache(page)) -				cached++; -			else if (page_count(page)) -				shared += page_count(page)-1; -		} -		pgdat_resize_unlock(pgdat, &flags); -		total_present += present; -		total_reserved += reserved; -		total_cached += cached; -		total_shared += shared; -		printk(KERN_INFO "Node %4d:  RAM: %11ld, rsvd: %8d, " -		       "shrd: %10d, swpd: %10d\n", pgdat->node_id, -		       present, reserved, shared, cached); -	} -	printk(KERN_INFO "%ld pages of RAM\n", total_present); -	printk(KERN_INFO "%d reserved pages\n", total_reserved); -	printk(KERN_INFO "%d pages shared\n", total_shared); -	printk(KERN_INFO "%d pages swap cached\n", total_cached); -	printk(KERN_INFO "Total of %ld pages in page table cache\n", -	       quicklist_total_size()); -	printk(KERN_INFO "%d free buffer pages\n", nr_free_buffer_pages()); -} - -/**   * call_pernode_memory - use SRAT to call callback functions with node info   * @start: physical start of range   * @len: length of range @@ -728,7 +668,6 @@ static __init int count_node_pages(unsigned long start, unsigned long len, int n  {  	unsigned long end = start + len; -	mem_data[node].num_physpages += len >> PAGE_SHIFT;  #ifdef CONFIG_ZONE_DMA  	if (start <= __pa(MAX_DMA_ADDRESS))  		mem_data[node].num_dma_physpages += @@ -774,7 +713,6 @@ void __init paging_init(void)  #endif  	for_each_online_node(node) { -		num_physpages += mem_data[node].num_physpages;  		pfn_offset = mem_data[node].min_pfn;  #ifdef CONFIG_VIRTUAL_MEM_MAP @@ -815,9 +753,12 @@ void arch_refresh_nodedata(int update_node, pg_data_t *update_pgdat)  #endif  #ifdef CONFIG_SPARSEMEM_VMEMMAP -int __meminit vmemmap_populate(struct page *start_page, -						unsigned long size, int node) +int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node) +{ +	return vmemmap_populate_basepages(start, end, node); +} + +void vmemmap_free(unsigned long start, unsigned long end)  { -	return vmemmap_populate_basepages(start_page, size, node);  }  #endif diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c index 0799fea4c58..7225dad8709 100644 --- a/arch/ia64/mm/fault.c +++ b/arch/ia64/mm/fault.c @@ -10,10 +10,10 @@  #include <linux/interrupt.h>  #include <linux/kprobes.h>  #include <linux/kdebug.h> +#include <linux/prefetch.h>  #include <asm/pgtable.h>  #include <asm/processor.h> -#include <asm/system.h>  #include <asm/uaccess.h>  extern int die(char *, struct pt_regs *, long); @@ -72,6 +72,10 @@ mapped_kernel_page_is_present (unsigned long address)  	return pte_present(pte);  } +#	define VM_READ_BIT	0 +#	define VM_WRITE_BIT	1 +#	define VM_EXEC_BIT	2 +  void __kprobes  ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *regs)  { @@ -81,6 +85,10 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re  	struct siginfo si;  	unsigned long mask;  	int fault; +	unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; + +	mask = ((((isr >> IA64_ISR_X_BIT) & 1UL) << VM_EXEC_BIT) +		| (((isr >> IA64_ISR_W_BIT) & 1UL) << VM_WRITE_BIT));  	/* mmap_sem is performance critical.... */  	prefetchw(&mm->mmap_sem); @@ -109,6 +117,11 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re  	if (notify_page_fault(regs, TRAP_BRKPT))  		return; +	if (user_mode(regs)) +		flags |= FAULT_FLAG_USER; +	if (mask & VM_WRITE) +		flags |= FAULT_FLAG_WRITE; +retry:  	down_read(&mm->mmap_sem);  	vma = find_vma_prev(mm, address, &prev_vma); @@ -130,10 +143,6 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re  	/* OK, we've got a good vm_area for this memory area.  Check the access permissions: */ -#	define VM_READ_BIT	0 -#	define VM_WRITE_BIT	1 -#	define VM_EXEC_BIT	2 -  #	if (((1 << VM_READ_BIT) != VM_READ || (1 << VM_WRITE_BIT) != VM_WRITE) \  	    || (1 << VM_EXEC_BIT) != VM_EXEC)  #		error File is out of sync with <linux/mm.h>.  Please update. @@ -142,9 +151,6 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re  	if (((isr >> IA64_ISR_R_BIT) & 1UL) && (!(vma->vm_flags & (VM_READ | VM_WRITE))))  		goto bad_area; -	mask = (  (((isr >> IA64_ISR_X_BIT) & 1UL) << VM_EXEC_BIT) -		| (((isr >> IA64_ISR_W_BIT) & 1UL) << VM_WRITE_BIT)); -  	if ((vma->vm_flags & mask) != mask)  		goto bad_area; @@ -153,7 +159,11 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re  	 * sure we exit gracefully rather than endlessly redo the  	 * fault.  	 */ -	fault = handle_mm_fault(mm, vma, address, (mask & VM_WRITE) ? FAULT_FLAG_WRITE : 0); +	fault = handle_mm_fault(mm, vma, address, flags); + +	if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) +		return; +  	if (unlikely(fault & VM_FAULT_ERROR)) {  		/*  		 * We ran out of memory, or some other thing happened @@ -168,10 +178,25 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re  		}  		BUG();  	} -	if (fault & VM_FAULT_MAJOR) -		current->maj_flt++; -	else -		current->min_flt++; + +	if (flags & FAULT_FLAG_ALLOW_RETRY) { +		if (fault & VM_FAULT_MAJOR) +			current->maj_flt++; +		else +			current->min_flt++; +		if (fault & VM_FAULT_RETRY) { +			flags &= ~FAULT_FLAG_ALLOW_RETRY; +			flags |= FAULT_FLAG_TRIED; + +			 /* No need to up_read(&mm->mmap_sem) as we would +			 * have already released it in __lock_page_or_retry +			 * in mm/filemap.c. +			 */ + +			goto retry; +		} +	} +  	up_read(&mm->mmap_sem);  	return; diff --git a/arch/ia64/mm/hugetlbpage.c b/arch/ia64/mm/hugetlbpage.c index 1841ee7e65f..76069c18ee4 100644 --- a/arch/ia64/mm/hugetlbpage.c +++ b/arch/ia64/mm/hugetlbpage.c @@ -38,7 +38,7 @@ huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz)  	if (pud) {  		pmd = pmd_alloc(mm, pud, taddr);  		if (pmd) -			pte = pte_alloc_map(mm, pmd, taddr); +			pte = pte_alloc_map(mm, NULL, pmd, taddr);  	}  	return pte;  } @@ -148,7 +148,7 @@ void hugetlb_free_pgd_range(struct mmu_gather *tlb,  unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,  		unsigned long pgoff, unsigned long flags)  { -	struct vm_area_struct *vmm; +	struct vm_unmapped_area_info info;  	if (len > RGN_MAP_LIMIT)  		return -ENOMEM; @@ -165,16 +165,14 @@ unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, u  	/* This code assumes that RGN_HPAGE != 0. */  	if ((REGION_NUMBER(addr) != RGN_HPAGE) || (addr & (HPAGE_SIZE - 1)))  		addr = HPAGE_REGION_BASE; -	else -		addr = ALIGN(addr, HPAGE_SIZE); -	for (vmm = find_vma(current->mm, addr); ; vmm = vmm->vm_next) { -		/* At this point:  (!vmm || addr < vmm->vm_end). */ -		if (REGION_OFFSET(addr) + len > RGN_MAP_LIMIT) -			return -ENOMEM; -		if (!vmm || (addr + len) <= vmm->vm_start) -			return addr; -		addr = ALIGN(vmm->vm_end, HPAGE_SIZE); -	} + +	info.flags = 0; +	info.length = len; +	info.low_limit = addr; +	info.high_limit = HPAGE_REGION_BASE + RGN_MAP_LIMIT; +	info.align_mask = PAGE_MASK & (HPAGE_SIZE - 1); +	info.align_offset = 0; +	return vm_unmapped_area(&info);  }  static int __init hugetlb_setup_sz(char *str) diff --git a/arch/ia64/mm/init.c b/arch/ia64/mm/init.c index ed41759efca..25c350264a4 100644 --- a/arch/ia64/mm/init.c +++ b/arch/ia64/mm/init.c @@ -10,6 +10,7 @@  #include <linux/bootmem.h>  #include <linux/efi.h>  #include <linux/elf.h> +#include <linux/memblock.h>  #include <linux/mm.h>  #include <linux/mmzone.h>  #include <linux/module.h> @@ -29,15 +30,12 @@  #include <asm/pgalloc.h>  #include <asm/sal.h>  #include <asm/sections.h> -#include <asm/system.h>  #include <asm/tlb.h>  #include <asm/uaccess.h>  #include <asm/unistd.h>  #include <asm/mca.h>  #include <asm/paravirt.h> -DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); -  extern void ia64_tlb_init (void);  unsigned long MAX_DMA_ADDRESS = PAGE_OFFSET + 0x100000000UL; @@ -140,7 +138,8 @@ ia64_init_addr_space (void)  			vma->vm_mm = current->mm;  			vma->vm_end = PAGE_SIZE;  			vma->vm_page_prot = __pgprot(pgprot_val(PAGE_READONLY) | _PAGE_MA_NAT); -			vma->vm_flags = VM_READ | VM_MAYREAD | VM_IO | VM_RESERVED; +			vma->vm_flags = VM_READ | VM_MAYREAD | VM_IO | +					VM_DONTEXPAND | VM_DONTDUMP;  			down_write(¤t->mm->mmap_sem);  			if (insert_vm_struct(current->mm, vma)) {  				up_write(¤t->mm->mmap_sem); @@ -155,25 +154,13 @@ ia64_init_addr_space (void)  void  free_initmem (void)  { -	unsigned long addr, eaddr; - -	addr = (unsigned long) ia64_imva(__init_begin); -	eaddr = (unsigned long) ia64_imva(__init_end); -	while (addr < eaddr) { -		ClearPageReserved(virt_to_page(addr)); -		init_page_count(virt_to_page(addr)); -		free_page(addr); -		++totalram_pages; -		addr += PAGE_SIZE; -	} -	printk(KERN_INFO "Freeing unused kernel memory: %ldkB freed\n", -	       (__init_end - __init_begin) >> 10); +	free_reserved_area(ia64_imva(__init_begin), ia64_imva(__init_end), +			   -1, "unused kernel");  }  void __init  free_initrd_mem (unsigned long start, unsigned long end)  { -	struct page *page;  	/*  	 * EFI uses 4KB pages while the kernel can use 4KB or bigger.  	 * Thus EFI and the kernel may have different page sizes. It is @@ -214,11 +201,7 @@ free_initrd_mem (unsigned long start, unsigned long end)  	for (; start < end; start += PAGE_SIZE) {  		if (!virt_addr_valid(start))  			continue; -		page = virt_to_page(start); -		ClearPageReserved(page); -		init_page_count(page); -		free_page(start); -		++totalram_pages; +		free_reserved_page(virt_to_page(start));  	}  } @@ -295,11 +278,10 @@ setup_gate (void)  	ia64_patch_gate();  } -void __devinit -ia64_mmu_init (void *my_cpu_data) +void ia64_mmu_init(void *my_cpu_data)  {  	unsigned long pta, impl_va_bits; -	extern void __devinit tlb_init (void); +	extern void tlb_init(void);  #ifdef CONFIG_DISABLE_VHPT  #	define VHPT_ENABLE_BIT	0 @@ -375,9 +357,7 @@ int vmemmap_find_next_valid_pfn(int node, int i)  	end_address = (unsigned long) &vmem_map[pgdat->node_start_pfn + i];  	end_address = PAGE_ALIGN(end_address); - -	stop_address = (unsigned long) &vmem_map[ -		pgdat->node_start_pfn + pgdat->node_spanned_pages]; +	stop_address = (unsigned long) &vmem_map[pgdat_end_pfn(pgdat)];  	do {  		pgd_t *pgd; @@ -559,21 +539,7 @@ int __init register_active_ranges(u64 start, u64 len, int nid)  #endif  	if (start < end) -		add_active_range(nid, __pa(start) >> PAGE_SHIFT, -			__pa(end) >> PAGE_SHIFT); -	return 0; -} - -static int __init -count_reserved_pages(u64 start, u64 end, void *arg) -{ -	unsigned long num_reserved = 0; -	unsigned long *count = arg; - -	for (; start < end; start += PAGE_SIZE) -		if (PageReserved(virt_to_page(start))) -			++num_reserved; -	*count += num_reserved; +		memblock_add_node(__pa(start), end - start, nid);  	return 0;  } @@ -615,8 +581,6 @@ __setup("nolwsys", nolwsys_setup);  void __init  mem_init (void)  { -	long reserved_pages, codesize, datasize, initsize; -	pg_data_t *pgdat;  	int i;  	BUG_ON(PTRS_PER_PGD * sizeof(pgd_t) != PAGE_SIZE); @@ -634,27 +598,12 @@ mem_init (void)  #ifdef CONFIG_FLATMEM  	BUG_ON(!mem_map); -	max_mapnr = max_low_pfn;  #endif +	set_max_mapnr(max_low_pfn);  	high_memory = __va(max_low_pfn * PAGE_SIZE); - -	for_each_online_pgdat(pgdat) -		if (pgdat->bdata->node_bootmem_map) -			totalram_pages += free_all_bootmem_node(pgdat); - -	reserved_pages = 0; -	efi_memmap_walk(count_reserved_pages, &reserved_pages); - -	codesize =  (unsigned long) _etext - (unsigned long) _stext; -	datasize =  (unsigned long) _edata - (unsigned long) _etext; -	initsize =  (unsigned long) __init_end - (unsigned long) __init_begin; - -	printk(KERN_INFO "Memory: %luk/%luk available (%luk code, %luk reserved, " -	       "%luk data, %luk init)\n", nr_free_pages() << (PAGE_SHIFT - 10), -	       num_physpages << (PAGE_SHIFT - 10), codesize >> 10, -	       reserved_pages << (PAGE_SHIFT - 10), datasize >> 10, initsize >> 10); - +	free_all_bootmem(); +	mem_init_print_info(NULL);  	/*  	 * For fsyscall entrpoints with no light-weight handler, use the ordinary @@ -691,6 +640,24 @@ int arch_add_memory(int nid, u64 start, u64 size)  	return ret;  } + +#ifdef CONFIG_MEMORY_HOTREMOVE +int arch_remove_memory(u64 start, u64 size) +{ +	unsigned long start_pfn = start >> PAGE_SHIFT; +	unsigned long nr_pages = size >> PAGE_SHIFT; +	struct zone *zone; +	int ret; + +	zone = page_zone(pfn_to_page(start_pfn)); +	ret = __remove_pages(zone, start_pfn, nr_pages); +	if (ret) +		pr_warn("%s: Problem encountered in __remove_pages() as" +			" ret=%d\n", __func__,  ret); + +	return ret; +} +#endif  #endif  /* @@ -717,3 +684,51 @@ per_linux32_init(void)  }  __initcall(per_linux32_init); + +/** + * show_mem - give short summary of memory stats + * + * Shows a simple page count of reserved and used pages in the system. + * For discontig machines, it does this on a per-pgdat basis. + */ +void show_mem(unsigned int filter) +{ +	int total_reserved = 0; +	unsigned long total_present = 0; +	pg_data_t *pgdat; + +	printk(KERN_INFO "Mem-info:\n"); +	show_free_areas(filter); +	printk(KERN_INFO "Node memory in pages:\n"); +	for_each_online_pgdat(pgdat) { +		unsigned long present; +		unsigned long flags; +		int reserved = 0; +		int nid = pgdat->node_id; +		int zoneid; + +		if (skip_free_areas_node(filter, nid)) +			continue; +		pgdat_resize_lock(pgdat, &flags); + +		for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) { +			struct zone *zone = &pgdat->node_zones[zoneid]; +			if (!populated_zone(zone)) +				continue; + +			reserved += zone->present_pages - zone->managed_pages; +		} +		present = pgdat->node_present_pages; + +		pgdat_resize_unlock(pgdat, &flags); +		total_present += present; +		total_reserved += reserved; +		printk(KERN_INFO "Node %4d:  RAM: %11ld, rsvd: %8d, ", +		       nid, present, reserved); +	} +	printk(KERN_INFO "%ld pages of RAM\n", total_present); +	printk(KERN_INFO "%d reserved pages\n", total_reserved); +	printk(KERN_INFO "Total of %ld pages in page table cache\n", +	       quicklist_total_size()); +	printk(KERN_INFO "%ld free buffer pages\n", nr_free_buffer_pages()); +} diff --git a/arch/ia64/mm/ioremap.c b/arch/ia64/mm/ioremap.c index 3dccdd8eb27..43964cde621 100644 --- a/arch/ia64/mm/ioremap.c +++ b/arch/ia64/mm/ioremap.c @@ -16,7 +16,7 @@  #include <asm/meminit.h>  static inline void __iomem * -__ioremap (unsigned long phys_addr) +__ioremap_uc(unsigned long phys_addr)  {  	return (void __iomem *) (__IA64_UNCACHED_OFFSET | phys_addr);  } @@ -24,7 +24,11 @@ __ioremap (unsigned long phys_addr)  void __iomem *  early_ioremap (unsigned long phys_addr, unsigned long size)  { -	return __ioremap(phys_addr); +	u64 attr; +	attr = kern_mem_attribute(phys_addr, size); +	if (attr & EFI_MEMORY_WB) +		return (void __iomem *) phys_to_virt(phys_addr); +	return __ioremap_uc(phys_addr);  }  void __iomem * @@ -47,7 +51,7 @@ ioremap (unsigned long phys_addr, unsigned long size)  	if (attr & EFI_MEMORY_WB)  		return (void __iomem *) phys_to_virt(phys_addr);  	else if (attr & EFI_MEMORY_UC) -		return __ioremap(phys_addr); +		return __ioremap_uc(phys_addr);  	/*  	 * Some chipsets don't support UC access to memory.  If @@ -93,7 +97,7 @@ ioremap (unsigned long phys_addr, unsigned long size)  		return (void __iomem *) (offset + (char __iomem *)addr);  	} -	return __ioremap(phys_addr); +	return __ioremap_uc(phys_addr);  }  EXPORT_SYMBOL(ioremap); @@ -103,7 +107,7 @@ ioremap_nocache (unsigned long phys_addr, unsigned long size)  	if (kern_mem_attribute(phys_addr, size) & EFI_MEMORY_WB)  		return NULL; -	return __ioremap(phys_addr); +	return __ioremap_uc(phys_addr);  }  EXPORT_SYMBOL(ioremap_nocache); diff --git a/arch/ia64/mm/numa.c b/arch/ia64/mm/numa.c index 3efea7d0a35..ea21d4cad54 100644 --- a/arch/ia64/mm/numa.c +++ b/arch/ia64/mm/numa.c @@ -61,18 +61,36 @@ paddr_to_nid(unsigned long paddr)  int __meminit __early_pfn_to_nid(unsigned long pfn)  {  	int i, section = pfn >> PFN_SECTION_SHIFT, ssec, esec; +	/* +	 * NOTE: The following SMP-unsafe globals are only used early in boot +	 * when the kernel is running single-threaded. +	 */ +	static int __meminitdata last_ssec, last_esec; +	static int __meminitdata last_nid; + +	if (section >= last_ssec && section < last_esec) +		return last_nid;  	for (i = 0; i < num_node_memblks; i++) {  		ssec = node_memblk[i].start_paddr >> PA_SECTION_SHIFT;  		esec = (node_memblk[i].start_paddr + node_memblk[i].size +  			((1L << PA_SECTION_SHIFT) - 1)) >> PA_SECTION_SHIFT; -		if (section >= ssec && section < esec) +		if (section >= ssec && section < esec) { +			last_ssec = ssec; +			last_esec = esec; +			last_nid = node_memblk[i].nid;  			return node_memblk[i].nid; +		}  	}  	return -1;  } +void numa_clear_node(int cpu) +{ +	unmap_cpu_from_node(cpu, NUMA_NO_NODE); +} +  #ifdef CONFIG_MEMORY_HOTPLUG  /*   *  SRAT information is stored in node_memblk[], then we can use SRAT diff --git a/arch/ia64/mm/tlb.c b/arch/ia64/mm/tlb.c index 7b3cdc6c6d9..ed612976868 100644 --- a/arch/ia64/mm/tlb.c +++ b/arch/ia64/mm/tlb.c @@ -337,8 +337,7 @@ flush_tlb_range (struct vm_area_struct *vma, unsigned long start,  }  EXPORT_SYMBOL(flush_tlb_range); -void __devinit -ia64_tlb_init (void) +void ia64_tlb_init(void)  {  	ia64_ptce_info_t uninitialized_var(ptce_info); /* GCC be quiet */  	u64 tr_pgbits; diff --git a/arch/ia64/oprofile/backtrace.c b/arch/ia64/oprofile/backtrace.c index 5cdd7e4a597..6a219a94605 100644 --- a/arch/ia64/oprofile/backtrace.c +++ b/arch/ia64/oprofile/backtrace.c @@ -14,7 +14,6 @@  #include <linux/sched.h>  #include <linux/mm.h>  #include <asm/ptrace.h> -#include <asm/system.h>  /*   * For IA64 we need to perform a complex little dance to get both @@ -29,7 +28,7 @@ typedef struct  	unsigned int depth;  	struct pt_regs *regs;  	struct unw_frame_info frame; -	u64 *prev_pfs_loc;	/* state for WAR for old spinlock ool code */ +	unsigned long *prev_pfs_loc;	/* state for WAR for old spinlock ool code */  } ia64_backtrace_t;  /* Returns non-zero if the PC is in the Interrupt Vector Table */ diff --git a/arch/ia64/pci/fixup.c b/arch/ia64/pci/fixup.c index f5959c0c181..1fe9aa5068e 100644 --- a/arch/ia64/pci/fixup.c +++ b/arch/ia64/pci/fixup.c @@ -5,6 +5,7 @@  #include <linux/pci.h>  #include <linux/init.h> +#include <linux/vgaarb.h>  #include <asm/machvec.h> @@ -19,25 +20,23 @@   * IORESOURCE_ROM_SHADOW is used to associate the boot video   * card with this copy. On laptops this copy has to be used since   * the main ROM may be compressed or combined with another image. - * See pci_map_rom() for use of this flag. IORESOURCE_ROM_SHADOW - * is marked here since the boot video device will be the only enabled - * video device at this point. + * See pci_map_rom() for use of this flag. Before marking the device + * with IORESOURCE_ROM_SHADOW check if a vga_default_device is already set + * by either arch cde or vga-arbitration, if so only apply the fixup to this + * already determined primary video card.   */ -static void __devinit pci_fixup_video(struct pci_dev *pdev) +static void pci_fixup_video(struct pci_dev *pdev)  {  	struct pci_dev *bridge;  	struct pci_bus *bus;  	u16 config; -	if ((strcmp(platform_name, "dig") != 0) -	    && (strcmp(platform_name, "hpzx1")  != 0)) +	if ((strcmp(ia64_platform_name, "dig") != 0) +	    && (strcmp(ia64_platform_name, "hpzx1")  != 0))  		return;  	/* Maybe, this machine supports legacy memory map. */ -	if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA) -		return; -  	/* Is VGA routed to us? */  	bus = pdev->bus;  	while (bus) { @@ -50,9 +49,7 @@ static void __devinit pci_fixup_video(struct pci_dev *pdev)  		 * type BRIDGE, or CARDBUS. Host to PCI controllers use  		 * PCI header type NORMAL.  		 */ -		if (bridge -		    &&((bridge->hdr_type == PCI_HEADER_TYPE_BRIDGE) -		       ||(bridge->hdr_type == PCI_HEADER_TYPE_CARDBUS))) { +		if (bridge && (pci_is_bridge(bridge))) {  			pci_read_config_word(bridge, PCI_BRIDGE_CONTROL,  						&config);  			if (!(config & PCI_BRIDGE_CTL_VGA)) @@ -60,10 +57,14 @@ static void __devinit pci_fixup_video(struct pci_dev *pdev)  		}  		bus = bus->parent;  	} -	pci_read_config_word(pdev, PCI_COMMAND, &config); -	if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { -		pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; -		dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n"); +	if (!vga_default_device() || pdev == vga_default_device()) { +		pci_read_config_word(pdev, PCI_COMMAND, &config); +		if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) { +			pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW; +			dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n"); +			vga_set_default_device(pdev); +		}  	}  } -DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_video); +DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID, +				PCI_CLASS_DISPLAY_VGA, 8, pci_fixup_video); diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c index aa2533ae7e9..291a582777c 100644 --- a/arch/ia64/pci/pci.c +++ b/arch/ia64/pci/pci.c @@ -15,15 +15,16 @@  #include <linux/types.h>  #include <linux/kernel.h>  #include <linux/pci.h> +#include <linux/pci-acpi.h>  #include <linux/init.h>  #include <linux/ioport.h>  #include <linux/slab.h>  #include <linux/spinlock.h>  #include <linux/bootmem.h> +#include <linux/export.h>  #include <asm/machvec.h>  #include <asm/page.h> -#include <asm/system.h>  #include <asm/io.h>  #include <asm/sal.h>  #include <asm/smp.h> @@ -116,8 +117,7 @@ struct pci_ops pci_root_ops = {  /* Called by ACPI when it finds a new root bus.  */ -static struct pci_controller * __devinit -alloc_pci_controller (int seg) +static struct pci_controller *alloc_pci_controller(int seg)  {  	struct pci_controller *controller; @@ -126,13 +126,17 @@ alloc_pci_controller (int seg)  		return NULL;  	controller->segment = seg; -	controller->node = -1;  	return controller;  }  struct pci_root_info {  	struct acpi_device *bridge;  	struct pci_controller *controller; +	struct list_head resources; +	struct resource *res; +	resource_size_t *res_offset; +	unsigned int res_num; +	struct list_head io_resources;  	char *name;  }; @@ -152,7 +156,7 @@ new_space (u64 phys_base, int sparse)  			return i;  	if (num_io_spaces == MAX_IO_SPACES) { -		printk(KERN_ERR "PCI: Too many IO port spaces " +		pr_err("PCI: Too many IO port spaces "  			"(MAX_IO_SPACES=%lu)\n", MAX_IO_SPACES);  		return ~0;  	} @@ -164,28 +168,25 @@ new_space (u64 phys_base, int sparse)  	return i;  } -static u64 __devinit -add_io_space (struct pci_root_info *info, struct acpi_resource_address64 *addr) +static u64 add_io_space(struct pci_root_info *info, +			struct acpi_resource_address64 *addr)  { +	struct iospace_resource *iospace;  	struct resource *resource;  	char *name;  	unsigned long base, min, max, base_port;  	unsigned int sparse = 0, space_nr, len; -	resource = kzalloc(sizeof(*resource), GFP_KERNEL); -	if (!resource) { -		printk(KERN_ERR "PCI: No memory for %s I/O port space\n", -			info->name); +	len = strlen(info->name) + 32; +	iospace = kzalloc(sizeof(*iospace) + len, GFP_KERNEL); +	if (!iospace) { +		dev_err(&info->bridge->dev, +				"PCI: No memory for %s I/O port space\n", +				info->name);  		goto out;  	} -	len = strlen(info->name) + 32; -	name = kzalloc(len, GFP_KERNEL); -	if (!name) { -		printk(KERN_ERR "PCI: No memory for %s I/O port space name\n", -			info->name); -		goto free_resource; -	} +	name = (char *)(iospace + 1);  	min = addr->minimum;  	max = min + addr->address_length - 1; @@ -194,7 +195,7 @@ add_io_space (struct pci_root_info *info, struct acpi_resource_address64 *addr)  	space_nr = new_space(addr->translation_offset, sparse);  	if (space_nr == ~0) -		goto free_name; +		goto free_resource;  	base = __pa(io_space[space_nr].mmio_base);  	base_port = IO_SPACE_BASE(space_nr); @@ -209,24 +210,29 @@ add_io_space (struct pci_root_info *info, struct acpi_resource_address64 *addr)  	if (space_nr == 0)  		sparse = 1; +	resource = &iospace->res;  	resource->name  = name;  	resource->flags = IORESOURCE_MEM;  	resource->start = base + (sparse ? IO_SPACE_SPARSE_ENCODING(min) : min);  	resource->end   = base + (sparse ? IO_SPACE_SPARSE_ENCODING(max) : max); -	insert_resource(&iomem_resource, resource); +	if (insert_resource(&iomem_resource, resource)) { +		dev_err(&info->bridge->dev, +				"can't allocate host bridge io space resource  %pR\n", +				resource); +		goto free_resource; +	} +	list_add_tail(&iospace->list, &info->io_resources);  	return base_port; -free_name: -	kfree(name);  free_resource: -	kfree(resource); +	kfree(iospace);  out:  	return ~0;  } -static acpi_status __devinit resource_to_window(struct acpi_resource *resource, -	struct acpi_resource_address64 *addr) +static acpi_status resource_to_window(struct acpi_resource *resource, +				      struct acpi_resource_address64 *addr)  {  	acpi_status status; @@ -248,8 +254,7 @@ static acpi_status __devinit resource_to_window(struct acpi_resource *resource,  	return AE_ERROR;  } -static acpi_status __devinit -count_window (struct acpi_resource *resource, void *data) +static acpi_status count_window(struct acpi_resource *resource, void *data)  {  	unsigned int *windows = (unsigned int *) data;  	struct acpi_resource_address64 addr; @@ -262,10 +267,10 @@ count_window (struct acpi_resource *resource, void *data)  	return AE_OK;  } -static __devinit acpi_status add_window(struct acpi_resource *res, void *data) +static acpi_status add_window(struct acpi_resource *res, void *data)  {  	struct pci_root_info *info = data; -	struct pci_window *window; +	struct resource *resource;  	struct acpi_resource_address64 addr;  	acpi_status status;  	unsigned long flags, offset = 0; @@ -289,164 +294,200 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data)  	} else  		return AE_OK; -	window = &info->controller->window[info->controller->windows++]; -	window->resource.name = info->name; -	window->resource.flags = flags; -	window->resource.start = addr.minimum + offset; -	window->resource.end = window->resource.start + addr.address_length - 1; -	window->resource.child = NULL; -	window->offset = offset; +	resource = &info->res[info->res_num]; +	resource->name = info->name; +	resource->flags = flags; +	resource->start = addr.minimum + offset; +	resource->end = resource->start + addr.address_length - 1; +	info->res_offset[info->res_num] = offset; -	if (insert_resource(root, &window->resource)) { +	if (insert_resource(root, resource)) {  		dev_err(&info->bridge->dev,  			"can't allocate host bridge window %pR\n", -			&window->resource); +			resource);  	} else {  		if (offset)  			dev_info(&info->bridge->dev, "host bridge window %pR "  				 "(PCI address [%#llx-%#llx])\n", -				 &window->resource, -				 window->resource.start - offset, -				 window->resource.end - offset); +				 resource, +				 resource->start - offset, +				 resource->end - offset);  		else  			dev_info(&info->bridge->dev, -				 "host bridge window %pR\n", -				 &window->resource); +				 "host bridge window %pR\n", resource);  	} - +	/* HP's firmware has a hack to work around a Windows bug. +	 * Ignore these tiny memory ranges */ +	if (!((resource->flags & IORESOURCE_MEM) && +	      (resource->end - resource->start < 16))) +		pci_add_resource_offset(&info->resources, resource, +					info->res_offset[info->res_num]); + +	info->res_num++;  	return AE_OK;  } -static void __devinit -pcibios_setup_root_windows(struct pci_bus *bus, struct pci_controller *ctrl) +static void free_pci_root_info_res(struct pci_root_info *info) +{ +	struct iospace_resource *iospace, *tmp; + +	list_for_each_entry_safe(iospace, tmp, &info->io_resources, list) +		kfree(iospace); + +	kfree(info->name); +	kfree(info->res); +	info->res = NULL; +	kfree(info->res_offset); +	info->res_offset = NULL; +	info->res_num = 0; +	kfree(info->controller); +	info->controller = NULL; +} + +static void __release_pci_root_info(struct pci_root_info *info)  {  	int i; +	struct resource *res; +	struct iospace_resource *iospace; + +	list_for_each_entry(iospace, &info->io_resources, list) +		release_resource(&iospace->res); + +	for (i = 0; i < info->res_num; i++) { +		res = &info->res[i]; + +		if (!res->parent) +			continue; -	pci_bus_remove_resources(bus); -	for (i = 0; i < ctrl->windows; i++) { -		struct resource *res = &ctrl->window[i].resource; -		/* HP's firmware has a hack to work around a Windows bug. -		 * Ignore these tiny memory ranges */ -		if ((res->flags & IORESOURCE_MEM) && -		    (res->end - res->start < 16)) +		if (!(res->flags & (IORESOURCE_MEM | IORESOURCE_IO)))  			continue; -		pci_bus_add_resource(bus, res, 0); + +		release_resource(res);  	} + +	free_pci_root_info_res(info); +	kfree(info); +} + +static void release_pci_root_info(struct pci_host_bridge *bridge) +{ +	struct pci_root_info *info = bridge->release_data; + +	__release_pci_root_info(info); +} + +static int +probe_pci_root_info(struct pci_root_info *info, struct acpi_device *device, +		int busnum, int domain) +{ +	char *name; + +	name = kmalloc(16, GFP_KERNEL); +	if (!name) +		return -ENOMEM; + +	sprintf(name, "PCI Bus %04x:%02x", domain, busnum); +	info->bridge = device; +	info->name = name; + +	acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window, +			&info->res_num); +	if (info->res_num) { +		info->res = +			kzalloc_node(sizeof(*info->res) * info->res_num, +				     GFP_KERNEL, info->controller->node); +		if (!info->res) { +			kfree(name); +			return -ENOMEM; +		} + +		info->res_offset = +			kzalloc_node(sizeof(*info->res_offset) * info->res_num, +					GFP_KERNEL, info->controller->node); +		if (!info->res_offset) { +			kfree(name); +			kfree(info->res); +			info->res = NULL; +			return -ENOMEM; +		} + +		info->res_num = 0; +		acpi_walk_resources(device->handle, METHOD_NAME__CRS, +			add_window, info); +	} else +		kfree(name); + +	return 0;  } -struct pci_bus * __devinit -pci_acpi_scan_root(struct acpi_pci_root *root) +struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)  {  	struct acpi_device *device = root->device;  	int domain = root->segment;  	int bus = root->secondary.start;  	struct pci_controller *controller; -	unsigned int windows = 0; +	struct pci_root_info *info = NULL; +	int busnum = root->secondary.start;  	struct pci_bus *pbus; -	char *name; -	int pxm; +	int ret;  	controller = alloc_pci_controller(domain);  	if (!controller) -		goto out1; +		return NULL; -	controller->acpi_handle = device->handle; +	controller->companion = device; +	controller->node = acpi_get_node(device->handle); -	pxm = acpi_get_pxm(controller->acpi_handle); -#ifdef CONFIG_NUMA -	if (pxm >= 0) -		controller->node = pxm_to_node(pxm); -#endif +	info = kzalloc(sizeof(*info), GFP_KERNEL); +	if (!info) { +		dev_err(&device->dev, +				"pci_bus %04x:%02x: ignored (out of memory)\n", +				domain, busnum); +		kfree(controller); +		return NULL; +	} -	acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window, -			&windows); -	if (windows) { -		struct pci_root_info info; - -		controller->window = -			kmalloc_node(sizeof(*controller->window) * windows, -				     GFP_KERNEL, controller->node); -		if (!controller->window) -			goto out2; - -		name = kmalloc(16, GFP_KERNEL); -		if (!name) -			goto out3; - -		sprintf(name, "PCI Bus %04x:%02x", domain, bus); -		info.bridge = device; -		info.controller = controller; -		info.name = name; -		acpi_walk_resources(device->handle, METHOD_NAME__CRS, -			add_window, &info); +	info->controller = controller; +	INIT_LIST_HEAD(&info->io_resources); +	INIT_LIST_HEAD(&info->resources); + +	ret = probe_pci_root_info(info, device, busnum, domain); +	if (ret) { +		kfree(info->controller); +		kfree(info); +		return NULL;  	} +	/* insert busn resource at first */ +	pci_add_resource(&info->resources, &root->secondary);  	/*  	 * See arch/x86/pci/acpi.c.  	 * The desired pci bus might already be scanned in a quirk. We  	 * should handle the case here, but it appears that IA64 hasn't  	 * such quirk. So we just ignore the case now.  	 */ -	pbus = pci_scan_bus_parented(NULL, bus, &pci_root_ops, controller); - -	return pbus; - -out3: -	kfree(controller->window); -out2: -	kfree(controller); -out1: -	return NULL; -} - -void pcibios_resource_to_bus(struct pci_dev *dev, -		struct pci_bus_region *region, struct resource *res) -{ -	struct pci_controller *controller = PCI_CONTROLLER(dev); -	unsigned long offset = 0; -	int i; - -	for (i = 0; i < controller->windows; i++) { -		struct pci_window *window = &controller->window[i]; -		if (!(window->resource.flags & res->flags)) -			continue; -		if (window->resource.start > res->start) -			continue; -		if (window->resource.end < res->end) -			continue; -		offset = window->offset; -		break; +	pbus = pci_create_root_bus(NULL, bus, &pci_root_ops, controller, +				   &info->resources); +	if (!pbus) { +		pci_free_resource_list(&info->resources); +		__release_pci_root_info(info); +		return NULL;  	} -	region->start = res->start - offset; -	region->end = res->end - offset; +	pci_set_host_bridge_release(to_pci_host_bridge(pbus->bridge), +			release_pci_root_info, info); +	pci_scan_child_bus(pbus); +	return pbus;  } -EXPORT_SYMBOL(pcibios_resource_to_bus); -void pcibios_bus_to_resource(struct pci_dev *dev, -		struct resource *res, struct pci_bus_region *region) +int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge)  { -	struct pci_controller *controller = PCI_CONTROLLER(dev); -	unsigned long offset = 0; -	int i; - -	for (i = 0; i < controller->windows; i++) { -		struct pci_window *window = &controller->window[i]; -		if (!(window->resource.flags & res->flags)) -			continue; -		if (window->resource.start - window->offset > region->start) -			continue; -		if (window->resource.end - window->offset < region->end) -			continue; -		offset = window->offset; -		break; -	} +	struct pci_controller *controller = bridge->bus->sysdata; -	res->start = region->start + offset; -	res->end = region->end + offset; +	ACPI_COMPANION_SET(&bridge->dev, controller->companion); +	return 0;  } -EXPORT_SYMBOL(pcibios_bus_to_resource); -static int __devinit is_valid_resource(struct pci_dev *dev, int idx) +static int is_valid_resource(struct pci_dev *dev, int idx)  {  	unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM;  	struct resource *devr = &dev->resource[idx], *busr; @@ -464,30 +505,25 @@ static int __devinit is_valid_resource(struct pci_dev *dev, int idx)  	return 0;  } -static void __devinit -pcibios_fixup_resources(struct pci_dev *dev, int start, int limit) +static void pcibios_fixup_resources(struct pci_dev *dev, int start, int limit)  { -	struct pci_bus_region region;  	int i;  	for (i = start; i < limit; i++) {  		if (!dev->resource[i].flags)  			continue; -		region.start = dev->resource[i].start; -		region.end = dev->resource[i].end; -		pcibios_bus_to_resource(dev, &dev->resource[i], ®ion);  		if ((is_valid_resource(dev, i)))  			pci_claim_resource(dev, i);  	}  } -void __devinit pcibios_fixup_device_resources(struct pci_dev *dev) +void pcibios_fixup_device_resources(struct pci_dev *dev)  {  	pcibios_fixup_resources(dev, 0, PCI_BRIDGE_RESOURCES);  }  EXPORT_SYMBOL_GPL(pcibios_fixup_device_resources); -static void __devinit pcibios_fixup_bridge_resources(struct pci_dev *dev) +static void pcibios_fixup_bridge_resources(struct pci_dev *dev)  {  	pcibios_fixup_resources(dev, PCI_BRIDGE_RESOURCES, PCI_NUM_RESOURCES);  } @@ -495,30 +531,32 @@ static void __devinit pcibios_fixup_bridge_resources(struct pci_dev *dev)  /*   *  Called after each bus is probed, but before its children are examined.   */ -void __devinit -pcibios_fixup_bus (struct pci_bus *b) +void pcibios_fixup_bus(struct pci_bus *b)  {  	struct pci_dev *dev;  	if (b->self) {  		pci_read_bridge_bases(b);  		pcibios_fixup_bridge_resources(b->self); -	} else { -		pcibios_setup_root_windows(b, b->sysdata);  	}  	list_for_each_entry(dev, &b->devices, bus_list)  		pcibios_fixup_device_resources(dev);  	platform_pci_fixup_bus(b); +} -	return; +void pcibios_add_bus(struct pci_bus *bus) +{ +	acpi_pci_add_bus(bus);  } -void __devinit -pcibios_update_irq (struct pci_dev *dev, int irq) +void pcibios_remove_bus(struct pci_bus *bus)  { -	pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq); +	acpi_pci_remove_bus(bus); +} -	/* ??? FIXME -- record old value for shutdown.  */ +void pcibios_set_master (struct pci_dev *dev) +{ +	/* No special bus mastering setup handling */  }  int @@ -550,15 +588,6 @@ pcibios_align_resource (void *data, const struct resource *res,  	return res->start;  } -/* - * PCI BIOS setup, always defaults to SAL interface - */ -char * __init -pcibios_setup (char *str) -{ -	return str; -} -  int  pci_mmap_page_range (struct pci_dev *dev, struct vm_area_struct *vma,  		     enum pci_mmap_state mmap_state, int write_combine) @@ -747,7 +776,7 @@ static void __init set_pci_dfl_cacheline_size(void)  	status = ia64_pal_cache_summary(&levels, &unique_caches);  	if (status != 0) { -		printk(KERN_ERR "%s: ia64_pal_cache_summary() failed " +		pr_err("%s: ia64_pal_cache_summary() failed "  			"(status=%ld)\n", __func__, status);  		return;  	} @@ -755,7 +784,7 @@ static void __init set_pci_dfl_cacheline_size(void)  	status = ia64_pal_cache_config_info(levels - 1,  				/* cache_type (data_or_unified)= */ 2, &cci);  	if (status != 0) { -		printk(KERN_ERR "%s: ia64_pal_cache_config_info() failed " +		pr_err("%s: ia64_pal_cache_config_info() failed "  			"(status=%ld)\n", __func__, status);  		return;  	} diff --git a/arch/ia64/sn/kernel/Makefile b/arch/ia64/sn/kernel/Makefile index 0591038735a..d27df1d45da 100644 --- a/arch/ia64/sn/kernel/Makefile +++ b/arch/ia64/sn/kernel/Makefile @@ -7,7 +7,7 @@  # Copyright (C) 1999,2001-2006,2008 Silicon Graphics, Inc.  All Rights Reserved.  # -EXTRA_CFLAGS += -Iarch/ia64/sn/include +ccflags-y := -Iarch/ia64/sn/include  obj-y				+= setup.o bte.o bte_error.o irq.o mca.o idle.o \  				   huberror.o io_acpi_init.o io_common.o \ diff --git a/arch/ia64/sn/kernel/huberror.c b/arch/ia64/sn/kernel/huberror.c index 08b0d9bb62e..f925dec2da9 100644 --- a/arch/ia64/sn/kernel/huberror.c +++ b/arch/ia64/sn/kernel/huberror.c @@ -192,6 +192,7 @@ void hub_error_init(struct hubdev_info *hubdev_info)  		    hubdev_info);  		return;  	} +	irq_set_handler(SGI_II_ERROR, handle_level_irq);  	sn_set_err_irq_affinity(SGI_II_ERROR);  } @@ -213,6 +214,7 @@ void ice_error_init(struct hubdev_info *hubdev_info)                         hubdev_info);  		return;  	} +	irq_set_handler(SGI_TIO_ERROR, handle_level_irq);  	sn_set_err_irq_affinity(SGI_TIO_ERROR);  } diff --git a/arch/ia64/sn/kernel/io_acpi_init.c b/arch/ia64/sn/kernel/io_acpi_init.c index 8cdcb173a13..0640739cc20 100644 --- a/arch/ia64/sn/kernel/io_acpi_init.c +++ b/arch/ia64/sn/kernel/io_acpi_init.c @@ -14,6 +14,7 @@  #include "xtalk/hubdev.h"  #include <linux/acpi.h>  #include <linux/slab.h> +#include <linux/export.h>  /* @@ -131,7 +132,7 @@ sn_get_bussoft_ptr(struct pci_bus *bus)  	struct acpi_resource_vendor_typed *vendor; -	handle = PCI_CONTROLLER(bus)->acpi_handle; +	handle = acpi_device_handle(PCI_CONTROLLER(bus)->companion);  	status = acpi_get_vendor_resource(handle, METHOD_NAME__CRS,  					  &sn_uuid, &buffer);  	if (ACPI_FAILURE(status)) { @@ -359,7 +360,7 @@ sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info,  	acpi_status status;  	struct acpi_buffer name_buffer = { ACPI_ALLOCATE_BUFFER, NULL }; -	rootbus_handle = PCI_CONTROLLER(dev)->acpi_handle; +	rootbus_handle = acpi_device_handle(PCI_CONTROLLER(dev)->companion);          status = acpi_evaluate_integer(rootbus_handle, METHOD_NAME__SEG, NULL,                                         &segment);          if (ACPI_SUCCESS(status)) { diff --git a/arch/ia64/sn/kernel/io_common.c b/arch/ia64/sn/kernel/io_common.c index 4433dd019d3..11f2275570f 100644 --- a/arch/ia64/sn/kernel/io_common.c +++ b/arch/ia64/sn/kernel/io_common.c @@ -7,6 +7,7 @@   */  #include <linux/bootmem.h> +#include <linux/export.h>  #include <linux/slab.h>  #include <asm/sn/types.h>  #include <asm/sn/addrs.h> @@ -228,7 +229,6 @@ void sn_pci_fixup_slot(struct pci_dev *dev, struct pcidev_info *pcidev_info,  {  	int segment = pci_domain_nr(dev->bus);  	struct pcibus_bussoft *bs; -	struct pci_bus *host_pci_bus;  	struct pci_dev *host_pci_dev;  	unsigned int bus_no, devfn; @@ -244,8 +244,7 @@ void sn_pci_fixup_slot(struct pci_dev *dev, struct pcidev_info *pcidev_info,  	bus_no = (pcidev_info->pdi_slot_host_handle >> 32) & 0xff;  	devfn = pcidev_info->pdi_slot_host_handle & 0xffffffff; - 	host_pci_bus = pci_find_bus(segment, bus_no); - 	host_pci_dev = pci_get_slot(host_pci_bus, devfn); +	host_pci_dev = pci_get_domain_bus_and_slot(segment, bus_no, devfn);  	pcidev_info->host_pci_dev = host_pci_dev;  	pcidev_info->pdi_linux_pcidev = dev; @@ -436,8 +435,7 @@ void sn_generate_path(struct pci_bus *pci_bus, char *address)  						geo_slot(geoid));  } -void __devinit -sn_pci_fixup_bus(struct pci_bus *bus) +void sn_pci_fixup_bus(struct pci_bus *bus)  {  	if (SN_ACPI_BASE_SUPPORT()) diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c index 98079f29d9a..0b5ce82d203 100644 --- a/arch/ia64/sn/kernel/io_init.c +++ b/arch/ia64/sn/kernel/io_init.c @@ -7,6 +7,7 @@   */  #include <linux/slab.h> +#include <linux/export.h>  #include <asm/sn/types.h>  #include <asm/sn/addrs.h>  #include <asm/sn/io.h> @@ -117,76 +118,26 @@ static void __init sn_fixup_ionodes(void)  }  /* - * sn_pci_legacy_window_fixup - Create PCI controller windows for + * sn_pci_legacy_window_fixup - Setup PCI resources for   *				legacy IO and MEM space. This needs to   *				be done here, as the PROM does not have   *				ACPI support defining the root buses   *				and their resources (_CRS),   */  static void -sn_legacy_pci_window_fixup(struct pci_controller *controller, -			   u64 legacy_io, u64 legacy_mem) +sn_legacy_pci_window_fixup(struct resource *res, +		u64 legacy_io, u64 legacy_mem)  { -		controller->window = kcalloc(2, sizeof(struct pci_window), -					     GFP_KERNEL); -		BUG_ON(controller->window == NULL); -		controller->window[0].offset = legacy_io; -		controller->window[0].resource.name = "legacy_io"; -		controller->window[0].resource.flags = IORESOURCE_IO; -		controller->window[0].resource.start = legacy_io; -		controller->window[0].resource.end = -	    			controller->window[0].resource.start + 0xffff; -		controller->window[0].resource.parent = &ioport_resource; -		controller->window[1].offset = legacy_mem; -		controller->window[1].resource.name = "legacy_mem"; -		controller->window[1].resource.flags = IORESOURCE_MEM; -		controller->window[1].resource.start = legacy_mem; -		controller->window[1].resource.end = -	    	       controller->window[1].resource.start + (1024 * 1024) - 1; -		controller->window[1].resource.parent = &iomem_resource; -		controller->windows = 2; -} - -/* - * sn_pci_window_fixup() - Create a pci_window for each device resource. - *			   It will setup pci_windows for use by - *			   pcibios_bus_to_resource(), pcibios_resource_to_bus(), - *			   etc. - */ -static void -sn_pci_window_fixup(struct pci_dev *dev, unsigned int count, -		    s64 * pci_addrs) -{ -	struct pci_controller *controller = PCI_CONTROLLER(dev->bus); -	unsigned int i; -	unsigned int idx; -	unsigned int new_count; -	struct pci_window *new_window; - -	if (count == 0) -		return; -	idx = controller->windows; -	new_count = controller->windows + count; -	new_window = kcalloc(new_count, sizeof(struct pci_window), GFP_KERNEL); -	BUG_ON(new_window == NULL); -	if (controller->window) { -		memcpy(new_window, controller->window, -		       sizeof(struct pci_window) * controller->windows); -		kfree(controller->window); -	} - -	/* Setup a pci_window for each device resource. */ -	for (i = 0; i <= PCI_ROM_RESOURCE; i++) { -		if (pci_addrs[i] == -1) -			continue; - -		new_window[idx].offset = dev->resource[i].start - pci_addrs[i]; -		new_window[idx].resource = dev->resource[i]; -		idx++; -	} - -	controller->windows = new_count; -	controller->window = new_window; +		res[0].name = "legacy_io"; +		res[0].flags = IORESOURCE_IO; +		res[0].start = legacy_io; +		res[0].end = res[0].start + 0xffff; +		res[0].parent = &ioport_resource; +		res[1].name = "legacy_mem"; +		res[1].flags = IORESOURCE_MEM; +		res[1].start = legacy_mem; +		res[1].end = res[1].start + (1024 * 1024) - 1; +		res[1].parent = &iomem_resource;  }  /* @@ -198,9 +149,7 @@ sn_pci_window_fixup(struct pci_dev *dev, unsigned int count,  void  sn_io_slot_fixup(struct pci_dev *dev)  { -	unsigned int count = 0;  	int idx; -	s64 pci_addrs[PCI_ROM_RESOURCE + 1];  	unsigned long addr, end, size, start;  	struct pcidev_info *pcidev_info;  	struct sn_irq_info *sn_irq_info; @@ -228,7 +177,6 @@ sn_io_slot_fixup(struct pci_dev *dev)  	for (idx = 0; idx <= PCI_ROM_RESOURCE; idx++) {  		if (!pcidev_info->pdi_pio_mapped_addr[idx]) { -			pci_addrs[idx] = -1;  			continue;  		} @@ -236,11 +184,8 @@ sn_io_slot_fixup(struct pci_dev *dev)  		end = dev->resource[idx].end;  		size = end - start;  		if (size == 0) { -			pci_addrs[idx] = -1;  			continue;  		} -		pci_addrs[idx] = start; -		count++;  		addr = pcidev_info->pdi_pio_mapped_addr[idx];  		addr = ((addr << 4) >> 4) | __IA64_UNCACHED_OFFSET;  		dev->resource[idx].start = addr; @@ -275,11 +220,6 @@ sn_io_slot_fixup(struct pci_dev *dev)  						 IORESOURCE_ROM_BIOS_COPY;  		}  	} -	/* Create a pci_window in the pci_controller struct for -	 * each device resource. -	 */ -	if (count > 0) -		sn_pci_window_fixup(dev, count, pci_addrs);  	sn_pci_fixup_slot(dev, pcidev_info, sn_irq_info);  } @@ -296,7 +236,8 @@ sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)  	s64 status = 0;  	struct pci_controller *controller;  	struct pcibus_bussoft *prom_bussoft_ptr; - +	struct resource *res; +	LIST_HEAD(resources);   	status = sal_get_pcibus_info((u64) segment, (u64) busnum,   				     (u64) ia64_tpa(&prom_bussoft_ptr)); @@ -308,24 +249,29 @@ sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)  	BUG_ON(!controller);  	controller->segment = segment; +	res = kcalloc(2, sizeof(struct resource), GFP_KERNEL); +	BUG_ON(!res); +  	/*  	 * Temporarily save the prom_bussoft_ptr for use by sn_bus_fixup().  	 * (platform_data will be overwritten later in sn_common_bus_fixup())  	 */  	controller->platform_data = prom_bussoft_ptr; -	bus = pci_scan_bus(busnum, &pci_root_ops, controller); - 	if (bus == NULL) - 		goto error_return; /* error, or bus already scanned */ - -	bus->sysdata = controller; - -	return; - -error_return: - -	kfree(controller); -	return; +	sn_legacy_pci_window_fixup(res, +			prom_bussoft_ptr->bs_legacy_io, +			prom_bussoft_ptr->bs_legacy_mem); +	pci_add_resource_offset(&resources,	&res[0], +			prom_bussoft_ptr->bs_legacy_io); +	pci_add_resource_offset(&resources,	&res[1], +			prom_bussoft_ptr->bs_legacy_mem); + +	bus = pci_scan_root_bus(NULL, busnum, &pci_root_ops, controller, +				&resources); + 	if (bus == NULL) { +		kfree(res); +		kfree(controller); +	}  }  /* @@ -347,9 +293,6 @@ sn_bus_fixup(struct pci_bus *bus)  			return;  		}  		sn_common_bus_fixup(bus, prom_bussoft_ptr); -		sn_legacy_pci_window_fixup(PCI_CONTROLLER(bus), -					   prom_bussoft_ptr->bs_legacy_io, -					   prom_bussoft_ptr->bs_legacy_mem);          }          list_for_each_entry(pci_dev, &bus->devices, bus_list) {                  sn_io_slot_fixup(pci_dev); diff --git a/arch/ia64/sn/kernel/irq.c b/arch/ia64/sn/kernel/irq.c index 13c15d96809..85d09515490 100644 --- a/arch/ia64/sn/kernel/irq.c +++ b/arch/ia64/sn/kernel/irq.c @@ -23,11 +23,9 @@  #include <asm/sn/sn_sal.h>  #include <asm/sn/sn_feature_sets.h> -static void force_interrupt(int irq);  static void register_intr_pda(struct sn_irq_info *sn_irq_info);  static void unregister_intr_pda(struct sn_irq_info *sn_irq_info); -int sn_force_interrupt_flag = 1;  extern int sn_ioif_inited;  struct list_head **sn_irq_lh;  static DEFINE_SPINLOCK(sn_irq_info_lock); /* non-IRQ lock */ @@ -78,66 +76,42 @@ u64 sn_intr_redirect(nasid_t local_nasid, int local_widget,  	return ret_stuff.status;  } -static unsigned int sn_startup_irq(unsigned int irq) +static unsigned int sn_startup_irq(struct irq_data *data)  {  	return 0;  } -static void sn_shutdown_irq(unsigned int irq) +static void sn_shutdown_irq(struct irq_data *data)  {  }  extern void ia64_mca_register_cpev(int); -static void sn_disable_irq(unsigned int irq) +static void sn_disable_irq(struct irq_data *data)  { -	if (irq == local_vector_to_irq(IA64_CPE_VECTOR)) +	if (data->irq == local_vector_to_irq(IA64_CPE_VECTOR))  		ia64_mca_register_cpev(0);  } -static void sn_enable_irq(unsigned int irq) +static void sn_enable_irq(struct irq_data *data)  { -	if (irq == local_vector_to_irq(IA64_CPE_VECTOR)) -		ia64_mca_register_cpev(irq); +	if (data->irq == local_vector_to_irq(IA64_CPE_VECTOR)) +		ia64_mca_register_cpev(data->irq);  } -static void sn_ack_irq(unsigned int irq) +static void sn_ack_irq(struct irq_data *data)  {  	u64 event_occurred, mask; +	unsigned int irq = data->irq & 0xff; -	irq = irq & 0xff;  	event_occurred = HUB_L((u64*)LOCAL_MMR_ADDR(SH_EVENT_OCCURRED));  	mask = event_occurred & SH_ALL_INT_MASK;  	HUB_S((u64*)LOCAL_MMR_ADDR(SH_EVENT_OCCURRED_ALIAS), mask);  	__set_bit(irq, (volatile void *)pda->sn_in_service_ivecs); -	move_native_irq(irq); +	irq_move_irq(data);  } -static void sn_end_irq(unsigned int irq) -{ -	int ivec; -	u64 event_occurred; - -	ivec = irq & 0xff; -	if (ivec == SGI_UART_VECTOR) { -		event_occurred = HUB_L((u64*)LOCAL_MMR_ADDR (SH_EVENT_OCCURRED)); -		/* If the UART bit is set here, we may have received an -		 * interrupt from the UART that the driver missed.  To -		 * make sure, we IPI ourselves to force us to look again. -		 */ -		if (event_occurred & SH_EVENT_OCCURRED_UART_INT_MASK) { -			platform_send_ipi(smp_processor_id(), SGI_UART_VECTOR, -					  IA64_IPI_DM_INT, 0); -		} -	} -	__clear_bit(ivec, (volatile void *)pda->sn_in_service_ivecs); -	if (sn_force_interrupt_flag) -		force_interrupt(irq); -} - -static void sn_irq_info_free(struct rcu_head *head); -  struct sn_irq_info *sn_retarget_vector(struct sn_irq_info *sn_irq_info,  				       nasid_t nasid, int slice)  { @@ -176,12 +150,11 @@ struct sn_irq_info *sn_retarget_vector(struct sn_irq_info *sn_irq_info,  	 * PROM does not support SAL_INTR_REDIRECT, or it failed.  	 * Revert to old method.  	 */ -	new_irq_info = kmalloc(sizeof(struct sn_irq_info), GFP_ATOMIC); +	new_irq_info = kmemdup(sn_irq_info, sizeof(struct sn_irq_info), +			       GFP_ATOMIC);  	if (new_irq_info == NULL)  		return NULL; -	memcpy(new_irq_info, sn_irq_info, sizeof(struct sn_irq_info)); -  	/* Free the old PROM new_irq_info structure */  	sn_intr_free(local_nasid, local_widget, new_irq_info);  	unregister_intr_pda(new_irq_info); @@ -201,7 +174,7 @@ struct sn_irq_info *sn_retarget_vector(struct sn_irq_info *sn_irq_info,  	spin_lock(&sn_irq_info_lock);  	list_replace_rcu(&sn_irq_info->list, &new_irq_info->list);  	spin_unlock(&sn_irq_info_lock); -	call_rcu(&sn_irq_info->rcu, sn_irq_info_free); +	kfree_rcu(sn_irq_info, rcu);  finish_up: @@ -228,14 +201,16 @@ finish_up:  	return new_irq_info;  } -static int sn_set_affinity_irq(unsigned int irq, const struct cpumask *mask) +static int sn_set_affinity_irq(struct irq_data *data, +			       const struct cpumask *mask, bool force)  {  	struct sn_irq_info *sn_irq_info, *sn_irq_info_safe; +	unsigned int irq = data->irq;  	nasid_t nasid;  	int slice; -	nasid = cpuid_to_nasid(cpumask_first(mask)); -	slice = cpuid_to_slice(cpumask_first(mask)); +	nasid = cpuid_to_nasid(cpumask_first_and(mask, cpu_online_mask)); +	slice = cpuid_to_slice(cpumask_first_and(mask, cpu_online_mask));  	list_for_each_entry_safe(sn_irq_info, sn_irq_info_safe,  				 sn_irq_lh[irq], list) @@ -249,7 +224,7 @@ void sn_set_err_irq_affinity(unsigned int irq)  {          /*           * On systems which support CPU disabling (SHub2), all error interrupts -         * are targetted at the boot CPU. +         * are targeted at the boot CPU.           */          if (is_shub2() && sn_prom_feature_available(PRF_CPU_DISABLE_SUPPORT))                  set_irq_affinity_info(irq, cpu_physical_id(0), 0); @@ -259,26 +234,25 @@ void sn_set_err_irq_affinity(unsigned int irq) { }  #endif  static void -sn_mask_irq(unsigned int irq) +sn_mask_irq(struct irq_data *data)  {  }  static void -sn_unmask_irq(unsigned int irq) +sn_unmask_irq(struct irq_data *data)  {  }  struct irq_chip irq_type_sn = { -	.name		= "SN hub", -	.startup	= sn_startup_irq, -	.shutdown	= sn_shutdown_irq, -	.enable		= sn_enable_irq, -	.disable	= sn_disable_irq, -	.ack		= sn_ack_irq, -	.end		= sn_end_irq, -	.mask		= sn_mask_irq, -	.unmask		= sn_unmask_irq, -	.set_affinity	= sn_set_affinity_irq +	.name			= "SN hub", +	.irq_startup		= sn_startup_irq, +	.irq_shutdown		= sn_shutdown_irq, +	.irq_enable		= sn_enable_irq, +	.irq_disable		= sn_disable_irq, +	.irq_ack		= sn_ack_irq, +	.irq_mask		= sn_mask_irq, +	.irq_unmask		= sn_unmask_irq, +	.irq_set_affinity	= sn_set_affinity_irq  };  ia64_vector sn_irq_to_vector(int irq) @@ -296,15 +270,13 @@ unsigned int sn_local_vector_to_irq(u8 vector)  void sn_irq_init(void)  {  	int i; -	struct irq_desc *base_desc = irq_desc;  	ia64_first_device_vector = IA64_SN2_FIRST_DEVICE_VECTOR;  	ia64_last_device_vector = IA64_SN2_LAST_DEVICE_VECTOR;  	for (i = 0; i < NR_IRQS; i++) { -		if (base_desc[i].chip == &no_irq_chip) { -			base_desc[i].chip = &irq_type_sn; -		} +		if (irq_get_chip(i) == &no_irq_chip) +			irq_set_chip(i, &irq_type_sn);  	}  } @@ -363,14 +335,6 @@ static void unregister_intr_pda(struct sn_irq_info *sn_irq_info)  	rcu_read_unlock();  } -static void sn_irq_info_free(struct rcu_head *head) -{ -	struct sn_irq_info *sn_irq_info; - -	sn_irq_info = container_of(head, struct sn_irq_info, rcu); -	kfree(sn_irq_info); -} -  void sn_irq_fixup(struct pci_dev *pci_dev, struct sn_irq_info *sn_irq_info)  {  	nasid_t nasid = sn_irq_info->irq_nasid; @@ -378,7 +342,6 @@ void sn_irq_fixup(struct pci_dev *pci_dev, struct sn_irq_info *sn_irq_info)  	int cpu = nasid_slice_to_cpuid(nasid, slice);  #ifdef CONFIG_SMP  	int cpuphys; -	struct irq_desc *desc;  #endif  	pci_dev_get(pci_dev); @@ -389,18 +352,19 @@ void sn_irq_fixup(struct pci_dev *pci_dev, struct sn_irq_info *sn_irq_info)  	spin_lock(&sn_irq_info_lock);  	list_add_rcu(&sn_irq_info->list, sn_irq_lh[sn_irq_info->irq_irq]);  	reserve_irq_vector(sn_irq_info->irq_irq); +	if (sn_irq_info->irq_int_bit != -1) +		irq_set_handler(sn_irq_info->irq_irq, handle_level_irq);  	spin_unlock(&sn_irq_info_lock);  	register_intr_pda(sn_irq_info);  #ifdef CONFIG_SMP  	cpuphys = cpu_physical_id(cpu);  	set_irq_affinity_info(sn_irq_info->irq_irq, cpuphys, 0); -	desc = irq_to_desc(sn_irq_info->irq_irq);  	/*  	 * Affinity was set by the PROM, prevent it from  	 * being reset by the request_irq() path.  	 */ -	desc->status |= IRQ_AFFINITY_SET; +	irqd_mark_affinity_was_set(irq_get_irq_data(sn_irq_info->irq_irq));  #endif  } @@ -426,7 +390,7 @@ void sn_irq_unfixup(struct pci_dev *pci_dev)  	spin_unlock(&sn_irq_info_lock);  	if (list_empty(sn_irq_lh[sn_irq_info->irq_irq]))  		free_irq_vector(sn_irq_info->irq_irq); -	call_rcu(&sn_irq_info->rcu, sn_irq_info_free); +	kfree_rcu(sn_irq_info, rcu);  	pci_dev_put(pci_dev);  } @@ -439,25 +403,11 @@ sn_call_force_intr_provider(struct sn_irq_info *sn_irq_info)  	pci_provider = sn_pci_provider[sn_irq_info->irq_bridge_type];  	/* Don't force an interrupt if the irq has been disabled */ -	if (!(irq_desc[sn_irq_info->irq_irq].status & IRQ_DISABLED) && +	if (!irqd_irq_disabled(irq_get_irq_data(sn_irq_info->irq_irq)) &&  	    pci_provider && pci_provider->force_interrupt)  		(*pci_provider->force_interrupt)(sn_irq_info);  } -static void force_interrupt(int irq) -{ -	struct sn_irq_info *sn_irq_info; - -	if (!sn_ioif_inited) -		return; - -	rcu_read_lock(); -	list_for_each_entry_rcu(sn_irq_info, sn_irq_lh[irq], list) -		sn_call_force_intr_provider(sn_irq_info); - -	rcu_read_unlock(); -} -  /*   * Check for lost interrupts.  If the PIC int_status reg. says that   * an interrupt has been sent, but not handled, and the interrupt @@ -476,7 +426,7 @@ static void sn_check_intr(int irq, struct sn_irq_info *sn_irq_info)  	/*  	 * Bridge types attached to TIO (anything but PIC) do not need this WAR  	 * since they do not target Shub II interrupt registers.  If that -	 * ever changes, this check needs to accomodate. +	 * ever changes, this check needs to accommodate.  	 */  	if (sn_irq_info->irq_bridge_type != PCIIO_ASIC_TYPE_PIC)  		return; diff --git a/arch/ia64/sn/kernel/msi_sn.c b/arch/ia64/sn/kernel/msi_sn.c index a5e500f0285..afc58d2799a 100644 --- a/arch/ia64/sn/kernel/msi_sn.c +++ b/arch/ia64/sn/kernel/msi_sn.c @@ -144,16 +144,16 @@ int sn_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *entry)  	 */  	msg.data = 0x100 + irq; -	set_irq_msi(irq, entry); +	irq_set_msi_desc(irq, entry);  	write_msi_msg(irq, &msg); -	set_irq_chip_and_handler(irq, &sn_msi_chip, handle_edge_irq); +	irq_set_chip_and_handler(irq, &sn_msi_chip, handle_edge_irq);  	return 0;  }  #ifdef CONFIG_SMP -static int sn_set_msi_irq_affinity(unsigned int irq, -				    const struct cpumask *cpu_mask) +static int sn_set_msi_irq_affinity(struct irq_data *data, +				   const struct cpumask *cpu_mask, bool force)  {  	struct msi_msg msg;  	int slice; @@ -164,9 +164,9 @@ static int sn_set_msi_irq_affinity(unsigned int irq,  	struct sn_irq_info *sn_irq_info;  	struct sn_irq_info *new_irq_info;  	struct sn_pcibus_provider *provider; -	unsigned int cpu; +	unsigned int cpu, irq = data->irq; -	cpu = cpumask_first(cpu_mask); +	cpu = cpumask_first_and(cpu_mask, cpu_online_mask);  	sn_irq_info = sn_msi_info[irq].sn_irq_info;  	if (sn_irq_info == NULL || sn_irq_info->irq_int_bit >= 0)  		return -1; @@ -206,33 +206,33 @@ static int sn_set_msi_irq_affinity(unsigned int irq,  	msg.address_lo = (u32)(bus_addr & 0x00000000ffffffff);  	write_msi_msg(irq, &msg); -	cpumask_copy(irq_desc[irq].affinity, cpu_mask); +	cpumask_copy(data->affinity, cpu_mask);  	return 0;  }  #endif /* CONFIG_SMP */ -static void sn_ack_msi_irq(unsigned int irq) +static void sn_ack_msi_irq(struct irq_data *data)  { -	move_native_irq(irq); +	irq_move_irq(data);  	ia64_eoi();  } -static int sn_msi_retrigger_irq(unsigned int irq) +static int sn_msi_retrigger_irq(struct irq_data *data)  { -	unsigned int vector = irq; +	unsigned int vector = data->irq;  	ia64_resend_irq(vector);  	return 1;  }  static struct irq_chip sn_msi_chip = { -	.name		= "PCI-MSI", -	.irq_mask	= mask_msi_irq, -	.irq_unmask	= unmask_msi_irq, -	.ack		= sn_ack_msi_irq, +	.name			= "PCI-MSI", +	.irq_mask		= mask_msi_irq, +	.irq_unmask		= unmask_msi_irq, +	.irq_ack		= sn_ack_msi_irq,  #ifdef CONFIG_SMP -	.set_affinity	= sn_set_msi_irq_affinity, +	.irq_set_affinity	= sn_set_msi_irq_affinity,  #endif -	.retrigger	= sn_msi_retrigger_irq, +	.irq_retrigger		= sn_msi_retrigger_irq,  }; diff --git a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c index dbc4cbecb5e..53b01b8e2f1 100644 --- a/arch/ia64/sn/kernel/setup.c +++ b/arch/ia64/sn/kernel/setup.c @@ -33,9 +33,9 @@  #include <asm/io.h>  #include <asm/sal.h>  #include <asm/machvec.h> -#include <asm/system.h>  #include <asm/processor.h>  #include <asm/vga.h> +#include <asm/setup.h>  #include <asm/sn/arch.h>  #include <asm/sn/addrs.h>  #include <asm/sn/pda.h> @@ -192,7 +192,7 @@ void __init early_sn_setup(void)  }  extern int platform_intr_list[]; -static int __cpuinitdata shub_1_1_found; +static int shub_1_1_found;  /*   * sn_check_for_wars @@ -200,7 +200,7 @@ static int __cpuinitdata shub_1_1_found;   * Set flag for enabling shub specific wars   */ -static inline int __cpuinit is_shub_1_1(int nasid) +static inline int is_shub_1_1(int nasid)  {  	unsigned long id;  	int rev; @@ -212,7 +212,7 @@ static inline int __cpuinit is_shub_1_1(int nasid)  	return rev <= 2;  } -static void __cpuinit sn_check_for_wars(void) +static void sn_check_for_wars(void)  {  	int cnode; @@ -558,7 +558,7 @@ static void __init sn_init_pdas(char **cmdline_p)   * Also sets up a few fields in the nodepda.  Also known as   * platform_cpu_init() by the ia64 machvec code.   */ -void __cpuinit sn_cpu_init(void) +void sn_cpu_init(void)  {  	int cpuid;  	int cpuphyid; @@ -592,7 +592,7 @@ void __cpuinit sn_cpu_init(void)  	/*  	 * Don't check status. The SAL call is not supported on all PROMs  	 * but a failure is harmless. -	 * Architechtuallly, cpu_init is always called twice on cpu 0. We +	 * Architecturally, cpu_init is always called twice on cpu 0. We  	 * should set cpu_number on cpu 0 once.  	 */  	if (cpuid == 0) { diff --git a/arch/ia64/sn/kernel/sn2/Makefile b/arch/ia64/sn/kernel/sn2/Makefile index 08e6565dc90..3d09108d427 100644 --- a/arch/ia64/sn/kernel/sn2/Makefile +++ b/arch/ia64/sn/kernel/sn2/Makefile @@ -9,7 +9,7 @@  # sn2 specific kernel files  # -EXTRA_CFLAGS += -Iarch/ia64/sn/include +ccflags-y := -Iarch/ia64/sn/include  obj-y += cache.o io.o ptc_deadlock.o sn2_smp.o sn_proc_fs.o \  	 prominfo_proc.o timer.o timer_interrupt.o sn_hwperf.o diff --git a/arch/ia64/sn/kernel/sn2/prominfo_proc.c b/arch/ia64/sn/kernel/sn2/prominfo_proc.c index e6332881864..ec4de2b0965 100644 --- a/arch/ia64/sn/kernel/sn2/prominfo_proc.c +++ b/arch/ia64/sn/kernel/sn2/prominfo_proc.c @@ -11,8 +11,8 @@  #include <linux/module.h>  #include <linux/slab.h>  #include <linux/proc_fs.h> +#include <linux/seq_file.h>  #include <linux/nodemask.h> -#include <asm/system.h>  #include <asm/io.h>  #include <asm/sn/sn_sal.h>  #include <asm/sn/sn_cpuid.h> @@ -102,18 +102,18 @@ get_fit_entry(unsigned long nasid, int index, unsigned long *fentry,  /*   * These two routines display the FIT table for each node.   */ -static int dump_fit_entry(char *page, unsigned long *fentry) +static void dump_fit_entry(struct seq_file *m, unsigned long *fentry)  {  	unsigned type;  	type = FIT_TYPE(fentry[1]); -	return sprintf(page, "%02x %-25s %x.%02x %016lx %u\n", -		       type, -		       fit_type_name(type), -		       FIT_MAJOR(fentry[1]), FIT_MINOR(fentry[1]), -		       fentry[0], -		       /* mult by sixteen to get size in bytes */ -		       (unsigned)(fentry[1] & 0xffffff) * 16); +	seq_printf(m, "%02x %-25s %x.%02x %016lx %u\n", +		   type, +		   fit_type_name(type), +		   FIT_MAJOR(fentry[1]), FIT_MINOR(fentry[1]), +		   fentry[0], +		   /* mult by sixteen to get size in bytes */ +		   (unsigned)(fentry[1] & 0xffffff) * 16);  } @@ -125,31 +125,39 @@ static int dump_fit_entry(char *page, unsigned long *fentry)   * OK except for 4kB pages (and no one is going to do that on SN   * anyway).   */ -static int -dump_fit(char *page, unsigned long nasid) +static int proc_fit_show(struct seq_file *m, void *v)  { +	unsigned long nasid = (unsigned long)m->private;  	unsigned long fentry[2];  	int index; -	char *p; -	p = page;  	for (index=0;;index++) {  		BUG_ON(index * 60 > PAGE_SIZE);  		if (get_fit_entry(nasid, index, fentry, NULL, 0))  			break; -		p += dump_fit_entry(p, fentry); +		dump_fit_entry(m, fentry);  	} +	return 0; +} -	return p - page; +static int proc_fit_open(struct inode *inode, struct file *file) +{ +	return single_open(file, proc_fit_show, PDE_DATA(inode));  } -static int -dump_version(char *page, unsigned long nasid) +static const struct file_operations proc_fit_fops = { +	.open		= proc_fit_open, +	.read		= seq_read, +	.llseek		= seq_lseek, +	.release	= single_release, +}; + +static int proc_version_show(struct seq_file *m, void *v)  { +	unsigned long nasid = (unsigned long)m->private;  	unsigned long fentry[2];  	char banner[128];  	int index; -	int len;  	for (index = 0; ; index++) {  		if (get_fit_entry(nasid, index, fentry, banner, @@ -159,56 +167,24 @@ dump_version(char *page, unsigned long nasid)  			break;  	} -	len = sprintf(page, "%x.%02x\n", FIT_MAJOR(fentry[1]), -		      FIT_MINOR(fentry[1])); -	page += len; +	seq_printf(m, "%x.%02x\n", FIT_MAJOR(fentry[1]), FIT_MINOR(fentry[1]));  	if (banner[0]) -		len += snprintf(page, PAGE_SIZE-len, "%s\n", banner); - -	return len; -} - -/* same as in proc_misc.c */ -static int -proc_calc_metrics(char *page, char **start, off_t off, int count, int *eof, -		  int len) -{ -	if (len <= off + count) -		*eof = 1; -	*start = page + off; -	len -= off; -	if (len > count) -		len = count; -	if (len < 0) -		len = 0; -	return len; +		seq_printf(m, "%s\n", banner); +	return 0;  } -static int -read_version_entry(char *page, char **start, off_t off, int count, int *eof, -		   void *data) +static int proc_version_open(struct inode *inode, struct file *file)  { -	int len; - -	/* data holds the NASID of the node */ -	len = dump_version(page, (unsigned long)data); -	len = proc_calc_metrics(page, start, off, count, eof, len); -	return len; +	return single_open(file, proc_version_show, PDE_DATA(inode));  } -static int -read_fit_entry(char *page, char **start, off_t off, int count, int *eof, -	       void *data) -{ -	int len; - -	/* data holds the NASID of the node */ -	len = dump_fit(page, (unsigned long)data); -	len = proc_calc_metrics(page, start, off, count, eof, len); - -	return len; -} +static const struct file_operations proc_version_fops = { +	.open		= proc_version_open, +	.read		= seq_read, +	.llseek		= seq_lseek, +	.release	= single_release, +};  /* module entry points */  int __init prominfo_init(void); @@ -217,58 +193,39 @@ void __exit prominfo_exit(void);  module_init(prominfo_init);  module_exit(prominfo_exit); -static struct proc_dir_entry **proc_entries; -static struct proc_dir_entry *sgi_prominfo_entry; -  #define NODE_NAME_LEN 11  int __init prominfo_init(void)  { -	struct proc_dir_entry **entp; +	struct proc_dir_entry *sgi_prominfo_entry;  	cnodeid_t cnodeid; -	unsigned long nasid; -	int size; -	char name[NODE_NAME_LEN];  	if (!ia64_platform_is("sn2"))  		return 0; -	size = num_online_nodes() * sizeof(struct proc_dir_entry *); -	proc_entries = kzalloc(size, GFP_KERNEL); -	if (!proc_entries) -		return -ENOMEM; -  	sgi_prominfo_entry = proc_mkdir("sgi_prominfo", NULL); +	if (!sgi_prominfo_entry) +		return -ENOMEM; -	entp = proc_entries;  	for_each_online_node(cnodeid) { +		struct proc_dir_entry *dir; +		unsigned long nasid; +		char name[NODE_NAME_LEN]; +  		sprintf(name, "node%d", cnodeid); -		*entp = proc_mkdir(name, sgi_prominfo_entry); +		dir = proc_mkdir(name, sgi_prominfo_entry); +		if (!dir) +			continue;  		nasid = cnodeid_to_nasid(cnodeid); -		create_proc_read_entry("fit", 0, *entp, read_fit_entry, -					   (void *)nasid); -		create_proc_read_entry("version", 0, *entp, -					   read_version_entry, (void *)nasid); -		entp++; +		proc_create_data("fit", 0, dir, +				 &proc_fit_fops, (void *)nasid); +		proc_create_data("version", 0, dir, +				 &proc_version_fops, (void *)nasid);  	} -  	return 0;  }  void __exit prominfo_exit(void)  { -	struct proc_dir_entry **entp; -	unsigned int cnodeid; -	char name[NODE_NAME_LEN]; - -	entp = proc_entries; -	for_each_online_node(cnodeid) { -		remove_proc_entry("fit", *entp); -		remove_proc_entry("version", *entp); -		sprintf(name, "node%d", cnodeid); -		remove_proc_entry(name, sgi_prominfo_entry); -		entp++; -	} -	remove_proc_entry("sgi_prominfo", NULL); -	kfree(proc_entries); +	remove_proc_subtree("sgi_prominfo", NULL);  } diff --git a/arch/ia64/sn/kernel/sn2/sn2_smp.c b/arch/ia64/sn/kernel/sn2/sn2_smp.c index e884ba4e031..68c84541162 100644 --- a/arch/ia64/sn/kernel/sn2/sn2_smp.c +++ b/arch/ia64/sn/kernel/sn2/sn2_smp.c @@ -26,7 +26,6 @@  #include <asm/processor.h>  #include <asm/irq.h>  #include <asm/sal.h> -#include <asm/system.h>  #include <asm/delay.h>  #include <asm/io.h>  #include <asm/smp.h> diff --git a/arch/ia64/sn/kernel/sn2/sn_hwperf.c b/arch/ia64/sn/kernel/sn2/sn_hwperf.c index 30862c0358c..b9992571c03 100644 --- a/arch/ia64/sn/kernel/sn2/sn_hwperf.c +++ b/arch/ia64/sn/kernel/sn2/sn_hwperf.c @@ -25,6 +25,7 @@  #include <linux/fs.h>  #include <linux/slab.h> +#include <linux/export.h>  #include <linux/vmalloc.h>  #include <linux/seq_file.h>  #include <linux/miscdevice.h> @@ -615,11 +616,15 @@ static int sn_hwperf_op_cpu(struct sn_hwperf_op_info *op_info)  		}  	} -	if (cpu == SN_HWPERF_ARG_ANY_CPU || cpu == get_cpu()) { -		/* don't care, or already on correct cpu */ +	if (cpu == SN_HWPERF_ARG_ANY_CPU) { +		/* don't care which cpu */  		sn_hwperf_call_sal(op_info); -	} -	else { +	} else if (cpu == get_cpu()) { +		/* already on correct cpu */ +		sn_hwperf_call_sal(op_info); +		put_cpu(); +	} else { +		put_cpu();  		if (use_ipi) {  			/* use an interprocessor interrupt to call SAL */  			smp_call_function_single(cpu, sn_hwperf_call_sal, @@ -972,7 +977,7 @@ int sn_hwperf_get_nearest_node(cnodeid_t node,  	return e;  } -static int __devinit sn_hwperf_misc_register_init(void) +static int sn_hwperf_misc_register_init(void)  {  	int e; diff --git a/arch/ia64/sn/kernel/sn2/sn_proc_fs.c b/arch/ia64/sn/kernel/sn2/sn_proc_fs.c index c76d8dc3aea..7aab87f4806 100644 --- a/arch/ia64/sn/kernel/sn2/sn_proc_fs.c +++ b/arch/ia64/sn/kernel/sn2/sn_proc_fs.c @@ -45,38 +45,6 @@ static int licenseID_open(struct inode *inode, struct file *file)  	return single_open(file, licenseID_show, NULL);  } -/* - * Enable forced interrupt by default. - * When set, the sn interrupt handler writes the force interrupt register on - * the bridge chip.  The hardware will then send an interrupt message if the - * interrupt line is active.  This mimics a level sensitive interrupt. - */ -extern int sn_force_interrupt_flag; - -static int sn_force_interrupt_show(struct seq_file *s, void *p) -{ -	seq_printf(s, "Force interrupt is %s\n", -		sn_force_interrupt_flag ? "enabled" : "disabled"); -	return 0; -} - -static ssize_t sn_force_interrupt_write_proc(struct file *file, -		const char __user *buffer, size_t count, loff_t *data) -{ -	char val; - -	if (copy_from_user(&val, buffer, 1)) -		return -EFAULT; - -	sn_force_interrupt_flag = (val == '0') ? 0 : 1; -	return count; -} - -static int sn_force_interrupt_open(struct inode *inode, struct file *file) -{ -	return single_open(file, sn_force_interrupt_show, NULL); -} -  static int coherence_id_show(struct seq_file *s, void *p)  {  	seq_printf(s, "%d\n", partition_coherence_id()); @@ -114,14 +82,6 @@ static const struct file_operations proc_license_id_fops = {  	.release	= single_release,  }; -static const struct file_operations proc_sn_force_intr_fops = { -	.open		= sn_force_interrupt_open, -	.read		= seq_read, -	.write		= sn_force_interrupt_write_proc, -	.llseek		= seq_lseek, -	.release	= single_release, -}; -  static const struct file_operations proc_coherence_id_fops = {  	.open		= coherence_id_open,  	.read		= seq_read, @@ -149,8 +109,6 @@ void register_sn_procfs(void)  	proc_create("system_serial_number", 0444, sgi_proc_dir,  		    &proc_system_sn_fops);  	proc_create("licenseID", 0444, sgi_proc_dir, &proc_license_id_fops); -	proc_create("sn_force_interrupt", 0644, sgi_proc_dir, -		    &proc_sn_force_intr_fops);  	proc_create("coherence_id", 0444, sgi_proc_dir,  		    &proc_coherence_id_fops);  	proc_create("sn_topology", 0444, sgi_proc_dir, &proc_sn_topo_fops); diff --git a/arch/ia64/sn/kernel/sn2/timer.c b/arch/ia64/sn/kernel/sn2/timer.c index 21d6f09e344..abab8f99e91 100644 --- a/arch/ia64/sn/kernel/sn2/timer.c +++ b/arch/ia64/sn/kernel/sn2/timer.c @@ -14,7 +14,6 @@  #include <linux/clocksource.h>  #include <asm/hw_irq.h> -#include <asm/system.h>  #include <asm/timex.h>  #include <asm/sn/leds.h> @@ -33,8 +32,6 @@ static struct clocksource clocksource_sn2 = {          .rating         = 450,          .read           = read_sn2,          .mask           = (1LL << 55) - 1, -        .mult           = 0, -        .shift          = 10,          .flags          = CLOCK_SOURCE_IS_CONTINUOUS,  }; @@ -56,10 +53,8 @@ ia64_sn_udelay (unsigned long usecs)  void __init sn_timer_init(void)  { -	clocksource_sn2.fsys_mmio = RTC_COUNTER_ADDR; -	clocksource_sn2.mult = clocksource_hz2mult(sn_rtc_cycles_per_second, -							clocksource_sn2.shift); -	clocksource_register(&clocksource_sn2); +	clocksource_sn2.archdata.fsys_mmio = RTC_COUNTER_ADDR; +	clocksource_register_hz(&clocksource_sn2, sn_rtc_cycles_per_second);  	ia64_udelay = &ia64_sn_udelay;  } diff --git a/arch/ia64/sn/kernel/tiocx.c b/arch/ia64/sn/kernel/tiocx.c index c1bd1cfda32..e35f6485c1f 100644 --- a/arch/ia64/sn/kernel/tiocx.c +++ b/arch/ia64/sn/kernel/tiocx.c @@ -14,7 +14,6 @@  #include <linux/capability.h>  #include <linux/device.h>  #include <linux/delay.h> -#include <asm/system.h>  #include <asm/uaccess.h>  #include <asm/sn/sn_sal.h>  #include <asm/sn/addrs.h> @@ -191,6 +190,7 @@ cx_device_register(nasid_t nasid, int part_num, int mfg_num,  		   struct hubdev_info *hubdev, int bt)  {  	struct cx_dev *cx_dev; +	int r;  	cx_dev = kzalloc(sizeof(struct cx_dev), GFP_KERNEL);  	DBG("cx_dev= 0x%p\n", cx_dev); @@ -207,7 +207,11 @@ cx_device_register(nasid_t nasid, int part_num, int mfg_num,  	cx_dev->dev.bus = &tiocx_bus_type;  	cx_dev->dev.release = tiocx_bus_release;  	dev_set_name(&cx_dev->dev, "%d", cx_dev->cx_id.nasid); -	device_register(&cx_dev->dev); +	r = device_register(&cx_dev->dev); +	if (r) { +		kfree(cx_dev); +		return r; +	}  	get_device(&cx_dev->dev);  	device_create_file(&cx_dev->dev, &dev_attr_cxdev_control); @@ -486,11 +490,14 @@ static int __init tiocx_init(void)  {  	cnodeid_t cnodeid;  	int found_tiocx_device = 0; +	int err;  	if (!ia64_platform_is("sn2"))  		return 0; -	bus_register(&tiocx_bus_type); +	err = bus_register(&tiocx_bus_type); +	if (err) +		return err;  	for (cnodeid = 0; cnodeid < num_cnodes; cnodeid++) {  		nasid_t nasid; diff --git a/arch/ia64/sn/pci/Makefile b/arch/ia64/sn/pci/Makefile index ad4ef34dfe2..df2a9014542 100644 --- a/arch/ia64/sn/pci/Makefile +++ b/arch/ia64/sn/pci/Makefile @@ -7,6 +7,6 @@  #  # Makefile for the sn pci general routines. -EXTRA_CFLAGS += -Iarch/ia64/sn/include +ccflags-y := -Iarch/ia64/sn/include  obj-y := pci_dma.o tioca_provider.o tioce_provider.o pcibr/ diff --git a/arch/ia64/sn/pci/pci_dma.c b/arch/ia64/sn/pci/pci_dma.c index a9d310de57d..d0853e8e862 100644 --- a/arch/ia64/sn/pci/pci_dma.c +++ b/arch/ia64/sn/pci/pci_dma.c @@ -34,7 +34,7 @@   */  static int sn_dma_supported(struct device *dev, u64 mask)  { -	BUG_ON(dev->bus != &pci_bus_type); +	BUG_ON(!dev_is_pci(dev));  	if (mask < 0x7fffffff)  		return 0; @@ -50,7 +50,7 @@ static int sn_dma_supported(struct device *dev, u64 mask)   */  int sn_dma_set_mask(struct device *dev, u64 dma_mask)  { -	BUG_ON(dev->bus != &pci_bus_type); +	BUG_ON(!dev_is_pci(dev));  	if (!sn_dma_supported(dev, dma_mask))  		return 0; @@ -76,7 +76,8 @@ EXPORT_SYMBOL(sn_dma_set_mask);   * more information.   */  static void *sn_dma_alloc_coherent(struct device *dev, size_t size, -				   dma_addr_t * dma_handle, gfp_t flags) +				   dma_addr_t * dma_handle, gfp_t flags, +				   struct dma_attrs *attrs)  {  	void *cpuaddr;  	unsigned long phys_addr; @@ -84,7 +85,7 @@ static void *sn_dma_alloc_coherent(struct device *dev, size_t size,  	struct pci_dev *pdev = to_pci_dev(dev);  	struct sn_pcibus_provider *provider = SN_PCIDEV_BUSPROVIDER(pdev); -	BUG_ON(dev->bus != &pci_bus_type); +	BUG_ON(!dev_is_pci(dev));  	/*  	 * Allocate the memory. @@ -137,12 +138,12 @@ static void *sn_dma_alloc_coherent(struct device *dev, size_t size,   * any associated IOMMU mappings.   */  static void sn_dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, -				 dma_addr_t dma_handle) +				 dma_addr_t dma_handle, struct dma_attrs *attrs)  {  	struct pci_dev *pdev = to_pci_dev(dev);  	struct sn_pcibus_provider *provider = SN_PCIDEV_BUSPROVIDER(pdev); -	BUG_ON(dev->bus != &pci_bus_type); +	BUG_ON(!dev_is_pci(dev));  	provider->dma_unmap(pdev, dma_handle, 0);  	free_pages((unsigned long)cpu_addr, get_order(size)); @@ -186,7 +187,7 @@ static dma_addr_t sn_dma_map_page(struct device *dev, struct page *page,  	dmabarr = dma_get_attr(DMA_ATTR_WRITE_BARRIER, attrs); -	BUG_ON(dev->bus != &pci_bus_type); +	BUG_ON(!dev_is_pci(dev));  	phys_addr = __pa(cpu_addr);  	if (dmabarr) @@ -222,7 +223,7 @@ static void sn_dma_unmap_page(struct device *dev, dma_addr_t dma_addr,  	struct pci_dev *pdev = to_pci_dev(dev);  	struct sn_pcibus_provider *provider = SN_PCIDEV_BUSPROVIDER(pdev); -	BUG_ON(dev->bus != &pci_bus_type); +	BUG_ON(!dev_is_pci(dev));  	provider->dma_unmap(pdev, dma_addr, dir);  } @@ -246,7 +247,7 @@ static void sn_dma_unmap_sg(struct device *dev, struct scatterlist *sgl,  	struct sn_pcibus_provider *provider = SN_PCIDEV_BUSPROVIDER(pdev);  	struct scatterlist *sg; -	BUG_ON(dev->bus != &pci_bus_type); +	BUG_ON(!dev_is_pci(dev));  	for_each_sg(sgl, sg, nhwentries, i) {  		provider->dma_unmap(pdev, sg->dma_address, dir); @@ -283,7 +284,7 @@ static int sn_dma_map_sg(struct device *dev, struct scatterlist *sgl,  	dmabarr = dma_get_attr(DMA_ATTR_WRITE_BARRIER, attrs); -	BUG_ON(dev->bus != &pci_bus_type); +	BUG_ON(!dev_is_pci(dev));  	/*  	 * Setup a DMA address for each entry in the scatterlist. @@ -322,26 +323,26 @@ static int sn_dma_map_sg(struct device *dev, struct scatterlist *sgl,  static void sn_dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,  				       size_t size, enum dma_data_direction dir)  { -	BUG_ON(dev->bus != &pci_bus_type); +	BUG_ON(!dev_is_pci(dev));  }  static void sn_dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle,  					  size_t size,  					  enum dma_data_direction dir)  { -	BUG_ON(dev->bus != &pci_bus_type); +	BUG_ON(!dev_is_pci(dev));  }  static void sn_dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg,  				   int nelems, enum dma_data_direction dir)  { -	BUG_ON(dev->bus != &pci_bus_type); +	BUG_ON(!dev_is_pci(dev));  }  static void sn_dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,  				      int nelems, enum dma_data_direction dir)  { -	BUG_ON(dev->bus != &pci_bus_type); +	BUG_ON(!dev_is_pci(dev));  }  static int sn_dma_mapping_error(struct device *dev, dma_addr_t dma_addr) @@ -466,8 +467,8 @@ int sn_pci_legacy_write(struct pci_bus *bus, u16 port, u32 val, u8 size)  }  static struct dma_map_ops sn_dma_ops = { -	.alloc_coherent		= sn_dma_alloc_coherent, -	.free_coherent		= sn_dma_free_coherent, +	.alloc			= sn_dma_alloc_coherent, +	.free			= sn_dma_free_coherent,  	.map_page		= sn_dma_map_page,  	.unmap_page		= sn_dma_unmap_page,  	.map_sg			= sn_dma_map_sg, diff --git a/arch/ia64/sn/pci/pcibr/Makefile b/arch/ia64/sn/pci/pcibr/Makefile index 01192d3247d..396bcae3630 100644 --- a/arch/ia64/sn/pci/pcibr/Makefile +++ b/arch/ia64/sn/pci/pcibr/Makefile @@ -7,7 +7,7 @@  #  # Makefile for the sn2 io routines. -EXTRA_CFLAGS += -Iarch/ia64/sn/include +ccflags-y := -Iarch/ia64/sn/include  obj-y				+=  pcibr_dma.o pcibr_reg.o \  				    pcibr_ate.o pcibr_provider.o diff --git a/arch/ia64/sn/pci/pcibr/pcibr_dma.c b/arch/ia64/sn/pci/pcibr/pcibr_dma.c index c659ad5613a..1e863b277ac 100644 --- a/arch/ia64/sn/pci/pcibr/pcibr_dma.c +++ b/arch/ia64/sn/pci/pcibr/pcibr_dma.c @@ -8,6 +8,7 @@  #include <linux/types.h>  #include <linux/pci.h> +#include <linux/export.h>  #include <asm/sn/addrs.h>  #include <asm/sn/geo.h>  #include <asm/sn/pcibr_provider.h> @@ -227,7 +228,7 @@ pcibr_dma_unmap(struct pci_dev *hwdev, dma_addr_t dma_handle, int direction)   * after doing the read.  For PIC this routine then forces a fake interrupt   * on another line, which is logically associated with the slot that the PIO   * is addressed to.  It then spins while watching the memory location that - * the interrupt is targetted to.  When the interrupt response arrives, we  + * the interrupt is targeted to.  When the interrupt response arrives, we    * are sure that the DMA has landed in memory and it is safe for the driver   * to proceed.	For TIOCP use the Device(x) Write Request Buffer Flush    * Bridge register since it ensures the data has entered the coherence domain, diff --git a/arch/ia64/sn/pci/pcibr/pcibr_provider.c b/arch/ia64/sn/pci/pcibr/pcibr_provider.c index 3cb5cf37764..8dbbef4a4f4 100644 --- a/arch/ia64/sn/pci/pcibr/pcibr_provider.c +++ b/arch/ia64/sn/pci/pcibr/pcibr_provider.c @@ -10,6 +10,7 @@  #include <linux/types.h>  #include <linux/slab.h>  #include <linux/pci.h> +#include <linux/export.h>  #include <asm/sn/addrs.h>  #include <asm/sn/geo.h>  #include <asm/sn/pcibr_provider.h> @@ -126,12 +127,11 @@ pcibr_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont  	 * Allocate kernel bus soft and copy from prom.  	 */ -	soft = kmalloc(sizeof(struct pcibus_info), GFP_KERNEL); +	soft = kmemdup(prom_bussoft, sizeof(struct pcibus_info), GFP_KERNEL);  	if (!soft) {  		return NULL;  	} -	memcpy(soft, prom_bussoft, sizeof(struct pcibus_info));  	soft->pbi_buscommon.bs_base = (unsigned long)  		ioremap(REGION_OFFSET(soft->pbi_buscommon.bs_base),  			sizeof(struct pic)); @@ -146,6 +146,7 @@ pcibr_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont  		printk(KERN_WARNING  		       "pcibr cannot allocate interrupt for error handler\n");  	} +	irq_set_handler(SGI_PCIASIC_ERROR, handle_level_irq);  	sn_set_err_irq_affinity(SGI_PCIASIC_ERROR);  	/*  diff --git a/arch/ia64/sn/pci/tioca_provider.c b/arch/ia64/sn/pci/tioca_provider.c index 4d4536e3b6f..a70b11fd57d 100644 --- a/arch/ia64/sn/pci/tioca_provider.c +++ b/arch/ia64/sn/pci/tioca_provider.c @@ -11,6 +11,7 @@  #include <linux/pci.h>  #include <linux/bitmap.h>  #include <linux/slab.h> +#include <linux/export.h>  #include <asm/sn/sn_sal.h>  #include <asm/sn/addrs.h>  #include <asm/sn/io.h> @@ -509,7 +510,7 @@ tioca_dma_unmap(struct pci_dev *pdev, dma_addr_t bus_addr, int dir)   * use the GART mapped mode.   */  static u64 -tioca_dma_map(struct pci_dev *pdev, u64 paddr, size_t byte_count, int dma_flags) +tioca_dma_map(struct pci_dev *pdev, unsigned long paddr, size_t byte_count, int dma_flags)  {  	u64 mapaddr; @@ -599,11 +600,11 @@ tioca_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont  	 * Allocate kernel bus soft and copy from prom.  	 */ -	tioca_common = kzalloc(sizeof(struct tioca_common), GFP_KERNEL); +	tioca_common = kmemdup(prom_bussoft, sizeof(struct tioca_common), +			       GFP_KERNEL);  	if (!tioca_common)  		return NULL; -	memcpy(tioca_common, prom_bussoft, sizeof(struct tioca_common));  	tioca_common->ca_common.bs_base = (unsigned long)  		ioremap(REGION_OFFSET(tioca_common->ca_common.bs_base),  			sizeof(struct tioca_common)); @@ -648,6 +649,7 @@ tioca_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont  		       __func__, SGI_TIOCA_ERROR,  		       (int)tioca_common->ca_common.bs_persist_busnum); +	irq_set_handler(SGI_TIOCA_ERROR, handle_level_irq);  	sn_set_err_irq_affinity(SGI_TIOCA_ERROR);  	/* Setup locality information */ diff --git a/arch/ia64/sn/pci/tioce_provider.c b/arch/ia64/sn/pci/tioce_provider.c index 27faba035f3..46d3df4b03a 100644 --- a/arch/ia64/sn/pci/tioce_provider.c +++ b/arch/ia64/sn/pci/tioce_provider.c @@ -1037,6 +1037,7 @@ tioce_bus_fixup(struct pcibus_bussoft *prom_bussoft, struct pci_controller *cont  		       tioce_common->ce_pcibus.bs_persist_segment,  		       tioce_common->ce_pcibus.bs_persist_busnum); +	irq_set_handler(SGI_PCIASIC_ERROR, handle_level_irq);  	sn_set_err_irq_affinity(SGI_PCIASIC_ERROR);  	return tioce_common;  } diff --git a/arch/ia64/uv/kernel/Makefile b/arch/ia64/uv/kernel/Makefile index 8d92b4684d8..124e441d383 100644 --- a/arch/ia64/uv/kernel/Makefile +++ b/arch/ia64/uv/kernel/Makefile @@ -7,7 +7,7 @@  # Copyright (C) 2008 Silicon Graphics, Inc.  All Rights Reserved.  # -EXTRA_CFLAGS += -Iarch/ia64/sn/include +ccflags-y := -Iarch/ia64/sn/include  obj-y				+= setup.o  obj-$(CONFIG_IA64_GENERIC)      += machvec.o diff --git a/arch/ia64/xen/Kconfig b/arch/ia64/xen/Kconfig deleted file mode 100644 index 515e0826803..00000000000 --- a/arch/ia64/xen/Kconfig +++ /dev/null @@ -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 && EXPERIMENTAL -	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 diff --git a/arch/ia64/xen/Makefile b/arch/ia64/xen/Makefile deleted file mode 100644 index e6f4a0a7422..00000000000 --- a/arch/ia64/xen/Makefile +++ /dev/null @@ -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) diff --git a/arch/ia64/xen/gate-data.S b/arch/ia64/xen/gate-data.S deleted file mode 100644 index 6f95b6b32a4..00000000000 --- a/arch/ia64/xen/gate-data.S +++ /dev/null @@ -1,3 +0,0 @@ -	.section .data..gate.xen, "aw" - -	.incbin "arch/ia64/xen/gate.so" diff --git a/arch/ia64/xen/grant-table.c b/arch/ia64/xen/grant-table.c deleted file mode 100644 index 48cca37625e..00000000000 --- a/arch/ia64/xen/grant-table.c +++ /dev/null @@ -1,156 +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> - -struct vm_struct *xen_alloc_vm_area(unsigned long size) -{ -	int order; -	unsigned long virt; -	unsigned long nr_pages; -	struct vm_struct *area; - -	order = get_order(size); -	virt = __get_free_pages(GFP_KERNEL, order); -	if (virt == 0) -		goto err0; -	nr_pages = 1 << order; -	scrub_pages(virt, nr_pages); - -	area = kmalloc(sizeof(*area), GFP_KERNEL); -	if (area == NULL) -		goto err1; - -	area->flags = VM_IOREMAP; -	area->addr = (void *)virt; -	area->size = size; -	area->pages = NULL; -	area->nr_pages = nr_pages; -	area->phys_addr = 0;	/* xenbus_map_ring_valloc uses this field!  */ - -	return area; - -err1: -	free_pages(virt, order); -err0: -	return NULL; -} -EXPORT_SYMBOL_GPL(xen_alloc_vm_area); - -void xen_free_vm_area(struct vm_struct *area) -{ -	unsigned int order = get_order(area->size); -	unsigned long i; -	unsigned long phys_addr = __pa(area->addr); - -	/* This area is used for foreign page mappping. -	 * So underlying machine page may not be assigned. */ -	for (i = 0; i < (1 << order); i++) { -		unsigned long ret; -		unsigned long gpfn = (phys_addr >> PAGE_SHIFT) + i; -		struct xen_memory_reservation reservation = { -			.nr_extents   = 1, -			.address_bits = 0, -			.extent_order = 0, -			.domid        = DOMID_SELF -		}; -		set_xen_guest_handle(reservation.extent_start, &gpfn); -		ret = HYPERVISOR_memory_op(XENMEM_populate_physmap, -					   &reservation); -		BUG_ON(ret != 1); -	} -	free_pages((unsigned long)area->addr, order); -	kfree(area); -} -EXPORT_SYMBOL_GPL(xen_free_vm_area); - - -/**************************************************************************** - * 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); diff --git a/arch/ia64/xen/hypercall.S b/arch/ia64/xen/hypercall.S deleted file mode 100644 index 08847aa1258..00000000000 --- a/arch/ia64/xen/hypercall.S +++ /dev/null @@ -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) diff --git a/arch/ia64/xen/hypervisor.c b/arch/ia64/xen/hypervisor.c deleted file mode 100644 index cac4d97c0b5..00000000000 --- a/arch/ia64/xen/hypervisor.c +++ /dev/null @@ -1,96 +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 <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 __cpuinit -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); -} diff --git a/arch/ia64/xen/irq_xen.c b/arch/ia64/xen/irq_xen.c deleted file mode 100644 index a3fb7cf9ae1..00000000000 --- a/arch/ia64/xen/irq_xen.c +++ /dev/null @@ -1,438 +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_vecotr 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 -/* 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 struct irqaction xen_ipi_irqaction = { -	.handler =	handle_IPI, -	.flags =	IRQF_DISABLED, -	.name =		"IPI" -}; - -static struct irqaction xen_resched_irqaction = { -	.handler =	xen_dummy_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) -{ -	struct irq_desc *desc; -	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. -			 */ -			desc = irq_desc + irq; -			desc->status |= 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 __devinit -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 __initdata = { -	.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, -}; diff --git a/arch/ia64/xen/irq_xen.h b/arch/ia64/xen/irq_xen.h deleted file mode 100644 index 26110f330c8..00000000000 --- a/arch/ia64/xen/irq_xen.h +++ /dev/null @@ -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 __initdata; -extern void xen_smp_intr_init(void); -extern void xen_send_ipi(int cpu, int vec); - -#endif /* IRQ_XEN_H */ diff --git a/arch/ia64/xen/machvec.c b/arch/ia64/xen/machvec.c deleted file mode 100644 index 4ad588a7c27..00000000000 --- a/arch/ia64/xen/machvec.c +++ /dev/null @@ -1,4 +0,0 @@ -#define MACHVEC_PLATFORM_NAME           xen -#define MACHVEC_PLATFORM_HEADER         <asm/machvec_xen.h> -#include <asm/machvec_init.h> - diff --git a/arch/ia64/xen/suspend.c b/arch/ia64/xen/suspend.c deleted file mode 100644 index fd66b048c6f..00000000000 --- a/arch/ia64/xen/suspend.c +++ /dev/null @@ -1,64 +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_pre_device_suspend(void) -{ -	/* nothing */ -} - -void -xen_pre_suspend() -{ -	/* nothing */ -} - -void -xen_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(); -} diff --git a/arch/ia64/xen/time.c b/arch/ia64/xen/time.c deleted file mode 100644 index c1c544513e8..00000000000 --- a/arch/ia64/xen/time.c +++ /dev/null @@ -1,260 +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) { -			write_seqlock(&xtime_lock); -			do_timer(stolen + blocked); -			local_cpu_data->itm_next = delta_itm + new_itm; -			write_sequnlock(&xtime_lock); -		} else { -			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); -} diff --git a/arch/ia64/xen/time.h b/arch/ia64/xen/time.h deleted file mode 100644 index f98d7e1a42f..00000000000 --- a/arch/ia64/xen/time.h +++ /dev/null @@ -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); diff --git a/arch/ia64/xen/xcom_hcall.c b/arch/ia64/xen/xcom_hcall.c deleted file mode 100644 index ccaf7431f7c..00000000000 --- a/arch/ia64/xen/xcom_hcall.c +++ /dev/null @@ -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))); -} diff --git a/arch/ia64/xen/xen_pv_ops.c b/arch/ia64/xen/xen_pv_ops.c deleted file mode 100644 index 3e8d350fdf3..00000000000 --- a/arch/ia64/xen/xen_pv_ops.c +++ /dev/null @@ -1,1141 +0,0 @@ -/****************************************************************************** - * arch/ia64/xen/xen_pv_ops.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/console.h> -#include <linux/irq.h> -#include <linux/kernel.h> -#include <linux/pm.h> -#include <linux/unistd.h> - -#include <asm/xen/hypervisor.h> -#include <asm/xen/xencomm.h> -#include <asm/xen/privop.h> - -#include "irq_xen.h" -#include "time.h" - -/*************************************************************************** - * general info - */ -static struct pv_info xen_info __initdata = { -	.kernel_rpl = 2,	/* or 1: determin at runtime */ -	.paravirt_enabled = 1, -	.name = "Xen/ia64", -}; - -#define IA64_RSC_PL_SHIFT	2 -#define IA64_RSC_PL_BIT_SIZE	2 -#define IA64_RSC_PL_MASK	\ -	(((1UL << IA64_RSC_PL_BIT_SIZE) - 1) << IA64_RSC_PL_SHIFT) - -static void __init -xen_info_init(void) -{ -	/* Xenified Linux/ia64 may run on pl = 1 or 2. -	 * determin at run time. */ -	unsigned long rsc = ia64_getreg(_IA64_REG_AR_RSC); -	unsigned int rpl = (rsc & IA64_RSC_PL_MASK) >> IA64_RSC_PL_SHIFT; -	xen_info.kernel_rpl = rpl; -} - -/*************************************************************************** - * pv_init_ops - * initialization hooks. - */ - -static void -xen_panic_hypercall(struct unw_frame_info *info, void *arg) -{ -	current->thread.ksp = (__u64)info->sw - 16; -	HYPERVISOR_shutdown(SHUTDOWN_crash); -	/* we're never actually going to get here... */ -} - -static int -xen_panic_event(struct notifier_block *this, unsigned long event, void *ptr) -{ -	unw_init_running(xen_panic_hypercall, NULL); -	/* we're never actually going to get here... */ -	return NOTIFY_DONE; -} - -static struct notifier_block xen_panic_block = { -	xen_panic_event, NULL, 0 /* try to go last */ -}; - -static void xen_pm_power_off(void) -{ -	local_irq_disable(); -	HYPERVISOR_shutdown(SHUTDOWN_poweroff); -} - -static void __init -xen_banner(void) -{ -	printk(KERN_INFO -	       "Running on Xen! pl = %d start_info_pfn=0x%lx nr_pages=%ld " -	       "flags=0x%x\n", -	       xen_info.kernel_rpl, -	       HYPERVISOR_shared_info->arch.start_info_pfn, -	       xen_start_info->nr_pages, xen_start_info->flags); -} - -static int __init -xen_reserve_memory(struct rsvd_region *region) -{ -	region->start = (unsigned long)__va( -		(HYPERVISOR_shared_info->arch.start_info_pfn << PAGE_SHIFT)); -	region->end   = region->start + PAGE_SIZE; -	return 1; -} - -static void __init -xen_arch_setup_early(void) -{ -	struct shared_info *s; -	BUG_ON(!xen_pv_domain()); - -	s = HYPERVISOR_shared_info; -	xen_start_info = __va(s->arch.start_info_pfn << PAGE_SHIFT); - -	/* Must be done before any hypercall.  */ -	xencomm_initialize(); - -	xen_setup_features(); -	/* Register a call for panic conditions. */ -	atomic_notifier_chain_register(&panic_notifier_list, -				       &xen_panic_block); -	pm_power_off = xen_pm_power_off; - -	xen_ia64_enable_opt_feature(); -} - -static void __init -xen_arch_setup_console(char **cmdline_p) -{ -	add_preferred_console("xenboot", 0, NULL); -	add_preferred_console("tty", 0, NULL); -	/* use hvc_xen */ -	add_preferred_console("hvc", 0, NULL); - -#if !defined(CONFIG_VT) || !defined(CONFIG_DUMMY_CONSOLE) -	conswitchp = NULL; -#endif -} - -static int __init -xen_arch_setup_nomca(void) -{ -	return 1; -} - -static void __init -xen_post_smp_prepare_boot_cpu(void) -{ -	xen_setup_vcpu_info_placement(); -} - -#ifdef ASM_SUPPORTED -static unsigned long __init_or_module -xen_patch_bundle(void *sbundle, void *ebundle, unsigned long type); -#endif -static void __init -xen_patch_branch(unsigned long tag, unsigned long type); - -static const struct pv_init_ops xen_init_ops __initconst = { -	.banner = xen_banner, - -	.reserve_memory = xen_reserve_memory, - -	.arch_setup_early = xen_arch_setup_early, -	.arch_setup_console = xen_arch_setup_console, -	.arch_setup_nomca = xen_arch_setup_nomca, - -	.post_smp_prepare_boot_cpu = xen_post_smp_prepare_boot_cpu, -#ifdef ASM_SUPPORTED -	.patch_bundle = xen_patch_bundle, -#endif -	.patch_branch = xen_patch_branch, -}; - -/*************************************************************************** - * pv_fsys_data - * addresses for fsys - */ - -extern unsigned long xen_fsyscall_table[NR_syscalls]; -extern char xen_fsys_bubble_down[]; -struct pv_fsys_data xen_fsys_data __initdata = { -	.fsyscall_table = (unsigned long *)xen_fsyscall_table, -	.fsys_bubble_down = (void *)xen_fsys_bubble_down, -}; - -/*************************************************************************** - * pv_patchdata - * patchdata addresses - */ - -#define DECLARE(name)							\ -	extern unsigned long __xen_start_gate_##name##_patchlist[];	\ -	extern unsigned long __xen_end_gate_##name##_patchlist[] - -DECLARE(fsyscall); -DECLARE(brl_fsys_bubble_down); -DECLARE(vtop); -DECLARE(mckinley_e9); - -extern unsigned long __xen_start_gate_section[]; - -#define ASSIGN(name)							\ -	.start_##name##_patchlist =					\ -		(unsigned long)__xen_start_gate_##name##_patchlist,	\ -	.end_##name##_patchlist =					\ -		(unsigned long)__xen_end_gate_##name##_patchlist - -static struct pv_patchdata xen_patchdata __initdata = { -	ASSIGN(fsyscall), -	ASSIGN(brl_fsys_bubble_down), -	ASSIGN(vtop), -	ASSIGN(mckinley_e9), - -	.gate_section = (void*)__xen_start_gate_section, -}; - -/*************************************************************************** - * pv_cpu_ops - * intrinsics hooks. - */ - -#ifndef ASM_SUPPORTED -static void -xen_set_itm_with_offset(unsigned long val) -{ -	/* ia64_cpu_local_tick() calls this with interrupt enabled. */ -	/* WARN_ON(!irqs_disabled()); */ -	xen_set_itm(val - XEN_MAPPEDREGS->itc_offset); -} - -static unsigned long -xen_get_itm_with_offset(void) -{ -	/* unused at this moment */ -	printk(KERN_DEBUG "%s is called.\n", __func__); - -	WARN_ON(!irqs_disabled()); -	return ia64_native_getreg(_IA64_REG_CR_ITM) + -		XEN_MAPPEDREGS->itc_offset; -} - -/* ia64_set_itc() is only called by - * cpu_init() with ia64_set_itc(0) and ia64_sync_itc(). - * So XEN_MAPPEDRESG->itc_offset cal be considered as almost constant. - */ -static void -xen_set_itc(unsigned long val) -{ -	unsigned long mitc; - -	WARN_ON(!irqs_disabled()); -	mitc = ia64_native_getreg(_IA64_REG_AR_ITC); -	XEN_MAPPEDREGS->itc_offset = val - mitc; -	XEN_MAPPEDREGS->itc_last = val; -} - -static unsigned long -xen_get_itc(void) -{ -	unsigned long res; -	unsigned long itc_offset; -	unsigned long itc_last; -	unsigned long ret_itc_last; - -	itc_offset = XEN_MAPPEDREGS->itc_offset; -	do { -		itc_last = XEN_MAPPEDREGS->itc_last; -		res = ia64_native_getreg(_IA64_REG_AR_ITC); -		res += itc_offset; -		if (itc_last >= res) -			res = itc_last + 1; -		ret_itc_last = cmpxchg(&XEN_MAPPEDREGS->itc_last, -				       itc_last, res); -	} while (unlikely(ret_itc_last != itc_last)); -	return res; - -#if 0 -	/* ia64_itc_udelay() calls ia64_get_itc() with interrupt enabled. -	   Should it be paravirtualized instead? */ -	WARN_ON(!irqs_disabled()); -	itc_offset = XEN_MAPPEDREGS->itc_offset; -	itc_last = XEN_MAPPEDREGS->itc_last; -	res = ia64_native_getreg(_IA64_REG_AR_ITC); -	res += itc_offset; -	if (itc_last >= res) -		res = itc_last + 1; -	XEN_MAPPEDREGS->itc_last = res; -	return res; -#endif -} - -static void xen_setreg(int regnum, unsigned long val) -{ -	switch (regnum) { -	case _IA64_REG_AR_KR0 ... _IA64_REG_AR_KR7: -		xen_set_kr(regnum - _IA64_REG_AR_KR0, val); -		break; -	case _IA64_REG_AR_ITC: -		xen_set_itc(val); -		break; -	case _IA64_REG_CR_TPR: -		xen_set_tpr(val); -		break; -	case _IA64_REG_CR_ITM: -		xen_set_itm_with_offset(val); -		break; -	case _IA64_REG_CR_EOI: -		xen_eoi(val); -		break; -	default: -		ia64_native_setreg_func(regnum, val); -		break; -	} -} - -static unsigned long xen_getreg(int regnum) -{ -	unsigned long res; - -	switch (regnum) { -	case _IA64_REG_PSR: -		res = xen_get_psr(); -		break; -	case _IA64_REG_AR_ITC: -		res = xen_get_itc(); -		break; -	case _IA64_REG_CR_ITM: -		res = xen_get_itm_with_offset(); -		break; -	case _IA64_REG_CR_IVR: -		res = xen_get_ivr(); -		break; -	case _IA64_REG_CR_TPR: -		res = xen_get_tpr(); -		break; -	default: -		res = ia64_native_getreg_func(regnum); -		break; -	} -	return res; -} - -/* turning on interrupts is a bit more complicated.. write to the - * memory-mapped virtual psr.i bit first (to avoid race condition), - * then if any interrupts were pending, we have to execute a hyperprivop - * to ensure the pending interrupt gets delivered; else we're done! */ -static void -xen_ssm_i(void) -{ -	int old = xen_get_virtual_psr_i(); -	xen_set_virtual_psr_i(1); -	barrier(); -	if (!old && xen_get_virtual_pend()) -		xen_hyper_ssm_i(); -} - -/* turning off interrupts can be paravirtualized simply by writing - * to a memory-mapped virtual psr.i bit (implemented as a 16-bit bool) */ -static void -xen_rsm_i(void) -{ -	xen_set_virtual_psr_i(0); -	barrier(); -} - -static unsigned long -xen_get_psr_i(void) -{ -	return xen_get_virtual_psr_i() ? IA64_PSR_I : 0; -} - -static void -xen_intrin_local_irq_restore(unsigned long mask) -{ -	if (mask & IA64_PSR_I) -		xen_ssm_i(); -	else -		xen_rsm_i(); -} -#else -#define __DEFINE_FUNC(name, code)					\ -	extern const char xen_ ## name ## _direct_start[];		\ -	extern const char xen_ ## name ## _direct_end[];		\ -	asm (".align 32\n"						\ -	     ".proc xen_" #name "\n"					\ -	     "xen_" #name ":\n"						\ -	     "xen_" #name "_direct_start:\n"				\ -	     code							\ -	     "xen_" #name "_direct_end:\n"				\ -	     "br.cond.sptk.many b6\n"					\ -	     ".endp xen_" #name "\n") - -#define DEFINE_VOID_FUNC0(name, code)		\ -	extern void				\ -	xen_ ## name (void);			\ -	__DEFINE_FUNC(name, code) - -#define DEFINE_VOID_FUNC1(name, code)		\ -	extern void				\ -	xen_ ## name (unsigned long arg);	\ -	__DEFINE_FUNC(name, code) - -#define DEFINE_VOID_FUNC1_VOID(name, code)	\ -	extern void				\ -	xen_ ## name (void *arg);		\ -	__DEFINE_FUNC(name, code) - -#define DEFINE_VOID_FUNC2(name, code)		\ -	extern void				\ -	xen_ ## name (unsigned long arg0,	\ -		      unsigned long arg1);	\ -	__DEFINE_FUNC(name, code) - -#define DEFINE_FUNC0(name, code)		\ -	extern unsigned long			\ -	xen_ ## name (void);			\ -	__DEFINE_FUNC(name, code) - -#define DEFINE_FUNC1(name, type, code)		\ -	extern unsigned long			\ -	xen_ ## name (type arg);		\ -	__DEFINE_FUNC(name, code) - -#define XEN_PSR_I_ADDR_ADDR     (XSI_BASE + XSI_PSR_I_ADDR_OFS) - -/* - * static void xen_set_itm_with_offset(unsigned long val) - *        xen_set_itm(val - XEN_MAPPEDREGS->itc_offset); - */ -/* 2 bundles */ -DEFINE_VOID_FUNC1(set_itm_with_offset, -		  "mov r2 = " __stringify(XSI_BASE) " + " -		  __stringify(XSI_ITC_OFFSET_OFS) "\n" -		  ";;\n" -		  "ld8 r3 = [r2]\n" -		  ";;\n" -		  "sub r8 = r8, r3\n" -		  "break " __stringify(HYPERPRIVOP_SET_ITM) "\n"); - -/* - * static unsigned long xen_get_itm_with_offset(void) - *    return ia64_native_getreg(_IA64_REG_CR_ITM) + XEN_MAPPEDREGS->itc_offset; - */ -/* 2 bundles */ -DEFINE_FUNC0(get_itm_with_offset, -	     "mov r2 = " __stringify(XSI_BASE) " + " -	     __stringify(XSI_ITC_OFFSET_OFS) "\n" -	     ";;\n" -	     "ld8 r3 = [r2]\n" -	     "mov r8 = cr.itm\n" -	     ";;\n" -	     "add r8 = r8, r2\n"); - -/* - * static void xen_set_itc(unsigned long val) - *	unsigned long mitc; - * - *	WARN_ON(!irqs_disabled()); - *	mitc = ia64_native_getreg(_IA64_REG_AR_ITC); - *	XEN_MAPPEDREGS->itc_offset = val - mitc; - *	XEN_MAPPEDREGS->itc_last = val; - */ -/* 2 bundles */ -DEFINE_VOID_FUNC1(set_itc, -		  "mov r2 = " __stringify(XSI_BASE) " + " -		  __stringify(XSI_ITC_LAST_OFS) "\n" -		  "mov r3 = ar.itc\n" -		  ";;\n" -		  "sub r3 = r8, r3\n" -		  "st8 [r2] = r8, " -		  __stringify(XSI_ITC_LAST_OFS) " - " -		  __stringify(XSI_ITC_OFFSET_OFS) "\n" -		  ";;\n" -		  "st8 [r2] = r3\n"); - -/* - * static unsigned long xen_get_itc(void) - *	unsigned long res; - *	unsigned long itc_offset; - *	unsigned long itc_last; - *	unsigned long ret_itc_last; - * - *	itc_offset = XEN_MAPPEDREGS->itc_offset; - *	do { - *		itc_last = XEN_MAPPEDREGS->itc_last; - *		res = ia64_native_getreg(_IA64_REG_AR_ITC); - *		res += itc_offset; - *		if (itc_last >= res) - *			res = itc_last + 1; - *		ret_itc_last = cmpxchg(&XEN_MAPPEDREGS->itc_last, - *				       itc_last, res); - *	} while (unlikely(ret_itc_last != itc_last)); - *	return res; - */ -/* 5 bundles */ -DEFINE_FUNC0(get_itc, -	     "mov r2 = " __stringify(XSI_BASE) " + " -	     __stringify(XSI_ITC_OFFSET_OFS) "\n" -	     ";;\n" -	     "ld8 r9 = [r2], " __stringify(XSI_ITC_LAST_OFS) " - " -	     __stringify(XSI_ITC_OFFSET_OFS) "\n" -					/* r9 = itc_offset */ -					/* r2 = XSI_ITC_OFFSET */ -	     "888:\n" -	     "mov r8 = ar.itc\n"	/* res = ar.itc */ -	     ";;\n" -	     "ld8 r3 = [r2]\n"		/* r3 = itc_last */ -	     "add r8 = r8, r9\n"	/* res = ar.itc + itc_offset */ -	     ";;\n" -	     "cmp.gtu p6, p0 = r3, r8\n" -	     ";;\n" -	     "(p6) add r8 = 1, r3\n"	/* if (itc_last > res) itc_last + 1 */ -	     ";;\n" -	     "mov ar.ccv = r8\n" -	     ";;\n" -	     "cmpxchg8.acq r10 = [r2], r8, ar.ccv\n" -	     ";;\n" -	     "cmp.ne p6, p0 = r10, r3\n" -	     "(p6) hint @pause\n" -	     "(p6) br.cond.spnt 888b\n"); - -DEFINE_VOID_FUNC1_VOID(fc, -		       "break " __stringify(HYPERPRIVOP_FC) "\n"); - -/* - * psr_i_addr_addr = XEN_PSR_I_ADDR_ADDR - * masked_addr = *psr_i_addr_addr - * pending_intr_addr = masked_addr - 1 - * if (val & IA64_PSR_I) { - *   masked = *masked_addr - *   *masked_addr = 0:xen_set_virtual_psr_i(1) - *   compiler barrier - *   if (masked) { - *      uint8_t pending = *pending_intr_addr; - *      if (pending) - *              XEN_HYPER_SSM_I - *   } - * } else { - *   *masked_addr = 1:xen_set_virtual_psr_i(0) - * } - */ -/* 6 bundles */ -DEFINE_VOID_FUNC1(intrin_local_irq_restore, -		  /* r8 = input value: 0 or IA64_PSR_I -		   * p6 =  (flags & IA64_PSR_I) -		   *    = if clause -		   * p7 = !(flags & IA64_PSR_I) -		   *    = else clause -		   */ -		  "cmp.ne p6, p7 = r8, r0\n" -		  "mov r9 = " __stringify(XEN_PSR_I_ADDR_ADDR) "\n" -		  ";;\n" -		  /* r9 = XEN_PSR_I_ADDR */ -		  "ld8 r9 = [r9]\n" -		  ";;\n" - -		  /* r10 = masked previous value */ -		  "(p6)	ld1.acq r10 = [r9]\n" -		  ";;\n" - -		  /* p8 = !masked interrupt masked previously? */ -		  "(p6)	cmp.ne.unc p8, p0 = r10, r0\n" - -		  /* p7 = else clause */ -		  "(p7)	mov r11 = 1\n" -		  ";;\n" -		  /* masked = 1 */ -		  "(p7)	st1.rel [r9] = r11\n" - -		  /* p6 = if clause */ -		  /* masked = 0 -		   * r9 = masked_addr - 1 -		   *    = pending_intr_addr -		   */ -		  "(p8)	st1.rel [r9] = r0, -1\n" -		  ";;\n" -		  /* r8 = pending_intr */ -		  "(p8)	ld1.acq r11 = [r9]\n" -		  ";;\n" -		  /* p9 = interrupt pending? */ -		  "(p8)	cmp.ne.unc p9, p10 = r11, r0\n" -		  ";;\n" -		  "(p10) mf\n" -		  /* issue hypercall to trigger interrupt */ -		  "(p9)	break " __stringify(HYPERPRIVOP_SSM_I) "\n"); - -DEFINE_VOID_FUNC2(ptcga, -		  "break " __stringify(HYPERPRIVOP_PTC_GA) "\n"); -DEFINE_VOID_FUNC2(set_rr, -		  "break " __stringify(HYPERPRIVOP_SET_RR) "\n"); - -/* - * tmp = XEN_MAPPEDREGS->interrupt_mask_addr = XEN_PSR_I_ADDR_ADDR; - * tmp = *tmp - * tmp = *tmp; - * psr_i = tmp? 0: IA64_PSR_I; - */ -/* 4 bundles */ -DEFINE_FUNC0(get_psr_i, -	     "mov r9 = " __stringify(XEN_PSR_I_ADDR_ADDR) "\n" -	     ";;\n" -	     "ld8 r9 = [r9]\n"			/* r9 = XEN_PSR_I_ADDR */ -	     "mov r8 = 0\n"			/* psr_i = 0 */ -	     ";;\n" -	     "ld1.acq r9 = [r9]\n"		/* r9 = XEN_PSR_I */ -	     ";;\n" -	     "cmp.eq.unc p6, p0 = r9, r0\n"	/* p6 = (XEN_PSR_I != 0) */ -	     ";;\n" -	     "(p6) mov r8 = " __stringify(1 << IA64_PSR_I_BIT) "\n"); - -DEFINE_FUNC1(thash, unsigned long, -	     "break " __stringify(HYPERPRIVOP_THASH) "\n"); -DEFINE_FUNC1(get_cpuid, int, -	     "break " __stringify(HYPERPRIVOP_GET_CPUID) "\n"); -DEFINE_FUNC1(get_pmd, int, -	     "break " __stringify(HYPERPRIVOP_GET_PMD) "\n"); -DEFINE_FUNC1(get_rr, unsigned long, -	     "break " __stringify(HYPERPRIVOP_GET_RR) "\n"); - -/* - * void xen_privop_ssm_i(void) - * - * int masked = !xen_get_virtual_psr_i(); - *	// masked = *(*XEN_MAPPEDREGS->interrupt_mask_addr) - * xen_set_virtual_psr_i(1) - *	// *(*XEN_MAPPEDREGS->interrupt_mask_addr) = 0 - * // compiler barrier - * if (masked) { - *	uint8_t* pend_int_addr = - *		(uint8_t*)(*XEN_MAPPEDREGS->interrupt_mask_addr) - 1; - *	uint8_t pending = *pend_int_addr; - *	if (pending) - *		XEN_HYPER_SSM_I - * } - */ -/* 4 bundles */ -DEFINE_VOID_FUNC0(ssm_i, -		  "mov r8 = " __stringify(XEN_PSR_I_ADDR_ADDR) "\n" -		  ";;\n" -		  "ld8 r8 = [r8]\n"		/* r8 = XEN_PSR_I_ADDR */ -		  ";;\n" -		  "ld1.acq r9 = [r8]\n"		/* r9 = XEN_PSR_I */ -		  ";;\n" -		  "st1.rel [r8] = r0, -1\n"	/* psr_i = 0. enable interrupt -						 * r8 = XEN_PSR_I_ADDR - 1 -						 *    = pend_int_addr -						 */ -		  "cmp.eq.unc p0, p6 = r9, r0\n"/* p6 = !XEN_PSR_I -						 * previously interrupt -						 * masked? -						 */ -		  ";;\n" -		  "(p6) ld1.acq r8 = [r8]\n"	/* r8 = xen_pend_int */ -		  ";;\n" -		  "(p6) cmp.eq.unc p6, p7 = r8, r0\n"	/*interrupt pending?*/ -		  ";;\n" -		  /* issue hypercall to get interrupt */ -		  "(p7) break " __stringify(HYPERPRIVOP_SSM_I) "\n" -		  ";;\n"); - -/* - * psr_i_addr_addr = XEN_MAPPEDREGS->interrupt_mask_addr - *		   = XEN_PSR_I_ADDR_ADDR; - * psr_i_addr = *psr_i_addr_addr; - * *psr_i_addr = 1; - */ -/* 2 bundles */ -DEFINE_VOID_FUNC0(rsm_i, -		  "mov r8 = " __stringify(XEN_PSR_I_ADDR_ADDR) "\n" -						/* r8 = XEN_PSR_I_ADDR */ -		  "mov r9 = 1\n" -		  ";;\n" -		  "ld8 r8 = [r8]\n"		/* r8 = XEN_PSR_I */ -		  ";;\n" -		  "st1.rel [r8] = r9\n");	/* XEN_PSR_I = 1 */ - -extern void -xen_set_rr0_to_rr4(unsigned long val0, unsigned long val1, -		   unsigned long val2, unsigned long val3, -		   unsigned long val4); -__DEFINE_FUNC(set_rr0_to_rr4, -	      "break " __stringify(HYPERPRIVOP_SET_RR0_TO_RR4) "\n"); - - -extern unsigned long xen_getreg(int regnum); -#define __DEFINE_GET_REG(id, privop)					\ -	"mov r2 = " __stringify(_IA64_REG_ ## id) "\n"			\ -	";;\n"								\ -	"cmp.eq p6, p0 = r2, r8\n"					\ -	";;\n"								\ -	"(p6) break " __stringify(HYPERPRIVOP_GET_ ## privop) "\n"	\ -	"(p6) br.cond.sptk.many b6\n"					\ -	";;\n" - -__DEFINE_FUNC(getreg, -	      __DEFINE_GET_REG(PSR, PSR) - -	      /* get_itc */ -	      "mov r2 = " __stringify(_IA64_REG_AR_ITC) "\n" -	      ";;\n" -	      "cmp.eq p6, p0 = r2, r8\n" -	      ";;\n" -	      "(p6) br.cond.spnt xen_get_itc\n" -	      ";;\n" - -	      /* get itm */ -	      "mov r2 = " __stringify(_IA64_REG_CR_ITM) "\n" -	      ";;\n" -	      "cmp.eq p6, p0 = r2, r8\n" -	      ";;\n" -	      "(p6) br.cond.spnt xen_get_itm_with_offset\n" -	      ";;\n" - -	      __DEFINE_GET_REG(CR_IVR, IVR) -	      __DEFINE_GET_REG(CR_TPR, TPR) - -	      /* fall back */ -	      "movl r2 = ia64_native_getreg_func\n" -	      ";;\n" -	      "mov b7 = r2\n" -	      ";;\n" -	      "br.cond.sptk.many b7\n"); - -extern void xen_setreg(int regnum, unsigned long val); -#define __DEFINE_SET_REG(id, privop)					\ -	"mov r2 = " __stringify(_IA64_REG_ ## id) "\n"			\ -	";;\n"								\ -	"cmp.eq p6, p0 = r2, r9\n"					\ -	";;\n"								\ -	"(p6) break " __stringify(HYPERPRIVOP_ ## privop) "\n"		\ -	"(p6) br.cond.sptk.many b6\n"					\ -	";;\n" - -__DEFINE_FUNC(setreg, -	      /* kr0 .. kr 7*/ -	      /* -	       * if (_IA64_REG_AR_KR0 <= regnum && -	       *     regnum <= _IA64_REG_AR_KR7) { -	       *     register __index asm ("r8") = regnum - _IA64_REG_AR_KR0 -	       *     register __val asm ("r9") = val -	       *    "break HYPERPRIVOP_SET_KR" -	       * } -	       */ -	      "mov r17 = r9\n" -	      "mov r2 = " __stringify(_IA64_REG_AR_KR0) "\n" -	      ";;\n" -	      "cmp.ge p6, p0 = r9, r2\n" -	      "sub r17 = r17, r2\n" -	      ";;\n" -	      "(p6) cmp.ge.unc p7, p0 = " -	      __stringify(_IA64_REG_AR_KR7) " - " __stringify(_IA64_REG_AR_KR0) -	      ", r17\n" -	      ";;\n" -	      "(p7) mov r9 = r8\n" -	      ";;\n" -	      "(p7) mov r8 = r17\n" -	      "(p7) break " __stringify(HYPERPRIVOP_SET_KR) "\n" - -	      /* set itm */ -	      "mov r2 = " __stringify(_IA64_REG_CR_ITM) "\n" -	      ";;\n" -	      "cmp.eq p6, p0 = r2, r8\n" -	      ";;\n" -	      "(p6) br.cond.spnt xen_set_itm_with_offset\n" - -	      /* set itc */ -	      "mov r2 = " __stringify(_IA64_REG_AR_ITC) "\n" -	      ";;\n" -	      "cmp.eq p6, p0 = r2, r8\n" -	      ";;\n" -	      "(p6) br.cond.spnt xen_set_itc\n" - -	      __DEFINE_SET_REG(CR_TPR, SET_TPR) -	      __DEFINE_SET_REG(CR_EOI, EOI) - -	      /* fall back */ -	      "movl r2 = ia64_native_setreg_func\n" -	      ";;\n" -	      "mov b7 = r2\n" -	      ";;\n" -	      "br.cond.sptk.many b7\n"); -#endif - -static const struct pv_cpu_ops xen_cpu_ops __initconst = { -	.fc		= xen_fc, -	.thash		= xen_thash, -	.get_cpuid	= xen_get_cpuid, -	.get_pmd	= xen_get_pmd, -	.getreg		= xen_getreg, -	.setreg		= xen_setreg, -	.ptcga		= xen_ptcga, -	.get_rr		= xen_get_rr, -	.set_rr		= xen_set_rr, -	.set_rr0_to_rr4	= xen_set_rr0_to_rr4, -	.ssm_i		= xen_ssm_i, -	.rsm_i		= xen_rsm_i, -	.get_psr_i	= xen_get_psr_i, -	.intrin_local_irq_restore -			= xen_intrin_local_irq_restore, -}; - -/****************************************************************************** - * replacement of hand written assembly codes. - */ - -extern char xen_switch_to; -extern char xen_leave_syscall; -extern char xen_work_processed_syscall; -extern char xen_leave_kernel; - -const struct pv_cpu_asm_switch xen_cpu_asm_switch = { -	.switch_to		= (unsigned long)&xen_switch_to, -	.leave_syscall		= (unsigned long)&xen_leave_syscall, -	.work_processed_syscall	= (unsigned long)&xen_work_processed_syscall, -	.leave_kernel		= (unsigned long)&xen_leave_kernel, -}; - -/*************************************************************************** - * pv_iosapic_ops - * iosapic read/write hooks. - */ -static void -xen_pcat_compat_init(void) -{ -	/* nothing */ -} - -static struct irq_chip* -xen_iosapic_get_irq_chip(unsigned long trigger) -{ -	return NULL; -} - -static unsigned int -xen_iosapic_read(char __iomem *iosapic, unsigned int reg) -{ -	struct physdev_apic apic_op; -	int ret; - -	apic_op.apic_physbase = (unsigned long)iosapic - -					__IA64_UNCACHED_OFFSET; -	apic_op.reg = reg; -	ret = HYPERVISOR_physdev_op(PHYSDEVOP_apic_read, &apic_op); -	if (ret) -		return ret; -	return apic_op.value; -} - -static void -xen_iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val) -{ -	struct physdev_apic apic_op; - -	apic_op.apic_physbase = (unsigned long)iosapic - -					__IA64_UNCACHED_OFFSET; -	apic_op.reg = reg; -	apic_op.value = val; -	HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op); -} - -static struct pv_iosapic_ops xen_iosapic_ops __initdata = { -	.pcat_compat_init = xen_pcat_compat_init, -	.__get_irq_chip = xen_iosapic_get_irq_chip, - -	.__read = xen_iosapic_read, -	.__write = xen_iosapic_write, -}; - -/*************************************************************************** - * pv_ops initialization - */ - -void __init -xen_setup_pv_ops(void) -{ -	xen_info_init(); -	pv_info = xen_info; -	pv_init_ops = xen_init_ops; -	pv_fsys_data = xen_fsys_data; -	pv_patchdata = xen_patchdata; -	pv_cpu_ops = xen_cpu_ops; -	pv_iosapic_ops = xen_iosapic_ops; -	pv_irq_ops = xen_irq_ops; -	pv_time_ops = xen_time_ops; - -	paravirt_cpu_asm_init(&xen_cpu_asm_switch); -} - -#ifdef ASM_SUPPORTED -/*************************************************************************** - * binary pacthing - * pv_init_ops.patch_bundle - */ - -#define DEFINE_FUNC_GETREG(name, privop)				\ -	DEFINE_FUNC0(get_ ## name,					\ -		     "break "__stringify(HYPERPRIVOP_GET_ ## privop) "\n") - -DEFINE_FUNC_GETREG(psr, PSR); -DEFINE_FUNC_GETREG(eflag, EFLAG); -DEFINE_FUNC_GETREG(ivr, IVR); -DEFINE_FUNC_GETREG(tpr, TPR); - -#define DEFINE_FUNC_SET_KR(n)						\ -	DEFINE_VOID_FUNC0(set_kr ## n,					\ -			  ";;\n"					\ -			  "mov r9 = r8\n"				\ -			  "mov r8 = " #n "\n"				\ -			  "break " __stringify(HYPERPRIVOP_SET_KR) "\n") - -DEFINE_FUNC_SET_KR(0); -DEFINE_FUNC_SET_KR(1); -DEFINE_FUNC_SET_KR(2); -DEFINE_FUNC_SET_KR(3); -DEFINE_FUNC_SET_KR(4); -DEFINE_FUNC_SET_KR(5); -DEFINE_FUNC_SET_KR(6); -DEFINE_FUNC_SET_KR(7); - -#define __DEFINE_FUNC_SETREG(name, privop)				\ -	DEFINE_VOID_FUNC0(name,						\ -			  "break "__stringify(HYPERPRIVOP_ ## privop) "\n") - -#define DEFINE_FUNC_SETREG(name, privop)			\ -	__DEFINE_FUNC_SETREG(set_ ## name, SET_ ## privop) - -DEFINE_FUNC_SETREG(eflag, EFLAG); -DEFINE_FUNC_SETREG(tpr, TPR); -__DEFINE_FUNC_SETREG(eoi, EOI); - -extern const char xen_check_events[]; -extern const char __xen_intrin_local_irq_restore_direct_start[]; -extern const char __xen_intrin_local_irq_restore_direct_end[]; -extern const unsigned long __xen_intrin_local_irq_restore_direct_reloc; - -asm ( -	".align 32\n" -	".proc xen_check_events\n" -	"xen_check_events:\n" -	/* masked = 0 -	 * r9 = masked_addr - 1 -	 *    = pending_intr_addr -	 */ -	"st1.rel [r9] = r0, -1\n" -	";;\n" -	/* r8 = pending_intr */ -	"ld1.acq r11 = [r9]\n" -	";;\n" -	/* p9 = interrupt pending? */ -	"cmp.ne p9, p10 = r11, r0\n" -	";;\n" -	"(p10) mf\n" -	/* issue hypercall to trigger interrupt */ -	"(p9) break " __stringify(HYPERPRIVOP_SSM_I) "\n" -	"br.cond.sptk.many b6\n" -	".endp xen_check_events\n" -	"\n" -	".align 32\n" -	".proc __xen_intrin_local_irq_restore_direct\n" -	"__xen_intrin_local_irq_restore_direct:\n" -	"__xen_intrin_local_irq_restore_direct_start:\n" -	"1:\n" -	"{\n" -	"cmp.ne p6, p7 = r8, r0\n" -	"mov r17 = ip\n" /* get ip to calc return address */ -	"mov r9 = "__stringify(XEN_PSR_I_ADDR_ADDR) "\n" -	";;\n" -	"}\n" -	"{\n" -	/* r9 = XEN_PSR_I_ADDR */ -	"ld8 r9 = [r9]\n" -	";;\n" -	/* r10 = masked previous value */ -	"(p6) ld1.acq r10 = [r9]\n" -	"adds r17 =  1f - 1b, r17\n" /* calculate return address */ -	";;\n" -	"}\n" -	"{\n" -	/* p8 = !masked interrupt masked previously? */ -	"(p6) cmp.ne.unc p8, p0 = r10, r0\n" -	"\n" -	/* p7 = else clause */ -	"(p7) mov r11 = 1\n" -	";;\n" -	"(p8) mov b6 = r17\n" /* set return address */ -	"}\n" -	"{\n" -	/* masked = 1 */ -	"(p7) st1.rel [r9] = r11\n" -	"\n" -	"[99:]\n" -	"(p8) brl.cond.dptk.few xen_check_events\n" -	"}\n" -	/* pv calling stub is 5 bundles. fill nop to adjust return address */ -	"{\n" -	"nop 0\n" -	"nop 0\n" -	"nop 0\n" -	"}\n" -	"1:\n" -	"__xen_intrin_local_irq_restore_direct_end:\n" -	".endp __xen_intrin_local_irq_restore_direct\n" -	"\n" -	".align 8\n" -	"__xen_intrin_local_irq_restore_direct_reloc:\n" -	"data8 99b\n" -); - -static struct paravirt_patch_bundle_elem xen_patch_bundle_elems[] -__initdata_or_module = -{ -#define XEN_PATCH_BUNDLE_ELEM(name, type)		\ -	{						\ -		(void*)xen_ ## name ## _direct_start,	\ -		(void*)xen_ ## name ## _direct_end,	\ -		PARAVIRT_PATCH_TYPE_ ## type,		\ -	} - -	XEN_PATCH_BUNDLE_ELEM(fc, FC), -	XEN_PATCH_BUNDLE_ELEM(thash, THASH), -	XEN_PATCH_BUNDLE_ELEM(get_cpuid, GET_CPUID), -	XEN_PATCH_BUNDLE_ELEM(get_pmd, GET_PMD), -	XEN_PATCH_BUNDLE_ELEM(ptcga, PTCGA), -	XEN_PATCH_BUNDLE_ELEM(get_rr, GET_RR), -	XEN_PATCH_BUNDLE_ELEM(set_rr, SET_RR), -	XEN_PATCH_BUNDLE_ELEM(set_rr0_to_rr4, SET_RR0_TO_RR4), -	XEN_PATCH_BUNDLE_ELEM(ssm_i, SSM_I), -	XEN_PATCH_BUNDLE_ELEM(rsm_i, RSM_I), -	XEN_PATCH_BUNDLE_ELEM(get_psr_i, GET_PSR_I), -	{ -		(void*)__xen_intrin_local_irq_restore_direct_start, -		(void*)__xen_intrin_local_irq_restore_direct_end, -		PARAVIRT_PATCH_TYPE_INTRIN_LOCAL_IRQ_RESTORE, -	}, - -#define XEN_PATCH_BUNDLE_ELEM_GETREG(name, reg)			\ -	{							\ -		xen_get_ ## name ## _direct_start,		\ -		xen_get_ ## name ## _direct_end,		\ -		PARAVIRT_PATCH_TYPE_GETREG + _IA64_REG_ ## reg, \ -	} - -	XEN_PATCH_BUNDLE_ELEM_GETREG(psr, PSR), -	XEN_PATCH_BUNDLE_ELEM_GETREG(eflag, AR_EFLAG), - -	XEN_PATCH_BUNDLE_ELEM_GETREG(ivr, CR_IVR), -	XEN_PATCH_BUNDLE_ELEM_GETREG(tpr, CR_TPR), - -	XEN_PATCH_BUNDLE_ELEM_GETREG(itc, AR_ITC), -	XEN_PATCH_BUNDLE_ELEM_GETREG(itm_with_offset, CR_ITM), - - -#define __XEN_PATCH_BUNDLE_ELEM_SETREG(name, reg)		\ -	{							\ -		xen_ ## name ## _direct_start,			\ -		xen_ ## name ## _direct_end,			\ -		PARAVIRT_PATCH_TYPE_SETREG + _IA64_REG_ ## reg, \ -	} - -#define XEN_PATCH_BUNDLE_ELEM_SETREG(name, reg)			\ -	__XEN_PATCH_BUNDLE_ELEM_SETREG(set_ ## name, reg) - -	XEN_PATCH_BUNDLE_ELEM_SETREG(kr0, AR_KR0), -	XEN_PATCH_BUNDLE_ELEM_SETREG(kr1, AR_KR1), -	XEN_PATCH_BUNDLE_ELEM_SETREG(kr2, AR_KR2), -	XEN_PATCH_BUNDLE_ELEM_SETREG(kr3, AR_KR3), -	XEN_PATCH_BUNDLE_ELEM_SETREG(kr4, AR_KR4), -	XEN_PATCH_BUNDLE_ELEM_SETREG(kr5, AR_KR5), -	XEN_PATCH_BUNDLE_ELEM_SETREG(kr6, AR_KR6), -	XEN_PATCH_BUNDLE_ELEM_SETREG(kr7, AR_KR7), - -	XEN_PATCH_BUNDLE_ELEM_SETREG(eflag, AR_EFLAG), -	XEN_PATCH_BUNDLE_ELEM_SETREG(tpr, CR_TPR), -	__XEN_PATCH_BUNDLE_ELEM_SETREG(eoi, CR_EOI), - -	XEN_PATCH_BUNDLE_ELEM_SETREG(itc, AR_ITC), -	XEN_PATCH_BUNDLE_ELEM_SETREG(itm_with_offset, CR_ITM), -}; - -static unsigned long __init_or_module -xen_patch_bundle(void *sbundle, void *ebundle, unsigned long type) -{ -	const unsigned long nelems = sizeof(xen_patch_bundle_elems) / -		sizeof(xen_patch_bundle_elems[0]); -	unsigned long used; -	const struct paravirt_patch_bundle_elem *found; - -	used = __paravirt_patch_apply_bundle(sbundle, ebundle, type, -					     xen_patch_bundle_elems, nelems, -					     &found); - -	if (found == NULL) -		/* fallback */ -		return ia64_native_patch_bundle(sbundle, ebundle, type); -	if (used == 0) -		return used; - -	/* relocation */ -	switch (type) { -	case PARAVIRT_PATCH_TYPE_INTRIN_LOCAL_IRQ_RESTORE: { -		unsigned long reloc = -			__xen_intrin_local_irq_restore_direct_reloc; -		unsigned long reloc_offset = reloc - (unsigned long) -			__xen_intrin_local_irq_restore_direct_start; -		unsigned long tag = (unsigned long)sbundle + reloc_offset; -		paravirt_patch_reloc_brl(tag, xen_check_events); -		break; -	} -	default: -		/* nothing */ -		break; -	} -	return used; -} -#endif /* ASM_SUPPOTED */ - -const struct paravirt_patch_branch_target xen_branch_target[] -__initconst = { -#define PARAVIRT_BR_TARGET(name, type)			\ -	{						\ -		&xen_ ## name,				\ -		PARAVIRT_PATCH_TYPE_BR_ ## type,	\ -	} -	PARAVIRT_BR_TARGET(switch_to, SWITCH_TO), -	PARAVIRT_BR_TARGET(leave_syscall, LEAVE_SYSCALL), -	PARAVIRT_BR_TARGET(work_processed_syscall, WORK_PROCESSED_SYSCALL), -	PARAVIRT_BR_TARGET(leave_kernel, LEAVE_KERNEL), -}; - -static void __init -xen_patch_branch(unsigned long tag, unsigned long type) -{ -	__paravirt_patch_apply_branch(tag, type, xen_branch_target, -					ARRAY_SIZE(xen_branch_target)); -} diff --git a/arch/ia64/xen/xencomm.c b/arch/ia64/xen/xencomm.c deleted file mode 100644 index 1f5d7ac82e9..00000000000 --- a/arch/ia64/xen/xencomm.c +++ /dev/null @@ -1,105 +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> - -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 (!page) -		return ~0UL; - -	return (page_to_pfn(page) << PAGE_SHIFT) | (vaddr & ~PAGE_MASK); -} diff --git a/arch/ia64/xen/xenivt.S b/arch/ia64/xen/xenivt.S deleted file mode 100644 index 3e71d50584d..00000000000 --- a/arch/ia64/xen/xenivt.S +++ /dev/null @@ -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) diff --git a/arch/ia64/xen/xensetup.S b/arch/ia64/xen/xensetup.S deleted file mode 100644 index b820ed02ab9..00000000000 --- a/arch/ia64/xen/xensetup.S +++ /dev/null @@ -1,81 +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/system.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)  | 
