aboutsummaryrefslogtreecommitdiffstats
path: root/arch/ia64
diff options
context:
space:
mode:
Diffstat (limited to 'arch/ia64')
-rw-r--r--arch/ia64/Kconfig14
-rw-r--r--arch/ia64/Kconfig.debug11
-rw-r--r--arch/ia64/configs/sn2_defconfig8
-rw-r--r--arch/ia64/configs/tiger_defconfig19
-rw-r--r--arch/ia64/defconfig146
-rw-r--r--arch/ia64/ia32/ia32priv.h2
-rw-r--r--arch/ia64/kernel/Makefile2
-rw-r--r--arch/ia64/kernel/domain.c78
-rw-r--r--arch/ia64/kernel/efi.c32
-rw-r--r--arch/ia64/kernel/entry.S6
-rw-r--r--arch/ia64/kernel/entry.h2
-rw-r--r--arch/ia64/kernel/ivt.S13
-rw-r--r--arch/ia64/kernel/jprobes.S61
-rw-r--r--arch/ia64/kernel/kprobes.c721
-rw-r--r--arch/ia64/kernel/process.c16
-rw-r--r--arch/ia64/kernel/ptrace.c15
-rw-r--r--arch/ia64/kernel/signal.c5
-rw-r--r--arch/ia64/kernel/smp.c2
-rw-r--r--arch/ia64/kernel/smpboot.c4
-rw-r--r--arch/ia64/kernel/traps.c33
-rw-r--r--arch/ia64/kernel/uncached.c246
-rw-r--r--arch/ia64/kernel/vmlinux.lds.S7
-rw-r--r--arch/ia64/mm/discontig.c9
-rw-r--r--arch/ia64/mm/fault.c8
-rw-r--r--arch/ia64/mm/hugetlbpage.c158
-rw-r--r--arch/ia64/pci/pci.c20
-rw-r--r--arch/ia64/sn/kernel/tiocx.c25
-rw-r--r--arch/ia64/sn/kernel/xpc.h12
-rw-r--r--arch/ia64/sn/kernel/xpc_channel.c12
-rw-r--r--arch/ia64/sn/kernel/xpc_partition.c8
30 files changed, 1374 insertions, 321 deletions
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
index 3ad2c4af099c..01b78e7f992e 100644
--- a/arch/ia64/Kconfig
+++ b/arch/ia64/Kconfig
@@ -50,6 +50,10 @@ config SCHED_NO_NO_OMIT_FRAME_POINTER
50 bool 50 bool
51 default y 51 default y
52 52
53config IA64_UNCACHED_ALLOCATOR
54 bool
55 select GENERIC_ALLOCATOR
56
53choice 57choice
54 prompt "System type" 58 prompt "System type"
55 default IA64_GENERIC 59 default IA64_GENERIC
@@ -157,6 +161,8 @@ config IA64_PAGE_SIZE_64KB
157 161
158endchoice 162endchoice
159 163
164source kernel/Kconfig.hz
165
160config IA64_BRL_EMU 166config IA64_BRL_EMU
161 bool 167 bool
162 depends on ITANIUM 168 depends on ITANIUM
@@ -193,7 +199,7 @@ config HOLES_IN_ZONE
193 bool 199 bool
194 default y if VIRTUAL_MEM_MAP 200 default y if VIRTUAL_MEM_MAP
195 201
196config DISCONTIGMEM 202config ARCH_DISCONTIGMEM_ENABLE
197 bool "Discontiguous memory support" 203 bool "Discontiguous memory support"
198 depends on (IA64_DIG || IA64_SGI_SN2 || IA64_GENERIC || IA64_HP_ZX1 || IA64_HP_ZX1_SWIOTLB) && NUMA && VIRTUAL_MEM_MAP 204 depends on (IA64_DIG || IA64_SGI_SN2 || IA64_GENERIC || IA64_HP_ZX1 || IA64_HP_ZX1_SWIOTLB) && NUMA && VIRTUAL_MEM_MAP
199 default y if (IA64_SGI_SN2 || IA64_GENERIC) && NUMA 205 default y if (IA64_SGI_SN2 || IA64_GENERIC) && NUMA
@@ -216,14 +222,14 @@ config IOSAPIC
216 222
217config IA64_SGI_SN_SIM 223config IA64_SGI_SN_SIM
218 bool "SGI Medusa Simulator Support" 224 bool "SGI Medusa Simulator Support"
219 depends on IA64_SGI_SN2 225 depends on IA64_SGI_SN2 || IA64_GENERIC
220 help 226 help
221 If you are compiling a kernel that will run under SGI's IA-64 227 If you are compiling a kernel that will run under SGI's IA-64
222 simulator (Medusa) then say Y, otherwise say N. 228 simulator (Medusa) then say Y, otherwise say N.
223 229
224config IA64_SGI_SN_XP 230config IA64_SGI_SN_XP
225 tristate "Support communication between SGI SSIs" 231 tristate "Support communication between SGI SSIs"
226 depends on MSPEC 232 select IA64_UNCACHED_ALLOCATOR
227 help 233 help
228 An SGI machine can be divided into multiple Single System 234 An SGI machine can be divided into multiple Single System
229 Images which act independently of each other and have 235 Images which act independently of each other and have
@@ -296,6 +302,8 @@ config PREEMPT
296 Say Y here if you are building a kernel for a desktop, embedded 302 Say Y here if you are building a kernel for a desktop, embedded
297 or real-time system. Say N if you are unsure. 303 or real-time system. Say N if you are unsure.
298 304
305source "mm/Kconfig"
306
299config HAVE_DEC_LOCK 307config HAVE_DEC_LOCK
300 bool 308 bool
301 depends on (SMP || PREEMPT) 309 depends on (SMP || PREEMPT)
diff --git a/arch/ia64/Kconfig.debug b/arch/ia64/Kconfig.debug
index de9d507ba0fd..fda67ac993d7 100644
--- a/arch/ia64/Kconfig.debug
+++ b/arch/ia64/Kconfig.debug
@@ -2,6 +2,17 @@ menu "Kernel hacking"
2 2
3source "lib/Kconfig.debug" 3source "lib/Kconfig.debug"
4 4
5config KPROBES
6 bool "Kprobes"
7 depends on DEBUG_KERNEL
8 help
9 Kprobes allows you to trap at almost any kernel address and
10 execute a callback function. register_kprobe() establishes
11 a probepoint and specifies the callback. Kprobes is useful
12 for kernel debugging, non-intrusive instrumentation and testing.
13 If in doubt, say "N".
14
15
5choice 16choice
6 prompt "Physical memory granularity" 17 prompt "Physical memory granularity"
7 default IA64_GRANULE_64MB 18 default IA64_GRANULE_64MB
diff --git a/arch/ia64/configs/sn2_defconfig b/arch/ia64/configs/sn2_defconfig
index 6ff7107fee4d..487d2e36b0a6 100644
--- a/arch/ia64/configs/sn2_defconfig
+++ b/arch/ia64/configs/sn2_defconfig
@@ -78,7 +78,7 @@ CONFIG_IA64_L1_CACHE_SHIFT=7
78CONFIG_NUMA=y 78CONFIG_NUMA=y
79CONFIG_VIRTUAL_MEM_MAP=y 79CONFIG_VIRTUAL_MEM_MAP=y
80CONFIG_HOLES_IN_ZONE=y 80CONFIG_HOLES_IN_ZONE=y
81CONFIG_DISCONTIGMEM=y 81CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
82# CONFIG_IA64_CYCLONE is not set 82# CONFIG_IA64_CYCLONE is not set
83CONFIG_IOSAPIC=y 83CONFIG_IOSAPIC=y
84CONFIG_IA64_SGI_SN_SIM=y 84CONFIG_IA64_SGI_SN_SIM=y
@@ -588,6 +588,7 @@ CONFIG_SGI_MBCS=m
588CONFIG_SERIAL_CORE=y 588CONFIG_SERIAL_CORE=y
589CONFIG_SERIAL_CORE_CONSOLE=y 589CONFIG_SERIAL_CORE_CONSOLE=y
590CONFIG_SERIAL_SGI_L1_CONSOLE=y 590CONFIG_SERIAL_SGI_L1_CONSOLE=y
591CONFIG_SERIAL_SGI_IOC4=y
591CONFIG_UNIX98_PTYS=y 592CONFIG_UNIX98_PTYS=y
592CONFIG_LEGACY_PTYS=y 593CONFIG_LEGACY_PTYS=y
593CONFIG_LEGACY_PTY_COUNT=256 594CONFIG_LEGACY_PTY_COUNT=256
@@ -788,6 +789,11 @@ CONFIG_INFINIBAND_IPOIB=m
788# CONFIG_INFINIBAND_IPOIB_DEBUG is not set 789# CONFIG_INFINIBAND_IPOIB_DEBUG is not set
789 790
790# 791#
792# SN Devices
793#
794CONFIG_SGI_IOC4=y
795
796#
791# File systems 797# File systems
792# 798#
793CONFIG_EXT2_FS=y 799CONFIG_EXT2_FS=y
diff --git a/arch/ia64/configs/tiger_defconfig b/arch/ia64/configs/tiger_defconfig
index 9086b789f6ac..47f45341ac62 100644
--- a/arch/ia64/configs/tiger_defconfig
+++ b/arch/ia64/configs/tiger_defconfig
@@ -1,7 +1,7 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Linux kernel version: 2.6.12-rc3 3# Linux kernel version: 2.6.12-20050621
4# Tue May 3 15:55:04 2005 4# Tue Jun 21 14:03:24 2005
5# 5#
6 6
7# 7#
@@ -67,6 +67,7 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y
67CONFIG_TIME_INTERPOLATION=y 67CONFIG_TIME_INTERPOLATION=y
68CONFIG_EFI=y 68CONFIG_EFI=y
69CONFIG_GENERIC_IOMAP=y 69CONFIG_GENERIC_IOMAP=y
70CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
70# CONFIG_IA64_GENERIC is not set 71# CONFIG_IA64_GENERIC is not set
71CONFIG_IA64_DIG=y 72CONFIG_IA64_DIG=y
72# CONFIG_IA64_HP_ZX1 is not set 73# CONFIG_IA64_HP_ZX1 is not set
@@ -285,6 +286,7 @@ CONFIG_CHR_DEV_ST=m
285CONFIG_BLK_DEV_SR=m 286CONFIG_BLK_DEV_SR=m
286# CONFIG_BLK_DEV_SR_VENDOR is not set 287# CONFIG_BLK_DEV_SR_VENDOR is not set
287CONFIG_CHR_DEV_SG=m 288CONFIG_CHR_DEV_SG=m
289# CONFIG_CHR_DEV_SCH is not set
288 290
289# 291#
290# Some SCSI devices (e.g. CD jukebox) support multiple LUNs 292# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
@@ -313,11 +315,8 @@ CONFIG_SCSI_FC_ATTRS=y
313# CONFIG_MEGARAID_NEWGEN is not set 315# CONFIG_MEGARAID_NEWGEN is not set
314# CONFIG_MEGARAID_LEGACY is not set 316# CONFIG_MEGARAID_LEGACY is not set
315# CONFIG_SCSI_SATA is not set 317# CONFIG_SCSI_SATA is not set
316# CONFIG_SCSI_BUSLOGIC is not set
317# CONFIG_SCSI_DMX3191D is not set 318# CONFIG_SCSI_DMX3191D is not set
318# CONFIG_SCSI_EATA is not set
319# CONFIG_SCSI_FUTURE_DOMAIN is not set 319# CONFIG_SCSI_FUTURE_DOMAIN is not set
320# CONFIG_SCSI_GDTH is not set
321# CONFIG_SCSI_IPS is not set 320# CONFIG_SCSI_IPS is not set
322# CONFIG_SCSI_INITIO is not set 321# CONFIG_SCSI_INITIO is not set
323# CONFIG_SCSI_INIA100 is not set 322# CONFIG_SCSI_INIA100 is not set
@@ -366,8 +365,10 @@ CONFIG_DM_ZERO=m
366# Fusion MPT device support 365# Fusion MPT device support
367# 366#
368CONFIG_FUSION=y 367CONFIG_FUSION=y
369CONFIG_FUSION_MAX_SGE=40 368CONFIG_FUSION_SPI=y
370# CONFIG_FUSION_CTL is not set 369CONFIG_FUSION_FC=y
370CONFIG_FUSION_MAX_SGE=128
371CONFIG_FUSION_CTL=y
371 372
372# 373#
373# IEEE 1394 (FireWire) support 374# IEEE 1394 (FireWire) support
@@ -506,9 +507,11 @@ CONFIG_E1000=y
506# CONFIG_HAMACHI is not set 507# CONFIG_HAMACHI is not set
507# CONFIG_YELLOWFIN is not set 508# CONFIG_YELLOWFIN is not set
508# CONFIG_R8169 is not set 509# CONFIG_R8169 is not set
510# CONFIG_SKGE is not set
509# CONFIG_SK98LIN is not set 511# CONFIG_SK98LIN is not set
510# CONFIG_VIA_VELOCITY is not set 512# CONFIG_VIA_VELOCITY is not set
511CONFIG_TIGON3=y 513CONFIG_TIGON3=y
514# CONFIG_BNX2 is not set
512 515
513# 516#
514# Ethernet (10000 Mbit) 517# Ethernet (10000 Mbit)
@@ -598,7 +601,6 @@ CONFIG_GAMEPORT=m
598# CONFIG_GAMEPORT_VORTEX is not set 601# CONFIG_GAMEPORT_VORTEX is not set
599# CONFIG_GAMEPORT_FM801 is not set 602# CONFIG_GAMEPORT_FM801 is not set
600# CONFIG_GAMEPORT_CS461X is not set 603# CONFIG_GAMEPORT_CS461X is not set
601CONFIG_SOUND_GAMEPORT=m
602 604
603# 605#
604# Character devices 606# Character devices
@@ -611,7 +613,6 @@ CONFIG_SERIAL_NONSTANDARD=y
611# CONFIG_CYCLADES is not set 613# CONFIG_CYCLADES is not set
612# CONFIG_MOXA_SMARTIO is not set 614# CONFIG_MOXA_SMARTIO is not set
613# CONFIG_ISI is not set 615# CONFIG_ISI is not set
614# CONFIG_SYNCLINK is not set
615# CONFIG_SYNCLINKMP is not set 616# CONFIG_SYNCLINKMP is not set
616# CONFIG_N_HDLC is not set 617# CONFIG_N_HDLC is not set
617# CONFIG_SPECIALIX is not set 618# CONFIG_SPECIALIX is not set
diff --git a/arch/ia64/defconfig b/arch/ia64/defconfig
index 7539e83bf054..8444add76380 100644
--- a/arch/ia64/defconfig
+++ b/arch/ia64/defconfig
@@ -1,7 +1,7 @@
1# 1#
2# Automatically generated make config: don't edit 2# Automatically generated make config: don't edit
3# Linux kernel version: 2.6.10 3# Linux kernel version: 2.6.12
4# Thu Jan 6 11:13:13 2005 4# Tue Jun 21 11:30:42 2005
5# 5#
6 6
7# 7#
@@ -10,6 +10,7 @@
10CONFIG_EXPERIMENTAL=y 10CONFIG_EXPERIMENTAL=y
11CONFIG_CLEAN_COMPILE=y 11CONFIG_CLEAN_COMPILE=y
12CONFIG_LOCK_KERNEL=y 12CONFIG_LOCK_KERNEL=y
13CONFIG_INIT_ENV_ARG_LIMIT=32
13 14
14# 15#
15# General setup 16# General setup
@@ -21,24 +22,27 @@ CONFIG_POSIX_MQUEUE=y
21# CONFIG_BSD_PROCESS_ACCT is not set 22# CONFIG_BSD_PROCESS_ACCT is not set
22CONFIG_SYSCTL=y 23CONFIG_SYSCTL=y
23# CONFIG_AUDIT is not set 24# CONFIG_AUDIT is not set
24CONFIG_LOG_BUF_SHIFT=20
25CONFIG_HOTPLUG=y 25CONFIG_HOTPLUG=y
26CONFIG_KOBJECT_UEVENT=y 26CONFIG_KOBJECT_UEVENT=y
27CONFIG_IKCONFIG=y 27CONFIG_IKCONFIG=y
28CONFIG_IKCONFIG_PROC=y 28CONFIG_IKCONFIG_PROC=y
29# CONFIG_CPUSETS is not set
29# CONFIG_EMBEDDED is not set 30# CONFIG_EMBEDDED is not set
30CONFIG_KALLSYMS=y 31CONFIG_KALLSYMS=y
31CONFIG_KALLSYMS_ALL=y 32CONFIG_KALLSYMS_ALL=y
32# CONFIG_KALLSYMS_EXTRA_PASS is not set 33# CONFIG_KALLSYMS_EXTRA_PASS is not set
34CONFIG_PRINTK=y
35CONFIG_BUG=y
36CONFIG_BASE_FULL=y
33CONFIG_FUTEX=y 37CONFIG_FUTEX=y
34CONFIG_EPOLL=y 38CONFIG_EPOLL=y
35# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
36CONFIG_SHMEM=y 39CONFIG_SHMEM=y
37CONFIG_CC_ALIGN_FUNCTIONS=0 40CONFIG_CC_ALIGN_FUNCTIONS=0
38CONFIG_CC_ALIGN_LABELS=0 41CONFIG_CC_ALIGN_LABELS=0
39CONFIG_CC_ALIGN_LOOPS=0 42CONFIG_CC_ALIGN_LOOPS=0
40CONFIG_CC_ALIGN_JUMPS=0 43CONFIG_CC_ALIGN_JUMPS=0
41# CONFIG_TINY_SHMEM is not set 44# CONFIG_TINY_SHMEM is not set
45CONFIG_BASE_SMALL=0
42 46
43# 47#
44# Loadable module support 48# Loadable module support
@@ -63,9 +67,11 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y
63CONFIG_TIME_INTERPOLATION=y 67CONFIG_TIME_INTERPOLATION=y
64CONFIG_EFI=y 68CONFIG_EFI=y
65CONFIG_GENERIC_IOMAP=y 69CONFIG_GENERIC_IOMAP=y
70CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
66CONFIG_IA64_GENERIC=y 71CONFIG_IA64_GENERIC=y
67# CONFIG_IA64_DIG is not set 72# CONFIG_IA64_DIG is not set
68# CONFIG_IA64_HP_ZX1 is not set 73# CONFIG_IA64_HP_ZX1 is not set
74# CONFIG_IA64_HP_ZX1_SWIOTLB is not set
69# CONFIG_IA64_SGI_SN2 is not set 75# CONFIG_IA64_SGI_SN2 is not set
70# CONFIG_IA64_HP_SIM is not set 76# CONFIG_IA64_HP_SIM is not set
71# CONFIG_ITANIUM is not set 77# CONFIG_ITANIUM is not set
@@ -77,13 +83,15 @@ CONFIG_IA64_PAGE_SIZE_16KB=y
77CONFIG_IA64_L1_CACHE_SHIFT=7 83CONFIG_IA64_L1_CACHE_SHIFT=7
78CONFIG_NUMA=y 84CONFIG_NUMA=y
79CONFIG_VIRTUAL_MEM_MAP=y 85CONFIG_VIRTUAL_MEM_MAP=y
80CONFIG_DISCONTIGMEM=y 86CONFIG_HOLES_IN_ZONE=y
87CONFIG_ARCH_DISCONTIGMEM_ENABLE=y
81CONFIG_IA64_CYCLONE=y 88CONFIG_IA64_CYCLONE=y
82CONFIG_IOSAPIC=y 89CONFIG_IOSAPIC=y
83CONFIG_FORCE_MAX_ZONEORDER=18 90CONFIG_FORCE_MAX_ZONEORDER=18
84CONFIG_SMP=y 91CONFIG_SMP=y
85CONFIG_NR_CPUS=512 92CONFIG_NR_CPUS=512
86CONFIG_HOTPLUG_CPU=y 93CONFIG_HOTPLUG_CPU=y
94# CONFIG_SCHED_SMT is not set
87# CONFIG_PREEMPT is not set 95# CONFIG_PREEMPT is not set
88CONFIG_HAVE_DEC_LOCK=y 96CONFIG_HAVE_DEC_LOCK=y
89CONFIG_IA32_SUPPORT=y 97CONFIG_IA32_SUPPORT=y
@@ -135,6 +143,7 @@ CONFIG_PCI_DOMAINS=y
135# CONFIG_PCI_MSI is not set 143# CONFIG_PCI_MSI is not set
136CONFIG_PCI_LEGACY_PROC=y 144CONFIG_PCI_LEGACY_PROC=y
137CONFIG_PCI_NAMES=y 145CONFIG_PCI_NAMES=y
146# CONFIG_PCI_DEBUG is not set
138 147
139# 148#
140# PCI Hotplug Support 149# PCI Hotplug Support
@@ -144,7 +153,6 @@ CONFIG_HOTPLUG_PCI=m
144CONFIG_HOTPLUG_PCI_ACPI=m 153CONFIG_HOTPLUG_PCI_ACPI=m
145# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set 154# CONFIG_HOTPLUG_PCI_ACPI_IBM is not set
146# CONFIG_HOTPLUG_PCI_CPCI is not set 155# CONFIG_HOTPLUG_PCI_CPCI is not set
147# CONFIG_HOTPLUG_PCI_PCIE is not set
148# CONFIG_HOTPLUG_PCI_SHPC is not set 156# CONFIG_HOTPLUG_PCI_SHPC is not set
149 157
150# 158#
@@ -153,10 +161,6 @@ CONFIG_HOTPLUG_PCI_ACPI=m
153# CONFIG_PCCARD is not set 161# CONFIG_PCCARD is not set
154 162
155# 163#
156# PC-card bridges
157#
158
159#
160# Device Drivers 164# Device Drivers
161# 165#
162 166
@@ -190,6 +194,7 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
190# CONFIG_BLK_CPQ_CISS_DA is not set 194# CONFIG_BLK_CPQ_CISS_DA is not set
191# CONFIG_BLK_DEV_DAC960 is not set 195# CONFIG_BLK_DEV_DAC960 is not set
192# CONFIG_BLK_DEV_UMEM is not set 196# CONFIG_BLK_DEV_UMEM is not set
197# CONFIG_BLK_DEV_COW_COMMON is not set
193CONFIG_BLK_DEV_LOOP=m 198CONFIG_BLK_DEV_LOOP=m
194CONFIG_BLK_DEV_CRYPTOLOOP=m 199CONFIG_BLK_DEV_CRYPTOLOOP=m
195CONFIG_BLK_DEV_NBD=m 200CONFIG_BLK_DEV_NBD=m
@@ -209,6 +214,7 @@ CONFIG_IOSCHED_NOOP=y
209CONFIG_IOSCHED_AS=y 214CONFIG_IOSCHED_AS=y
210CONFIG_IOSCHED_DEADLINE=y 215CONFIG_IOSCHED_DEADLINE=y
211CONFIG_IOSCHED_CFQ=y 216CONFIG_IOSCHED_CFQ=y
217# CONFIG_ATA_OVER_ETH is not set
212 218
213# 219#
214# ATA/ATAPI/MFM/RLL support 220# ATA/ATAPI/MFM/RLL support
@@ -283,6 +289,7 @@ CONFIG_CHR_DEV_ST=m
283CONFIG_BLK_DEV_SR=m 289CONFIG_BLK_DEV_SR=m
284# CONFIG_BLK_DEV_SR_VENDOR is not set 290# CONFIG_BLK_DEV_SR_VENDOR is not set
285CONFIG_CHR_DEV_SG=m 291CONFIG_CHR_DEV_SG=m
292# CONFIG_CHR_DEV_SCH is not set
286 293
287# 294#
288# Some SCSI devices (e.g. CD jukebox) support multiple LUNs 295# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
@@ -310,13 +317,21 @@ CONFIG_SCSI_FC_ATTRS=y
310# CONFIG_SCSI_AIC79XX is not set 317# CONFIG_SCSI_AIC79XX is not set
311# CONFIG_MEGARAID_NEWGEN is not set 318# CONFIG_MEGARAID_NEWGEN is not set
312# CONFIG_MEGARAID_LEGACY is not set 319# CONFIG_MEGARAID_LEGACY is not set
313# CONFIG_SCSI_SATA is not set 320CONFIG_SCSI_SATA=y
314# CONFIG_SCSI_BUSLOGIC is not set 321# CONFIG_SCSI_SATA_AHCI is not set
322# CONFIG_SCSI_SATA_SVW is not set
323# CONFIG_SCSI_ATA_PIIX is not set
324# CONFIG_SCSI_SATA_NV is not set
325# CONFIG_SCSI_SATA_PROMISE is not set
326# CONFIG_SCSI_SATA_QSTOR is not set
327# CONFIG_SCSI_SATA_SX4 is not set
328# CONFIG_SCSI_SATA_SIL is not set
329# CONFIG_SCSI_SATA_SIS is not set
330# CONFIG_SCSI_SATA_ULI is not set
331# CONFIG_SCSI_SATA_VIA is not set
332CONFIG_SCSI_SATA_VITESSE=y
315# CONFIG_SCSI_DMX3191D is not set 333# CONFIG_SCSI_DMX3191D is not set
316# CONFIG_SCSI_EATA is not set
317# CONFIG_SCSI_EATA_PIO is not set
318# CONFIG_SCSI_FUTURE_DOMAIN is not set 334# CONFIG_SCSI_FUTURE_DOMAIN is not set
319# CONFIG_SCSI_GDTH is not set
320# CONFIG_SCSI_IPS is not set 335# CONFIG_SCSI_IPS is not set
321# CONFIG_SCSI_INITIO is not set 336# CONFIG_SCSI_INITIO is not set
322# CONFIG_SCSI_INIA100 is not set 337# CONFIG_SCSI_INIA100 is not set
@@ -326,7 +341,6 @@ CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
326CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 341CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
327# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set 342# CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set
328# CONFIG_SCSI_IPR is not set 343# CONFIG_SCSI_IPR is not set
329# CONFIG_SCSI_QLOGIC_ISP is not set
330CONFIG_SCSI_QLOGIC_FC=y 344CONFIG_SCSI_QLOGIC_FC=y
331# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set 345# CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set
332CONFIG_SCSI_QLOGIC_1280=y 346CONFIG_SCSI_QLOGIC_1280=y
@@ -337,6 +351,7 @@ CONFIG_SCSI_QLA22XX=m
337CONFIG_SCSI_QLA2300=m 351CONFIG_SCSI_QLA2300=m
338CONFIG_SCSI_QLA2322=m 352CONFIG_SCSI_QLA2322=m
339# CONFIG_SCSI_QLA6312 is not set 353# CONFIG_SCSI_QLA6312 is not set
354# CONFIG_SCSI_LPFC is not set
340# CONFIG_SCSI_DC395x is not set 355# CONFIG_SCSI_DC395x is not set
341# CONFIG_SCSI_DC390T is not set 356# CONFIG_SCSI_DC390T is not set
342# CONFIG_SCSI_DEBUG is not set 357# CONFIG_SCSI_DEBUG is not set
@@ -359,12 +374,16 @@ CONFIG_DM_CRYPT=m
359CONFIG_DM_SNAPSHOT=m 374CONFIG_DM_SNAPSHOT=m
360CONFIG_DM_MIRROR=m 375CONFIG_DM_MIRROR=m
361CONFIG_DM_ZERO=m 376CONFIG_DM_ZERO=m
377CONFIG_DM_MULTIPATH=m
378# CONFIG_DM_MULTIPATH_EMC is not set
362 379
363# 380#
364# Fusion MPT device support 381# Fusion MPT device support
365# 382#
366CONFIG_FUSION=y 383CONFIG_FUSION=y
367CONFIG_FUSION_MAX_SGE=40 384CONFIG_FUSION_SPI=y
385CONFIG_FUSION_FC=m
386CONFIG_FUSION_MAX_SGE=128
368# CONFIG_FUSION_CTL is not set 387# CONFIG_FUSION_CTL is not set
369 388
370# 389#
@@ -387,7 +406,6 @@ CONFIG_NET=y
387# 406#
388CONFIG_PACKET=y 407CONFIG_PACKET=y
389# CONFIG_PACKET_MMAP is not set 408# CONFIG_PACKET_MMAP is not set
390CONFIG_NETLINK_DEV=y
391CONFIG_UNIX=y 409CONFIG_UNIX=y
392# CONFIG_NET_KEY is not set 410# CONFIG_NET_KEY is not set
393CONFIG_INET=y 411CONFIG_INET=y
@@ -447,7 +465,6 @@ CONFIG_DUMMY=m
447# CONFIG_BONDING is not set 465# CONFIG_BONDING is not set
448# CONFIG_EQUALIZER is not set 466# CONFIG_EQUALIZER is not set
449# CONFIG_TUN is not set 467# CONFIG_TUN is not set
450# CONFIG_ETHERTAP is not set
451 468
452# 469#
453# ARCnet devices 470# ARCnet devices
@@ -484,9 +501,7 @@ CONFIG_NET_PCI=y
484# CONFIG_FORCEDETH is not set 501# CONFIG_FORCEDETH is not set
485# CONFIG_DGRS is not set 502# CONFIG_DGRS is not set
486CONFIG_EEPRO100=m 503CONFIG_EEPRO100=m
487# CONFIG_EEPRO100_PIO is not set
488CONFIG_E100=m 504CONFIG_E100=m
489# CONFIG_E100_NAPI is not set
490# CONFIG_FEALNX is not set 505# CONFIG_FEALNX is not set
491# CONFIG_NATSEMI is not set 506# CONFIG_NATSEMI is not set
492# CONFIG_NE2K_PCI is not set 507# CONFIG_NE2K_PCI is not set
@@ -508,9 +523,11 @@ CONFIG_E1000=y
508# CONFIG_HAMACHI is not set 523# CONFIG_HAMACHI is not set
509# CONFIG_YELLOWFIN is not set 524# CONFIG_YELLOWFIN is not set
510# CONFIG_R8169 is not set 525# CONFIG_R8169 is not set
526# CONFIG_SKGE is not set
511# CONFIG_SK98LIN is not set 527# CONFIG_SK98LIN is not set
512# CONFIG_VIA_VELOCITY is not set 528# CONFIG_VIA_VELOCITY is not set
513CONFIG_TIGON3=y 529CONFIG_TIGON3=y
530# CONFIG_BNX2 is not set
514 531
515# 532#
516# Ethernet (10000 Mbit) 533# Ethernet (10000 Mbit)
@@ -568,25 +585,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
568# CONFIG_INPUT_EVBUG is not set 585# CONFIG_INPUT_EVBUG is not set
569 586
570# 587#
571# Input I/O drivers
572#
573CONFIG_GAMEPORT=m
574CONFIG_SOUND_GAMEPORT=m
575# CONFIG_GAMEPORT_NS558 is not set
576# CONFIG_GAMEPORT_L4 is not set
577# CONFIG_GAMEPORT_EMU10K1 is not set
578# CONFIG_GAMEPORT_VORTEX is not set
579# CONFIG_GAMEPORT_FM801 is not set
580# CONFIG_GAMEPORT_CS461x is not set
581CONFIG_SERIO=y
582CONFIG_SERIO_I8042=y
583# CONFIG_SERIO_SERPORT is not set
584# CONFIG_SERIO_CT82C710 is not set
585# CONFIG_SERIO_PCIPS2 is not set
586CONFIG_SERIO_LIBPS2=y
587# CONFIG_SERIO_RAW is not set
588
589#
590# Input Device Drivers 588# Input Device Drivers
591# 589#
592CONFIG_INPUT_KEYBOARD=y 590CONFIG_INPUT_KEYBOARD=y
@@ -604,6 +602,23 @@ CONFIG_MOUSE_PS2=y
604# CONFIG_INPUT_MISC is not set 602# CONFIG_INPUT_MISC is not set
605 603
606# 604#
605# Hardware I/O ports
606#
607CONFIG_SERIO=y
608CONFIG_SERIO_I8042=y
609# CONFIG_SERIO_SERPORT is not set
610# CONFIG_SERIO_PCIPS2 is not set
611CONFIG_SERIO_LIBPS2=y
612# CONFIG_SERIO_RAW is not set
613CONFIG_GAMEPORT=m
614# CONFIG_GAMEPORT_NS558 is not set
615# CONFIG_GAMEPORT_L4 is not set
616# CONFIG_GAMEPORT_EMU10K1 is not set
617# CONFIG_GAMEPORT_VORTEX is not set
618# CONFIG_GAMEPORT_FM801 is not set
619# CONFIG_GAMEPORT_CS461X is not set
620
621#
607# Character devices 622# Character devices
608# 623#
609CONFIG_VT=y 624CONFIG_VT=y
@@ -613,11 +628,15 @@ CONFIG_SERIAL_NONSTANDARD=y
613# CONFIG_ROCKETPORT is not set 628# CONFIG_ROCKETPORT is not set
614# CONFIG_CYCLADES is not set 629# CONFIG_CYCLADES is not set
615# CONFIG_MOXA_SMARTIO is not set 630# CONFIG_MOXA_SMARTIO is not set
616# CONFIG_SYNCLINK is not set 631# CONFIG_ISI is not set
617# CONFIG_SYNCLINKMP is not set 632# CONFIG_SYNCLINKMP is not set
618# CONFIG_N_HDLC is not set 633# CONFIG_N_HDLC is not set
634# CONFIG_SPECIALIX is not set
635# CONFIG_SX is not set
619# CONFIG_STALDRV is not set 636# CONFIG_STALDRV is not set
620CONFIG_SGI_SNSC=y 637CONFIG_SGI_SNSC=y
638CONFIG_SGI_TIOCX=y
639CONFIG_SGI_MBCS=m
621 640
622# 641#
623# Serial drivers 642# Serial drivers
@@ -638,6 +657,8 @@ CONFIG_SERIAL_8250_SHARE_IRQ=y
638CONFIG_SERIAL_CORE=y 657CONFIG_SERIAL_CORE=y
639CONFIG_SERIAL_CORE_CONSOLE=y 658CONFIG_SERIAL_CORE_CONSOLE=y
640CONFIG_SERIAL_SGI_L1_CONSOLE=y 659CONFIG_SERIAL_SGI_L1_CONSOLE=y
660CONFIG_SERIAL_SGI_IOC4=y
661# CONFIG_SERIAL_JSM is not set
641CONFIG_UNIX98_PTYS=y 662CONFIG_UNIX98_PTYS=y
642CONFIG_LEGACY_PTYS=y 663CONFIG_LEGACY_PTYS=y
643CONFIG_LEGACY_PTY_COUNT=256 664CONFIG_LEGACY_PTY_COUNT=256
@@ -663,6 +684,7 @@ CONFIG_EFI_RTC=y
663CONFIG_AGP=m 684CONFIG_AGP=m
664CONFIG_AGP_I460=m 685CONFIG_AGP_I460=m
665CONFIG_AGP_HP_ZX1=m 686CONFIG_AGP_HP_ZX1=m
687CONFIG_AGP_SGI_TIOCA=m
666CONFIG_DRM=m 688CONFIG_DRM=m
667CONFIG_DRM_TDFX=m 689CONFIG_DRM_TDFX=m
668CONFIG_DRM_R128=m 690CONFIG_DRM_R128=m
@@ -674,9 +696,15 @@ CONFIG_HPET=y
674# CONFIG_HPET_RTC_IRQ is not set 696# CONFIG_HPET_RTC_IRQ is not set
675CONFIG_HPET_MMAP=y 697CONFIG_HPET_MMAP=y
676CONFIG_MAX_RAW_DEVS=256 698CONFIG_MAX_RAW_DEVS=256
699# CONFIG_HANGCHECK_TIMER is not set
677CONFIG_MMTIMER=y 700CONFIG_MMTIMER=y
678 701
679# 702#
703# TPM devices
704#
705# CONFIG_TCG_TPM is not set
706
707#
680# I2C support 708# I2C support
681# 709#
682# CONFIG_I2C is not set 710# CONFIG_I2C is not set
@@ -760,6 +788,8 @@ CONFIG_SND_CS46XX=m
760CONFIG_SND_CS46XX_NEW_DSP=y 788CONFIG_SND_CS46XX_NEW_DSP=y
761CONFIG_SND_CS4281=m 789CONFIG_SND_CS4281=m
762CONFIG_SND_EMU10K1=m 790CONFIG_SND_EMU10K1=m
791# CONFIG_SND_EMU10K1X is not set
792# CONFIG_SND_CA0106 is not set
763# CONFIG_SND_KORG1212 is not set 793# CONFIG_SND_KORG1212 is not set
764# CONFIG_SND_MIXART is not set 794# CONFIG_SND_MIXART is not set
765# CONFIG_SND_NM256 is not set 795# CONFIG_SND_NM256 is not set
@@ -784,13 +814,14 @@ CONFIG_SND_FM801=m
784# CONFIG_SND_INTEL8X0M is not set 814# CONFIG_SND_INTEL8X0M is not set
785# CONFIG_SND_SONICVIBES is not set 815# CONFIG_SND_SONICVIBES is not set
786# CONFIG_SND_VIA82XX is not set 816# CONFIG_SND_VIA82XX is not set
817# CONFIG_SND_VIA82XX_MODEM is not set
787# CONFIG_SND_VX222 is not set 818# CONFIG_SND_VX222 is not set
819# CONFIG_SND_HDA_INTEL is not set
788 820
789# 821#
790# USB devices 822# USB devices
791# 823#
792# CONFIG_SND_USB_AUDIO is not set 824# CONFIG_SND_USB_AUDIO is not set
793# CONFIG_SND_USB_USX2Y is not set
794 825
795# 826#
796# Open Sound System 827# Open Sound System
@@ -800,6 +831,8 @@ CONFIG_SND_FM801=m
800# 831#
801# USB support 832# USB support
802# 833#
834CONFIG_USB_ARCH_HAS_HCD=y
835CONFIG_USB_ARCH_HAS_OHCI=y
803CONFIG_USB=m 836CONFIG_USB=m
804# CONFIG_USB_DEBUG is not set 837# CONFIG_USB_DEBUG is not set
805 838
@@ -811,8 +844,6 @@ CONFIG_USB_DEVICEFS=y
811# CONFIG_USB_DYNAMIC_MINORS is not set 844# CONFIG_USB_DYNAMIC_MINORS is not set
812# CONFIG_USB_SUSPEND is not set 845# CONFIG_USB_SUSPEND is not set
813# CONFIG_USB_OTG is not set 846# CONFIG_USB_OTG is not set
814CONFIG_USB_ARCH_HAS_HCD=y
815CONFIG_USB_ARCH_HAS_OHCI=y
816 847
817# 848#
818# USB Host Controller Drivers 849# USB Host Controller Drivers
@@ -821,6 +852,8 @@ CONFIG_USB_EHCI_HCD=m
821# CONFIG_USB_EHCI_SPLIT_ISO is not set 852# CONFIG_USB_EHCI_SPLIT_ISO is not set
822# CONFIG_USB_EHCI_ROOT_HUB_TT is not set 853# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
823CONFIG_USB_OHCI_HCD=m 854CONFIG_USB_OHCI_HCD=m
855# CONFIG_USB_OHCI_BIG_ENDIAN is not set
856CONFIG_USB_OHCI_LITTLE_ENDIAN=y
824CONFIG_USB_UHCI_HCD=m 857CONFIG_USB_UHCI_HCD=m
825# CONFIG_USB_SL811_HCD is not set 858# CONFIG_USB_SL811_HCD is not set
826 859
@@ -838,12 +871,11 @@ CONFIG_USB_UHCI_HCD=m
838# 871#
839CONFIG_USB_STORAGE=m 872CONFIG_USB_STORAGE=m
840# CONFIG_USB_STORAGE_DEBUG is not set 873# CONFIG_USB_STORAGE_DEBUG is not set
841# CONFIG_USB_STORAGE_RW_DETECT is not set
842# CONFIG_USB_STORAGE_DATAFAB is not set 874# CONFIG_USB_STORAGE_DATAFAB is not set
843# CONFIG_USB_STORAGE_FREECOM is not set 875# CONFIG_USB_STORAGE_FREECOM is not set
844# CONFIG_USB_STORAGE_ISD200 is not set 876# CONFIG_USB_STORAGE_ISD200 is not set
845# CONFIG_USB_STORAGE_DPCM is not set 877# CONFIG_USB_STORAGE_DPCM is not set
846# CONFIG_USB_STORAGE_HP8200e is not set 878# CONFIG_USB_STORAGE_USBAT is not set
847# CONFIG_USB_STORAGE_SDDR09 is not set 879# CONFIG_USB_STORAGE_SDDR09 is not set
848# CONFIG_USB_STORAGE_SDDR55 is not set 880# CONFIG_USB_STORAGE_SDDR55 is not set
849# CONFIG_USB_STORAGE_JUMPSHOT is not set 881# CONFIG_USB_STORAGE_JUMPSHOT is not set
@@ -893,6 +925,7 @@ CONFIG_USB_HIDINPUT=y
893# CONFIG_USB_PEGASUS is not set 925# CONFIG_USB_PEGASUS is not set
894# CONFIG_USB_RTL8150 is not set 926# CONFIG_USB_RTL8150 is not set
895# CONFIG_USB_USBNET is not set 927# CONFIG_USB_USBNET is not set
928CONFIG_USB_MON=m
896 929
897# 930#
898# USB port drivers 931# USB port drivers
@@ -908,7 +941,6 @@ CONFIG_USB_HIDINPUT=y
908# 941#
909# CONFIG_USB_EMI62 is not set 942# CONFIG_USB_EMI62 is not set
910# CONFIG_USB_EMI26 is not set 943# CONFIG_USB_EMI26 is not set
911# CONFIG_USB_TIGL is not set
912# CONFIG_USB_AUERSWALD is not set 944# CONFIG_USB_AUERSWALD is not set
913# CONFIG_USB_RIO500 is not set 945# CONFIG_USB_RIO500 is not set
914# CONFIG_USB_LEGOTOWER is not set 946# CONFIG_USB_LEGOTOWER is not set
@@ -917,6 +949,8 @@ CONFIG_USB_HIDINPUT=y
917# CONFIG_USB_CYTHERM is not set 949# CONFIG_USB_CYTHERM is not set
918# CONFIG_USB_PHIDGETKIT is not set 950# CONFIG_USB_PHIDGETKIT is not set
919# CONFIG_USB_PHIDGETSERVO is not set 951# CONFIG_USB_PHIDGETSERVO is not set
952# CONFIG_USB_IDMOUSE is not set
953# CONFIG_USB_SISUSBVGA is not set
920# CONFIG_USB_TEST is not set 954# CONFIG_USB_TEST is not set
921 955
922# 956#
@@ -943,6 +977,11 @@ CONFIG_INFINIBAND_IPOIB=m
943# CONFIG_INFINIBAND_IPOIB_DEBUG is not set 977# CONFIG_INFINIBAND_IPOIB_DEBUG is not set
944 978
945# 979#
980# SN Devices
981#
982CONFIG_SGI_IOC4=y
983
984#
946# File systems 985# File systems
947# 986#
948CONFIG_EXT2_FS=y 987CONFIG_EXT2_FS=y
@@ -964,7 +1003,12 @@ CONFIG_REISERFS_FS_POSIX_ACL=y
964CONFIG_REISERFS_FS_SECURITY=y 1003CONFIG_REISERFS_FS_SECURITY=y
965# CONFIG_JFS_FS is not set 1004# CONFIG_JFS_FS is not set
966CONFIG_FS_POSIX_ACL=y 1005CONFIG_FS_POSIX_ACL=y
1006
1007#
1008# XFS support
1009#
967CONFIG_XFS_FS=y 1010CONFIG_XFS_FS=y
1011CONFIG_XFS_EXPORT=y
968# CONFIG_XFS_RT is not set 1012# CONFIG_XFS_RT is not set
969# CONFIG_XFS_QUOTA is not set 1013# CONFIG_XFS_QUOTA is not set
970# CONFIG_XFS_SECURITY is not set 1014# CONFIG_XFS_SECURITY is not set
@@ -1042,7 +1086,7 @@ CONFIG_NFSD_V4=y
1042CONFIG_NFSD_TCP=y 1086CONFIG_NFSD_TCP=y
1043CONFIG_LOCKD=m 1087CONFIG_LOCKD=m
1044CONFIG_LOCKD_V4=y 1088CONFIG_LOCKD_V4=y
1045CONFIG_EXPORTFS=m 1089CONFIG_EXPORTFS=y
1046CONFIG_SUNRPC=m 1090CONFIG_SUNRPC=m
1047CONFIG_SUNRPC_GSS=m 1091CONFIG_SUNRPC_GSS=m
1048CONFIG_RPCSEC_GSS_KRB5=m 1092CONFIG_RPCSEC_GSS_KRB5=m
@@ -1128,6 +1172,8 @@ CONFIG_NLS_UTF8=m
1128# CONFIG_CRC_CCITT is not set 1172# CONFIG_CRC_CCITT is not set
1129CONFIG_CRC32=y 1173CONFIG_CRC32=y
1130# CONFIG_LIBCRC32C is not set 1174# CONFIG_LIBCRC32C is not set
1175CONFIG_GENERIC_HARDIRQS=y
1176CONFIG_GENERIC_IRQ_PROBE=y
1131 1177
1132# 1178#
1133# HP Simulator drivers 1179# HP Simulator drivers
@@ -1144,14 +1190,17 @@ CONFIG_CRC32=y
1144# 1190#
1145# Kernel hacking 1191# Kernel hacking
1146# 1192#
1193# CONFIG_PRINTK_TIME is not set
1147CONFIG_DEBUG_KERNEL=y 1194CONFIG_DEBUG_KERNEL=y
1148CONFIG_MAGIC_SYSRQ=y 1195CONFIG_MAGIC_SYSRQ=y
1196CONFIG_LOG_BUF_SHIFT=20
1149# CONFIG_SCHEDSTATS is not set 1197# CONFIG_SCHEDSTATS is not set
1150# CONFIG_DEBUG_SLAB is not set 1198# CONFIG_DEBUG_SLAB is not set
1151# CONFIG_DEBUG_SPINLOCK is not set 1199# CONFIG_DEBUG_SPINLOCK is not set
1152# CONFIG_DEBUG_SPINLOCK_SLEEP is not set 1200# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
1153# CONFIG_DEBUG_KOBJECT is not set 1201# CONFIG_DEBUG_KOBJECT is not set
1154# CONFIG_DEBUG_INFO is not set 1202# CONFIG_DEBUG_INFO is not set
1203# CONFIG_DEBUG_FS is not set
1155CONFIG_IA64_GRANULE_16MB=y 1204CONFIG_IA64_GRANULE_16MB=y
1156# CONFIG_IA64_GRANULE_64MB is not set 1205# CONFIG_IA64_GRANULE_64MB is not set
1157# CONFIG_IA64_PRINT_HAZARDS is not set 1206# CONFIG_IA64_PRINT_HAZARDS is not set
@@ -1178,6 +1227,7 @@ CONFIG_CRYPTO_MD5=m
1178# CONFIG_CRYPTO_SHA256 is not set 1227# CONFIG_CRYPTO_SHA256 is not set
1179# CONFIG_CRYPTO_SHA512 is not set 1228# CONFIG_CRYPTO_SHA512 is not set
1180# CONFIG_CRYPTO_WP512 is not set 1229# CONFIG_CRYPTO_WP512 is not set
1230# CONFIG_CRYPTO_TGR192 is not set
1181CONFIG_CRYPTO_DES=m 1231CONFIG_CRYPTO_DES=m
1182# CONFIG_CRYPTO_BLOWFISH is not set 1232# CONFIG_CRYPTO_BLOWFISH is not set
1183# CONFIG_CRYPTO_TWOFISH is not set 1233# CONFIG_CRYPTO_TWOFISH is not set
diff --git a/arch/ia64/ia32/ia32priv.h b/arch/ia64/ia32/ia32priv.h
index b2de948bdaea..e3e9290e3ff2 100644
--- a/arch/ia64/ia32/ia32priv.h
+++ b/arch/ia64/ia32/ia32priv.h
@@ -241,7 +241,7 @@ typedef struct compat_siginfo {
241 241
242 /* POSIX.1b timers */ 242 /* POSIX.1b timers */
243 struct { 243 struct {
244 timer_t _tid; /* timer id */ 244 compat_timer_t _tid; /* timer id */
245 int _overrun; /* overrun count */ 245 int _overrun; /* overrun count */
246 char _pad[sizeof(unsigned int) - sizeof(int)]; 246 char _pad[sizeof(unsigned int) - sizeof(int)];
247 compat_sigval_t _sigval; /* same as below */ 247 compat_sigval_t _sigval; /* same as below */
diff --git a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile
index c1a02bbc252c..b2e2f6509eb0 100644
--- a/arch/ia64/kernel/Makefile
+++ b/arch/ia64/kernel/Makefile
@@ -20,6 +20,8 @@ obj-$(CONFIG_SMP) += smp.o smpboot.o domain.o
20obj-$(CONFIG_PERFMON) += perfmon_default_smpl.o 20obj-$(CONFIG_PERFMON) += perfmon_default_smpl.o
21obj-$(CONFIG_IA64_CYCLONE) += cyclone.o 21obj-$(CONFIG_IA64_CYCLONE) += cyclone.o
22obj-$(CONFIG_IA64_MCA_RECOVERY) += mca_recovery.o 22obj-$(CONFIG_IA64_MCA_RECOVERY) += mca_recovery.o
23obj-$(CONFIG_KPROBES) += kprobes.o jprobes.o
24obj-$(CONFIG_IA64_UNCACHED_ALLOCATOR) += uncached.o
23mca_recovery-y += mca_drv.o mca_drv_asm.o 25mca_recovery-y += mca_drv.o mca_drv_asm.o
24 26
25# The gate DSO image is built using a special linker script. 27# The gate DSO image is built using a special linker script.
diff --git a/arch/ia64/kernel/domain.c b/arch/ia64/kernel/domain.c
index fe532c970438..d65e87b6394f 100644
--- a/arch/ia64/kernel/domain.c
+++ b/arch/ia64/kernel/domain.c
@@ -14,7 +14,7 @@
14#include <linux/topology.h> 14#include <linux/topology.h>
15#include <linux/nodemask.h> 15#include <linux/nodemask.h>
16 16
17#define SD_NODES_PER_DOMAIN 6 17#define SD_NODES_PER_DOMAIN 16
18 18
19#ifdef CONFIG_NUMA 19#ifdef CONFIG_NUMA
20/** 20/**
@@ -27,7 +27,7 @@
27 * 27 *
28 * Should use nodemask_t. 28 * Should use nodemask_t.
29 */ 29 */
30static int __devinit find_next_best_node(int node, unsigned long *used_nodes) 30static int find_next_best_node(int node, unsigned long *used_nodes)
31{ 31{
32 int i, n, val, min_val, best_node = 0; 32 int i, n, val, min_val, best_node = 0;
33 33
@@ -66,7 +66,7 @@ static int __devinit find_next_best_node(int node, unsigned long *used_nodes)
66 * should be one that prevents unnecessary balancing, but also spreads tasks 66 * should be one that prevents unnecessary balancing, but also spreads tasks
67 * out optimally. 67 * out optimally.
68 */ 68 */
69static cpumask_t __devinit sched_domain_node_span(int node) 69static cpumask_t sched_domain_node_span(int node)
70{ 70{
71 int i; 71 int i;
72 cpumask_t span, nodemask; 72 cpumask_t span, nodemask;
@@ -96,7 +96,7 @@ static cpumask_t __devinit sched_domain_node_span(int node)
96#ifdef CONFIG_SCHED_SMT 96#ifdef CONFIG_SCHED_SMT
97static DEFINE_PER_CPU(struct sched_domain, cpu_domains); 97static DEFINE_PER_CPU(struct sched_domain, cpu_domains);
98static struct sched_group sched_group_cpus[NR_CPUS]; 98static struct sched_group sched_group_cpus[NR_CPUS];
99static int __devinit cpu_to_cpu_group(int cpu) 99static int cpu_to_cpu_group(int cpu)
100{ 100{
101 return cpu; 101 return cpu;
102} 102}
@@ -104,7 +104,7 @@ static int __devinit cpu_to_cpu_group(int cpu)
104 104
105static DEFINE_PER_CPU(struct sched_domain, phys_domains); 105static DEFINE_PER_CPU(struct sched_domain, phys_domains);
106static struct sched_group sched_group_phys[NR_CPUS]; 106static struct sched_group sched_group_phys[NR_CPUS];
107static int __devinit cpu_to_phys_group(int cpu) 107static int cpu_to_phys_group(int cpu)
108{ 108{
109#ifdef CONFIG_SCHED_SMT 109#ifdef CONFIG_SCHED_SMT
110 return first_cpu(cpu_sibling_map[cpu]); 110 return first_cpu(cpu_sibling_map[cpu]);
@@ -125,44 +125,36 @@ static struct sched_group *sched_group_nodes[MAX_NUMNODES];
125static DEFINE_PER_CPU(struct sched_domain, allnodes_domains); 125static DEFINE_PER_CPU(struct sched_domain, allnodes_domains);
126static struct sched_group sched_group_allnodes[MAX_NUMNODES]; 126static struct sched_group sched_group_allnodes[MAX_NUMNODES];
127 127
128static int __devinit cpu_to_allnodes_group(int cpu) 128static int cpu_to_allnodes_group(int cpu)
129{ 129{
130 return cpu_to_node(cpu); 130 return cpu_to_node(cpu);
131} 131}
132#endif 132#endif
133 133
134/* 134/*
135 * Set up scheduler domains and groups. Callers must hold the hotplug lock. 135 * Build sched domains for a given set of cpus and attach the sched domains
136 * to the individual cpus
136 */ 137 */
137void __devinit arch_init_sched_domains(void) 138void build_sched_domains(const cpumask_t *cpu_map)
138{ 139{
139 int i; 140 int i;
140 cpumask_t cpu_default_map;
141 141
142 /* 142 /*
143 * Setup mask for cpus without special case scheduling requirements. 143 * Set up domains for cpus specified by the cpu_map.
144 * For now this just excludes isolated cpus, but could be used to
145 * exclude other special cases in the future.
146 */ 144 */
147 cpus_complement(cpu_default_map, cpu_isolated_map); 145 for_each_cpu_mask(i, *cpu_map) {
148 cpus_and(cpu_default_map, cpu_default_map, cpu_online_map);
149
150 /*
151 * Set up domains. Isolated domains just stay on the dummy domain.
152 */
153 for_each_cpu_mask(i, cpu_default_map) {
154 int group; 146 int group;
155 struct sched_domain *sd = NULL, *p; 147 struct sched_domain *sd = NULL, *p;
156 cpumask_t nodemask = node_to_cpumask(cpu_to_node(i)); 148 cpumask_t nodemask = node_to_cpumask(cpu_to_node(i));
157 149
158 cpus_and(nodemask, nodemask, cpu_default_map); 150 cpus_and(nodemask, nodemask, *cpu_map);
159 151
160#ifdef CONFIG_NUMA 152#ifdef CONFIG_NUMA
161 if (num_online_cpus() 153 if (num_online_cpus()
162 > SD_NODES_PER_DOMAIN*cpus_weight(nodemask)) { 154 > SD_NODES_PER_DOMAIN*cpus_weight(nodemask)) {
163 sd = &per_cpu(allnodes_domains, i); 155 sd = &per_cpu(allnodes_domains, i);
164 *sd = SD_ALLNODES_INIT; 156 *sd = SD_ALLNODES_INIT;
165 sd->span = cpu_default_map; 157 sd->span = *cpu_map;
166 group = cpu_to_allnodes_group(i); 158 group = cpu_to_allnodes_group(i);
167 sd->groups = &sched_group_allnodes[group]; 159 sd->groups = &sched_group_allnodes[group];
168 p = sd; 160 p = sd;
@@ -173,7 +165,7 @@ void __devinit arch_init_sched_domains(void)
173 *sd = SD_NODE_INIT; 165 *sd = SD_NODE_INIT;
174 sd->span = sched_domain_node_span(cpu_to_node(i)); 166 sd->span = sched_domain_node_span(cpu_to_node(i));
175 sd->parent = p; 167 sd->parent = p;
176 cpus_and(sd->span, sd->span, cpu_default_map); 168 cpus_and(sd->span, sd->span, *cpu_map);
177#endif 169#endif
178 170
179 p = sd; 171 p = sd;
@@ -190,7 +182,7 @@ void __devinit arch_init_sched_domains(void)
190 group = cpu_to_cpu_group(i); 182 group = cpu_to_cpu_group(i);
191 *sd = SD_SIBLING_INIT; 183 *sd = SD_SIBLING_INIT;
192 sd->span = cpu_sibling_map[i]; 184 sd->span = cpu_sibling_map[i];
193 cpus_and(sd->span, sd->span, cpu_default_map); 185 cpus_and(sd->span, sd->span, *cpu_map);
194 sd->parent = p; 186 sd->parent = p;
195 sd->groups = &sched_group_cpus[group]; 187 sd->groups = &sched_group_cpus[group];
196#endif 188#endif
@@ -198,9 +190,9 @@ void __devinit arch_init_sched_domains(void)
198 190
199#ifdef CONFIG_SCHED_SMT 191#ifdef CONFIG_SCHED_SMT
200 /* Set up CPU (sibling) groups */ 192 /* Set up CPU (sibling) groups */
201 for_each_cpu_mask(i, cpu_default_map) { 193 for_each_cpu_mask(i, *cpu_map) {
202 cpumask_t this_sibling_map = cpu_sibling_map[i]; 194 cpumask_t this_sibling_map = cpu_sibling_map[i];
203 cpus_and(this_sibling_map, this_sibling_map, cpu_default_map); 195 cpus_and(this_sibling_map, this_sibling_map, *cpu_map);
204 if (i != first_cpu(this_sibling_map)) 196 if (i != first_cpu(this_sibling_map))
205 continue; 197 continue;
206 198
@@ -213,7 +205,7 @@ void __devinit arch_init_sched_domains(void)
213 for (i = 0; i < MAX_NUMNODES; i++) { 205 for (i = 0; i < MAX_NUMNODES; i++) {
214 cpumask_t nodemask = node_to_cpumask(i); 206 cpumask_t nodemask = node_to_cpumask(i);
215 207
216 cpus_and(nodemask, nodemask, cpu_default_map); 208 cpus_and(nodemask, nodemask, *cpu_map);
217 if (cpus_empty(nodemask)) 209 if (cpus_empty(nodemask))
218 continue; 210 continue;
219 211
@@ -222,7 +214,7 @@ void __devinit arch_init_sched_domains(void)
222 } 214 }
223 215
224#ifdef CONFIG_NUMA 216#ifdef CONFIG_NUMA
225 init_sched_build_groups(sched_group_allnodes, cpu_default_map, 217 init_sched_build_groups(sched_group_allnodes, *cpu_map,
226 &cpu_to_allnodes_group); 218 &cpu_to_allnodes_group);
227 219
228 for (i = 0; i < MAX_NUMNODES; i++) { 220 for (i = 0; i < MAX_NUMNODES; i++) {
@@ -233,12 +225,12 @@ void __devinit arch_init_sched_domains(void)
233 cpumask_t covered = CPU_MASK_NONE; 225 cpumask_t covered = CPU_MASK_NONE;
234 int j; 226 int j;
235 227
236 cpus_and(nodemask, nodemask, cpu_default_map); 228 cpus_and(nodemask, nodemask, *cpu_map);
237 if (cpus_empty(nodemask)) 229 if (cpus_empty(nodemask))
238 continue; 230 continue;
239 231
240 domainspan = sched_domain_node_span(i); 232 domainspan = sched_domain_node_span(i);
241 cpus_and(domainspan, domainspan, cpu_default_map); 233 cpus_and(domainspan, domainspan, *cpu_map);
242 234
243 sg = kmalloc(sizeof(struct sched_group), GFP_KERNEL); 235 sg = kmalloc(sizeof(struct sched_group), GFP_KERNEL);
244 sched_group_nodes[i] = sg; 236 sched_group_nodes[i] = sg;
@@ -266,7 +258,7 @@ void __devinit arch_init_sched_domains(void)
266 int n = (i + j) % MAX_NUMNODES; 258 int n = (i + j) % MAX_NUMNODES;
267 259
268 cpus_complement(notcovered, covered); 260 cpus_complement(notcovered, covered);
269 cpus_and(tmp, notcovered, cpu_default_map); 261 cpus_and(tmp, notcovered, *cpu_map);
270 cpus_and(tmp, tmp, domainspan); 262 cpus_and(tmp, tmp, domainspan);
271 if (cpus_empty(tmp)) 263 if (cpus_empty(tmp))
272 break; 264 break;
@@ -293,7 +285,7 @@ void __devinit arch_init_sched_domains(void)
293#endif 285#endif
294 286
295 /* Calculate CPU power for physical packages and nodes */ 287 /* Calculate CPU power for physical packages and nodes */
296 for_each_cpu_mask(i, cpu_default_map) { 288 for_each_cpu_mask(i, *cpu_map) {
297 int power; 289 int power;
298 struct sched_domain *sd; 290 struct sched_domain *sd;
299#ifdef CONFIG_SCHED_SMT 291#ifdef CONFIG_SCHED_SMT
@@ -359,13 +351,35 @@ next_sg:
359 cpu_attach_domain(sd, i); 351 cpu_attach_domain(sd, i);
360 } 352 }
361} 353}
354/*
355 * Set up scheduler domains and groups. Callers must hold the hotplug lock.
356 */
357void arch_init_sched_domains(const cpumask_t *cpu_map)
358{
359 cpumask_t cpu_default_map;
360
361 /*
362 * Setup mask for cpus without special case scheduling requirements.
363 * For now this just excludes isolated cpus, but could be used to
364 * exclude other special cases in the future.
365 */
366 cpus_andnot(cpu_default_map, *cpu_map, cpu_isolated_map);
367
368 build_sched_domains(&cpu_default_map);
369}
362 370
363void __devinit arch_destroy_sched_domains(void) 371void arch_destroy_sched_domains(const cpumask_t *cpu_map)
364{ 372{
365#ifdef CONFIG_NUMA 373#ifdef CONFIG_NUMA
366 int i; 374 int i;
367 for (i = 0; i < MAX_NUMNODES; i++) { 375 for (i = 0; i < MAX_NUMNODES; i++) {
376 cpumask_t nodemask = node_to_cpumask(i);
368 struct sched_group *oldsg, *sg = sched_group_nodes[i]; 377 struct sched_group *oldsg, *sg = sched_group_nodes[i];
378
379 cpus_and(nodemask, nodemask, *cpu_map);
380 if (cpus_empty(nodemask))
381 continue;
382
369 if (sg == NULL) 383 if (sg == NULL)
370 continue; 384 continue;
371 sg = sg->next; 385 sg = sg->next;
diff --git a/arch/ia64/kernel/efi.c b/arch/ia64/kernel/efi.c
index 4a3b1aac43e7..179f230816ed 100644
--- a/arch/ia64/kernel/efi.c
+++ b/arch/ia64/kernel/efi.c
@@ -410,6 +410,38 @@ efi_memmap_walk (efi_freemem_callback_t callback, void *arg)
410} 410}
411 411
412/* 412/*
413 * Walk the EFI memory map to pull out leftover pages in the lower
414 * memory regions which do not end up in the regular memory map and
415 * stick them into the uncached allocator
416 *
417 * The regular walk function is significantly more complex than the
418 * uncached walk which means it really doesn't make sense to try and
419 * marge the two.
420 */
421void __init
422efi_memmap_walk_uc (efi_freemem_callback_t callback)
423{
424 void *efi_map_start, *efi_map_end, *p;
425 efi_memory_desc_t *md;
426 u64 efi_desc_size, start, end;
427
428 efi_map_start = __va(ia64_boot_param->efi_memmap);
429 efi_map_end = efi_map_start + ia64_boot_param->efi_memmap_size;
430 efi_desc_size = ia64_boot_param->efi_memdesc_size;
431
432 for (p = efi_map_start; p < efi_map_end; p += efi_desc_size) {
433 md = p;
434 if (md->attribute == EFI_MEMORY_UC) {
435 start = PAGE_ALIGN(md->phys_addr);
436 end = PAGE_ALIGN((md->phys_addr+(md->num_pages << EFI_PAGE_SHIFT)) & PAGE_MASK);
437 if ((*callback)(start, end, NULL) < 0)
438 return;
439 }
440 }
441}
442
443
444/*
413 * Look for the PAL_CODE region reported by EFI and maps it using an 445 * Look for the PAL_CODE region reported by EFI and maps it using an
414 * ITR to enable safe PAL calls in virtual mode. See IA-64 Processor 446 * ITR to enable safe PAL calls in virtual mode. See IA-64 Processor
415 * Abstraction Layer chapter 11 in ADAG 447 * Abstraction Layer chapter 11 in ADAG
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S
index 8ebfcc0c813a..69f88d561d62 100644
--- a/arch/ia64/kernel/entry.S
+++ b/arch/ia64/kernel/entry.S
@@ -1571,9 +1571,9 @@ sys_call_table:
1571 data8 sys_add_key 1571 data8 sys_add_key
1572 data8 sys_request_key 1572 data8 sys_request_key
1573 data8 sys_keyctl 1573 data8 sys_keyctl
1574 data8 sys_ni_syscall 1574 data8 sys_ioprio_set
1575 data8 sys_ni_syscall // 1275 1575 data8 sys_ioprio_get // 1275
1576 data8 sys_ni_syscall 1576 data8 sys_set_zone_reclaim
1577 data8 sys_ni_syscall 1577 data8 sys_ni_syscall
1578 data8 sys_ni_syscall 1578 data8 sys_ni_syscall
1579 data8 sys_ni_syscall 1579 data8 sys_ni_syscall
diff --git a/arch/ia64/kernel/entry.h b/arch/ia64/kernel/entry.h
index 6d4ecec989b5..78eeb0793419 100644
--- a/arch/ia64/kernel/entry.h
+++ b/arch/ia64/kernel/entry.h
@@ -60,7 +60,7 @@
60 .spillsp @priunat,SW(AR_UNAT)+16+(off); \ 60 .spillsp @priunat,SW(AR_UNAT)+16+(off); \
61 .spillsp ar.rnat,SW(AR_RNAT)+16+(off); \ 61 .spillsp ar.rnat,SW(AR_RNAT)+16+(off); \
62 .spillsp ar.bspstore,SW(AR_BSPSTORE)+16+(off); \ 62 .spillsp ar.bspstore,SW(AR_BSPSTORE)+16+(off); \
63 .spillsp pr,SW(PR)+16+(off)) 63 .spillsp pr,SW(PR)+16+(off)
64 64
65#define DO_SAVE_SWITCH_STACK \ 65#define DO_SAVE_SWITCH_STACK \
66 movl r28=1f; \ 66 movl r28=1f; \
diff --git a/arch/ia64/kernel/ivt.S b/arch/ia64/kernel/ivt.S
index 386087edabf2..b28d2212a779 100644
--- a/arch/ia64/kernel/ivt.S
+++ b/arch/ia64/kernel/ivt.S
@@ -405,17 +405,22 @@ ENTRY(nested_dtlb_miss)
405 * r30: continuation address 405 * r30: continuation address
406 * r31: saved pr 406 * r31: saved pr
407 * 407 *
408 * Clobbered: b0, r18, r19, r21, psr.dt (cleared) 408 * Clobbered: b0, r18, r19, r21, r22, psr.dt (cleared)
409 */ 409 */
410 rsm psr.dt // switch to using physical data addressing 410 rsm psr.dt // switch to using physical data addressing
411 mov r19=IA64_KR(PT_BASE) // get the page table base address 411 mov r19=IA64_KR(PT_BASE) // get the page table base address
412 shl r21=r16,3 // shift bit 60 into sign bit 412 shl r21=r16,3 // shift bit 60 into sign bit
413 mov r18=cr.itir
413 ;; 414 ;;
414 shr.u r17=r16,61 // get the region number into r17 415 shr.u r17=r16,61 // get the region number into r17
416 extr.u r18=r18,2,6 // get the faulting page size
415 ;; 417 ;;
416 cmp.eq p6,p7=5,r17 // is faulting address in region 5? 418 cmp.eq p6,p7=5,r17 // is faulting address in region 5?
417 shr.u r18=r16,PGDIR_SHIFT // get bits 33-63 of faulting address 419 add r22=-PAGE_SHIFT,r18 // adjustment for hugetlb address
420 add r18=PGDIR_SHIFT-PAGE_SHIFT,r18
418 ;; 421 ;;
422 shr.u r22=r16,r22
423 shr.u r18=r16,r18
419(p7) dep r17=r17,r19,(PAGE_SHIFT-3),3 // put region number bits in place 424(p7) dep r17=r17,r19,(PAGE_SHIFT-3),3 // put region number bits in place
420 425
421 srlz.d 426 srlz.d
@@ -428,7 +433,7 @@ ENTRY(nested_dtlb_miss)
428(p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=PTA + IFA(33,42)*8 433(p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=PTA + IFA(33,42)*8
429(p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=PTA + (((IFA(61,63) << 7) | IFA(33,39))*8) 434(p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=PTA + (((IFA(61,63) << 7) | IFA(33,39))*8)
430 cmp.eq p7,p6=0,r21 // unused address bits all zeroes? 435 cmp.eq p7,p6=0,r21 // unused address bits all zeroes?
431 shr.u r18=r16,PMD_SHIFT // shift L2 index into position 436 shr.u r18=r22,PMD_SHIFT // shift L2 index into position
432 ;; 437 ;;
433 ld8 r17=[r17] // fetch the L1 entry (may be 0) 438 ld8 r17=[r17] // fetch the L1 entry (may be 0)
434 ;; 439 ;;
@@ -436,7 +441,7 @@ ENTRY(nested_dtlb_miss)
436 dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry 441 dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry
437 ;; 442 ;;
438(p7) ld8 r17=[r17] // fetch the L2 entry (may be 0) 443(p7) ld8 r17=[r17] // fetch the L2 entry (may be 0)
439 shr.u r19=r16,PAGE_SHIFT // shift L3 index into position 444 shr.u r19=r22,PAGE_SHIFT // shift L3 index into position
440 ;; 445 ;;
441(p7) cmp.eq.or.andcm p6,p7=r17,r0 // was L2 entry NULL? 446(p7) cmp.eq.or.andcm p6,p7=r17,r0 // was L2 entry NULL?
442 dep r17=r19,r17,3,(PAGE_SHIFT-3) // compute address of L3 page table entry 447 dep r17=r19,r17,3,(PAGE_SHIFT-3) // compute address of L3 page table entry
diff --git a/arch/ia64/kernel/jprobes.S b/arch/ia64/kernel/jprobes.S
new file mode 100644
index 000000000000..b7fa3ccd2b0f
--- /dev/null
+++ b/arch/ia64/kernel/jprobes.S
@@ -0,0 +1,61 @@
1/*
2 * Jprobe specific operations
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 *
18 * Copyright (C) Intel Corporation, 2005
19 *
20 * 2005-May Rusty Lynch <rusty.lynch@intel.com> and Anil S Keshavamurthy
21 * <anil.s.keshavamurthy@intel.com> initial implementation
22 *
23 * Jprobes (a.k.a. "jump probes" which is built on-top of kprobes) allow a
24 * probe to be inserted into the beginning of a function call. The fundamental
25 * difference between a jprobe and a kprobe is the jprobe handler is executed
26 * in the same context as the target function, while the kprobe handlers
27 * are executed in interrupt context.
28 *
29 * For jprobes we initially gain control by placing a break point in the
30 * first instruction of the targeted function. When we catch that specific
31 * break, we:
32 * * set the return address to our jprobe_inst_return() function
33 * * jump to the jprobe handler function
34 *
35 * Since we fixed up the return address, the jprobe handler will return to our
36 * jprobe_inst_return() function, giving us control again. At this point we
37 * are back in the parents frame marker, so we do yet another call to our
38 * jprobe_break() function to fix up the frame marker as it would normally
39 * exist in the target function.
40 *
41 * Our jprobe_return function then transfers control back to kprobes.c by
42 * executing a break instruction using one of our reserved numbers. When we
43 * catch that break in kprobes.c, we continue like we do for a normal kprobe
44 * by single stepping the emulated instruction, and then returning execution
45 * to the correct location.
46 */
47#include <asm/asmmacro.h>
48
49 /*
50 * void jprobe_break(void)
51 */
52ENTRY(jprobe_break)
53 break.m 0x80300
54END(jprobe_break)
55
56 /*
57 * void jprobe_inst_return(void)
58 */
59GLOBAL_ENTRY(jprobe_inst_return)
60 br.call.sptk.many b0=jprobe_break
61END(jprobe_inst_return)
diff --git a/arch/ia64/kernel/kprobes.c b/arch/ia64/kernel/kprobes.c
new file mode 100644
index 000000000000..3aa3167edbec
--- /dev/null
+++ b/arch/ia64/kernel/kprobes.c
@@ -0,0 +1,721 @@
1/*
2 * Kernel Probes (KProbes)
3 * arch/ia64/kernel/kprobes.c
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 *
19 * Copyright (C) IBM Corporation, 2002, 2004
20 * Copyright (C) Intel Corporation, 2005
21 *
22 * 2005-Apr Rusty Lynch <rusty.lynch@intel.com> and Anil S Keshavamurthy
23 * <anil.s.keshavamurthy@intel.com> adapted from i386
24 */
25
26#include <linux/config.h>
27#include <linux/kprobes.h>
28#include <linux/ptrace.h>
29#include <linux/spinlock.h>
30#include <linux/string.h>
31#include <linux/slab.h>
32#include <linux/preempt.h>
33#include <linux/moduleloader.h>
34
35#include <asm/pgtable.h>
36#include <asm/kdebug.h>
37#include <asm/sections.h>
38
39extern void jprobe_inst_return(void);
40
41/* kprobe_status settings */
42#define KPROBE_HIT_ACTIVE 0x00000001
43#define KPROBE_HIT_SS 0x00000002
44
45static struct kprobe *current_kprobe, *kprobe_prev;
46static unsigned long kprobe_status, kprobe_status_prev;
47static struct pt_regs jprobe_saved_regs;
48
49enum instruction_type {A, I, M, F, B, L, X, u};
50static enum instruction_type bundle_encoding[32][3] = {
51 { M, I, I }, /* 00 */
52 { M, I, I }, /* 01 */
53 { M, I, I }, /* 02 */
54 { M, I, I }, /* 03 */
55 { M, L, X }, /* 04 */
56 { M, L, X }, /* 05 */
57 { u, u, u }, /* 06 */
58 { u, u, u }, /* 07 */
59 { M, M, I }, /* 08 */
60 { M, M, I }, /* 09 */
61 { M, M, I }, /* 0A */
62 { M, M, I }, /* 0B */
63 { M, F, I }, /* 0C */
64 { M, F, I }, /* 0D */
65 { M, M, F }, /* 0E */
66 { M, M, F }, /* 0F */
67 { M, I, B }, /* 10 */
68 { M, I, B }, /* 11 */
69 { M, B, B }, /* 12 */
70 { M, B, B }, /* 13 */
71 { u, u, u }, /* 14 */
72 { u, u, u }, /* 15 */
73 { B, B, B }, /* 16 */
74 { B, B, B }, /* 17 */
75 { M, M, B }, /* 18 */
76 { M, M, B }, /* 19 */
77 { u, u, u }, /* 1A */
78 { u, u, u }, /* 1B */
79 { M, F, B }, /* 1C */
80 { M, F, B }, /* 1D */
81 { u, u, u }, /* 1E */
82 { u, u, u }, /* 1F */
83};
84
85/*
86 * In this function we check to see if the instruction
87 * is IP relative instruction and update the kprobe
88 * inst flag accordingly
89 */
90static void update_kprobe_inst_flag(uint template, uint slot, uint major_opcode,
91 unsigned long kprobe_inst, struct kprobe *p)
92{
93 p->ainsn.inst_flag = 0;
94 p->ainsn.target_br_reg = 0;
95
96 if (bundle_encoding[template][slot] == B) {
97 switch (major_opcode) {
98 case INDIRECT_CALL_OPCODE:
99 p->ainsn.inst_flag |= INST_FLAG_FIX_BRANCH_REG;
100 p->ainsn.target_br_reg = ((kprobe_inst >> 6) & 0x7);
101 break;
102 case IP_RELATIVE_PREDICT_OPCODE:
103 case IP_RELATIVE_BRANCH_OPCODE:
104 p->ainsn.inst_flag |= INST_FLAG_FIX_RELATIVE_IP_ADDR;
105 break;
106 case IP_RELATIVE_CALL_OPCODE:
107 p->ainsn.inst_flag |= INST_FLAG_FIX_RELATIVE_IP_ADDR;
108 p->ainsn.inst_flag |= INST_FLAG_FIX_BRANCH_REG;
109 p->ainsn.target_br_reg = ((kprobe_inst >> 6) & 0x7);
110 break;
111 }
112 } else if (bundle_encoding[template][slot] == X) {
113 switch (major_opcode) {
114 case LONG_CALL_OPCODE:
115 p->ainsn.inst_flag |= INST_FLAG_FIX_BRANCH_REG;
116 p->ainsn.target_br_reg = ((kprobe_inst >> 6) & 0x7);
117 break;
118 }
119 }
120 return;
121}
122
123/*
124 * In this function we check to see if the instruction
125 * on which we are inserting kprobe is supported.
126 * Returns 0 if supported
127 * Returns -EINVAL if unsupported
128 */
129static int unsupported_inst(uint template, uint slot, uint major_opcode,
130 unsigned long kprobe_inst, struct kprobe *p)
131{
132 unsigned long addr = (unsigned long)p->addr;
133
134 if (bundle_encoding[template][slot] == I) {
135 switch (major_opcode) {
136 case 0x0: //I_UNIT_MISC_OPCODE:
137 /*
138 * Check for Integer speculation instruction
139 * - Bit 33-35 to be equal to 0x1
140 */
141 if (((kprobe_inst >> 33) & 0x7) == 1) {
142 printk(KERN_WARNING
143 "Kprobes on speculation inst at <0x%lx> not supported\n",
144 addr);
145 return -EINVAL;
146 }
147
148 /*
149 * IP relative mov instruction
150 * - Bit 27-35 to be equal to 0x30
151 */
152 if (((kprobe_inst >> 27) & 0x1FF) == 0x30) {
153 printk(KERN_WARNING
154 "Kprobes on \"mov r1=ip\" at <0x%lx> not supported\n",
155 addr);
156 return -EINVAL;
157
158 }
159 }
160 }
161 return 0;
162}
163
164
165/*
166 * In this function we check to see if the instruction
167 * (qp) cmpx.crel.ctype p1,p2=r2,r3
168 * on which we are inserting kprobe is cmp instruction
169 * with ctype as unc.
170 */
171static uint is_cmp_ctype_unc_inst(uint template, uint slot, uint major_opcode,
172unsigned long kprobe_inst)
173{
174 cmp_inst_t cmp_inst;
175 uint ctype_unc = 0;
176
177 if (!((bundle_encoding[template][slot] == I) ||
178 (bundle_encoding[template][slot] == M)))
179 goto out;
180
181 if (!((major_opcode == 0xC) || (major_opcode == 0xD) ||
182 (major_opcode == 0xE)))
183 goto out;
184
185 cmp_inst.l = kprobe_inst;
186 if ((cmp_inst.f.x2 == 0) || (cmp_inst.f.x2 == 1)) {
187 /* Integere compare - Register Register (A6 type)*/
188 if ((cmp_inst.f.tb == 0) && (cmp_inst.f.ta == 0)
189 &&(cmp_inst.f.c == 1))
190 ctype_unc = 1;
191 } else if ((cmp_inst.f.x2 == 2)||(cmp_inst.f.x2 == 3)) {
192 /* Integere compare - Immediate Register (A8 type)*/
193 if ((cmp_inst.f.ta == 0) &&(cmp_inst.f.c == 1))
194 ctype_unc = 1;
195 }
196out:
197 return ctype_unc;
198}
199
200/*
201 * In this function we override the bundle with
202 * the break instruction at the given slot.
203 */
204static void prepare_break_inst(uint template, uint slot, uint major_opcode,
205 unsigned long kprobe_inst, struct kprobe *p)
206{
207 unsigned long break_inst = BREAK_INST;
208 bundle_t *bundle = &p->ainsn.insn.bundle;
209
210 /*
211 * Copy the original kprobe_inst qualifying predicate(qp)
212 * to the break instruction iff !is_cmp_ctype_unc_inst
213 * because for cmp instruction with ctype equal to unc,
214 * which is a special instruction always needs to be
215 * executed regradless of qp
216 */
217 if (!is_cmp_ctype_unc_inst(template, slot, major_opcode, kprobe_inst))
218 break_inst |= (0x3f & kprobe_inst);
219
220 switch (slot) {
221 case 0:
222 bundle->quad0.slot0 = break_inst;
223 break;
224 case 1:
225 bundle->quad0.slot1_p0 = break_inst;
226 bundle->quad1.slot1_p1 = break_inst >> (64-46);
227 break;
228 case 2:
229 bundle->quad1.slot2 = break_inst;
230 break;
231 }
232
233 /*
234 * Update the instruction flag, so that we can
235 * emulate the instruction properly after we
236 * single step on original instruction
237 */
238 update_kprobe_inst_flag(template, slot, major_opcode, kprobe_inst, p);
239}
240
241static inline void get_kprobe_inst(bundle_t *bundle, uint slot,
242 unsigned long *kprobe_inst, uint *major_opcode)
243{
244 unsigned long kprobe_inst_p0, kprobe_inst_p1;
245 unsigned int template;
246
247 template = bundle->quad0.template;
248
249 switch (slot) {
250 case 0:
251 *major_opcode = (bundle->quad0.slot0 >> SLOT0_OPCODE_SHIFT);
252 *kprobe_inst = bundle->quad0.slot0;
253 break;
254 case 1:
255 *major_opcode = (bundle->quad1.slot1_p1 >> SLOT1_p1_OPCODE_SHIFT);
256 kprobe_inst_p0 = bundle->quad0.slot1_p0;
257 kprobe_inst_p1 = bundle->quad1.slot1_p1;
258 *kprobe_inst = kprobe_inst_p0 | (kprobe_inst_p1 << (64-46));
259 break;
260 case 2:
261 *major_opcode = (bundle->quad1.slot2 >> SLOT2_OPCODE_SHIFT);
262 *kprobe_inst = bundle->quad1.slot2;
263 break;
264 }
265}
266
267/* Returns non-zero if the addr is in the Interrupt Vector Table */
268static inline int in_ivt_functions(unsigned long addr)
269{
270 return (addr >= (unsigned long)__start_ivt_text
271 && addr < (unsigned long)__end_ivt_text);
272}
273
274static int valid_kprobe_addr(int template, int slot, unsigned long addr)
275{
276 if ((slot > 2) || ((bundle_encoding[template][1] == L) && slot > 1)) {
277 printk(KERN_WARNING "Attempting to insert unaligned kprobe "
278 "at 0x%lx\n", addr);
279 return -EINVAL;
280 }
281
282 if (in_ivt_functions(addr)) {
283 printk(KERN_WARNING "Kprobes can't be inserted inside "
284 "IVT functions at 0x%lx\n", addr);
285 return -EINVAL;
286 }
287
288 if (slot == 1 && bundle_encoding[template][1] != L) {
289 printk(KERN_WARNING "Inserting kprobes on slot #1 "
290 "is not supported\n");
291 return -EINVAL;
292 }
293
294 return 0;
295}
296
297static inline void save_previous_kprobe(void)
298{
299 kprobe_prev = current_kprobe;
300 kprobe_status_prev = kprobe_status;
301}
302
303static inline void restore_previous_kprobe(void)
304{
305 current_kprobe = kprobe_prev;
306 kprobe_status = kprobe_status_prev;
307}
308
309static inline void set_current_kprobe(struct kprobe *p)
310{
311 current_kprobe = p;
312}
313
314static void kretprobe_trampoline(void)
315{
316}
317
318/*
319 * At this point the target function has been tricked into
320 * returning into our trampoline. Lookup the associated instance
321 * and then:
322 * - call the handler function
323 * - cleanup by marking the instance as unused
324 * - long jump back to the original return address
325 */
326int trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
327{
328 struct kretprobe_instance *ri = NULL;
329 struct hlist_head *head;
330 struct hlist_node *node, *tmp;
331 unsigned long orig_ret_address = 0;
332 unsigned long trampoline_address =
333 ((struct fnptr *)kretprobe_trampoline)->ip;
334
335 head = kretprobe_inst_table_head(current);
336
337 /*
338 * It is possible to have multiple instances associated with a given
339 * task either because an multiple functions in the call path
340 * have a return probe installed on them, and/or more then one return
341 * return probe was registered for a target function.
342 *
343 * We can handle this because:
344 * - instances are always inserted at the head of the list
345 * - when multiple return probes are registered for the same
346 * function, the first instance's ret_addr will point to the
347 * real return address, and all the rest will point to
348 * kretprobe_trampoline
349 */
350 hlist_for_each_entry_safe(ri, node, tmp, head, hlist) {
351 if (ri->task != current)
352 /* another task is sharing our hash bucket */
353 continue;
354
355 if (ri->rp && ri->rp->handler)
356 ri->rp->handler(ri, regs);
357
358 orig_ret_address = (unsigned long)ri->ret_addr;
359 recycle_rp_inst(ri);
360
361 if (orig_ret_address != trampoline_address)
362 /*
363 * This is the real return address. Any other
364 * instances associated with this task are for
365 * other calls deeper on the call stack
366 */
367 break;
368 }
369
370 BUG_ON(!orig_ret_address || (orig_ret_address == trampoline_address));
371 regs->cr_iip = orig_ret_address;
372
373 unlock_kprobes();
374 preempt_enable_no_resched();
375
376 /*
377 * By returning a non-zero value, we are telling
378 * kprobe_handler() that we have handled unlocking
379 * and re-enabling preemption.
380 */
381 return 1;
382}
383
384void arch_prepare_kretprobe(struct kretprobe *rp, struct pt_regs *regs)
385{
386 struct kretprobe_instance *ri;
387
388 if ((ri = get_free_rp_inst(rp)) != NULL) {
389 ri->rp = rp;
390 ri->task = current;
391 ri->ret_addr = (kprobe_opcode_t *)regs->b0;
392
393 /* Replace the return addr with trampoline addr */
394 regs->b0 = ((struct fnptr *)kretprobe_trampoline)->ip;
395
396 add_rp_inst(ri);
397 } else {
398 rp->nmissed++;
399 }
400}
401
402int arch_prepare_kprobe(struct kprobe *p)
403{
404 unsigned long addr = (unsigned long) p->addr;
405 unsigned long *kprobe_addr = (unsigned long *)(addr & ~0xFULL);
406 unsigned long kprobe_inst=0;
407 unsigned int slot = addr & 0xf, template, major_opcode = 0;
408 bundle_t *bundle = &p->ainsn.insn.bundle;
409
410 memcpy(&p->opcode.bundle, kprobe_addr, sizeof(bundle_t));
411 memcpy(&p->ainsn.insn.bundle, kprobe_addr, sizeof(bundle_t));
412
413 template = bundle->quad0.template;
414
415 if(valid_kprobe_addr(template, slot, addr))
416 return -EINVAL;
417
418 /* Move to slot 2, if bundle is MLX type and kprobe slot is 1 */
419 if (slot == 1 && bundle_encoding[template][1] == L)
420 slot++;
421
422 /* Get kprobe_inst and major_opcode from the bundle */
423 get_kprobe_inst(bundle, slot, &kprobe_inst, &major_opcode);
424
425 if (unsupported_inst(template, slot, major_opcode, kprobe_inst, p))
426 return -EINVAL;
427
428 prepare_break_inst(template, slot, major_opcode, kprobe_inst, p);
429
430 return 0;
431}
432
433void arch_arm_kprobe(struct kprobe *p)
434{
435 unsigned long addr = (unsigned long)p->addr;
436 unsigned long arm_addr = addr & ~0xFULL;
437
438 memcpy((char *)arm_addr, &p->ainsn.insn.bundle, sizeof(bundle_t));
439 flush_icache_range(arm_addr, arm_addr + sizeof(bundle_t));
440}
441
442void arch_disarm_kprobe(struct kprobe *p)
443{
444 unsigned long addr = (unsigned long)p->addr;
445 unsigned long arm_addr = addr & ~0xFULL;
446
447 /* p->opcode contains the original unaltered bundle */
448 memcpy((char *) arm_addr, (char *) &p->opcode.bundle, sizeof(bundle_t));
449 flush_icache_range(arm_addr, arm_addr + sizeof(bundle_t));
450}
451
452void arch_remove_kprobe(struct kprobe *p)
453{
454}
455
456/*
457 * We are resuming execution after a single step fault, so the pt_regs
458 * structure reflects the register state after we executed the instruction
459 * located in the kprobe (p->ainsn.insn.bundle). We still need to adjust
460 * the ip to point back to the original stack address. To set the IP address
461 * to original stack address, handle the case where we need to fixup the
462 * relative IP address and/or fixup branch register.
463 */
464static void resume_execution(struct kprobe *p, struct pt_regs *regs)
465{
466 unsigned long bundle_addr = ((unsigned long) (&p->opcode.bundle)) & ~0xFULL;
467 unsigned long resume_addr = (unsigned long)p->addr & ~0xFULL;
468 unsigned long template;
469 int slot = ((unsigned long)p->addr & 0xf);
470
471 template = p->opcode.bundle.quad0.template;
472
473 if (slot == 1 && bundle_encoding[template][1] == L)
474 slot = 2;
475
476 if (p->ainsn.inst_flag) {
477
478 if (p->ainsn.inst_flag & INST_FLAG_FIX_RELATIVE_IP_ADDR) {
479 /* Fix relative IP address */
480 regs->cr_iip = (regs->cr_iip - bundle_addr) + resume_addr;
481 }
482
483 if (p->ainsn.inst_flag & INST_FLAG_FIX_BRANCH_REG) {
484 /*
485 * Fix target branch register, software convention is
486 * to use either b0 or b6 or b7, so just checking
487 * only those registers
488 */
489 switch (p->ainsn.target_br_reg) {
490 case 0:
491 if ((regs->b0 == bundle_addr) ||
492 (regs->b0 == bundle_addr + 0x10)) {
493 regs->b0 = (regs->b0 - bundle_addr) +
494 resume_addr;
495 }
496 break;
497 case 6:
498 if ((regs->b6 == bundle_addr) ||
499 (regs->b6 == bundle_addr + 0x10)) {
500 regs->b6 = (regs->b6 - bundle_addr) +
501 resume_addr;
502 }
503 break;
504 case 7:
505 if ((regs->b7 == bundle_addr) ||
506 (regs->b7 == bundle_addr + 0x10)) {
507 regs->b7 = (regs->b7 - bundle_addr) +
508 resume_addr;
509 }
510 break;
511 } /* end switch */
512 }
513 goto turn_ss_off;
514 }
515
516 if (slot == 2) {
517 if (regs->cr_iip == bundle_addr + 0x10) {
518 regs->cr_iip = resume_addr + 0x10;
519 }
520 } else {
521 if (regs->cr_iip == bundle_addr) {
522 regs->cr_iip = resume_addr;
523 }
524 }
525
526turn_ss_off:
527 /* Turn off Single Step bit */
528 ia64_psr(regs)->ss = 0;
529}
530
531static void prepare_ss(struct kprobe *p, struct pt_regs *regs)
532{
533 unsigned long bundle_addr = (unsigned long) &p->opcode.bundle;
534 unsigned long slot = (unsigned long)p->addr & 0xf;
535
536 /* Update instruction pointer (IIP) and slot number (IPSR.ri) */
537 regs->cr_iip = bundle_addr & ~0xFULL;
538
539 if (slot > 2)
540 slot = 0;
541
542 ia64_psr(regs)->ri = slot;
543
544 /* turn on single stepping */
545 ia64_psr(regs)->ss = 1;
546}
547
548static int pre_kprobes_handler(struct die_args *args)
549{
550 struct kprobe *p;
551 int ret = 0;
552 struct pt_regs *regs = args->regs;
553 kprobe_opcode_t *addr = (kprobe_opcode_t *)instruction_pointer(regs);
554
555 preempt_disable();
556
557 /* Handle recursion cases */
558 if (kprobe_running()) {
559 p = get_kprobe(addr);
560 if (p) {
561 if (kprobe_status == KPROBE_HIT_SS) {
562 unlock_kprobes();
563 goto no_kprobe;
564 }
565 /* We have reentered the pre_kprobe_handler(), since
566 * another probe was hit while within the handler.
567 * We here save the original kprobes variables and
568 * just single step on the instruction of the new probe
569 * without calling any user handlers.
570 */
571 save_previous_kprobe();
572 set_current_kprobe(p);
573 p->nmissed++;
574 prepare_ss(p, regs);
575 kprobe_status = KPROBE_REENTER;
576 return 1;
577 } else if (args->err == __IA64_BREAK_JPROBE) {
578 /*
579 * jprobe instrumented function just completed
580 */
581 p = current_kprobe;
582 if (p->break_handler && p->break_handler(p, regs)) {
583 goto ss_probe;
584 }
585 } else {
586 /* Not our break */
587 goto no_kprobe;
588 }
589 }
590
591 lock_kprobes();
592 p = get_kprobe(addr);
593 if (!p) {
594 unlock_kprobes();
595 goto no_kprobe;
596 }
597
598 kprobe_status = KPROBE_HIT_ACTIVE;
599 set_current_kprobe(p);
600
601 if (p->pre_handler && p->pre_handler(p, regs))
602 /*
603 * Our pre-handler is specifically requesting that we just
604 * do a return. This is used for both the jprobe pre-handler
605 * and the kretprobe trampoline
606 */
607 return 1;
608
609ss_probe:
610 prepare_ss(p, regs);
611 kprobe_status = KPROBE_HIT_SS;
612 return 1;
613
614no_kprobe:
615 preempt_enable_no_resched();
616 return ret;
617}
618
619static int post_kprobes_handler(struct pt_regs *regs)
620{
621 if (!kprobe_running())
622 return 0;
623
624 if ((kprobe_status != KPROBE_REENTER) && current_kprobe->post_handler) {
625 kprobe_status = KPROBE_HIT_SSDONE;
626 current_kprobe->post_handler(current_kprobe, regs, 0);
627 }
628
629 resume_execution(current_kprobe, regs);
630
631 /*Restore back the original saved kprobes variables and continue. */
632 if (kprobe_status == KPROBE_REENTER) {
633 restore_previous_kprobe();
634 goto out;
635 }
636
637 unlock_kprobes();
638
639out:
640 preempt_enable_no_resched();
641 return 1;
642}
643
644static int kprobes_fault_handler(struct pt_regs *regs, int trapnr)
645{
646 if (!kprobe_running())
647 return 0;
648
649 if (current_kprobe->fault_handler &&
650 current_kprobe->fault_handler(current_kprobe, regs, trapnr))
651 return 1;
652
653 if (kprobe_status & KPROBE_HIT_SS) {
654 resume_execution(current_kprobe, regs);
655 unlock_kprobes();
656 preempt_enable_no_resched();
657 }
658
659 return 0;
660}
661
662int kprobe_exceptions_notify(struct notifier_block *self, unsigned long val,
663 void *data)
664{
665 struct die_args *args = (struct die_args *)data;
666 switch(val) {
667 case DIE_BREAK:
668 if (pre_kprobes_handler(args))
669 return NOTIFY_STOP;
670 break;
671 case DIE_SS:
672 if (post_kprobes_handler(args->regs))
673 return NOTIFY_STOP;
674 break;
675 case DIE_PAGE_FAULT:
676 if (kprobes_fault_handler(args->regs, args->trapnr))
677 return NOTIFY_STOP;
678 default:
679 break;
680 }
681 return NOTIFY_DONE;
682}
683
684int setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
685{
686 struct jprobe *jp = container_of(p, struct jprobe, kp);
687 unsigned long addr = ((struct fnptr *)(jp->entry))->ip;
688
689 /* save architectural state */
690 jprobe_saved_regs = *regs;
691
692 /* after rfi, execute the jprobe instrumented function */
693 regs->cr_iip = addr & ~0xFULL;
694 ia64_psr(regs)->ri = addr & 0xf;
695 regs->r1 = ((struct fnptr *)(jp->entry))->gp;
696
697 /*
698 * fix the return address to our jprobe_inst_return() function
699 * in the jprobes.S file
700 */
701 regs->b0 = ((struct fnptr *)(jprobe_inst_return))->ip;
702
703 return 1;
704}
705
706int longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
707{
708 *regs = jprobe_saved_regs;
709 return 1;
710}
711
712static struct kprobe trampoline_p = {
713 .pre_handler = trampoline_probe_handler
714};
715
716int __init arch_init(void)
717{
718 trampoline_p.addr =
719 (kprobe_opcode_t *)((struct fnptr *)kretprobe_trampoline)->ip;
720 return register_kprobe(&trampoline_p);
721}
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c
index ebb71f3d6d19..6e35bff05d59 100644
--- a/arch/ia64/kernel/process.c
+++ b/arch/ia64/kernel/process.c
@@ -27,6 +27,7 @@
27#include <linux/efi.h> 27#include <linux/efi.h>
28#include <linux/interrupt.h> 28#include <linux/interrupt.h>
29#include <linux/delay.h> 29#include <linux/delay.h>
30#include <linux/kprobes.h>
30 31
31#include <asm/cpu.h> 32#include <asm/cpu.h>
32#include <asm/delay.h> 33#include <asm/delay.h>
@@ -707,6 +708,13 @@ kernel_thread_helper (int (*fn)(void *), void *arg)
707void 708void
708flush_thread (void) 709flush_thread (void)
709{ 710{
711 /*
712 * Remove function-return probe instances associated with this task
713 * and put them back on the free list. Do not insert an exit probe for
714 * this function, it will be disabled by kprobe_flush_task if you do.
715 */
716 kprobe_flush_task(current);
717
710 /* drop floating-point and debug-register state if it exists: */ 718 /* drop floating-point and debug-register state if it exists: */
711 current->thread.flags &= ~(IA64_THREAD_FPH_VALID | IA64_THREAD_DBG_VALID); 719 current->thread.flags &= ~(IA64_THREAD_FPH_VALID | IA64_THREAD_DBG_VALID);
712 ia64_drop_fpu(current); 720 ia64_drop_fpu(current);
@@ -721,6 +729,14 @@ flush_thread (void)
721void 729void
722exit_thread (void) 730exit_thread (void)
723{ 731{
732
733 /*
734 * Remove function-return probe instances associated with this task
735 * and put them back on the free list. Do not insert an exit probe for
736 * this function, it will be disabled by kprobe_flush_task if you do.
737 */
738 kprobe_flush_task(current);
739
724 ia64_drop_fpu(current); 740 ia64_drop_fpu(current);
725#ifdef CONFIG_PERFMON 741#ifdef CONFIG_PERFMON
726 /* if needed, stop monitoring and flush state to perfmon context */ 742 /* if needed, stop monitoring and flush state to perfmon context */
diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c
index 4c1d2f5442b3..bbb8bc7c0552 100644
--- a/arch/ia64/kernel/ptrace.c
+++ b/arch/ia64/kernel/ptrace.c
@@ -965,6 +965,13 @@ access_uarea (struct task_struct *child, unsigned long addr,
965 *data = (pt->cr_ipsr & IPSR_MASK); 965 *data = (pt->cr_ipsr & IPSR_MASK);
966 return 0; 966 return 0;
967 967
968 case PT_AR_RSC:
969 if (write_access)
970 pt->ar_rsc = *data | (3 << 2); /* force PL3 */
971 else
972 *data = pt->ar_rsc;
973 return 0;
974
968 case PT_AR_RNAT: 975 case PT_AR_RNAT:
969 urbs_end = ia64_get_user_rbs_end(child, pt, NULL); 976 urbs_end = ia64_get_user_rbs_end(child, pt, NULL);
970 rnat_addr = (long) ia64_rse_rnat_addr((long *) 977 rnat_addr = (long) ia64_rse_rnat_addr((long *)
@@ -1016,9 +1023,6 @@ access_uarea (struct task_struct *child, unsigned long addr,
1016 case PT_AR_BSPSTORE: 1023 case PT_AR_BSPSTORE:
1017 ptr = pt_reg_addr(pt, ar_bspstore); 1024 ptr = pt_reg_addr(pt, ar_bspstore);
1018 break; 1025 break;
1019 case PT_AR_RSC:
1020 ptr = pt_reg_addr(pt, ar_rsc);
1021 break;
1022 case PT_AR_UNAT: 1026 case PT_AR_UNAT:
1023 ptr = pt_reg_addr(pt, ar_unat); 1027 ptr = pt_reg_addr(pt, ar_unat);
1024 break; 1028 break;
@@ -1254,7 +1258,7 @@ ptrace_getregs (struct task_struct *child, struct pt_all_user_regs __user *ppr)
1254static long 1258static long
1255ptrace_setregs (struct task_struct *child, struct pt_all_user_regs __user *ppr) 1259ptrace_setregs (struct task_struct *child, struct pt_all_user_regs __user *ppr)
1256{ 1260{
1257 unsigned long psr, ec, lc, rnat, bsp, cfm, nat_bits, val = 0; 1261 unsigned long psr, rsc, ec, lc, rnat, bsp, cfm, nat_bits, val = 0;
1258 struct unw_frame_info info; 1262 struct unw_frame_info info;
1259 struct switch_stack *sw; 1263 struct switch_stack *sw;
1260 struct ia64_fpreg fpval; 1264 struct ia64_fpreg fpval;
@@ -1287,7 +1291,7 @@ ptrace_setregs (struct task_struct *child, struct pt_all_user_regs __user *ppr)
1287 /* app regs */ 1291 /* app regs */
1288 1292
1289 retval |= __get_user(pt->ar_pfs, &ppr->ar[PT_AUR_PFS]); 1293 retval |= __get_user(pt->ar_pfs, &ppr->ar[PT_AUR_PFS]);
1290 retval |= __get_user(pt->ar_rsc, &ppr->ar[PT_AUR_RSC]); 1294 retval |= __get_user(rsc, &ppr->ar[PT_AUR_RSC]);
1291 retval |= __get_user(pt->ar_bspstore, &ppr->ar[PT_AUR_BSPSTORE]); 1295 retval |= __get_user(pt->ar_bspstore, &ppr->ar[PT_AUR_BSPSTORE]);
1292 retval |= __get_user(pt->ar_unat, &ppr->ar[PT_AUR_UNAT]); 1296 retval |= __get_user(pt->ar_unat, &ppr->ar[PT_AUR_UNAT]);
1293 retval |= __get_user(pt->ar_ccv, &ppr->ar[PT_AUR_CCV]); 1297 retval |= __get_user(pt->ar_ccv, &ppr->ar[PT_AUR_CCV]);
@@ -1385,6 +1389,7 @@ ptrace_setregs (struct task_struct *child, struct pt_all_user_regs __user *ppr)
1385 retval |= __get_user(nat_bits, &ppr->nat); 1389 retval |= __get_user(nat_bits, &ppr->nat);
1386 1390
1387 retval |= access_uarea(child, PT_CR_IPSR, &psr, 1); 1391 retval |= access_uarea(child, PT_CR_IPSR, &psr, 1);
1392 retval |= access_uarea(child, PT_AR_RSC, &rsc, 1);
1388 retval |= access_uarea(child, PT_AR_EC, &ec, 1); 1393 retval |= access_uarea(child, PT_AR_EC, &ec, 1);
1389 retval |= access_uarea(child, PT_AR_LC, &lc, 1); 1394 retval |= access_uarea(child, PT_AR_LC, &lc, 1);
1390 retval |= access_uarea(child, PT_AR_RNAT, &rnat, 1); 1395 retval |= access_uarea(child, PT_AR_RNAT, &rnat, 1);
diff --git a/arch/ia64/kernel/signal.c b/arch/ia64/kernel/signal.c
index 499b7e5317cf..edd9f07860b2 100644
--- a/arch/ia64/kernel/signal.c
+++ b/arch/ia64/kernel/signal.c
@@ -94,7 +94,7 @@ sys_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, long arg2,
94static long 94static long
95restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr) 95restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
96{ 96{
97 unsigned long ip, flags, nat, um, cfm; 97 unsigned long ip, flags, nat, um, cfm, rsc;
98 long err; 98 long err;
99 99
100 /* Always make any pending restarted system calls return -EINTR */ 100 /* Always make any pending restarted system calls return -EINTR */
@@ -106,7 +106,7 @@ restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
106 err |= __get_user(ip, &sc->sc_ip); /* instruction pointer */ 106 err |= __get_user(ip, &sc->sc_ip); /* instruction pointer */
107 err |= __get_user(cfm, &sc->sc_cfm); 107 err |= __get_user(cfm, &sc->sc_cfm);
108 err |= __get_user(um, &sc->sc_um); /* user mask */ 108 err |= __get_user(um, &sc->sc_um); /* user mask */
109 err |= __get_user(scr->pt.ar_rsc, &sc->sc_ar_rsc); 109 err |= __get_user(rsc, &sc->sc_ar_rsc);
110 err |= __get_user(scr->pt.ar_unat, &sc->sc_ar_unat); 110 err |= __get_user(scr->pt.ar_unat, &sc->sc_ar_unat);
111 err |= __get_user(scr->pt.ar_fpsr, &sc->sc_ar_fpsr); 111 err |= __get_user(scr->pt.ar_fpsr, &sc->sc_ar_fpsr);
112 err |= __get_user(scr->pt.ar_pfs, &sc->sc_ar_pfs); 112 err |= __get_user(scr->pt.ar_pfs, &sc->sc_ar_pfs);
@@ -119,6 +119,7 @@ restore_sigcontext (struct sigcontext __user *sc, struct sigscratch *scr)
119 err |= __copy_from_user(&scr->pt.r15, &sc->sc_gr[15], 8); /* r15 */ 119 err |= __copy_from_user(&scr->pt.r15, &sc->sc_gr[15], 8); /* r15 */
120 120
121 scr->pt.cr_ifs = cfm | (1UL << 63); 121 scr->pt.cr_ifs = cfm | (1UL << 63);
122 scr->pt.ar_rsc = rsc | (3 << 2); /* force PL3 */
122 123
123 /* establish new instruction pointer: */ 124 /* establish new instruction pointer: */
124 scr->pt.cr_iip = ip & ~0x3UL; 125 scr->pt.cr_iip = ip & ~0x3UL;
diff --git a/arch/ia64/kernel/smp.c b/arch/ia64/kernel/smp.c
index 953095e2ce15..b49d4ddaab93 100644
--- a/arch/ia64/kernel/smp.c
+++ b/arch/ia64/kernel/smp.c
@@ -269,7 +269,7 @@ smp_call_function_single (int cpuid, void (*func) (void *info), void *info, int
269 int me = get_cpu(); /* prevent preemption and reschedule on another processor */ 269 int me = get_cpu(); /* prevent preemption and reschedule on another processor */
270 270
271 if (cpuid == me) { 271 if (cpuid == me) {
272 printk("%s: trying to call self\n", __FUNCTION__); 272 printk(KERN_INFO "%s: trying to call self\n", __FUNCTION__);
273 put_cpu(); 273 put_cpu();
274 return -EBUSY; 274 return -EBUSY;
275 } 275 }
diff --git a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c
index 3865f088ffa2..623b0a546709 100644
--- a/arch/ia64/kernel/smpboot.c
+++ b/arch/ia64/kernel/smpboot.c
@@ -346,6 +346,7 @@ smp_callin (void)
346 lock_ipi_calllock(); 346 lock_ipi_calllock();
347 cpu_set(cpuid, cpu_online_map); 347 cpu_set(cpuid, cpu_online_map);
348 unlock_ipi_calllock(); 348 unlock_ipi_calllock();
349 per_cpu(cpu_state, cpuid) = CPU_ONLINE;
349 350
350 smp_setup_percpu_timer(); 351 smp_setup_percpu_timer();
351 352
@@ -611,6 +612,7 @@ void __devinit smp_prepare_boot_cpu(void)
611{ 612{
612 cpu_set(smp_processor_id(), cpu_online_map); 613 cpu_set(smp_processor_id(), cpu_online_map);
613 cpu_set(smp_processor_id(), cpu_callin_map); 614 cpu_set(smp_processor_id(), cpu_callin_map);
615 per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
614} 616}
615 617
616/* 618/*
@@ -688,6 +690,7 @@ int __cpu_disable(void)
688 return -EBUSY; 690 return -EBUSY;
689 691
690 remove_siblinginfo(cpu); 692 remove_siblinginfo(cpu);
693 cpu_clear(cpu, cpu_online_map);
691 fixup_irqs(); 694 fixup_irqs();
692 local_flush_tlb_all(); 695 local_flush_tlb_all();
693 cpu_clear(cpu, cpu_callin_map); 696 cpu_clear(cpu, cpu_callin_map);
@@ -774,6 +777,7 @@ __cpu_up (unsigned int cpu)
774 if (cpu_isset(cpu, cpu_callin_map)) 777 if (cpu_isset(cpu, cpu_callin_map))
775 return -EINVAL; 778 return -EINVAL;
776 779
780 per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;
777 /* Processor goes to start_secondary(), sets online flag */ 781 /* Processor goes to start_secondary(), sets online flag */
778 ret = do_boot_cpu(sapicid, cpu); 782 ret = do_boot_cpu(sapicid, cpu);
779 if (ret < 0) 783 if (ret < 0)
diff --git a/arch/ia64/kernel/traps.c b/arch/ia64/kernel/traps.c
index 1861173bd4f6..e7e520d90f03 100644
--- a/arch/ia64/kernel/traps.c
+++ b/arch/ia64/kernel/traps.c
@@ -21,12 +21,26 @@
21#include <asm/intrinsics.h> 21#include <asm/intrinsics.h>
22#include <asm/processor.h> 22#include <asm/processor.h>
23#include <asm/uaccess.h> 23#include <asm/uaccess.h>
24#include <asm/kdebug.h>
24 25
25extern spinlock_t timerlist_lock; 26extern spinlock_t timerlist_lock;
26 27
27fpswa_interface_t *fpswa_interface; 28fpswa_interface_t *fpswa_interface;
28EXPORT_SYMBOL(fpswa_interface); 29EXPORT_SYMBOL(fpswa_interface);
29 30
31struct notifier_block *ia64die_chain;
32static DEFINE_SPINLOCK(die_notifier_lock);
33
34int register_die_notifier(struct notifier_block *nb)
35{
36 int err = 0;
37 unsigned long flags;
38 spin_lock_irqsave(&die_notifier_lock, flags);
39 err = notifier_chain_register(&ia64die_chain, nb);
40 spin_unlock_irqrestore(&die_notifier_lock, flags);
41 return err;
42}
43
30void __init 44void __init
31trap_init (void) 45trap_init (void)
32{ 46{
@@ -137,6 +151,10 @@ ia64_bad_break (unsigned long break_num, struct pt_regs *regs)
137 151
138 switch (break_num) { 152 switch (break_num) {
139 case 0: /* unknown error (used by GCC for __builtin_abort()) */ 153 case 0: /* unknown error (used by GCC for __builtin_abort()) */
154 if (notify_die(DIE_BREAK, "break 0", regs, break_num, TRAP_BRKPT, SIGTRAP)
155 == NOTIFY_STOP) {
156 return;
157 }
140 die_if_kernel("bugcheck!", regs, break_num); 158 die_if_kernel("bugcheck!", regs, break_num);
141 sig = SIGILL; code = ILL_ILLOPC; 159 sig = SIGILL; code = ILL_ILLOPC;
142 break; 160 break;
@@ -189,6 +207,15 @@ ia64_bad_break (unsigned long break_num, struct pt_regs *regs)
189 sig = SIGILL; code = __ILL_BNDMOD; 207 sig = SIGILL; code = __ILL_BNDMOD;
190 break; 208 break;
191 209
210 case 0x80200:
211 case 0x80300:
212 if (notify_die(DIE_BREAK, "kprobe", regs, break_num, TRAP_BRKPT, SIGTRAP)
213 == NOTIFY_STOP) {
214 return;
215 }
216 sig = SIGTRAP; code = TRAP_BRKPT;
217 break;
218
192 default: 219 default:
193 if (break_num < 0x40000 || break_num > 0x100000) 220 if (break_num < 0x40000 || break_num > 0x100000)
194 die_if_kernel("Bad break", regs, break_num); 221 die_if_kernel("Bad break", regs, break_num);
@@ -548,7 +575,11 @@ ia64_fault (unsigned long vector, unsigned long isr, unsigned long ifa,
548#endif 575#endif
549 break; 576 break;
550 case 35: siginfo.si_code = TRAP_BRANCH; ifa = 0; break; 577 case 35: siginfo.si_code = TRAP_BRANCH; ifa = 0; break;
551 case 36: siginfo.si_code = TRAP_TRACE; ifa = 0; break; 578 case 36:
579 if (notify_die(DIE_SS, "ss", &regs, vector,
580 vector, SIGTRAP) == NOTIFY_STOP)
581 return;
582 siginfo.si_code = TRAP_TRACE; ifa = 0; break;
552 } 583 }
553 siginfo.si_signo = SIGTRAP; 584 siginfo.si_signo = SIGTRAP;
554 siginfo.si_errno = 0; 585 siginfo.si_errno = 0;
diff --git a/arch/ia64/kernel/uncached.c b/arch/ia64/kernel/uncached.c
new file mode 100644
index 000000000000..490dfc9ab47f
--- /dev/null
+++ b/arch/ia64/kernel/uncached.c
@@ -0,0 +1,246 @@
1/*
2 * Copyright (C) 2001-2005 Silicon Graphics, Inc. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of version 2 of the GNU General Public License
6 * as published by the Free Software Foundation.
7 *
8 * A simple uncached page allocator using the generic allocator. This
9 * allocator first utilizes the spare (spill) pages found in the EFI
10 * memmap and will then start converting cached pages to uncached ones
11 * at a granule at a time. Node awareness is implemented by having a
12 * pool of pages per node.
13 */
14
15#include <linux/types.h>
16#include <linux/kernel.h>
17#include <linux/module.h>
18#include <linux/init.h>
19#include <linux/errno.h>
20#include <linux/string.h>
21#include <linux/slab.h>
22#include <linux/efi.h>
23#include <linux/genalloc.h>
24#include <asm/page.h>
25#include <asm/pal.h>
26#include <asm/system.h>
27#include <asm/pgtable.h>
28#include <asm/atomic.h>
29#include <asm/tlbflush.h>
30#include <asm/sn/arch.h>
31
32#define DEBUG 0
33
34#if DEBUG
35#define dprintk printk
36#else
37#define dprintk(x...) do { } while (0)
38#endif
39
40void __init efi_memmap_walk_uc (efi_freemem_callback_t callback);
41
42#define MAX_UNCACHED_GRANULES 5
43static int allocated_granules;
44
45struct gen_pool *uncached_pool[MAX_NUMNODES];
46
47
48static void uncached_ipi_visibility(void *data)
49{
50 int status;
51
52 status = ia64_pal_prefetch_visibility(PAL_VISIBILITY_PHYSICAL);
53 if ((status != PAL_VISIBILITY_OK) &&
54 (status != PAL_VISIBILITY_OK_REMOTE_NEEDED))
55 printk(KERN_DEBUG "pal_prefetch_visibility() returns %i on "
56 "CPU %i\n", status, get_cpu());
57}
58
59
60static void uncached_ipi_mc_drain(void *data)
61{
62 int status;
63 status = ia64_pal_mc_drain();
64 if (status)
65 printk(KERN_WARNING "ia64_pal_mc_drain() failed with %i on "
66 "CPU %i\n", status, get_cpu());
67}
68
69
70static unsigned long
71uncached_get_new_chunk(struct gen_pool *poolp)
72{
73 struct page *page;
74 void *tmp;
75 int status, i;
76 unsigned long addr, node;
77
78 if (allocated_granules >= MAX_UNCACHED_GRANULES)
79 return 0;
80
81 node = poolp->private;
82 page = alloc_pages_node(node, GFP_KERNEL | __GFP_ZERO,
83 IA64_GRANULE_SHIFT-PAGE_SHIFT);
84
85 dprintk(KERN_INFO "get_new_chunk page %p, addr %lx\n",
86 page, (unsigned long)(page-vmem_map) << PAGE_SHIFT);
87
88 /*
89 * Do magic if no mem on local node! XXX
90 */
91 if (!page)
92 return 0;
93 tmp = page_address(page);
94
95 /*
96 * There's a small race here where it's possible for someone to
97 * access the page through /dev/mem halfway through the conversion
98 * to uncached - not sure it's really worth bothering about
99 */
100 for (i = 0; i < (IA64_GRANULE_SIZE / PAGE_SIZE); i++)
101 SetPageUncached(&page[i]);
102
103 flush_tlb_kernel_range(tmp, tmp + IA64_GRANULE_SIZE);
104
105 status = ia64_pal_prefetch_visibility(PAL_VISIBILITY_PHYSICAL);
106
107 dprintk(KERN_INFO "pal_prefetch_visibility() returns %i on cpu %i\n",
108 status, get_cpu());
109
110 if (!status) {
111 status = smp_call_function(uncached_ipi_visibility, NULL, 0, 1);
112 if (status)
113 printk(KERN_WARNING "smp_call_function failed for "
114 "uncached_ipi_visibility! (%i)\n", status);
115 }
116
117 if (ia64_platform_is("sn2"))
118 sn_flush_all_caches((unsigned long)tmp, IA64_GRANULE_SIZE);
119 else
120 flush_icache_range((unsigned long)tmp,
121 (unsigned long)tmp+IA64_GRANULE_SIZE);
122
123 ia64_pal_mc_drain();
124 status = smp_call_function(uncached_ipi_mc_drain, NULL, 0, 1);
125 if (status)
126 printk(KERN_WARNING "smp_call_function failed for "
127 "uncached_ipi_mc_drain! (%i)\n", status);
128
129 addr = (unsigned long)tmp - PAGE_OFFSET + __IA64_UNCACHED_OFFSET;
130
131 allocated_granules++;
132 return addr;
133}
134
135
136/*
137 * uncached_alloc_page
138 *
139 * Allocate 1 uncached page. Allocates on the requested node. If no
140 * uncached pages are available on the requested node, roundrobin starting
141 * with higher nodes.
142 */
143unsigned long
144uncached_alloc_page(int nid)
145{
146 unsigned long maddr;
147
148 maddr = gen_pool_alloc(uncached_pool[nid], PAGE_SIZE);
149
150 dprintk(KERN_DEBUG "uncached_alloc_page returns %lx on node %i\n",
151 maddr, nid);
152
153 /*
154 * If no memory is availble on our local node, try the
155 * remaining nodes in the system.
156 */
157 if (!maddr) {
158 int i;
159
160 for (i = MAX_NUMNODES - 1; i >= 0; i--) {
161 if (i == nid || !node_online(i))
162 continue;
163 maddr = gen_pool_alloc(uncached_pool[i], PAGE_SIZE);
164 dprintk(KERN_DEBUG "uncached_alloc_page alternate search "
165 "returns %lx on node %i\n", maddr, i);
166 if (maddr) {
167 break;
168 }
169 }
170 }
171
172 return maddr;
173}
174EXPORT_SYMBOL(uncached_alloc_page);
175
176
177/*
178 * uncached_free_page
179 *
180 * Free a single uncached page.
181 */
182void
183uncached_free_page(unsigned long maddr)
184{
185 int node;
186
187 node = nasid_to_cnodeid(NASID_GET(maddr));
188
189 dprintk(KERN_DEBUG "uncached_free_page(%lx) on node %i\n", maddr, node);
190
191 if ((maddr & (0XFUL << 60)) != __IA64_UNCACHED_OFFSET)
192 panic("uncached_free_page invalid address %lx\n", maddr);
193
194 gen_pool_free(uncached_pool[node], maddr, PAGE_SIZE);
195}
196EXPORT_SYMBOL(uncached_free_page);
197
198
199/*
200 * uncached_build_memmap,
201 *
202 * Called at boot time to build a map of pages that can be used for
203 * memory special operations.
204 */
205static int __init
206uncached_build_memmap(unsigned long start, unsigned long end, void *arg)
207{
208 long length;
209 unsigned long vstart, vend;
210 int node;
211
212 length = end - start;
213 vstart = start + __IA64_UNCACHED_OFFSET;
214 vend = end + __IA64_UNCACHED_OFFSET;
215
216 dprintk(KERN_ERR "uncached_build_memmap(%lx %lx)\n", start, end);
217
218 memset((char *)vstart, 0, length);
219
220 node = nasid_to_cnodeid(NASID_GET(start));
221
222 for (; vstart < vend ; vstart += PAGE_SIZE) {
223 dprintk(KERN_INFO "sticking %lx into the pool!\n", vstart);
224 gen_pool_free(uncached_pool[node], vstart, PAGE_SIZE);
225 }
226
227 return 0;
228}
229
230
231static int __init uncached_init(void) {
232 int i;
233
234 for (i = 0; i < MAX_NUMNODES; i++) {
235 if (!node_online(i))
236 continue;
237 uncached_pool[i] = gen_pool_create(0, IA64_GRANULE_SHIFT,
238 &uncached_get_new_chunk, i);
239 }
240
241 efi_memmap_walk_uc(uncached_build_memmap);
242
243 return 0;
244}
245
246__initcall(uncached_init);
diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S
index b9f0db4c1b04..a676e79e0681 100644
--- a/arch/ia64/kernel/vmlinux.lds.S
+++ b/arch/ia64/kernel/vmlinux.lds.S
@@ -8,6 +8,11 @@
8#define LOAD_OFFSET (KERNEL_START - KERNEL_TR_PAGE_SIZE) 8#define LOAD_OFFSET (KERNEL_START - KERNEL_TR_PAGE_SIZE)
9#include <asm-generic/vmlinux.lds.h> 9#include <asm-generic/vmlinux.lds.h>
10 10
11#define IVT_TEXT \
12 VMLINUX_SYMBOL(__start_ivt_text) = .; \
13 *(.text.ivt) \
14 VMLINUX_SYMBOL(__end_ivt_text) = .;
15
11OUTPUT_FORMAT("elf64-ia64-little") 16OUTPUT_FORMAT("elf64-ia64-little")
12OUTPUT_ARCH(ia64) 17OUTPUT_ARCH(ia64)
13ENTRY(phys_start) 18ENTRY(phys_start)
@@ -39,7 +44,7 @@ SECTIONS
39 44
40 .text : AT(ADDR(.text) - LOAD_OFFSET) 45 .text : AT(ADDR(.text) - LOAD_OFFSET)
41 { 46 {
42 *(.text.ivt) 47 IVT_TEXT
43 *(.text) 48 *(.text)
44 SCHED_TEXT 49 SCHED_TEXT
45 LOCK_TEXT 50 LOCK_TEXT
diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c
index c00710929390..f3fd528ead3b 100644
--- a/arch/ia64/mm/discontig.c
+++ b/arch/ia64/mm/discontig.c
@@ -560,14 +560,15 @@ void show_mem(void)
560 int shared = 0, cached = 0, reserved = 0; 560 int shared = 0, cached = 0, reserved = 0;
561 printk("Node ID: %d\n", pgdat->node_id); 561 printk("Node ID: %d\n", pgdat->node_id);
562 for(i = 0; i < pgdat->node_spanned_pages; i++) { 562 for(i = 0; i < pgdat->node_spanned_pages; i++) {
563 struct page *page = pgdat_page_nr(pgdat, i);
563 if (!ia64_pfn_valid(pgdat->node_start_pfn+i)) 564 if (!ia64_pfn_valid(pgdat->node_start_pfn+i))
564 continue; 565 continue;
565 if (PageReserved(pgdat->node_mem_map+i)) 566 if (PageReserved(page))
566 reserved++; 567 reserved++;
567 else if (PageSwapCache(pgdat->node_mem_map+i)) 568 else if (PageSwapCache(page))
568 cached++; 569 cached++;
569 else if (page_count(pgdat->node_mem_map+i)) 570 else if (page_count(page))
570 shared += page_count(pgdat->node_mem_map+i)-1; 571 shared += page_count(page)-1;
571 } 572 }
572 total_present += present; 573 total_present += present;
573 total_reserved += reserved; 574 total_reserved += reserved;
diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c
index 4174ec999dde..ff62551eb3a1 100644
--- a/arch/ia64/mm/fault.c
+++ b/arch/ia64/mm/fault.c
@@ -14,6 +14,7 @@
14#include <asm/processor.h> 14#include <asm/processor.h>
15#include <asm/system.h> 15#include <asm/system.h>
16#include <asm/uaccess.h> 16#include <asm/uaccess.h>
17#include <asm/kdebug.h>
17 18
18extern void die (char *, struct pt_regs *, long); 19extern void die (char *, struct pt_regs *, long);
19 20
@@ -102,6 +103,13 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re
102 goto bad_area_no_up; 103 goto bad_area_no_up;
103#endif 104#endif
104 105
106 /*
107 * This is to handle the kprobes on user space access instructions
108 */
109 if (notify_die(DIE_PAGE_FAULT, "page fault", regs, code, TRAP_BRKPT,
110 SIGSEGV) == NOTIFY_STOP)
111 return;
112
105 down_read(&mm->mmap_sem); 113 down_read(&mm->mmap_sem);
106 114
107 vma = find_vma_prev(mm, address, &prev_vma); 115 vma = find_vma_prev(mm, address, &prev_vma);
diff --git a/arch/ia64/mm/hugetlbpage.c b/arch/ia64/mm/hugetlbpage.c
index df08ae7634b6..e0a776a3044c 100644
--- a/arch/ia64/mm/hugetlbpage.c
+++ b/arch/ia64/mm/hugetlbpage.c
@@ -24,7 +24,7 @@
24 24
25unsigned int hpage_shift=HPAGE_SHIFT_DEFAULT; 25unsigned int hpage_shift=HPAGE_SHIFT_DEFAULT;
26 26
27static pte_t * 27pte_t *
28huge_pte_alloc (struct mm_struct *mm, unsigned long addr) 28huge_pte_alloc (struct mm_struct *mm, unsigned long addr)
29{ 29{
30 unsigned long taddr = htlbpage_to_page(addr); 30 unsigned long taddr = htlbpage_to_page(addr);
@@ -43,7 +43,7 @@ huge_pte_alloc (struct mm_struct *mm, unsigned long addr)
43 return pte; 43 return pte;
44} 44}
45 45
46static pte_t * 46pte_t *
47huge_pte_offset (struct mm_struct *mm, unsigned long addr) 47huge_pte_offset (struct mm_struct *mm, unsigned long addr)
48{ 48{
49 unsigned long taddr = htlbpage_to_page(addr); 49 unsigned long taddr = htlbpage_to_page(addr);
@@ -67,23 +67,6 @@ huge_pte_offset (struct mm_struct *mm, unsigned long addr)
67 67
68#define mk_pte_huge(entry) { pte_val(entry) |= _PAGE_P; } 68#define mk_pte_huge(entry) { pte_val(entry) |= _PAGE_P; }
69 69
70static void
71set_huge_pte (struct mm_struct *mm, struct vm_area_struct *vma,
72 struct page *page, pte_t * page_table, int write_access)
73{
74 pte_t entry;
75
76 add_mm_counter(mm, rss, HPAGE_SIZE / PAGE_SIZE);
77 if (write_access) {
78 entry =
79 pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot)));
80 } else
81 entry = pte_wrprotect(mk_pte(page, vma->vm_page_prot));
82 entry = pte_mkyoung(entry);
83 mk_pte_huge(entry);
84 set_pte(page_table, entry);
85 return;
86}
87/* 70/*
88 * This function checks for proper alignment of input addr and len parameters. 71 * This function checks for proper alignment of input addr and len parameters.
89 */ 72 */
@@ -99,68 +82,6 @@ int is_aligned_hugepage_range(unsigned long addr, unsigned long len)
99 return 0; 82 return 0;
100} 83}
101 84
102int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src,
103 struct vm_area_struct *vma)
104{
105 pte_t *src_pte, *dst_pte, entry;
106 struct page *ptepage;
107 unsigned long addr = vma->vm_start;
108 unsigned long end = vma->vm_end;
109
110 while (addr < end) {
111 dst_pte = huge_pte_alloc(dst, addr);
112 if (!dst_pte)
113 goto nomem;
114 src_pte = huge_pte_offset(src, addr);
115 entry = *src_pte;
116 ptepage = pte_page(entry);
117 get_page(ptepage);
118 set_pte(dst_pte, entry);
119 add_mm_counter(dst, rss, HPAGE_SIZE / PAGE_SIZE);
120 addr += HPAGE_SIZE;
121 }
122 return 0;
123nomem:
124 return -ENOMEM;
125}
126
127int
128follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma,
129 struct page **pages, struct vm_area_struct **vmas,
130 unsigned long *st, int *length, int i)
131{
132 pte_t *ptep, pte;
133 unsigned long start = *st;
134 unsigned long pstart;
135 int len = *length;
136 struct page *page;
137
138 do {
139 pstart = start & HPAGE_MASK;
140 ptep = huge_pte_offset(mm, start);
141 pte = *ptep;
142
143back1:
144 page = pte_page(pte);
145 if (pages) {
146 page += ((start & ~HPAGE_MASK) >> PAGE_SHIFT);
147 get_page(page);
148 pages[i] = page;
149 }
150 if (vmas)
151 vmas[i] = vma;
152 i++;
153 len--;
154 start += PAGE_SIZE;
155 if (((start & HPAGE_MASK) == pstart) && len &&
156 (start < vma->vm_end))
157 goto back1;
158 } while (len && start < vma->vm_end);
159 *length = len;
160 *st = start;
161 return i;
162}
163
164struct page *follow_huge_addr(struct mm_struct *mm, unsigned long addr, int write) 85struct page *follow_huge_addr(struct mm_struct *mm, unsigned long addr, int write)
165{ 86{
166 struct page *page; 87 struct page *page;
@@ -212,81 +133,6 @@ void hugetlb_free_pgd_range(struct mmu_gather **tlb,
212 free_pgd_range(tlb, addr, end, floor, ceiling); 133 free_pgd_range(tlb, addr, end, floor, ceiling);
213} 134}
214 135
215void unmap_hugepage_range(struct vm_area_struct *vma, unsigned long start, unsigned long end)
216{
217 struct mm_struct *mm = vma->vm_mm;
218 unsigned long address;
219 pte_t *pte;
220 struct page *page;
221
222 BUG_ON(start & (HPAGE_SIZE - 1));
223 BUG_ON(end & (HPAGE_SIZE - 1));
224
225 for (address = start; address < end; address += HPAGE_SIZE) {
226 pte = huge_pte_offset(mm, address);
227 if (pte_none(*pte))
228 continue;
229 page = pte_page(*pte);
230 put_page(page);
231 pte_clear(mm, address, pte);
232 }
233 add_mm_counter(mm, rss, - ((end - start) >> PAGE_SHIFT));
234 flush_tlb_range(vma, start, end);
235}
236
237int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma)
238{
239 struct mm_struct *mm = current->mm;
240 unsigned long addr;
241 int ret = 0;
242
243 BUG_ON(vma->vm_start & ~HPAGE_MASK);
244 BUG_ON(vma->vm_end & ~HPAGE_MASK);
245
246 spin_lock(&mm->page_table_lock);
247 for (addr = vma->vm_start; addr < vma->vm_end; addr += HPAGE_SIZE) {
248 unsigned long idx;
249 pte_t *pte = huge_pte_alloc(mm, addr);
250 struct page *page;
251
252 if (!pte) {
253 ret = -ENOMEM;
254 goto out;
255 }
256 if (!pte_none(*pte))
257 continue;
258
259 idx = ((addr - vma->vm_start) >> HPAGE_SHIFT)
260 + (vma->vm_pgoff >> (HPAGE_SHIFT - PAGE_SHIFT));
261 page = find_get_page(mapping, idx);
262 if (!page) {
263 /* charge the fs quota first */
264 if (hugetlb_get_quota(mapping)) {
265 ret = -ENOMEM;
266 goto out;
267 }
268 page = alloc_huge_page();
269 if (!page) {
270 hugetlb_put_quota(mapping);
271 ret = -ENOMEM;
272 goto out;
273 }
274 ret = add_to_page_cache(page, mapping, idx, GFP_ATOMIC);
275 if (! ret) {
276 unlock_page(page);
277 } else {
278 hugetlb_put_quota(mapping);
279 page_cache_release(page);
280 goto out;
281 }
282 }
283 set_huge_pte(mm, vma, page, pte, vma->vm_flags & VM_WRITE);
284 }
285out:
286 spin_unlock(&mm->page_table_lock);
287 return ret;
288}
289
290unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len, 136unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,
291 unsigned long pgoff, unsigned long flags) 137 unsigned long pgoff, unsigned long flags)
292{ 138{
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c
index 88641e5095b5..e3fc4edea113 100644
--- a/arch/ia64/pci/pci.c
+++ b/arch/ia64/pci/pci.c
@@ -33,8 +33,6 @@
33#include <asm/hw_irq.h> 33#include <asm/hw_irq.h>
34 34
35 35
36static int pci_routeirq;
37
38/* 36/*
39 * Low-level SAL-based PCI configuration access functions. Note that SAL 37 * Low-level SAL-based PCI configuration access functions. Note that SAL
40 * calls are already serialized (via sal_lock), so we don't need another 38 * calls are already serialized (via sal_lock), so we don't need another
@@ -139,24 +137,8 @@ static void acpi_map_iosapics(void)
139static int __init 137static int __init
140pci_acpi_init (void) 138pci_acpi_init (void)
141{ 139{
142 struct pci_dev *dev = NULL;
143
144 printk(KERN_INFO "PCI: Using ACPI for IRQ routing\n");
145
146 acpi_map_iosapics(); 140 acpi_map_iosapics();
147 141
148 if (pci_routeirq) {
149 /*
150 * PCI IRQ routing is set up by pci_enable_device(), but we
151 * also do it here in case there are still broken drivers that
152 * don't use pci_enable_device().
153 */
154 printk(KERN_INFO "PCI: Routing interrupts for all devices because \"pci=routeirq\" specified\n");
155 for_each_pci_dev(dev)
156 acpi_pci_irq_enable(dev);
157 } else
158 printk(KERN_INFO "PCI: If a device doesn't work, try \"pci=routeirq\". If it helps, post a report\n");
159
160 return 0; 142 return 0;
161} 143}
162 144
@@ -500,8 +482,6 @@ pcibios_align_resource (void *data, struct resource *res,
500char * __init 482char * __init
501pcibios_setup (char *str) 483pcibios_setup (char *str)
502{ 484{
503 if (!strcmp(str, "routeirq"))
504 pci_routeirq = 1;
505 return NULL; 485 return NULL;
506} 486}
507 487
diff --git a/arch/ia64/sn/kernel/tiocx.c b/arch/ia64/sn/kernel/tiocx.c
index ab9b5f35c2a7..a087b274847e 100644
--- a/arch/ia64/sn/kernel/tiocx.c
+++ b/arch/ia64/sn/kernel/tiocx.c
@@ -432,7 +432,7 @@ static int tiocx_reload(struct cx_dev *cx_dev)
432 return cx_device_reload(cx_dev); 432 return cx_device_reload(cx_dev);
433} 433}
434 434
435static ssize_t show_cxdev_control(struct device *dev, char *buf) 435static ssize_t show_cxdev_control(struct device *dev, struct device_attribute *attr, char *buf)
436{ 436{
437 struct cx_dev *cx_dev = to_cx_dev(dev); 437 struct cx_dev *cx_dev = to_cx_dev(dev);
438 438
@@ -442,7 +442,7 @@ static ssize_t show_cxdev_control(struct device *dev, char *buf)
442 tiocx_btchar_get(cx_dev->cx_id.nasid)); 442 tiocx_btchar_get(cx_dev->cx_id.nasid));
443} 443}
444 444
445static ssize_t store_cxdev_control(struct device *dev, const char *buf, 445static ssize_t store_cxdev_control(struct device *dev, struct device_attribute *attr, const char *buf,
446 size_t count) 446 size_t count)
447{ 447{
448 int n; 448 int n;
@@ -518,25 +518,22 @@ static int __init tiocx_init(void)
518 return 0; 518 return 0;
519} 519}
520 520
521static void __exit tiocx_exit(void) 521static int cx_remove_device(struct device * dev, void * data)
522{ 522{
523 struct device *dev; 523 struct cx_dev *cx_dev = to_cx_dev(dev);
524 struct device *tdev; 524 device_remove_file(dev, &dev_attr_cxdev_control);
525 cx_device_unregister(cx_dev);
526 return 0;
527}
525 528
529static void __exit tiocx_exit(void)
530{
526 DBG("tiocx_exit\n"); 531 DBG("tiocx_exit\n");
527 532
528 /* 533 /*
529 * Unregister devices. 534 * Unregister devices.
530 */ 535 */
531 list_for_each_entry_safe(dev, tdev, &tiocx_bus_type.devices.list, 536 bus_for_each_dev(&tiocx_bus_type, NULL, NULL, cx_remove_device);
532 bus_list) {
533 if (dev) {
534 struct cx_dev *cx_dev = to_cx_dev(dev);
535 device_remove_file(dev, &dev_attr_cxdev_control);
536 cx_device_unregister(cx_dev);
537 }
538 }
539
540 bus_unregister(&tiocx_bus_type); 537 bus_unregister(&tiocx_bus_type);
541} 538}
542 539
diff --git a/arch/ia64/sn/kernel/xpc.h b/arch/ia64/sn/kernel/xpc.h
index 1a0aed8490d1..d0ee635daf2e 100644
--- a/arch/ia64/sn/kernel/xpc.h
+++ b/arch/ia64/sn/kernel/xpc.h
@@ -87,7 +87,7 @@ struct xpc_rsvd_page {
87 u8 partid; /* partition ID from SAL */ 87 u8 partid; /* partition ID from SAL */
88 u8 version; 88 u8 version;
89 u8 pad[6]; /* pad to u64 align */ 89 u8 pad[6]; /* pad to u64 align */
90 u64 vars_pa; 90 volatile u64 vars_pa;
91 u64 part_nasids[XP_NASID_MASK_WORDS] ____cacheline_aligned; 91 u64 part_nasids[XP_NASID_MASK_WORDS] ____cacheline_aligned;
92 u64 mach_nasids[XP_NASID_MASK_WORDS] ____cacheline_aligned; 92 u64 mach_nasids[XP_NASID_MASK_WORDS] ____cacheline_aligned;
93}; 93};
@@ -138,7 +138,7 @@ struct xpc_vars {
138 * occupies half a cacheline. 138 * occupies half a cacheline.
139 */ 139 */
140struct xpc_vars_part { 140struct xpc_vars_part {
141 u64 magic; 141 volatile u64 magic;
142 142
143 u64 openclose_args_pa; /* physical address of open and close args */ 143 u64 openclose_args_pa; /* physical address of open and close args */
144 u64 GPs_pa; /* physical address of Get/Put values */ 144 u64 GPs_pa; /* physical address of Get/Put values */
@@ -185,8 +185,8 @@ struct xpc_vars_part {
185 * Define a Get/Put value pair (pointers) used with a message queue. 185 * Define a Get/Put value pair (pointers) used with a message queue.
186 */ 186 */
187struct xpc_gp { 187struct xpc_gp {
188 s64 get; /* Get value */ 188 volatile s64 get; /* Get value */
189 s64 put; /* Put value */ 189 volatile s64 put; /* Put value */
190}; 190};
191 191
192#define XPC_GP_SIZE \ 192#define XPC_GP_SIZE \
@@ -231,7 +231,7 @@ struct xpc_openclose_args {
231 */ 231 */
232struct xpc_notify { 232struct xpc_notify {
233 struct semaphore sema; /* notify semaphore */ 233 struct semaphore sema; /* notify semaphore */
234 u8 type; /* type of notification */ 234 volatile u8 type; /* type of notification */
235 235
236 /* the following two fields are only used if type == XPC_N_CALL */ 236 /* the following two fields are only used if type == XPC_N_CALL */
237 xpc_notify_func func; /* user's notify function */ 237 xpc_notify_func func; /* user's notify function */
@@ -439,7 +439,7 @@ struct xpc_partition {
439 439
440 /* XPC infrastructure referencing and teardown control */ 440 /* XPC infrastructure referencing and teardown control */
441 441
442 u8 setup_state; /* infrastructure setup state */ 442 volatile u8 setup_state; /* infrastructure setup state */
443 wait_queue_head_t teardown_wq; /* kthread waiting to teardown infra */ 443 wait_queue_head_t teardown_wq; /* kthread waiting to teardown infra */
444 atomic_t references; /* #of references to infrastructure */ 444 atomic_t references; /* #of references to infrastructure */
445 445
diff --git a/arch/ia64/sn/kernel/xpc_channel.c b/arch/ia64/sn/kernel/xpc_channel.c
index 0bf6fbcc46d2..6d02dac8056f 100644
--- a/arch/ia64/sn/kernel/xpc_channel.c
+++ b/arch/ia64/sn/kernel/xpc_channel.c
@@ -209,7 +209,7 @@ xpc_setup_infrastructure(struct xpc_partition *part)
209 * With the setting of the partition setup_state to XPC_P_SETUP, we're 209 * With the setting of the partition setup_state to XPC_P_SETUP, we're
210 * declaring that this partition is ready to go. 210 * declaring that this partition is ready to go.
211 */ 211 */
212 (volatile u8) part->setup_state = XPC_P_SETUP; 212 part->setup_state = XPC_P_SETUP;
213 213
214 214
215 /* 215 /*
@@ -227,7 +227,7 @@ xpc_setup_infrastructure(struct xpc_partition *part)
227 xpc_vars_part[partid].IPI_phys_cpuid = 227 xpc_vars_part[partid].IPI_phys_cpuid =
228 cpu_physical_id(smp_processor_id()); 228 cpu_physical_id(smp_processor_id());
229 xpc_vars_part[partid].nchannels = part->nchannels; 229 xpc_vars_part[partid].nchannels = part->nchannels;
230 (volatile u64) xpc_vars_part[partid].magic = XPC_VP_MAGIC1; 230 xpc_vars_part[partid].magic = XPC_VP_MAGIC1;
231 231
232 return xpcSuccess; 232 return xpcSuccess;
233} 233}
@@ -355,7 +355,7 @@ xpc_pull_remote_vars_part(struct xpc_partition *part)
355 355
356 /* let the other side know that we've pulled their variables */ 356 /* let the other side know that we've pulled their variables */
357 357
358 (volatile u64) xpc_vars_part[partid].magic = XPC_VP_MAGIC2; 358 xpc_vars_part[partid].magic = XPC_VP_MAGIC2;
359 } 359 }
360 360
361 if (pulled_entry->magic == XPC_VP_MAGIC1) { 361 if (pulled_entry->magic == XPC_VP_MAGIC1) {
@@ -1183,7 +1183,7 @@ xpc_process_msg_IPI(struct xpc_partition *part, int ch_number)
1183 */ 1183 */
1184 xpc_clear_local_msgqueue_flags(ch); 1184 xpc_clear_local_msgqueue_flags(ch);
1185 1185
1186 (volatile s64) ch->w_remote_GP.get = ch->remote_GP.get; 1186 ch->w_remote_GP.get = ch->remote_GP.get;
1187 1187
1188 dev_dbg(xpc_chan, "w_remote_GP.get changed to %ld, partid=%d, " 1188 dev_dbg(xpc_chan, "w_remote_GP.get changed to %ld, partid=%d, "
1189 "channel=%d\n", ch->w_remote_GP.get, ch->partid, 1189 "channel=%d\n", ch->w_remote_GP.get, ch->partid,
@@ -1211,7 +1211,7 @@ xpc_process_msg_IPI(struct xpc_partition *part, int ch_number)
1211 */ 1211 */
1212 xpc_clear_remote_msgqueue_flags(ch); 1212 xpc_clear_remote_msgqueue_flags(ch);
1213 1213
1214 (volatile s64) ch->w_remote_GP.put = ch->remote_GP.put; 1214 ch->w_remote_GP.put = ch->remote_GP.put;
1215 1215
1216 dev_dbg(xpc_chan, "w_remote_GP.put changed to %ld, partid=%d, " 1216 dev_dbg(xpc_chan, "w_remote_GP.put changed to %ld, partid=%d, "
1217 "channel=%d\n", ch->w_remote_GP.put, ch->partid, 1217 "channel=%d\n", ch->w_remote_GP.put, ch->partid,
@@ -1875,7 +1875,7 @@ xpc_send_msg(struct xpc_channel *ch, struct xpc_msg *msg, u8 notify_type,
1875 notify = &ch->notify_queue[msg_number % ch->local_nentries]; 1875 notify = &ch->notify_queue[msg_number % ch->local_nentries];
1876 notify->func = func; 1876 notify->func = func;
1877 notify->key = key; 1877 notify->key = key;
1878 (volatile u8) notify->type = notify_type; 1878 notify->type = notify_type;
1879 1879
1880 // >>> is a mb() needed here? 1880 // >>> is a mb() needed here?
1881 1881
diff --git a/arch/ia64/sn/kernel/xpc_partition.c b/arch/ia64/sn/kernel/xpc_partition.c
index 2c3c4a8af553..578265ea9e67 100644
--- a/arch/ia64/sn/kernel/xpc_partition.c
+++ b/arch/ia64/sn/kernel/xpc_partition.c
@@ -22,6 +22,7 @@
22#include <linux/cache.h> 22#include <linux/cache.h>
23#include <linux/mmzone.h> 23#include <linux/mmzone.h>
24#include <linux/nodemask.h> 24#include <linux/nodemask.h>
25#include <asm/uncached.h>
25#include <asm/sn/bte.h> 26#include <asm/sn/bte.h>
26#include <asm/sn/intr.h> 27#include <asm/sn/intr.h>
27#include <asm/sn/sn_sal.h> 28#include <asm/sn/sn_sal.h>
@@ -183,7 +184,7 @@ xpc_rsvd_page_init(void)
183 * memory protections are never restricted. 184 * memory protections are never restricted.
184 */ 185 */
185 if ((amos_page = xpc_vars->amos_page) == NULL) { 186 if ((amos_page = xpc_vars->amos_page) == NULL) {
186 amos_page = (AMO_t *) mspec_kalloc_page(0); 187 amos_page = (AMO_t *) TO_AMO(uncached_alloc_page(0));
187 if (amos_page == NULL) { 188 if (amos_page == NULL) {
188 dev_err(xpc_part, "can't allocate page of AMOs\n"); 189 dev_err(xpc_part, "can't allocate page of AMOs\n");
189 return NULL; 190 return NULL;
@@ -200,7 +201,8 @@ xpc_rsvd_page_init(void)
200 if (ret != 0) { 201 if (ret != 0) {
201 dev_err(xpc_part, "can't change memory " 202 dev_err(xpc_part, "can't change memory "
202 "protections\n"); 203 "protections\n");
203 mspec_kfree_page((unsigned long) amos_page); 204 uncached_free_page(__IA64_UNCACHED_OFFSET |
205 TO_PHYS((u64) amos_page));
204 return NULL; 206 return NULL;
205 } 207 }
206 } 208 }
@@ -251,7 +253,7 @@ xpc_rsvd_page_init(void)
251 * This signifies to the remote partition that our reserved 253 * This signifies to the remote partition that our reserved
252 * page is initialized. 254 * page is initialized.
253 */ 255 */
254 (volatile u64) rp->vars_pa = __pa(xpc_vars); 256 rp->vars_pa = __pa(xpc_vars);
255 257
256 return rp; 258 return rp;
257} 259}