diff options
Diffstat (limited to 'arch/x86_64')
43 files changed, 1941 insertions, 565 deletions
diff --git a/arch/x86_64/Kconfig b/arch/x86_64/Kconfig index e18eb79bf855..4310b4a311a5 100644 --- a/arch/x86_64/Kconfig +++ b/arch/x86_64/Kconfig | |||
@@ -45,6 +45,10 @@ config RWSEM_GENERIC_SPINLOCK | |||
45 | config RWSEM_XCHGADD_ALGORITHM | 45 | config RWSEM_XCHGADD_ALGORITHM |
46 | bool | 46 | bool |
47 | 47 | ||
48 | config GENERIC_HWEIGHT | ||
49 | bool | ||
50 | default y | ||
51 | |||
48 | config GENERIC_CALIBRATE_DELAY | 52 | config GENERIC_CALIBRATE_DELAY |
49 | bool | 53 | bool |
50 | default y | 54 | default y |
@@ -246,6 +250,15 @@ config SCHED_SMT | |||
246 | cost of slightly increased overhead in some places. If unsure say | 250 | cost of slightly increased overhead in some places. If unsure say |
247 | N here. | 251 | N here. |
248 | 252 | ||
253 | config SCHED_MC | ||
254 | bool "Multi-core scheduler support" | ||
255 | depends on SMP | ||
256 | default y | ||
257 | help | ||
258 | Multi-core scheduler support improves the CPU scheduler's decision | ||
259 | making when dealing with multi-core CPU chips at a cost of slightly | ||
260 | increased overhead in some places. If unsure say N here. | ||
261 | |||
249 | source "kernel/Kconfig.preempt" | 262 | source "kernel/Kconfig.preempt" |
250 | 263 | ||
251 | config NUMA | 264 | config NUMA |
@@ -321,9 +334,13 @@ config HAVE_ARCH_EARLY_PFN_TO_NID | |||
321 | def_bool y | 334 | def_bool y |
322 | depends on NUMA | 335 | depends on NUMA |
323 | 336 | ||
337 | config OUT_OF_LINE_PFN_TO_PAGE | ||
338 | def_bool y | ||
339 | depends on DISCONTIGMEM | ||
340 | |||
324 | config NR_CPUS | 341 | config NR_CPUS |
325 | int "Maximum number of CPUs (2-256)" | 342 | int "Maximum number of CPUs (2-256)" |
326 | range 2 256 | 343 | range 2 255 |
327 | depends on SMP | 344 | depends on SMP |
328 | default "8" | 345 | default "8" |
329 | help | 346 | help |
@@ -364,13 +381,15 @@ config GART_IOMMU | |||
364 | select SWIOTLB | 381 | select SWIOTLB |
365 | depends on PCI | 382 | depends on PCI |
366 | help | 383 | help |
367 | Support the IOMMU. Needed to run systems with more than 3GB of memory | 384 | Support for hardware IOMMU in AMD's Opteron/Athlon64 Processors |
368 | properly with 32-bit PCI devices that do not support DAC (Double Address | 385 | and for the bounce buffering software IOMMU. |
369 | Cycle). The IOMMU can be turned off at runtime with the iommu=off parameter. | 386 | Needed to run systems with more than 3GB of memory properly with |
370 | Normally the kernel will take the right choice by itself. | 387 | 32-bit PCI devices that do not support DAC (Double Address Cycle). |
371 | This option includes a driver for the AMD Opteron/Athlon64 northbridge IOMMU | 388 | The IOMMU can be turned off at runtime with the iommu=off parameter. |
372 | and a software emulation used on other systems. | 389 | Normally the kernel will take the right choice by itself. |
373 | If unsure, say Y. | 390 | This option includes a driver for the AMD Opteron/Athlon64 IOMMU |
391 | northbridge and a software emulation used on other systems without | ||
392 | hardware IOMMU. If unsure, say Y. | ||
374 | 393 | ||
375 | # need this always enabled with GART_IOMMU for the VIA workaround | 394 | # need this always enabled with GART_IOMMU for the VIA workaround |
376 | config SWIOTLB | 395 | config SWIOTLB |
@@ -429,10 +448,10 @@ config CRASH_DUMP | |||
429 | config PHYSICAL_START | 448 | config PHYSICAL_START |
430 | hex "Physical address where the kernel is loaded" if (EMBEDDED || CRASH_DUMP) | 449 | hex "Physical address where the kernel is loaded" if (EMBEDDED || CRASH_DUMP) |
431 | default "0x1000000" if CRASH_DUMP | 450 | default "0x1000000" if CRASH_DUMP |
432 | default "0x100000" | 451 | default "0x200000" |
433 | help | 452 | help |
434 | This gives the physical address where the kernel is loaded. Normally | 453 | This gives the physical address where the kernel is loaded. Normally |
435 | for regular kernels this value is 0x100000 (1MB). But in the case | 454 | for regular kernels this value is 0x200000 (2MB). But in the case |
436 | of kexec on panic the fail safe kernel needs to run at a different | 455 | of kexec on panic the fail safe kernel needs to run at a different |
437 | address than the panic-ed kernel. This option is used to set the load | 456 | address than the panic-ed kernel. This option is used to set the load |
438 | address for kernels used to capture crash dump on being kexec'ed | 457 | address for kernels used to capture crash dump on being kexec'ed |
@@ -464,6 +483,14 @@ config SECCOMP | |||
464 | 483 | ||
465 | source kernel/Kconfig.hz | 484 | source kernel/Kconfig.hz |
466 | 485 | ||
486 | config REORDER | ||
487 | bool "Function reordering" | ||
488 | default n | ||
489 | help | ||
490 | This option enables the toolchain to reorder functions for a more | ||
491 | optimal TLB usage. If you have pretty much any version of binutils, | ||
492 | this can increase your kernel build time by roughly one minute. | ||
493 | |||
467 | endmenu | 494 | endmenu |
468 | 495 | ||
469 | # | 496 | # |
@@ -512,16 +539,6 @@ config PCI_MMCONFIG | |||
512 | bool "Support mmconfig PCI config space access" | 539 | bool "Support mmconfig PCI config space access" |
513 | depends on PCI && ACPI | 540 | depends on PCI && ACPI |
514 | 541 | ||
515 | config UNORDERED_IO | ||
516 | bool "Unordered IO mapping access" | ||
517 | depends on EXPERIMENTAL | ||
518 | help | ||
519 | Use unordered stores to access IO memory mappings in device drivers. | ||
520 | Still very experimental. When a driver works on IA64/ppc64/pa-risc it should | ||
521 | work with this option, but it makes the drivers behave differently | ||
522 | from i386. Requires that the driver writer used memory barriers | ||
523 | properly. | ||
524 | |||
525 | source "drivers/pci/pcie/Kconfig" | 542 | source "drivers/pci/pcie/Kconfig" |
526 | 543 | ||
527 | source "drivers/pci/Kconfig" | 544 | source "drivers/pci/Kconfig" |
diff --git a/arch/x86_64/Makefile b/arch/x86_64/Makefile index d7fd46479c55..585fd4a559c8 100644 --- a/arch/x86_64/Makefile +++ b/arch/x86_64/Makefile | |||
@@ -29,12 +29,14 @@ CHECKFLAGS += -D__x86_64__ -m64 | |||
29 | 29 | ||
30 | cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8) | 30 | cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8) |
31 | cflags-$(CONFIG_MPSC) += $(call cc-option,-march=nocona) | 31 | cflags-$(CONFIG_MPSC) += $(call cc-option,-march=nocona) |
32 | cflags-$(CONFIG_GENERIC_CPU) += $(call cc-option,-mtune=generic) | ||
32 | CFLAGS += $(cflags-y) | 33 | CFLAGS += $(cflags-y) |
33 | 34 | ||
34 | CFLAGS += -m64 | 35 | CFLAGS += -m64 |
35 | CFLAGS += -mno-red-zone | 36 | CFLAGS += -mno-red-zone |
36 | CFLAGS += -mcmodel=kernel | 37 | CFLAGS += -mcmodel=kernel |
37 | CFLAGS += -pipe | 38 | CFLAGS += -pipe |
39 | cflags-$(CONFIG_REORDER) += -ffunction-sections | ||
38 | # this makes reading assembly source easier, but produces worse code | 40 | # this makes reading assembly source easier, but produces worse code |
39 | # actually it makes the kernel smaller too. | 41 | # actually it makes the kernel smaller too. |
40 | CFLAGS += -fno-reorder-blocks | 42 | CFLAGS += -fno-reorder-blocks |
@@ -67,8 +69,8 @@ drivers-$(CONFIG_OPROFILE) += arch/x86_64/oprofile/ | |||
67 | 69 | ||
68 | boot := arch/x86_64/boot | 70 | boot := arch/x86_64/boot |
69 | 71 | ||
70 | .PHONY: bzImage bzlilo install archmrproper \ | 72 | PHONY += bzImage bzlilo install archmrproper \ |
71 | fdimage fdimage144 fdimage288 archclean | 73 | fdimage fdimage144 fdimage288 isoimage archclean |
72 | 74 | ||
73 | #Default target when executing "make" | 75 | #Default target when executing "make" |
74 | all: bzImage | 76 | all: bzImage |
@@ -85,7 +87,7 @@ bzlilo: vmlinux | |||
85 | bzdisk: vmlinux | 87 | bzdisk: vmlinux |
86 | $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(BOOTIMAGE) zdisk | 88 | $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(BOOTIMAGE) zdisk |
87 | 89 | ||
88 | fdimage fdimage144 fdimage288: vmlinux | 90 | fdimage fdimage144 fdimage288 isoimage: vmlinux |
89 | $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(BOOTIMAGE) $@ | 91 | $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(BOOTIMAGE) $@ |
90 | 92 | ||
91 | install: | 93 | install: |
@@ -97,11 +99,16 @@ archclean: | |||
97 | define archhelp | 99 | define archhelp |
98 | echo '* bzImage - Compressed kernel image (arch/$(ARCH)/boot/bzImage)' | 100 | echo '* bzImage - Compressed kernel image (arch/$(ARCH)/boot/bzImage)' |
99 | echo ' install - Install kernel using' | 101 | echo ' install - Install kernel using' |
100 | echo ' (your) ~/bin/installkernel or' | 102 | echo ' (your) ~/bin/installkernel or' |
101 | echo ' (distribution) /sbin/installkernel or' | 103 | echo ' (distribution) /sbin/installkernel or' |
102 | echo ' install to $$(INSTALL_PATH) and run lilo' | 104 | echo ' install to $$(INSTALL_PATH) and run lilo' |
105 | echo ' bzdisk - Create a boot floppy in /dev/fd0' | ||
106 | echo ' fdimage - Create a boot floppy image' | ||
107 | echo ' isoimage - Create a boot CD-ROM image' | ||
103 | endef | 108 | endef |
104 | 109 | ||
105 | CLEAN_FILES += arch/$(ARCH)/boot/fdimage arch/$(ARCH)/boot/mtools.conf | 110 | CLEAN_FILES += arch/$(ARCH)/boot/fdimage \ |
111 | arch/$(ARCH)/boot/image.iso \ | ||
112 | arch/$(ARCH)/boot/mtools.conf | ||
106 | 113 | ||
107 | 114 | ||
diff --git a/arch/x86_64/boot/Makefile b/arch/x86_64/boot/Makefile index 29f8396ed151..43ee6c50c277 100644 --- a/arch/x86_64/boot/Makefile +++ b/arch/x86_64/boot/Makefile | |||
@@ -60,8 +60,12 @@ $(obj)/setup $(obj)/bootsect: %: %.o FORCE | |||
60 | $(obj)/compressed/vmlinux: FORCE | 60 | $(obj)/compressed/vmlinux: FORCE |
61 | $(Q)$(MAKE) $(build)=$(obj)/compressed IMAGE_OFFSET=$(IMAGE_OFFSET) $@ | 61 | $(Q)$(MAKE) $(build)=$(obj)/compressed IMAGE_OFFSET=$(IMAGE_OFFSET) $@ |
62 | 62 | ||
63 | # Set this if you want to pass append arguments to the zdisk/fdimage kernel | 63 | # Set this if you want to pass append arguments to the zdisk/fdimage/isoimage kernel |
64 | FDARGS = | 64 | FDARGS = |
65 | # Set this if you want an initrd included with the zdisk/fdimage/isoimage kernel | ||
66 | FDINITRD = | ||
67 | |||
68 | image_cmdline = default linux $(FDARGS) $(if $(FDINITRD),initrd=initrd.img,) | ||
65 | 69 | ||
66 | $(obj)/mtools.conf: $(src)/mtools.conf.in | 70 | $(obj)/mtools.conf: $(src)/mtools.conf.in |
67 | sed -e 's|@OBJ@|$(obj)|g' < $< > $@ | 71 | sed -e 's|@OBJ@|$(obj)|g' < $< > $@ |
@@ -70,8 +74,11 @@ $(obj)/mtools.conf: $(src)/mtools.conf.in | |||
70 | zdisk: $(BOOTIMAGE) $(obj)/mtools.conf | 74 | zdisk: $(BOOTIMAGE) $(obj)/mtools.conf |
71 | MTOOLSRC=$(obj)/mtools.conf mformat a: ; sync | 75 | MTOOLSRC=$(obj)/mtools.conf mformat a: ; sync |
72 | syslinux /dev/fd0 ; sync | 76 | syslinux /dev/fd0 ; sync |
73 | echo 'default linux $(FDARGS)' | \ | 77 | echo '$(image_cmdline)' | \ |
74 | MTOOLSRC=$(obj)/mtools.conf mcopy - a:syslinux.cfg | 78 | MTOOLSRC=$(obj)/mtools.conf mcopy - a:syslinux.cfg |
79 | if [ -f '$(FDINITRD)' ] ; then \ | ||
80 | MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' a:initrd.img ; \ | ||
81 | fi | ||
75 | MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) a:linux ; sync | 82 | MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) a:linux ; sync |
76 | 83 | ||
77 | # These require being root or having syslinux 2.02 or higher installed | 84 | # These require being root or having syslinux 2.02 or higher installed |
@@ -79,18 +86,39 @@ fdimage fdimage144: $(BOOTIMAGE) $(obj)/mtools.conf | |||
79 | dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=1440 | 86 | dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=1440 |
80 | MTOOLSRC=$(obj)/mtools.conf mformat v: ; sync | 87 | MTOOLSRC=$(obj)/mtools.conf mformat v: ; sync |
81 | syslinux $(obj)/fdimage ; sync | 88 | syslinux $(obj)/fdimage ; sync |
82 | echo 'default linux $(FDARGS)' | \ | 89 | echo '$(image_cmdline)' | \ |
83 | MTOOLSRC=$(obj)/mtools.conf mcopy - v:syslinux.cfg | 90 | MTOOLSRC=$(obj)/mtools.conf mcopy - v:syslinux.cfg |
91 | if [ -f '$(FDINITRD)' ] ; then \ | ||
92 | MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' v:initrd.img ; \ | ||
93 | fi | ||
84 | MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) v:linux ; sync | 94 | MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) v:linux ; sync |
85 | 95 | ||
86 | fdimage288: $(BOOTIMAGE) $(obj)/mtools.conf | 96 | fdimage288: $(BOOTIMAGE) $(obj)/mtools.conf |
87 | dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=2880 | 97 | dd if=/dev/zero of=$(obj)/fdimage bs=1024 count=2880 |
88 | MTOOLSRC=$(obj)/mtools.conf mformat w: ; sync | 98 | MTOOLSRC=$(obj)/mtools.conf mformat w: ; sync |
89 | syslinux $(obj)/fdimage ; sync | 99 | syslinux $(obj)/fdimage ; sync |
90 | echo 'default linux $(FDARGS)' | \ | 100 | echo '$(image_cmdline)' | \ |
91 | MTOOLSRC=$(obj)/mtools.conf mcopy - w:syslinux.cfg | 101 | MTOOLSRC=$(obj)/mtools.conf mcopy - w:syslinux.cfg |
102 | if [ -f '$(FDINITRD)' ] ; then \ | ||
103 | MTOOLSRC=$(obj)/mtools.conf mcopy '$(FDINITRD)' w:initrd.img ; \ | ||
104 | fi | ||
92 | MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) w:linux ; sync | 105 | MTOOLSRC=$(obj)/mtools.conf mcopy $(BOOTIMAGE) w:linux ; sync |
93 | 106 | ||
107 | isoimage: $(BOOTIMAGE) | ||
108 | -rm -rf $(obj)/isoimage | ||
109 | mkdir $(obj)/isoimage | ||
110 | cp `echo /usr/lib*/syslinux/isolinux.bin | awk '{ print $1; }'` \ | ||
111 | $(obj)/isoimage | ||
112 | cp $(BOOTIMAGE) $(obj)/isoimage/linux | ||
113 | echo '$(image_cmdline)' > $(obj)/isoimage/isolinux.cfg | ||
114 | if [ -f '$(FDINITRD)' ] ; then \ | ||
115 | cp '$(FDINITRD)' $(obj)/isoimage/initrd.img ; \ | ||
116 | fi | ||
117 | mkisofs -J -r -o $(obj)/image.iso -b isolinux.bin -c boot.cat \ | ||
118 | -no-emul-boot -boot-load-size 4 -boot-info-table \ | ||
119 | $(obj)/isoimage | ||
120 | rm -rf $(obj)/isoimage | ||
121 | |||
94 | zlilo: $(BOOTIMAGE) | 122 | zlilo: $(BOOTIMAGE) |
95 | if [ -f $(INSTALL_PATH)/vmlinuz ]; then mv $(INSTALL_PATH)/vmlinuz $(INSTALL_PATH)/vmlinuz.old; fi | 123 | if [ -f $(INSTALL_PATH)/vmlinuz ]; then mv $(INSTALL_PATH)/vmlinuz $(INSTALL_PATH)/vmlinuz.old; fi |
96 | if [ -f $(INSTALL_PATH)/System.map ]; then mv $(INSTALL_PATH)/System.map $(INSTALL_PATH)/System.old; fi | 124 | if [ -f $(INSTALL_PATH)/System.map ]; then mv $(INSTALL_PATH)/System.map $(INSTALL_PATH)/System.old; fi |
diff --git a/arch/x86_64/crypto/aes.c b/arch/x86_64/crypto/aes.c index fb1b961a2e2f..6f77e7700d32 100644 --- a/arch/x86_64/crypto/aes.c +++ b/arch/x86_64/crypto/aes.c | |||
@@ -77,12 +77,11 @@ static inline u8 byte(const u32 x, const unsigned n) | |||
77 | struct aes_ctx | 77 | struct aes_ctx |
78 | { | 78 | { |
79 | u32 key_length; | 79 | u32 key_length; |
80 | u32 E[60]; | 80 | u32 buf[120]; |
81 | u32 D[60]; | ||
82 | }; | 81 | }; |
83 | 82 | ||
84 | #define E_KEY ctx->E | 83 | #define E_KEY (&ctx->buf[0]) |
85 | #define D_KEY ctx->D | 84 | #define D_KEY (&ctx->buf[60]) |
86 | 85 | ||
87 | static u8 pow_tab[256] __initdata; | 86 | static u8 pow_tab[256] __initdata; |
88 | static u8 log_tab[256] __initdata; | 87 | static u8 log_tab[256] __initdata; |
diff --git a/arch/x86_64/defconfig b/arch/x86_64/defconfig index ce4de61ed85d..566ecc97ee5a 100644 --- a/arch/x86_64/defconfig +++ b/arch/x86_64/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.16-rc3-git9 | 3 | # Linux kernel version: 2.6.16-git9 |
4 | # Sat Feb 18 00:27:03 2006 | 4 | # Sat Mar 25 15:18:40 2006 |
5 | # | 5 | # |
6 | CONFIG_X86_64=y | 6 | CONFIG_X86_64=y |
7 | CONFIG_64BIT=y | 7 | CONFIG_64BIT=y |
@@ -38,6 +38,7 @@ CONFIG_SYSCTL=y | |||
38 | CONFIG_IKCONFIG=y | 38 | CONFIG_IKCONFIG=y |
39 | CONFIG_IKCONFIG_PROC=y | 39 | CONFIG_IKCONFIG_PROC=y |
40 | # CONFIG_CPUSETS is not set | 40 | # CONFIG_CPUSETS is not set |
41 | # CONFIG_RELAY is not set | ||
41 | CONFIG_INITRAMFS_SOURCE="" | 42 | CONFIG_INITRAMFS_SOURCE="" |
42 | CONFIG_UID16=y | 43 | CONFIG_UID16=y |
43 | CONFIG_VM86=y | 44 | CONFIG_VM86=y |
@@ -79,6 +80,7 @@ CONFIG_STOP_MACHINE=y | |||
79 | # Block layer | 80 | # Block layer |
80 | # | 81 | # |
81 | CONFIG_LBD=y | 82 | CONFIG_LBD=y |
83 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
82 | 84 | ||
83 | # | 85 | # |
84 | # IO Schedulers | 86 | # IO Schedulers |
@@ -139,7 +141,6 @@ CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y | |||
139 | CONFIG_NR_CPUS=32 | 141 | CONFIG_NR_CPUS=32 |
140 | CONFIG_HOTPLUG_CPU=y | 142 | CONFIG_HOTPLUG_CPU=y |
141 | CONFIG_HPET_TIMER=y | 143 | CONFIG_HPET_TIMER=y |
142 | CONFIG_X86_PM_TIMER=y | ||
143 | CONFIG_HPET_EMULATE_RTC=y | 144 | CONFIG_HPET_EMULATE_RTC=y |
144 | CONFIG_GART_IOMMU=y | 145 | CONFIG_GART_IOMMU=y |
145 | CONFIG_SWIOTLB=y | 146 | CONFIG_SWIOTLB=y |
@@ -148,12 +149,13 @@ CONFIG_X86_MCE_INTEL=y | |||
148 | CONFIG_X86_MCE_AMD=y | 149 | CONFIG_X86_MCE_AMD=y |
149 | # CONFIG_KEXEC is not set | 150 | # CONFIG_KEXEC is not set |
150 | # CONFIG_CRASH_DUMP is not set | 151 | # CONFIG_CRASH_DUMP is not set |
151 | CONFIG_PHYSICAL_START=0x100000 | 152 | CONFIG_PHYSICAL_START=0x200000 |
152 | CONFIG_SECCOMP=y | 153 | CONFIG_SECCOMP=y |
153 | # CONFIG_HZ_100 is not set | 154 | # CONFIG_HZ_100 is not set |
154 | CONFIG_HZ_250=y | 155 | CONFIG_HZ_250=y |
155 | # CONFIG_HZ_1000 is not set | 156 | # CONFIG_HZ_1000 is not set |
156 | CONFIG_HZ=250 | 157 | CONFIG_HZ=250 |
158 | # CONFIG_REORDER is not set | ||
157 | CONFIG_GENERIC_HARDIRQS=y | 159 | CONFIG_GENERIC_HARDIRQS=y |
158 | CONFIG_GENERIC_IRQ_PROBE=y | 160 | CONFIG_GENERIC_IRQ_PROBE=y |
159 | CONFIG_ISA_DMA_API=y | 161 | CONFIG_ISA_DMA_API=y |
@@ -189,12 +191,14 @@ CONFIG_ACPI_NUMA=y | |||
189 | # CONFIG_ACPI_ASUS is not set | 191 | # CONFIG_ACPI_ASUS is not set |
190 | # CONFIG_ACPI_IBM is not set | 192 | # CONFIG_ACPI_IBM is not set |
191 | CONFIG_ACPI_TOSHIBA=y | 193 | CONFIG_ACPI_TOSHIBA=y |
192 | CONFIG_ACPI_BLACKLIST_YEAR=2001 | 194 | CONFIG_ACPI_BLACKLIST_YEAR=0 |
193 | # CONFIG_ACPI_DEBUG is not set | 195 | # CONFIG_ACPI_DEBUG is not set |
194 | CONFIG_ACPI_EC=y | 196 | CONFIG_ACPI_EC=y |
195 | CONFIG_ACPI_POWER=y | 197 | CONFIG_ACPI_POWER=y |
196 | CONFIG_ACPI_SYSTEM=y | 198 | CONFIG_ACPI_SYSTEM=y |
199 | CONFIG_X86_PM_TIMER=y | ||
197 | CONFIG_ACPI_CONTAINER=y | 200 | CONFIG_ACPI_CONTAINER=y |
201 | CONFIG_ACPI_HOTPLUG_MEMORY=y | ||
198 | 202 | ||
199 | # | 203 | # |
200 | # CPU Frequency scaling | 204 | # CPU Frequency scaling |
@@ -232,10 +236,8 @@ CONFIG_X86_ACPI_CPUFREQ_PROC_INTF=y | |||
232 | CONFIG_PCI=y | 236 | CONFIG_PCI=y |
233 | CONFIG_PCI_DIRECT=y | 237 | CONFIG_PCI_DIRECT=y |
234 | CONFIG_PCI_MMCONFIG=y | 238 | CONFIG_PCI_MMCONFIG=y |
235 | CONFIG_UNORDERED_IO=y | ||
236 | CONFIG_PCIEPORTBUS=y | 239 | CONFIG_PCIEPORTBUS=y |
237 | CONFIG_PCI_MSI=y | 240 | CONFIG_PCI_MSI=y |
238 | # CONFIG_PCI_LEGACY_PROC is not set | ||
239 | # CONFIG_PCI_DEBUG is not set | 241 | # CONFIG_PCI_DEBUG is not set |
240 | 242 | ||
241 | # | 243 | # |
@@ -294,6 +296,7 @@ CONFIG_INET_TCP_DIAG=y | |||
294 | CONFIG_TCP_CONG_BIC=y | 296 | CONFIG_TCP_CONG_BIC=y |
295 | CONFIG_IPV6=y | 297 | CONFIG_IPV6=y |
296 | # CONFIG_IPV6_PRIVACY is not set | 298 | # CONFIG_IPV6_PRIVACY is not set |
299 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
297 | # CONFIG_INET6_AH is not set | 300 | # CONFIG_INET6_AH is not set |
298 | # CONFIG_INET6_ESP is not set | 301 | # CONFIG_INET6_ESP is not set |
299 | # CONFIG_INET6_IPCOMP is not set | 302 | # CONFIG_INET6_IPCOMP is not set |
@@ -701,6 +704,7 @@ CONFIG_S2IO=m | |||
701 | # Wireless LAN (non-hamradio) | 704 | # Wireless LAN (non-hamradio) |
702 | # | 705 | # |
703 | # CONFIG_NET_RADIO is not set | 706 | # CONFIG_NET_RADIO is not set |
707 | # CONFIG_NET_WIRELESS_RTNETLINK is not set | ||
704 | 708 | ||
705 | # | 709 | # |
706 | # Wan interfaces | 710 | # Wan interfaces |
@@ -861,6 +865,8 @@ CONFIG_RTC=y | |||
861 | CONFIG_AGP=y | 865 | CONFIG_AGP=y |
862 | CONFIG_AGP_AMD64=y | 866 | CONFIG_AGP_AMD64=y |
863 | CONFIG_AGP_INTEL=y | 867 | CONFIG_AGP_INTEL=y |
868 | # CONFIG_AGP_SIS is not set | ||
869 | # CONFIG_AGP_VIA is not set | ||
864 | # CONFIG_DRM is not set | 870 | # CONFIG_DRM is not set |
865 | # CONFIG_MWAVE is not set | 871 | # CONFIG_MWAVE is not set |
866 | CONFIG_RAW_DRIVER=y | 872 | CONFIG_RAW_DRIVER=y |
@@ -907,10 +913,6 @@ CONFIG_HWMON=y | |||
907 | # CONFIG_IBM_ASM is not set | 913 | # CONFIG_IBM_ASM is not set |
908 | 914 | ||
909 | # | 915 | # |
910 | # Multimedia Capabilities Port drivers | ||
911 | # | ||
912 | |||
913 | # | ||
914 | # Multimedia devices | 916 | # Multimedia devices |
915 | # | 917 | # |
916 | # CONFIG_VIDEO_DEV is not set | 918 | # CONFIG_VIDEO_DEV is not set |
@@ -974,6 +976,7 @@ CONFIG_SOUND_ICH=y | |||
974 | # | 976 | # |
975 | CONFIG_USB_ARCH_HAS_HCD=y | 977 | CONFIG_USB_ARCH_HAS_HCD=y |
976 | CONFIG_USB_ARCH_HAS_OHCI=y | 978 | CONFIG_USB_ARCH_HAS_OHCI=y |
979 | CONFIG_USB_ARCH_HAS_EHCI=y | ||
977 | CONFIG_USB=y | 980 | CONFIG_USB=y |
978 | # CONFIG_USB_DEBUG is not set | 981 | # CONFIG_USB_DEBUG is not set |
979 | 982 | ||
@@ -1002,7 +1005,6 @@ CONFIG_USB_UHCI_HCD=y | |||
1002 | # | 1005 | # |
1003 | # USB Device Class drivers | 1006 | # USB Device Class drivers |
1004 | # | 1007 | # |
1005 | # CONFIG_OBSOLETE_OSS_USB_DRIVER is not set | ||
1006 | # CONFIG_USB_ACM is not set | 1008 | # CONFIG_USB_ACM is not set |
1007 | CONFIG_USB_PRINTER=y | 1009 | CONFIG_USB_PRINTER=y |
1008 | 1010 | ||
@@ -1121,11 +1123,7 @@ CONFIG_USB_MON=y | |||
1121 | # CONFIG_INFINIBAND is not set | 1123 | # CONFIG_INFINIBAND is not set |
1122 | 1124 | ||
1123 | # | 1125 | # |
1124 | # SN Devices | 1126 | # EDAC - error detection and reporting (RAS) (EXPERIMENTAL) |
1125 | # | ||
1126 | |||
1127 | # | ||
1128 | # EDAC - error detection and reporting (RAS) | ||
1129 | # | 1127 | # |
1130 | # CONFIG_EDAC is not set | 1128 | # CONFIG_EDAC is not set |
1131 | 1129 | ||
@@ -1198,7 +1196,6 @@ CONFIG_TMPFS=y | |||
1198 | CONFIG_HUGETLBFS=y | 1196 | CONFIG_HUGETLBFS=y |
1199 | CONFIG_HUGETLB_PAGE=y | 1197 | CONFIG_HUGETLB_PAGE=y |
1200 | CONFIG_RAMFS=y | 1198 | CONFIG_RAMFS=y |
1201 | CONFIG_RELAYFS_FS=y | ||
1202 | # CONFIG_CONFIGFS_FS is not set | 1199 | # CONFIG_CONFIGFS_FS is not set |
1203 | 1200 | ||
1204 | # | 1201 | # |
@@ -1321,6 +1318,7 @@ CONFIG_DETECT_SOFTLOCKUP=y | |||
1321 | CONFIG_DEBUG_FS=y | 1318 | CONFIG_DEBUG_FS=y |
1322 | # CONFIG_DEBUG_VM is not set | 1319 | # CONFIG_DEBUG_VM is not set |
1323 | # CONFIG_FRAME_POINTER is not set | 1320 | # CONFIG_FRAME_POINTER is not set |
1321 | # CONFIG_UNWIND_INFO is not set | ||
1324 | # CONFIG_FORCED_INLINING is not set | 1322 | # CONFIG_FORCED_INLINING is not set |
1325 | # CONFIG_RCU_TORTURE_TEST is not set | 1323 | # CONFIG_RCU_TORTURE_TEST is not set |
1326 | # CONFIG_DEBUG_RODATA is not set | 1324 | # CONFIG_DEBUG_RODATA is not set |
diff --git a/arch/x86_64/ia32/ia32_binfmt.c b/arch/x86_64/ia32/ia32_binfmt.c index 572b3b28772d..e776139afb20 100644 --- a/arch/x86_64/ia32/ia32_binfmt.c +++ b/arch/x86_64/ia32/ia32_binfmt.c | |||
@@ -58,7 +58,7 @@ struct elf_phdr; | |||
58 | 58 | ||
59 | #define USE_ELF_CORE_DUMP 1 | 59 | #define USE_ELF_CORE_DUMP 1 |
60 | 60 | ||
61 | /* Overwrite elfcore.h */ | 61 | /* Override elfcore.h */ |
62 | #define _LINUX_ELFCORE_H 1 | 62 | #define _LINUX_ELFCORE_H 1 |
63 | typedef unsigned int elf_greg_t; | 63 | typedef unsigned int elf_greg_t; |
64 | 64 | ||
diff --git a/arch/x86_64/ia32/ia32entry.S b/arch/x86_64/ia32/ia32entry.S index 00dee176c08e..35b2faccdc6c 100644 --- a/arch/x86_64/ia32/ia32entry.S +++ b/arch/x86_64/ia32/ia32entry.S | |||
@@ -501,7 +501,7 @@ ia32_sys_call_table: | |||
501 | .quad sys_setdomainname | 501 | .quad sys_setdomainname |
502 | .quad sys_uname | 502 | .quad sys_uname |
503 | .quad sys_modify_ldt | 503 | .quad sys_modify_ldt |
504 | .quad sys32_adjtimex | 504 | .quad compat_sys_adjtimex |
505 | .quad sys32_mprotect /* 125 */ | 505 | .quad sys32_mprotect /* 125 */ |
506 | .quad compat_sys_sigprocmask | 506 | .quad compat_sys_sigprocmask |
507 | .quad quiet_ni_syscall /* create_module */ | 507 | .quad quiet_ni_syscall /* create_module */ |
@@ -688,6 +688,8 @@ ia32_sys_call_table: | |||
688 | .quad sys_ni_syscall /* pselect6 for now */ | 688 | .quad sys_ni_syscall /* pselect6 for now */ |
689 | .quad sys_ni_syscall /* ppoll for now */ | 689 | .quad sys_ni_syscall /* ppoll for now */ |
690 | .quad sys_unshare /* 310 */ | 690 | .quad sys_unshare /* 310 */ |
691 | .quad compat_sys_set_robust_list | ||
692 | .quad compat_sys_get_robust_list | ||
691 | ia32_syscall_end: | 693 | ia32_syscall_end: |
692 | .rept IA32_NR_syscalls-(ia32_syscall_end-ia32_sys_call_table)/8 | 694 | .rept IA32_NR_syscalls-(ia32_syscall_end-ia32_sys_call_table)/8 |
693 | .quad ni_syscall | 695 | .quad ni_syscall |
diff --git a/arch/x86_64/ia32/sys_ia32.c b/arch/x86_64/ia32/sys_ia32.c index 2bc55af95419..f182b20858e2 100644 --- a/arch/x86_64/ia32/sys_ia32.c +++ b/arch/x86_64/ia32/sys_ia32.c | |||
@@ -30,7 +30,6 @@ | |||
30 | #include <linux/resource.h> | 30 | #include <linux/resource.h> |
31 | #include <linux/times.h> | 31 | #include <linux/times.h> |
32 | #include <linux/utsname.h> | 32 | #include <linux/utsname.h> |
33 | #include <linux/timex.h> | ||
34 | #include <linux/smp.h> | 33 | #include <linux/smp.h> |
35 | #include <linux/smp_lock.h> | 34 | #include <linux/smp_lock.h> |
36 | #include <linux/sem.h> | 35 | #include <linux/sem.h> |
@@ -430,24 +429,12 @@ put_tv32(struct compat_timeval __user *o, struct timeval *i) | |||
430 | return err; | 429 | return err; |
431 | } | 430 | } |
432 | 431 | ||
433 | extern int do_setitimer(int which, struct itimerval *, struct itimerval *); | 432 | extern unsigned int alarm_setitimer(unsigned int seconds); |
434 | 433 | ||
435 | asmlinkage long | 434 | asmlinkage long |
436 | sys32_alarm(unsigned int seconds) | 435 | sys32_alarm(unsigned int seconds) |
437 | { | 436 | { |
438 | struct itimerval it_new, it_old; | 437 | return alarm_setitimer(seconds); |
439 | unsigned int oldalarm; | ||
440 | |||
441 | it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0; | ||
442 | it_new.it_value.tv_sec = seconds; | ||
443 | it_new.it_value.tv_usec = 0; | ||
444 | do_setitimer(ITIMER_REAL, &it_new, &it_old); | ||
445 | oldalarm = it_old.it_value.tv_sec; | ||
446 | /* ehhh.. We can't return 0 if we have an alarm pending.. */ | ||
447 | /* And we'd better return too much than too little anyway */ | ||
448 | if (it_old.it_value.tv_usec) | ||
449 | oldalarm++; | ||
450 | return oldalarm; | ||
451 | } | 438 | } |
452 | 439 | ||
453 | /* Translations due to time_t size differences. Which affects all | 440 | /* Translations due to time_t size differences. Which affects all |
@@ -779,82 +766,6 @@ sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset, s32 count) | |||
779 | return ret; | 766 | return ret; |
780 | } | 767 | } |
781 | 768 | ||
782 | /* Handle adjtimex compatibility. */ | ||
783 | |||
784 | struct timex32 { | ||
785 | u32 modes; | ||
786 | s32 offset, freq, maxerror, esterror; | ||
787 | s32 status, constant, precision, tolerance; | ||
788 | struct compat_timeval time; | ||
789 | s32 tick; | ||
790 | s32 ppsfreq, jitter, shift, stabil; | ||
791 | s32 jitcnt, calcnt, errcnt, stbcnt; | ||
792 | s32 :32; s32 :32; s32 :32; s32 :32; | ||
793 | s32 :32; s32 :32; s32 :32; s32 :32; | ||
794 | s32 :32; s32 :32; s32 :32; s32 :32; | ||
795 | }; | ||
796 | |||
797 | extern int do_adjtimex(struct timex *); | ||
798 | |||
799 | asmlinkage long | ||
800 | sys32_adjtimex(struct timex32 __user *utp) | ||
801 | { | ||
802 | struct timex txc; | ||
803 | int ret; | ||
804 | |||
805 | memset(&txc, 0, sizeof(struct timex)); | ||
806 | |||
807 | if (!access_ok(VERIFY_READ, utp, sizeof(struct timex32)) || | ||
808 | __get_user(txc.modes, &utp->modes) || | ||
809 | __get_user(txc.offset, &utp->offset) || | ||
810 | __get_user(txc.freq, &utp->freq) || | ||
811 | __get_user(txc.maxerror, &utp->maxerror) || | ||
812 | __get_user(txc.esterror, &utp->esterror) || | ||
813 | __get_user(txc.status, &utp->status) || | ||
814 | __get_user(txc.constant, &utp->constant) || | ||
815 | __get_user(txc.precision, &utp->precision) || | ||
816 | __get_user(txc.tolerance, &utp->tolerance) || | ||
817 | __get_user(txc.time.tv_sec, &utp->time.tv_sec) || | ||
818 | __get_user(txc.time.tv_usec, &utp->time.tv_usec) || | ||
819 | __get_user(txc.tick, &utp->tick) || | ||
820 | __get_user(txc.ppsfreq, &utp->ppsfreq) || | ||
821 | __get_user(txc.jitter, &utp->jitter) || | ||
822 | __get_user(txc.shift, &utp->shift) || | ||
823 | __get_user(txc.stabil, &utp->stabil) || | ||
824 | __get_user(txc.jitcnt, &utp->jitcnt) || | ||
825 | __get_user(txc.calcnt, &utp->calcnt) || | ||
826 | __get_user(txc.errcnt, &utp->errcnt) || | ||
827 | __get_user(txc.stbcnt, &utp->stbcnt)) | ||
828 | return -EFAULT; | ||
829 | |||
830 | ret = do_adjtimex(&txc); | ||
831 | |||
832 | if (!access_ok(VERIFY_WRITE, utp, sizeof(struct timex32)) || | ||
833 | __put_user(txc.modes, &utp->modes) || | ||
834 | __put_user(txc.offset, &utp->offset) || | ||
835 | __put_user(txc.freq, &utp->freq) || | ||
836 | __put_user(txc.maxerror, &utp->maxerror) || | ||
837 | __put_user(txc.esterror, &utp->esterror) || | ||
838 | __put_user(txc.status, &utp->status) || | ||
839 | __put_user(txc.constant, &utp->constant) || | ||
840 | __put_user(txc.precision, &utp->precision) || | ||
841 | __put_user(txc.tolerance, &utp->tolerance) || | ||
842 | __put_user(txc.time.tv_sec, &utp->time.tv_sec) || | ||
843 | __put_user(txc.time.tv_usec, &utp->time.tv_usec) || | ||
844 | __put_user(txc.tick, &utp->tick) || | ||
845 | __put_user(txc.ppsfreq, &utp->ppsfreq) || | ||
846 | __put_user(txc.jitter, &utp->jitter) || | ||
847 | __put_user(txc.shift, &utp->shift) || | ||
848 | __put_user(txc.stabil, &utp->stabil) || | ||
849 | __put_user(txc.jitcnt, &utp->jitcnt) || | ||
850 | __put_user(txc.calcnt, &utp->calcnt) || | ||
851 | __put_user(txc.errcnt, &utp->errcnt) || | ||
852 | __put_user(txc.stbcnt, &utp->stbcnt)) | ||
853 | ret = -EFAULT; | ||
854 | |||
855 | return ret; | ||
856 | } | ||
857 | |||
858 | asmlinkage long sys32_mmap2(unsigned long addr, unsigned long len, | 769 | asmlinkage long sys32_mmap2(unsigned long addr, unsigned long len, |
859 | unsigned long prot, unsigned long flags, | 770 | unsigned long prot, unsigned long flags, |
860 | unsigned long fd, unsigned long pgoff) | 771 | unsigned long fd, unsigned long pgoff) |
diff --git a/arch/x86_64/kernel/aperture.c b/arch/x86_64/kernel/aperture.c index a0f955b9995f..fffd6b0a2fab 100644 --- a/arch/x86_64/kernel/aperture.c +++ b/arch/x86_64/kernel/aperture.c | |||
@@ -60,7 +60,7 @@ static u32 __init allocate_aperture(void) | |||
60 | printk("Cannot allocate aperture memory hole (%p,%uK)\n", | 60 | printk("Cannot allocate aperture memory hole (%p,%uK)\n", |
61 | p, aper_size>>10); | 61 | p, aper_size>>10); |
62 | if (p) | 62 | if (p) |
63 | free_bootmem_node(nd0, (unsigned long)p, aper_size); | 63 | free_bootmem_node(nd0, __pa(p), aper_size); |
64 | return 0; | 64 | return 0; |
65 | } | 65 | } |
66 | printk("Mapping aperture over %d KB of RAM @ %lx\n", | 66 | printk("Mapping aperture over %d KB of RAM @ %lx\n", |
@@ -161,7 +161,7 @@ static __u32 __init search_agp_bridge(u32 *order, int *valid_agp) | |||
161 | int num, slot, func; | 161 | int num, slot, func; |
162 | 162 | ||
163 | /* Poor man's PCI discovery */ | 163 | /* Poor man's PCI discovery */ |
164 | for (num = 0; num < 32; num++) { | 164 | for (num = 0; num < 256; num++) { |
165 | for (slot = 0; slot < 32; slot++) { | 165 | for (slot = 0; slot < 32; slot++) { |
166 | for (func = 0; func < 8; func++) { | 166 | for (func = 0; func < 8; func++) { |
167 | u32 class, cap; | 167 | u32 class, cap; |
diff --git a/arch/x86_64/kernel/apic.c b/arch/x86_64/kernel/apic.c index e5b14c57eaa0..d54620147e8e 100644 --- a/arch/x86_64/kernel/apic.c +++ b/arch/x86_64/kernel/apic.c | |||
@@ -342,6 +342,7 @@ void __init init_bsp_APIC(void) | |||
342 | void __cpuinit setup_local_APIC (void) | 342 | void __cpuinit setup_local_APIC (void) |
343 | { | 343 | { |
344 | unsigned int value, maxlvt; | 344 | unsigned int value, maxlvt; |
345 | int i, j; | ||
345 | 346 | ||
346 | value = apic_read(APIC_LVR); | 347 | value = apic_read(APIC_LVR); |
347 | 348 | ||
@@ -371,6 +372,25 @@ void __cpuinit setup_local_APIC (void) | |||
371 | apic_write(APIC_TASKPRI, value); | 372 | apic_write(APIC_TASKPRI, value); |
372 | 373 | ||
373 | /* | 374 | /* |
375 | * After a crash, we no longer service the interrupts and a pending | ||
376 | * interrupt from previous kernel might still have ISR bit set. | ||
377 | * | ||
378 | * Most probably by now CPU has serviced that pending interrupt and | ||
379 | * it might not have done the ack_APIC_irq() because it thought, | ||
380 | * interrupt came from i8259 as ExtInt. LAPIC did not get EOI so it | ||
381 | * does not clear the ISR bit and cpu thinks it has already serivced | ||
382 | * the interrupt. Hence a vector might get locked. It was noticed | ||
383 | * for timer irq (vector 0x31). Issue an extra EOI to clear ISR. | ||
384 | */ | ||
385 | for (i = APIC_ISR_NR - 1; i >= 0; i--) { | ||
386 | value = apic_read(APIC_ISR + i*0x10); | ||
387 | for (j = 31; j >= 0; j--) { | ||
388 | if (value & (1<<j)) | ||
389 | ack_APIC_irq(); | ||
390 | } | ||
391 | } | ||
392 | |||
393 | /* | ||
374 | * Now that we are all set up, enable the APIC | 394 | * Now that we are all set up, enable the APIC |
375 | */ | 395 | */ |
376 | value = apic_read(APIC_SPIV); | 396 | value = apic_read(APIC_SPIV); |
diff --git a/arch/x86_64/kernel/early_printk.c b/arch/x86_64/kernel/early_printk.c index 6dffb498ccd7..13af920b6594 100644 --- a/arch/x86_64/kernel/early_printk.c +++ b/arch/x86_64/kernel/early_printk.c | |||
@@ -17,11 +17,8 @@ | |||
17 | #define VGABASE ((void __iomem *)0xffffffff800b8000UL) | 17 | #define VGABASE ((void __iomem *)0xffffffff800b8000UL) |
18 | #endif | 18 | #endif |
19 | 19 | ||
20 | #define MAX_YPOS max_ypos | ||
21 | #define MAX_XPOS max_xpos | ||
22 | |||
23 | static int max_ypos = 25, max_xpos = 80; | 20 | static int max_ypos = 25, max_xpos = 80; |
24 | static int current_ypos = 1, current_xpos = 0; | 21 | static int current_ypos = 25, current_xpos = 0; |
25 | 22 | ||
26 | static void early_vga_write(struct console *con, const char *str, unsigned n) | 23 | static void early_vga_write(struct console *con, const char *str, unsigned n) |
27 | { | 24 | { |
@@ -29,26 +26,26 @@ static void early_vga_write(struct console *con, const char *str, unsigned n) | |||
29 | int i, k, j; | 26 | int i, k, j; |
30 | 27 | ||
31 | while ((c = *str++) != '\0' && n-- > 0) { | 28 | while ((c = *str++) != '\0' && n-- > 0) { |
32 | if (current_ypos >= MAX_YPOS) { | 29 | if (current_ypos >= max_ypos) { |
33 | /* scroll 1 line up */ | 30 | /* scroll 1 line up */ |
34 | for (k = 1, j = 0; k < MAX_YPOS; k++, j++) { | 31 | for (k = 1, j = 0; k < max_ypos; k++, j++) { |
35 | for (i = 0; i < MAX_XPOS; i++) { | 32 | for (i = 0; i < max_xpos; i++) { |
36 | writew(readw(VGABASE + 2*(MAX_XPOS*k + i)), | 33 | writew(readw(VGABASE+2*(max_xpos*k+i)), |
37 | VGABASE + 2*(MAX_XPOS*j + i)); | 34 | VGABASE + 2*(max_xpos*j + i)); |
38 | } | 35 | } |
39 | } | 36 | } |
40 | for (i = 0; i < MAX_XPOS; i++) | 37 | for (i = 0; i < max_xpos; i++) |
41 | writew(0x720, VGABASE + 2*(MAX_XPOS*j + i)); | 38 | writew(0x720, VGABASE + 2*(max_xpos*j + i)); |
42 | current_ypos = MAX_YPOS-1; | 39 | current_ypos = max_ypos-1; |
43 | } | 40 | } |
44 | if (c == '\n') { | 41 | if (c == '\n') { |
45 | current_xpos = 0; | 42 | current_xpos = 0; |
46 | current_ypos++; | 43 | current_ypos++; |
47 | } else if (c != '\r') { | 44 | } else if (c != '\r') { |
48 | writew(((0x7 << 8) | (unsigned short) c), | 45 | writew(((0x7 << 8) | (unsigned short) c), |
49 | VGABASE + 2*(MAX_XPOS*current_ypos + | 46 | VGABASE + 2*(max_xpos*current_ypos + |
50 | current_xpos++)); | 47 | current_xpos++)); |
51 | if (current_xpos >= MAX_XPOS) { | 48 | if (current_xpos >= max_xpos) { |
52 | current_xpos = 0; | 49 | current_xpos = 0; |
53 | current_ypos++; | 50 | current_ypos++; |
54 | } | 51 | } |
@@ -63,7 +60,7 @@ static struct console early_vga_console = { | |||
63 | .index = -1, | 60 | .index = -1, |
64 | }; | 61 | }; |
65 | 62 | ||
66 | /* Serial functions loosely based on a similar package from Klaus P. Gerlicher */ | 63 | /* Serial functions loosely based on a similar package from Klaus P. Gerlicher */ |
67 | 64 | ||
68 | static int early_serial_base = 0x3f8; /* ttyS0 */ | 65 | static int early_serial_base = 0x3f8; /* ttyS0 */ |
69 | 66 | ||
@@ -83,30 +80,30 @@ static int early_serial_base = 0x3f8; /* ttyS0 */ | |||
83 | #define DLL 0 /* Divisor Latch Low */ | 80 | #define DLL 0 /* Divisor Latch Low */ |
84 | #define DLH 1 /* Divisor latch High */ | 81 | #define DLH 1 /* Divisor latch High */ |
85 | 82 | ||
86 | static int early_serial_putc(unsigned char ch) | 83 | static int early_serial_putc(unsigned char ch) |
87 | { | 84 | { |
88 | unsigned timeout = 0xffff; | 85 | unsigned timeout = 0xffff; |
89 | while ((inb(early_serial_base + LSR) & XMTRDY) == 0 && --timeout) | 86 | while ((inb(early_serial_base + LSR) & XMTRDY) == 0 && --timeout) |
90 | cpu_relax(); | 87 | cpu_relax(); |
91 | outb(ch, early_serial_base + TXR); | 88 | outb(ch, early_serial_base + TXR); |
92 | return timeout ? 0 : -1; | 89 | return timeout ? 0 : -1; |
93 | } | 90 | } |
94 | 91 | ||
95 | static void early_serial_write(struct console *con, const char *s, unsigned n) | 92 | static void early_serial_write(struct console *con, const char *s, unsigned n) |
96 | { | 93 | { |
97 | while (*s && n-- > 0) { | 94 | while (*s && n-- > 0) { |
98 | early_serial_putc(*s); | 95 | early_serial_putc(*s); |
99 | if (*s == '\n') | 96 | if (*s == '\n') |
100 | early_serial_putc('\r'); | 97 | early_serial_putc('\r'); |
101 | s++; | 98 | s++; |
102 | } | 99 | } |
103 | } | 100 | } |
104 | 101 | ||
105 | #define DEFAULT_BAUD 9600 | 102 | #define DEFAULT_BAUD 9600 |
106 | 103 | ||
107 | static __init void early_serial_init(char *s) | 104 | static __init void early_serial_init(char *s) |
108 | { | 105 | { |
109 | unsigned char c; | 106 | unsigned char c; |
110 | unsigned divisor; | 107 | unsigned divisor; |
111 | unsigned baud = DEFAULT_BAUD; | 108 | unsigned baud = DEFAULT_BAUD; |
112 | char *e; | 109 | char *e; |
@@ -115,7 +112,7 @@ static __init void early_serial_init(char *s) | |||
115 | ++s; | 112 | ++s; |
116 | 113 | ||
117 | if (*s) { | 114 | if (*s) { |
118 | unsigned port; | 115 | unsigned port; |
119 | if (!strncmp(s,"0x",2)) { | 116 | if (!strncmp(s,"0x",2)) { |
120 | early_serial_base = simple_strtoul(s, &e, 16); | 117 | early_serial_base = simple_strtoul(s, &e, 16); |
121 | } else { | 118 | } else { |
@@ -139,16 +136,16 @@ static __init void early_serial_init(char *s) | |||
139 | outb(0x3, early_serial_base + MCR); /* DTR + RTS */ | 136 | outb(0x3, early_serial_base + MCR); /* DTR + RTS */ |
140 | 137 | ||
141 | if (*s) { | 138 | if (*s) { |
142 | baud = simple_strtoul(s, &e, 0); | 139 | baud = simple_strtoul(s, &e, 0); |
143 | if (baud == 0 || s == e) | 140 | if (baud == 0 || s == e) |
144 | baud = DEFAULT_BAUD; | 141 | baud = DEFAULT_BAUD; |
145 | } | 142 | } |
146 | 143 | ||
147 | divisor = 115200 / baud; | 144 | divisor = 115200 / baud; |
148 | c = inb(early_serial_base + LCR); | 145 | c = inb(early_serial_base + LCR); |
149 | outb(c | DLAB, early_serial_base + LCR); | 146 | outb(c | DLAB, early_serial_base + LCR); |
150 | outb(divisor & 0xff, early_serial_base + DLL); | 147 | outb(divisor & 0xff, early_serial_base + DLL); |
151 | outb((divisor >> 8) & 0xff, early_serial_base + DLH); | 148 | outb((divisor >> 8) & 0xff, early_serial_base + DLH); |
152 | outb(c & ~DLAB, early_serial_base + LCR); | 149 | outb(c & ~DLAB, early_serial_base + LCR); |
153 | } | 150 | } |
154 | 151 | ||
@@ -205,67 +202,68 @@ struct console *early_console = &early_vga_console; | |||
205 | static int early_console_initialized = 0; | 202 | static int early_console_initialized = 0; |
206 | 203 | ||
207 | void early_printk(const char *fmt, ...) | 204 | void early_printk(const char *fmt, ...) |
208 | { | 205 | { |
209 | char buf[512]; | 206 | char buf[512]; |
210 | int n; | 207 | int n; |
211 | va_list ap; | 208 | va_list ap; |
212 | 209 | ||
213 | va_start(ap,fmt); | 210 | va_start(ap,fmt); |
214 | n = vscnprintf(buf,512,fmt,ap); | 211 | n = vscnprintf(buf,512,fmt,ap); |
215 | early_console->write(early_console,buf,n); | 212 | early_console->write(early_console,buf,n); |
216 | va_end(ap); | 213 | va_end(ap); |
217 | } | 214 | } |
218 | 215 | ||
219 | static int __initdata keep_early; | 216 | static int __initdata keep_early; |
220 | 217 | ||
221 | int __init setup_early_printk(char *opt) | 218 | int __init setup_early_printk(char *opt) |
222 | { | 219 | { |
223 | char *space; | 220 | char *space; |
224 | char buf[256]; | 221 | char buf[256]; |
225 | 222 | ||
226 | if (early_console_initialized) | 223 | if (early_console_initialized) |
227 | return -1; | 224 | return -1; |
228 | 225 | ||
229 | strlcpy(buf,opt,sizeof(buf)); | 226 | strlcpy(buf,opt,sizeof(buf)); |
230 | space = strchr(buf, ' '); | 227 | space = strchr(buf, ' '); |
231 | if (space) | 228 | if (space) |
232 | *space = 0; | 229 | *space = 0; |
233 | 230 | ||
234 | if (strstr(buf,"keep")) | 231 | if (strstr(buf,"keep")) |
235 | keep_early = 1; | 232 | keep_early = 1; |
236 | 233 | ||
237 | if (!strncmp(buf, "serial", 6)) { | 234 | if (!strncmp(buf, "serial", 6)) { |
238 | early_serial_init(buf + 6); | 235 | early_serial_init(buf + 6); |
239 | early_console = &early_serial_console; | 236 | early_console = &early_serial_console; |
240 | } else if (!strncmp(buf, "ttyS", 4)) { | 237 | } else if (!strncmp(buf, "ttyS", 4)) { |
241 | early_serial_init(buf); | 238 | early_serial_init(buf); |
242 | early_console = &early_serial_console; | 239 | early_console = &early_serial_console; |
243 | } else if (!strncmp(buf, "vga", 3) | 240 | } else if (!strncmp(buf, "vga", 3) |
244 | && SCREEN_INFO.orig_video_isVGA == 1) { | 241 | && SCREEN_INFO.orig_video_isVGA == 1) { |
245 | max_xpos = SCREEN_INFO.orig_video_cols; | 242 | max_xpos = SCREEN_INFO.orig_video_cols; |
246 | max_ypos = SCREEN_INFO.orig_video_lines; | 243 | max_ypos = SCREEN_INFO.orig_video_lines; |
247 | early_console = &early_vga_console; | 244 | current_ypos = SCREEN_INFO.orig_y; |
245 | early_console = &early_vga_console; | ||
248 | } else if (!strncmp(buf, "simnow", 6)) { | 246 | } else if (!strncmp(buf, "simnow", 6)) { |
249 | simnow_init(buf + 6); | 247 | simnow_init(buf + 6); |
250 | early_console = &simnow_console; | 248 | early_console = &simnow_console; |
251 | keep_early = 1; | 249 | keep_early = 1; |
252 | } | 250 | } |
253 | early_console_initialized = 1; | 251 | early_console_initialized = 1; |
254 | register_console(early_console); | 252 | register_console(early_console); |
255 | return 0; | 253 | return 0; |
256 | } | 254 | } |
257 | 255 | ||
258 | void __init disable_early_printk(void) | 256 | void __init disable_early_printk(void) |
259 | { | 257 | { |
260 | if (!early_console_initialized || !early_console) | 258 | if (!early_console_initialized || !early_console) |
261 | return; | 259 | return; |
262 | if (!keep_early) { | 260 | if (!keep_early) { |
263 | printk("disabling early console\n"); | 261 | printk("disabling early console\n"); |
264 | unregister_console(early_console); | 262 | unregister_console(early_console); |
265 | early_console_initialized = 0; | 263 | early_console_initialized = 0; |
266 | } else { | 264 | } else { |
267 | printk("keeping early console\n"); | 265 | printk("keeping early console\n"); |
268 | } | 266 | } |
269 | } | 267 | } |
270 | 268 | ||
271 | __setup("earlyprintk=", setup_early_printk); | 269 | __setup("earlyprintk=", setup_early_printk); |
diff --git a/arch/x86_64/kernel/entry.S b/arch/x86_64/kernel/entry.S index 7c10e9009d61..8538bfea30e6 100644 --- a/arch/x86_64/kernel/entry.S +++ b/arch/x86_64/kernel/entry.S | |||
@@ -553,7 +553,7 @@ iret_label: | |||
553 | /* force a signal here? this matches i386 behaviour */ | 553 | /* force a signal here? this matches i386 behaviour */ |
554 | /* running with kernel gs */ | 554 | /* running with kernel gs */ |
555 | bad_iret: | 555 | bad_iret: |
556 | movq $-9999,%rdi /* better code? */ | 556 | movq $11,%rdi /* SIGSEGV */ |
557 | sti | 557 | sti |
558 | jmp do_exit | 558 | jmp do_exit |
559 | .previous | 559 | .previous |
diff --git a/arch/x86_64/kernel/functionlist b/arch/x86_64/kernel/functionlist new file mode 100644 index 000000000000..2bcebdc3eedb --- /dev/null +++ b/arch/x86_64/kernel/functionlist | |||
@@ -0,0 +1,1286 @@ | |||
1 | *(.text.flush_thread) | ||
2 | *(.text.check_poison_obj) | ||
3 | *(.text.copy_page) | ||
4 | *(.text.__set_personality) | ||
5 | *(.text.gart_map_sg) | ||
6 | *(.text.kmem_cache_free) | ||
7 | *(.text.find_get_page) | ||
8 | *(.text._raw_spin_lock) | ||
9 | *(.text.ide_outb) | ||
10 | *(.text.unmap_vmas) | ||
11 | *(.text.copy_page_range) | ||
12 | *(.text.kprobe_handler) | ||
13 | *(.text.__handle_mm_fault) | ||
14 | *(.text.__d_lookup) | ||
15 | *(.text.copy_user_generic) | ||
16 | *(.text.__link_path_walk) | ||
17 | *(.text.get_page_from_freelist) | ||
18 | *(.text.kmem_cache_alloc) | ||
19 | *(.text.drive_cmd_intr) | ||
20 | *(.text.ia32_setup_sigcontext) | ||
21 | *(.text.huge_pte_offset) | ||
22 | *(.text.do_page_fault) | ||
23 | *(.text.page_remove_rmap) | ||
24 | *(.text.release_pages) | ||
25 | *(.text.ide_end_request) | ||
26 | *(.text.__mutex_lock_slowpath) | ||
27 | *(.text.__find_get_block) | ||
28 | *(.text.kfree) | ||
29 | *(.text.vfs_read) | ||
30 | *(.text._raw_spin_unlock) | ||
31 | *(.text.free_hot_cold_page) | ||
32 | *(.text.fget_light) | ||
33 | *(.text.schedule) | ||
34 | *(.text.memcmp) | ||
35 | *(.text.touch_atime) | ||
36 | *(.text.__might_sleep) | ||
37 | *(.text.__down_read_trylock) | ||
38 | *(.text.arch_pick_mmap_layout) | ||
39 | *(.text.find_vma) | ||
40 | *(.text.__make_request) | ||
41 | *(.text.do_generic_mapping_read) | ||
42 | *(.text.mutex_lock_interruptible) | ||
43 | *(.text.__generic_file_aio_read) | ||
44 | *(.text._atomic_dec_and_lock) | ||
45 | *(.text.__wake_up_bit) | ||
46 | *(.text.add_to_page_cache) | ||
47 | *(.text.cache_alloc_debugcheck_after) | ||
48 | *(.text.vm_normal_page) | ||
49 | *(.text.mutex_debug_check_no_locks_freed) | ||
50 | *(.text.net_rx_action) | ||
51 | *(.text.__find_first_zero_bit) | ||
52 | *(.text.put_page) | ||
53 | *(.text._raw_read_lock) | ||
54 | *(.text.__delay) | ||
55 | *(.text.dnotify_parent) | ||
56 | *(.text.do_path_lookup) | ||
57 | *(.text.do_sync_read) | ||
58 | *(.text.do_lookup) | ||
59 | *(.text.bit_waitqueue) | ||
60 | *(.text.file_read_actor) | ||
61 | *(.text.strncpy_from_user) | ||
62 | *(.text.__pagevec_lru_add_active) | ||
63 | *(.text.fget) | ||
64 | *(.text.dput) | ||
65 | *(.text.__strnlen_user) | ||
66 | *(.text.inotify_inode_queue_event) | ||
67 | *(.text.rw_verify_area) | ||
68 | *(.text.ide_intr) | ||
69 | *(.text.inotify_dentry_parent_queue_event) | ||
70 | *(.text.permission) | ||
71 | *(.text.memscan) | ||
72 | *(.text.hpet_rtc_interrupt) | ||
73 | *(.text.do_mmap_pgoff) | ||
74 | *(.text.current_fs_time) | ||
75 | *(.text.vfs_getattr) | ||
76 | *(.text.kmem_flagcheck) | ||
77 | *(.text.mark_page_accessed) | ||
78 | *(.text.free_pages_and_swap_cache) | ||
79 | *(.text.generic_fillattr) | ||
80 | *(.text.__block_prepare_write) | ||
81 | *(.text.__set_page_dirty_nobuffers) | ||
82 | *(.text.link_path_walk) | ||
83 | *(.text.find_get_pages_tag) | ||
84 | *(.text.ide_do_request) | ||
85 | *(.text.__alloc_pages) | ||
86 | *(.text.generic_permission) | ||
87 | *(.text.mod_page_state_offset) | ||
88 | *(.text.free_pgd_range) | ||
89 | *(.text.generic_file_buffered_write) | ||
90 | *(.text.number) | ||
91 | *(.text.ide_do_rw_disk) | ||
92 | *(.text.__brelse) | ||
93 | *(.text.__mod_page_state_offset) | ||
94 | *(.text.rotate_reclaimable_page) | ||
95 | *(.text.find_vma_prepare) | ||
96 | *(.text.find_vma_prev) | ||
97 | *(.text.lru_cache_add_active) | ||
98 | *(.text.__kmalloc_track_caller) | ||
99 | *(.text.smp_invalidate_interrupt) | ||
100 | *(.text.handle_IRQ_event) | ||
101 | *(.text.__find_get_block_slow) | ||
102 | *(.text.do_wp_page) | ||
103 | *(.text.do_select) | ||
104 | *(.text.set_user_nice) | ||
105 | *(.text.sys_read) | ||
106 | *(.text.do_munmap) | ||
107 | *(.text.csum_partial) | ||
108 | *(.text.__do_softirq) | ||
109 | *(.text.may_open) | ||
110 | *(.text.getname) | ||
111 | *(.text.get_empty_filp) | ||
112 | *(.text.__fput) | ||
113 | *(.text.remove_mapping) | ||
114 | *(.text.filp_ctor) | ||
115 | *(.text.poison_obj) | ||
116 | *(.text.unmap_region) | ||
117 | *(.text.test_set_page_writeback) | ||
118 | *(.text.__do_page_cache_readahead) | ||
119 | *(.text.sock_def_readable) | ||
120 | *(.text.ide_outl) | ||
121 | *(.text.shrink_zone) | ||
122 | *(.text.rb_insert_color) | ||
123 | *(.text.get_request) | ||
124 | *(.text.sys_pread64) | ||
125 | *(.text.spin_bug) | ||
126 | *(.text.ide_outsl) | ||
127 | *(.text.mask_and_ack_8259A) | ||
128 | *(.text.filemap_nopage) | ||
129 | *(.text.page_add_file_rmap) | ||
130 | *(.text.find_lock_page) | ||
131 | *(.text.tcp_poll) | ||
132 | *(.text.__mark_inode_dirty) | ||
133 | *(.text.file_ra_state_init) | ||
134 | *(.text.generic_file_llseek) | ||
135 | *(.text.__pagevec_lru_add) | ||
136 | *(.text.page_cache_readahead) | ||
137 | *(.text.n_tty_receive_buf) | ||
138 | *(.text.zonelist_policy) | ||
139 | *(.text.vma_adjust) | ||
140 | *(.text.test_clear_page_dirty) | ||
141 | *(.text.sync_buffer) | ||
142 | *(.text.do_exit) | ||
143 | *(.text.__bitmap_weight) | ||
144 | *(.text.alloc_pages_current) | ||
145 | *(.text.get_unused_fd) | ||
146 | *(.text.zone_watermark_ok) | ||
147 | *(.text.cpuset_update_task_memory_state) | ||
148 | *(.text.__bitmap_empty) | ||
149 | *(.text.sys_munmap) | ||
150 | *(.text.__inode_dir_notify) | ||
151 | *(.text.__generic_file_aio_write_nolock) | ||
152 | *(.text.__pte_alloc) | ||
153 | *(.text.sys_select) | ||
154 | *(.text.vm_acct_memory) | ||
155 | *(.text.vfs_write) | ||
156 | *(.text.__lru_add_drain) | ||
157 | *(.text.prio_tree_insert) | ||
158 | *(.text.generic_file_aio_read) | ||
159 | *(.text.vma_merge) | ||
160 | *(.text.block_write_full_page) | ||
161 | *(.text.__page_set_anon_rmap) | ||
162 | *(.text.apic_timer_interrupt) | ||
163 | *(.text.release_console_sem) | ||
164 | *(.text.sys_write) | ||
165 | *(.text.sys_brk) | ||
166 | *(.text.dup_mm) | ||
167 | *(.text.read_current_timer) | ||
168 | *(.text.ll_rw_block) | ||
169 | *(.text.blk_rq_map_sg) | ||
170 | *(.text.dbg_userword) | ||
171 | *(.text.__block_commit_write) | ||
172 | *(.text.cache_grow) | ||
173 | *(.text.copy_strings) | ||
174 | *(.text.release_task) | ||
175 | *(.text.do_sync_write) | ||
176 | *(.text.unlock_page) | ||
177 | *(.text.load_elf_binary) | ||
178 | *(.text.__follow_mount) | ||
179 | *(.text.__getblk) | ||
180 | *(.text.do_sys_open) | ||
181 | *(.text.current_kernel_time) | ||
182 | *(.text.call_rcu) | ||
183 | *(.text.write_chan) | ||
184 | *(.text.vsnprintf) | ||
185 | *(.text.dummy_inode_setsecurity) | ||
186 | *(.text.submit_bh) | ||
187 | *(.text.poll_freewait) | ||
188 | *(.text.bio_alloc_bioset) | ||
189 | *(.text.skb_clone) | ||
190 | *(.text.page_waitqueue) | ||
191 | *(.text.__mutex_lock_interruptible_slowpath) | ||
192 | *(.text.get_index) | ||
193 | *(.text.csum_partial_copy_generic) | ||
194 | *(.text.bad_range) | ||
195 | *(.text.remove_vma) | ||
196 | *(.text.cp_new_stat) | ||
197 | *(.text.alloc_arraycache) | ||
198 | *(.text.test_clear_page_writeback) | ||
199 | *(.text.strsep) | ||
200 | *(.text.open_namei) | ||
201 | *(.text._raw_read_unlock) | ||
202 | *(.text.get_vma_policy) | ||
203 | *(.text.__down_write_trylock) | ||
204 | *(.text.find_get_pages) | ||
205 | *(.text.tcp_rcv_established) | ||
206 | *(.text.generic_make_request) | ||
207 | *(.text.__block_write_full_page) | ||
208 | *(.text.cfq_set_request) | ||
209 | *(.text.sys_inotify_init) | ||
210 | *(.text.split_vma) | ||
211 | *(.text.__mod_timer) | ||
212 | *(.text.get_options) | ||
213 | *(.text.vma_link) | ||
214 | *(.text.mpage_writepages) | ||
215 | *(.text.truncate_complete_page) | ||
216 | *(.text.tcp_recvmsg) | ||
217 | *(.text.sigprocmask) | ||
218 | *(.text.filemap_populate) | ||
219 | *(.text.sys_close) | ||
220 | *(.text.inotify_dev_queue_event) | ||
221 | *(.text.do_task_stat) | ||
222 | *(.text.__dentry_open) | ||
223 | *(.text.unlink_file_vma) | ||
224 | *(.text.__pollwait) | ||
225 | *(.text.packet_rcv_spkt) | ||
226 | *(.text.drop_buffers) | ||
227 | *(.text.free_pgtables) | ||
228 | *(.text.generic_file_direct_write) | ||
229 | *(.text.copy_process) | ||
230 | *(.text.netif_receive_skb) | ||
231 | *(.text.dnotify_flush) | ||
232 | *(.text.print_bad_pte) | ||
233 | *(.text.anon_vma_unlink) | ||
234 | *(.text.sys_mprotect) | ||
235 | *(.text.sync_sb_inodes) | ||
236 | *(.text.find_inode_fast) | ||
237 | *(.text.dummy_inode_readlink) | ||
238 | *(.text.putname) | ||
239 | *(.text.init_smp_flush) | ||
240 | *(.text.dbg_redzone2) | ||
241 | *(.text.sk_run_filter) | ||
242 | *(.text.may_expand_vm) | ||
243 | *(.text.generic_file_aio_write) | ||
244 | *(.text.find_next_zero_bit) | ||
245 | *(.text.file_kill) | ||
246 | *(.text.audit_getname) | ||
247 | *(.text.arch_unmap_area_topdown) | ||
248 | *(.text.alloc_page_vma) | ||
249 | *(.text.tcp_transmit_skb) | ||
250 | *(.text.rb_next) | ||
251 | *(.text.dbg_redzone1) | ||
252 | *(.text.generic_file_mmap) | ||
253 | *(.text.vfs_fstat) | ||
254 | *(.text.sys_time) | ||
255 | *(.text.page_lock_anon_vma) | ||
256 | *(.text.get_unmapped_area) | ||
257 | *(.text.remote_llseek) | ||
258 | *(.text.__up_read) | ||
259 | *(.text.fd_install) | ||
260 | *(.text.eventpoll_init_file) | ||
261 | *(.text.dma_alloc_coherent) | ||
262 | *(.text.create_empty_buffers) | ||
263 | *(.text.__mutex_unlock_slowpath) | ||
264 | *(.text.dup_fd) | ||
265 | *(.text.d_alloc) | ||
266 | *(.text.tty_ldisc_try) | ||
267 | *(.text.sys_stime) | ||
268 | *(.text.__rb_rotate_right) | ||
269 | *(.text.d_validate) | ||
270 | *(.text.rb_erase) | ||
271 | *(.text.path_release) | ||
272 | *(.text.memmove) | ||
273 | *(.text.invalidate_complete_page) | ||
274 | *(.text.clear_inode) | ||
275 | *(.text.cache_estimate) | ||
276 | *(.text.alloc_buffer_head) | ||
277 | *(.text.smp_call_function_interrupt) | ||
278 | *(.text.flush_tlb_others) | ||
279 | *(.text.file_move) | ||
280 | *(.text.balance_dirty_pages_ratelimited) | ||
281 | *(.text.vma_prio_tree_add) | ||
282 | *(.text.timespec_trunc) | ||
283 | *(.text.mempool_alloc) | ||
284 | *(.text.iget_locked) | ||
285 | *(.text.d_alloc_root) | ||
286 | *(.text.cpuset_populate_dir) | ||
287 | *(.text.anon_vma_prepare) | ||
288 | *(.text.sys_newstat) | ||
289 | *(.text.alloc_page_interleave) | ||
290 | *(.text.__path_lookup_intent_open) | ||
291 | *(.text.__pagevec_free) | ||
292 | *(.text.inode_init_once) | ||
293 | *(.text.free_vfsmnt) | ||
294 | *(.text.__user_walk_fd) | ||
295 | *(.text.cfq_idle_slice_timer) | ||
296 | *(.text.sys_mmap) | ||
297 | *(.text.sys_llseek) | ||
298 | *(.text.prio_tree_remove) | ||
299 | *(.text.filp_close) | ||
300 | *(.text.file_permission) | ||
301 | *(.text.vma_prio_tree_remove) | ||
302 | *(.text.tcp_ack) | ||
303 | *(.text.nameidata_to_filp) | ||
304 | *(.text.sys_lseek) | ||
305 | *(.text.percpu_counter_mod) | ||
306 | *(.text.igrab) | ||
307 | *(.text.__bread) | ||
308 | *(.text.alloc_inode) | ||
309 | *(.text.filldir) | ||
310 | *(.text.__rb_rotate_left) | ||
311 | *(.text.irq_affinity_write_proc) | ||
312 | *(.text.init_request_from_bio) | ||
313 | *(.text.find_or_create_page) | ||
314 | *(.text.tty_poll) | ||
315 | *(.text.tcp_sendmsg) | ||
316 | *(.text.ide_wait_stat) | ||
317 | *(.text.free_buffer_head) | ||
318 | *(.text.flush_signal_handlers) | ||
319 | *(.text.tcp_v4_rcv) | ||
320 | *(.text.nr_blockdev_pages) | ||
321 | *(.text.locks_remove_flock) | ||
322 | *(.text.__iowrite32_copy) | ||
323 | *(.text.do_filp_open) | ||
324 | *(.text.try_to_release_page) | ||
325 | *(.text.page_add_new_anon_rmap) | ||
326 | *(.text.kmem_cache_size) | ||
327 | *(.text.eth_type_trans) | ||
328 | *(.text.try_to_free_buffers) | ||
329 | *(.text.schedule_tail) | ||
330 | *(.text.proc_lookup) | ||
331 | *(.text.no_llseek) | ||
332 | *(.text.kfree_skbmem) | ||
333 | *(.text.do_wait) | ||
334 | *(.text.do_mpage_readpage) | ||
335 | *(.text.vfs_stat_fd) | ||
336 | *(.text.tty_write) | ||
337 | *(.text.705) | ||
338 | *(.text.sync_page) | ||
339 | *(.text.__remove_shared_vm_struct) | ||
340 | *(.text.__kfree_skb) | ||
341 | *(.text.sock_poll) | ||
342 | *(.text.get_request_wait) | ||
343 | *(.text.do_sigaction) | ||
344 | *(.text.do_brk) | ||
345 | *(.text.tcp_event_data_recv) | ||
346 | *(.text.read_chan) | ||
347 | *(.text.pipe_writev) | ||
348 | *(.text.__emul_lookup_dentry) | ||
349 | *(.text.rtc_get_rtc_time) | ||
350 | *(.text.print_objinfo) | ||
351 | *(.text.file_update_time) | ||
352 | *(.text.do_signal) | ||
353 | *(.text.disable_8259A_irq) | ||
354 | *(.text.blk_queue_bounce) | ||
355 | *(.text.__anon_vma_link) | ||
356 | *(.text.__vma_link) | ||
357 | *(.text.vfs_rename) | ||
358 | *(.text.sys_newlstat) | ||
359 | *(.text.sys_newfstat) | ||
360 | *(.text.sys_mknod) | ||
361 | *(.text.__show_regs) | ||
362 | *(.text.iput) | ||
363 | *(.text.get_signal_to_deliver) | ||
364 | *(.text.flush_tlb_page) | ||
365 | *(.text.debug_mutex_wake_waiter) | ||
366 | *(.text.copy_thread) | ||
367 | *(.text.clear_page_dirty_for_io) | ||
368 | *(.text.buffer_io_error) | ||
369 | *(.text.vfs_permission) | ||
370 | *(.text.truncate_inode_pages_range) | ||
371 | *(.text.sys_recvfrom) | ||
372 | *(.text.remove_suid) | ||
373 | *(.text.mark_buffer_dirty) | ||
374 | *(.text.local_bh_enable) | ||
375 | *(.text.get_zeroed_page) | ||
376 | *(.text.get_vmalloc_info) | ||
377 | *(.text.flush_old_exec) | ||
378 | *(.text.dummy_inode_permission) | ||
379 | *(.text.__bio_add_page) | ||
380 | *(.text.prio_tree_replace) | ||
381 | *(.text.notify_change) | ||
382 | *(.text.mntput_no_expire) | ||
383 | *(.text.fput) | ||
384 | *(.text.__end_that_request_first) | ||
385 | *(.text.wake_up_bit) | ||
386 | *(.text.unuse_mm) | ||
387 | *(.text.skb_release_data) | ||
388 | *(.text.shrink_icache_memory) | ||
389 | *(.text.sched_balance_self) | ||
390 | *(.text.__pmd_alloc) | ||
391 | *(.text.pipe_poll) | ||
392 | *(.text.normal_poll) | ||
393 | *(.text.__free_pages) | ||
394 | *(.text.follow_mount) | ||
395 | *(.text.cdrom_start_packet_command) | ||
396 | *(.text.blk_recount_segments) | ||
397 | *(.text.bio_put) | ||
398 | *(.text.__alloc_skb) | ||
399 | *(.text.__wake_up) | ||
400 | *(.text.vm_stat_account) | ||
401 | *(.text.sys_fcntl) | ||
402 | *(.text.sys_fadvise64) | ||
403 | *(.text._raw_write_unlock) | ||
404 | *(.text.__pud_alloc) | ||
405 | *(.text.alloc_page_buffers) | ||
406 | *(.text.vfs_llseek) | ||
407 | *(.text.sockfd_lookup) | ||
408 | *(.text._raw_write_lock) | ||
409 | *(.text.put_compound_page) | ||
410 | *(.text.prune_dcache) | ||
411 | *(.text.pipe_readv) | ||
412 | *(.text.mempool_free) | ||
413 | *(.text.make_ahead_window) | ||
414 | *(.text.lru_add_drain) | ||
415 | *(.text.constant_test_bit) | ||
416 | *(.text.__clear_user) | ||
417 | *(.text.arch_unmap_area) | ||
418 | *(.text.anon_vma_link) | ||
419 | *(.text.sys_chroot) | ||
420 | *(.text.setup_arg_pages) | ||
421 | *(.text.radix_tree_preload) | ||
422 | *(.text.init_rwsem) | ||
423 | *(.text.generic_osync_inode) | ||
424 | *(.text.generic_delete_inode) | ||
425 | *(.text.do_sys_poll) | ||
426 | *(.text.dev_queue_xmit) | ||
427 | *(.text.default_llseek) | ||
428 | *(.text.__writeback_single_inode) | ||
429 | *(.text.vfs_ioctl) | ||
430 | *(.text.__up_write) | ||
431 | *(.text.unix_poll) | ||
432 | *(.text.sys_rt_sigprocmask) | ||
433 | *(.text.sock_recvmsg) | ||
434 | *(.text.recalc_bh_state) | ||
435 | *(.text.__put_unused_fd) | ||
436 | *(.text.process_backlog) | ||
437 | *(.text.locks_remove_posix) | ||
438 | *(.text.lease_modify) | ||
439 | *(.text.expand_files) | ||
440 | *(.text.end_buffer_read_nobh) | ||
441 | *(.text.d_splice_alias) | ||
442 | *(.text.debug_mutex_init_waiter) | ||
443 | *(.text.copy_from_user) | ||
444 | *(.text.cap_vm_enough_memory) | ||
445 | *(.text.show_vfsmnt) | ||
446 | *(.text.release_sock) | ||
447 | *(.text.pfifo_fast_enqueue) | ||
448 | *(.text.half_md4_transform) | ||
449 | *(.text.fs_may_remount_ro) | ||
450 | *(.text.do_fork) | ||
451 | *(.text.copy_hugetlb_page_range) | ||
452 | *(.text.cache_free_debugcheck) | ||
453 | *(.text.__tcp_select_window) | ||
454 | *(.text.task_handoff_register) | ||
455 | *(.text.sys_open) | ||
456 | *(.text.strlcpy) | ||
457 | *(.text.skb_copy_datagram_iovec) | ||
458 | *(.text.set_up_list3s) | ||
459 | *(.text.release_open_intent) | ||
460 | *(.text.qdisc_restart) | ||
461 | *(.text.n_tty_chars_in_buffer) | ||
462 | *(.text.inode_change_ok) | ||
463 | *(.text.__downgrade_write) | ||
464 | *(.text.debug_mutex_unlock) | ||
465 | *(.text.add_timer_randomness) | ||
466 | *(.text.sock_common_recvmsg) | ||
467 | *(.text.set_bh_page) | ||
468 | *(.text.printk_lock) | ||
469 | *(.text.path_release_on_umount) | ||
470 | *(.text.ip_output) | ||
471 | *(.text.ide_build_dmatable) | ||
472 | *(.text.__get_user_8) | ||
473 | *(.text.end_buffer_read_sync) | ||
474 | *(.text.__d_path) | ||
475 | *(.text.d_move) | ||
476 | *(.text.del_timer) | ||
477 | *(.text.constant_test_bit) | ||
478 | *(.text.blockable_page_cache_readahead) | ||
479 | *(.text.tty_read) | ||
480 | *(.text.sys_readlink) | ||
481 | *(.text.sys_faccessat) | ||
482 | *(.text.read_swap_cache_async) | ||
483 | *(.text.pty_write_room) | ||
484 | *(.text.page_address_in_vma) | ||
485 | *(.text.kthread) | ||
486 | *(.text.cfq_exit_io_context) | ||
487 | *(.text.__tcp_push_pending_frames) | ||
488 | *(.text.sys_pipe) | ||
489 | *(.text.submit_bio) | ||
490 | *(.text.pid_revalidate) | ||
491 | *(.text.page_referenced_file) | ||
492 | *(.text.lock_sock) | ||
493 | *(.text.get_page_state_node) | ||
494 | *(.text.generic_block_bmap) | ||
495 | *(.text.do_setitimer) | ||
496 | *(.text.dev_queue_xmit_nit) | ||
497 | *(.text.copy_from_read_buf) | ||
498 | *(.text.__const_udelay) | ||
499 | *(.text.console_conditional_schedule) | ||
500 | *(.text.wake_up_new_task) | ||
501 | *(.text.wait_for_completion_interruptible) | ||
502 | *(.text.tcp_rcv_rtt_update) | ||
503 | *(.text.sys_mlockall) | ||
504 | *(.text.set_fs_altroot) | ||
505 | *(.text.schedule_timeout) | ||
506 | *(.text.nr_free_pagecache_pages) | ||
507 | *(.text.nf_iterate) | ||
508 | *(.text.mapping_tagged) | ||
509 | *(.text.ip_queue_xmit) | ||
510 | *(.text.ip_local_deliver) | ||
511 | *(.text.follow_page) | ||
512 | *(.text.elf_map) | ||
513 | *(.text.dummy_file_permission) | ||
514 | *(.text.dispose_list) | ||
515 | *(.text.dentry_open) | ||
516 | *(.text.dentry_iput) | ||
517 | *(.text.bio_alloc) | ||
518 | *(.text.alloc_skb_from_cache) | ||
519 | *(.text.wait_on_page_bit) | ||
520 | *(.text.vfs_readdir) | ||
521 | *(.text.vfs_lstat) | ||
522 | *(.text.seq_escape) | ||
523 | *(.text.__posix_lock_file) | ||
524 | *(.text.mm_release) | ||
525 | *(.text.kref_put) | ||
526 | *(.text.ip_rcv) | ||
527 | *(.text.__iget) | ||
528 | *(.text.free_pages) | ||
529 | *(.text.find_mergeable_anon_vma) | ||
530 | *(.text.find_extend_vma) | ||
531 | *(.text.dummy_inode_listsecurity) | ||
532 | *(.text.bio_add_page) | ||
533 | *(.text.__vm_enough_memory) | ||
534 | *(.text.vfs_stat) | ||
535 | *(.text.tty_paranoia_check) | ||
536 | *(.text.tcp_read_sock) | ||
537 | *(.text.tcp_data_queue) | ||
538 | *(.text.sys_uname) | ||
539 | *(.text.sys_renameat) | ||
540 | *(.text.__strncpy_from_user) | ||
541 | *(.text.__mutex_init) | ||
542 | *(.text.__lookup_hash) | ||
543 | *(.text.kref_get) | ||
544 | *(.text.ip_route_input) | ||
545 | *(.text.__insert_inode_hash) | ||
546 | *(.text.do_sock_write) | ||
547 | *(.text.blk_done_softirq) | ||
548 | *(.text.__wake_up_sync) | ||
549 | *(.text.__vma_link_rb) | ||
550 | *(.text.tty_ioctl) | ||
551 | *(.text.tracesys) | ||
552 | *(.text.sys_getdents) | ||
553 | *(.text.sys_dup) | ||
554 | *(.text.stub_execve) | ||
555 | *(.text.sha_transform) | ||
556 | *(.text.radix_tree_tag_clear) | ||
557 | *(.text.put_unused_fd) | ||
558 | *(.text.put_files_struct) | ||
559 | *(.text.mpage_readpages) | ||
560 | *(.text.may_delete) | ||
561 | *(.text.kmem_cache_create) | ||
562 | *(.text.ip_mc_output) | ||
563 | *(.text.interleave_nodes) | ||
564 | *(.text.groups_search) | ||
565 | *(.text.generic_drop_inode) | ||
566 | *(.text.generic_commit_write) | ||
567 | *(.text.fcntl_setlk) | ||
568 | *(.text.exit_mmap) | ||
569 | *(.text.end_page_writeback) | ||
570 | *(.text.__d_rehash) | ||
571 | *(.text.debug_mutex_free_waiter) | ||
572 | *(.text.csum_ipv6_magic) | ||
573 | *(.text.count) | ||
574 | *(.text.cleanup_rbuf) | ||
575 | *(.text.check_spinlock_acquired_node) | ||
576 | *(.text.can_vma_merge_after) | ||
577 | *(.text.bio_endio) | ||
578 | *(.text.alloc_pidmap) | ||
579 | *(.text.write_ldt) | ||
580 | *(.text.vmtruncate_range) | ||
581 | *(.text.vfs_create) | ||
582 | *(.text.__user_walk) | ||
583 | *(.text.update_send_head) | ||
584 | *(.text.unmap_underlying_metadata) | ||
585 | *(.text.tty_ldisc_deref) | ||
586 | *(.text.tcp_setsockopt) | ||
587 | *(.text.tcp_send_ack) | ||
588 | *(.text.sys_pause) | ||
589 | *(.text.sys_gettimeofday) | ||
590 | *(.text.sync_dirty_buffer) | ||
591 | *(.text.strncmp) | ||
592 | *(.text.release_posix_timer) | ||
593 | *(.text.proc_file_read) | ||
594 | *(.text.prepare_to_wait) | ||
595 | *(.text.locks_mandatory_locked) | ||
596 | *(.text.interruptible_sleep_on_timeout) | ||
597 | *(.text.inode_sub_bytes) | ||
598 | *(.text.in_group_p) | ||
599 | *(.text.hrtimer_try_to_cancel) | ||
600 | *(.text.filldir64) | ||
601 | *(.text.fasync_helper) | ||
602 | *(.text.dummy_sb_pivotroot) | ||
603 | *(.text.d_lookup) | ||
604 | *(.text.d_instantiate) | ||
605 | *(.text.__d_find_alias) | ||
606 | *(.text.cpu_idle_wait) | ||
607 | *(.text.cond_resched_lock) | ||
608 | *(.text.chown_common) | ||
609 | *(.text.blk_congestion_wait) | ||
610 | *(.text.activate_page) | ||
611 | *(.text.unlock_buffer) | ||
612 | *(.text.tty_wakeup) | ||
613 | *(.text.tcp_v4_do_rcv) | ||
614 | *(.text.tcp_current_mss) | ||
615 | *(.text.sys_openat) | ||
616 | *(.text.sys_fchdir) | ||
617 | *(.text.strnlen_user) | ||
618 | *(.text.strnlen) | ||
619 | *(.text.strchr) | ||
620 | *(.text.sock_common_getsockopt) | ||
621 | *(.text.skb_checksum) | ||
622 | *(.text.remove_wait_queue) | ||
623 | *(.text.rb_replace_node) | ||
624 | *(.text.radix_tree_node_ctor) | ||
625 | *(.text.pty_chars_in_buffer) | ||
626 | *(.text.profile_hit) | ||
627 | *(.text.prio_tree_left) | ||
628 | *(.text.pgd_clear_bad) | ||
629 | *(.text.pfifo_fast_dequeue) | ||
630 | *(.text.page_referenced) | ||
631 | *(.text.open_exec) | ||
632 | *(.text.mmput) | ||
633 | *(.text.mm_init) | ||
634 | *(.text.__ide_dma_off_quietly) | ||
635 | *(.text.ide_dma_intr) | ||
636 | *(.text.hrtimer_start) | ||
637 | *(.text.get_io_context) | ||
638 | *(.text.__get_free_pages) | ||
639 | *(.text.find_first_zero_bit) | ||
640 | *(.text.file_free_rcu) | ||
641 | *(.text.dummy_socket_sendmsg) | ||
642 | *(.text.do_unlinkat) | ||
643 | *(.text.do_arch_prctl) | ||
644 | *(.text.destroy_inode) | ||
645 | *(.text.can_vma_merge_before) | ||
646 | *(.text.block_sync_page) | ||
647 | *(.text.block_prepare_write) | ||
648 | *(.text.bio_init) | ||
649 | *(.text.arch_ptrace) | ||
650 | *(.text.wake_up_inode) | ||
651 | *(.text.wait_on_retry_sync_kiocb) | ||
652 | *(.text.vma_prio_tree_next) | ||
653 | *(.text.tcp_rcv_space_adjust) | ||
654 | *(.text.__tcp_ack_snd_check) | ||
655 | *(.text.sys_utime) | ||
656 | *(.text.sys_recvmsg) | ||
657 | *(.text.sys_mremap) | ||
658 | *(.text.sys_bdflush) | ||
659 | *(.text.sleep_on) | ||
660 | *(.text.set_page_dirty_lock) | ||
661 | *(.text.seq_path) | ||
662 | *(.text.schedule_timeout_interruptible) | ||
663 | *(.text.sched_fork) | ||
664 | *(.text.rt_run_flush) | ||
665 | *(.text.profile_munmap) | ||
666 | *(.text.prepare_binprm) | ||
667 | *(.text.__pagevec_release_nonlru) | ||
668 | *(.text.m_show) | ||
669 | *(.text.lookup_mnt) | ||
670 | *(.text.__lookup_mnt) | ||
671 | *(.text.lock_timer_base) | ||
672 | *(.text.is_subdir) | ||
673 | *(.text.invalidate_bh_lru) | ||
674 | *(.text.init_buffer_head) | ||
675 | *(.text.ifind_fast) | ||
676 | *(.text.ide_dma_start) | ||
677 | *(.text.__get_page_state) | ||
678 | *(.text.flock_to_posix_lock) | ||
679 | *(.text.__find_symbol) | ||
680 | *(.text.do_futex) | ||
681 | *(.text.do_execve) | ||
682 | *(.text.dirty_writeback_centisecs_handler) | ||
683 | *(.text.dev_watchdog) | ||
684 | *(.text.can_share_swap_page) | ||
685 | *(.text.blkdev_put) | ||
686 | *(.text.bio_get_nr_vecs) | ||
687 | *(.text.xfrm_compile_policy) | ||
688 | *(.text.vma_prio_tree_insert) | ||
689 | *(.text.vfs_lstat_fd) | ||
690 | *(.text.__user_path_lookup_open) | ||
691 | *(.text.thread_return) | ||
692 | *(.text.tcp_send_delayed_ack) | ||
693 | *(.text.sock_def_error_report) | ||
694 | *(.text.shrink_slab) | ||
695 | *(.text.serial_out) | ||
696 | *(.text.seq_read) | ||
697 | *(.text.secure_ip_id) | ||
698 | *(.text.search_binary_handler) | ||
699 | *(.text.proc_pid_unhash) | ||
700 | *(.text.pagevec_lookup) | ||
701 | *(.text.new_inode) | ||
702 | *(.text.memcpy_toiovec) | ||
703 | *(.text.locks_free_lock) | ||
704 | *(.text.__lock_page) | ||
705 | *(.text.__lock_buffer) | ||
706 | *(.text.load_module) | ||
707 | *(.text.is_bad_inode) | ||
708 | *(.text.invalidate_inode_buffers) | ||
709 | *(.text.insert_vm_struct) | ||
710 | *(.text.inode_setattr) | ||
711 | *(.text.inode_add_bytes) | ||
712 | *(.text.ide_read_24) | ||
713 | *(.text.ide_get_error_location) | ||
714 | *(.text.ide_do_drive_cmd) | ||
715 | *(.text.get_locked_pte) | ||
716 | *(.text.get_filesystem_list) | ||
717 | *(.text.generic_file_open) | ||
718 | *(.text.follow_down) | ||
719 | *(.text.find_next_bit) | ||
720 | *(.text.__find_first_bit) | ||
721 | *(.text.exit_mm) | ||
722 | *(.text.exec_keys) | ||
723 | *(.text.end_buffer_write_sync) | ||
724 | *(.text.end_bio_bh_io_sync) | ||
725 | *(.text.dummy_socket_shutdown) | ||
726 | *(.text.d_rehash) | ||
727 | *(.text.d_path) | ||
728 | *(.text.do_ioctl) | ||
729 | *(.text.dget_locked) | ||
730 | *(.text.copy_thread_group_keys) | ||
731 | *(.text.cdrom_end_request) | ||
732 | *(.text.cap_bprm_apply_creds) | ||
733 | *(.text.blk_rq_bio_prep) | ||
734 | *(.text.__bitmap_intersects) | ||
735 | *(.text.bio_phys_segments) | ||
736 | *(.text.bio_free) | ||
737 | *(.text.arch_get_unmapped_area_topdown) | ||
738 | *(.text.writeback_in_progress) | ||
739 | *(.text.vfs_follow_link) | ||
740 | *(.text.tcp_rcv_state_process) | ||
741 | *(.text.tcp_check_space) | ||
742 | *(.text.sys_stat) | ||
743 | *(.text.sys_rt_sigreturn) | ||
744 | *(.text.sys_rt_sigaction) | ||
745 | *(.text.sys_remap_file_pages) | ||
746 | *(.text.sys_pwrite64) | ||
747 | *(.text.sys_fchownat) | ||
748 | *(.text.sys_fchmodat) | ||
749 | *(.text.strncat) | ||
750 | *(.text.strlcat) | ||
751 | *(.text.strcmp) | ||
752 | *(.text.steal_locks) | ||
753 | *(.text.sock_create) | ||
754 | *(.text.sk_stream_rfree) | ||
755 | *(.text.sk_stream_mem_schedule) | ||
756 | *(.text.skip_atoi) | ||
757 | *(.text.sk_alloc) | ||
758 | *(.text.show_stat) | ||
759 | *(.text.set_fs_pwd) | ||
760 | *(.text.set_binfmt) | ||
761 | *(.text.pty_unthrottle) | ||
762 | *(.text.proc_symlink) | ||
763 | *(.text.pipe_release) | ||
764 | *(.text.pageout) | ||
765 | *(.text.n_tty_write_wakeup) | ||
766 | *(.text.n_tty_ioctl) | ||
767 | *(.text.nr_free_zone_pages) | ||
768 | *(.text.migration_thread) | ||
769 | *(.text.mempool_free_slab) | ||
770 | *(.text.meminfo_read_proc) | ||
771 | *(.text.max_sane_readahead) | ||
772 | *(.text.lru_cache_add) | ||
773 | *(.text.kill_fasync) | ||
774 | *(.text.kernel_read) | ||
775 | *(.text.invalidate_mapping_pages) | ||
776 | *(.text.inode_has_buffers) | ||
777 | *(.text.init_once) | ||
778 | *(.text.inet_sendmsg) | ||
779 | *(.text.idedisk_issue_flush) | ||
780 | *(.text.generic_file_write) | ||
781 | *(.text.free_more_memory) | ||
782 | *(.text.__free_fdtable) | ||
783 | *(.text.filp_dtor) | ||
784 | *(.text.exit_sem) | ||
785 | *(.text.exit_itimers) | ||
786 | *(.text.error_interrupt) | ||
787 | *(.text.end_buffer_async_write) | ||
788 | *(.text.eligible_child) | ||
789 | *(.text.elf_map) | ||
790 | *(.text.dump_task_regs) | ||
791 | *(.text.dummy_task_setscheduler) | ||
792 | *(.text.dummy_socket_accept) | ||
793 | *(.text.dummy_file_free_security) | ||
794 | *(.text.__down_read) | ||
795 | *(.text.do_sock_read) | ||
796 | *(.text.do_sigaltstack) | ||
797 | *(.text.do_mremap) | ||
798 | *(.text.current_io_context) | ||
799 | *(.text.cpu_swap_callback) | ||
800 | *(.text.copy_vma) | ||
801 | *(.text.cap_bprm_set_security) | ||
802 | *(.text.blk_insert_request) | ||
803 | *(.text.bio_map_kern_endio) | ||
804 | *(.text.bio_hw_segments) | ||
805 | *(.text.bictcp_cong_avoid) | ||
806 | *(.text.add_interrupt_randomness) | ||
807 | *(.text.wait_for_completion) | ||
808 | *(.text.version_read_proc) | ||
809 | *(.text.unix_write_space) | ||
810 | *(.text.tty_ldisc_ref_wait) | ||
811 | *(.text.tty_ldisc_put) | ||
812 | *(.text.try_to_wake_up) | ||
813 | *(.text.tcp_v4_tw_remember_stamp) | ||
814 | *(.text.tcp_try_undo_dsack) | ||
815 | *(.text.tcp_may_send_now) | ||
816 | *(.text.sys_waitid) | ||
817 | *(.text.sys_sched_getparam) | ||
818 | *(.text.sys_getppid) | ||
819 | *(.text.sys_getcwd) | ||
820 | *(.text.sys_dup2) | ||
821 | *(.text.sys_chmod) | ||
822 | *(.text.sys_chdir) | ||
823 | *(.text.sprintf) | ||
824 | *(.text.sock_wfree) | ||
825 | *(.text.sock_aio_write) | ||
826 | *(.text.skb_drop_fraglist) | ||
827 | *(.text.skb_dequeue) | ||
828 | *(.text.set_close_on_exec) | ||
829 | *(.text.set_brk) | ||
830 | *(.text.seq_puts) | ||
831 | *(.text.SELECT_DRIVE) | ||
832 | *(.text.sched_exec) | ||
833 | *(.text.return_EIO) | ||
834 | *(.text.remove_from_page_cache) | ||
835 | *(.text.rcu_start_batch) | ||
836 | *(.text.__put_task_struct) | ||
837 | *(.text.proc_pid_readdir) | ||
838 | *(.text.proc_get_inode) | ||
839 | *(.text.prepare_to_wait_exclusive) | ||
840 | *(.text.pipe_wait) | ||
841 | *(.text.pipe_new) | ||
842 | *(.text.pdflush_operation) | ||
843 | *(.text.__pagevec_release) | ||
844 | *(.text.pagevec_lookup_tag) | ||
845 | *(.text.packet_rcv) | ||
846 | *(.text.n_tty_set_room) | ||
847 | *(.text.nr_free_pages) | ||
848 | *(.text.__net_timestamp) | ||
849 | *(.text.mpage_end_io_read) | ||
850 | *(.text.mod_timer) | ||
851 | *(.text.__memcpy) | ||
852 | *(.text.mb_cache_shrink_fn) | ||
853 | *(.text.lock_rename) | ||
854 | *(.text.kstrdup) | ||
855 | *(.text.is_ignored) | ||
856 | *(.text.int_very_careful) | ||
857 | *(.text.inotify_inode_is_dead) | ||
858 | *(.text.inotify_get_cookie) | ||
859 | *(.text.inode_get_bytes) | ||
860 | *(.text.init_timer) | ||
861 | *(.text.init_dev) | ||
862 | *(.text.inet_getname) | ||
863 | *(.text.ide_map_sg) | ||
864 | *(.text.__ide_dma_end) | ||
865 | *(.text.hrtimer_get_remaining) | ||
866 | *(.text.get_task_mm) | ||
867 | *(.text.get_random_int) | ||
868 | *(.text.free_pipe_info) | ||
869 | *(.text.filemap_write_and_wait_range) | ||
870 | *(.text.exit_thread) | ||
871 | *(.text.enter_idle) | ||
872 | *(.text.end_that_request_first) | ||
873 | *(.text.end_8259A_irq) | ||
874 | *(.text.dummy_file_alloc_security) | ||
875 | *(.text.do_group_exit) | ||
876 | *(.text.debug_mutex_init) | ||
877 | *(.text.cpuset_exit) | ||
878 | *(.text.cpu_idle) | ||
879 | *(.text.copy_semundo) | ||
880 | *(.text.copy_files) | ||
881 | *(.text.chrdev_open) | ||
882 | *(.text.cdrom_transfer_packet_command) | ||
883 | *(.text.cdrom_mode_sense) | ||
884 | *(.text.blk_phys_contig_segment) | ||
885 | *(.text.blk_get_queue) | ||
886 | *(.text.bio_split) | ||
887 | *(.text.audit_alloc) | ||
888 | *(.text.anon_pipe_buf_release) | ||
889 | *(.text.add_wait_queue_exclusive) | ||
890 | *(.text.add_wait_queue) | ||
891 | *(.text.acct_process) | ||
892 | *(.text.account) | ||
893 | *(.text.zeromap_page_range) | ||
894 | *(.text.yield) | ||
895 | *(.text.writeback_acquire) | ||
896 | *(.text.worker_thread) | ||
897 | *(.text.wait_on_page_writeback_range) | ||
898 | *(.text.__wait_on_buffer) | ||
899 | *(.text.vscnprintf) | ||
900 | *(.text.vmalloc_to_pfn) | ||
901 | *(.text.vgacon_save_screen) | ||
902 | *(.text.vfs_unlink) | ||
903 | *(.text.vfs_rmdir) | ||
904 | *(.text.unregister_md_personality) | ||
905 | *(.text.unlock_new_inode) | ||
906 | *(.text.unix_stream_sendmsg) | ||
907 | *(.text.unix_stream_recvmsg) | ||
908 | *(.text.unhash_process) | ||
909 | *(.text.udp_v4_lookup_longway) | ||
910 | *(.text.tty_ldisc_flush) | ||
911 | *(.text.tty_ldisc_enable) | ||
912 | *(.text.tty_hung_up_p) | ||
913 | *(.text.tty_buffer_free_all) | ||
914 | *(.text.tso_fragment) | ||
915 | *(.text.try_to_del_timer_sync) | ||
916 | *(.text.tcp_v4_err) | ||
917 | *(.text.tcp_unhash) | ||
918 | *(.text.tcp_seq_next) | ||
919 | *(.text.tcp_select_initial_window) | ||
920 | *(.text.tcp_sacktag_write_queue) | ||
921 | *(.text.tcp_cwnd_validate) | ||
922 | *(.text.sys_vhangup) | ||
923 | *(.text.sys_uselib) | ||
924 | *(.text.sys_symlink) | ||
925 | *(.text.sys_signal) | ||
926 | *(.text.sys_poll) | ||
927 | *(.text.sys_mount) | ||
928 | *(.text.sys_kill) | ||
929 | *(.text.sys_ioctl) | ||
930 | *(.text.sys_inotify_add_watch) | ||
931 | *(.text.sys_getuid) | ||
932 | *(.text.sys_getrlimit) | ||
933 | *(.text.sys_getitimer) | ||
934 | *(.text.sys_getgroups) | ||
935 | *(.text.sys_ftruncate) | ||
936 | *(.text.sysfs_lookup) | ||
937 | *(.text.sys_exit_group) | ||
938 | *(.text.stub_fork) | ||
939 | *(.text.sscanf) | ||
940 | *(.text.sock_map_fd) | ||
941 | *(.text.sock_get_timestamp) | ||
942 | *(.text.__sock_create) | ||
943 | *(.text.smp_call_function_single) | ||
944 | *(.text.sk_stop_timer) | ||
945 | *(.text.skb_copy_and_csum_datagram) | ||
946 | *(.text.__skb_checksum_complete) | ||
947 | *(.text.single_next) | ||
948 | *(.text.sigqueue_alloc) | ||
949 | *(.text.shrink_dcache_parent) | ||
950 | *(.text.select_idle_routine) | ||
951 | *(.text.run_workqueue) | ||
952 | *(.text.run_local_timers) | ||
953 | *(.text.remove_inode_hash) | ||
954 | *(.text.remove_dquot_ref) | ||
955 | *(.text.register_binfmt) | ||
956 | *(.text.read_cache_pages) | ||
957 | *(.text.rb_last) | ||
958 | *(.text.pty_open) | ||
959 | *(.text.proc_root_readdir) | ||
960 | *(.text.proc_pid_flush) | ||
961 | *(.text.proc_pident_lookup) | ||
962 | *(.text.proc_fill_super) | ||
963 | *(.text.proc_exe_link) | ||
964 | *(.text.posix_locks_deadlock) | ||
965 | *(.text.pipe_iov_copy_from_user) | ||
966 | *(.text.opost) | ||
967 | *(.text.nf_register_hook) | ||
968 | *(.text.netif_rx_ni) | ||
969 | *(.text.m_start) | ||
970 | *(.text.mpage_writepage) | ||
971 | *(.text.mm_alloc) | ||
972 | *(.text.memory_open) | ||
973 | *(.text.mark_buffer_async_write) | ||
974 | *(.text.lru_add_drain_all) | ||
975 | *(.text.locks_init_lock) | ||
976 | *(.text.locks_delete_lock) | ||
977 | *(.text.lock_hrtimer_base) | ||
978 | *(.text.load_script) | ||
979 | *(.text.__kill_fasync) | ||
980 | *(.text.ip_mc_sf_allow) | ||
981 | *(.text.__ioremap) | ||
982 | *(.text.int_with_check) | ||
983 | *(.text.int_sqrt) | ||
984 | *(.text.install_thread_keyring) | ||
985 | *(.text.init_page_buffers) | ||
986 | *(.text.inet_sock_destruct) | ||
987 | *(.text.idle_notifier_register) | ||
988 | *(.text.ide_execute_command) | ||
989 | *(.text.ide_end_drive_cmd) | ||
990 | *(.text.__ide_dma_host_on) | ||
991 | *(.text.hrtimer_run_queues) | ||
992 | *(.text.hpet_mask_rtc_irq_bit) | ||
993 | *(.text.__get_zone_counts) | ||
994 | *(.text.get_zone_counts) | ||
995 | *(.text.get_write_access) | ||
996 | *(.text.get_fs_struct) | ||
997 | *(.text.get_dirty_limits) | ||
998 | *(.text.generic_readlink) | ||
999 | *(.text.free_hot_page) | ||
1000 | *(.text.finish_wait) | ||
1001 | *(.text.find_inode) | ||
1002 | *(.text.find_first_bit) | ||
1003 | *(.text.__filemap_fdatawrite_range) | ||
1004 | *(.text.__filemap_copy_from_user_iovec) | ||
1005 | *(.text.exit_aio) | ||
1006 | *(.text.elv_set_request) | ||
1007 | *(.text.elv_former_request) | ||
1008 | *(.text.dup_namespace) | ||
1009 | *(.text.dupfd) | ||
1010 | *(.text.dummy_socket_getsockopt) | ||
1011 | *(.text.dummy_sb_post_mountroot) | ||
1012 | *(.text.dummy_quotactl) | ||
1013 | *(.text.dummy_inode_rename) | ||
1014 | *(.text.__do_SAK) | ||
1015 | *(.text.do_pipe) | ||
1016 | *(.text.do_fsync) | ||
1017 | *(.text.d_instantiate_unique) | ||
1018 | *(.text.d_find_alias) | ||
1019 | *(.text.deny_write_access) | ||
1020 | *(.text.dentry_unhash) | ||
1021 | *(.text.d_delete) | ||
1022 | *(.text.datagram_poll) | ||
1023 | *(.text.cpuset_fork) | ||
1024 | *(.text.cpuid_read) | ||
1025 | *(.text.copy_namespace) | ||
1026 | *(.text.cond_resched) | ||
1027 | *(.text.check_version) | ||
1028 | *(.text.__change_page_attr) | ||
1029 | *(.text.cfq_slab_kill) | ||
1030 | *(.text.cfq_completed_request) | ||
1031 | *(.text.cdrom_pc_intr) | ||
1032 | *(.text.cdrom_decode_status) | ||
1033 | *(.text.cap_capset_check) | ||
1034 | *(.text.blk_put_request) | ||
1035 | *(.text.bio_fs_destructor) | ||
1036 | *(.text.bictcp_min_cwnd) | ||
1037 | *(.text.alloc_chrdev_region) | ||
1038 | *(.text.add_element) | ||
1039 | *(.text.acct_update_integrals) | ||
1040 | *(.text.write_boundary_block) | ||
1041 | *(.text.writeback_release) | ||
1042 | *(.text.writeback_inodes) | ||
1043 | *(.text.wake_up_state) | ||
1044 | *(.text.__wake_up_locked) | ||
1045 | *(.text.wake_futex) | ||
1046 | *(.text.wait_task_inactive) | ||
1047 | *(.text.__wait_on_freeing_inode) | ||
1048 | *(.text.wait_noreap_copyout) | ||
1049 | *(.text.vmstat_start) | ||
1050 | *(.text.vgacon_do_font_op) | ||
1051 | *(.text.vfs_readv) | ||
1052 | *(.text.vfs_quota_sync) | ||
1053 | *(.text.update_queue) | ||
1054 | *(.text.unshare_files) | ||
1055 | *(.text.unmap_vm_area) | ||
1056 | *(.text.unix_socketpair) | ||
1057 | *(.text.unix_release_sock) | ||
1058 | *(.text.unix_detach_fds) | ||
1059 | *(.text.unix_create1) | ||
1060 | *(.text.unix_bind) | ||
1061 | *(.text.udp_sendmsg) | ||
1062 | *(.text.udp_rcv) | ||
1063 | *(.text.udp_queue_rcv_skb) | ||
1064 | *(.text.uart_write) | ||
1065 | *(.text.uart_startup) | ||
1066 | *(.text.uart_open) | ||
1067 | *(.text.tty_vhangup) | ||
1068 | *(.text.tty_termios_baud_rate) | ||
1069 | *(.text.tty_release) | ||
1070 | *(.text.tty_ldisc_ref) | ||
1071 | *(.text.throttle_vm_writeout) | ||
1072 | *(.text.058) | ||
1073 | *(.text.tcp_xmit_probe_skb) | ||
1074 | *(.text.tcp_v4_send_check) | ||
1075 | *(.text.tcp_v4_destroy_sock) | ||
1076 | *(.text.tcp_sync_mss) | ||
1077 | *(.text.tcp_snd_test) | ||
1078 | *(.text.tcp_slow_start) | ||
1079 | *(.text.tcp_send_fin) | ||
1080 | *(.text.tcp_rtt_estimator) | ||
1081 | *(.text.tcp_parse_options) | ||
1082 | *(.text.tcp_ioctl) | ||
1083 | *(.text.tcp_init_tso_segs) | ||
1084 | *(.text.tcp_init_cwnd) | ||
1085 | *(.text.tcp_getsockopt) | ||
1086 | *(.text.tcp_fin) | ||
1087 | *(.text.tcp_connect) | ||
1088 | *(.text.tcp_cong_avoid) | ||
1089 | *(.text.__tcp_checksum_complete_user) | ||
1090 | *(.text.task_dumpable) | ||
1091 | *(.text.sys_wait4) | ||
1092 | *(.text.sys_utimes) | ||
1093 | *(.text.sys_symlinkat) | ||
1094 | *(.text.sys_socketpair) | ||
1095 | *(.text.sys_rmdir) | ||
1096 | *(.text.sys_readahead) | ||
1097 | *(.text.sys_nanosleep) | ||
1098 | *(.text.sys_linkat) | ||
1099 | *(.text.sys_fstat) | ||
1100 | *(.text.sysfs_readdir) | ||
1101 | *(.text.sys_execve) | ||
1102 | *(.text.sysenter_tracesys) | ||
1103 | *(.text.sys_chown) | ||
1104 | *(.text.stub_clone) | ||
1105 | *(.text.strrchr) | ||
1106 | *(.text.strncpy) | ||
1107 | *(.text.stopmachine_set_state) | ||
1108 | *(.text.sock_sendmsg) | ||
1109 | *(.text.sock_release) | ||
1110 | *(.text.sock_fasync) | ||
1111 | *(.text.sock_close) | ||
1112 | *(.text.sk_stream_write_space) | ||
1113 | *(.text.sk_reset_timer) | ||
1114 | *(.text.skb_split) | ||
1115 | *(.text.skb_recv_datagram) | ||
1116 | *(.text.skb_queue_tail) | ||
1117 | *(.text.sk_attach_filter) | ||
1118 | *(.text.si_swapinfo) | ||
1119 | *(.text.simple_strtoll) | ||
1120 | *(.text.set_termios) | ||
1121 | *(.text.set_task_comm) | ||
1122 | *(.text.set_shrinker) | ||
1123 | *(.text.set_normalized_timespec) | ||
1124 | *(.text.set_brk) | ||
1125 | *(.text.serial_in) | ||
1126 | *(.text.seq_printf) | ||
1127 | *(.text.secure_dccp_sequence_number) | ||
1128 | *(.text.rwlock_bug) | ||
1129 | *(.text.rt_hash_code) | ||
1130 | *(.text.__rta_fill) | ||
1131 | *(.text.__request_resource) | ||
1132 | *(.text.relocate_new_kernel) | ||
1133 | *(.text.release_thread) | ||
1134 | *(.text.release_mem) | ||
1135 | *(.text.rb_prev) | ||
1136 | *(.text.rb_first) | ||
1137 | *(.text.random_poll) | ||
1138 | *(.text.__put_super_and_need_restart) | ||
1139 | *(.text.pty_write) | ||
1140 | *(.text.ptrace_stop) | ||
1141 | *(.text.proc_self_readlink) | ||
1142 | *(.text.proc_root_lookup) | ||
1143 | *(.text.proc_root_link) | ||
1144 | *(.text.proc_pid_make_inode) | ||
1145 | *(.text.proc_pid_attr_write) | ||
1146 | *(.text.proc_lookupfd) | ||
1147 | *(.text.proc_delete_inode) | ||
1148 | *(.text.posix_same_owner) | ||
1149 | *(.text.posix_block_lock) | ||
1150 | *(.text.poll_initwait) | ||
1151 | *(.text.pipe_write) | ||
1152 | *(.text.pipe_read_fasync) | ||
1153 | *(.text.pipe_ioctl) | ||
1154 | *(.text.pdflush) | ||
1155 | *(.text.pci_user_read_config_dword) | ||
1156 | *(.text.page_readlink) | ||
1157 | *(.text.null_lseek) | ||
1158 | *(.text.nf_hook_slow) | ||
1159 | *(.text.netlink_sock_destruct) | ||
1160 | *(.text.netlink_broadcast) | ||
1161 | *(.text.neigh_resolve_output) | ||
1162 | *(.text.name_to_int) | ||
1163 | *(.text.mwait_idle) | ||
1164 | *(.text.mutex_trylock) | ||
1165 | *(.text.mutex_debug_check_no_locks_held) | ||
1166 | *(.text.m_stop) | ||
1167 | *(.text.mpage_end_io_write) | ||
1168 | *(.text.mpage_alloc) | ||
1169 | *(.text.move_page_tables) | ||
1170 | *(.text.mounts_open) | ||
1171 | *(.text.__memset) | ||
1172 | *(.text.memcpy_fromiovec) | ||
1173 | *(.text.make_8259A_irq) | ||
1174 | *(.text.lookup_user_key_possessed) | ||
1175 | *(.text.lookup_create) | ||
1176 | *(.text.locks_insert_lock) | ||
1177 | *(.text.locks_alloc_lock) | ||
1178 | *(.text.kthread_should_stop) | ||
1179 | *(.text.kswapd) | ||
1180 | *(.text.kobject_uevent) | ||
1181 | *(.text.kobject_get_path) | ||
1182 | *(.text.kobject_get) | ||
1183 | *(.text.klist_children_put) | ||
1184 | *(.text.__ip_route_output_key) | ||
1185 | *(.text.ip_flush_pending_frames) | ||
1186 | *(.text.ip_compute_csum) | ||
1187 | *(.text.ip_append_data) | ||
1188 | *(.text.ioc_set_batching) | ||
1189 | *(.text.invalidate_inode_pages) | ||
1190 | *(.text.__invalidate_device) | ||
1191 | *(.text.install_arg_page) | ||
1192 | *(.text.in_sched_functions) | ||
1193 | *(.text.inotify_unmount_inodes) | ||
1194 | *(.text.init_once) | ||
1195 | *(.text.init_cdrom_command) | ||
1196 | *(.text.inet_stream_connect) | ||
1197 | *(.text.inet_sk_rebuild_header) | ||
1198 | *(.text.inet_csk_addr2sockaddr) | ||
1199 | *(.text.inet_create) | ||
1200 | *(.text.ifind) | ||
1201 | *(.text.ide_setup_dma) | ||
1202 | *(.text.ide_outsw) | ||
1203 | *(.text.ide_fixstring) | ||
1204 | *(.text.ide_dma_setup) | ||
1205 | *(.text.ide_cdrom_packet) | ||
1206 | *(.text.ide_cd_put) | ||
1207 | *(.text.ide_build_sglist) | ||
1208 | *(.text.i8259A_shutdown) | ||
1209 | *(.text.hung_up_tty_ioctl) | ||
1210 | *(.text.hrtimer_nanosleep) | ||
1211 | *(.text.hrtimer_init) | ||
1212 | *(.text.hrtimer_cancel) | ||
1213 | *(.text.hash_futex) | ||
1214 | *(.text.group_send_sig_info) | ||
1215 | *(.text.grab_cache_page_nowait) | ||
1216 | *(.text.get_wchan) | ||
1217 | *(.text.get_stack) | ||
1218 | *(.text.get_page_state) | ||
1219 | *(.text.getnstimeofday) | ||
1220 | *(.text.get_node) | ||
1221 | *(.text.get_kprobe) | ||
1222 | *(.text.generic_unplug_device) | ||
1223 | *(.text.free_task) | ||
1224 | *(.text.frag_show) | ||
1225 | *(.text.find_next_zero_string) | ||
1226 | *(.text.filp_open) | ||
1227 | *(.text.fillonedir) | ||
1228 | *(.text.exit_io_context) | ||
1229 | *(.text.exit_idle) | ||
1230 | *(.text.exact_lock) | ||
1231 | *(.text.eth_header) | ||
1232 | *(.text.dummy_unregister_security) | ||
1233 | *(.text.dummy_socket_post_create) | ||
1234 | *(.text.dummy_socket_listen) | ||
1235 | *(.text.dummy_quota_on) | ||
1236 | *(.text.dummy_inode_follow_link) | ||
1237 | *(.text.dummy_file_receive) | ||
1238 | *(.text.dummy_file_mprotect) | ||
1239 | *(.text.dummy_file_lock) | ||
1240 | *(.text.dummy_file_ioctl) | ||
1241 | *(.text.dummy_bprm_post_apply_creds) | ||
1242 | *(.text.do_writepages) | ||
1243 | *(.text.__down_interruptible) | ||
1244 | *(.text.do_notify_resume) | ||
1245 | *(.text.do_acct_process) | ||
1246 | *(.text.del_timer_sync) | ||
1247 | *(.text.default_rebuild_header) | ||
1248 | *(.text.d_callback) | ||
1249 | *(.text.dcache_readdir) | ||
1250 | *(.text.ctrl_dumpfamily) | ||
1251 | *(.text.cpuset_rmdir) | ||
1252 | *(.text.copy_strings_kernel) | ||
1253 | *(.text.con_write_room) | ||
1254 | *(.text.complete_all) | ||
1255 | *(.text.collect_sigign_sigcatch) | ||
1256 | *(.text.clear_user) | ||
1257 | *(.text.check_unthrottle) | ||
1258 | *(.text.cdrom_release) | ||
1259 | *(.text.cdrom_newpc_intr) | ||
1260 | *(.text.cdrom_ioctl) | ||
1261 | *(.text.cdrom_check_status) | ||
1262 | *(.text.cdev_put) | ||
1263 | *(.text.cdev_add) | ||
1264 | *(.text.cap_ptrace) | ||
1265 | *(.text.cap_bprm_secureexec) | ||
1266 | *(.text.cache_alloc_refill) | ||
1267 | *(.text.bmap) | ||
1268 | *(.text.blk_run_queue) | ||
1269 | *(.text.blk_queue_dma_alignment) | ||
1270 | *(.text.blk_ordered_req_seq) | ||
1271 | *(.text.blk_backing_dev_unplug) | ||
1272 | *(.text.__bitmap_subset) | ||
1273 | *(.text.__bitmap_and) | ||
1274 | *(.text.bio_unmap_user) | ||
1275 | *(.text.__bforget) | ||
1276 | *(.text.bd_forget) | ||
1277 | *(.text.bad_pipe_w) | ||
1278 | *(.text.bad_get_user) | ||
1279 | *(.text.audit_free) | ||
1280 | *(.text.anon_vma_ctor) | ||
1281 | *(.text.anon_pipe_buf_map) | ||
1282 | *(.text.alloc_sock_iocb) | ||
1283 | *(.text.alloc_fdset) | ||
1284 | *(.text.aio_kick_handler) | ||
1285 | *(.text.__add_entropy_words) | ||
1286 | *(.text.add_disk_randomness) | ||
diff --git a/arch/x86_64/kernel/head.S b/arch/x86_64/kernel/head.S index 02fc7fa0ea28..6df05e6034fa 100644 --- a/arch/x86_64/kernel/head.S +++ b/arch/x86_64/kernel/head.S | |||
@@ -26,6 +26,7 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | .text | 28 | .text |
29 | .section .bootstrap.text | ||
29 | .code32 | 30 | .code32 |
30 | .globl startup_32 | 31 | .globl startup_32 |
31 | /* %bx: 1 if coming from smp trampoline on secondary cpu */ | 32 | /* %bx: 1 if coming from smp trampoline on secondary cpu */ |
@@ -192,7 +193,8 @@ startup_64: | |||
192 | movq initial_code(%rip),%rax | 193 | movq initial_code(%rip),%rax |
193 | jmp *%rax | 194 | jmp *%rax |
194 | 195 | ||
195 | /* SMP bootup changes these two */ | 196 | /* SMP bootup changes these two */ |
197 | .align 8 | ||
196 | .globl initial_code | 198 | .globl initial_code |
197 | initial_code: | 199 | initial_code: |
198 | .quad x86_64_start_kernel | 200 | .quad x86_64_start_kernel |
@@ -237,7 +239,7 @@ ENTRY(no_long_mode) | |||
237 | .org 0xf00 | 239 | .org 0xf00 |
238 | .globl pGDT32 | 240 | .globl pGDT32 |
239 | pGDT32: | 241 | pGDT32: |
240 | .word gdt_end-cpu_gdt_table | 242 | .word gdt_end-cpu_gdt_table-1 |
241 | .long cpu_gdt_table-__START_KERNEL_map | 243 | .long cpu_gdt_table-__START_KERNEL_map |
242 | 244 | ||
243 | .org 0xf10 | 245 | .org 0xf10 |
@@ -293,8 +295,6 @@ NEXT_PAGE(level2_kernel_pgt) | |||
293 | /* Module mapping starts here */ | 295 | /* Module mapping starts here */ |
294 | .fill 492,8,0 | 296 | .fill 492,8,0 |
295 | 297 | ||
296 | NEXT_PAGE(empty_zero_page) | ||
297 | |||
298 | NEXT_PAGE(level3_physmem_pgt) | 298 | NEXT_PAGE(level3_physmem_pgt) |
299 | .quad phys_level2_kernel_pgt | 0x007 /* so that __va works even before pagetable_init */ | 299 | .quad phys_level2_kernel_pgt | 0x007 /* so that __va works even before pagetable_init */ |
300 | .fill 511,8,0 | 300 | .fill 511,8,0 |
@@ -337,7 +337,7 @@ ENTRY(boot_level4_pgt) | |||
337 | .align 16 | 337 | .align 16 |
338 | .globl cpu_gdt_descr | 338 | .globl cpu_gdt_descr |
339 | cpu_gdt_descr: | 339 | cpu_gdt_descr: |
340 | .word gdt_end-cpu_gdt_table | 340 | .word gdt_end-cpu_gdt_table-1 |
341 | gdt: | 341 | gdt: |
342 | .quad cpu_gdt_table | 342 | .quad cpu_gdt_table |
343 | #ifdef CONFIG_SMP | 343 | #ifdef CONFIG_SMP |
@@ -352,7 +352,8 @@ gdt: | |||
352 | * Also sysret mandates a special GDT layout | 352 | * Also sysret mandates a special GDT layout |
353 | */ | 353 | */ |
354 | 354 | ||
355 | .align PAGE_SIZE | 355 | .section .data.page_aligned, "aw" |
356 | .align PAGE_SIZE | ||
356 | 357 | ||
357 | /* The TLS descriptors are currently at a different place compared to i386. | 358 | /* The TLS descriptors are currently at a different place compared to i386. |
358 | Hopefully nobody expects them at a fixed place (Wine?) */ | 359 | Hopefully nobody expects them at a fixed place (Wine?) */ |
@@ -378,9 +379,12 @@ gdt_end: | |||
378 | /* zero the remaining page */ | 379 | /* zero the remaining page */ |
379 | .fill PAGE_SIZE / 8 - GDT_ENTRIES,8,0 | 380 | .fill PAGE_SIZE / 8 - GDT_ENTRIES,8,0 |
380 | 381 | ||
381 | ENTRY(idt_table) | 382 | .section .bss, "aw", @nobits |
382 | .rept 256 | 383 | .align L1_CACHE_BYTES |
383 | .quad 0 | 384 | ENTRY(idt_table) |
384 | .quad 0 | 385 | .skip 256 * 16 |
385 | .endr | ||
386 | 386 | ||
387 | .section .bss.page_aligned, "aw", @nobits | ||
388 | .align PAGE_SIZE | ||
389 | ENTRY(empty_zero_page) | ||
390 | .skip PAGE_SIZE | ||
diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c index ffed464e6b12..77b4c608cca0 100644 --- a/arch/x86_64/kernel/io_apic.c +++ b/arch/x86_64/kernel/io_apic.c | |||
@@ -50,7 +50,7 @@ static int no_timer_check; | |||
50 | 50 | ||
51 | int disable_timer_pin_1 __initdata; | 51 | int disable_timer_pin_1 __initdata; |
52 | 52 | ||
53 | int timer_over_8254 __initdata = 1; | 53 | int timer_over_8254 __initdata = 0; |
54 | 54 | ||
55 | /* Where if anywhere is the i8259 connect in external int mode */ | 55 | /* Where if anywhere is the i8259 connect in external int mode */ |
56 | static struct { int pin, apic; } ioapic_i8259 = { -1, -1 }; | 56 | static struct { int pin, apic; } ioapic_i8259 = { -1, -1 }; |
@@ -310,7 +310,7 @@ void __init check_ioapic(void) | |||
310 | force_iommu) && | 310 | force_iommu) && |
311 | !iommu_aperture_allowed) { | 311 | !iommu_aperture_allowed) { |
312 | printk(KERN_INFO | 312 | printk(KERN_INFO |
313 | "Looks like a VIA chipset. Disabling IOMMU. Overwrite with \"iommu=allowed\"\n"); | 313 | "Looks like a VIA chipset. Disabling IOMMU. Override with \"iommu=allowed\"\n"); |
314 | iommu_aperture_disabled = 1; | 314 | iommu_aperture_disabled = 1; |
315 | } | 315 | } |
316 | #endif | 316 | #endif |
@@ -1848,7 +1848,7 @@ static inline void check_timer(void) | |||
1848 | */ | 1848 | */ |
1849 | setup_ExtINT_IRQ0_pin(apic2, pin2, vector); | 1849 | setup_ExtINT_IRQ0_pin(apic2, pin2, vector); |
1850 | if (timer_irq_works()) { | 1850 | if (timer_irq_works()) { |
1851 | printk("works.\n"); | 1851 | apic_printk(APIC_VERBOSE," works.\n"); |
1852 | nmi_watchdog_default(); | 1852 | nmi_watchdog_default(); |
1853 | if (nmi_watchdog == NMI_IO_APIC) { | 1853 | if (nmi_watchdog == NMI_IO_APIC) { |
1854 | setup_nmi(); | 1854 | setup_nmi(); |
@@ -1860,7 +1860,7 @@ static inline void check_timer(void) | |||
1860 | */ | 1860 | */ |
1861 | clear_IO_APIC_pin(apic2, pin2); | 1861 | clear_IO_APIC_pin(apic2, pin2); |
1862 | } | 1862 | } |
1863 | printk(" failed.\n"); | 1863 | apic_printk(APIC_VERBOSE," failed.\n"); |
1864 | 1864 | ||
1865 | if (nmi_watchdog == NMI_IO_APIC) { | 1865 | if (nmi_watchdog == NMI_IO_APIC) { |
1866 | printk(KERN_WARNING "timer doesn't work through the IO-APIC - disabling NMI Watchdog!\n"); | 1866 | printk(KERN_WARNING "timer doesn't work through the IO-APIC - disabling NMI Watchdog!\n"); |
@@ -1875,7 +1875,7 @@ static inline void check_timer(void) | |||
1875 | enable_8259A_irq(0); | 1875 | enable_8259A_irq(0); |
1876 | 1876 | ||
1877 | if (timer_irq_works()) { | 1877 | if (timer_irq_works()) { |
1878 | apic_printk(APIC_QUIET, " works.\n"); | 1878 | apic_printk(APIC_VERBOSE," works.\n"); |
1879 | return; | 1879 | return; |
1880 | } | 1880 | } |
1881 | apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | vector); | 1881 | apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | vector); |
diff --git a/arch/x86_64/kernel/irq.c b/arch/x86_64/kernel/irq.c index 30d2a1e545fe..d8bd0b345b1e 100644 --- a/arch/x86_64/kernel/irq.c +++ b/arch/x86_64/kernel/irq.c | |||
@@ -38,9 +38,8 @@ int show_interrupts(struct seq_file *p, void *v) | |||
38 | 38 | ||
39 | if (i == 0) { | 39 | if (i == 0) { |
40 | seq_printf(p, " "); | 40 | seq_printf(p, " "); |
41 | for (j=0; j<NR_CPUS; j++) | 41 | for_each_online_cpu(j) |
42 | if (cpu_online(j)) | 42 | seq_printf(p, "CPU%d ",j); |
43 | seq_printf(p, "CPU%d ",j); | ||
44 | seq_putc(p, '\n'); | 43 | seq_putc(p, '\n'); |
45 | } | 44 | } |
46 | 45 | ||
@@ -53,10 +52,8 @@ int show_interrupts(struct seq_file *p, void *v) | |||
53 | #ifndef CONFIG_SMP | 52 | #ifndef CONFIG_SMP |
54 | seq_printf(p, "%10u ", kstat_irqs(i)); | 53 | seq_printf(p, "%10u ", kstat_irqs(i)); |
55 | #else | 54 | #else |
56 | for (j=0; j<NR_CPUS; j++) | 55 | for_each_online_cpu(j) |
57 | if (cpu_online(j)) | 56 | seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); |
58 | seq_printf(p, "%10u ", | ||
59 | kstat_cpu(j).irqs[i]); | ||
60 | #endif | 57 | #endif |
61 | seq_printf(p, " %14s", irq_desc[i].handler->typename); | 58 | seq_printf(p, " %14s", irq_desc[i].handler->typename); |
62 | 59 | ||
@@ -68,15 +65,13 @@ skip: | |||
68 | spin_unlock_irqrestore(&irq_desc[i].lock, flags); | 65 | spin_unlock_irqrestore(&irq_desc[i].lock, flags); |
69 | } else if (i == NR_IRQS) { | 66 | } else if (i == NR_IRQS) { |
70 | seq_printf(p, "NMI: "); | 67 | seq_printf(p, "NMI: "); |
71 | for (j = 0; j < NR_CPUS; j++) | 68 | for_each_online_cpu(j) |
72 | if (cpu_online(j)) | 69 | seq_printf(p, "%10u ", cpu_pda(j)->__nmi_count); |
73 | seq_printf(p, "%10u ", cpu_pda(j)->__nmi_count); | ||
74 | seq_putc(p, '\n'); | 70 | seq_putc(p, '\n'); |
75 | #ifdef CONFIG_X86_LOCAL_APIC | 71 | #ifdef CONFIG_X86_LOCAL_APIC |
76 | seq_printf(p, "LOC: "); | 72 | seq_printf(p, "LOC: "); |
77 | for (j = 0; j < NR_CPUS; j++) | 73 | for_each_online_cpu(j) |
78 | if (cpu_online(j)) | 74 | seq_printf(p, "%10u ", cpu_pda(j)->apic_timer_irqs); |
79 | seq_printf(p, "%10u ", cpu_pda(j)->apic_timer_irqs); | ||
80 | seq_putc(p, '\n'); | 75 | seq_putc(p, '\n'); |
81 | #endif | 76 | #endif |
82 | seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); | 77 | seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count)); |
diff --git a/arch/x86_64/kernel/kprobes.c b/arch/x86_64/kernel/kprobes.c index 8b866a8572cf..accbff3fec49 100644 --- a/arch/x86_64/kernel/kprobes.c +++ b/arch/x86_64/kernel/kprobes.c | |||
@@ -37,10 +37,12 @@ | |||
37 | #include <linux/string.h> | 37 | #include <linux/string.h> |
38 | #include <linux/slab.h> | 38 | #include <linux/slab.h> |
39 | #include <linux/preempt.h> | 39 | #include <linux/preempt.h> |
40 | #include <linux/module.h> | ||
40 | 41 | ||
41 | #include <asm/cacheflush.h> | 42 | #include <asm/cacheflush.h> |
42 | #include <asm/pgtable.h> | 43 | #include <asm/pgtable.h> |
43 | #include <asm/kdebug.h> | 44 | #include <asm/kdebug.h> |
45 | #include <asm/uaccess.h> | ||
44 | 46 | ||
45 | void jprobe_return_end(void); | 47 | void jprobe_return_end(void); |
46 | static void __kprobes arch_copy_kprobe(struct kprobe *p); | 48 | static void __kprobes arch_copy_kprobe(struct kprobe *p); |
@@ -222,9 +224,9 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p) | |||
222 | 224 | ||
223 | void __kprobes arch_remove_kprobe(struct kprobe *p) | 225 | void __kprobes arch_remove_kprobe(struct kprobe *p) |
224 | { | 226 | { |
225 | down(&kprobe_mutex); | 227 | mutex_lock(&kprobe_mutex); |
226 | free_insn_slot(p->ainsn.insn); | 228 | free_insn_slot(p->ainsn.insn); |
227 | up(&kprobe_mutex); | 229 | mutex_unlock(&kprobe_mutex); |
228 | } | 230 | } |
229 | 231 | ||
230 | static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb) | 232 | static inline void save_previous_kprobe(struct kprobe_ctlblk *kcb) |
@@ -578,16 +580,62 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr) | |||
578 | { | 580 | { |
579 | struct kprobe *cur = kprobe_running(); | 581 | struct kprobe *cur = kprobe_running(); |
580 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | 582 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); |
583 | const struct exception_table_entry *fixup; | ||
581 | 584 | ||
582 | if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr)) | 585 | switch(kcb->kprobe_status) { |
583 | return 1; | 586 | case KPROBE_HIT_SS: |
584 | 587 | case KPROBE_REENTER: | |
585 | if (kcb->kprobe_status & KPROBE_HIT_SS) { | 588 | /* |
586 | resume_execution(cur, regs, kcb); | 589 | * We are here because the instruction being single |
590 | * stepped caused a page fault. We reset the current | ||
591 | * kprobe and the rip points back to the probe address | ||
592 | * and allow the page fault handler to continue as a | ||
593 | * normal page fault. | ||
594 | */ | ||
595 | regs->rip = (unsigned long)cur->addr; | ||
587 | regs->eflags |= kcb->kprobe_old_rflags; | 596 | regs->eflags |= kcb->kprobe_old_rflags; |
588 | 597 | if (kcb->kprobe_status == KPROBE_REENTER) | |
589 | reset_current_kprobe(); | 598 | restore_previous_kprobe(kcb); |
599 | else | ||
600 | reset_current_kprobe(); | ||
590 | preempt_enable_no_resched(); | 601 | preempt_enable_no_resched(); |
602 | break; | ||
603 | case KPROBE_HIT_ACTIVE: | ||
604 | case KPROBE_HIT_SSDONE: | ||
605 | /* | ||
606 | * We increment the nmissed count for accounting, | ||
607 | * we can also use npre/npostfault count for accouting | ||
608 | * these specific fault cases. | ||
609 | */ | ||
610 | kprobes_inc_nmissed_count(cur); | ||
611 | |||
612 | /* | ||
613 | * We come here because instructions in the pre/post | ||
614 | * handler caused the page_fault, this could happen | ||
615 | * if handler tries to access user space by | ||
616 | * copy_from_user(), get_user() etc. Let the | ||
617 | * user-specified handler try to fix it first. | ||
618 | */ | ||
619 | if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr)) | ||
620 | return 1; | ||
621 | |||
622 | /* | ||
623 | * In case the user-specified fault handler returned | ||
624 | * zero, try to fix up. | ||
625 | */ | ||
626 | fixup = search_exception_tables(regs->rip); | ||
627 | if (fixup) { | ||
628 | regs->rip = fixup->fixup; | ||
629 | return 1; | ||
630 | } | ||
631 | |||
632 | /* | ||
633 | * fixup() could not handle it, | ||
634 | * Let do_page_fault() fix it. | ||
635 | */ | ||
636 | break; | ||
637 | default: | ||
638 | break; | ||
591 | } | 639 | } |
592 | return 0; | 640 | return 0; |
593 | } | 641 | } |
@@ -601,6 +649,9 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self, | |||
601 | struct die_args *args = (struct die_args *)data; | 649 | struct die_args *args = (struct die_args *)data; |
602 | int ret = NOTIFY_DONE; | 650 | int ret = NOTIFY_DONE; |
603 | 651 | ||
652 | if (args->regs && user_mode(args->regs)) | ||
653 | return ret; | ||
654 | |||
604 | switch (val) { | 655 | switch (val) { |
605 | case DIE_INT3: | 656 | case DIE_INT3: |
606 | if (kprobe_handler(args->regs)) | 657 | if (kprobe_handler(args->regs)) |
diff --git a/arch/x86_64/kernel/mce.c b/arch/x86_64/kernel/mce.c index b8b9529fa89e..04282ef9fbd4 100644 --- a/arch/x86_64/kernel/mce.c +++ b/arch/x86_64/kernel/mce.c | |||
@@ -139,8 +139,7 @@ static void mce_panic(char *msg, struct mce *backup, unsigned long start) | |||
139 | 139 | ||
140 | static int mce_available(struct cpuinfo_x86 *c) | 140 | static int mce_available(struct cpuinfo_x86 *c) |
141 | { | 141 | { |
142 | return test_bit(X86_FEATURE_MCE, &c->x86_capability) && | 142 | return cpu_has(c, X86_FEATURE_MCE) && cpu_has(c, X86_FEATURE_MCA); |
143 | test_bit(X86_FEATURE_MCA, &c->x86_capability); | ||
144 | } | 143 | } |
145 | 144 | ||
146 | static inline void mce_get_rip(struct mce *m, struct pt_regs *regs) | 145 | static inline void mce_get_rip(struct mce *m, struct pt_regs *regs) |
diff --git a/arch/x86_64/kernel/mpparse.c b/arch/x86_64/kernel/mpparse.c index 9013a90b5c2e..b17cf3eba359 100644 --- a/arch/x86_64/kernel/mpparse.c +++ b/arch/x86_64/kernel/mpparse.c | |||
@@ -106,11 +106,11 @@ static int __init mpf_checksum(unsigned char *mp, int len) | |||
106 | return sum & 0xFF; | 106 | return sum & 0xFF; |
107 | } | 107 | } |
108 | 108 | ||
109 | static void __init MP_processor_info (struct mpc_config_processor *m) | 109 | static void __cpuinit MP_processor_info (struct mpc_config_processor *m) |
110 | { | 110 | { |
111 | int cpu; | 111 | int cpu; |
112 | unsigned char ver; | 112 | unsigned char ver; |
113 | static int found_bsp=0; | 113 | cpumask_t tmp_map; |
114 | 114 | ||
115 | if (!(m->mpc_cpuflag & CPU_ENABLED)) { | 115 | if (!(m->mpc_cpuflag & CPU_ENABLED)) { |
116 | disabled_cpus++; | 116 | disabled_cpus++; |
@@ -133,8 +133,10 @@ static void __init MP_processor_info (struct mpc_config_processor *m) | |||
133 | return; | 133 | return; |
134 | } | 134 | } |
135 | 135 | ||
136 | cpu = num_processors++; | 136 | num_processors++; |
137 | 137 | cpus_complement(tmp_map, cpu_present_map); | |
138 | cpu = first_cpu(tmp_map); | ||
139 | |||
138 | #if MAX_APICS < 255 | 140 | #if MAX_APICS < 255 |
139 | if ((int)m->mpc_apicid > MAX_APICS) { | 141 | if ((int)m->mpc_apicid > MAX_APICS) { |
140 | printk(KERN_ERR "Processor #%d INVALID. (Max ID: %d).\n", | 142 | printk(KERN_ERR "Processor #%d INVALID. (Max ID: %d).\n", |
@@ -160,12 +162,7 @@ static void __init MP_processor_info (struct mpc_config_processor *m) | |||
160 | * entry is BSP, and so on. | 162 | * entry is BSP, and so on. |
161 | */ | 163 | */ |
162 | cpu = 0; | 164 | cpu = 0; |
163 | 165 | } | |
164 | bios_cpu_apicid[0] = m->mpc_apicid; | ||
165 | x86_cpu_to_apicid[0] = m->mpc_apicid; | ||
166 | found_bsp = 1; | ||
167 | } else | ||
168 | cpu = num_processors - found_bsp; | ||
169 | bios_cpu_apicid[cpu] = m->mpc_apicid; | 166 | bios_cpu_apicid[cpu] = m->mpc_apicid; |
170 | x86_cpu_to_apicid[cpu] = m->mpc_apicid; | 167 | x86_cpu_to_apicid[cpu] = m->mpc_apicid; |
171 | 168 | ||
@@ -691,7 +688,7 @@ void __init mp_register_lapic_address ( | |||
691 | } | 688 | } |
692 | 689 | ||
693 | 690 | ||
694 | void __init mp_register_lapic ( | 691 | void __cpuinit mp_register_lapic ( |
695 | u8 id, | 692 | u8 id, |
696 | u8 enabled) | 693 | u8 enabled) |
697 | { | 694 | { |
diff --git a/arch/x86_64/kernel/nmi.c b/arch/x86_64/kernel/nmi.c index 5bf17e41cd2d..d9e4067faf05 100644 --- a/arch/x86_64/kernel/nmi.c +++ b/arch/x86_64/kernel/nmi.c | |||
@@ -162,9 +162,7 @@ int __init check_nmi_watchdog (void) | |||
162 | local_irq_enable(); | 162 | local_irq_enable(); |
163 | mdelay((10*1000)/nmi_hz); // wait 10 ticks | 163 | mdelay((10*1000)/nmi_hz); // wait 10 ticks |
164 | 164 | ||
165 | for (cpu = 0; cpu < NR_CPUS; cpu++) { | 165 | for_each_online_cpu(cpu) { |
166 | if (!cpu_online(cpu)) | ||
167 | continue; | ||
168 | if (cpu_pda(cpu)->__nmi_count - counts[cpu] <= 5) { | 166 | if (cpu_pda(cpu)->__nmi_count - counts[cpu] <= 5) { |
169 | endflag = 1; | 167 | endflag = 1; |
170 | printk("CPU#%d: NMI appears to be stuck (%d->%d)!\n", | 168 | printk("CPU#%d: NMI appears to be stuck (%d->%d)!\n", |
@@ -536,6 +534,7 @@ asmlinkage __kprobes void do_nmi(struct pt_regs * regs, long error_code) | |||
536 | 534 | ||
537 | void set_nmi_callback(nmi_callback_t callback) | 535 | void set_nmi_callback(nmi_callback_t callback) |
538 | { | 536 | { |
537 | vmalloc_sync_all(); | ||
539 | rcu_assign_pointer(nmi_callback, callback); | 538 | rcu_assign_pointer(nmi_callback, callback); |
540 | } | 539 | } |
541 | 540 | ||
diff --git a/arch/x86_64/kernel/pci-dma.c b/arch/x86_64/kernel/pci-dma.c index 4ed391edd47a..03c9eeedb0f3 100644 --- a/arch/x86_64/kernel/pci-dma.c +++ b/arch/x86_64/kernel/pci-dma.c | |||
@@ -73,6 +73,9 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, | |||
73 | if (dma_mask == 0) | 73 | if (dma_mask == 0) |
74 | dma_mask = 0xffffffff; | 74 | dma_mask = 0xffffffff; |
75 | 75 | ||
76 | /* Don't invoke OOM killer */ | ||
77 | gfp |= __GFP_NORETRY; | ||
78 | |||
76 | /* Kludge to make it bug-to-bug compatible with i386. i386 | 79 | /* Kludge to make it bug-to-bug compatible with i386. i386 |
77 | uses the normal dma_mask for alloc_coherent. */ | 80 | uses the normal dma_mask for alloc_coherent. */ |
78 | dma_mask &= *dev->dma_mask; | 81 | dma_mask &= *dev->dma_mask; |
diff --git a/arch/x86_64/kernel/pci-gart.c b/arch/x86_64/kernel/pci-gart.c index 0c3f052ba6ce..a6c01e121266 100644 --- a/arch/x86_64/kernel/pci-gart.c +++ b/arch/x86_64/kernel/pci-gart.c | |||
@@ -65,9 +65,7 @@ static u32 gart_unmapped_entry; | |||
65 | 65 | ||
66 | #define for_all_nb(dev) \ | 66 | #define for_all_nb(dev) \ |
67 | dev = NULL; \ | 67 | dev = NULL; \ |
68 | while ((dev = pci_get_device(PCI_VENDOR_ID_AMD, 0x1103, dev))!=NULL)\ | 68 | while ((dev = pci_get_device(PCI_VENDOR_ID_AMD, 0x1103, dev))!=NULL) |
69 | if (dev->bus->number == 0 && \ | ||
70 | (PCI_SLOT(dev->devfn) >= 24) && (PCI_SLOT(dev->devfn) <= 31)) | ||
71 | 69 | ||
72 | static struct pci_dev *northbridges[MAX_NB]; | 70 | static struct pci_dev *northbridges[MAX_NB]; |
73 | static u32 northbridge_flush_word[MAX_NB]; | 71 | static u32 northbridge_flush_word[MAX_NB]; |
@@ -148,9 +146,12 @@ static void flush_gart(struct device *dev) | |||
148 | if (!northbridges[i]) | 146 | if (!northbridges[i]) |
149 | continue; | 147 | continue; |
150 | /* Make sure the hardware actually executed the flush. */ | 148 | /* Make sure the hardware actually executed the flush. */ |
151 | do { | 149 | for (;;) { |
152 | pci_read_config_dword(northbridges[i], 0x9c, &w); | 150 | pci_read_config_dword(northbridges[i], 0x9c, &w); |
153 | } while (w & 1); | 151 | if (!(w & 1)) |
152 | break; | ||
153 | cpu_relax(); | ||
154 | } | ||
154 | } | 155 | } |
155 | if (!flushed) | 156 | if (!flushed) |
156 | printk("nothing to flush?\n"); | 157 | printk("nothing to flush?\n"); |
diff --git a/arch/x86_64/kernel/pmtimer.c b/arch/x86_64/kernel/pmtimer.c index 5c51d10408a6..ee5ee4891f3d 100644 --- a/arch/x86_64/kernel/pmtimer.c +++ b/arch/x86_64/kernel/pmtimer.c | |||
@@ -86,7 +86,7 @@ static unsigned pmtimer_wait_tick(void) | |||
86 | for (a = b = inl(pmtmr_ioport) & ACPI_PM_MASK; | 86 | for (a = b = inl(pmtmr_ioport) & ACPI_PM_MASK; |
87 | a == b; | 87 | a == b; |
88 | b = inl(pmtmr_ioport) & ACPI_PM_MASK) | 88 | b = inl(pmtmr_ioport) & ACPI_PM_MASK) |
89 | ; | 89 | cpu_relax(); |
90 | return b; | 90 | return b; |
91 | } | 91 | } |
92 | 92 | ||
@@ -97,6 +97,7 @@ void pmtimer_wait(unsigned us) | |||
97 | a = pmtimer_wait_tick(); | 97 | a = pmtimer_wait_tick(); |
98 | do { | 98 | do { |
99 | b = inl(pmtmr_ioport); | 99 | b = inl(pmtmr_ioport); |
100 | cpu_relax(); | ||
100 | } while (cyc2us(b - a) < us); | 101 | } while (cyc2us(b - a) < us); |
101 | } | 102 | } |
102 | 103 | ||
diff --git a/arch/x86_64/kernel/process.c b/arch/x86_64/kernel/process.c index 22a05dec81a2..70dd8e5c6889 100644 --- a/arch/x86_64/kernel/process.c +++ b/arch/x86_64/kernel/process.c | |||
@@ -35,8 +35,8 @@ | |||
35 | #include <linux/ptrace.h> | 35 | #include <linux/ptrace.h> |
36 | #include <linux/utsname.h> | 36 | #include <linux/utsname.h> |
37 | #include <linux/random.h> | 37 | #include <linux/random.h> |
38 | #include <linux/kprobes.h> | ||
39 | #include <linux/notifier.h> | 38 | #include <linux/notifier.h> |
39 | #include <linux/kprobes.h> | ||
40 | 40 | ||
41 | #include <asm/uaccess.h> | 41 | #include <asm/uaccess.h> |
42 | #include <asm/pgtable.h> | 42 | #include <asm/pgtable.h> |
@@ -66,24 +66,17 @@ EXPORT_SYMBOL(boot_option_idle_override); | |||
66 | void (*pm_idle)(void); | 66 | void (*pm_idle)(void); |
67 | static DEFINE_PER_CPU(unsigned int, cpu_idle_state); | 67 | static DEFINE_PER_CPU(unsigned int, cpu_idle_state); |
68 | 68 | ||
69 | static struct notifier_block *idle_notifier; | 69 | static ATOMIC_NOTIFIER_HEAD(idle_notifier); |
70 | static DEFINE_SPINLOCK(idle_notifier_lock); | ||
71 | 70 | ||
72 | void idle_notifier_register(struct notifier_block *n) | 71 | void idle_notifier_register(struct notifier_block *n) |
73 | { | 72 | { |
74 | unsigned long flags; | 73 | atomic_notifier_chain_register(&idle_notifier, n); |
75 | spin_lock_irqsave(&idle_notifier_lock, flags); | ||
76 | notifier_chain_register(&idle_notifier, n); | ||
77 | spin_unlock_irqrestore(&idle_notifier_lock, flags); | ||
78 | } | 74 | } |
79 | EXPORT_SYMBOL_GPL(idle_notifier_register); | 75 | EXPORT_SYMBOL_GPL(idle_notifier_register); |
80 | 76 | ||
81 | void idle_notifier_unregister(struct notifier_block *n) | 77 | void idle_notifier_unregister(struct notifier_block *n) |
82 | { | 78 | { |
83 | unsigned long flags; | 79 | atomic_notifier_chain_unregister(&idle_notifier, n); |
84 | spin_lock_irqsave(&idle_notifier_lock, flags); | ||
85 | notifier_chain_unregister(&idle_notifier, n); | ||
86 | spin_unlock_irqrestore(&idle_notifier_lock, flags); | ||
87 | } | 80 | } |
88 | EXPORT_SYMBOL(idle_notifier_unregister); | 81 | EXPORT_SYMBOL(idle_notifier_unregister); |
89 | 82 | ||
@@ -93,13 +86,13 @@ static DEFINE_PER_CPU(enum idle_state, idle_state) = CPU_NOT_IDLE; | |||
93 | void enter_idle(void) | 86 | void enter_idle(void) |
94 | { | 87 | { |
95 | __get_cpu_var(idle_state) = CPU_IDLE; | 88 | __get_cpu_var(idle_state) = CPU_IDLE; |
96 | notifier_call_chain(&idle_notifier, IDLE_START, NULL); | 89 | atomic_notifier_call_chain(&idle_notifier, IDLE_START, NULL); |
97 | } | 90 | } |
98 | 91 | ||
99 | static void __exit_idle(void) | 92 | static void __exit_idle(void) |
100 | { | 93 | { |
101 | __get_cpu_var(idle_state) = CPU_NOT_IDLE; | 94 | __get_cpu_var(idle_state) = CPU_NOT_IDLE; |
102 | notifier_call_chain(&idle_notifier, IDLE_END, NULL); | 95 | atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL); |
103 | } | 96 | } |
104 | 97 | ||
105 | /* Called from interrupts to signify idle end */ | 98 | /* Called from interrupts to signify idle end */ |
@@ -114,7 +107,7 @@ void exit_idle(void) | |||
114 | * We use this if we don't have any better | 107 | * We use this if we don't have any better |
115 | * idle routine.. | 108 | * idle routine.. |
116 | */ | 109 | */ |
117 | void default_idle(void) | 110 | static void default_idle(void) |
118 | { | 111 | { |
119 | local_irq_enable(); | 112 | local_irq_enable(); |
120 | 113 | ||
@@ -353,13 +346,6 @@ void exit_thread(void) | |||
353 | struct task_struct *me = current; | 346 | struct task_struct *me = current; |
354 | struct thread_struct *t = &me->thread; | 347 | struct thread_struct *t = &me->thread; |
355 | 348 | ||
356 | /* | ||
357 | * Remove function-return probe instances associated with this task | ||
358 | * and put them back on the free list. Do not insert an exit probe for | ||
359 | * this function, it will be disabled by kprobe_flush_task if you do. | ||
360 | */ | ||
361 | kprobe_flush_task(me); | ||
362 | |||
363 | if (me->thread.io_bitmap_ptr) { | 349 | if (me->thread.io_bitmap_ptr) { |
364 | struct tss_struct *tss = &per_cpu(init_tss, get_cpu()); | 350 | struct tss_struct *tss = &per_cpu(init_tss, get_cpu()); |
365 | 351 | ||
@@ -508,7 +494,7 @@ out: | |||
508 | /* | 494 | /* |
509 | * This special macro can be used to load a debugging register | 495 | * This special macro can be used to load a debugging register |
510 | */ | 496 | */ |
511 | #define loaddebug(thread,r) set_debug(thread->debugreg ## r, r) | 497 | #define loaddebug(thread,r) set_debugreg(thread->debugreg ## r, r) |
512 | 498 | ||
513 | /* | 499 | /* |
514 | * switch_to(x,y) should switch tasks from x to y. | 500 | * switch_to(x,y) should switch tasks from x to y. |
@@ -527,8 +513,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
527 | int cpu = smp_processor_id(); | 513 | int cpu = smp_processor_id(); |
528 | struct tss_struct *tss = &per_cpu(init_tss, cpu); | 514 | struct tss_struct *tss = &per_cpu(init_tss, cpu); |
529 | 515 | ||
530 | unlazy_fpu(prev_p); | ||
531 | |||
532 | /* | 516 | /* |
533 | * Reload esp0, LDT and the page table pointer: | 517 | * Reload esp0, LDT and the page table pointer: |
534 | */ | 518 | */ |
@@ -586,11 +570,14 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
586 | } | 570 | } |
587 | 571 | ||
588 | /* | 572 | /* |
589 | * Switch the PDA context. | 573 | * Switch the PDA and FPU contexts. |
590 | */ | 574 | */ |
591 | prev->userrsp = read_pda(oldrsp); | 575 | prev->userrsp = read_pda(oldrsp); |
592 | write_pda(oldrsp, next->userrsp); | 576 | write_pda(oldrsp, next->userrsp); |
593 | write_pda(pcurrent, next_p); | 577 | write_pda(pcurrent, next_p); |
578 | /* This must be here to ensure both math_state_restore() and | ||
579 | kernel_fpu_begin() work consistently. */ | ||
580 | unlazy_fpu(prev_p); | ||
594 | write_pda(kernelstack, | 581 | write_pda(kernelstack, |
595 | task_stack_page(next_p) + THREAD_SIZE - PDA_STACKOFFSET); | 582 | task_stack_page(next_p) + THREAD_SIZE - PDA_STACKOFFSET); |
596 | 583 | ||
diff --git a/arch/x86_64/kernel/ptrace.c b/arch/x86_64/kernel/ptrace.c index 53205622351c..d44b2c1e63a6 100644 --- a/arch/x86_64/kernel/ptrace.c +++ b/arch/x86_64/kernel/ptrace.c | |||
@@ -420,9 +420,9 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
420 | case offsetof(struct user, u_debugreg[7]): | 420 | case offsetof(struct user, u_debugreg[7]): |
421 | /* See arch/i386/kernel/ptrace.c for an explanation of | 421 | /* See arch/i386/kernel/ptrace.c for an explanation of |
422 | * this awkward check.*/ | 422 | * this awkward check.*/ |
423 | data &= ~DR_CONTROL_RESERVED; | 423 | data &= ~DR_CONTROL_RESERVED; |
424 | for(i=0; i<4; i++) | 424 | for(i=0; i<4; i++) |
425 | if ((0x5454 >> ((data >> (16 + 4*i)) & 0xf)) & 1) | 425 | if ((0x5554 >> ((data >> (16 + 4*i)) & 0xf)) & 1) |
426 | break; | 426 | break; |
427 | if (i == 4) { | 427 | if (i == 4) { |
428 | child->thread.debugreg7 = data; | 428 | child->thread.debugreg7 = data; |
diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c index aa55e3cec665..d1f3e9272c05 100644 --- a/arch/x86_64/kernel/setup.c +++ b/arch/x86_64/kernel/setup.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include <linux/cpufreq.h> | 46 | #include <linux/cpufreq.h> |
47 | #include <linux/dmi.h> | 47 | #include <linux/dmi.h> |
48 | #include <linux/dma-mapping.h> | 48 | #include <linux/dma-mapping.h> |
49 | #include <linux/ctype.h> | ||
49 | 50 | ||
50 | #include <asm/mtrr.h> | 51 | #include <asm/mtrr.h> |
51 | #include <asm/uaccess.h> | 52 | #include <asm/uaccess.h> |
@@ -67,6 +68,7 @@ | |||
67 | #include <asm/swiotlb.h> | 68 | #include <asm/swiotlb.h> |
68 | #include <asm/sections.h> | 69 | #include <asm/sections.h> |
69 | #include <asm/gart-mapping.h> | 70 | #include <asm/gart-mapping.h> |
71 | #include <asm/dmi.h> | ||
70 | 72 | ||
71 | /* | 73 | /* |
72 | * Machine setup.. | 74 | * Machine setup.. |
@@ -91,6 +93,12 @@ int bootloader_type; | |||
91 | 93 | ||
92 | unsigned long saved_video_mode; | 94 | unsigned long saved_video_mode; |
93 | 95 | ||
96 | /* | ||
97 | * Early DMI memory | ||
98 | */ | ||
99 | int dmi_alloc_index; | ||
100 | char dmi_alloc_data[DMI_MAX_DATA]; | ||
101 | |||
94 | /* | 102 | /* |
95 | * Setup options | 103 | * Setup options |
96 | */ | 104 | */ |
@@ -270,6 +278,13 @@ static void __init probe_roms(void) | |||
270 | } | 278 | } |
271 | } | 279 | } |
272 | 280 | ||
281 | /* Check for full argument with no trailing characters */ | ||
282 | static int fullarg(char *p, char *arg) | ||
283 | { | ||
284 | int l = strlen(arg); | ||
285 | return !memcmp(p, arg, l) && (p[l] == 0 || isspace(p[l])); | ||
286 | } | ||
287 | |||
273 | static __init void parse_cmdline_early (char ** cmdline_p) | 288 | static __init void parse_cmdline_early (char ** cmdline_p) |
274 | { | 289 | { |
275 | char c = ' ', *to = command_line, *from = COMMAND_LINE; | 290 | char c = ' ', *to = command_line, *from = COMMAND_LINE; |
@@ -293,10 +308,10 @@ static __init void parse_cmdline_early (char ** cmdline_p) | |||
293 | #endif | 308 | #endif |
294 | #ifdef CONFIG_ACPI | 309 | #ifdef CONFIG_ACPI |
295 | /* "acpi=off" disables both ACPI table parsing and interpreter init */ | 310 | /* "acpi=off" disables both ACPI table parsing and interpreter init */ |
296 | if (!memcmp(from, "acpi=off", 8)) | 311 | if (fullarg(from,"acpi=off")) |
297 | disable_acpi(); | 312 | disable_acpi(); |
298 | 313 | ||
299 | if (!memcmp(from, "acpi=force", 10)) { | 314 | if (fullarg(from, "acpi=force")) { |
300 | /* add later when we do DMI horrors: */ | 315 | /* add later when we do DMI horrors: */ |
301 | acpi_force = 1; | 316 | acpi_force = 1; |
302 | acpi_disabled = 0; | 317 | acpi_disabled = 0; |
@@ -304,52 +319,47 @@ static __init void parse_cmdline_early (char ** cmdline_p) | |||
304 | 319 | ||
305 | /* acpi=ht just means: do ACPI MADT parsing | 320 | /* acpi=ht just means: do ACPI MADT parsing |
306 | at bootup, but don't enable the full ACPI interpreter */ | 321 | at bootup, but don't enable the full ACPI interpreter */ |
307 | if (!memcmp(from, "acpi=ht", 7)) { | 322 | if (fullarg(from, "acpi=ht")) { |
308 | if (!acpi_force) | 323 | if (!acpi_force) |
309 | disable_acpi(); | 324 | disable_acpi(); |
310 | acpi_ht = 1; | 325 | acpi_ht = 1; |
311 | } | 326 | } |
312 | else if (!memcmp(from, "pci=noacpi", 10)) | 327 | else if (fullarg(from, "pci=noacpi")) |
313 | acpi_disable_pci(); | 328 | acpi_disable_pci(); |
314 | else if (!memcmp(from, "acpi=noirq", 10)) | 329 | else if (fullarg(from, "acpi=noirq")) |
315 | acpi_noirq_set(); | 330 | acpi_noirq_set(); |
316 | 331 | ||
317 | else if (!memcmp(from, "acpi_sci=edge", 13)) | 332 | else if (fullarg(from, "acpi_sci=edge")) |
318 | acpi_sci_flags.trigger = 1; | 333 | acpi_sci_flags.trigger = 1; |
319 | else if (!memcmp(from, "acpi_sci=level", 14)) | 334 | else if (fullarg(from, "acpi_sci=level")) |
320 | acpi_sci_flags.trigger = 3; | 335 | acpi_sci_flags.trigger = 3; |
321 | else if (!memcmp(from, "acpi_sci=high", 13)) | 336 | else if (fullarg(from, "acpi_sci=high")) |
322 | acpi_sci_flags.polarity = 1; | 337 | acpi_sci_flags.polarity = 1; |
323 | else if (!memcmp(from, "acpi_sci=low", 12)) | 338 | else if (fullarg(from, "acpi_sci=low")) |
324 | acpi_sci_flags.polarity = 3; | 339 | acpi_sci_flags.polarity = 3; |
325 | 340 | ||
326 | /* acpi=strict disables out-of-spec workarounds */ | 341 | /* acpi=strict disables out-of-spec workarounds */ |
327 | else if (!memcmp(from, "acpi=strict", 11)) { | 342 | else if (fullarg(from, "acpi=strict")) { |
328 | acpi_strict = 1; | 343 | acpi_strict = 1; |
329 | } | 344 | } |
330 | #ifdef CONFIG_X86_IO_APIC | 345 | #ifdef CONFIG_X86_IO_APIC |
331 | else if (!memcmp(from, "acpi_skip_timer_override", 24)) | 346 | else if (fullarg(from, "acpi_skip_timer_override")) |
332 | acpi_skip_timer_override = 1; | 347 | acpi_skip_timer_override = 1; |
333 | #endif | 348 | #endif |
334 | #endif | 349 | #endif |
335 | 350 | ||
336 | if (!memcmp(from, "disable_timer_pin_1", 19)) | 351 | if (fullarg(from, "disable_timer_pin_1")) |
337 | disable_timer_pin_1 = 1; | 352 | disable_timer_pin_1 = 1; |
338 | if (!memcmp(from, "enable_timer_pin_1", 18)) | 353 | if (fullarg(from, "enable_timer_pin_1")) |
339 | disable_timer_pin_1 = -1; | 354 | disable_timer_pin_1 = -1; |
340 | 355 | ||
341 | if (!memcmp(from, "nolapic", 7) || | 356 | if (fullarg(from, "nolapic") || fullarg(from, "disableapic")) |
342 | !memcmp(from, "disableapic", 11)) | ||
343 | disable_apic = 1; | 357 | disable_apic = 1; |
344 | 358 | ||
345 | /* Don't confuse with noapictimer */ | 359 | if (fullarg(from, "noapic")) |
346 | if (!memcmp(from, "noapic", 6) && | ||
347 | (from[6] == ' ' || from[6] == 0)) | ||
348 | skip_ioapic_setup = 1; | 360 | skip_ioapic_setup = 1; |
349 | 361 | ||
350 | /* Make sure to not confuse with apic= */ | 362 | if (fullarg(from,"apic")) { |
351 | if (!memcmp(from, "apic", 4) && | ||
352 | (from[4] == ' ' || from[4] == 0)) { | ||
353 | skip_ioapic_setup = 0; | 363 | skip_ioapic_setup = 0; |
354 | ioapic_force = 1; | 364 | ioapic_force = 1; |
355 | } | 365 | } |
@@ -388,7 +398,7 @@ static __init void parse_cmdline_early (char ** cmdline_p) | |||
388 | iommu_setup(from+6); | 398 | iommu_setup(from+6); |
389 | } | 399 | } |
390 | 400 | ||
391 | if (!memcmp(from,"oops=panic", 10)) | 401 | if (fullarg(from,"oops=panic")) |
392 | panic_on_oops = 1; | 402 | panic_on_oops = 1; |
393 | 403 | ||
394 | if (!memcmp(from, "noexec=", 7)) | 404 | if (!memcmp(from, "noexec=", 7)) |
@@ -611,11 +621,14 @@ void __init setup_arch(char **cmdline_p) | |||
611 | * we are rounding upwards: | 621 | * we are rounding upwards: |
612 | */ | 622 | */ |
613 | end_pfn = e820_end_of_ram(); | 623 | end_pfn = e820_end_of_ram(); |
624 | num_physpages = end_pfn; /* for pfn_valid */ | ||
614 | 625 | ||
615 | check_efer(); | 626 | check_efer(); |
616 | 627 | ||
617 | init_memory_mapping(0, (end_pfn_map << PAGE_SHIFT)); | 628 | init_memory_mapping(0, (end_pfn_map << PAGE_SHIFT)); |
618 | 629 | ||
630 | dmi_scan_machine(); | ||
631 | |||
619 | zap_low_mappings(0); | 632 | zap_low_mappings(0); |
620 | 633 | ||
621 | #ifdef CONFIG_ACPI | 634 | #ifdef CONFIG_ACPI |
@@ -708,6 +721,12 @@ void __init setup_arch(char **cmdline_p) | |||
708 | 721 | ||
709 | check_ioapic(); | 722 | check_ioapic(); |
710 | 723 | ||
724 | /* | ||
725 | * set this early, so we dont allocate cpu0 | ||
726 | * if MADT list doesnt list BSP first | ||
727 | * mpparse.c/MP_processor_info() allocates logical cpu numbers. | ||
728 | */ | ||
729 | cpu_set(0, cpu_present_map); | ||
711 | #ifdef CONFIG_ACPI | 730 | #ifdef CONFIG_ACPI |
712 | /* | 731 | /* |
713 | * Read APIC and some other early information from ACPI tables. | 732 | * Read APIC and some other early information from ACPI tables. |
@@ -836,7 +855,7 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c) | |||
836 | unsigned bits; | 855 | unsigned bits; |
837 | #ifdef CONFIG_NUMA | 856 | #ifdef CONFIG_NUMA |
838 | int node = 0; | 857 | int node = 0; |
839 | unsigned apicid = phys_proc_id[cpu]; | 858 | unsigned apicid = hard_smp_processor_id(); |
840 | #endif | 859 | #endif |
841 | 860 | ||
842 | bits = 0; | 861 | bits = 0; |
@@ -846,7 +865,7 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c) | |||
846 | /* Low order bits define the core id (index of core in socket) */ | 865 | /* Low order bits define the core id (index of core in socket) */ |
847 | cpu_core_id[cpu] = phys_proc_id[cpu] & ((1 << bits)-1); | 866 | cpu_core_id[cpu] = phys_proc_id[cpu] & ((1 << bits)-1); |
848 | /* Convert the APIC ID into the socket ID */ | 867 | /* Convert the APIC ID into the socket ID */ |
849 | phys_proc_id[cpu] >>= bits; | 868 | phys_proc_id[cpu] = phys_pkg_id(bits); |
850 | 869 | ||
851 | #ifdef CONFIG_NUMA | 870 | #ifdef CONFIG_NUMA |
852 | node = phys_proc_id[cpu]; | 871 | node = phys_proc_id[cpu]; |
@@ -872,8 +891,8 @@ static void __init amd_detect_cmp(struct cpuinfo_x86 *c) | |||
872 | } | 891 | } |
873 | numa_set_node(cpu, node); | 892 | numa_set_node(cpu, node); |
874 | 893 | ||
875 | printk(KERN_INFO "CPU %d(%d) -> Node %d -> Core %d\n", | 894 | printk(KERN_INFO "CPU %d/%x(%d) -> Node %d -> Core %d\n", |
876 | cpu, c->x86_max_cores, node, cpu_core_id[cpu]); | 895 | cpu, apicid, c->x86_max_cores, node, cpu_core_id[cpu]); |
877 | #endif | 896 | #endif |
878 | #endif | 897 | #endif |
879 | } | 898 | } |
@@ -927,8 +946,6 @@ static int __init init_amd(struct cpuinfo_x86 *c) | |||
927 | 946 | ||
928 | if (c->extended_cpuid_level >= 0x80000008) { | 947 | if (c->extended_cpuid_level >= 0x80000008) { |
929 | c->x86_max_cores = (cpuid_ecx(0x80000008) & 0xff) + 1; | 948 | c->x86_max_cores = (cpuid_ecx(0x80000008) & 0xff) + 1; |
930 | if (c->x86_max_cores & (c->x86_max_cores - 1)) | ||
931 | c->x86_max_cores = 1; | ||
932 | 949 | ||
933 | amd_detect_cmp(c); | 950 | amd_detect_cmp(c); |
934 | } | 951 | } |
@@ -945,7 +962,6 @@ static void __cpuinit detect_ht(struct cpuinfo_x86 *c) | |||
945 | 962 | ||
946 | cpuid(1, &eax, &ebx, &ecx, &edx); | 963 | cpuid(1, &eax, &ebx, &ecx, &edx); |
947 | 964 | ||
948 | c->apicid = phys_pkg_id(0); | ||
949 | 965 | ||
950 | if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY)) | 966 | if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY)) |
951 | return; | 967 | return; |
@@ -1154,6 +1170,8 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c) | |||
1154 | c->x86_capability[2] = cpuid_edx(0x80860001); | 1170 | c->x86_capability[2] = cpuid_edx(0x80860001); |
1155 | } | 1171 | } |
1156 | 1172 | ||
1173 | c->apicid = phys_pkg_id(0); | ||
1174 | |||
1157 | /* | 1175 | /* |
1158 | * Vendor-specific initialization. In this section we | 1176 | * Vendor-specific initialization. In this section we |
1159 | * canonicalize the feature flags, meaning if there are | 1177 | * canonicalize the feature flags, meaning if there are |
@@ -1261,7 +1279,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
1261 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 1279 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
1262 | 1280 | ||
1263 | /* Intel-defined (#2) */ | 1281 | /* Intel-defined (#2) */ |
1264 | "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", NULL, "est", | 1282 | "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", "smx", "est", |
1265 | "tm2", NULL, "cid", NULL, NULL, "cx16", "xtpr", NULL, | 1283 | "tm2", NULL, "cid", NULL, NULL, "cx16", "xtpr", NULL, |
1266 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 1284 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
1267 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, | 1285 | NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
@@ -1344,8 +1362,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
1344 | { | 1362 | { |
1345 | int i; | 1363 | int i; |
1346 | for ( i = 0 ; i < 32*NCAPINTS ; i++ ) | 1364 | for ( i = 0 ; i < 32*NCAPINTS ; i++ ) |
1347 | if ( test_bit(i, &c->x86_capability) && | 1365 | if (cpu_has(c, i) && x86_cap_flags[i] != NULL) |
1348 | x86_cap_flags[i] != NULL ) | ||
1349 | seq_printf(m, " %s", x86_cap_flags[i]); | 1366 | seq_printf(m, " %s", x86_cap_flags[i]); |
1350 | } | 1367 | } |
1351 | 1368 | ||
@@ -1403,10 +1420,3 @@ struct seq_operations cpuinfo_op = { | |||
1403 | .show = show_cpuinfo, | 1420 | .show = show_cpuinfo, |
1404 | }; | 1421 | }; |
1405 | 1422 | ||
1406 | static int __init run_dmi_scan(void) | ||
1407 | { | ||
1408 | dmi_scan_machine(); | ||
1409 | return 0; | ||
1410 | } | ||
1411 | core_initcall(run_dmi_scan); | ||
1412 | |||
diff --git a/arch/x86_64/kernel/setup64.c b/arch/x86_64/kernel/setup64.c index 70f1bb808a20..eabdb63fec31 100644 --- a/arch/x86_64/kernel/setup64.c +++ b/arch/x86_64/kernel/setup64.c | |||
@@ -33,7 +33,7 @@ cpumask_t cpu_initialized __cpuinitdata = CPU_MASK_NONE; | |||
33 | struct x8664_pda *_cpu_pda[NR_CPUS] __read_mostly; | 33 | struct x8664_pda *_cpu_pda[NR_CPUS] __read_mostly; |
34 | struct x8664_pda boot_cpu_pda[NR_CPUS] __cacheline_aligned; | 34 | struct x8664_pda boot_cpu_pda[NR_CPUS] __cacheline_aligned; |
35 | 35 | ||
36 | struct desc_ptr idt_descr = { 256 * 16, (unsigned long) idt_table }; | 36 | struct desc_ptr idt_descr = { 256 * 16 - 1, (unsigned long) idt_table }; |
37 | 37 | ||
38 | char boot_cpu_stack[IRQSTACKSIZE] __attribute__((section(".bss.page_aligned"))); | 38 | char boot_cpu_stack[IRQSTACKSIZE] __attribute__((section(".bss.page_aligned"))); |
39 | 39 | ||
@@ -59,7 +59,7 @@ int __init nonx_setup(char *str) | |||
59 | } | 59 | } |
60 | __setup("noexec=", nonx_setup); /* parsed early actually */ | 60 | __setup("noexec=", nonx_setup); /* parsed early actually */ |
61 | 61 | ||
62 | int force_personality32 = READ_IMPLIES_EXEC; | 62 | int force_personality32 = 0; |
63 | 63 | ||
64 | /* noexec32=on|off | 64 | /* noexec32=on|off |
65 | Control non executable heap for 32bit processes. | 65 | Control non executable heap for 32bit processes. |
@@ -248,7 +248,7 @@ void __cpuinit cpu_init (void) | |||
248 | switch (v + 1) { | 248 | switch (v + 1) { |
249 | #if DEBUG_STKSZ > EXCEPTION_STKSZ | 249 | #if DEBUG_STKSZ > EXCEPTION_STKSZ |
250 | case DEBUG_STACK: | 250 | case DEBUG_STACK: |
251 | cpu_pda[cpu].debugstack = (unsigned long)estacks; | 251 | cpu_pda(cpu)->debugstack = (unsigned long)estacks; |
252 | estacks += DEBUG_STKSZ; | 252 | estacks += DEBUG_STKSZ; |
253 | break; | 253 | break; |
254 | #endif | 254 | #endif |
@@ -281,12 +281,12 @@ void __cpuinit cpu_init (void) | |||
281 | * Clear all 6 debug registers: | 281 | * Clear all 6 debug registers: |
282 | */ | 282 | */ |
283 | 283 | ||
284 | set_debug(0UL, 0); | 284 | set_debugreg(0UL, 0); |
285 | set_debug(0UL, 1); | 285 | set_debugreg(0UL, 1); |
286 | set_debug(0UL, 2); | 286 | set_debugreg(0UL, 2); |
287 | set_debug(0UL, 3); | 287 | set_debugreg(0UL, 3); |
288 | set_debug(0UL, 6); | 288 | set_debugreg(0UL, 6); |
289 | set_debug(0UL, 7); | 289 | set_debugreg(0UL, 7); |
290 | 290 | ||
291 | fpu_init(); | 291 | fpu_init(); |
292 | } | 292 | } |
diff --git a/arch/x86_64/kernel/signal.c b/arch/x86_64/kernel/signal.c index 5876df116c92..e5f5ce7909a3 100644 --- a/arch/x86_64/kernel/signal.c +++ b/arch/x86_64/kernel/signal.c | |||
@@ -443,9 +443,6 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset) | |||
443 | if (!user_mode(regs)) | 443 | if (!user_mode(regs)) |
444 | return 1; | 444 | return 1; |
445 | 445 | ||
446 | if (try_to_freeze()) | ||
447 | goto no_signal; | ||
448 | |||
449 | if (!oldset) | 446 | if (!oldset) |
450 | oldset = ¤t->blocked; | 447 | oldset = ¤t->blocked; |
451 | 448 | ||
@@ -463,7 +460,6 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset) | |||
463 | return handle_signal(signr, &info, &ka, oldset, regs); | 460 | return handle_signal(signr, &info, &ka, oldset, regs); |
464 | } | 461 | } |
465 | 462 | ||
466 | no_signal: | ||
467 | /* Did we come from a system call? */ | 463 | /* Did we come from a system call? */ |
468 | if ((long)regs->orig_rax >= 0) { | 464 | if ((long)regs->orig_rax >= 0) { |
469 | /* Restart the system call - no handlers present */ | 465 | /* Restart the system call - no handlers present */ |
diff --git a/arch/x86_64/kernel/smp.c b/arch/x86_64/kernel/smp.c index 19ef012b1f17..4a6628b14d99 100644 --- a/arch/x86_64/kernel/smp.c +++ b/arch/x86_64/kernel/smp.c | |||
@@ -75,7 +75,7 @@ static inline void leave_mm(int cpu) | |||
75 | { | 75 | { |
76 | if (read_pda(mmu_state) == TLBSTATE_OK) | 76 | if (read_pda(mmu_state) == TLBSTATE_OK) |
77 | BUG(); | 77 | BUG(); |
78 | clear_bit(cpu, &read_pda(active_mm)->cpu_vm_mask); | 78 | cpu_clear(cpu, read_pda(active_mm)->cpu_vm_mask); |
79 | load_cr3(swapper_pg_dir); | 79 | load_cr3(swapper_pg_dir); |
80 | } | 80 | } |
81 | 81 | ||
@@ -85,7 +85,7 @@ static inline void leave_mm(int cpu) | |||
85 | * [cpu0: the cpu that switches] | 85 | * [cpu0: the cpu that switches] |
86 | * 1) switch_mm() either 1a) or 1b) | 86 | * 1) switch_mm() either 1a) or 1b) |
87 | * 1a) thread switch to a different mm | 87 | * 1a) thread switch to a different mm |
88 | * 1a1) clear_bit(cpu, &old_mm->cpu_vm_mask); | 88 | * 1a1) cpu_clear(cpu, old_mm->cpu_vm_mask); |
89 | * Stop ipi delivery for the old mm. This is not synchronized with | 89 | * Stop ipi delivery for the old mm. This is not synchronized with |
90 | * the other cpus, but smp_invalidate_interrupt ignore flush ipis | 90 | * the other cpus, but smp_invalidate_interrupt ignore flush ipis |
91 | * for the wrong mm, and in the worst case we perform a superfluous | 91 | * for the wrong mm, and in the worst case we perform a superfluous |
@@ -95,7 +95,7 @@ static inline void leave_mm(int cpu) | |||
95 | * was in lazy tlb mode. | 95 | * was in lazy tlb mode. |
96 | * 1a3) update cpu active_mm | 96 | * 1a3) update cpu active_mm |
97 | * Now cpu0 accepts tlb flushes for the new mm. | 97 | * Now cpu0 accepts tlb flushes for the new mm. |
98 | * 1a4) set_bit(cpu, &new_mm->cpu_vm_mask); | 98 | * 1a4) cpu_set(cpu, new_mm->cpu_vm_mask); |
99 | * Now the other cpus will send tlb flush ipis. | 99 | * Now the other cpus will send tlb flush ipis. |
100 | * 1a4) change cr3. | 100 | * 1a4) change cr3. |
101 | * 1b) thread switch without mm change | 101 | * 1b) thread switch without mm change |
diff --git a/arch/x86_64/kernel/smpboot.c b/arch/x86_64/kernel/smpboot.c index 66e98659d077..ea48fa638070 100644 --- a/arch/x86_64/kernel/smpboot.c +++ b/arch/x86_64/kernel/smpboot.c | |||
@@ -68,6 +68,9 @@ u8 phys_proc_id[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = BAD_APICID }; | |||
68 | /* core ID of each logical CPU */ | 68 | /* core ID of each logical CPU */ |
69 | u8 cpu_core_id[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = BAD_APICID }; | 69 | u8 cpu_core_id[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = BAD_APICID }; |
70 | 70 | ||
71 | /* Last level cache ID of each logical CPU */ | ||
72 | u8 cpu_llc_id[NR_CPUS] __cpuinitdata = {[0 ... NR_CPUS-1] = BAD_APICID}; | ||
73 | |||
71 | /* Bitmask of currently online CPUs */ | 74 | /* Bitmask of currently online CPUs */ |
72 | cpumask_t cpu_online_map __read_mostly; | 75 | cpumask_t cpu_online_map __read_mostly; |
73 | 76 | ||
@@ -445,6 +448,18 @@ void __cpuinit smp_callin(void) | |||
445 | cpu_set(cpuid, cpu_callin_map); | 448 | cpu_set(cpuid, cpu_callin_map); |
446 | } | 449 | } |
447 | 450 | ||
451 | /* maps the cpu to the sched domain representing multi-core */ | ||
452 | cpumask_t cpu_coregroup_map(int cpu) | ||
453 | { | ||
454 | struct cpuinfo_x86 *c = cpu_data + cpu; | ||
455 | /* | ||
456 | * For perf, we return last level cache shared map. | ||
457 | * TBD: when power saving sched policy is added, we will return | ||
458 | * cpu_core_map when power saving policy is enabled | ||
459 | */ | ||
460 | return c->llc_shared_map; | ||
461 | } | ||
462 | |||
448 | /* representing cpus for which sibling maps can be computed */ | 463 | /* representing cpus for which sibling maps can be computed */ |
449 | static cpumask_t cpu_sibling_setup_map; | 464 | static cpumask_t cpu_sibling_setup_map; |
450 | 465 | ||
@@ -463,12 +478,16 @@ static inline void set_cpu_sibling_map(int cpu) | |||
463 | cpu_set(cpu, cpu_sibling_map[i]); | 478 | cpu_set(cpu, cpu_sibling_map[i]); |
464 | cpu_set(i, cpu_core_map[cpu]); | 479 | cpu_set(i, cpu_core_map[cpu]); |
465 | cpu_set(cpu, cpu_core_map[i]); | 480 | cpu_set(cpu, cpu_core_map[i]); |
481 | cpu_set(i, c[cpu].llc_shared_map); | ||
482 | cpu_set(cpu, c[i].llc_shared_map); | ||
466 | } | 483 | } |
467 | } | 484 | } |
468 | } else { | 485 | } else { |
469 | cpu_set(cpu, cpu_sibling_map[cpu]); | 486 | cpu_set(cpu, cpu_sibling_map[cpu]); |
470 | } | 487 | } |
471 | 488 | ||
489 | cpu_set(cpu, c[cpu].llc_shared_map); | ||
490 | |||
472 | if (current_cpu_data.x86_max_cores == 1) { | 491 | if (current_cpu_data.x86_max_cores == 1) { |
473 | cpu_core_map[cpu] = cpu_sibling_map[cpu]; | 492 | cpu_core_map[cpu] = cpu_sibling_map[cpu]; |
474 | c[cpu].booted_cores = 1; | 493 | c[cpu].booted_cores = 1; |
@@ -476,6 +495,11 @@ static inline void set_cpu_sibling_map(int cpu) | |||
476 | } | 495 | } |
477 | 496 | ||
478 | for_each_cpu_mask(i, cpu_sibling_setup_map) { | 497 | for_each_cpu_mask(i, cpu_sibling_setup_map) { |
498 | if (cpu_llc_id[cpu] != BAD_APICID && | ||
499 | cpu_llc_id[cpu] == cpu_llc_id[i]) { | ||
500 | cpu_set(i, c[cpu].llc_shared_map); | ||
501 | cpu_set(cpu, c[i].llc_shared_map); | ||
502 | } | ||
479 | if (phys_proc_id[cpu] == phys_proc_id[i]) { | 503 | if (phys_proc_id[cpu] == phys_proc_id[i]) { |
480 | cpu_set(i, cpu_core_map[cpu]); | 504 | cpu_set(i, cpu_core_map[cpu]); |
481 | cpu_set(cpu, cpu_core_map[i]); | 505 | cpu_set(cpu, cpu_core_map[i]); |
diff --git a/arch/x86_64/kernel/time.c b/arch/x86_64/kernel/time.c index 3080f84bf7b7..473b514b66e4 100644 --- a/arch/x86_64/kernel/time.c +++ b/arch/x86_64/kernel/time.c | |||
@@ -88,7 +88,8 @@ static inline unsigned int do_gettimeoffset_tsc(void) | |||
88 | unsigned long t; | 88 | unsigned long t; |
89 | unsigned long x; | 89 | unsigned long x; |
90 | t = get_cycles_sync(); | 90 | t = get_cycles_sync(); |
91 | if (t < vxtime.last_tsc) t = vxtime.last_tsc; /* hack */ | 91 | if (t < vxtime.last_tsc) |
92 | t = vxtime.last_tsc; /* hack */ | ||
92 | x = ((t - vxtime.last_tsc) * vxtime.tsc_quot) >> 32; | 93 | x = ((t - vxtime.last_tsc) * vxtime.tsc_quot) >> 32; |
93 | return x; | 94 | return x; |
94 | } | 95 | } |
@@ -178,8 +179,9 @@ unsigned long profile_pc(struct pt_regs *regs) | |||
178 | { | 179 | { |
179 | unsigned long pc = instruction_pointer(regs); | 180 | unsigned long pc = instruction_pointer(regs); |
180 | 181 | ||
181 | /* Assume the lock function has either no stack frame or only a single word. | 182 | /* Assume the lock function has either no stack frame or only a single |
182 | This checks if the address on the stack looks like a kernel text address. | 183 | word. This checks if the address on the stack looks like a kernel |
184 | text address. | ||
183 | There is a small window for false hits, but in that case the tick | 185 | There is a small window for false hits, but in that case the tick |
184 | is just accounted to the spinlock function. | 186 | is just accounted to the spinlock function. |
185 | Better would be to write these functions in assembler again | 187 | Better would be to write these functions in assembler again |
@@ -242,17 +244,10 @@ static void set_rtc_mmss(unsigned long nowtime) | |||
242 | real_minutes += 30; /* correct for half hour time zone */ | 244 | real_minutes += 30; /* correct for half hour time zone */ |
243 | real_minutes %= 60; | 245 | real_minutes %= 60; |
244 | 246 | ||
245 | #if 0 | ||
246 | /* AMD 8111 is a really bad time keeper and hits this regularly. | ||
247 | It probably was an attempt to avoid screwing up DST, but ignore | ||
248 | that for now. */ | ||
249 | if (abs(real_minutes - cmos_minutes) >= 30) { | 247 | if (abs(real_minutes - cmos_minutes) >= 30) { |
250 | printk(KERN_WARNING "time.c: can't update CMOS clock " | 248 | printk(KERN_WARNING "time.c: can't update CMOS clock " |
251 | "from %d to %d\n", cmos_minutes, real_minutes); | 249 | "from %d to %d\n", cmos_minutes, real_minutes); |
252 | } else | 250 | } else { |
253 | #endif | ||
254 | |||
255 | { | ||
256 | BIN_TO_BCD(real_seconds); | 251 | BIN_TO_BCD(real_seconds); |
257 | BIN_TO_BCD(real_minutes); | 252 | BIN_TO_BCD(real_minutes); |
258 | CMOS_WRITE(real_seconds, RTC_SECONDS); | 253 | CMOS_WRITE(real_seconds, RTC_SECONDS); |
@@ -293,8 +288,7 @@ unsigned long long monotonic_clock(void) | |||
293 | this_offset = hpet_readl(HPET_COUNTER); | 288 | this_offset = hpet_readl(HPET_COUNTER); |
294 | } while (read_seqretry(&xtime_lock, seq)); | 289 | } while (read_seqretry(&xtime_lock, seq)); |
295 | offset = (this_offset - last_offset); | 290 | offset = (this_offset - last_offset); |
296 | offset *=(NSEC_PER_SEC/HZ)/hpet_tick; | 291 | offset *= (NSEC_PER_SEC/HZ) / hpet_tick; |
297 | return base + offset; | ||
298 | } else { | 292 | } else { |
299 | do { | 293 | do { |
300 | seq = read_seqbegin(&xtime_lock); | 294 | seq = read_seqbegin(&xtime_lock); |
@@ -303,50 +297,46 @@ unsigned long long monotonic_clock(void) | |||
303 | base = monotonic_base; | 297 | base = monotonic_base; |
304 | } while (read_seqretry(&xtime_lock, seq)); | 298 | } while (read_seqretry(&xtime_lock, seq)); |
305 | this_offset = get_cycles_sync(); | 299 | this_offset = get_cycles_sync(); |
306 | offset = (this_offset - last_offset)*1000/cpu_khz; | 300 | offset = (this_offset - last_offset)*1000 / cpu_khz; |
307 | return base + offset; | ||
308 | } | 301 | } |
302 | return base + offset; | ||
309 | } | 303 | } |
310 | EXPORT_SYMBOL(monotonic_clock); | 304 | EXPORT_SYMBOL(monotonic_clock); |
311 | 305 | ||
312 | static noinline void handle_lost_ticks(int lost, struct pt_regs *regs) | 306 | static noinline void handle_lost_ticks(int lost, struct pt_regs *regs) |
313 | { | 307 | { |
314 | static long lost_count; | 308 | static long lost_count; |
315 | static int warned; | 309 | static int warned; |
316 | 310 | if (report_lost_ticks) { | |
317 | if (report_lost_ticks) { | 311 | printk(KERN_WARNING "time.c: Lost %d timer tick(s)! ", lost); |
318 | printk(KERN_WARNING "time.c: Lost %d timer " | 312 | print_symbol("rip %s)\n", regs->rip); |
319 | "tick(s)! ", lost); | 313 | } |
320 | print_symbol("rip %s)\n", regs->rip); | 314 | |
321 | } | 315 | if (lost_count == 1000 && !warned) { |
322 | 316 | printk(KERN_WARNING "warning: many lost ticks.\n" | |
323 | if (lost_count == 1000 && !warned) { | 317 | KERN_WARNING "Your time source seems to be instable or " |
324 | printk(KERN_WARNING | ||
325 | "warning: many lost ticks.\n" | ||
326 | KERN_WARNING "Your time source seems to be instable or " | ||
327 | "some driver is hogging interupts\n"); | 318 | "some driver is hogging interupts\n"); |
328 | print_symbol("rip %s\n", regs->rip); | 319 | print_symbol("rip %s\n", regs->rip); |
329 | if (vxtime.mode == VXTIME_TSC && vxtime.hpet_address) { | 320 | if (vxtime.mode == VXTIME_TSC && vxtime.hpet_address) { |
330 | printk(KERN_WARNING "Falling back to HPET\n"); | 321 | printk(KERN_WARNING "Falling back to HPET\n"); |
331 | if (hpet_use_timer) | 322 | if (hpet_use_timer) |
332 | vxtime.last = hpet_readl(HPET_T0_CMP) - hpet_tick; | 323 | vxtime.last = hpet_readl(HPET_T0_CMP) - |
333 | else | 324 | hpet_tick; |
334 | vxtime.last = hpet_readl(HPET_COUNTER); | 325 | else |
335 | vxtime.mode = VXTIME_HPET; | 326 | vxtime.last = hpet_readl(HPET_COUNTER); |
336 | do_gettimeoffset = do_gettimeoffset_hpet; | 327 | vxtime.mode = VXTIME_HPET; |
337 | } | 328 | do_gettimeoffset = do_gettimeoffset_hpet; |
338 | /* else should fall back to PIT, but code missing. */ | 329 | } |
339 | warned = 1; | 330 | /* else should fall back to PIT, but code missing. */ |
340 | } else | 331 | warned = 1; |
341 | lost_count++; | 332 | } else |
333 | lost_count++; | ||
342 | 334 | ||
343 | #ifdef CONFIG_CPU_FREQ | 335 | #ifdef CONFIG_CPU_FREQ |
344 | /* In some cases the CPU can change frequency without us noticing | 336 | /* In some cases the CPU can change frequency without us noticing |
345 | (like going into thermal throttle) | 337 | Give cpufreq a change to catch up. */ |
346 | Give cpufreq a change to catch up. */ | 338 | if ((lost_count+1) % 25 == 0) |
347 | if ((lost_count+1) % 25 == 0) { | 339 | cpufreq_delayed_get(); |
348 | cpufreq_delayed_get(); | ||
349 | } | ||
350 | #endif | 340 | #endif |
351 | } | 341 | } |
352 | 342 | ||
@@ -354,7 +344,7 @@ void main_timer_handler(struct pt_regs *regs) | |||
354 | { | 344 | { |
355 | static unsigned long rtc_update = 0; | 345 | static unsigned long rtc_update = 0; |
356 | unsigned long tsc; | 346 | unsigned long tsc; |
357 | int delay, offset = 0, lost = 0; | 347 | int delay = 0, offset = 0, lost = 0; |
358 | 348 | ||
359 | /* | 349 | /* |
360 | * Here we are in the timer irq handler. We have irqs locally disabled (so we | 350 | * Here we are in the timer irq handler. We have irqs locally disabled (so we |
@@ -375,7 +365,7 @@ void main_timer_handler(struct pt_regs *regs) | |||
375 | */ | 365 | */ |
376 | offset = hpet_readl(HPET_T0_CMP) - hpet_tick; | 366 | offset = hpet_readl(HPET_T0_CMP) - hpet_tick; |
377 | delay = hpet_readl(HPET_COUNTER) - offset; | 367 | delay = hpet_readl(HPET_COUNTER) - offset; |
378 | } else { | 368 | } else if (!pmtmr_ioport) { |
379 | spin_lock(&i8253_lock); | 369 | spin_lock(&i8253_lock); |
380 | outb_p(0x00, 0x43); | 370 | outb_p(0x00, 0x43); |
381 | delay = inb_p(0x40); | 371 | delay = inb_p(0x40); |
@@ -477,7 +467,7 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
477 | return IRQ_HANDLED; | 467 | return IRQ_HANDLED; |
478 | } | 468 | } |
479 | 469 | ||
480 | static unsigned int cyc2ns_scale; | 470 | static unsigned int cyc2ns_scale __read_mostly; |
481 | #define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */ | 471 | #define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */ |
482 | 472 | ||
483 | static inline void set_cyc2ns_scale(unsigned long cpu_khz) | 473 | static inline void set_cyc2ns_scale(unsigned long cpu_khz) |
@@ -514,43 +504,32 @@ unsigned long long sched_clock(void) | |||
514 | 504 | ||
515 | static unsigned long get_cmos_time(void) | 505 | static unsigned long get_cmos_time(void) |
516 | { | 506 | { |
517 | unsigned int timeout = 1000000, year, mon, day, hour, min, sec; | 507 | unsigned int year, mon, day, hour, min, sec; |
518 | unsigned char uip = 0, this = 0; | ||
519 | unsigned long flags; | 508 | unsigned long flags; |
520 | 509 | unsigned extyear = 0; | |
521 | /* | ||
522 | * The Linux interpretation of the CMOS clock register contents: When the | ||
523 | * Update-In-Progress (UIP) flag goes from 1 to 0, the RTC registers show the | ||
524 | * second which has precisely just started. Waiting for this can take up to 1 | ||
525 | * second, we timeout approximately after 2.4 seconds on a machine with | ||
526 | * standard 8.3 MHz ISA bus. | ||
527 | */ | ||
528 | 510 | ||
529 | spin_lock_irqsave(&rtc_lock, flags); | 511 | spin_lock_irqsave(&rtc_lock, flags); |
530 | 512 | ||
531 | while (timeout && (!uip || this)) { | 513 | do { |
532 | uip |= this; | 514 | sec = CMOS_READ(RTC_SECONDS); |
533 | this = CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP; | 515 | min = CMOS_READ(RTC_MINUTES); |
534 | timeout--; | 516 | hour = CMOS_READ(RTC_HOURS); |
535 | } | 517 | day = CMOS_READ(RTC_DAY_OF_MONTH); |
536 | 518 | mon = CMOS_READ(RTC_MONTH); | |
537 | /* | 519 | year = CMOS_READ(RTC_YEAR); |
538 | * Here we are safe to assume the registers won't change for a whole | 520 | #ifdef CONFIG_ACPI |
539 | * second, so we just go ahead and read them. | 521 | if (acpi_fadt.revision >= FADT2_REVISION_ID && |
540 | */ | 522 | acpi_fadt.century) |
541 | sec = CMOS_READ(RTC_SECONDS); | 523 | extyear = CMOS_READ(acpi_fadt.century); |
542 | min = CMOS_READ(RTC_MINUTES); | 524 | #endif |
543 | hour = CMOS_READ(RTC_HOURS); | 525 | } while (sec != CMOS_READ(RTC_SECONDS)); |
544 | day = CMOS_READ(RTC_DAY_OF_MONTH); | ||
545 | mon = CMOS_READ(RTC_MONTH); | ||
546 | year = CMOS_READ(RTC_YEAR); | ||
547 | 526 | ||
548 | spin_unlock_irqrestore(&rtc_lock, flags); | 527 | spin_unlock_irqrestore(&rtc_lock, flags); |
549 | 528 | ||
550 | /* | 529 | /* |
551 | * We know that x86-64 always uses BCD format, no need to check the | 530 | * We know that x86-64 always uses BCD format, no need to check the |
552 | * config register. | 531 | * config register. |
553 | */ | 532 | */ |
554 | 533 | ||
555 | BCD_TO_BIN(sec); | 534 | BCD_TO_BIN(sec); |
556 | BCD_TO_BIN(min); | 535 | BCD_TO_BIN(min); |
@@ -559,11 +538,17 @@ static unsigned long get_cmos_time(void) | |||
559 | BCD_TO_BIN(mon); | 538 | BCD_TO_BIN(mon); |
560 | BCD_TO_BIN(year); | 539 | BCD_TO_BIN(year); |
561 | 540 | ||
562 | /* | 541 | if (extyear) { |
563 | * x86-64 systems only exists since 2002. | 542 | BCD_TO_BIN(extyear); |
564 | * This will work up to Dec 31, 2100 | 543 | year += extyear; |
565 | */ | 544 | printk(KERN_INFO "Extended CMOS year: %d\n", extyear); |
566 | year += 2000; | 545 | } else { |
546 | /* | ||
547 | * x86-64 systems only exists since 2002. | ||
548 | * This will work up to Dec 31, 2100 | ||
549 | */ | ||
550 | year += 2000; | ||
551 | } | ||
567 | 552 | ||
568 | return mktime(year, mon, day, hour, min, sec); | 553 | return mktime(year, mon, day, hour, min, sec); |
569 | } | 554 | } |
@@ -606,7 +591,8 @@ static void cpufreq_delayed_get(void) | |||
606 | cpufreq_delayed_issched = 1; | 591 | cpufreq_delayed_issched = 1; |
607 | if (!warned) { | 592 | if (!warned) { |
608 | warned = 1; | 593 | warned = 1; |
609 | printk(KERN_DEBUG "Losing some ticks... checking if CPU frequency changed.\n"); | 594 | printk(KERN_DEBUG |
595 | "Losing some ticks... checking if CPU frequency changed.\n"); | ||
610 | } | 596 | } |
611 | schedule_work(&cpufreq_delayed_get_work); | 597 | schedule_work(&cpufreq_delayed_get_work); |
612 | } | 598 | } |
@@ -629,9 +615,9 @@ static int time_cpufreq_notifier(struct notifier_block *nb, unsigned long val, | |||
629 | lpj = &dummy; | 615 | lpj = &dummy; |
630 | if (!(freq->flags & CPUFREQ_CONST_LOOPS)) | 616 | if (!(freq->flags & CPUFREQ_CONST_LOOPS)) |
631 | #ifdef CONFIG_SMP | 617 | #ifdef CONFIG_SMP |
632 | lpj = &cpu_data[freq->cpu].loops_per_jiffy; | 618 | lpj = &cpu_data[freq->cpu].loops_per_jiffy; |
633 | #else | 619 | #else |
634 | lpj = &boot_cpu_data.loops_per_jiffy; | 620 | lpj = &boot_cpu_data.loops_per_jiffy; |
635 | #endif | 621 | #endif |
636 | 622 | ||
637 | if (!ref_freq) { | 623 | if (!ref_freq) { |
@@ -768,9 +754,8 @@ static __init int late_hpet_init(void) | |||
768 | int i; | 754 | int i; |
769 | 755 | ||
770 | hpet = (struct hpet *) fix_to_virt(FIX_HPET_BASE); | 756 | hpet = (struct hpet *) fix_to_virt(FIX_HPET_BASE); |
771 | 757 | timer = &hpet->hpet_timers[2]; | |
772 | for (i = 2, timer = &hpet->hpet_timers[2]; i < ntimer; | 758 | for (i = 2; i < ntimer; timer++, i++) |
773 | timer++, i++) | ||
774 | hd.hd_irq[i] = (timer->hpet_config & | 759 | hd.hd_irq[i] = (timer->hpet_config & |
775 | Tn_INT_ROUTE_CNF_MASK) >> | 760 | Tn_INT_ROUTE_CNF_MASK) >> |
776 | Tn_INT_ROUTE_CNF_SHIFT; | 761 | Tn_INT_ROUTE_CNF_SHIFT; |
@@ -927,8 +912,7 @@ void __init time_init(void) | |||
927 | -xtime.tv_sec, -xtime.tv_nsec); | 912 | -xtime.tv_sec, -xtime.tv_nsec); |
928 | 913 | ||
929 | if (!hpet_init()) | 914 | if (!hpet_init()) |
930 | vxtime_hz = (1000000000000000L + hpet_period / 2) / | 915 | vxtime_hz = (1000000000000000L + hpet_period / 2) / hpet_period; |
931 | hpet_period; | ||
932 | else | 916 | else |
933 | vxtime.hpet_address = 0; | 917 | vxtime.hpet_address = 0; |
934 | 918 | ||
diff --git a/arch/x86_64/kernel/traps.c b/arch/x86_64/kernel/traps.c index 28d50dc540e8..edaa9fe654dc 100644 --- a/arch/x86_64/kernel/traps.c +++ b/arch/x86_64/kernel/traps.c | |||
@@ -47,8 +47,6 @@ | |||
47 | #include <asm/proto.h> | 47 | #include <asm/proto.h> |
48 | #include <asm/nmi.h> | 48 | #include <asm/nmi.h> |
49 | 49 | ||
50 | extern struct gate_struct idt_table[256]; | ||
51 | |||
52 | asmlinkage void divide_error(void); | 50 | asmlinkage void divide_error(void); |
53 | asmlinkage void debug(void); | 51 | asmlinkage void debug(void); |
54 | asmlinkage void nmi(void); | 52 | asmlinkage void nmi(void); |
@@ -71,18 +69,20 @@ asmlinkage void alignment_check(void); | |||
71 | asmlinkage void machine_check(void); | 69 | asmlinkage void machine_check(void); |
72 | asmlinkage void spurious_interrupt_bug(void); | 70 | asmlinkage void spurious_interrupt_bug(void); |
73 | 71 | ||
74 | struct notifier_block *die_chain; | 72 | ATOMIC_NOTIFIER_HEAD(die_chain); |
75 | static DEFINE_SPINLOCK(die_notifier_lock); | ||
76 | 73 | ||
77 | int register_die_notifier(struct notifier_block *nb) | 74 | int register_die_notifier(struct notifier_block *nb) |
78 | { | 75 | { |
79 | int err = 0; | 76 | vmalloc_sync_all(); |
80 | unsigned long flags; | 77 | return atomic_notifier_chain_register(&die_chain, nb); |
81 | spin_lock_irqsave(&die_notifier_lock, flags); | 78 | } |
82 | err = notifier_chain_register(&die_chain, nb); | 79 | EXPORT_SYMBOL(register_die_notifier); |
83 | spin_unlock_irqrestore(&die_notifier_lock, flags); | 80 | |
84 | return err; | 81 | int unregister_die_notifier(struct notifier_block *nb) |
82 | { | ||
83 | return atomic_notifier_chain_unregister(&die_chain, nb); | ||
85 | } | 84 | } |
85 | EXPORT_SYMBOL(unregister_die_notifier); | ||
86 | 86 | ||
87 | static inline void conditional_sti(struct pt_regs *regs) | 87 | static inline void conditional_sti(struct pt_regs *regs) |
88 | { | 88 | { |
@@ -122,7 +122,7 @@ int printk_address(unsigned long address) | |||
122 | if (!modname) | 122 | if (!modname) |
123 | modname = delim = ""; | 123 | modname = delim = ""; |
124 | return printk("<%016lx>{%s%s%s%s%+ld}", | 124 | return printk("<%016lx>{%s%s%s%s%+ld}", |
125 | address,delim,modname,delim,symname,offset); | 125 | address, delim, modname, delim, symname, offset); |
126 | } | 126 | } |
127 | #else | 127 | #else |
128 | int printk_address(unsigned long address) | 128 | int printk_address(unsigned long address) |
@@ -334,13 +334,12 @@ void show_registers(struct pt_regs *regs) | |||
334 | show_stack(NULL, (unsigned long*)rsp); | 334 | show_stack(NULL, (unsigned long*)rsp); |
335 | 335 | ||
336 | printk("\nCode: "); | 336 | printk("\nCode: "); |
337 | if(regs->rip < PAGE_OFFSET) | 337 | if (regs->rip < PAGE_OFFSET) |
338 | goto bad; | 338 | goto bad; |
339 | 339 | ||
340 | for(i=0;i<20;i++) | 340 | for (i=0; i<20; i++) { |
341 | { | ||
342 | unsigned char c; | 341 | unsigned char c; |
343 | if(__get_user(c, &((unsigned char*)regs->rip)[i])) { | 342 | if (__get_user(c, &((unsigned char*)regs->rip)[i])) { |
344 | bad: | 343 | bad: |
345 | printk(" Bad RIP value."); | 344 | printk(" Bad RIP value."); |
346 | break; | 345 | break; |
@@ -479,7 +478,7 @@ static void __kprobes do_trap(int trapnr, int signr, char *str, | |||
479 | printk(KERN_INFO | 478 | printk(KERN_INFO |
480 | "%s[%d] trap %s rip:%lx rsp:%lx error:%lx\n", | 479 | "%s[%d] trap %s rip:%lx rsp:%lx error:%lx\n", |
481 | tsk->comm, tsk->pid, str, | 480 | tsk->comm, tsk->pid, str, |
482 | regs->rip,regs->rsp,error_code); | 481 | regs->rip, regs->rsp, error_code); |
483 | 482 | ||
484 | if (info) | 483 | if (info) |
485 | force_sig_info(signr, info, tsk); | 484 | force_sig_info(signr, info, tsk); |
@@ -493,9 +492,9 @@ static void __kprobes do_trap(int trapnr, int signr, char *str, | |||
493 | { | 492 | { |
494 | const struct exception_table_entry *fixup; | 493 | const struct exception_table_entry *fixup; |
495 | fixup = search_exception_tables(regs->rip); | 494 | fixup = search_exception_tables(regs->rip); |
496 | if (fixup) { | 495 | if (fixup) |
497 | regs->rip = fixup->fixup; | 496 | regs->rip = fixup->fixup; |
498 | } else | 497 | else |
499 | die(str, regs, error_code); | 498 | die(str, regs, error_code); |
500 | return; | 499 | return; |
501 | } | 500 | } |
@@ -568,7 +567,7 @@ asmlinkage void __kprobes do_general_protection(struct pt_regs * regs, | |||
568 | printk(KERN_INFO | 567 | printk(KERN_INFO |
569 | "%s[%d] general protection rip:%lx rsp:%lx error:%lx\n", | 568 | "%s[%d] general protection rip:%lx rsp:%lx error:%lx\n", |
570 | tsk->comm, tsk->pid, | 569 | tsk->comm, tsk->pid, |
571 | regs->rip,regs->rsp,error_code); | 570 | regs->rip, regs->rsp, error_code); |
572 | 571 | ||
573 | force_sig(SIGSEGV, tsk); | 572 | force_sig(SIGSEGV, tsk); |
574 | return; | 573 | return; |
diff --git a/arch/x86_64/kernel/vmlinux.lds.S b/arch/x86_64/kernel/vmlinux.lds.S index 74db0062d4a2..39ff0708f803 100644 --- a/arch/x86_64/kernel/vmlinux.lds.S +++ b/arch/x86_64/kernel/vmlinux.lds.S | |||
@@ -20,6 +20,12 @@ SECTIONS | |||
20 | phys_startup_64 = startup_64 - LOAD_OFFSET; | 20 | phys_startup_64 = startup_64 - LOAD_OFFSET; |
21 | _text = .; /* Text and read-only data */ | 21 | _text = .; /* Text and read-only data */ |
22 | .text : AT(ADDR(.text) - LOAD_OFFSET) { | 22 | .text : AT(ADDR(.text) - LOAD_OFFSET) { |
23 | /* First the code that has to be first for bootstrapping */ | ||
24 | *(.bootstrap.text) | ||
25 | /* Then all the functions that are "hot" in profiles, to group them | ||
26 | onto the same hugetlb entry */ | ||
27 | #include "functionlist" | ||
28 | /* Then the rest */ | ||
23 | *(.text) | 29 | *(.text) |
24 | SCHED_TEXT | 30 | SCHED_TEXT |
25 | LOCK_TEXT | 31 | LOCK_TEXT |
diff --git a/arch/x86_64/kernel/x8664_ksyms.c b/arch/x86_64/kernel/x8664_ksyms.c index 3496abc8d372..d96a9348e5a2 100644 --- a/arch/x86_64/kernel/x8664_ksyms.c +++ b/arch/x86_64/kernel/x8664_ksyms.c | |||
@@ -124,6 +124,7 @@ extern void * __memcpy(void *,const void *,__kernel_size_t); | |||
124 | 124 | ||
125 | EXPORT_SYMBOL(memset); | 125 | EXPORT_SYMBOL(memset); |
126 | EXPORT_SYMBOL(strlen); | 126 | EXPORT_SYMBOL(strlen); |
127 | EXPORT_SYMBOL(strpbrk); | ||
127 | EXPORT_SYMBOL(memmove); | 128 | EXPORT_SYMBOL(memmove); |
128 | EXPORT_SYMBOL(memcpy); | 129 | EXPORT_SYMBOL(memcpy); |
129 | EXPORT_SYMBOL(__memcpy); | 130 | EXPORT_SYMBOL(__memcpy); |
@@ -143,16 +144,12 @@ EXPORT_SYMBOL(rwsem_down_write_failed_thunk); | |||
143 | EXPORT_SYMBOL(empty_zero_page); | 144 | EXPORT_SYMBOL(empty_zero_page); |
144 | 145 | ||
145 | EXPORT_SYMBOL(die_chain); | 146 | EXPORT_SYMBOL(die_chain); |
146 | EXPORT_SYMBOL(register_die_notifier); | ||
147 | 147 | ||
148 | #ifdef CONFIG_SMP | 148 | #ifdef CONFIG_SMP |
149 | EXPORT_SYMBOL(cpu_sibling_map); | 149 | EXPORT_SYMBOL(cpu_sibling_map); |
150 | EXPORT_SYMBOL(smp_num_siblings); | 150 | EXPORT_SYMBOL(smp_num_siblings); |
151 | #endif | 151 | #endif |
152 | 152 | ||
153 | extern void do_softirq_thunk(void); | ||
154 | EXPORT_SYMBOL(do_softirq_thunk); | ||
155 | |||
156 | #ifdef CONFIG_BUG | 153 | #ifdef CONFIG_BUG |
157 | EXPORT_SYMBOL(out_of_line_bug); | 154 | EXPORT_SYMBOL(out_of_line_bug); |
158 | #endif | 155 | #endif |
diff --git a/arch/x86_64/lib/thunk.S b/arch/x86_64/lib/thunk.S index acc1e2ca7ed7..e49af0032e94 100644 --- a/arch/x86_64/lib/thunk.S +++ b/arch/x86_64/lib/thunk.S | |||
@@ -42,7 +42,6 @@ | |||
42 | thunk rwsem_wake_thunk,rwsem_wake | 42 | thunk rwsem_wake_thunk,rwsem_wake |
43 | thunk rwsem_downgrade_thunk,rwsem_downgrade_wake | 43 | thunk rwsem_downgrade_thunk,rwsem_downgrade_wake |
44 | #endif | 44 | #endif |
45 | thunk do_softirq_thunk,do_softirq | ||
46 | 45 | ||
47 | thunk __down_failed,__down | 46 | thunk __down_failed,__down |
48 | thunk_retrax __down_failed_interruptible,__down_interruptible | 47 | thunk_retrax __down_failed_interruptible,__down_interruptible |
diff --git a/arch/x86_64/mm/fault.c b/arch/x86_64/mm/fault.c index 2e7c3c8ffe03..316c53de47bd 100644 --- a/arch/x86_64/mm/fault.c +++ b/arch/x86_64/mm/fault.c | |||
@@ -264,6 +264,8 @@ static int vmalloc_fault(unsigned long address) | |||
264 | return -1; | 264 | return -1; |
265 | if (pgd_none(*pgd)) | 265 | if (pgd_none(*pgd)) |
266 | set_pgd(pgd, *pgd_ref); | 266 | set_pgd(pgd, *pgd_ref); |
267 | else | ||
268 | BUG_ON(pgd_page(*pgd) != pgd_page(*pgd_ref)); | ||
267 | 269 | ||
268 | /* Below here mismatches are bugs because these lower tables | 270 | /* Below here mismatches are bugs because these lower tables |
269 | are shared */ | 271 | are shared */ |
@@ -312,21 +314,13 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, | |||
312 | unsigned long flags; | 314 | unsigned long flags; |
313 | siginfo_t info; | 315 | siginfo_t info; |
314 | 316 | ||
317 | tsk = current; | ||
318 | mm = tsk->mm; | ||
319 | prefetchw(&mm->mmap_sem); | ||
320 | |||
315 | /* get the address */ | 321 | /* get the address */ |
316 | __asm__("movq %%cr2,%0":"=r" (address)); | 322 | __asm__("movq %%cr2,%0":"=r" (address)); |
317 | if (notify_die(DIE_PAGE_FAULT, "page fault", regs, error_code, 14, | ||
318 | SIGSEGV) == NOTIFY_STOP) | ||
319 | return; | ||
320 | |||
321 | if (likely(regs->eflags & X86_EFLAGS_IF)) | ||
322 | local_irq_enable(); | ||
323 | 323 | ||
324 | if (unlikely(page_fault_trace)) | ||
325 | printk("pagefault rip:%lx rsp:%lx cs:%lu ss:%lu address %lx error %lx\n", | ||
326 | regs->rip,regs->rsp,regs->cs,regs->ss,address,error_code); | ||
327 | |||
328 | tsk = current; | ||
329 | mm = tsk->mm; | ||
330 | info.si_code = SEGV_MAPERR; | 324 | info.si_code = SEGV_MAPERR; |
331 | 325 | ||
332 | 326 | ||
@@ -351,10 +345,12 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, | |||
351 | */ | 345 | */ |
352 | if (!(error_code & (PF_RSVD|PF_USER|PF_PROT)) && | 346 | if (!(error_code & (PF_RSVD|PF_USER|PF_PROT)) && |
353 | ((address >= VMALLOC_START && address < VMALLOC_END))) { | 347 | ((address >= VMALLOC_START && address < VMALLOC_END))) { |
354 | if (vmalloc_fault(address) < 0) | 348 | if (vmalloc_fault(address) >= 0) |
355 | goto bad_area_nosemaphore; | 349 | return; |
356 | return; | ||
357 | } | 350 | } |
351 | if (notify_die(DIE_PAGE_FAULT, "page fault", regs, error_code, 14, | ||
352 | SIGSEGV) == NOTIFY_STOP) | ||
353 | return; | ||
358 | /* | 354 | /* |
359 | * Don't take the mm semaphore here. If we fixup a prefetch | 355 | * Don't take the mm semaphore here. If we fixup a prefetch |
360 | * fault we could otherwise deadlock. | 356 | * fault we could otherwise deadlock. |
@@ -362,6 +358,17 @@ asmlinkage void __kprobes do_page_fault(struct pt_regs *regs, | |||
362 | goto bad_area_nosemaphore; | 358 | goto bad_area_nosemaphore; |
363 | } | 359 | } |
364 | 360 | ||
361 | if (notify_die(DIE_PAGE_FAULT, "page fault", regs, error_code, 14, | ||
362 | SIGSEGV) == NOTIFY_STOP) | ||
363 | return; | ||
364 | |||
365 | if (likely(regs->eflags & X86_EFLAGS_IF)) | ||
366 | local_irq_enable(); | ||
367 | |||
368 | if (unlikely(page_fault_trace)) | ||
369 | printk("pagefault rip:%lx rsp:%lx cs:%lu ss:%lu address %lx error %lx\n", | ||
370 | regs->rip,regs->rsp,regs->cs,regs->ss,address,error_code); | ||
371 | |||
365 | if (unlikely(error_code & PF_RSVD)) | 372 | if (unlikely(error_code & PF_RSVD)) |
366 | pgtable_bad(address, regs, error_code); | 373 | pgtable_bad(address, regs, error_code); |
367 | 374 | ||
@@ -571,6 +578,48 @@ do_sigbus: | |||
571 | return; | 578 | return; |
572 | } | 579 | } |
573 | 580 | ||
581 | DEFINE_SPINLOCK(pgd_lock); | ||
582 | struct page *pgd_list; | ||
583 | |||
584 | void vmalloc_sync_all(void) | ||
585 | { | ||
586 | /* Note that races in the updates of insync and start aren't | ||
587 | problematic: | ||
588 | insync can only get set bits added, and updates to start are only | ||
589 | improving performance (without affecting correctness if undone). */ | ||
590 | static DECLARE_BITMAP(insync, PTRS_PER_PGD); | ||
591 | static unsigned long start = VMALLOC_START & PGDIR_MASK; | ||
592 | unsigned long address; | ||
593 | |||
594 | for (address = start; address <= VMALLOC_END; address += PGDIR_SIZE) { | ||
595 | if (!test_bit(pgd_index(address), insync)) { | ||
596 | const pgd_t *pgd_ref = pgd_offset_k(address); | ||
597 | struct page *page; | ||
598 | |||
599 | if (pgd_none(*pgd_ref)) | ||
600 | continue; | ||
601 | spin_lock(&pgd_lock); | ||
602 | for (page = pgd_list; page; | ||
603 | page = (struct page *)page->index) { | ||
604 | pgd_t *pgd; | ||
605 | pgd = (pgd_t *)page_address(page) + pgd_index(address); | ||
606 | if (pgd_none(*pgd)) | ||
607 | set_pgd(pgd, *pgd_ref); | ||
608 | else | ||
609 | BUG_ON(pgd_page(*pgd) != pgd_page(*pgd_ref)); | ||
610 | } | ||
611 | spin_unlock(&pgd_lock); | ||
612 | set_bit(pgd_index(address), insync); | ||
613 | } | ||
614 | if (address == start) | ||
615 | start = address + PGDIR_SIZE; | ||
616 | } | ||
617 | /* Check that there is no need to do the same for the modules area. */ | ||
618 | BUILD_BUG_ON(!(MODULES_VADDR > __START_KERNEL)); | ||
619 | BUILD_BUG_ON(!(((MODULES_END - 1) & PGDIR_MASK) == | ||
620 | (__START_KERNEL & PGDIR_MASK))); | ||
621 | } | ||
622 | |||
574 | static int __init enable_pagefaulttrace(char *str) | 623 | static int __init enable_pagefaulttrace(char *str) |
575 | { | 624 | { |
576 | page_fault_trace = 1; | 625 | page_fault_trace = 1; |
diff --git a/arch/x86_64/mm/init.c b/arch/x86_64/mm/init.c index 7af1742aa958..e5f7f1c34462 100644 --- a/arch/x86_64/mm/init.c +++ b/arch/x86_64/mm/init.c | |||
@@ -72,7 +72,7 @@ void show_mem(void) | |||
72 | show_free_areas(); | 72 | show_free_areas(); |
73 | printk(KERN_INFO "Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); | 73 | printk(KERN_INFO "Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); |
74 | 74 | ||
75 | for_each_pgdat(pgdat) { | 75 | for_each_online_pgdat(pgdat) { |
76 | for (i = 0; i < pgdat->node_spanned_pages; ++i) { | 76 | for (i = 0; i < pgdat->node_spanned_pages; ++i) { |
77 | page = pfn_to_page(pgdat->node_start_pfn + i); | 77 | page = pfn_to_page(pgdat->node_start_pfn + i); |
78 | total++; | 78 | total++; |
@@ -94,7 +94,7 @@ void show_mem(void) | |||
94 | 94 | ||
95 | int after_bootmem; | 95 | int after_bootmem; |
96 | 96 | ||
97 | static void *spp_getpage(void) | 97 | static __init void *spp_getpage(void) |
98 | { | 98 | { |
99 | void *ptr; | 99 | void *ptr; |
100 | if (after_bootmem) | 100 | if (after_bootmem) |
@@ -108,7 +108,7 @@ static void *spp_getpage(void) | |||
108 | return ptr; | 108 | return ptr; |
109 | } | 109 | } |
110 | 110 | ||
111 | static void set_pte_phys(unsigned long vaddr, | 111 | static __init void set_pte_phys(unsigned long vaddr, |
112 | unsigned long phys, pgprot_t prot) | 112 | unsigned long phys, pgprot_t prot) |
113 | { | 113 | { |
114 | pgd_t *pgd; | 114 | pgd_t *pgd; |
@@ -157,7 +157,8 @@ static void set_pte_phys(unsigned long vaddr, | |||
157 | } | 157 | } |
158 | 158 | ||
159 | /* NOTE: this is meant to be run only at boot */ | 159 | /* NOTE: this is meant to be run only at boot */ |
160 | void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t prot) | 160 | void __init |
161 | __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t prot) | ||
161 | { | 162 | { |
162 | unsigned long address = __fix_to_virt(idx); | 163 | unsigned long address = __fix_to_virt(idx); |
163 | 164 | ||
@@ -225,6 +226,33 @@ static __meminit void unmap_low_page(int i) | |||
225 | ti->allocated = 0; | 226 | ti->allocated = 0; |
226 | } | 227 | } |
227 | 228 | ||
229 | /* Must run before zap_low_mappings */ | ||
230 | __init void *early_ioremap(unsigned long addr, unsigned long size) | ||
231 | { | ||
232 | unsigned long map = round_down(addr, LARGE_PAGE_SIZE); | ||
233 | |||
234 | /* actually usually some more */ | ||
235 | if (size >= LARGE_PAGE_SIZE) { | ||
236 | printk("SMBIOS area too long %lu\n", size); | ||
237 | return NULL; | ||
238 | } | ||
239 | set_pmd(temp_mappings[0].pmd, __pmd(map | _KERNPG_TABLE | _PAGE_PSE)); | ||
240 | map += LARGE_PAGE_SIZE; | ||
241 | set_pmd(temp_mappings[1].pmd, __pmd(map | _KERNPG_TABLE | _PAGE_PSE)); | ||
242 | __flush_tlb(); | ||
243 | return temp_mappings[0].address + (addr & (LARGE_PAGE_SIZE-1)); | ||
244 | } | ||
245 | |||
246 | /* To avoid virtual aliases later */ | ||
247 | __init void early_iounmap(void *addr, unsigned long size) | ||
248 | { | ||
249 | if ((void *)round_down((unsigned long)addr, LARGE_PAGE_SIZE) != temp_mappings[0].address) | ||
250 | printk("early_iounmap: bad address %p\n", addr); | ||
251 | set_pmd(temp_mappings[0].pmd, __pmd(0)); | ||
252 | set_pmd(temp_mappings[1].pmd, __pmd(0)); | ||
253 | __flush_tlb(); | ||
254 | } | ||
255 | |||
228 | static void __meminit | 256 | static void __meminit |
229 | phys_pmd_init(pmd_t *pmd, unsigned long address, unsigned long end) | 257 | phys_pmd_init(pmd_t *pmd, unsigned long address, unsigned long end) |
230 | { | 258 | { |
@@ -344,7 +372,7 @@ void __meminit init_memory_mapping(unsigned long start, unsigned long end) | |||
344 | pud_t *pud; | 372 | pud_t *pud; |
345 | 373 | ||
346 | if (after_bootmem) | 374 | if (after_bootmem) |
347 | pud = pud_offset_k(pgd, __PAGE_OFFSET); | 375 | pud = pud_offset_k(pgd, start & PGDIR_MASK); |
348 | else | 376 | else |
349 | pud = alloc_low_page(&map, &pud_phys); | 377 | pud = alloc_low_page(&map, &pud_phys); |
350 | 378 | ||
@@ -486,7 +514,7 @@ void __init clear_kernel_mapping(unsigned long address, unsigned long size) | |||
486 | void online_page(struct page *page) | 514 | void online_page(struct page *page) |
487 | { | 515 | { |
488 | ClearPageReserved(page); | 516 | ClearPageReserved(page); |
489 | set_page_count(page, 1); | 517 | init_page_count(page); |
490 | __free_page(page); | 518 | __free_page(page); |
491 | totalram_pages++; | 519 | totalram_pages++; |
492 | num_physpages++; | 520 | num_physpages++; |
@@ -592,7 +620,7 @@ void free_initmem(void) | |||
592 | addr = (unsigned long)(&__init_begin); | 620 | addr = (unsigned long)(&__init_begin); |
593 | for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { | 621 | for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) { |
594 | ClearPageReserved(virt_to_page(addr)); | 622 | ClearPageReserved(virt_to_page(addr)); |
595 | set_page_count(virt_to_page(addr), 1); | 623 | init_page_count(virt_to_page(addr)); |
596 | memset((void *)(addr & ~(PAGE_SIZE-1)), 0xcc, PAGE_SIZE); | 624 | memset((void *)(addr & ~(PAGE_SIZE-1)), 0xcc, PAGE_SIZE); |
597 | free_page(addr); | 625 | free_page(addr); |
598 | totalram_pages++; | 626 | totalram_pages++; |
@@ -632,7 +660,7 @@ void free_initrd_mem(unsigned long start, unsigned long end) | |||
632 | printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); | 660 | printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); |
633 | for (; start < end; start += PAGE_SIZE) { | 661 | for (; start < end; start += PAGE_SIZE) { |
634 | ClearPageReserved(virt_to_page(start)); | 662 | ClearPageReserved(virt_to_page(start)); |
635 | set_page_count(virt_to_page(start), 1); | 663 | init_page_count(virt_to_page(start)); |
636 | free_page(start); | 664 | free_page(start); |
637 | totalram_pages++; | 665 | totalram_pages++; |
638 | } | 666 | } |
diff --git a/arch/x86_64/mm/k8topology.c b/arch/x86_64/mm/k8topology.c index dd60e71fdba6..7c45c2d2b8b2 100644 --- a/arch/x86_64/mm/k8topology.c +++ b/arch/x86_64/mm/k8topology.c | |||
@@ -43,7 +43,7 @@ static __init int find_northbridge(void) | |||
43 | int __init k8_scan_nodes(unsigned long start, unsigned long end) | 43 | int __init k8_scan_nodes(unsigned long start, unsigned long end) |
44 | { | 44 | { |
45 | unsigned long prevbase; | 45 | unsigned long prevbase; |
46 | struct node nodes[8]; | 46 | struct bootnode nodes[8]; |
47 | int nodeid, i, nb; | 47 | int nodeid, i, nb; |
48 | unsigned char nodeids[8]; | 48 | unsigned char nodeids[8]; |
49 | int found = 0; | 49 | int found = 0; |
diff --git a/arch/x86_64/mm/numa.c b/arch/x86_64/mm/numa.c index 22e51beee8d3..4be82d6e2b48 100644 --- a/arch/x86_64/mm/numa.c +++ b/arch/x86_64/mm/numa.c | |||
@@ -25,8 +25,7 @@ | |||
25 | struct pglist_data *node_data[MAX_NUMNODES] __read_mostly; | 25 | struct pglist_data *node_data[MAX_NUMNODES] __read_mostly; |
26 | bootmem_data_t plat_node_bdata[MAX_NUMNODES]; | 26 | bootmem_data_t plat_node_bdata[MAX_NUMNODES]; |
27 | 27 | ||
28 | int memnode_shift; | 28 | struct memnode memnode; |
29 | u8 memnodemap[NODEMAPSIZE]; | ||
30 | 29 | ||
31 | unsigned char cpu_to_node[NR_CPUS] __read_mostly = { | 30 | unsigned char cpu_to_node[NR_CPUS] __read_mostly = { |
32 | [0 ... NR_CPUS-1] = NUMA_NO_NODE | 31 | [0 ... NR_CPUS-1] = NUMA_NO_NODE |
@@ -47,7 +46,7 @@ int numa_off __initdata; | |||
47 | * -1 if node overlap or lost ram (shift too big) | 46 | * -1 if node overlap or lost ram (shift too big) |
48 | */ | 47 | */ |
49 | static int __init | 48 | static int __init |
50 | populate_memnodemap(const struct node *nodes, int numnodes, int shift) | 49 | populate_memnodemap(const struct bootnode *nodes, int numnodes, int shift) |
51 | { | 50 | { |
52 | int i; | 51 | int i; |
53 | int res = -1; | 52 | int res = -1; |
@@ -74,7 +73,7 @@ populate_memnodemap(const struct node *nodes, int numnodes, int shift) | |||
74 | return res; | 73 | return res; |
75 | } | 74 | } |
76 | 75 | ||
77 | int __init compute_hash_shift(struct node *nodes, int numnodes) | 76 | int __init compute_hash_shift(struct bootnode *nodes, int numnodes) |
78 | { | 77 | { |
79 | int shift = 20; | 78 | int shift = 20; |
80 | 79 | ||
@@ -149,7 +148,7 @@ void __init setup_node_bootmem(int nodeid, unsigned long start, unsigned long en | |||
149 | /* Initialize final allocator for a zone */ | 148 | /* Initialize final allocator for a zone */ |
150 | void __init setup_node_zones(int nodeid) | 149 | void __init setup_node_zones(int nodeid) |
151 | { | 150 | { |
152 | unsigned long start_pfn, end_pfn; | 151 | unsigned long start_pfn, end_pfn, memmapsize, limit; |
153 | unsigned long zones[MAX_NR_ZONES]; | 152 | unsigned long zones[MAX_NR_ZONES]; |
154 | unsigned long holes[MAX_NR_ZONES]; | 153 | unsigned long holes[MAX_NR_ZONES]; |
155 | 154 | ||
@@ -159,6 +158,16 @@ void __init setup_node_zones(int nodeid) | |||
159 | Dprintk(KERN_INFO "Setting up node %d %lx-%lx\n", | 158 | Dprintk(KERN_INFO "Setting up node %d %lx-%lx\n", |
160 | nodeid, start_pfn, end_pfn); | 159 | nodeid, start_pfn, end_pfn); |
161 | 160 | ||
161 | /* Try to allocate mem_map at end to not fill up precious <4GB | ||
162 | memory. */ | ||
163 | memmapsize = sizeof(struct page) * (end_pfn-start_pfn); | ||
164 | limit = end_pfn << PAGE_SHIFT; | ||
165 | NODE_DATA(nodeid)->node_mem_map = | ||
166 | __alloc_bootmem_core(NODE_DATA(nodeid)->bdata, | ||
167 | memmapsize, SMP_CACHE_BYTES, | ||
168 | round_down(limit - memmapsize, PAGE_SIZE), | ||
169 | limit); | ||
170 | |||
162 | size_zones(zones, holes, start_pfn, end_pfn); | 171 | size_zones(zones, holes, start_pfn, end_pfn); |
163 | free_area_init_node(nodeid, NODE_DATA(nodeid), zones, | 172 | free_area_init_node(nodeid, NODE_DATA(nodeid), zones, |
164 | start_pfn, holes); | 173 | start_pfn, holes); |
@@ -191,7 +200,7 @@ int numa_fake __initdata = 0; | |||
191 | static int numa_emulation(unsigned long start_pfn, unsigned long end_pfn) | 200 | static int numa_emulation(unsigned long start_pfn, unsigned long end_pfn) |
192 | { | 201 | { |
193 | int i; | 202 | int i; |
194 | struct node nodes[MAX_NUMNODES]; | 203 | struct bootnode nodes[MAX_NUMNODES]; |
195 | unsigned long sz = ((end_pfn - start_pfn)<<PAGE_SHIFT) / numa_fake; | 204 | unsigned long sz = ((end_pfn - start_pfn)<<PAGE_SHIFT) / numa_fake; |
196 | 205 | ||
197 | /* Kludge needed for the hash function */ | 206 | /* Kludge needed for the hash function */ |
@@ -357,8 +366,7 @@ void __init init_cpu_to_node(void) | |||
357 | 366 | ||
358 | EXPORT_SYMBOL(cpu_to_node); | 367 | EXPORT_SYMBOL(cpu_to_node); |
359 | EXPORT_SYMBOL(node_to_cpumask); | 368 | EXPORT_SYMBOL(node_to_cpumask); |
360 | EXPORT_SYMBOL(memnode_shift); | 369 | EXPORT_SYMBOL(memnode); |
361 | EXPORT_SYMBOL(memnodemap); | ||
362 | EXPORT_SYMBOL(node_data); | 370 | EXPORT_SYMBOL(node_data); |
363 | 371 | ||
364 | #ifdef CONFIG_DISCONTIGMEM | 372 | #ifdef CONFIG_DISCONTIGMEM |
@@ -369,21 +377,6 @@ EXPORT_SYMBOL(node_data); | |||
369 | * Should do that. | 377 | * Should do that. |
370 | */ | 378 | */ |
371 | 379 | ||
372 | /* Requires pfn_valid(pfn) to be true */ | ||
373 | struct page *pfn_to_page(unsigned long pfn) | ||
374 | { | ||
375 | int nid = phys_to_nid(((unsigned long)(pfn)) << PAGE_SHIFT); | ||
376 | return (pfn - node_start_pfn(nid)) + NODE_DATA(nid)->node_mem_map; | ||
377 | } | ||
378 | EXPORT_SYMBOL(pfn_to_page); | ||
379 | |||
380 | unsigned long page_to_pfn(struct page *page) | ||
381 | { | ||
382 | return (long)(((page) - page_zone(page)->zone_mem_map) + | ||
383 | page_zone(page)->zone_start_pfn); | ||
384 | } | ||
385 | EXPORT_SYMBOL(page_to_pfn); | ||
386 | |||
387 | int pfn_valid(unsigned long pfn) | 380 | int pfn_valid(unsigned long pfn) |
388 | { | 381 | { |
389 | unsigned nid; | 382 | unsigned nid; |
diff --git a/arch/x86_64/mm/pageattr.c b/arch/x86_64/mm/pageattr.c index 35f1f1aab063..531ad21447b1 100644 --- a/arch/x86_64/mm/pageattr.c +++ b/arch/x86_64/mm/pageattr.c | |||
@@ -45,6 +45,13 @@ static struct page *split_large_page(unsigned long address, pgprot_t prot, | |||
45 | pte_t *pbase; | 45 | pte_t *pbase; |
46 | if (!base) | 46 | if (!base) |
47 | return NULL; | 47 | return NULL; |
48 | /* | ||
49 | * page_private is used to track the number of entries in | ||
50 | * the page table page have non standard attributes. | ||
51 | */ | ||
52 | SetPagePrivate(base); | ||
53 | page_private(base) = 0; | ||
54 | |||
48 | address = __pa(address); | 55 | address = __pa(address); |
49 | addr = address & LARGE_PAGE_MASK; | 56 | addr = address & LARGE_PAGE_MASK; |
50 | pbase = (pte_t *)page_address(base); | 57 | pbase = (pte_t *)page_address(base); |
@@ -77,26 +84,12 @@ static inline void flush_map(unsigned long address) | |||
77 | on_each_cpu(flush_kernel_map, (void *)address, 1, 1); | 84 | on_each_cpu(flush_kernel_map, (void *)address, 1, 1); |
78 | } | 85 | } |
79 | 86 | ||
80 | struct deferred_page { | 87 | static struct page *deferred_pages; /* protected by init_mm.mmap_sem */ |
81 | struct deferred_page *next; | ||
82 | struct page *fpage; | ||
83 | unsigned long address; | ||
84 | }; | ||
85 | static struct deferred_page *df_list; /* protected by init_mm.mmap_sem */ | ||
86 | 88 | ||
87 | static inline void save_page(unsigned long address, struct page *fpage) | 89 | static inline void save_page(struct page *fpage) |
88 | { | 90 | { |
89 | struct deferred_page *df; | 91 | fpage->lru.next = (struct list_head *)deferred_pages; |
90 | df = kmalloc(sizeof(struct deferred_page), GFP_KERNEL); | 92 | deferred_pages = fpage; |
91 | if (!df) { | ||
92 | flush_map(address); | ||
93 | __free_page(fpage); | ||
94 | } else { | ||
95 | df->next = df_list; | ||
96 | df->fpage = fpage; | ||
97 | df->address = address; | ||
98 | df_list = df; | ||
99 | } | ||
100 | } | 93 | } |
101 | 94 | ||
102 | /* | 95 | /* |
@@ -138,8 +131,8 @@ __change_page_attr(unsigned long address, unsigned long pfn, pgprot_t prot, | |||
138 | set_pte(kpte, pfn_pte(pfn, prot)); | 131 | set_pte(kpte, pfn_pte(pfn, prot)); |
139 | } else { | 132 | } else { |
140 | /* | 133 | /* |
141 | * split_large_page will take the reference for this change_page_attr | 134 | * split_large_page will take the reference for this |
142 | * on the split page. | 135 | * change_page_attr on the split page. |
143 | */ | 136 | */ |
144 | 137 | ||
145 | struct page *split; | 138 | struct page *split; |
@@ -151,23 +144,20 @@ __change_page_attr(unsigned long address, unsigned long pfn, pgprot_t prot, | |||
151 | set_pte(kpte,mk_pte(split, ref_prot2)); | 144 | set_pte(kpte,mk_pte(split, ref_prot2)); |
152 | kpte_page = split; | 145 | kpte_page = split; |
153 | } | 146 | } |
154 | get_page(kpte_page); | 147 | page_private(kpte_page)++; |
155 | } else if ((kpte_flags & _PAGE_PSE) == 0) { | 148 | } else if ((kpte_flags & _PAGE_PSE) == 0) { |
156 | set_pte(kpte, pfn_pte(pfn, ref_prot)); | 149 | set_pte(kpte, pfn_pte(pfn, ref_prot)); |
157 | __put_page(kpte_page); | 150 | BUG_ON(page_private(kpte_page) == 0); |
151 | page_private(kpte_page)--; | ||
158 | } else | 152 | } else |
159 | BUG(); | 153 | BUG(); |
160 | 154 | ||
161 | /* on x86-64 the direct mapping set at boot is not using 4k pages */ | 155 | /* on x86-64 the direct mapping set at boot is not using 4k pages */ |
162 | BUG_ON(PageReserved(kpte_page)); | 156 | BUG_ON(PageReserved(kpte_page)); |
163 | 157 | ||
164 | switch (page_count(kpte_page)) { | 158 | if (page_private(kpte_page) == 0) { |
165 | case 1: | 159 | save_page(kpte_page); |
166 | save_page(address, kpte_page); | ||
167 | revert_page(address, ref_prot); | 160 | revert_page(address, ref_prot); |
168 | break; | ||
169 | case 0: | ||
170 | BUG(); /* memleak and failed 2M page regeneration */ | ||
171 | } | 161 | } |
172 | return 0; | 162 | return 0; |
173 | } | 163 | } |
@@ -220,17 +210,18 @@ int change_page_attr(struct page *page, int numpages, pgprot_t prot) | |||
220 | 210 | ||
221 | void global_flush_tlb(void) | 211 | void global_flush_tlb(void) |
222 | { | 212 | { |
223 | struct deferred_page *df, *next_df; | 213 | struct page *dpage; |
224 | 214 | ||
225 | down_read(&init_mm.mmap_sem); | 215 | down_read(&init_mm.mmap_sem); |
226 | df = xchg(&df_list, NULL); | 216 | dpage = xchg(&deferred_pages, NULL); |
227 | up_read(&init_mm.mmap_sem); | 217 | up_read(&init_mm.mmap_sem); |
228 | flush_map((df && !df->next) ? df->address : 0); | 218 | |
229 | for (; df; df = next_df) { | 219 | flush_map((dpage && !dpage->lru.next) ? (unsigned long)page_address(dpage) : 0); |
230 | next_df = df->next; | 220 | while (dpage) { |
231 | if (df->fpage) | 221 | struct page *tmp = dpage; |
232 | __free_page(df->fpage); | 222 | dpage = (struct page *)dpage->lru.next; |
233 | kfree(df); | 223 | ClearPagePrivate(tmp); |
224 | __free_page(tmp); | ||
234 | } | 225 | } |
235 | } | 226 | } |
236 | 227 | ||
diff --git a/arch/x86_64/mm/srat.c b/arch/x86_64/mm/srat.c index 482c25767369..2eb879590dc4 100644 --- a/arch/x86_64/mm/srat.c +++ b/arch/x86_64/mm/srat.c | |||
@@ -23,7 +23,7 @@ static struct acpi_table_slit *acpi_slit; | |||
23 | 23 | ||
24 | static nodemask_t nodes_parsed __initdata; | 24 | static nodemask_t nodes_parsed __initdata; |
25 | static nodemask_t nodes_found __initdata; | 25 | static nodemask_t nodes_found __initdata; |
26 | static struct node nodes[MAX_NUMNODES] __initdata; | 26 | static struct bootnode nodes[MAX_NUMNODES] __initdata; |
27 | static u8 pxm2node[256] = { [0 ... 255] = 0xff }; | 27 | static u8 pxm2node[256] = { [0 ... 255] = 0xff }; |
28 | 28 | ||
29 | /* Too small nodes confuse the VM badly. Usually they result | 29 | /* Too small nodes confuse the VM badly. Usually they result |
@@ -57,7 +57,7 @@ static __init int conflicting_nodes(unsigned long start, unsigned long end) | |||
57 | { | 57 | { |
58 | int i; | 58 | int i; |
59 | for_each_node_mask(i, nodes_parsed) { | 59 | for_each_node_mask(i, nodes_parsed) { |
60 | struct node *nd = &nodes[i]; | 60 | struct bootnode *nd = &nodes[i]; |
61 | if (nd->start == nd->end) | 61 | if (nd->start == nd->end) |
62 | continue; | 62 | continue; |
63 | if (nd->end > start && nd->start < end) | 63 | if (nd->end > start && nd->start < end) |
@@ -70,7 +70,7 @@ static __init int conflicting_nodes(unsigned long start, unsigned long end) | |||
70 | 70 | ||
71 | static __init void cutoff_node(int i, unsigned long start, unsigned long end) | 71 | static __init void cutoff_node(int i, unsigned long start, unsigned long end) |
72 | { | 72 | { |
73 | struct node *nd = &nodes[i]; | 73 | struct bootnode *nd = &nodes[i]; |
74 | if (nd->start < start) { | 74 | if (nd->start < start) { |
75 | nd->start = start; | 75 | nd->start = start; |
76 | if (nd->end < nd->start) | 76 | if (nd->end < nd->start) |
@@ -159,7 +159,7 @@ acpi_numa_processor_affinity_init(struct acpi_table_processor_affinity *pa) | |||
159 | void __init | 159 | void __init |
160 | acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma) | 160 | acpi_numa_memory_affinity_init(struct acpi_table_memory_affinity *ma) |
161 | { | 161 | { |
162 | struct node *nd; | 162 | struct bootnode *nd; |
163 | unsigned long start, end; | 163 | unsigned long start, end; |
164 | int node, pxm; | 164 | int node, pxm; |
165 | int i; | 165 | int i; |
diff --git a/arch/x86_64/pci/Makefile b/arch/x86_64/pci/Makefile index a8f75a2a0f6f..a3f6ad570179 100644 --- a/arch/x86_64/pci/Makefile +++ b/arch/x86_64/pci/Makefile | |||
@@ -7,7 +7,7 @@ CFLAGS += -Iarch/i386/pci | |||
7 | 7 | ||
8 | obj-y := i386.o | 8 | obj-y := i386.o |
9 | obj-$(CONFIG_PCI_DIRECT)+= direct.o | 9 | obj-$(CONFIG_PCI_DIRECT)+= direct.o |
10 | obj-y += fixup.o | 10 | obj-y += fixup.o init.o |
11 | obj-$(CONFIG_ACPI) += acpi.o | 11 | obj-$(CONFIG_ACPI) += acpi.o |
12 | obj-y += legacy.o irq.o common.o | 12 | obj-y += legacy.o irq.o common.o |
13 | # mmconfig has a 64bit special | 13 | # mmconfig has a 64bit special |
@@ -22,3 +22,4 @@ irq-y += ../../i386/pci/irq.o | |||
22 | common-y += ../../i386/pci/common.o | 22 | common-y += ../../i386/pci/common.o |
23 | fixup-y += ../../i386/pci/fixup.o | 23 | fixup-y += ../../i386/pci/fixup.o |
24 | i386-y += ../../i386/pci/i386.o | 24 | i386-y += ../../i386/pci/i386.o |
25 | init-y += ../../i386/pci/init.o | ||
diff --git a/arch/x86_64/pci/mmconfig.c b/arch/x86_64/pci/mmconfig.c index 18f371fe37f8..e616500207e4 100644 --- a/arch/x86_64/pci/mmconfig.c +++ b/arch/x86_64/pci/mmconfig.c | |||
@@ -55,7 +55,7 @@ static char __iomem *get_virt(unsigned int seg, unsigned bus) | |||
55 | static char __iomem *pci_dev_base(unsigned int seg, unsigned int bus, unsigned int devfn) | 55 | static char __iomem *pci_dev_base(unsigned int seg, unsigned int bus, unsigned int devfn) |
56 | { | 56 | { |
57 | char __iomem *addr; | 57 | char __iomem *addr; |
58 | if (seg == 0 && bus == 0 && test_bit(PCI_SLOT(devfn), &fallback_slots)) | 58 | if (seg == 0 && bus == 0 && test_bit(PCI_SLOT(devfn), fallback_slots)) |
59 | return NULL; | 59 | return NULL; |
60 | addr = get_virt(seg, bus); | 60 | addr = get_virt(seg, bus); |
61 | if (!addr) | 61 | if (!addr) |
@@ -143,29 +143,29 @@ static __init void unreachable_devices(void) | |||
143 | continue; | 143 | continue; |
144 | addr = pci_dev_base(0, 0, PCI_DEVFN(i, 0)); | 144 | addr = pci_dev_base(0, 0, PCI_DEVFN(i, 0)); |
145 | if (addr == NULL|| readl(addr) != val1) { | 145 | if (addr == NULL|| readl(addr) != val1) { |
146 | set_bit(i, &fallback_slots); | 146 | set_bit(i, fallback_slots); |
147 | } | 147 | } |
148 | } | 148 | } |
149 | } | 149 | } |
150 | 150 | ||
151 | static int __init pci_mmcfg_init(void) | 151 | void __init pci_mmcfg_init(void) |
152 | { | 152 | { |
153 | int i; | 153 | int i; |
154 | 154 | ||
155 | if ((pci_probe & PCI_PROBE_MMCONF) == 0) | 155 | if ((pci_probe & PCI_PROBE_MMCONF) == 0) |
156 | return 0; | 156 | return; |
157 | 157 | ||
158 | acpi_table_parse(ACPI_MCFG, acpi_parse_mcfg); | 158 | acpi_table_parse(ACPI_MCFG, acpi_parse_mcfg); |
159 | if ((pci_mmcfg_config_num == 0) || | 159 | if ((pci_mmcfg_config_num == 0) || |
160 | (pci_mmcfg_config == NULL) || | 160 | (pci_mmcfg_config == NULL) || |
161 | (pci_mmcfg_config[0].base_address == 0)) | 161 | (pci_mmcfg_config[0].base_address == 0)) |
162 | return 0; | 162 | return; |
163 | 163 | ||
164 | /* RED-PEN i386 doesn't do _nocache right now */ | 164 | /* RED-PEN i386 doesn't do _nocache right now */ |
165 | pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_num, GFP_KERNEL); | 165 | pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_num, GFP_KERNEL); |
166 | if (pci_mmcfg_virt == NULL) { | 166 | if (pci_mmcfg_virt == NULL) { |
167 | printk("PCI: Can not allocate memory for mmconfig structures\n"); | 167 | printk("PCI: Can not allocate memory for mmconfig structures\n"); |
168 | return 0; | 168 | return; |
169 | } | 169 | } |
170 | for (i = 0; i < pci_mmcfg_config_num; ++i) { | 170 | for (i = 0; i < pci_mmcfg_config_num; ++i) { |
171 | pci_mmcfg_virt[i].cfg = &pci_mmcfg_config[i]; | 171 | pci_mmcfg_virt[i].cfg = &pci_mmcfg_config[i]; |
@@ -173,7 +173,7 @@ static int __init pci_mmcfg_init(void) | |||
173 | if (!pci_mmcfg_virt[i].virt) { | 173 | if (!pci_mmcfg_virt[i].virt) { |
174 | printk("PCI: Cannot map mmconfig aperture for segment %d\n", | 174 | printk("PCI: Cannot map mmconfig aperture for segment %d\n", |
175 | pci_mmcfg_config[i].pci_segment_group_number); | 175 | pci_mmcfg_config[i].pci_segment_group_number); |
176 | return 0; | 176 | return; |
177 | } | 177 | } |
178 | printk(KERN_INFO "PCI: Using MMCONFIG at %x\n", pci_mmcfg_config[i].base_address); | 178 | printk(KERN_INFO "PCI: Using MMCONFIG at %x\n", pci_mmcfg_config[i].base_address); |
179 | } | 179 | } |
@@ -182,8 +182,4 @@ static int __init pci_mmcfg_init(void) | |||
182 | 182 | ||
183 | raw_pci_ops = &pci_mmcfg; | 183 | raw_pci_ops = &pci_mmcfg; |
184 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; | 184 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; |
185 | |||
186 | return 0; | ||
187 | } | 185 | } |
188 | |||
189 | arch_initcall(pci_mmcfg_init); | ||