diff options
461 files changed, 5384 insertions, 2947 deletions
| diff --git a/Documentation/00-INDEX b/Documentation/00-INDEX index 5b5aba404aac..73060819ed99 100644 --- a/Documentation/00-INDEX +++ b/Documentation/00-INDEX | |||
| @@ -251,8 +251,6 @@ mono.txt | |||
| 251 | - how to execute Mono-based .NET binaries with the help of BINFMT_MISC. | 251 | - how to execute Mono-based .NET binaries with the help of BINFMT_MISC. | 
| 252 | moxa-smartio | 252 | moxa-smartio | 
| 253 | - file with info on installing/using Moxa multiport serial driver. | 253 | - file with info on installing/using Moxa multiport serial driver. | 
| 254 | mtrr.txt | ||
| 255 | - how to use PPro Memory Type Range Registers to increase performance. | ||
| 256 | mutex-design.txt | 254 | mutex-design.txt | 
| 257 | - info on the generic mutex subsystem. | 255 | - info on the generic mutex subsystem. | 
| 258 | namespaces/ | 256 | namespaces/ | 
| diff --git a/Documentation/HOWTO b/Documentation/HOWTO index c2371c5a98f9..48a3955f05fc 100644 --- a/Documentation/HOWTO +++ b/Documentation/HOWTO | |||
| @@ -77,7 +77,8 @@ documentation files are also added which explain how to use the feature. | |||
| 77 | When a kernel change causes the interface that the kernel exposes to | 77 | When a kernel change causes the interface that the kernel exposes to | 
| 78 | userspace to change, it is recommended that you send the information or | 78 | userspace to change, it is recommended that you send the information or | 
| 79 | a patch to the manual pages explaining the change to the manual pages | 79 | a patch to the manual pages explaining the change to the manual pages | 
| 80 | maintainer at mtk.manpages@gmail.com. | 80 | maintainer at mtk.manpages@gmail.com, and CC the list | 
| 81 | linux-api@vger.kernel.org. | ||
| 81 | 82 | ||
| 82 | Here is a list of files that are in the kernel source tree that are | 83 | Here is a list of files that are in the kernel source tree that are | 
| 83 | required reading: | 84 | required reading: | 
| diff --git a/Documentation/SubmitChecklist b/Documentation/SubmitChecklist index da10e0714241..21f0795af20f 100644 --- a/Documentation/SubmitChecklist +++ b/Documentation/SubmitChecklist | |||
| @@ -67,6 +67,8 @@ kernel patches. | |||
| 67 | 67 | ||
| 68 | 19: All new userspace interfaces are documented in Documentation/ABI/. | 68 | 19: All new userspace interfaces are documented in Documentation/ABI/. | 
| 69 | See Documentation/ABI/README for more information. | 69 | See Documentation/ABI/README for more information. | 
| 70 | Patches that change userspace interfaces should be CCed to | ||
| 71 | linux-api@vger.kernel.org. | ||
| 70 | 72 | ||
| 71 | 20: Check that it all passes `make headers_check'. | 73 | 20: Check that it all passes `make headers_check'. | 
| 72 | 74 | ||
| diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 1150444a21ab..329dcabe4c5e 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -463,12 +463,6 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 463 | Range: 0 - 8192 | 463 | Range: 0 - 8192 | 
| 464 | Default: 64 | 464 | Default: 64 | 
| 465 | 465 | ||
| 466 | disable_8254_timer | ||
| 467 | enable_8254_timer | ||
| 468 | [IA32/X86_64] Disable/Enable interrupt 0 timer routing | ||
| 469 | over the 8254 in addition to over the IO-APIC. The | ||
| 470 | kernel tries to set a sensible default. | ||
| 471 | |||
| 472 | hpet= [X86-32,HPET] option to control HPET usage | 466 | hpet= [X86-32,HPET] option to control HPET usage | 
| 473 | Format: { enable (default) | disable | force } | 467 | Format: { enable (default) | disable | force } | 
| 474 | disable: disable HPET and use PIT instead | 468 | disable: disable HPET and use PIT instead | 
| @@ -1882,6 +1876,12 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 1882 | shapers= [NET] | 1876 | shapers= [NET] | 
| 1883 | Maximal number of shapers. | 1877 | Maximal number of shapers. | 
| 1884 | 1878 | ||
| 1879 | show_msr= [x86] show boot-time MSR settings | ||
| 1880 | Format: { <integer> } | ||
| 1881 | Show boot-time (BIOS-initialized) MSR settings. | ||
| 1882 | The parameter means the number of CPUs to show, | ||
| 1883 | for example 1 means boot CPU only. | ||
| 1884 | |||
| 1885 | sim710= [SCSI,HW] | 1885 | sim710= [SCSI,HW] | 
| 1886 | See header of drivers/scsi/sim710.c. | 1886 | See header of drivers/scsi/sim710.c. | 
| 1887 | 1887 | ||
| diff --git a/Documentation/x86/00-INDEX b/Documentation/x86/00-INDEX new file mode 100644 index 000000000000..dbe3377754af --- /dev/null +++ b/Documentation/x86/00-INDEX | |||
| @@ -0,0 +1,4 @@ | |||
| 1 | 00-INDEX | ||
| 2 | - this file | ||
| 3 | mtrr.txt | ||
| 4 | - how to use x86 Memory Type Range Registers to increase performance | ||
| diff --git a/Documentation/x86/i386/boot.txt b/Documentation/x86/boot.txt index 147bfe511cdd..83c0033ee9e0 100644 --- a/Documentation/x86/i386/boot.txt +++ b/Documentation/x86/boot.txt | |||
| @@ -308,7 +308,7 @@ Protocol: 2.00+ | |||
| 308 | 308 | ||
| 309 | Field name: start_sys | 309 | Field name: start_sys | 
| 310 | Type: read | 310 | Type: read | 
| 311 | Offset/size: 0x20c/4 | 311 | Offset/size: 0x20c/2 | 
| 312 | Protocol: 2.00+ | 312 | Protocol: 2.00+ | 
| 313 | 313 | ||
| 314 | The load low segment (0x1000). Obsolete. | 314 | The load low segment (0x1000). Obsolete. | 
| diff --git a/Documentation/mtrr.txt b/Documentation/x86/mtrr.txt index c39ac395970e..cc071dc333c2 100644 --- a/Documentation/mtrr.txt +++ b/Documentation/x86/mtrr.txt | |||
| @@ -18,7 +18,7 @@ Richard Gooch | |||
| 18 | The AMD K6-2 (stepping 8 and above) and K6-3 processors have two | 18 | The AMD K6-2 (stepping 8 and above) and K6-3 processors have two | 
| 19 | MTRRs. These are supported. The AMD Athlon family provide 8 Intel | 19 | MTRRs. These are supported. The AMD Athlon family provide 8 Intel | 
| 20 | style MTRRs. | 20 | style MTRRs. | 
| 21 | 21 | ||
| 22 | The Centaur C6 (WinChip) has 8 MCRs, allowing write-combining. These | 22 | The Centaur C6 (WinChip) has 8 MCRs, allowing write-combining. These | 
| 23 | are supported. | 23 | are supported. | 
| 24 | 24 | ||
| @@ -87,7 +87,7 @@ reg00: base=0x00000000 ( 0MB), size= 64MB: write-back, count=1 | |||
| 87 | reg01: base=0xfb000000 (4016MB), size= 16MB: write-combining, count=1 | 87 | reg01: base=0xfb000000 (4016MB), size= 16MB: write-combining, count=1 | 
| 88 | reg02: base=0xfb000000 (4016MB), size= 4kB: uncachable, count=1 | 88 | reg02: base=0xfb000000 (4016MB), size= 4kB: uncachable, count=1 | 
| 89 | 89 | ||
| 90 | Some cards (especially Voodoo Graphics boards) need this 4 kB area | 90 | Some cards (especially Voodoo Graphics boards) need this 4 kB area | 
| 91 | excluded from the beginning of the region because it is used for | 91 | excluded from the beginning of the region because it is used for | 
| 92 | registers. | 92 | registers. | 
| 93 | 93 | ||
| diff --git a/Documentation/x86/pat.txt b/Documentation/x86/pat.txt index 17965f927c15..c93ff5f4c0dd 100644 --- a/Documentation/x86/pat.txt +++ b/Documentation/x86/pat.txt | |||
| @@ -14,6 +14,10 @@ PAT allows for different types of memory attributes. The most commonly used | |||
| 14 | ones that will be supported at this time are Write-back, Uncached, | 14 | ones that will be supported at this time are Write-back, Uncached, | 
| 15 | Write-combined and Uncached Minus. | 15 | Write-combined and Uncached Minus. | 
| 16 | 16 | ||
| 17 | |||
| 18 | PAT APIs | ||
| 19 | -------- | ||
| 20 | |||
| 17 | There are many different APIs in the kernel that allows setting of memory | 21 | There are many different APIs in the kernel that allows setting of memory | 
| 18 | attributes at the page level. In order to avoid aliasing, these interfaces | 22 | attributes at the page level. In order to avoid aliasing, these interfaces | 
| 19 | should be used thoughtfully. Below is a table of interfaces available, | 23 | should be used thoughtfully. Below is a table of interfaces available, | 
| @@ -26,38 +30,38 @@ address range to avoid any aliasing. | |||
| 26 | API | RAM | ACPI,... | Reserved/Holes | | 30 | API | RAM | ACPI,... | Reserved/Holes | | 
| 27 | -----------------------|----------|------------|------------------| | 31 | -----------------------|----------|------------|------------------| | 
| 28 | | | | | | 32 | | | | | | 
| 29 | ioremap | -- | UC | UC | | 33 | ioremap | -- | UC- | UC- | | 
| 30 | | | | | | 34 | | | | | | 
| 31 | ioremap_cache | -- | WB | WB | | 35 | ioremap_cache | -- | WB | WB | | 
| 32 | | | | | | 36 | | | | | | 
| 33 | ioremap_nocache | -- | UC | UC | | 37 | ioremap_nocache | -- | UC- | UC- | | 
| 34 | | | | | | 38 | | | | | | 
| 35 | ioremap_wc | -- | -- | WC | | 39 | ioremap_wc | -- | -- | WC | | 
| 36 | | | | | | 40 | | | | | | 
| 37 | set_memory_uc | UC | -- | -- | | 41 | set_memory_uc | UC- | -- | -- | | 
| 38 | set_memory_wb | | | | | 42 | set_memory_wb | | | | | 
| 39 | | | | | | 43 | | | | | | 
| 40 | set_memory_wc | WC | -- | -- | | 44 | set_memory_wc | WC | -- | -- | | 
| 41 | set_memory_wb | | | | | 45 | set_memory_wb | | | | | 
| 42 | | | | | | 46 | | | | | | 
| 43 | pci sysfs resource | -- | -- | UC | | 47 | pci sysfs resource | -- | -- | UC- | | 
| 44 | | | | | | 48 | | | | | | 
| 45 | pci sysfs resource_wc | -- | -- | WC | | 49 | pci sysfs resource_wc | -- | -- | WC | | 
| 46 | is IORESOURCE_PREFETCH| | | | | 50 | is IORESOURCE_PREFETCH| | | | | 
| 47 | | | | | | 51 | | | | | | 
| 48 | pci proc | -- | -- | UC | | 52 | pci proc | -- | -- | UC- | | 
| 49 | !PCIIOC_WRITE_COMBINE | | | | | 53 | !PCIIOC_WRITE_COMBINE | | | | | 
| 50 | | | | | | 54 | | | | | | 
| 51 | pci proc | -- | -- | WC | | 55 | pci proc | -- | -- | WC | | 
| 52 | PCIIOC_WRITE_COMBINE | | | | | 56 | PCIIOC_WRITE_COMBINE | | | | | 
| 53 | | | | | | 57 | | | | | | 
| 54 | /dev/mem | -- | UC | UC | | 58 | /dev/mem | -- | WB/WC/UC- | WB/WC/UC- | | 
| 55 | read-write | | | | | 59 | read-write | | | | | 
| 56 | | | | | | 60 | | | | | | 
| 57 | /dev/mem | -- | UC | UC | | 61 | /dev/mem | -- | UC- | UC- | | 
| 58 | mmap SYNC flag | | | | | 62 | mmap SYNC flag | | | | | 
| 59 | | | | | | 63 | | | | | | 
| 60 | /dev/mem | -- | WB/WC/UC | WB/WC/UC | | 64 | /dev/mem | -- | WB/WC/UC- | WB/WC/UC- | | 
| 61 | mmap !SYNC flag | |(from exist-| (from exist- | | 65 | mmap !SYNC flag | |(from exist-| (from exist- | | 
| 62 | and | | ing alias)| ing alias) | | 66 | and | | ing alias)| ing alias) | | 
| 63 | any alias to this area| | | | | 67 | any alias to this area| | | | | 
| @@ -68,7 +72,7 @@ pci proc | -- | -- | WC | | |||
| 68 | and | | | | | 72 | and | | | | | 
| 69 | MTRR says WB | | | | | 73 | MTRR says WB | | | | | 
| 70 | | | | | | 74 | | | | | | 
| 71 | /dev/mem | -- | -- | UC_MINUS | | 75 | /dev/mem | -- | -- | UC- | | 
| 72 | mmap !SYNC flag | | | | | 76 | mmap !SYNC flag | | | | | 
| 73 | no alias to this area | | | | | 77 | no alias to this area | | | | | 
| 74 | and | | | | | 78 | and | | | | | 
| @@ -98,3 +102,35 @@ types. | |||
| 98 | 102 | ||
| 99 | Drivers should use set_memory_[uc|wc] to set access type for RAM ranges. | 103 | Drivers should use set_memory_[uc|wc] to set access type for RAM ranges. | 
| 100 | 104 | ||
| 105 | |||
| 106 | PAT debugging | ||
| 107 | ------------- | ||
| 108 | |||
| 109 | With CONFIG_DEBUG_FS enabled, PAT memtype list can be examined by | ||
| 110 | |||
| 111 | # mount -t debugfs debugfs /sys/kernel/debug | ||
| 112 | # cat /sys/kernel/debug/x86/pat_memtype_list | ||
| 113 | PAT memtype list: | ||
| 114 | uncached-minus @ 0x7fadf000-0x7fae0000 | ||
| 115 | uncached-minus @ 0x7fb19000-0x7fb1a000 | ||
| 116 | uncached-minus @ 0x7fb1a000-0x7fb1b000 | ||
| 117 | uncached-minus @ 0x7fb1b000-0x7fb1c000 | ||
| 118 | uncached-minus @ 0x7fb1c000-0x7fb1d000 | ||
| 119 | uncached-minus @ 0x7fb1d000-0x7fb1e000 | ||
| 120 | uncached-minus @ 0x7fb1e000-0x7fb25000 | ||
| 121 | uncached-minus @ 0x7fb25000-0x7fb26000 | ||
| 122 | uncached-minus @ 0x7fb26000-0x7fb27000 | ||
| 123 | uncached-minus @ 0x7fb27000-0x7fb28000 | ||
| 124 | uncached-minus @ 0x7fb28000-0x7fb2e000 | ||
| 125 | uncached-minus @ 0x7fb2e000-0x7fb2f000 | ||
| 126 | uncached-minus @ 0x7fb2f000-0x7fb30000 | ||
| 127 | uncached-minus @ 0x7fb31000-0x7fb32000 | ||
| 128 | uncached-minus @ 0x80000000-0x90000000 | ||
| 129 | |||
| 130 | This list shows physical address ranges and various PAT settings used to | ||
| 131 | access those physical address ranges. | ||
| 132 | |||
| 133 | Another, more verbose way of getting PAT related debug messages is with | ||
| 134 | "debugpat" boot parameter. With this parameter, various debug messages are | ||
| 135 | printed to dmesg log. | ||
| 136 | |||
| diff --git a/Documentation/x86/i386/usb-legacy-support.txt b/Documentation/x86/usb-legacy-support.txt index 1894cdfc69d9..1894cdfc69d9 100644 --- a/Documentation/x86/i386/usb-legacy-support.txt +++ b/Documentation/x86/usb-legacy-support.txt | |||
| diff --git a/Documentation/x86/x86_64/boot-options.txt b/Documentation/x86/x86_64/boot-options.txt index b0c7b6c4abda..72ffb5373ec7 100644 --- a/Documentation/x86/x86_64/boot-options.txt +++ b/Documentation/x86/x86_64/boot-options.txt | |||
| @@ -54,10 +54,6 @@ APICs | |||
| 54 | apicmaintimer. Useful when your PIT timer is totally | 54 | apicmaintimer. Useful when your PIT timer is totally | 
| 55 | broken. | 55 | broken. | 
| 56 | 56 | ||
| 57 | disable_8254_timer / enable_8254_timer | ||
| 58 | Enable interrupt 0 timer routing over the 8254 in addition to over | ||
| 59 | the IO-APIC. The kernel tries to set a sensible default. | ||
| 60 | |||
| 61 | Early Console | 57 | Early Console | 
| 62 | 58 | ||
| 63 | syntax: earlyprintk=vga | 59 | syntax: earlyprintk=vga | 
| diff --git a/Documentation/x86/i386/zero-page.txt b/Documentation/x86/zero-page.txt index 169ad423a3d1..169ad423a3d1 100644 --- a/Documentation/x86/i386/zero-page.txt +++ b/Documentation/x86/zero-page.txt | |||
| diff --git a/MAINTAINERS b/MAINTAINERS index 3596d1782264..8dae4555f10e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -1198,9 +1198,7 @@ M: hpa@zytor.com | |||
| 1198 | S: Maintained | 1198 | S: Maintained | 
| 1199 | 1199 | ||
| 1200 | CPUSETS | 1200 | CPUSETS | 
| 1201 | P: Paul Jackson | ||
| 1202 | P: Paul Menage | 1201 | P: Paul Menage | 
| 1203 | M: pj@sgi.com | ||
| 1204 | M: menage@google.com | 1202 | M: menage@google.com | 
| 1205 | L: linux-kernel@vger.kernel.org | 1203 | L: linux-kernel@vger.kernel.org | 
| 1206 | W: http://www.bullopensource.org/cpuset/ | 1204 | W: http://www.bullopensource.org/cpuset/ | 
| @@ -2706,6 +2704,7 @@ MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7 | |||
| 2706 | P: Michael Kerrisk | 2704 | P: Michael Kerrisk | 
| 2707 | M: mtk.manpages@gmail.com | 2705 | M: mtk.manpages@gmail.com | 
| 2708 | W: http://www.kernel.org/doc/man-pages | 2706 | W: http://www.kernel.org/doc/man-pages | 
| 2707 | L: linux-man@vger.kernel.org | ||
| 2709 | S: Supported | 2708 | S: Supported | 
| 2710 | 2709 | ||
| 2711 | MARVELL LIBERTAS WIRELESS DRIVER | 2710 | MARVELL LIBERTAS WIRELESS DRIVER | 
| diff --git a/arch/ia64/include/asm/sections.h b/arch/ia64/include/asm/sections.h index f66799891036..1a873b36a4a1 100644 --- a/arch/ia64/include/asm/sections.h +++ b/arch/ia64/include/asm/sections.h | |||
| @@ -11,6 +11,9 @@ | |||
| 11 | #include <asm-generic/sections.h> | 11 | #include <asm-generic/sections.h> | 
| 12 | 12 | ||
| 13 | extern char __per_cpu_start[], __per_cpu_end[], __phys_per_cpu_start[]; | 13 | extern char __per_cpu_start[], __per_cpu_end[], __phys_per_cpu_start[]; | 
| 14 | #ifdef CONFIG_SMP | ||
| 15 | extern char __cpu0_per_cpu[]; | ||
| 16 | #endif | ||
| 14 | extern char __start___vtop_patchlist[], __end___vtop_patchlist[]; | 17 | extern char __start___vtop_patchlist[], __end___vtop_patchlist[]; | 
| 15 | extern char __start___rse_patchlist[], __end___rse_patchlist[]; | 18 | extern char __start___rse_patchlist[], __end___rse_patchlist[]; | 
| 16 | extern char __start___mckinley_e9_bundles[], __end___mckinley_e9_bundles[]; | 19 | extern char __start___mckinley_e9_bundles[], __end___mckinley_e9_bundles[]; | 
| diff --git a/arch/ia64/kernel/head.S b/arch/ia64/kernel/head.S index 8bdea8eb62e3..66e491d8baac 100644 --- a/arch/ia64/kernel/head.S +++ b/arch/ia64/kernel/head.S | |||
| @@ -367,16 +367,17 @@ start_ap: | |||
| 367 | ;; | 367 | ;; | 
| 368 | #else | 368 | #else | 
| 369 | (isAP) br.few 2f | 369 | (isAP) br.few 2f | 
| 370 | mov r20=r19 | 370 | movl r20=__cpu0_per_cpu | 
| 371 | sub r19=r19,r18 | ||
| 372 | ;; | 371 | ;; | 
| 373 | shr.u r18=r18,3 | 372 | shr.u r18=r18,3 | 
| 374 | 1: | 373 | 1: | 
| 375 | ld8 r21=[r20],8;; | 374 | ld8 r21=[r19],8;; | 
| 376 | st8[r19]=r21,8 | 375 | st8[r20]=r21,8 | 
| 377 | adds r18=-1,r18;; | 376 | adds r18=-1,r18;; | 
| 378 | cmp4.lt p7,p6=0,r18 | 377 | cmp4.lt p7,p6=0,r18 | 
| 379 | (p7) br.cond.dptk.few 1b | 378 | (p7) br.cond.dptk.few 1b | 
| 379 | mov r19=r20 | ||
| 380 | ;; | ||
| 380 | 2: | 381 | 2: | 
| 381 | #endif | 382 | #endif | 
| 382 | tpa r19=r19 | 383 | tpa r19=r19 | 
| diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S index de71da811cd6..10a7d47e8510 100644 --- a/arch/ia64/kernel/vmlinux.lds.S +++ b/arch/ia64/kernel/vmlinux.lds.S | |||
| @@ -215,9 +215,6 @@ SECTIONS | |||
| 215 | /* Per-cpu data: */ | 215 | /* Per-cpu data: */ | 
| 216 | percpu : { } :percpu | 216 | percpu : { } :percpu | 
| 217 | . = ALIGN(PERCPU_PAGE_SIZE); | 217 | . = ALIGN(PERCPU_PAGE_SIZE); | 
| 218 | #ifdef CONFIG_SMP | ||
| 219 | . = . + PERCPU_PAGE_SIZE; /* cpu0 per-cpu space */ | ||
| 220 | #endif | ||
| 221 | __phys_per_cpu_start = .; | 218 | __phys_per_cpu_start = .; | 
| 222 | .data.percpu PERCPU_ADDR : AT(__phys_per_cpu_start - LOAD_OFFSET) | 219 | .data.percpu PERCPU_ADDR : AT(__phys_per_cpu_start - LOAD_OFFSET) | 
| 223 | { | 220 | { | 
| @@ -233,6 +230,11 @@ SECTIONS | |||
| 233 | data : { } :data | 230 | data : { } :data | 
| 234 | .data : AT(ADDR(.data) - LOAD_OFFSET) | 231 | .data : AT(ADDR(.data) - LOAD_OFFSET) | 
| 235 | { | 232 | { | 
| 233 | #ifdef CONFIG_SMP | ||
| 234 | . = ALIGN(PERCPU_PAGE_SIZE); | ||
| 235 | __cpu0_per_cpu = .; | ||
| 236 | . = . + PERCPU_PAGE_SIZE; /* cpu0 per-cpu space */ | ||
| 237 | #endif | ||
| 236 | DATA_DATA | 238 | DATA_DATA | 
| 237 | *(.data1) | 239 | *(.data1) | 
| 238 | *(.gnu.linkonce.d*) | 240 | *(.gnu.linkonce.d*) | 
| diff --git a/arch/ia64/mm/contig.c b/arch/ia64/mm/contig.c index e566ff43884a..0ee085efbe29 100644 --- a/arch/ia64/mm/contig.c +++ b/arch/ia64/mm/contig.c | |||
| @@ -163,7 +163,7 @@ per_cpu_init (void) | |||
| 163 | * get_zeroed_page(). | 163 | * get_zeroed_page(). | 
| 164 | */ | 164 | */ | 
| 165 | if (first_time) { | 165 | if (first_time) { | 
| 166 | void *cpu0_data = __phys_per_cpu_start - PERCPU_PAGE_SIZE; | 166 | void *cpu0_data = __cpu0_per_cpu; | 
| 167 | 167 | ||
| 168 | first_time=0; | 168 | first_time=0; | 
| 169 | 169 | ||
| diff --git a/arch/ia64/mm/discontig.c b/arch/ia64/mm/discontig.c index 78026aabaa7f..d8c5fcd89e5b 100644 --- a/arch/ia64/mm/discontig.c +++ b/arch/ia64/mm/discontig.c | |||
| @@ -144,7 +144,7 @@ static void *per_cpu_node_setup(void *cpu_data, int node) | |||
| 144 | 144 | ||
| 145 | for_each_possible_early_cpu(cpu) { | 145 | for_each_possible_early_cpu(cpu) { | 
| 146 | if (cpu == 0) { | 146 | if (cpu == 0) { | 
| 147 | void *cpu0_data = __phys_per_cpu_start - PERCPU_PAGE_SIZE; | 147 | void *cpu0_data = __cpu0_per_cpu; | 
| 148 | __per_cpu_offset[cpu] = (char*)cpu0_data - | 148 | __per_cpu_offset[cpu] = (char*)cpu0_data - | 
| 149 | __per_cpu_start; | 149 | __per_cpu_start; | 
| 150 | } else if (node == node_cpuid[cpu].nid) { | 150 | } else if (node == node_cpuid[cpu].nid) { | 
| diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 49896a2a1d72..c930b8ceb418 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -1403,7 +1403,6 @@ config MIPS_MT_SMTC | |||
| 1403 | depends on CPU_MIPS32_R2 | 1403 | depends on CPU_MIPS32_R2 | 
| 1404 | #depends on CPU_MIPS64_R2 # once there is hardware ... | 1404 | #depends on CPU_MIPS64_R2 # once there is hardware ... | 
| 1405 | depends on SYS_SUPPORTS_MULTITHREADING | 1405 | depends on SYS_SUPPORTS_MULTITHREADING | 
| 1406 | select GENERIC_CLOCKEVENTS_BROADCAST | ||
| 1407 | select CPU_MIPSR2_IRQ_VI | 1406 | select CPU_MIPSR2_IRQ_VI | 
| 1408 | select CPU_MIPSR2_IRQ_EI | 1407 | select CPU_MIPSR2_IRQ_EI | 
| 1409 | select MIPS_MT | 1408 | select MIPS_MT | 
| @@ -1451,32 +1450,17 @@ config MIPS_VPE_LOADER | |||
| 1451 | Includes a loader for loading an elf relocatable object | 1450 | Includes a loader for loading an elf relocatable object | 
| 1452 | onto another VPE and running it. | 1451 | onto another VPE and running it. | 
| 1453 | 1452 | ||
| 1454 | config MIPS_MT_SMTC_INSTANT_REPLAY | ||
| 1455 | bool "Low-latency Dispatch of Deferred SMTC IPIs" | ||
| 1456 | depends on MIPS_MT_SMTC && !PREEMPT | ||
| 1457 | default y | ||
| 1458 | help | ||
| 1459 | SMTC pseudo-interrupts between TCs are deferred and queued | ||
| 1460 | if the target TC is interrupt-inhibited (IXMT). In the first | ||
| 1461 | SMTC prototypes, these queued IPIs were serviced on return | ||
| 1462 | to user mode, or on entry into the kernel idle loop. The | ||
| 1463 | INSTANT_REPLAY option dispatches them as part of local_irq_restore() | ||
| 1464 | processing, which adds runtime overhead (hence the option to turn | ||
| 1465 | it off), but ensures that IPIs are handled promptly even under | ||
| 1466 | heavy I/O interrupt load. | ||
| 1467 | |||
| 1468 | config MIPS_MT_SMTC_IM_BACKSTOP | 1453 | config MIPS_MT_SMTC_IM_BACKSTOP | 
| 1469 | bool "Use per-TC register bits as backstop for inhibited IM bits" | 1454 | bool "Use per-TC register bits as backstop for inhibited IM bits" | 
| 1470 | depends on MIPS_MT_SMTC | 1455 | depends on MIPS_MT_SMTC | 
| 1471 | default y | 1456 | default n | 
| 1472 | help | 1457 | help | 
| 1473 | To support multiple TC microthreads acting as "CPUs" within | 1458 | To support multiple TC microthreads acting as "CPUs" within | 
| 1474 | a VPE, VPE-wide interrupt mask bits must be specially manipulated | 1459 | a VPE, VPE-wide interrupt mask bits must be specially manipulated | 
| 1475 | during interrupt handling. To support legacy drivers and interrupt | 1460 | during interrupt handling. To support legacy drivers and interrupt | 
| 1476 | controller management code, SMTC has a "backstop" to track and | 1461 | controller management code, SMTC has a "backstop" to track and | 
| 1477 | if necessary restore the interrupt mask. This has some performance | 1462 | if necessary restore the interrupt mask. This has some performance | 
| 1478 | impact on interrupt service overhead. Disable it only if you know | 1463 | impact on interrupt service overhead. | 
| 1479 | what you are doing. | ||
| 1480 | 1464 | ||
| 1481 | config MIPS_MT_SMTC_IRQAFF | 1465 | config MIPS_MT_SMTC_IRQAFF | 
| 1482 | bool "Support IRQ affinity API" | 1466 | bool "Support IRQ affinity API" | 
| @@ -1486,10 +1470,8 @@ config MIPS_MT_SMTC_IRQAFF | |||
| 1486 | Enables SMP IRQ affinity API (/proc/irq/*/smp_affinity, etc.) | 1470 | Enables SMP IRQ affinity API (/proc/irq/*/smp_affinity, etc.) | 
| 1487 | for SMTC Linux kernel. Requires platform support, of which | 1471 | for SMTC Linux kernel. Requires platform support, of which | 
| 1488 | an example can be found in the MIPS kernel i8259 and Malta | 1472 | an example can be found in the MIPS kernel i8259 and Malta | 
| 1489 | platform code. It is recommended that MIPS_MT_SMTC_INSTANT_REPLAY | 1473 | platform code. Adds some overhead to interrupt dispatch, and | 
| 1490 | be enabled if MIPS_MT_SMTC_IRQAFF is used. Adds overhead to | 1474 | should be used only if you know what you are doing. | 
| 1491 | interrupt dispatch, and should be used only if you know what | ||
| 1492 | you are doing. | ||
| 1493 | 1475 | ||
| 1494 | config MIPS_VPE_LOADER_TOM | 1476 | config MIPS_VPE_LOADER_TOM | 
| 1495 | bool "Load VPE program into memory hidden from linux" | 1477 | bool "Load VPE program into memory hidden from linux" | 
| diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index 706f93974797..25775cb54000 100644 --- a/arch/mips/kernel/Makefile +++ b/arch/mips/kernel/Makefile | |||
| @@ -10,6 +10,7 @@ obj-y += cpu-probe.o branch.o entry.o genex.o irq.o process.o \ | |||
| 10 | 10 | ||
| 11 | obj-$(CONFIG_CEVT_BCM1480) += cevt-bcm1480.o | 11 | obj-$(CONFIG_CEVT_BCM1480) += cevt-bcm1480.o | 
| 12 | obj-$(CONFIG_CEVT_R4K) += cevt-r4k.o | 12 | obj-$(CONFIG_CEVT_R4K) += cevt-r4k.o | 
| 13 | obj-$(CONFIG_MIPS_MT_SMTC) += cevt-smtc.o | ||
| 13 | obj-$(CONFIG_CEVT_DS1287) += cevt-ds1287.o | 14 | obj-$(CONFIG_CEVT_DS1287) += cevt-ds1287.o | 
| 14 | obj-$(CONFIG_CEVT_GT641XX) += cevt-gt641xx.o | 15 | obj-$(CONFIG_CEVT_GT641XX) += cevt-gt641xx.o | 
| 15 | obj-$(CONFIG_CEVT_SB1250) += cevt-sb1250.o | 16 | obj-$(CONFIG_CEVT_SB1250) += cevt-sb1250.o | 
| diff --git a/arch/mips/kernel/cevt-r4k.c b/arch/mips/kernel/cevt-r4k.c index 24a2d907aa0d..4a4c59f2737a 100644 --- a/arch/mips/kernel/cevt-r4k.c +++ b/arch/mips/kernel/cevt-r4k.c | |||
| @@ -12,6 +12,14 @@ | |||
| 12 | 12 | ||
| 13 | #include <asm/smtc_ipi.h> | 13 | #include <asm/smtc_ipi.h> | 
| 14 | #include <asm/time.h> | 14 | #include <asm/time.h> | 
| 15 | #include <asm/cevt-r4k.h> | ||
| 16 | |||
| 17 | /* | ||
| 18 | * The SMTC Kernel for the 34K, 1004K, et. al. replaces several | ||
| 19 | * of these routines with SMTC-specific variants. | ||
| 20 | */ | ||
| 21 | |||
| 22 | #ifndef CONFIG_MIPS_MT_SMTC | ||
| 15 | 23 | ||
| 16 | static int mips_next_event(unsigned long delta, | 24 | static int mips_next_event(unsigned long delta, | 
| 17 | struct clock_event_device *evt) | 25 | struct clock_event_device *evt) | 
| @@ -19,60 +27,27 @@ static int mips_next_event(unsigned long delta, | |||
| 19 | unsigned int cnt; | 27 | unsigned int cnt; | 
| 20 | int res; | 28 | int res; | 
| 21 | 29 | ||
| 22 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 23 | { | ||
| 24 | unsigned long flags, vpflags; | ||
| 25 | local_irq_save(flags); | ||
| 26 | vpflags = dvpe(); | ||
| 27 | #endif | ||
| 28 | cnt = read_c0_count(); | 30 | cnt = read_c0_count(); | 
| 29 | cnt += delta; | 31 | cnt += delta; | 
| 30 | write_c0_compare(cnt); | 32 | write_c0_compare(cnt); | 
| 31 | res = ((int)(read_c0_count() - cnt) > 0) ? -ETIME : 0; | 33 | res = ((int)(read_c0_count() - cnt) > 0) ? -ETIME : 0; | 
| 32 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 33 | evpe(vpflags); | ||
| 34 | local_irq_restore(flags); | ||
| 35 | } | ||
| 36 | #endif | ||
| 37 | return res; | 34 | return res; | 
| 38 | } | 35 | } | 
| 39 | 36 | ||
| 40 | static void mips_set_mode(enum clock_event_mode mode, | 37 | #endif /* CONFIG_MIPS_MT_SMTC */ | 
| 41 | struct clock_event_device *evt) | 38 | |
| 39 | void mips_set_clock_mode(enum clock_event_mode mode, | ||
| 40 | struct clock_event_device *evt) | ||
| 42 | { | 41 | { | 
| 43 | /* Nothing to do ... */ | 42 | /* Nothing to do ... */ | 
| 44 | } | 43 | } | 
| 45 | 44 | ||
| 46 | static DEFINE_PER_CPU(struct clock_event_device, mips_clockevent_device); | 45 | DEFINE_PER_CPU(struct clock_event_device, mips_clockevent_device); | 
| 47 | static int cp0_timer_irq_installed; | 46 | int cp0_timer_irq_installed; | 
| 48 | 47 | ||
| 49 | /* | 48 | #ifndef CONFIG_MIPS_MT_SMTC | 
| 50 | * Timer ack for an R4k-compatible timer of a known frequency. | ||
| 51 | */ | ||
| 52 | static void c0_timer_ack(void) | ||
| 53 | { | ||
| 54 | write_c0_compare(read_c0_compare()); | ||
| 55 | } | ||
| 56 | 49 | ||
| 57 | /* | 50 | irqreturn_t c0_compare_interrupt(int irq, void *dev_id) | 
| 58 | * Possibly handle a performance counter interrupt. | ||
| 59 | * Return true if the timer interrupt should not be checked | ||
| 60 | */ | ||
| 61 | static inline int handle_perf_irq(int r2) | ||
| 62 | { | ||
| 63 | /* | ||
| 64 | * The performance counter overflow interrupt may be shared with the | ||
| 65 | * timer interrupt (cp0_perfcount_irq < 0). If it is and a | ||
| 66 | * performance counter has overflowed (perf_irq() == IRQ_HANDLED) | ||
| 67 | * and we can't reliably determine if a counter interrupt has also | ||
| 68 | * happened (!r2) then don't check for a timer interrupt. | ||
| 69 | */ | ||
| 70 | return (cp0_perfcount_irq < 0) && | ||
| 71 | perf_irq() == IRQ_HANDLED && | ||
| 72 | !r2; | ||
| 73 | } | ||
| 74 | |||
| 75 | static irqreturn_t c0_compare_interrupt(int irq, void *dev_id) | ||
| 76 | { | 51 | { | 
| 77 | const int r2 = cpu_has_mips_r2; | 52 | const int r2 = cpu_has_mips_r2; | 
| 78 | struct clock_event_device *cd; | 53 | struct clock_event_device *cd; | 
| @@ -93,12 +68,8 @@ static irqreturn_t c0_compare_interrupt(int irq, void *dev_id) | |||
| 93 | * interrupt. Being the paranoiacs we are we check anyway. | 68 | * interrupt. Being the paranoiacs we are we check anyway. | 
| 94 | */ | 69 | */ | 
| 95 | if (!r2 || (read_c0_cause() & (1 << 30))) { | 70 | if (!r2 || (read_c0_cause() & (1 << 30))) { | 
| 96 | c0_timer_ack(); | 71 | /* Clear Count/Compare Interrupt */ | 
| 97 | #ifdef CONFIG_MIPS_MT_SMTC | 72 | write_c0_compare(read_c0_compare()); | 
| 98 | if (cpu_data[cpu].vpe_id) | ||
| 99 | goto out; | ||
| 100 | cpu = 0; | ||
| 101 | #endif | ||
| 102 | cd = &per_cpu(mips_clockevent_device, cpu); | 73 | cd = &per_cpu(mips_clockevent_device, cpu); | 
| 103 | cd->event_handler(cd); | 74 | cd->event_handler(cd); | 
| 104 | } | 75 | } | 
| @@ -107,65 +78,16 @@ out: | |||
| 107 | return IRQ_HANDLED; | 78 | return IRQ_HANDLED; | 
| 108 | } | 79 | } | 
| 109 | 80 | ||
| 110 | static struct irqaction c0_compare_irqaction = { | 81 | #endif /* Not CONFIG_MIPS_MT_SMTC */ | 
| 82 | |||
| 83 | struct irqaction c0_compare_irqaction = { | ||
| 111 | .handler = c0_compare_interrupt, | 84 | .handler = c0_compare_interrupt, | 
| 112 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 113 | .flags = IRQF_DISABLED, | ||
| 114 | #else | ||
| 115 | .flags = IRQF_DISABLED | IRQF_PERCPU, | 85 | .flags = IRQF_DISABLED | IRQF_PERCPU, | 
| 116 | #endif | ||
| 117 | .name = "timer", | 86 | .name = "timer", | 
| 118 | }; | 87 | }; | 
| 119 | 88 | ||
| 120 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 121 | DEFINE_PER_CPU(struct clock_event_device, smtc_dummy_clockevent_device); | ||
| 122 | |||
| 123 | static void smtc_set_mode(enum clock_event_mode mode, | ||
| 124 | struct clock_event_device *evt) | ||
| 125 | { | ||
| 126 | } | ||
| 127 | |||
| 128 | static void mips_broadcast(cpumask_t mask) | ||
| 129 | { | ||
| 130 | unsigned int cpu; | ||
| 131 | |||
| 132 | for_each_cpu_mask(cpu, mask) | ||
| 133 | smtc_send_ipi(cpu, SMTC_CLOCK_TICK, 0); | ||
| 134 | } | ||
| 135 | |||
| 136 | static void setup_smtc_dummy_clockevent_device(void) | ||
| 137 | { | ||
| 138 | //uint64_t mips_freq = mips_hpt_^frequency; | ||
| 139 | unsigned int cpu = smp_processor_id(); | ||
| 140 | struct clock_event_device *cd; | ||
| 141 | 89 | ||
| 142 | cd = &per_cpu(smtc_dummy_clockevent_device, cpu); | 90 | void mips_event_handler(struct clock_event_device *dev) | 
| 143 | |||
| 144 | cd->name = "SMTC"; | ||
| 145 | cd->features = CLOCK_EVT_FEAT_DUMMY; | ||
| 146 | |||
| 147 | /* Calculate the min / max delta */ | ||
| 148 | cd->mult = 0; //div_sc((unsigned long) mips_freq, NSEC_PER_SEC, 32); | ||
| 149 | cd->shift = 0; //32; | ||
| 150 | cd->max_delta_ns = 0; //clockevent_delta2ns(0x7fffffff, cd); | ||
| 151 | cd->min_delta_ns = 0; //clockevent_delta2ns(0x30, cd); | ||
| 152 | |||
| 153 | cd->rating = 200; | ||
| 154 | cd->irq = 17; //-1; | ||
| 155 | // if (cpu) | ||
| 156 | // cd->cpumask = CPU_MASK_ALL; // cpumask_of_cpu(cpu); | ||
| 157 | // else | ||
| 158 | cd->cpumask = cpumask_of_cpu(cpu); | ||
| 159 | |||
| 160 | cd->set_mode = smtc_set_mode; | ||
| 161 | |||
| 162 | cd->broadcast = mips_broadcast; | ||
| 163 | |||
| 164 | clockevents_register_device(cd); | ||
| 165 | } | ||
| 166 | #endif | ||
| 167 | |||
| 168 | static void mips_event_handler(struct clock_event_device *dev) | ||
| 169 | { | 91 | { | 
| 170 | } | 92 | } | 
| 171 | 93 | ||
| @@ -177,7 +99,23 @@ static int c0_compare_int_pending(void) | |||
| 177 | return (read_c0_cause() >> cp0_compare_irq) & 0x100; | 99 | return (read_c0_cause() >> cp0_compare_irq) & 0x100; | 
| 178 | } | 100 | } | 
| 179 | 101 | ||
| 180 | static int c0_compare_int_usable(void) | 102 | /* | 
| 103 | * Compare interrupt can be routed and latched outside the core, | ||
| 104 | * so a single execution hazard barrier may not be enough to give | ||
| 105 | * it time to clear as seen in the Cause register. 4 time the | ||
| 106 | * pipeline depth seems reasonably conservative, and empirically | ||
| 107 | * works better in configurations with high CPU/bus clock ratios. | ||
| 108 | */ | ||
| 109 | |||
| 110 | #define compare_change_hazard() \ | ||
| 111 | do { \ | ||
| 112 | irq_disable_hazard(); \ | ||
| 113 | irq_disable_hazard(); \ | ||
| 114 | irq_disable_hazard(); \ | ||
| 115 | irq_disable_hazard(); \ | ||
| 116 | } while (0) | ||
| 117 | |||
| 118 | int c0_compare_int_usable(void) | ||
| 181 | { | 119 | { | 
| 182 | unsigned int delta; | 120 | unsigned int delta; | 
| 183 | unsigned int cnt; | 121 | unsigned int cnt; | 
| @@ -187,7 +125,7 @@ static int c0_compare_int_usable(void) | |||
| 187 | */ | 125 | */ | 
| 188 | if (c0_compare_int_pending()) { | 126 | if (c0_compare_int_pending()) { | 
| 189 | write_c0_compare(read_c0_count()); | 127 | write_c0_compare(read_c0_count()); | 
| 190 | irq_disable_hazard(); | 128 | compare_change_hazard(); | 
| 191 | if (c0_compare_int_pending()) | 129 | if (c0_compare_int_pending()) | 
| 192 | return 0; | 130 | return 0; | 
| 193 | } | 131 | } | 
| @@ -196,7 +134,7 @@ static int c0_compare_int_usable(void) | |||
| 196 | cnt = read_c0_count(); | 134 | cnt = read_c0_count(); | 
| 197 | cnt += delta; | 135 | cnt += delta; | 
| 198 | write_c0_compare(cnt); | 136 | write_c0_compare(cnt); | 
| 199 | irq_disable_hazard(); | 137 | compare_change_hazard(); | 
| 200 | if ((int)(read_c0_count() - cnt) < 0) | 138 | if ((int)(read_c0_count() - cnt) < 0) | 
| 201 | break; | 139 | break; | 
| 202 | /* increase delta if the timer was already expired */ | 140 | /* increase delta if the timer was already expired */ | 
| @@ -205,11 +143,12 @@ static int c0_compare_int_usable(void) | |||
| 205 | while ((int)(read_c0_count() - cnt) <= 0) | 143 | while ((int)(read_c0_count() - cnt) <= 0) | 
| 206 | ; /* Wait for expiry */ | 144 | ; /* Wait for expiry */ | 
| 207 | 145 | ||
| 146 | compare_change_hazard(); | ||
| 208 | if (!c0_compare_int_pending()) | 147 | if (!c0_compare_int_pending()) | 
| 209 | return 0; | 148 | return 0; | 
| 210 | 149 | ||
| 211 | write_c0_compare(read_c0_count()); | 150 | write_c0_compare(read_c0_count()); | 
| 212 | irq_disable_hazard(); | 151 | compare_change_hazard(); | 
| 213 | if (c0_compare_int_pending()) | 152 | if (c0_compare_int_pending()) | 
| 214 | return 0; | 153 | return 0; | 
| 215 | 154 | ||
| @@ -219,6 +158,8 @@ static int c0_compare_int_usable(void) | |||
| 219 | return 1; | 158 | return 1; | 
| 220 | } | 159 | } | 
| 221 | 160 | ||
| 161 | #ifndef CONFIG_MIPS_MT_SMTC | ||
| 162 | |||
| 222 | int __cpuinit mips_clockevent_init(void) | 163 | int __cpuinit mips_clockevent_init(void) | 
| 223 | { | 164 | { | 
| 224 | uint64_t mips_freq = mips_hpt_frequency; | 165 | uint64_t mips_freq = mips_hpt_frequency; | 
| @@ -229,17 +170,6 @@ int __cpuinit mips_clockevent_init(void) | |||
| 229 | if (!cpu_has_counter || !mips_hpt_frequency) | 170 | if (!cpu_has_counter || !mips_hpt_frequency) | 
| 230 | return -ENXIO; | 171 | return -ENXIO; | 
| 231 | 172 | ||
| 232 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 233 | setup_smtc_dummy_clockevent_device(); | ||
| 234 | |||
| 235 | /* | ||
| 236 | * On SMTC we only register VPE0's compare interrupt as clockevent | ||
| 237 | * device. | ||
| 238 | */ | ||
| 239 | if (cpu) | ||
| 240 | return 0; | ||
| 241 | #endif | ||
| 242 | |||
| 243 | if (!c0_compare_int_usable()) | 173 | if (!c0_compare_int_usable()) | 
| 244 | return -ENXIO; | 174 | return -ENXIO; | 
| 245 | 175 | ||
| @@ -265,13 +195,9 @@ int __cpuinit mips_clockevent_init(void) | |||
| 265 | 195 | ||
| 266 | cd->rating = 300; | 196 | cd->rating = 300; | 
| 267 | cd->irq = irq; | 197 | cd->irq = irq; | 
| 268 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 269 | cd->cpumask = CPU_MASK_ALL; | ||
| 270 | #else | ||
| 271 | cd->cpumask = cpumask_of_cpu(cpu); | 198 | cd->cpumask = cpumask_of_cpu(cpu); | 
| 272 | #endif | ||
| 273 | cd->set_next_event = mips_next_event; | 199 | cd->set_next_event = mips_next_event; | 
| 274 | cd->set_mode = mips_set_mode; | 200 | cd->set_mode = mips_set_clock_mode; | 
| 275 | cd->event_handler = mips_event_handler; | 201 | cd->event_handler = mips_event_handler; | 
| 276 | 202 | ||
| 277 | clockevents_register_device(cd); | 203 | clockevents_register_device(cd); | 
| @@ -281,12 +207,9 @@ int __cpuinit mips_clockevent_init(void) | |||
| 281 | 207 | ||
| 282 | cp0_timer_irq_installed = 1; | 208 | cp0_timer_irq_installed = 1; | 
| 283 | 209 | ||
| 284 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 285 | #define CPUCTR_IMASKBIT (0x100 << cp0_compare_irq) | ||
| 286 | setup_irq_smtc(irq, &c0_compare_irqaction, CPUCTR_IMASKBIT); | ||
| 287 | #else | ||
| 288 | setup_irq(irq, &c0_compare_irqaction); | 210 | setup_irq(irq, &c0_compare_irqaction); | 
| 289 | #endif | ||
| 290 | 211 | ||
| 291 | return 0; | 212 | return 0; | 
| 292 | } | 213 | } | 
| 214 | |||
| 215 | #endif /* Not CONFIG_MIPS_MT_SMTC */ | ||
| diff --git a/arch/mips/kernel/cevt-smtc.c b/arch/mips/kernel/cevt-smtc.c new file mode 100644 index 000000000000..5162fe4b5952 --- /dev/null +++ b/arch/mips/kernel/cevt-smtc.c | |||
| @@ -0,0 +1,321 @@ | |||
| 1 | /* | ||
| 2 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 3 | * License. See the file "COPYING" in the main directory of this archive | ||
| 4 | * for more details. | ||
| 5 | * | ||
| 6 | * Copyright (C) 2007 MIPS Technologies, Inc. | ||
| 7 | * Copyright (C) 2007 Ralf Baechle <ralf@linux-mips.org> | ||
| 8 | * Copyright (C) 2008 Kevin D. Kissell, Paralogos sarl | ||
| 9 | */ | ||
| 10 | #include <linux/clockchips.h> | ||
| 11 | #include <linux/interrupt.h> | ||
| 12 | #include <linux/percpu.h> | ||
| 13 | |||
| 14 | #include <asm/smtc_ipi.h> | ||
| 15 | #include <asm/time.h> | ||
| 16 | #include <asm/cevt-r4k.h> | ||
| 17 | |||
| 18 | /* | ||
| 19 | * Variant clock event timer support for SMTC on MIPS 34K, 1004K | ||
| 20 | * or other MIPS MT cores. | ||
| 21 | * | ||
| 22 | * Notes on SMTC Support: | ||
| 23 | * | ||
| 24 | * SMTC has multiple microthread TCs pretending to be Linux CPUs. | ||
| 25 | * But there's only one Count/Compare pair per VPE, and Compare | ||
| 26 | * interrupts are taken opportunisitically by available TCs | ||
| 27 | * bound to the VPE with the Count register. The new timer | ||
| 28 | * framework provides for global broadcasts, but we really | ||
| 29 | * want VPE-level multicasts for best behavior. So instead | ||
| 30 | * of invoking the high-level clock-event broadcast code, | ||
| 31 | * this version of SMTC support uses the historical SMTC | ||
| 32 | * multicast mechanisms "under the hood", appearing to the | ||
| 33 | * generic clock layer as if the interrupts are per-CPU. | ||
| 34 | * | ||
| 35 | * The approach taken here is to maintain a set of NR_CPUS | ||
| 36 | * virtual timers, and track which "CPU" needs to be alerted | ||
| 37 | * at each event. | ||
| 38 | * | ||
| 39 | * It's unlikely that we'll see a MIPS MT core with more than | ||
| 40 | * 2 VPEs, but we *know* that we won't need to handle more | ||
| 41 | * VPEs than we have "CPUs". So NCPUs arrays of NCPUs elements | ||
| 42 | * is always going to be overkill, but always going to be enough. | ||
| 43 | */ | ||
| 44 | |||
| 45 | unsigned long smtc_nexttime[NR_CPUS][NR_CPUS]; | ||
| 46 | static int smtc_nextinvpe[NR_CPUS]; | ||
| 47 | |||
| 48 | /* | ||
| 49 | * Timestamps stored are absolute values to be programmed | ||
| 50 | * into Count register. Valid timestamps will never be zero. | ||
| 51 | * If a Zero Count value is actually calculated, it is converted | ||
| 52 | * to be a 1, which will introduce 1 or two CPU cycles of error | ||
| 53 | * roughly once every four billion events, which at 1000 HZ means | ||
| 54 | * about once every 50 days. If that's actually a problem, one | ||
| 55 | * could alternate squashing 0 to 1 and to -1. | ||
| 56 | */ | ||
| 57 | |||
| 58 | #define MAKEVALID(x) (((x) == 0L) ? 1L : (x)) | ||
| 59 | #define ISVALID(x) ((x) != 0L) | ||
| 60 | |||
| 61 | /* | ||
| 62 | * Time comparison is subtle, as it's really truncated | ||
| 63 | * modular arithmetic. | ||
| 64 | */ | ||
| 65 | |||
| 66 | #define IS_SOONER(a, b, reference) \ | ||
| 67 | (((a) - (unsigned long)(reference)) < ((b) - (unsigned long)(reference))) | ||
| 68 | |||
| 69 | /* | ||
| 70 | * CATCHUP_INCREMENT, used when the function falls behind the counter. | ||
| 71 | * Could be an increasing function instead of a constant; | ||
| 72 | */ | ||
| 73 | |||
| 74 | #define CATCHUP_INCREMENT 64 | ||
| 75 | |||
| 76 | static int mips_next_event(unsigned long delta, | ||
| 77 | struct clock_event_device *evt) | ||
| 78 | { | ||
| 79 | unsigned long flags; | ||
| 80 | unsigned int mtflags; | ||
| 81 | unsigned long timestamp, reference, previous; | ||
| 82 | unsigned long nextcomp = 0L; | ||
| 83 | int vpe = current_cpu_data.vpe_id; | ||
| 84 | int cpu = smp_processor_id(); | ||
| 85 | local_irq_save(flags); | ||
| 86 | mtflags = dmt(); | ||
| 87 | |||
| 88 | /* | ||
| 89 | * Maintain the per-TC virtual timer | ||
| 90 | * and program the per-VPE shared Count register | ||
| 91 | * as appropriate here... | ||
| 92 | */ | ||
| 93 | reference = (unsigned long)read_c0_count(); | ||
| 94 | timestamp = MAKEVALID(reference + delta); | ||
| 95 | /* | ||
| 96 | * To really model the clock, we have to catch the case | ||
| 97 | * where the current next-in-VPE timestamp is the old | ||
| 98 | * timestamp for the calling CPE, but the new value is | ||
| 99 | * in fact later. In that case, we have to do a full | ||
| 100 | * scan and discover the new next-in-VPE CPU id and | ||
| 101 | * timestamp. | ||
| 102 | */ | ||
| 103 | previous = smtc_nexttime[vpe][cpu]; | ||
| 104 | if (cpu == smtc_nextinvpe[vpe] && ISVALID(previous) | ||
| 105 | && IS_SOONER(previous, timestamp, reference)) { | ||
| 106 | int i; | ||
| 107 | int soonest = cpu; | ||
| 108 | |||
| 109 | /* | ||
| 110 | * Update timestamp array here, so that new | ||
| 111 | * value gets considered along with those of | ||
| 112 | * other virtual CPUs on the VPE. | ||
| 113 | */ | ||
| 114 | smtc_nexttime[vpe][cpu] = timestamp; | ||
| 115 | for_each_online_cpu(i) { | ||
| 116 | if (ISVALID(smtc_nexttime[vpe][i]) | ||
| 117 | && IS_SOONER(smtc_nexttime[vpe][i], | ||
| 118 | smtc_nexttime[vpe][soonest], reference)) { | ||
| 119 | soonest = i; | ||
| 120 | } | ||
| 121 | } | ||
| 122 | smtc_nextinvpe[vpe] = soonest; | ||
| 123 | nextcomp = smtc_nexttime[vpe][soonest]; | ||
| 124 | /* | ||
| 125 | * Otherwise, we don't have to process the whole array rank, | ||
| 126 | * we just have to see if the event horizon has gotten closer. | ||
| 127 | */ | ||
| 128 | } else { | ||
| 129 | if (!ISVALID(smtc_nexttime[vpe][smtc_nextinvpe[vpe]]) || | ||
| 130 | IS_SOONER(timestamp, | ||
| 131 | smtc_nexttime[vpe][smtc_nextinvpe[vpe]], reference)) { | ||
| 132 | smtc_nextinvpe[vpe] = cpu; | ||
| 133 | nextcomp = timestamp; | ||
| 134 | } | ||
| 135 | /* | ||
| 136 | * Since next-in-VPE may me the same as the executing | ||
| 137 | * virtual CPU, we update the array *after* checking | ||
| 138 | * its value. | ||
| 139 | */ | ||
| 140 | smtc_nexttime[vpe][cpu] = timestamp; | ||
| 141 | } | ||
| 142 | |||
| 143 | /* | ||
| 144 | * It may be that, in fact, we don't need to update Compare, | ||
| 145 | * but if we do, we want to make sure we didn't fall into | ||
| 146 | * a crack just behind Count. | ||
| 147 | */ | ||
| 148 | if (ISVALID(nextcomp)) { | ||
| 149 | write_c0_compare(nextcomp); | ||
| 150 | ehb(); | ||
| 151 | /* | ||
| 152 | * We never return an error, we just make sure | ||
| 153 | * that we trigger the handlers as quickly as | ||
| 154 | * we can if we fell behind. | ||
| 155 | */ | ||
| 156 | while ((nextcomp - (unsigned long)read_c0_count()) | ||
| 157 | > (unsigned long)LONG_MAX) { | ||
| 158 | nextcomp += CATCHUP_INCREMENT; | ||
| 159 | write_c0_compare(nextcomp); | ||
| 160 | ehb(); | ||
| 161 | } | ||
| 162 | } | ||
| 163 | emt(mtflags); | ||
| 164 | local_irq_restore(flags); | ||
| 165 | return 0; | ||
| 166 | } | ||
| 167 | |||
| 168 | |||
| 169 | void smtc_distribute_timer(int vpe) | ||
| 170 | { | ||
| 171 | unsigned long flags; | ||
| 172 | unsigned int mtflags; | ||
| 173 | int cpu; | ||
| 174 | struct clock_event_device *cd; | ||
| 175 | unsigned long nextstamp = 0L; | ||
| 176 | unsigned long reference; | ||
| 177 | |||
| 178 | |||
| 179 | repeat: | ||
| 180 | for_each_online_cpu(cpu) { | ||
| 181 | /* | ||
| 182 | * Find virtual CPUs within the current VPE who have | ||
| 183 | * unserviced timer requests whose time is now past. | ||
| 184 | */ | ||
| 185 | local_irq_save(flags); | ||
| 186 | mtflags = dmt(); | ||
| 187 | if (cpu_data[cpu].vpe_id == vpe && | ||
| 188 | ISVALID(smtc_nexttime[vpe][cpu])) { | ||
| 189 | reference = (unsigned long)read_c0_count(); | ||
| 190 | if ((smtc_nexttime[vpe][cpu] - reference) | ||
| 191 | > (unsigned long)LONG_MAX) { | ||
| 192 | smtc_nexttime[vpe][cpu] = 0L; | ||
| 193 | emt(mtflags); | ||
| 194 | local_irq_restore(flags); | ||
| 195 | /* | ||
| 196 | * We don't send IPIs to ourself. | ||
| 197 | */ | ||
| 198 | if (cpu != smp_processor_id()) { | ||
| 199 | smtc_send_ipi(cpu, SMTC_CLOCK_TICK, 0); | ||
| 200 | } else { | ||
| 201 | cd = &per_cpu(mips_clockevent_device, cpu); | ||
| 202 | cd->event_handler(cd); | ||
| 203 | } | ||
| 204 | } else { | ||
| 205 | /* Local to VPE but Valid Time not yet reached. */ | ||
| 206 | if (!ISVALID(nextstamp) || | ||
| 207 | IS_SOONER(smtc_nexttime[vpe][cpu], nextstamp, | ||
| 208 | reference)) { | ||
| 209 | smtc_nextinvpe[vpe] = cpu; | ||
| 210 | nextstamp = smtc_nexttime[vpe][cpu]; | ||
| 211 | } | ||
| 212 | emt(mtflags); | ||
| 213 | local_irq_restore(flags); | ||
| 214 | } | ||
| 215 | } else { | ||
| 216 | emt(mtflags); | ||
| 217 | local_irq_restore(flags); | ||
| 218 | |||
| 219 | } | ||
| 220 | } | ||
| 221 | /* Reprogram for interrupt at next soonest timestamp for VPE */ | ||
| 222 | if (ISVALID(nextstamp)) { | ||
| 223 | write_c0_compare(nextstamp); | ||
| 224 | ehb(); | ||
| 225 | if ((nextstamp - (unsigned long)read_c0_count()) | ||
| 226 | > (unsigned long)LONG_MAX) | ||
| 227 | goto repeat; | ||
| 228 | } | ||
| 229 | } | ||
| 230 | |||
| 231 | |||
| 232 | irqreturn_t c0_compare_interrupt(int irq, void *dev_id) | ||
| 233 | { | ||
| 234 | int cpu = smp_processor_id(); | ||
| 235 | |||
| 236 | /* If we're running SMTC, we've got MIPS MT and therefore MIPS32R2 */ | ||
| 237 | handle_perf_irq(1); | ||
| 238 | |||
| 239 | if (read_c0_cause() & (1 << 30)) { | ||
| 240 | /* Clear Count/Compare Interrupt */ | ||
| 241 | write_c0_compare(read_c0_compare()); | ||
| 242 | smtc_distribute_timer(cpu_data[cpu].vpe_id); | ||
| 243 | } | ||
| 244 | return IRQ_HANDLED; | ||
| 245 | } | ||
| 246 | |||
| 247 | |||
| 248 | int __cpuinit mips_clockevent_init(void) | ||
| 249 | { | ||
| 250 | uint64_t mips_freq = mips_hpt_frequency; | ||
| 251 | unsigned int cpu = smp_processor_id(); | ||
| 252 | struct clock_event_device *cd; | ||
| 253 | unsigned int irq; | ||
| 254 | int i; | ||
| 255 | int j; | ||
| 256 | |||
| 257 | if (!cpu_has_counter || !mips_hpt_frequency) | ||
| 258 | return -ENXIO; | ||
| 259 | if (cpu == 0) { | ||
| 260 | for (i = 0; i < num_possible_cpus(); i++) { | ||
| 261 | smtc_nextinvpe[i] = 0; | ||
| 262 | for (j = 0; j < num_possible_cpus(); j++) | ||
| 263 | smtc_nexttime[i][j] = 0L; | ||
| 264 | } | ||
| 265 | /* | ||
| 266 | * SMTC also can't have the usablility test | ||
| 267 | * run by secondary TCs once Compare is in use. | ||
| 268 | */ | ||
| 269 | if (!c0_compare_int_usable()) | ||
| 270 | return -ENXIO; | ||
| 271 | } | ||
| 272 | |||
| 273 | /* | ||
| 274 | * With vectored interrupts things are getting platform specific. | ||
| 275 | * get_c0_compare_int is a hook to allow a platform to return the | ||
| 276 | * interrupt number of it's liking. | ||
| 277 | */ | ||
| 278 | irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq; | ||
| 279 | if (get_c0_compare_int) | ||
| 280 | irq = get_c0_compare_int(); | ||
| 281 | |||
| 282 | cd = &per_cpu(mips_clockevent_device, cpu); | ||
| 283 | |||
| 284 | cd->name = "MIPS"; | ||
| 285 | cd->features = CLOCK_EVT_FEAT_ONESHOT; | ||
| 286 | |||
| 287 | /* Calculate the min / max delta */ | ||
| 288 | cd->mult = div_sc((unsigned long) mips_freq, NSEC_PER_SEC, 32); | ||
| 289 | cd->shift = 32; | ||
| 290 | cd->max_delta_ns = clockevent_delta2ns(0x7fffffff, cd); | ||
| 291 | cd->min_delta_ns = clockevent_delta2ns(0x300, cd); | ||
| 292 | |||
| 293 | cd->rating = 300; | ||
| 294 | cd->irq = irq; | ||
| 295 | cd->cpumask = cpumask_of_cpu(cpu); | ||
| 296 | cd->set_next_event = mips_next_event; | ||
| 297 | cd->set_mode = mips_set_clock_mode; | ||
| 298 | cd->event_handler = mips_event_handler; | ||
| 299 | |||
| 300 | clockevents_register_device(cd); | ||
| 301 | |||
| 302 | /* | ||
| 303 | * On SMTC we only want to do the data structure | ||
| 304 | * initialization and IRQ setup once. | ||
| 305 | */ | ||
| 306 | if (cpu) | ||
| 307 | return 0; | ||
| 308 | /* | ||
| 309 | * And we need the hwmask associated with the c0_compare | ||
| 310 | * vector to be initialized. | ||
| 311 | */ | ||
| 312 | irq_hwmask[irq] = (0x100 << cp0_compare_irq); | ||
| 313 | if (cp0_timer_irq_installed) | ||
| 314 | return 0; | ||
| 315 | |||
| 316 | cp0_timer_irq_installed = 1; | ||
| 317 | |||
| 318 | setup_irq(irq, &c0_compare_irqaction); | ||
| 319 | |||
| 320 | return 0; | ||
| 321 | } | ||
| diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index 11c92dc53791..e621fda8ab37 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
| @@ -54,14 +54,18 @@ extern void r4k_wait(void); | |||
| 54 | * interrupt is requested" restriction in the MIPS32/MIPS64 architecture makes | 54 | * interrupt is requested" restriction in the MIPS32/MIPS64 architecture makes | 
| 55 | * using this version a gamble. | 55 | * using this version a gamble. | 
| 56 | */ | 56 | */ | 
| 57 | static void r4k_wait_irqoff(void) | 57 | void r4k_wait_irqoff(void) | 
| 58 | { | 58 | { | 
| 59 | local_irq_disable(); | 59 | local_irq_disable(); | 
| 60 | if (!need_resched()) | 60 | if (!need_resched()) | 
| 61 | __asm__(" .set mips3 \n" | 61 | __asm__(" .set push \n" | 
| 62 | " .set mips3 \n" | ||
| 62 | " wait \n" | 63 | " wait \n" | 
| 63 | " .set mips0 \n"); | 64 | " .set pop \n"); | 
| 64 | local_irq_enable(); | 65 | local_irq_enable(); | 
| 66 | __asm__(" .globl __pastwait \n" | ||
| 67 | "__pastwait: \n"); | ||
| 68 | return; | ||
| 65 | } | 69 | } | 
| 66 | 70 | ||
| 67 | /* | 71 | /* | 
| diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S index e29598ae939d..ffa331029e08 100644 --- a/arch/mips/kernel/entry.S +++ b/arch/mips/kernel/entry.S | |||
| @@ -79,11 +79,6 @@ FEXPORT(syscall_exit) | |||
| 79 | 79 | ||
| 80 | FEXPORT(restore_all) # restore full frame | 80 | FEXPORT(restore_all) # restore full frame | 
| 81 | #ifdef CONFIG_MIPS_MT_SMTC | 81 | #ifdef CONFIG_MIPS_MT_SMTC | 
| 82 | /* Detect and execute deferred IPI "interrupts" */ | ||
| 83 | LONG_L s0, TI_REGS($28) | ||
| 84 | LONG_S sp, TI_REGS($28) | ||
| 85 | jal deferred_smtc_ipi | ||
| 86 | LONG_S s0, TI_REGS($28) | ||
| 87 | #ifdef CONFIG_MIPS_MT_SMTC_IM_BACKSTOP | 82 | #ifdef CONFIG_MIPS_MT_SMTC_IM_BACKSTOP | 
| 88 | /* Re-arm any temporarily masked interrupts not explicitly "acked" */ | 83 | /* Re-arm any temporarily masked interrupts not explicitly "acked" */ | 
| 89 | mfc0 v0, CP0_TCSTATUS | 84 | mfc0 v0, CP0_TCSTATUS | 
| @@ -112,6 +107,11 @@ FEXPORT(restore_all) # restore full frame | |||
| 112 | xor t0, t0, t3 | 107 | xor t0, t0, t3 | 
| 113 | mtc0 t0, CP0_TCCONTEXT | 108 | mtc0 t0, CP0_TCCONTEXT | 
| 114 | #endif /* CONFIG_MIPS_MT_SMTC_IM_BACKSTOP */ | 109 | #endif /* CONFIG_MIPS_MT_SMTC_IM_BACKSTOP */ | 
| 110 | /* Detect and execute deferred IPI "interrupts" */ | ||
| 111 | LONG_L s0, TI_REGS($28) | ||
| 112 | LONG_S sp, TI_REGS($28) | ||
| 113 | jal deferred_smtc_ipi | ||
| 114 | LONG_S s0, TI_REGS($28) | ||
| 115 | #endif /* CONFIG_MIPS_MT_SMTC */ | 115 | #endif /* CONFIG_MIPS_MT_SMTC */ | 
| 116 | .set noat | 116 | .set noat | 
| 117 | RESTORE_TEMP | 117 | RESTORE_TEMP | 
| diff --git a/arch/mips/kernel/genex.S b/arch/mips/kernel/genex.S index f886dd7f708e..01dcbe38fa01 100644 --- a/arch/mips/kernel/genex.S +++ b/arch/mips/kernel/genex.S | |||
| @@ -282,8 +282,8 @@ NESTED(except_vec_vi_handler, 0, sp) | |||
| 282 | and t0, a0, t1 | 282 | and t0, a0, t1 | 
| 283 | #ifdef CONFIG_MIPS_MT_SMTC_IM_BACKSTOP | 283 | #ifdef CONFIG_MIPS_MT_SMTC_IM_BACKSTOP | 
| 284 | mfc0 t2, CP0_TCCONTEXT | 284 | mfc0 t2, CP0_TCCONTEXT | 
| 285 | or t0, t0, t2 | 285 | or t2, t0, t2 | 
| 286 | mtc0 t0, CP0_TCCONTEXT | 286 | mtc0 t2, CP0_TCCONTEXT | 
| 287 | #endif /* CONFIG_MIPS_MT_SMTC_IM_BACKSTOP */ | 287 | #endif /* CONFIG_MIPS_MT_SMTC_IM_BACKSTOP */ | 
| 288 | xor t1, t1, t0 | 288 | xor t1, t1, t0 | 
| 289 | mtc0 t1, CP0_STATUS | 289 | mtc0 t1, CP0_STATUS | 
| diff --git a/arch/mips/kernel/mips-mt-fpaff.c b/arch/mips/kernel/mips-mt-fpaff.c index df4d3f2f740c..dc9eb72ed9de 100644 --- a/arch/mips/kernel/mips-mt-fpaff.c +++ b/arch/mips/kernel/mips-mt-fpaff.c | |||
| @@ -159,7 +159,7 @@ __setup("fpaff=", fpaff_thresh); | |||
| 159 | /* | 159 | /* | 
| 160 | * FPU Use Factor empirically derived from experiments on 34K | 160 | * FPU Use Factor empirically derived from experiments on 34K | 
| 161 | */ | 161 | */ | 
| 162 | #define FPUSEFACTOR 333 | 162 | #define FPUSEFACTOR 2000 | 
| 163 | 163 | ||
| 164 | static __init int mt_fp_affinity_init(void) | 164 | static __init int mt_fp_affinity_init(void) | 
| 165 | { | 165 | { | 
| diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c index ce7684335a41..22fc19bbe87f 100644 --- a/arch/mips/kernel/process.c +++ b/arch/mips/kernel/process.c | |||
| @@ -55,7 +55,7 @@ void __noreturn cpu_idle(void) | |||
| 55 | while (1) { | 55 | while (1) { | 
| 56 | tick_nohz_stop_sched_tick(1); | 56 | tick_nohz_stop_sched_tick(1); | 
| 57 | while (!need_resched()) { | 57 | while (!need_resched()) { | 
| 58 | #ifdef CONFIG_SMTC_IDLE_HOOK_DEBUG | 58 | #ifdef CONFIG_MIPS_MT_SMTC | 
| 59 | extern void smtc_idle_loop_hook(void); | 59 | extern void smtc_idle_loop_hook(void); | 
| 60 | 60 | ||
| 61 | smtc_idle_loop_hook(); | 61 | smtc_idle_loop_hook(); | 
| @@ -145,19 +145,18 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp, | |||
| 145 | */ | 145 | */ | 
| 146 | p->thread.cp0_status = read_c0_status() & ~(ST0_CU2|ST0_CU1); | 146 | p->thread.cp0_status = read_c0_status() & ~(ST0_CU2|ST0_CU1); | 
| 147 | childregs->cp0_status &= ~(ST0_CU2|ST0_CU1); | 147 | childregs->cp0_status &= ~(ST0_CU2|ST0_CU1); | 
| 148 | |||
| 149 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 150 | /* | ||
| 151 | * SMTC restores TCStatus after Status, and the CU bits | ||
| 152 | * are aliased there. | ||
| 153 | */ | ||
| 154 | childregs->cp0_tcstatus &= ~(ST0_CU2|ST0_CU1); | ||
| 155 | #endif | ||
| 148 | clear_tsk_thread_flag(p, TIF_USEDFPU); | 156 | clear_tsk_thread_flag(p, TIF_USEDFPU); | 
| 149 | 157 | ||
| 150 | #ifdef CONFIG_MIPS_MT_FPAFF | 158 | #ifdef CONFIG_MIPS_MT_FPAFF | 
| 151 | clear_tsk_thread_flag(p, TIF_FPUBOUND); | 159 | clear_tsk_thread_flag(p, TIF_FPUBOUND); | 
| 152 | |||
| 153 | /* | ||
| 154 | * FPU affinity support is cleaner if we track the | ||
| 155 | * user-visible CPU affinity from the very beginning. | ||
| 156 | * The generic cpus_allowed mask will already have | ||
| 157 | * been copied from the parent before copy_thread | ||
| 158 | * is invoked. | ||
| 159 | */ | ||
| 160 | p->thread.user_cpus_allowed = p->cpus_allowed; | ||
| 161 | #endif /* CONFIG_MIPS_MT_FPAFF */ | 160 | #endif /* CONFIG_MIPS_MT_FPAFF */ | 
| 162 | 161 | ||
| 163 | if (clone_flags & CLONE_SETTLS) | 162 | if (clone_flags & CLONE_SETTLS) | 
| diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c index 35234b92b9a5..96ffc9c6d194 100644 --- a/arch/mips/kernel/ptrace.c +++ b/arch/mips/kernel/ptrace.c | |||
| @@ -238,7 +238,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 238 | case FPC_EIR: { /* implementation / version register */ | 238 | case FPC_EIR: { /* implementation / version register */ | 
| 239 | unsigned int flags; | 239 | unsigned int flags; | 
| 240 | #ifdef CONFIG_MIPS_MT_SMTC | 240 | #ifdef CONFIG_MIPS_MT_SMTC | 
| 241 | unsigned int irqflags; | 241 | unsigned long irqflags; | 
| 242 | unsigned int mtflags; | 242 | unsigned int mtflags; | 
| 243 | #endif /* CONFIG_MIPS_MT_SMTC */ | 243 | #endif /* CONFIG_MIPS_MT_SMTC */ | 
| 244 | 244 | ||
| diff --git a/arch/mips/kernel/smtc.c b/arch/mips/kernel/smtc.c index a516286532ab..897fb2b4751c 100644 --- a/arch/mips/kernel/smtc.c +++ b/arch/mips/kernel/smtc.c | |||
| @@ -1,4 +1,21 @@ | |||
| 1 | /* Copyright (C) 2004 Mips Technologies, Inc */ | 1 | /* | 
| 2 | * This program is free software; you can redistribute it and/or | ||
| 3 | * modify it under the terms of the GNU General Public License | ||
| 4 | * as published by the Free Software Foundation; either version 2 | ||
| 5 | * of the License, or (at your option) any later version. | ||
| 6 | * | ||
| 7 | * This program is distributed in the hope that it will be useful, | ||
| 8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 10 | * GNU General Public License for more details. | ||
| 11 | * | ||
| 12 | * You should have received a copy of the GNU General Public License | ||
| 13 | * along with this program; if not, write to the Free Software | ||
| 14 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
| 15 | * | ||
| 16 | * Copyright (C) 2004 Mips Technologies, Inc | ||
| 17 | * Copyright (C) 2008 Kevin D. Kissell | ||
| 18 | */ | ||
| 2 | 19 | ||
| 3 | #include <linux/clockchips.h> | 20 | #include <linux/clockchips.h> | 
| 4 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> | 
| @@ -21,7 +38,6 @@ | |||
| 21 | #include <asm/time.h> | 38 | #include <asm/time.h> | 
| 22 | #include <asm/addrspace.h> | 39 | #include <asm/addrspace.h> | 
| 23 | #include <asm/smtc.h> | 40 | #include <asm/smtc.h> | 
| 24 | #include <asm/smtc_ipi.h> | ||
| 25 | #include <asm/smtc_proc.h> | 41 | #include <asm/smtc_proc.h> | 
| 26 | 42 | ||
| 27 | /* | 43 | /* | 
| @@ -58,11 +74,6 @@ unsigned long irq_hwmask[NR_IRQS]; | |||
| 58 | 74 | ||
| 59 | asiduse smtc_live_asid[MAX_SMTC_TLBS][MAX_SMTC_ASIDS]; | 75 | asiduse smtc_live_asid[MAX_SMTC_TLBS][MAX_SMTC_ASIDS]; | 
| 60 | 76 | ||
| 61 | /* | ||
| 62 | * Clock interrupt "latch" buffers, per "CPU" | ||
| 63 | */ | ||
| 64 | |||
| 65 | static atomic_t ipi_timer_latch[NR_CPUS]; | ||
| 66 | 77 | ||
| 67 | /* | 78 | /* | 
| 68 | * Number of InterProcessor Interrupt (IPI) message buffers to allocate | 79 | * Number of InterProcessor Interrupt (IPI) message buffers to allocate | 
| @@ -70,7 +81,7 @@ static atomic_t ipi_timer_latch[NR_CPUS]; | |||
| 70 | 81 | ||
| 71 | #define IPIBUF_PER_CPU 4 | 82 | #define IPIBUF_PER_CPU 4 | 
| 72 | 83 | ||
| 73 | static struct smtc_ipi_q IPIQ[NR_CPUS]; | 84 | struct smtc_ipi_q IPIQ[NR_CPUS]; | 
| 74 | static struct smtc_ipi_q freeIPIq; | 85 | static struct smtc_ipi_q freeIPIq; | 
| 75 | 86 | ||
| 76 | 87 | ||
| @@ -282,7 +293,7 @@ static void smtc_configure_tlb(void) | |||
| 282 | * phys_cpu_present_map and the logical/physical mappings. | 293 | * phys_cpu_present_map and the logical/physical mappings. | 
| 283 | */ | 294 | */ | 
| 284 | 295 | ||
| 285 | int __init mipsmt_build_cpu_map(int start_cpu_slot) | 296 | int __init smtc_build_cpu_map(int start_cpu_slot) | 
| 286 | { | 297 | { | 
| 287 | int i, ntcs; | 298 | int i, ntcs; | 
| 288 | 299 | ||
| @@ -325,7 +336,12 @@ static void smtc_tc_setup(int vpe, int tc, int cpu) | |||
| 325 | write_tc_c0_tcstatus((read_tc_c0_tcstatus() | 336 | write_tc_c0_tcstatus((read_tc_c0_tcstatus() | 
| 326 | & ~(TCSTATUS_TKSU | TCSTATUS_DA | TCSTATUS_IXMT)) | 337 | & ~(TCSTATUS_TKSU | TCSTATUS_DA | TCSTATUS_IXMT)) | 
| 327 | | TCSTATUS_A); | 338 | | TCSTATUS_A); | 
| 328 | write_tc_c0_tccontext(0); | 339 | /* | 
| 340 | * TCContext gets an offset from the base of the IPIQ array | ||
| 341 | * to be used in low-level code to detect the presence of | ||
| 342 | * an active IPI queue | ||
| 343 | */ | ||
| 344 | write_tc_c0_tccontext((sizeof(struct smtc_ipi_q) * cpu) << 16); | ||
| 329 | /* Bind tc to vpe */ | 345 | /* Bind tc to vpe */ | 
| 330 | write_tc_c0_tcbind(vpe); | 346 | write_tc_c0_tcbind(vpe); | 
| 331 | /* In general, all TCs should have the same cpu_data indications */ | 347 | /* In general, all TCs should have the same cpu_data indications */ | 
| @@ -336,10 +352,18 @@ static void smtc_tc_setup(int vpe, int tc, int cpu) | |||
| 336 | cpu_data[cpu].options &= ~MIPS_CPU_FPU; | 352 | cpu_data[cpu].options &= ~MIPS_CPU_FPU; | 
| 337 | cpu_data[cpu].vpe_id = vpe; | 353 | cpu_data[cpu].vpe_id = vpe; | 
| 338 | cpu_data[cpu].tc_id = tc; | 354 | cpu_data[cpu].tc_id = tc; | 
| 355 | /* Multi-core SMTC hasn't been tested, but be prepared */ | ||
| 356 | cpu_data[cpu].core = (read_vpe_c0_ebase() >> 1) & 0xff; | ||
| 339 | } | 357 | } | 
| 340 | 358 | ||
| 359 | /* | ||
| 360 | * Tweak to get Count registes in as close a sync as possible. | ||
| 361 | * Value seems good for 34K-class cores. | ||
| 362 | */ | ||
| 363 | |||
| 364 | #define CP0_SKEW 8 | ||
| 341 | 365 | ||
| 342 | void mipsmt_prepare_cpus(void) | 366 | void smtc_prepare_cpus(int cpus) | 
| 343 | { | 367 | { | 
| 344 | int i, vpe, tc, ntc, nvpe, tcpervpe[NR_CPUS], slop, cpu; | 368 | int i, vpe, tc, ntc, nvpe, tcpervpe[NR_CPUS], slop, cpu; | 
| 345 | unsigned long flags; | 369 | unsigned long flags; | 
| @@ -363,13 +387,13 @@ void mipsmt_prepare_cpus(void) | |||
| 363 | IPIQ[i].head = IPIQ[i].tail = NULL; | 387 | IPIQ[i].head = IPIQ[i].tail = NULL; | 
| 364 | spin_lock_init(&IPIQ[i].lock); | 388 | spin_lock_init(&IPIQ[i].lock); | 
| 365 | IPIQ[i].depth = 0; | 389 | IPIQ[i].depth = 0; | 
| 366 | atomic_set(&ipi_timer_latch[i], 0); | ||
| 367 | } | 390 | } | 
| 368 | 391 | ||
| 369 | /* cpu_data index starts at zero */ | 392 | /* cpu_data index starts at zero */ | 
| 370 | cpu = 0; | 393 | cpu = 0; | 
| 371 | cpu_data[cpu].vpe_id = 0; | 394 | cpu_data[cpu].vpe_id = 0; | 
| 372 | cpu_data[cpu].tc_id = 0; | 395 | cpu_data[cpu].tc_id = 0; | 
| 396 | cpu_data[cpu].core = (read_c0_ebase() >> 1) & 0xff; | ||
| 373 | cpu++; | 397 | cpu++; | 
| 374 | 398 | ||
| 375 | /* Report on boot-time options */ | 399 | /* Report on boot-time options */ | 
| @@ -484,7 +508,8 @@ void mipsmt_prepare_cpus(void) | |||
| 484 | write_vpe_c0_compare(0); | 508 | write_vpe_c0_compare(0); | 
| 485 | /* Propagate Config7 */ | 509 | /* Propagate Config7 */ | 
| 486 | write_vpe_c0_config7(read_c0_config7()); | 510 | write_vpe_c0_config7(read_c0_config7()); | 
| 487 | write_vpe_c0_count(read_c0_count()); | 511 | write_vpe_c0_count(read_c0_count() + CP0_SKEW); | 
| 512 | ehb(); | ||
| 488 | } | 513 | } | 
| 489 | /* enable multi-threading within VPE */ | 514 | /* enable multi-threading within VPE */ | 
| 490 | write_vpe_c0_vpecontrol(read_vpe_c0_vpecontrol() | VPECONTROL_TE); | 515 | write_vpe_c0_vpecontrol(read_vpe_c0_vpecontrol() | VPECONTROL_TE); | 
| @@ -556,7 +581,7 @@ void mipsmt_prepare_cpus(void) | |||
| 556 | void __cpuinit smtc_boot_secondary(int cpu, struct task_struct *idle) | 581 | void __cpuinit smtc_boot_secondary(int cpu, struct task_struct *idle) | 
| 557 | { | 582 | { | 
| 558 | extern u32 kernelsp[NR_CPUS]; | 583 | extern u32 kernelsp[NR_CPUS]; | 
| 559 | long flags; | 584 | unsigned long flags; | 
| 560 | int mtflags; | 585 | int mtflags; | 
| 561 | 586 | ||
| 562 | LOCK_MT_PRA(); | 587 | LOCK_MT_PRA(); | 
| @@ -585,24 +610,22 @@ void __cpuinit smtc_boot_secondary(int cpu, struct task_struct *idle) | |||
| 585 | 610 | ||
| 586 | void smtc_init_secondary(void) | 611 | void smtc_init_secondary(void) | 
| 587 | { | 612 | { | 
| 588 | /* | ||
| 589 | * Start timer on secondary VPEs if necessary. | ||
| 590 | * plat_timer_setup has already have been invoked by init/main | ||
| 591 | * on "boot" TC. Like per_cpu_trap_init() hack, this assumes that | ||
| 592 | * SMTC init code assigns TCs consdecutively and in ascending order | ||
| 593 | * to across available VPEs. | ||
| 594 | */ | ||
| 595 | if (((read_c0_tcbind() & TCBIND_CURTC) != 0) && | ||
| 596 | ((read_c0_tcbind() & TCBIND_CURVPE) | ||
| 597 | != cpu_data[smp_processor_id() - 1].vpe_id)){ | ||
| 598 | write_c0_compare(read_c0_count() + mips_hpt_frequency/HZ); | ||
| 599 | } | ||
| 600 | |||
| 601 | local_irq_enable(); | 613 | local_irq_enable(); | 
| 602 | } | 614 | } | 
| 603 | 615 | ||
| 604 | void smtc_smp_finish(void) | 616 | void smtc_smp_finish(void) | 
| 605 | { | 617 | { | 
| 618 | int cpu = smp_processor_id(); | ||
| 619 | |||
| 620 | /* | ||
| 621 | * Lowest-numbered CPU per VPE starts a clock tick. | ||
| 622 | * Like per_cpu_trap_init() hack, this assumes that | ||
| 623 | * SMTC init code assigns TCs consdecutively and | ||
| 624 | * in ascending order across available VPEs. | ||
| 625 | */ | ||
| 626 | if (cpu > 0 && (cpu_data[cpu].vpe_id != cpu_data[cpu - 1].vpe_id)) | ||
| 627 | write_c0_compare(read_c0_count() + mips_hpt_frequency/HZ); | ||
| 628 | |||
| 606 | printk("TC %d going on-line as CPU %d\n", | 629 | printk("TC %d going on-line as CPU %d\n", | 
| 607 | cpu_data[smp_processor_id()].tc_id, smp_processor_id()); | 630 | cpu_data[smp_processor_id()].tc_id, smp_processor_id()); | 
| 608 | } | 631 | } | 
| @@ -753,8 +776,10 @@ void smtc_send_ipi(int cpu, int type, unsigned int action) | |||
| 753 | { | 776 | { | 
| 754 | int tcstatus; | 777 | int tcstatus; | 
| 755 | struct smtc_ipi *pipi; | 778 | struct smtc_ipi *pipi; | 
| 756 | long flags; | 779 | unsigned long flags; | 
| 757 | int mtflags; | 780 | int mtflags; | 
| 781 | unsigned long tcrestart; | ||
| 782 | extern void r4k_wait_irqoff(void), __pastwait(void); | ||
| 758 | 783 | ||
| 759 | if (cpu == smp_processor_id()) { | 784 | if (cpu == smp_processor_id()) { | 
| 760 | printk("Cannot Send IPI to self!\n"); | 785 | printk("Cannot Send IPI to self!\n"); | 
| @@ -771,8 +796,6 @@ void smtc_send_ipi(int cpu, int type, unsigned int action) | |||
| 771 | pipi->arg = (void *)action; | 796 | pipi->arg = (void *)action; | 
| 772 | pipi->dest = cpu; | 797 | pipi->dest = cpu; | 
| 773 | if (cpu_data[cpu].vpe_id != cpu_data[smp_processor_id()].vpe_id) { | 798 | if (cpu_data[cpu].vpe_id != cpu_data[smp_processor_id()].vpe_id) { | 
| 774 | if (type == SMTC_CLOCK_TICK) | ||
| 775 | atomic_inc(&ipi_timer_latch[cpu]); | ||
| 776 | /* If not on same VPE, enqueue and send cross-VPE interrupt */ | 799 | /* If not on same VPE, enqueue and send cross-VPE interrupt */ | 
| 777 | smtc_ipi_nq(&IPIQ[cpu], pipi); | 800 | smtc_ipi_nq(&IPIQ[cpu], pipi); | 
| 778 | LOCK_CORE_PRA(); | 801 | LOCK_CORE_PRA(); | 
| @@ -800,22 +823,29 @@ void smtc_send_ipi(int cpu, int type, unsigned int action) | |||
| 800 | 823 | ||
| 801 | if ((tcstatus & TCSTATUS_IXMT) != 0) { | 824 | if ((tcstatus & TCSTATUS_IXMT) != 0) { | 
| 802 | /* | 825 | /* | 
| 803 | * Spin-waiting here can deadlock, | 826 | * If we're in the the irq-off version of the wait | 
| 804 | * so we queue the message for the target TC. | 827 | * loop, we need to force exit from the wait and | 
| 828 | * do a direct post of the IPI. | ||
| 829 | */ | ||
| 830 | if (cpu_wait == r4k_wait_irqoff) { | ||
| 831 | tcrestart = read_tc_c0_tcrestart(); | ||
| 832 | if (tcrestart >= (unsigned long)r4k_wait_irqoff | ||
| 833 | && tcrestart < (unsigned long)__pastwait) { | ||
| 834 | write_tc_c0_tcrestart(__pastwait); | ||
| 835 | tcstatus &= ~TCSTATUS_IXMT; | ||
| 836 | write_tc_c0_tcstatus(tcstatus); | ||
| 837 | goto postdirect; | ||
| 838 | } | ||
| 839 | } | ||
| 840 | /* | ||
| 841 | * Otherwise we queue the message for the target TC | ||
| 842 | * to pick up when he does a local_irq_restore() | ||
| 805 | */ | 843 | */ | 
| 806 | write_tc_c0_tchalt(0); | 844 | write_tc_c0_tchalt(0); | 
| 807 | UNLOCK_CORE_PRA(); | 845 | UNLOCK_CORE_PRA(); | 
| 808 | /* Try to reduce redundant timer interrupt messages */ | ||
| 809 | if (type == SMTC_CLOCK_TICK) { | ||
| 810 | if (atomic_postincrement(&ipi_timer_latch[cpu])!=0){ | ||
| 811 | smtc_ipi_nq(&freeIPIq, pipi); | ||
| 812 | return; | ||
| 813 | } | ||
| 814 | } | ||
| 815 | smtc_ipi_nq(&IPIQ[cpu], pipi); | 846 | smtc_ipi_nq(&IPIQ[cpu], pipi); | 
| 816 | } else { | 847 | } else { | 
| 817 | if (type == SMTC_CLOCK_TICK) | 848 | postdirect: | 
| 818 | atomic_inc(&ipi_timer_latch[cpu]); | ||
| 819 | post_direct_ipi(cpu, pipi); | 849 | post_direct_ipi(cpu, pipi); | 
| 820 | write_tc_c0_tchalt(0); | 850 | write_tc_c0_tchalt(0); | 
| 821 | UNLOCK_CORE_PRA(); | 851 | UNLOCK_CORE_PRA(); | 
| @@ -883,7 +913,7 @@ static void ipi_call_interrupt(void) | |||
| 883 | smp_call_function_interrupt(); | 913 | smp_call_function_interrupt(); | 
| 884 | } | 914 | } | 
| 885 | 915 | ||
| 886 | DECLARE_PER_CPU(struct clock_event_device, smtc_dummy_clockevent_device); | 916 | DECLARE_PER_CPU(struct clock_event_device, mips_clockevent_device); | 
| 887 | 917 | ||
| 888 | void ipi_decode(struct smtc_ipi *pipi) | 918 | void ipi_decode(struct smtc_ipi *pipi) | 
| 889 | { | 919 | { | 
| @@ -891,20 +921,13 @@ void ipi_decode(struct smtc_ipi *pipi) | |||
| 891 | struct clock_event_device *cd; | 921 | struct clock_event_device *cd; | 
| 892 | void *arg_copy = pipi->arg; | 922 | void *arg_copy = pipi->arg; | 
| 893 | int type_copy = pipi->type; | 923 | int type_copy = pipi->type; | 
| 894 | int ticks; | ||
| 895 | |||
| 896 | smtc_ipi_nq(&freeIPIq, pipi); | 924 | smtc_ipi_nq(&freeIPIq, pipi); | 
| 897 | switch (type_copy) { | 925 | switch (type_copy) { | 
| 898 | case SMTC_CLOCK_TICK: | 926 | case SMTC_CLOCK_TICK: | 
| 899 | irq_enter(); | 927 | irq_enter(); | 
| 900 | kstat_this_cpu.irqs[MIPS_CPU_IRQ_BASE + 1]++; | 928 | kstat_this_cpu.irqs[MIPS_CPU_IRQ_BASE + 1]++; | 
| 901 | cd = &per_cpu(smtc_dummy_clockevent_device, cpu); | 929 | cd = &per_cpu(mips_clockevent_device, cpu); | 
| 902 | ticks = atomic_read(&ipi_timer_latch[cpu]); | 930 | cd->event_handler(cd); | 
| 903 | atomic_sub(ticks, &ipi_timer_latch[cpu]); | ||
| 904 | while (ticks) { | ||
| 905 | cd->event_handler(cd); | ||
| 906 | ticks--; | ||
| 907 | } | ||
| 908 | irq_exit(); | 931 | irq_exit(); | 
| 909 | break; | 932 | break; | 
| 910 | 933 | ||
| @@ -937,24 +960,48 @@ void ipi_decode(struct smtc_ipi *pipi) | |||
| 937 | } | 960 | } | 
| 938 | } | 961 | } | 
| 939 | 962 | ||
| 963 | /* | ||
| 964 | * Similar to smtc_ipi_replay(), but invoked from context restore, | ||
| 965 | * so it reuses the current exception frame rather than set up a | ||
| 966 | * new one with self_ipi. | ||
| 967 | */ | ||
| 968 | |||
| 940 | void deferred_smtc_ipi(void) | 969 | void deferred_smtc_ipi(void) | 
| 941 | { | 970 | { | 
| 942 | struct smtc_ipi *pipi; | 971 | int cpu = smp_processor_id(); | 
| 943 | unsigned long flags; | ||
| 944 | /* DEBUG */ | ||
| 945 | int q = smp_processor_id(); | ||
| 946 | 972 | ||
| 947 | /* | 973 | /* | 
| 948 | * Test is not atomic, but much faster than a dequeue, | 974 | * Test is not atomic, but much faster than a dequeue, | 
| 949 | * and the vast majority of invocations will have a null queue. | 975 | * and the vast majority of invocations will have a null queue. | 
| 976 | * If irq_disabled when this was called, then any IPIs queued | ||
| 977 | * after we test last will be taken on the next irq_enable/restore. | ||
| 978 | * If interrupts were enabled, then any IPIs added after the | ||
| 979 | * last test will be taken directly. | ||
| 950 | */ | 980 | */ | 
| 951 | if (IPIQ[q].head != NULL) { | 981 | |
| 952 | while((pipi = smtc_ipi_dq(&IPIQ[q])) != NULL) { | 982 | while (IPIQ[cpu].head != NULL) { | 
| 953 | /* ipi_decode() should be called with interrupts off */ | 983 | struct smtc_ipi_q *q = &IPIQ[cpu]; | 
| 954 | local_irq_save(flags); | 984 | struct smtc_ipi *pipi; | 
| 985 | unsigned long flags; | ||
| 986 | |||
| 987 | /* | ||
| 988 | * It may be possible we'll come in with interrupts | ||
| 989 | * already enabled. | ||
| 990 | */ | ||
| 991 | local_irq_save(flags); | ||
| 992 | |||
| 993 | spin_lock(&q->lock); | ||
| 994 | pipi = __smtc_ipi_dq(q); | ||
| 995 | spin_unlock(&q->lock); | ||
| 996 | if (pipi != NULL) | ||
| 955 | ipi_decode(pipi); | 997 | ipi_decode(pipi); | 
| 956 | local_irq_restore(flags); | 998 | /* | 
| 957 | } | 999 | * The use of the __raw_local restore isn't | 
| 1000 | * as obviously necessary here as in smtc_ipi_replay(), | ||
| 1001 | * but it's more efficient, given that we're already | ||
| 1002 | * running down the IPI queue. | ||
| 1003 | */ | ||
| 1004 | __raw_local_irq_restore(flags); | ||
| 958 | } | 1005 | } | 
| 959 | } | 1006 | } | 
| 960 | 1007 | ||
| @@ -975,7 +1022,7 @@ static irqreturn_t ipi_interrupt(int irq, void *dev_idm) | |||
| 975 | struct smtc_ipi *pipi; | 1022 | struct smtc_ipi *pipi; | 
| 976 | unsigned long tcstatus; | 1023 | unsigned long tcstatus; | 
| 977 | int sent; | 1024 | int sent; | 
| 978 | long flags; | 1025 | unsigned long flags; | 
| 979 | unsigned int mtflags; | 1026 | unsigned int mtflags; | 
| 980 | unsigned int vpflags; | 1027 | unsigned int vpflags; | 
| 981 | 1028 | ||
| @@ -1066,55 +1113,53 @@ static void setup_cross_vpe_interrupts(unsigned int nvpe) | |||
| 1066 | 1113 | ||
| 1067 | /* | 1114 | /* | 
| 1068 | * SMTC-specific hacks invoked from elsewhere in the kernel. | 1115 | * SMTC-specific hacks invoked from elsewhere in the kernel. | 
| 1069 | * | ||
| 1070 | * smtc_ipi_replay is called from raw_local_irq_restore which is only ever | ||
| 1071 | * called with interrupts disabled. We do rely on interrupts being disabled | ||
| 1072 | * here because using spin_lock_irqsave()/spin_unlock_irqrestore() would | ||
| 1073 | * result in a recursive call to raw_local_irq_restore(). | ||
| 1074 | */ | 1116 | */ | 
| 1075 | 1117 | ||
| 1076 | static void __smtc_ipi_replay(void) | 1118 | /* | 
| 1119 | * smtc_ipi_replay is called from raw_local_irq_restore | ||
| 1120 | */ | ||
| 1121 | |||
| 1122 | void smtc_ipi_replay(void) | ||
| 1077 | { | 1123 | { | 
| 1078 | unsigned int cpu = smp_processor_id(); | 1124 | unsigned int cpu = smp_processor_id(); | 
| 1079 | 1125 | ||
| 1080 | /* | 1126 | /* | 
| 1081 | * To the extent that we've ever turned interrupts off, | 1127 | * To the extent that we've ever turned interrupts off, | 
| 1082 | * we may have accumulated deferred IPIs. This is subtle. | 1128 | * we may have accumulated deferred IPIs. This is subtle. | 
| 1083 | * If we use the smtc_ipi_qdepth() macro, we'll get an | ||
| 1084 | * exact number - but we'll also disable interrupts | ||
| 1085 | * and create a window of failure where a new IPI gets | ||
| 1086 | * queued after we test the depth but before we re-enable | ||
| 1087 | * interrupts. So long as IXMT never gets set, however, | ||
| 1088 | * we should be OK: If we pick up something and dispatch | 1129 | * we should be OK: If we pick up something and dispatch | 
| 1089 | * it here, that's great. If we see nothing, but concurrent | 1130 | * it here, that's great. If we see nothing, but concurrent | 
| 1090 | * with this operation, another TC sends us an IPI, IXMT | 1131 | * with this operation, another TC sends us an IPI, IXMT | 
| 1091 | * is clear, and we'll handle it as a real pseudo-interrupt | 1132 | * is clear, and we'll handle it as a real pseudo-interrupt | 
| 1092 | * and not a pseudo-pseudo interrupt. | 1133 | * and not a pseudo-pseudo interrupt. The important thing | 
| 1134 | * is to do the last check for queued message *after* the | ||
| 1135 | * re-enabling of interrupts. | ||
| 1093 | */ | 1136 | */ | 
| 1094 | if (IPIQ[cpu].depth > 0) { | 1137 | while (IPIQ[cpu].head != NULL) { | 
| 1095 | while (1) { | 1138 | struct smtc_ipi_q *q = &IPIQ[cpu]; | 
| 1096 | struct smtc_ipi_q *q = &IPIQ[cpu]; | 1139 | struct smtc_ipi *pipi; | 
| 1097 | struct smtc_ipi *pipi; | 1140 | unsigned long flags; | 
| 1098 | extern void self_ipi(struct smtc_ipi *); | 1141 | |
| 1099 | 1142 | /* | |
| 1100 | spin_lock(&q->lock); | 1143 | * It's just possible we'll come in with interrupts | 
| 1101 | pipi = __smtc_ipi_dq(q); | 1144 | * already enabled. | 
| 1102 | spin_unlock(&q->lock); | 1145 | */ | 
| 1103 | if (!pipi) | 1146 | local_irq_save(flags); | 
| 1104 | break; | 1147 | |
| 1148 | spin_lock(&q->lock); | ||
| 1149 | pipi = __smtc_ipi_dq(q); | ||
| 1150 | spin_unlock(&q->lock); | ||
| 1151 | /* | ||
| 1152 | ** But use a raw restore here to avoid recursion. | ||
| 1153 | */ | ||
| 1154 | __raw_local_irq_restore(flags); | ||
| 1105 | 1155 | ||
| 1156 | if (pipi) { | ||
| 1106 | self_ipi(pipi); | 1157 | self_ipi(pipi); | 
| 1107 | smtc_cpu_stats[cpu].selfipis++; | 1158 | smtc_cpu_stats[cpu].selfipis++; | 
| 1108 | } | 1159 | } | 
| 1109 | } | 1160 | } | 
| 1110 | } | 1161 | } | 
| 1111 | 1162 | ||
| 1112 | void smtc_ipi_replay(void) | ||
| 1113 | { | ||
| 1114 | raw_local_irq_disable(); | ||
| 1115 | __smtc_ipi_replay(); | ||
| 1116 | } | ||
| 1117 | |||
| 1118 | EXPORT_SYMBOL(smtc_ipi_replay); | 1163 | EXPORT_SYMBOL(smtc_ipi_replay); | 
| 1119 | 1164 | ||
| 1120 | void smtc_idle_loop_hook(void) | 1165 | void smtc_idle_loop_hook(void) | 
| @@ -1193,40 +1238,13 @@ void smtc_idle_loop_hook(void) | |||
| 1193 | } | 1238 | } | 
| 1194 | } | 1239 | } | 
| 1195 | 1240 | ||
| 1196 | /* | ||
| 1197 | * Now that we limit outstanding timer IPIs, check for hung TC | ||
| 1198 | */ | ||
| 1199 | for (tc = 0; tc < NR_CPUS; tc++) { | ||
| 1200 | /* Don't check ourself - we'll dequeue IPIs just below */ | ||
| 1201 | if ((tc != smp_processor_id()) && | ||
| 1202 | atomic_read(&ipi_timer_latch[tc]) > timerq_limit) { | ||
| 1203 | if (clock_hang_reported[tc] == 0) { | ||
| 1204 | pdb_msg += sprintf(pdb_msg, | ||
| 1205 | "TC %d looks hung with timer latch at %d\n", | ||
| 1206 | tc, atomic_read(&ipi_timer_latch[tc])); | ||
| 1207 | clock_hang_reported[tc]++; | ||
| 1208 | } | ||
| 1209 | } | ||
| 1210 | } | ||
| 1211 | emt(mtflags); | 1241 | emt(mtflags); | 
| 1212 | local_irq_restore(flags); | 1242 | local_irq_restore(flags); | 
| 1213 | if (pdb_msg != &id_ho_db_msg[0]) | 1243 | if (pdb_msg != &id_ho_db_msg[0]) | 
| 1214 | printk("CPU%d: %s", smp_processor_id(), id_ho_db_msg); | 1244 | printk("CPU%d: %s", smp_processor_id(), id_ho_db_msg); | 
| 1215 | #endif /* CONFIG_SMTC_IDLE_HOOK_DEBUG */ | 1245 | #endif /* CONFIG_SMTC_IDLE_HOOK_DEBUG */ | 
| 1216 | 1246 | ||
| 1217 | /* | 1247 | smtc_ipi_replay(); | 
| 1218 | * Replay any accumulated deferred IPIs. If "Instant Replay" | ||
| 1219 | * is in use, there should never be any. | ||
| 1220 | */ | ||
| 1221 | #ifndef CONFIG_MIPS_MT_SMTC_INSTANT_REPLAY | ||
| 1222 | { | ||
| 1223 | unsigned long flags; | ||
| 1224 | |||
| 1225 | local_irq_save(flags); | ||
| 1226 | __smtc_ipi_replay(); | ||
| 1227 | local_irq_restore(flags); | ||
| 1228 | } | ||
| 1229 | #endif /* CONFIG_MIPS_MT_SMTC_INSTANT_REPLAY */ | ||
| 1230 | } | 1248 | } | 
| 1231 | 1249 | ||
| 1232 | void smtc_soft_dump(void) | 1250 | void smtc_soft_dump(void) | 
| @@ -1242,10 +1260,6 @@ void smtc_soft_dump(void) | |||
| 1242 | printk("%d: %ld\n", i, smtc_cpu_stats[i].selfipis); | 1260 | printk("%d: %ld\n", i, smtc_cpu_stats[i].selfipis); | 
| 1243 | } | 1261 | } | 
| 1244 | smtc_ipi_qdump(); | 1262 | smtc_ipi_qdump(); | 
| 1245 | printk("Timer IPI Backlogs:\n"); | ||
| 1246 | for (i=0; i < NR_CPUS; i++) { | ||
| 1247 | printk("%d: %d\n", i, atomic_read(&ipi_timer_latch[i])); | ||
| 1248 | } | ||
| 1249 | printk("%d Recoveries of \"stolen\" FPU\n", | 1263 | printk("%d Recoveries of \"stolen\" FPU\n", | 
| 1250 | atomic_read(&smtc_fpu_recoveries)); | 1264 | atomic_read(&smtc_fpu_recoveries)); | 
| 1251 | } | 1265 | } | 
| diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 5fd0cd020af5..b602ac6eb47d 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
| @@ -825,8 +825,10 @@ static void mt_ase_fp_affinity(void) | |||
| 825 | if (cpus_intersects(current->cpus_allowed, mt_fpu_cpumask)) { | 825 | if (cpus_intersects(current->cpus_allowed, mt_fpu_cpumask)) { | 
| 826 | cpumask_t tmask; | 826 | cpumask_t tmask; | 
| 827 | 827 | ||
| 828 | cpus_and(tmask, current->thread.user_cpus_allowed, | 828 | current->thread.user_cpus_allowed | 
| 829 | mt_fpu_cpumask); | 829 | = current->cpus_allowed; | 
| 830 | cpus_and(tmask, current->cpus_allowed, | ||
| 831 | mt_fpu_cpumask); | ||
| 830 | set_cpus_allowed(current, tmask); | 832 | set_cpus_allowed(current, tmask); | 
| 831 | set_thread_flag(TIF_FPUBOUND); | 833 | set_thread_flag(TIF_FPUBOUND); | 
| 832 | } | 834 | } | 
| diff --git a/arch/mips/mti-malta/Makefile b/arch/mips/mti-malta/Makefile index 3b7dd722c32a..cef2db8d2225 100644 --- a/arch/mips/mti-malta/Makefile +++ b/arch/mips/mti-malta/Makefile | |||
| @@ -15,6 +15,6 @@ obj-$(CONFIG_EARLY_PRINTK) += malta-console.o | |||
| 15 | obj-$(CONFIG_PCI) += malta-pci.o | 15 | obj-$(CONFIG_PCI) += malta-pci.o | 
| 16 | 16 | ||
| 17 | # FIXME FIXME FIXME | 17 | # FIXME FIXME FIXME | 
| 18 | obj-$(CONFIG_MIPS_MT_SMTC) += malta_smtc.o | 18 | obj-$(CONFIG_MIPS_MT_SMTC) += malta-smtc.o | 
| 19 | 19 | ||
| 20 | EXTRA_CFLAGS += -Werror | 20 | EXTRA_CFLAGS += -Werror | 
| diff --git a/arch/mips/mti-malta/malta-smtc.c b/arch/mips/mti-malta/malta-smtc.c index 5ea705e49454..f84a46a8ae6e 100644 --- a/arch/mips/mti-malta/malta-smtc.c +++ b/arch/mips/mti-malta/malta-smtc.c | |||
| @@ -84,12 +84,17 @@ static void msmtc_cpus_done(void) | |||
| 84 | 84 | ||
| 85 | static void __init msmtc_smp_setup(void) | 85 | static void __init msmtc_smp_setup(void) | 
| 86 | { | 86 | { | 
| 87 | mipsmt_build_cpu_map(0); | 87 | /* | 
| 88 | * we won't get the definitive value until | ||
| 89 | * we've run smtc_prepare_cpus later, but | ||
| 90 | * we would appear to need an upper bound now. | ||
| 91 | */ | ||
| 92 | smp_num_siblings = smtc_build_cpu_map(0); | ||
| 88 | } | 93 | } | 
| 89 | 94 | ||
| 90 | static void __init msmtc_prepare_cpus(unsigned int max_cpus) | 95 | static void __init msmtc_prepare_cpus(unsigned int max_cpus) | 
| 91 | { | 96 | { | 
| 92 | mipsmt_prepare_cpus(); | 97 | smtc_prepare_cpus(max_cpus); | 
| 93 | } | 98 | } | 
| 94 | 99 | ||
| 95 | struct plat_smp_ops msmtc_smp_ops = { | 100 | struct plat_smp_ops msmtc_smp_ops = { | 
| diff --git a/arch/mn10300/kernel/irq.c b/arch/mn10300/kernel/irq.c index 761c434a2488..56c64ccc9c21 100644 --- a/arch/mn10300/kernel/irq.c +++ b/arch/mn10300/kernel/irq.c | |||
| @@ -20,22 +20,8 @@ EXPORT_SYMBOL(__mn10300_irq_enabled_epsw); | |||
| 20 | atomic_t irq_err_count; | 20 | atomic_t irq_err_count; | 
| 21 | 21 | ||
| 22 | /* | 22 | /* | 
| 23 | * MN10300 INTC controller operations | 23 | * MN10300 interrupt controller operations | 
| 24 | */ | 24 | */ | 
| 25 | static void mn10300_cpupic_disable(unsigned int irq) | ||
| 26 | { | ||
| 27 | u16 tmp = GxICR(irq); | ||
| 28 | GxICR(irq) = (tmp & GxICR_LEVEL) | GxICR_DETECT; | ||
| 29 | tmp = GxICR(irq); | ||
| 30 | } | ||
| 31 | |||
| 32 | static void mn10300_cpupic_enable(unsigned int irq) | ||
| 33 | { | ||
| 34 | u16 tmp = GxICR(irq); | ||
| 35 | GxICR(irq) = (tmp & GxICR_LEVEL) | GxICR_ENABLE; | ||
| 36 | tmp = GxICR(irq); | ||
| 37 | } | ||
| 38 | |||
| 39 | static void mn10300_cpupic_ack(unsigned int irq) | 25 | static void mn10300_cpupic_ack(unsigned int irq) | 
| 40 | { | 26 | { | 
| 41 | u16 tmp; | 27 | u16 tmp; | 
| @@ -60,26 +46,54 @@ static void mn10300_cpupic_mask_ack(unsigned int irq) | |||
| 60 | static void mn10300_cpupic_unmask(unsigned int irq) | 46 | static void mn10300_cpupic_unmask(unsigned int irq) | 
| 61 | { | 47 | { | 
| 62 | u16 tmp = GxICR(irq); | 48 | u16 tmp = GxICR(irq); | 
| 63 | GxICR(irq) = (tmp & GxICR_LEVEL) | GxICR_ENABLE | GxICR_DETECT; | 49 | GxICR(irq) = (tmp & GxICR_LEVEL) | GxICR_ENABLE; | 
| 64 | tmp = GxICR(irq); | 50 | tmp = GxICR(irq); | 
| 65 | } | 51 | } | 
| 66 | 52 | ||
| 67 | static void mn10300_cpupic_end(unsigned int irq) | 53 | static void mn10300_cpupic_unmask_clear(unsigned int irq) | 
| 68 | { | 54 | { | 
| 55 | /* the MN10300 PIC latches its interrupt request bit, even after the | ||
| 56 | * device has ceased to assert its interrupt line and the interrupt | ||
| 57 | * channel has been disabled in the PIC, so for level-triggered | ||
| 58 | * interrupts we need to clear the request bit when we re-enable */ | ||
| 69 | u16 tmp = GxICR(irq); | 59 | u16 tmp = GxICR(irq); | 
| 70 | GxICR(irq) = (tmp & GxICR_LEVEL) | GxICR_ENABLE; | 60 | GxICR(irq) = (tmp & GxICR_LEVEL) | GxICR_ENABLE | GxICR_DETECT; | 
| 71 | tmp = GxICR(irq); | 61 | tmp = GxICR(irq); | 
| 72 | } | 62 | } | 
| 73 | 63 | ||
| 74 | static struct irq_chip mn10300_cpu_pic = { | 64 | /* | 
| 75 | .name = "cpu", | 65 | * MN10300 PIC level-triggered IRQ handling. | 
| 76 | .disable = mn10300_cpupic_disable, | 66 | * | 
| 77 | .enable = mn10300_cpupic_enable, | 67 | * The PIC has no 'ACK' function per se. It is possible to clear individual | 
| 68 | * channel latches, but each latch relatches whether or not the channel is | ||
| 69 | * masked, so we need to clear the latch when we unmask the channel. | ||
| 70 | * | ||
| 71 | * Also for this reason, we don't supply an ack() op (it's unused anyway if | ||
| 72 | * mask_ack() is provided), and mask_ack() just masks. | ||
| 73 | */ | ||
| 74 | static struct irq_chip mn10300_cpu_pic_level = { | ||
| 75 | .name = "cpu_l", | ||
| 76 | .disable = mn10300_cpupic_mask, | ||
| 77 | .enable = mn10300_cpupic_unmask_clear, | ||
| 78 | .ack = NULL, | ||
| 79 | .mask = mn10300_cpupic_mask, | ||
| 80 | .mask_ack = mn10300_cpupic_mask, | ||
| 81 | .unmask = mn10300_cpupic_unmask_clear, | ||
| 82 | }; | ||
| 83 | |||
| 84 | /* | ||
| 85 | * MN10300 PIC edge-triggered IRQ handling. | ||
| 86 | * | ||
| 87 | * We use the latch clearing function of the PIC as the 'ACK' function. | ||
| 88 | */ | ||
| 89 | static struct irq_chip mn10300_cpu_pic_edge = { | ||
| 90 | .name = "cpu_e", | ||
| 91 | .disable = mn10300_cpupic_mask, | ||
| 92 | .enable = mn10300_cpupic_unmask, | ||
| 78 | .ack = mn10300_cpupic_ack, | 93 | .ack = mn10300_cpupic_ack, | 
| 79 | .mask = mn10300_cpupic_mask, | 94 | .mask = mn10300_cpupic_mask, | 
| 80 | .mask_ack = mn10300_cpupic_mask_ack, | 95 | .mask_ack = mn10300_cpupic_mask_ack, | 
| 81 | .unmask = mn10300_cpupic_unmask, | 96 | .unmask = mn10300_cpupic_unmask, | 
| 82 | .end = mn10300_cpupic_end, | ||
| 83 | }; | 97 | }; | 
| 84 | 98 | ||
| 85 | /* | 99 | /* | 
| @@ -114,7 +128,8 @@ void set_intr_level(int irq, u16 level) | |||
| 114 | */ | 128 | */ | 
| 115 | void set_intr_postackable(int irq) | 129 | void set_intr_postackable(int irq) | 
| 116 | { | 130 | { | 
| 117 | set_irq_handler(irq, handle_level_irq); | 131 | set_irq_chip_and_handler(irq, &mn10300_cpu_pic_level, | 
| 132 | handle_level_irq); | ||
| 118 | } | 133 | } | 
| 119 | 134 | ||
| 120 | /* | 135 | /* | 
| @@ -126,8 +141,12 @@ void __init init_IRQ(void) | |||
| 126 | 141 | ||
| 127 | for (irq = 0; irq < NR_IRQS; irq++) | 142 | for (irq = 0; irq < NR_IRQS; irq++) | 
| 128 | if (irq_desc[irq].chip == &no_irq_type) | 143 | if (irq_desc[irq].chip == &no_irq_type) | 
| 129 | set_irq_chip_and_handler(irq, &mn10300_cpu_pic, | 144 | /* due to the PIC latching interrupt requests, even | 
| 130 | handle_edge_irq); | 145 | * when the IRQ is disabled, IRQ_PENDING is superfluous | 
| 146 | * and we can use handle_level_irq() for edge-triggered | ||
| 147 | * interrupts */ | ||
| 148 | set_irq_chip_and_handler(irq, &mn10300_cpu_pic_edge, | ||
| 149 | handle_level_irq); | ||
| 131 | unit_init_IRQ(); | 150 | unit_init_IRQ(); | 
| 132 | } | 151 | } | 
| 133 | 152 | ||
| diff --git a/arch/mn10300/unit-asb2303/unit-init.c b/arch/mn10300/unit-asb2303/unit-init.c index 14b2c817cff8..70e8cb4ea266 100644 --- a/arch/mn10300/unit-asb2303/unit-init.c +++ b/arch/mn10300/unit-asb2303/unit-init.c | |||
| @@ -51,7 +51,7 @@ void __init unit_init_IRQ(void) | |||
| 51 | switch (GET_XIRQ_TRIGGER(extnum)) { | 51 | switch (GET_XIRQ_TRIGGER(extnum)) { | 
| 52 | case XIRQ_TRIGGER_HILEVEL: | 52 | case XIRQ_TRIGGER_HILEVEL: | 
| 53 | case XIRQ_TRIGGER_LOWLEVEL: | 53 | case XIRQ_TRIGGER_LOWLEVEL: | 
| 54 | set_irq_handler(XIRQ2IRQ(extnum), handle_level_irq); | 54 | set_intr_postackable(XIRQ2IRQ(extnum)); | 
| 55 | break; | 55 | break; | 
| 56 | default: | 56 | default: | 
| 57 | break; | 57 | break; | 
| diff --git a/arch/mn10300/unit-asb2305/unit-init.c b/arch/mn10300/unit-asb2305/unit-init.c index 6a352414a358..72812a9439ac 100644 --- a/arch/mn10300/unit-asb2305/unit-init.c +++ b/arch/mn10300/unit-asb2305/unit-init.c | |||
| @@ -52,7 +52,7 @@ void __init unit_init_IRQ(void) | |||
| 52 | switch (GET_XIRQ_TRIGGER(extnum)) { | 52 | switch (GET_XIRQ_TRIGGER(extnum)) { | 
| 53 | case XIRQ_TRIGGER_HILEVEL: | 53 | case XIRQ_TRIGGER_HILEVEL: | 
| 54 | case XIRQ_TRIGGER_LOWLEVEL: | 54 | case XIRQ_TRIGGER_LOWLEVEL: | 
| 55 | set_irq_handler(XIRQ2IRQ(extnum), handle_level_irq); | 55 | set_intr_postackable(XIRQ2IRQ(extnum)); | 
| 56 | break; | 56 | break; | 
| 57 | default: | 57 | default: | 
| 58 | break; | 58 | break; | 
| diff --git a/arch/powerpc/boot/dts/holly.dts b/arch/powerpc/boot/dts/holly.dts index f87fe7b9ced9..c6e11ebecebb 100644 --- a/arch/powerpc/boot/dts/holly.dts +++ b/arch/powerpc/boot/dts/holly.dts | |||
| @@ -133,61 +133,61 @@ | |||
| 133 | reg = <0x00007400 0x00000400>; | 133 | reg = <0x00007400 0x00000400>; | 
| 134 | big-endian; | 134 | big-endian; | 
| 135 | }; | 135 | }; | 
| 136 | }; | ||
| 136 | 137 | ||
| 137 | pci@1000 { | 138 | pci@c0001000 { | 
| 138 | device_type = "pci"; | 139 | device_type = "pci"; | 
| 139 | compatible = "tsi109-pci", "tsi108-pci"; | 140 | compatible = "tsi109-pci", "tsi108-pci"; | 
| 140 | #interrupt-cells = <1>; | 141 | #interrupt-cells = <1>; | 
| 141 | #size-cells = <2>; | 142 | #size-cells = <2>; | 
| 142 | #address-cells = <3>; | 143 | #address-cells = <3>; | 
| 143 | reg = <0x00001000 0x00001000>; | 144 | reg = <0xc0001000 0x00001000>; | 
| 144 | bus-range = <0x0 0x0>; | 145 | bus-range = <0x0 0x0>; | 
| 145 | /*----------------------------------------------------+ | 146 | /*----------------------------------------------------+ | 
| 146 | | PCI memory range. | 147 | | PCI memory range. | 
| 147 | | 01 denotes I/O space | 148 | | 01 denotes I/O space | 
| 148 | | 02 denotes 32-bit memory space | 149 | | 02 denotes 32-bit memory space | 
| 149 | +----------------------------------------------------*/ | 150 | +----------------------------------------------------*/ | 
| 150 | ranges = <0x02000000 0x00000000 0x40000000 0x40000000 0x00000000 0x10000000 | 151 | ranges = <0x02000000 0x00000000 0x40000000 0x40000000 0x00000000 0x10000000 | 
| 151 | 0x01000000 0x00000000 0x00000000 0x7e000000 0x00000000 0x00010000>; | 152 | 0x01000000 0x00000000 0x00000000 0x7e000000 0x00000000 0x00010000>; | 
| 152 | clock-frequency = <133333332>; | 153 | clock-frequency = <133333332>; | 
| 153 | interrupt-parent = <&MPIC>; | 154 | interrupt-parent = <&MPIC>; | 
| 155 | interrupts = <0x17 0x2>; | ||
| 156 | interrupt-map-mask = <0xf800 0x0 0x0 0x7>; | ||
| 157 | /*----------------------------------------------------+ | ||
| 158 | | The INTA, INTB, INTC, INTD are shared. | ||
| 159 | +----------------------------------------------------*/ | ||
| 160 | interrupt-map = < | ||
| 161 | 0x800 0x0 0x0 0x1 &RT0 0x24 0x0 | ||
| 162 | 0x800 0x0 0x0 0x2 &RT0 0x25 0x0 | ||
| 163 | 0x800 0x0 0x0 0x3 &RT0 0x26 0x0 | ||
| 164 | 0x800 0x0 0x0 0x4 &RT0 0x27 0x0 | ||
| 165 | |||
| 166 | 0x1000 0x0 0x0 0x1 &RT0 0x25 0x0 | ||
| 167 | 0x1000 0x0 0x0 0x2 &RT0 0x26 0x0 | ||
| 168 | 0x1000 0x0 0x0 0x3 &RT0 0x27 0x0 | ||
| 169 | 0x1000 0x0 0x0 0x4 &RT0 0x24 0x0 | ||
| 170 | |||
| 171 | 0x1800 0x0 0x0 0x1 &RT0 0x26 0x0 | ||
| 172 | 0x1800 0x0 0x0 0x2 &RT0 0x27 0x0 | ||
| 173 | 0x1800 0x0 0x0 0x3 &RT0 0x24 0x0 | ||
| 174 | 0x1800 0x0 0x0 0x4 &RT0 0x25 0x0 | ||
| 175 | |||
| 176 | 0x2000 0x0 0x0 0x1 &RT0 0x27 0x0 | ||
| 177 | 0x2000 0x0 0x0 0x2 &RT0 0x24 0x0 | ||
| 178 | 0x2000 0x0 0x0 0x3 &RT0 0x25 0x0 | ||
| 179 | 0x2000 0x0 0x0 0x4 &RT0 0x26 0x0 | ||
| 180 | >; | ||
| 181 | |||
| 182 | RT0: router@1180 { | ||
| 183 | device_type = "pic-router"; | ||
| 184 | interrupt-controller; | ||
| 185 | big-endian; | ||
| 186 | clock-frequency = <0>; | ||
| 187 | #address-cells = <0>; | ||
| 188 | #interrupt-cells = <2>; | ||
| 154 | interrupts = <0x17 0x2>; | 189 | interrupts = <0x17 0x2>; | 
| 155 | interrupt-map-mask = <0xf800 0x0 0x0 0x7>; | 190 | interrupt-parent = <&MPIC>; | 
| 156 | /*----------------------------------------------------+ | ||
| 157 | | The INTA, INTB, INTC, INTD are shared. | ||
| 158 | +----------------------------------------------------*/ | ||
| 159 | interrupt-map = < | ||
| 160 | 0x800 0x0 0x0 0x1 &RT0 0x24 0x0 | ||
| 161 | 0x800 0x0 0x0 0x2 &RT0 0x25 0x0 | ||
| 162 | 0x800 0x0 0x0 0x3 &RT0 0x26 0x0 | ||
| 163 | 0x800 0x0 0x0 0x4 &RT0 0x27 0x0 | ||
| 164 | |||
| 165 | 0x1000 0x0 0x0 0x1 &RT0 0x25 0x0 | ||
| 166 | 0x1000 0x0 0x0 0x2 &RT0 0x26 0x0 | ||
| 167 | 0x1000 0x0 0x0 0x3 &RT0 0x27 0x0 | ||
| 168 | 0x1000 0x0 0x0 0x4 &RT0 0x24 0x0 | ||
| 169 | |||
| 170 | 0x1800 0x0 0x0 0x1 &RT0 0x26 0x0 | ||
| 171 | 0x1800 0x0 0x0 0x2 &RT0 0x27 0x0 | ||
| 172 | 0x1800 0x0 0x0 0x3 &RT0 0x24 0x0 | ||
| 173 | 0x1800 0x0 0x0 0x4 &RT0 0x25 0x0 | ||
| 174 | |||
| 175 | 0x2000 0x0 0x0 0x1 &RT0 0x27 0x0 | ||
| 176 | 0x2000 0x0 0x0 0x2 &RT0 0x24 0x0 | ||
| 177 | 0x2000 0x0 0x0 0x3 &RT0 0x25 0x0 | ||
| 178 | 0x2000 0x0 0x0 0x4 &RT0 0x26 0x0 | ||
| 179 | >; | ||
| 180 | |||
| 181 | RT0: router@1180 { | ||
| 182 | device_type = "pic-router"; | ||
| 183 | interrupt-controller; | ||
| 184 | big-endian; | ||
| 185 | clock-frequency = <0>; | ||
| 186 | #address-cells = <0>; | ||
| 187 | #interrupt-cells = <2>; | ||
| 188 | interrupts = <0x17 0x2>; | ||
| 189 | interrupt-parent = <&MPIC>; | ||
| 190 | }; | ||
| 191 | }; | 191 | }; | 
| 192 | }; | 192 | }; | 
| 193 | 193 | ||
| diff --git a/arch/powerpc/kernel/idle.c b/arch/powerpc/kernel/idle.c index d308a9f70f1b..31982d05d81a 100644 --- a/arch/powerpc/kernel/idle.c +++ b/arch/powerpc/kernel/idle.c | |||
| @@ -34,11 +34,7 @@ | |||
| 34 | #include <asm/smp.h> | 34 | #include <asm/smp.h> | 
| 35 | 35 | ||
| 36 | #ifdef CONFIG_HOTPLUG_CPU | 36 | #ifdef CONFIG_HOTPLUG_CPU | 
| 37 | /* this is used for software suspend, and that shuts down | 37 | #define cpu_should_die() cpu_is_offline(smp_processor_id()) | 
| 38 | * CPUs even while the system is still booting... */ | ||
| 39 | #define cpu_should_die() (cpu_is_offline(smp_processor_id()) && \ | ||
| 40 | (system_state == SYSTEM_RUNNING \ | ||
| 41 | || system_state == SYSTEM_BOOTING)) | ||
| 42 | #else | 38 | #else | 
| 43 | #define cpu_should_die() 0 | 39 | #define cpu_should_die() 0 | 
| 44 | #endif | 40 | #endif | 
| diff --git a/arch/powerpc/platforms/fsl_uli1575.c b/arch/powerpc/platforms/fsl_uli1575.c index ef74a0763ec1..8c619963becc 100644 --- a/arch/powerpc/platforms/fsl_uli1575.c +++ b/arch/powerpc/platforms/fsl_uli1575.c | |||
| @@ -219,11 +219,21 @@ static void __devinit quirk_final_uli5249(struct pci_dev *dev) | |||
| 219 | int i; | 219 | int i; | 
| 220 | u8 *dummy; | 220 | u8 *dummy; | 
| 221 | struct pci_bus *bus = dev->bus; | 221 | struct pci_bus *bus = dev->bus; | 
| 222 | resource_size_t end = 0; | ||
| 223 | |||
| 224 | for (i = PCI_BRIDGE_RESOURCES; i < PCI_BRIDGE_RESOURCES+3; i++) { | ||
| 225 | unsigned long flags = pci_resource_flags(dev, i); | ||
| 226 | if ((flags & (IORESOURCE_MEM|IORESOURCE_PREFETCH)) == IORESOURCE_MEM) | ||
| 227 | end = pci_resource_end(dev, i); | ||
| 228 | } | ||
| 222 | 229 | ||
| 223 | for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) { | 230 | for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) { | 
| 224 | if ((bus->resource[i]) && | 231 | if ((bus->resource[i]) && | 
| 225 | (bus->resource[i]->flags & IORESOURCE_MEM)) { | 232 | (bus->resource[i]->flags & IORESOURCE_MEM)) { | 
| 226 | dummy = ioremap(bus->resource[i]->end - 3, 0x4); | 233 | if (bus->resource[i]->end == end) | 
| 234 | dummy = ioremap(bus->resource[i]->start, 0x4); | ||
| 235 | else | ||
| 236 | dummy = ioremap(bus->resource[i]->end - 3, 0x4); | ||
| 227 | if (dummy) { | 237 | if (dummy) { | 
| 228 | in_8(dummy); | 238 | in_8(dummy); | 
| 229 | iounmap(dummy); | 239 | iounmap(dummy); | 
| diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index ca114fe46ffb..06acb1a18bbc 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
| @@ -169,6 +169,8 @@ void init_cpu_timer(void) | |||
| 169 | 169 | ||
| 170 | static void clock_comparator_interrupt(__u16 code) | 170 | static void clock_comparator_interrupt(__u16 code) | 
| 171 | { | 171 | { | 
| 172 | if (S390_lowcore.clock_comparator == -1ULL) | ||
| 173 | set_clock_comparator(S390_lowcore.clock_comparator); | ||
| 172 | } | 174 | } | 
| 173 | 175 | ||
| 174 | static void etr_timing_alert(struct etr_irq_parm *); | 176 | static void etr_timing_alert(struct etr_irq_parm *); | 
| diff --git a/arch/s390/lib/delay.c b/arch/s390/lib/delay.c index fc6ab6094df8..0953cee05efc 100644 --- a/arch/s390/lib/delay.c +++ b/arch/s390/lib/delay.c | |||
| @@ -1,14 +1,9 @@ | |||
| 1 | /* | 1 | /* | 
| 2 | * arch/s390/lib/delay.c | ||
| 3 | * Precise Delay Loops for S390 | 2 | * Precise Delay Loops for S390 | 
| 4 | * | 3 | * | 
| 5 | * S390 version | 4 | * Copyright IBM Corp. 1999,2008 | 
| 6 | * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation | 5 | * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>, | 
| 7 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), | 6 | * Heiko Carstens <heiko.carstens@de.ibm.com>, | 
| 8 | * | ||
| 9 | * Derived from "arch/i386/lib/delay.c" | ||
| 10 | * Copyright (C) 1993 Linus Torvalds | ||
| 11 | * Copyright (C) 1997 Martin Mares <mj@atrey.karlin.mff.cuni.cz> | ||
| 12 | */ | 7 | */ | 
| 13 | 8 | ||
| 14 | #include <linux/sched.h> | 9 | #include <linux/sched.h> | 
| @@ -29,30 +24,31 @@ void __delay(unsigned long loops) | |||
| 29 | asm volatile("0: brct %0,0b" : : "d" ((loops/2) + 1)); | 24 | asm volatile("0: brct %0,0b" : : "d" ((loops/2) + 1)); | 
| 30 | } | 25 | } | 
| 31 | 26 | ||
| 32 | /* | 27 | static void __udelay_disabled(unsigned long usecs) | 
| 33 | * Waits for 'usecs' microseconds using the TOD clock comparator. | ||
| 34 | */ | ||
| 35 | void __udelay(unsigned long usecs) | ||
| 36 | { | 28 | { | 
| 37 | u64 end, time, old_cc = 0; | 29 | unsigned long mask, cr0, cr0_saved; | 
| 38 | unsigned long flags, cr0, mask, dummy; | 30 | u64 clock_saved; | 
| 39 | int irq_context; | ||
| 40 | 31 | ||
| 41 | irq_context = in_interrupt(); | 32 | clock_saved = local_tick_disable(); | 
| 42 | if (!irq_context) | 33 | set_clock_comparator(get_clock() + ((u64) usecs << 12)); | 
| 43 | local_bh_disable(); | 34 | __ctl_store(cr0_saved, 0, 0); | 
| 44 | local_irq_save(flags); | 35 | cr0 = (cr0_saved & 0xffff00e0) | 0x00000800; | 
| 45 | if (raw_irqs_disabled_flags(flags)) { | 36 | __ctl_load(cr0 , 0, 0); | 
| 46 | old_cc = local_tick_disable(); | 37 | mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT; | 
| 47 | S390_lowcore.clock_comparator = -1ULL; | 38 | trace_hardirqs_on(); | 
| 48 | __ctl_store(cr0, 0, 0); | 39 | __load_psw_mask(mask); | 
| 49 | dummy = (cr0 & 0xffff00e0) | 0x00000800; | 40 | local_irq_disable(); | 
| 50 | __ctl_load(dummy , 0, 0); | 41 | __ctl_load(cr0_saved, 0, 0); | 
| 51 | mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT; | 42 | local_tick_enable(clock_saved); | 
| 52 | } else | 43 | set_clock_comparator(S390_lowcore.clock_comparator); | 
| 53 | mask = psw_kernel_bits | PSW_MASK_WAIT | | 44 | } | 
| 54 | PSW_MASK_EXT | PSW_MASK_IO; | ||
| 55 | 45 | ||
| 46 | static void __udelay_enabled(unsigned long usecs) | ||
| 47 | { | ||
| 48 | unsigned long mask; | ||
| 49 | u64 end, time; | ||
| 50 | |||
| 51 | mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT | PSW_MASK_IO; | ||
| 56 | end = get_clock() + ((u64) usecs << 12); | 52 | end = get_clock() + ((u64) usecs << 12); | 
| 57 | do { | 53 | do { | 
| 58 | time = end < S390_lowcore.clock_comparator ? | 54 | time = end < S390_lowcore.clock_comparator ? | 
| @@ -62,13 +58,37 @@ void __udelay(unsigned long usecs) | |||
| 62 | __load_psw_mask(mask); | 58 | __load_psw_mask(mask); | 
| 63 | local_irq_disable(); | 59 | local_irq_disable(); | 
| 64 | } while (get_clock() < end); | 60 | } while (get_clock() < end); | 
| 61 | set_clock_comparator(S390_lowcore.clock_comparator); | ||
| 62 | } | ||
| 65 | 63 | ||
| 66 | if (raw_irqs_disabled_flags(flags)) { | 64 | /* | 
| 67 | __ctl_load(cr0, 0, 0); | 65 | * Waits for 'usecs' microseconds using the TOD clock comparator. | 
| 68 | local_tick_enable(old_cc); | 66 | */ | 
| 67 | void __udelay(unsigned long usecs) | ||
| 68 | { | ||
| 69 | unsigned long flags; | ||
| 70 | |||
| 71 | preempt_disable(); | ||
| 72 | local_irq_save(flags); | ||
| 73 | if (in_irq()) { | ||
| 74 | __udelay_disabled(usecs); | ||
| 75 | goto out; | ||
| 76 | } | ||
| 77 | if (in_softirq()) { | ||
| 78 | if (raw_irqs_disabled_flags(flags)) | ||
| 79 | __udelay_disabled(usecs); | ||
| 80 | else | ||
| 81 | __udelay_enabled(usecs); | ||
| 82 | goto out; | ||
| 69 | } | 83 | } | 
| 70 | if (!irq_context) | 84 | if (raw_irqs_disabled_flags(flags)) { | 
| 85 | local_bh_disable(); | ||
| 86 | __udelay_disabled(usecs); | ||
| 71 | _local_bh_enable(); | 87 | _local_bh_enable(); | 
| 72 | set_clock_comparator(S390_lowcore.clock_comparator); | 88 | goto out; | 
| 89 | } | ||
| 90 | __udelay_enabled(usecs); | ||
| 91 | out: | ||
| 73 | local_irq_restore(flags); | 92 | local_irq_restore(flags); | 
| 93 | preempt_enable(); | ||
| 74 | } | 94 | } | 
| diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index ed92864d1325..97f0d2b6dc0c 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -29,6 +29,7 @@ config X86 | |||
| 29 | select HAVE_FTRACE | 29 | select HAVE_FTRACE | 
| 30 | select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64) | 30 | select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64) | 
| 31 | select HAVE_ARCH_KGDB if !X86_VOYAGER | 31 | select HAVE_ARCH_KGDB if !X86_VOYAGER | 
| 32 | select HAVE_ARCH_TRACEHOOK | ||
| 32 | select HAVE_GENERIC_DMA_COHERENT if X86_32 | 33 | select HAVE_GENERIC_DMA_COHERENT if X86_32 | 
| 33 | select HAVE_EFFICIENT_UNALIGNED_ACCESS | 34 | select HAVE_EFFICIENT_UNALIGNED_ACCESS | 
| 34 | 35 | ||
| @@ -1020,7 +1021,7 @@ config HAVE_ARCH_ALLOC_REMAP | |||
| 1020 | 1021 | ||
| 1021 | config ARCH_FLATMEM_ENABLE | 1022 | config ARCH_FLATMEM_ENABLE | 
| 1022 | def_bool y | 1023 | def_bool y | 
| 1023 | depends on X86_32 && ARCH_SELECT_MEMORY_MODEL && X86_PC && !NUMA | 1024 | depends on X86_32 && ARCH_SELECT_MEMORY_MODEL && !NUMA | 
| 1024 | 1025 | ||
| 1025 | config ARCH_DISCONTIGMEM_ENABLE | 1026 | config ARCH_DISCONTIGMEM_ENABLE | 
| 1026 | def_bool y | 1027 | def_bool y | 
| @@ -1036,7 +1037,7 @@ config ARCH_SPARSEMEM_DEFAULT | |||
| 1036 | 1037 | ||
| 1037 | config ARCH_SPARSEMEM_ENABLE | 1038 | config ARCH_SPARSEMEM_ENABLE | 
| 1038 | def_bool y | 1039 | def_bool y | 
| 1039 | depends on X86_64 || NUMA || (EXPERIMENTAL && X86_PC) | 1040 | depends on X86_64 || NUMA || (EXPERIMENTAL && X86_PC) || X86_GENERICARCH | 
| 1040 | select SPARSEMEM_STATIC if X86_32 | 1041 | select SPARSEMEM_STATIC if X86_32 | 
| 1041 | select SPARSEMEM_VMEMMAP_ENABLE if X86_64 | 1042 | select SPARSEMEM_VMEMMAP_ENABLE if X86_64 | 
| 1042 | 1043 | ||
| @@ -1117,10 +1118,10 @@ config MTRR | |||
| 1117 | You can safely say Y even if your machine doesn't have MTRRs, you'll | 1118 | You can safely say Y even if your machine doesn't have MTRRs, you'll | 
| 1118 | just add about 9 KB to your kernel. | 1119 | just add about 9 KB to your kernel. | 
| 1119 | 1120 | ||
| 1120 | See <file:Documentation/mtrr.txt> for more information. | 1121 | See <file:Documentation/x86/mtrr.txt> for more information. | 
| 1121 | 1122 | ||
| 1122 | config MTRR_SANITIZER | 1123 | config MTRR_SANITIZER | 
| 1123 | bool | 1124 | def_bool y | 
| 1124 | prompt "MTRR cleanup support" | 1125 | prompt "MTRR cleanup support" | 
| 1125 | depends on MTRR | 1126 | depends on MTRR | 
| 1126 | help | 1127 | help | 
| @@ -1131,7 +1132,7 @@ config MTRR_SANITIZER | |||
| 1131 | The largest mtrr entry size for a continous block can be set with | 1132 | The largest mtrr entry size for a continous block can be set with | 
| 1132 | mtrr_chunk_size. | 1133 | mtrr_chunk_size. | 
| 1133 | 1134 | ||
| 1134 | If unsure, say N. | 1135 | If unsure, say Y. | 
| 1135 | 1136 | ||
| 1136 | config MTRR_SANITIZER_ENABLE_DEFAULT | 1137 | config MTRR_SANITIZER_ENABLE_DEFAULT | 
| 1137 | int "MTRR cleanup enable value (0-1)" | 1138 | int "MTRR cleanup enable value (0-1)" | 
| @@ -1191,7 +1192,6 @@ config IRQBALANCE | |||
| 1191 | config SECCOMP | 1192 | config SECCOMP | 
| 1192 | def_bool y | 1193 | def_bool y | 
| 1193 | prompt "Enable seccomp to safely compute untrusted bytecode" | 1194 | prompt "Enable seccomp to safely compute untrusted bytecode" | 
| 1194 | depends on PROC_FS | ||
| 1195 | help | 1195 | help | 
| 1196 | This kernel feature is useful for number crunching applications | 1196 | This kernel feature is useful for number crunching applications | 
| 1197 | that may need to compute untrusted bytecode during their | 1197 | that may need to compute untrusted bytecode during their | 
| @@ -1199,7 +1199,7 @@ config SECCOMP | |||
| 1199 | the process as file descriptors supporting the read/write | 1199 | the process as file descriptors supporting the read/write | 
| 1200 | syscalls, it's possible to isolate those applications in | 1200 | syscalls, it's possible to isolate those applications in | 
| 1201 | their own address space using seccomp. Once seccomp is | 1201 | their own address space using seccomp. Once seccomp is | 
| 1202 | enabled via /proc/<pid>/seccomp, it cannot be disabled | 1202 | enabled via prctl(PR_SET_SECCOMP), it cannot be disabled | 
| 1203 | and the task is only allowed to execute a few safe syscalls | 1203 | and the task is only allowed to execute a few safe syscalls | 
| 1204 | defined by each seccomp mode. | 1204 | defined by each seccomp mode. | 
| 1205 | 1205 | ||
| @@ -1356,14 +1356,14 @@ config PHYSICAL_ALIGN | |||
| 1356 | Don't change this unless you know what you are doing. | 1356 | Don't change this unless you know what you are doing. | 
| 1357 | 1357 | ||
| 1358 | config HOTPLUG_CPU | 1358 | config HOTPLUG_CPU | 
| 1359 | bool "Support for suspend on SMP and hot-pluggable CPUs (EXPERIMENTAL)" | 1359 | bool "Support for hot-pluggable CPUs" | 
| 1360 | depends on SMP && HOTPLUG && EXPERIMENTAL && !X86_VOYAGER | 1360 | depends on SMP && HOTPLUG && !X86_VOYAGER | 
| 1361 | ---help--- | 1361 | ---help--- | 
| 1362 | Say Y here to experiment with turning CPUs off and on, and to | 1362 | Say Y here to allow turning CPUs off and on. CPUs can be | 
| 1363 | enable suspend on SMP systems. CPUs can be controlled through | 1363 | controlled through /sys/devices/system/cpu. | 
| 1364 | /sys/devices/system/cpu. | 1364 | ( Note: power management support will enable this option | 
| 1365 | Say N if you want to disable CPU hotplug and don't need to | 1365 | automatically on SMP systems. ) | 
| 1366 | suspend. | 1366 | Say N if you want to disable CPU hotplug. | 
| 1367 | 1367 | ||
| 1368 | config COMPAT_VDSO | 1368 | config COMPAT_VDSO | 
| 1369 | def_bool y | 1369 | def_bool y | 
| @@ -1378,6 +1378,51 @@ config COMPAT_VDSO | |||
| 1378 | 1378 | ||
| 1379 | If unsure, say Y. | 1379 | If unsure, say Y. | 
| 1380 | 1380 | ||
| 1381 | config CMDLINE_BOOL | ||
| 1382 | bool "Built-in kernel command line" | ||
| 1383 | default n | ||
| 1384 | help | ||
| 1385 | Allow for specifying boot arguments to the kernel at | ||
| 1386 | build time. On some systems (e.g. embedded ones), it is | ||
| 1387 | necessary or convenient to provide some or all of the | ||
| 1388 | kernel boot arguments with the kernel itself (that is, | ||
| 1389 | to not rely on the boot loader to provide them.) | ||
| 1390 | |||
| 1391 | To compile command line arguments into the kernel, | ||
| 1392 | set this option to 'Y', then fill in the | ||
| 1393 | the boot arguments in CONFIG_CMDLINE. | ||
| 1394 | |||
| 1395 | Systems with fully functional boot loaders (i.e. non-embedded) | ||
| 1396 | should leave this option set to 'N'. | ||
| 1397 | |||
| 1398 | config CMDLINE | ||
| 1399 | string "Built-in kernel command string" | ||
| 1400 | depends on CMDLINE_BOOL | ||
| 1401 | default "" | ||
| 1402 | help | ||
| 1403 | Enter arguments here that should be compiled into the kernel | ||
| 1404 | image and used at boot time. If the boot loader provides a | ||
| 1405 | command line at boot time, it is appended to this string to | ||
| 1406 | form the full kernel command line, when the system boots. | ||
| 1407 | |||
| 1408 | However, you can use the CONFIG_CMDLINE_OVERRIDE option to | ||
| 1409 | change this behavior. | ||
| 1410 | |||
| 1411 | In most cases, the command line (whether built-in or provided | ||
| 1412 | by the boot loader) should specify the device for the root | ||
| 1413 | file system. | ||
| 1414 | |||
| 1415 | config CMDLINE_OVERRIDE | ||
| 1416 | bool "Built-in command line overrides boot loader arguments" | ||
| 1417 | default n | ||
| 1418 | depends on CMDLINE_BOOL | ||
| 1419 | help | ||
| 1420 | Set this option to 'Y' to have the kernel ignore the boot loader | ||
| 1421 | command line, and use ONLY the built-in command line. | ||
| 1422 | |||
| 1423 | This is used to work around broken boot loaders. This should | ||
| 1424 | be set to 'N' under normal conditions. | ||
| 1425 | |||
| 1381 | endmenu | 1426 | endmenu | 
| 1382 | 1427 | ||
| 1383 | config ARCH_ENABLE_MEMORY_HOTPLUG | 1428 | config ARCH_ENABLE_MEMORY_HOTPLUG | 
| @@ -1773,7 +1818,7 @@ config COMPAT_FOR_U64_ALIGNMENT | |||
| 1773 | 1818 | ||
| 1774 | config SYSVIPC_COMPAT | 1819 | config SYSVIPC_COMPAT | 
| 1775 | def_bool y | 1820 | def_bool y | 
| 1776 | depends on X86_64 && COMPAT && SYSVIPC | 1821 | depends on COMPAT && SYSVIPC | 
| 1777 | 1822 | ||
| 1778 | endmenu | 1823 | endmenu | 
| 1779 | 1824 | ||
| diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu index b225219c448c..60a85768cfcb 100644 --- a/arch/x86/Kconfig.cpu +++ b/arch/x86/Kconfig.cpu | |||
| @@ -418,3 +418,21 @@ config X86_MINIMUM_CPU_FAMILY | |||
| 418 | config X86_DEBUGCTLMSR | 418 | config X86_DEBUGCTLMSR | 
| 419 | def_bool y | 419 | def_bool y | 
| 420 | depends on !(MK6 || MWINCHIPC6 || MWINCHIP2 || MWINCHIP3D || MCYRIXIII || M586MMX || M586TSC || M586 || M486 || M386) | 420 | depends on !(MK6 || MWINCHIPC6 || MWINCHIP2 || MWINCHIP3D || MCYRIXIII || M586MMX || M586TSC || M586 || M486 || M386) | 
| 421 | |||
| 422 | config X86_DS | ||
| 423 | bool "Debug Store support" | ||
| 424 | default y | ||
| 425 | help | ||
| 426 | Add support for Debug Store. | ||
| 427 | This allows the kernel to provide a memory buffer to the hardware | ||
| 428 | to store various profiling and tracing events. | ||
| 429 | |||
| 430 | config X86_PTRACE_BTS | ||
| 431 | bool "ptrace interface to Branch Trace Store" | ||
| 432 | default y | ||
| 433 | depends on (X86_DS && X86_DEBUGCTLMSR) | ||
| 434 | help | ||
| 435 | Add a ptrace interface to allow collecting an execution trace | ||
| 436 | of the traced task. | ||
| 437 | This collects control flow changes in a (cyclic) buffer and allows | ||
| 438 | debuggers to fill in the gaps and show an execution trace of the debuggee. | ||
| diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S index ba7736cf2ec7..29c5fbf08392 100644 --- a/arch/x86/boot/compressed/head_32.S +++ b/arch/x86/boot/compressed/head_32.S | |||
| @@ -137,14 +137,15 @@ relocated: | |||
| 137 | */ | 137 | */ | 
| 138 | movl output_len(%ebx), %eax | 138 | movl output_len(%ebx), %eax | 
| 139 | pushl %eax | 139 | pushl %eax | 
| 140 | # push arguments for decompress_kernel: | ||
| 140 | pushl %ebp # output address | 141 | pushl %ebp # output address | 
| 141 | movl input_len(%ebx), %eax | 142 | movl input_len(%ebx), %eax | 
| 142 | pushl %eax # input_len | 143 | pushl %eax # input_len | 
| 143 | leal input_data(%ebx), %eax | 144 | leal input_data(%ebx), %eax | 
| 144 | pushl %eax # input_data | 145 | pushl %eax # input_data | 
| 145 | leal boot_heap(%ebx), %eax | 146 | leal boot_heap(%ebx), %eax | 
| 146 | pushl %eax # heap area as third argument | 147 | pushl %eax # heap area | 
| 147 | pushl %esi # real mode pointer as second arg | 148 | pushl %esi # real mode pointer | 
| 148 | call decompress_kernel | 149 | call decompress_kernel | 
| 149 | addl $20, %esp | 150 | addl $20, %esp | 
| 150 | popl %ecx | 151 | popl %ecx | 
| diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index 9fea73706479..5780d361105b 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | */ | 16 | */ | 
| 17 | #undef CONFIG_PARAVIRT | 17 | #undef CONFIG_PARAVIRT | 
| 18 | #ifdef CONFIG_X86_32 | 18 | #ifdef CONFIG_X86_32 | 
| 19 | #define _ASM_DESC_H_ 1 | 19 | #define ASM_X86__DESC_H 1 | 
| 20 | #endif | 20 | #endif | 
| 21 | 21 | ||
| 22 | #ifdef CONFIG_X86_64 | 22 | #ifdef CONFIG_X86_64 | 
| @@ -27,7 +27,7 @@ | |||
| 27 | #include <linux/linkage.h> | 27 | #include <linux/linkage.h> | 
| 28 | #include <linux/screen_info.h> | 28 | #include <linux/screen_info.h> | 
| 29 | #include <linux/elf.h> | 29 | #include <linux/elf.h> | 
| 30 | #include <asm/io.h> | 30 | #include <linux/io.h> | 
| 31 | #include <asm/page.h> | 31 | #include <asm/page.h> | 
| 32 | #include <asm/boot.h> | 32 | #include <asm/boot.h> | 
| 33 | #include <asm/bootparam.h> | 33 | #include <asm/bootparam.h> | 
| @@ -251,7 +251,7 @@ static void __putstr(int error, const char *s) | |||
| 251 | y--; | 251 | y--; | 
| 252 | } | 252 | } | 
| 253 | } else { | 253 | } else { | 
| 254 | vidmem [(x + cols * y) * 2] = c; | 254 | vidmem[(x + cols * y) * 2] = c; | 
| 255 | if (++x >= cols) { | 255 | if (++x >= cols) { | 
| 256 | x = 0; | 256 | x = 0; | 
| 257 | if (++y >= lines) { | 257 | if (++y >= lines) { | 
| @@ -277,7 +277,8 @@ static void *memset(void *s, int c, unsigned n) | |||
| 277 | int i; | 277 | int i; | 
| 278 | char *ss = s; | 278 | char *ss = s; | 
| 279 | 279 | ||
| 280 | for (i = 0; i < n; i++) ss[i] = c; | 280 | for (i = 0; i < n; i++) | 
| 281 | ss[i] = c; | ||
| 281 | return s; | 282 | return s; | 
| 282 | } | 283 | } | 
| 283 | 284 | ||
| @@ -287,7 +288,8 @@ static void *memcpy(void *dest, const void *src, unsigned n) | |||
| 287 | const char *s = src; | 288 | const char *s = src; | 
| 288 | char *d = dest; | 289 | char *d = dest; | 
| 289 | 290 | ||
| 290 | for (i = 0; i < n; i++) d[i] = s[i]; | 291 | for (i = 0; i < n; i++) | 
| 292 | d[i] = s[i]; | ||
| 291 | return dest; | 293 | return dest; | 
| 292 | } | 294 | } | 
| 293 | 295 | ||
| diff --git a/arch/x86/boot/compressed/relocs.c b/arch/x86/boot/compressed/relocs.c index a1310c52fc0c..857e492c571e 100644 --- a/arch/x86/boot/compressed/relocs.c +++ b/arch/x86/boot/compressed/relocs.c | |||
| @@ -492,7 +492,7 @@ static void walk_relocs(void (*visit)(Elf32_Rel *rel, Elf32_Sym *sym)) | |||
| 492 | continue; | 492 | continue; | 
| 493 | } | 493 | } | 
| 494 | sh_symtab = sec_symtab->symtab; | 494 | sh_symtab = sec_symtab->symtab; | 
| 495 | sym_strtab = sec->link->strtab; | 495 | sym_strtab = sec_symtab->link->strtab; | 
| 496 | for (j = 0; j < sec->shdr.sh_size/sizeof(Elf32_Rel); j++) { | 496 | for (j = 0; j < sec->shdr.sh_size/sizeof(Elf32_Rel); j++) { | 
| 497 | Elf32_Rel *rel; | 497 | Elf32_Rel *rel; | 
| 498 | Elf32_Sym *sym; | 498 | Elf32_Sym *sym; | 
| diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S index af86e431acfa..b993062e9a5f 100644 --- a/arch/x86/boot/header.S +++ b/arch/x86/boot/header.S | |||
| @@ -30,7 +30,6 @@ SYSSEG = DEF_SYSSEG /* system loaded at 0x10000 (65536) */ | |||
| 30 | SYSSIZE = DEF_SYSSIZE /* system size: # of 16-byte clicks */ | 30 | SYSSIZE = DEF_SYSSIZE /* system size: # of 16-byte clicks */ | 
| 31 | /* to be loaded */ | 31 | /* to be loaded */ | 
| 32 | ROOT_DEV = 0 /* ROOT_DEV is now written by "build" */ | 32 | ROOT_DEV = 0 /* ROOT_DEV is now written by "build" */ | 
| 33 | SWAP_DEV = 0 /* SWAP_DEV is now written by "build" */ | ||
| 34 | 33 | ||
| 35 | #ifndef SVGA_MODE | 34 | #ifndef SVGA_MODE | 
| 36 | #define SVGA_MODE ASK_VGA | 35 | #define SVGA_MODE ASK_VGA | 
| diff --git a/arch/x86/configs/i386_defconfig b/arch/x86/configs/i386_defconfig index 104275e191a8..ef9a52005ec9 100644 --- a/arch/x86/configs/i386_defconfig +++ b/arch/x86/configs/i386_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.27-rc4 | 3 | # Linux kernel version: 2.6.27-rc5 | 
| 4 | # Mon Aug 25 15:04:00 2008 | 4 | # Wed Sep 3 17:23:09 2008 | 
| 5 | # | 5 | # | 
| 6 | # CONFIG_64BIT is not set | 6 | # CONFIG_64BIT is not set | 
| 7 | CONFIG_X86_32=y | 7 | CONFIG_X86_32=y | 
| @@ -202,7 +202,7 @@ CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | |||
| 202 | # CONFIG_M586 is not set | 202 | # CONFIG_M586 is not set | 
| 203 | # CONFIG_M586TSC is not set | 203 | # CONFIG_M586TSC is not set | 
| 204 | # CONFIG_M586MMX is not set | 204 | # CONFIG_M586MMX is not set | 
| 205 | # CONFIG_M686 is not set | 205 | CONFIG_M686=y | 
| 206 | # CONFIG_MPENTIUMII is not set | 206 | # CONFIG_MPENTIUMII is not set | 
| 207 | # CONFIG_MPENTIUMIII is not set | 207 | # CONFIG_MPENTIUMIII is not set | 
| 208 | # CONFIG_MPENTIUMM is not set | 208 | # CONFIG_MPENTIUMM is not set | 
| @@ -221,13 +221,14 @@ CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | |||
| 221 | # CONFIG_MVIAC3_2 is not set | 221 | # CONFIG_MVIAC3_2 is not set | 
| 222 | # CONFIG_MVIAC7 is not set | 222 | # CONFIG_MVIAC7 is not set | 
| 223 | # CONFIG_MPSC is not set | 223 | # CONFIG_MPSC is not set | 
| 224 | CONFIG_MCORE2=y | 224 | # CONFIG_MCORE2 is not set | 
| 225 | # CONFIG_GENERIC_CPU is not set | 225 | # CONFIG_GENERIC_CPU is not set | 
| 226 | CONFIG_X86_GENERIC=y | 226 | CONFIG_X86_GENERIC=y | 
| 227 | CONFIG_X86_CPU=y | 227 | CONFIG_X86_CPU=y | 
| 228 | CONFIG_X86_CMPXCHG=y | 228 | CONFIG_X86_CMPXCHG=y | 
| 229 | CONFIG_X86_L1_CACHE_SHIFT=7 | 229 | CONFIG_X86_L1_CACHE_SHIFT=7 | 
| 230 | CONFIG_X86_XADD=y | 230 | CONFIG_X86_XADD=y | 
| 231 | # CONFIG_X86_PPRO_FENCE is not set | ||
| 231 | CONFIG_X86_WP_WORKS_OK=y | 232 | CONFIG_X86_WP_WORKS_OK=y | 
| 232 | CONFIG_X86_INVLPG=y | 233 | CONFIG_X86_INVLPG=y | 
| 233 | CONFIG_X86_BSWAP=y | 234 | CONFIG_X86_BSWAP=y | 
| @@ -235,14 +236,15 @@ CONFIG_X86_POPAD_OK=y | |||
| 235 | CONFIG_X86_INTEL_USERCOPY=y | 236 | CONFIG_X86_INTEL_USERCOPY=y | 
| 236 | CONFIG_X86_USE_PPRO_CHECKSUM=y | 237 | CONFIG_X86_USE_PPRO_CHECKSUM=y | 
| 237 | CONFIG_X86_TSC=y | 238 | CONFIG_X86_TSC=y | 
| 239 | CONFIG_X86_CMOV=y | ||
| 238 | CONFIG_X86_MINIMUM_CPU_FAMILY=4 | 240 | CONFIG_X86_MINIMUM_CPU_FAMILY=4 | 
| 239 | CONFIG_X86_DEBUGCTLMSR=y | 241 | CONFIG_X86_DEBUGCTLMSR=y | 
| 240 | CONFIG_HPET_TIMER=y | 242 | CONFIG_HPET_TIMER=y | 
| 241 | CONFIG_HPET_EMULATE_RTC=y | 243 | CONFIG_HPET_EMULATE_RTC=y | 
| 242 | CONFIG_DMI=y | 244 | CONFIG_DMI=y | 
| 243 | # CONFIG_IOMMU_HELPER is not set | 245 | # CONFIG_IOMMU_HELPER is not set | 
| 244 | CONFIG_NR_CPUS=4 | 246 | CONFIG_NR_CPUS=64 | 
| 245 | # CONFIG_SCHED_SMT is not set | 247 | CONFIG_SCHED_SMT=y | 
| 246 | CONFIG_SCHED_MC=y | 248 | CONFIG_SCHED_MC=y | 
| 247 | # CONFIG_PREEMPT_NONE is not set | 249 | # CONFIG_PREEMPT_NONE is not set | 
| 248 | CONFIG_PREEMPT_VOLUNTARY=y | 250 | CONFIG_PREEMPT_VOLUNTARY=y | 
| @@ -254,7 +256,8 @@ CONFIG_VM86=y | |||
| 254 | # CONFIG_TOSHIBA is not set | 256 | # CONFIG_TOSHIBA is not set | 
| 255 | # CONFIG_I8K is not set | 257 | # CONFIG_I8K is not set | 
| 256 | CONFIG_X86_REBOOTFIXUPS=y | 258 | CONFIG_X86_REBOOTFIXUPS=y | 
| 257 | # CONFIG_MICROCODE is not set | 259 | CONFIG_MICROCODE=y | 
| 260 | CONFIG_MICROCODE_OLD_INTERFACE=y | ||
| 258 | CONFIG_X86_MSR=y | 261 | CONFIG_X86_MSR=y | 
| 259 | CONFIG_X86_CPUID=y | 262 | CONFIG_X86_CPUID=y | 
| 260 | # CONFIG_NOHIGHMEM is not set | 263 | # CONFIG_NOHIGHMEM is not set | 
| @@ -2115,7 +2118,7 @@ CONFIG_IO_DELAY_0X80=y | |||
| 2115 | CONFIG_DEFAULT_IO_DELAY_TYPE=0 | 2118 | CONFIG_DEFAULT_IO_DELAY_TYPE=0 | 
| 2116 | CONFIG_DEBUG_BOOT_PARAMS=y | 2119 | CONFIG_DEBUG_BOOT_PARAMS=y | 
| 2117 | # CONFIG_CPA_DEBUG is not set | 2120 | # CONFIG_CPA_DEBUG is not set | 
| 2118 | # CONFIG_OPTIMIZE_INLINING is not set | 2121 | CONFIG_OPTIMIZE_INLINING=y | 
| 2119 | 2122 | ||
| 2120 | # | 2123 | # | 
| 2121 | # Security options | 2124 | # Security options | 
| diff --git a/arch/x86/configs/x86_64_defconfig b/arch/x86/configs/x86_64_defconfig index 678c8acefe04..e620ea6e2a7a 100644 --- a/arch/x86/configs/x86_64_defconfig +++ b/arch/x86/configs/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.27-rc4 | 3 | # Linux kernel version: 2.6.27-rc5 | 
| 4 | # Mon Aug 25 14:40:46 2008 | 4 | # Wed Sep 3 17:13:39 2008 | 
| 5 | # | 5 | # | 
| 6 | CONFIG_64BIT=y | 6 | CONFIG_64BIT=y | 
| 7 | # CONFIG_X86_32 is not set | 7 | # CONFIG_X86_32 is not set | 
| @@ -218,17 +218,14 @@ CONFIG_X86_PC=y | |||
| 218 | # CONFIG_MVIAC3_2 is not set | 218 | # CONFIG_MVIAC3_2 is not set | 
| 219 | # CONFIG_MVIAC7 is not set | 219 | # CONFIG_MVIAC7 is not set | 
| 220 | # CONFIG_MPSC is not set | 220 | # CONFIG_MPSC is not set | 
| 221 | CONFIG_MCORE2=y | 221 | # CONFIG_MCORE2 is not set | 
| 222 | # CONFIG_GENERIC_CPU is not set | 222 | CONFIG_GENERIC_CPU=y | 
| 223 | CONFIG_X86_CPU=y | 223 | CONFIG_X86_CPU=y | 
| 224 | CONFIG_X86_L1_CACHE_BYTES=64 | 224 | CONFIG_X86_L1_CACHE_BYTES=128 | 
| 225 | CONFIG_X86_INTERNODE_CACHE_BYTES=64 | 225 | CONFIG_X86_INTERNODE_CACHE_BYTES=128 | 
| 226 | CONFIG_X86_CMPXCHG=y | 226 | CONFIG_X86_CMPXCHG=y | 
| 227 | CONFIG_X86_L1_CACHE_SHIFT=6 | 227 | CONFIG_X86_L1_CACHE_SHIFT=7 | 
| 228 | CONFIG_X86_WP_WORKS_OK=y | 228 | CONFIG_X86_WP_WORKS_OK=y | 
| 229 | CONFIG_X86_INTEL_USERCOPY=y | ||
| 230 | CONFIG_X86_USE_PPRO_CHECKSUM=y | ||
| 231 | CONFIG_X86_P6_NOP=y | ||
| 232 | CONFIG_X86_TSC=y | 229 | CONFIG_X86_TSC=y | 
| 233 | CONFIG_X86_CMPXCHG64=y | 230 | CONFIG_X86_CMPXCHG64=y | 
| 234 | CONFIG_X86_CMOV=y | 231 | CONFIG_X86_CMOV=y | 
| @@ -243,9 +240,8 @@ CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT=y | |||
| 243 | CONFIG_AMD_IOMMU=y | 240 | CONFIG_AMD_IOMMU=y | 
| 244 | CONFIG_SWIOTLB=y | 241 | CONFIG_SWIOTLB=y | 
| 245 | CONFIG_IOMMU_HELPER=y | 242 | CONFIG_IOMMU_HELPER=y | 
| 246 | # CONFIG_MAXSMP is not set | 243 | CONFIG_NR_CPUS=64 | 
| 247 | CONFIG_NR_CPUS=4 | 244 | CONFIG_SCHED_SMT=y | 
| 248 | # CONFIG_SCHED_SMT is not set | ||
| 249 | CONFIG_SCHED_MC=y | 245 | CONFIG_SCHED_MC=y | 
| 250 | # CONFIG_PREEMPT_NONE is not set | 246 | # CONFIG_PREEMPT_NONE is not set | 
| 251 | CONFIG_PREEMPT_VOLUNTARY=y | 247 | CONFIG_PREEMPT_VOLUNTARY=y | 
| @@ -254,7 +250,8 @@ CONFIG_X86_LOCAL_APIC=y | |||
| 254 | CONFIG_X86_IO_APIC=y | 250 | CONFIG_X86_IO_APIC=y | 
| 255 | # CONFIG_X86_MCE is not set | 251 | # CONFIG_X86_MCE is not set | 
| 256 | # CONFIG_I8K is not set | 252 | # CONFIG_I8K is not set | 
| 257 | # CONFIG_MICROCODE is not set | 253 | CONFIG_MICROCODE=y | 
| 254 | CONFIG_MICROCODE_OLD_INTERFACE=y | ||
| 258 | CONFIG_X86_MSR=y | 255 | CONFIG_X86_MSR=y | 
| 259 | CONFIG_X86_CPUID=y | 256 | CONFIG_X86_CPUID=y | 
| 260 | CONFIG_NUMA=y | 257 | CONFIG_NUMA=y | 
| @@ -290,7 +287,7 @@ CONFIG_BOUNCE=y | |||
| 290 | CONFIG_VIRT_TO_BUS=y | 287 | CONFIG_VIRT_TO_BUS=y | 
| 291 | CONFIG_MTRR=y | 288 | CONFIG_MTRR=y | 
| 292 | # CONFIG_MTRR_SANITIZER is not set | 289 | # CONFIG_MTRR_SANITIZER is not set | 
| 293 | # CONFIG_X86_PAT is not set | 290 | CONFIG_X86_PAT=y | 
| 294 | CONFIG_EFI=y | 291 | CONFIG_EFI=y | 
| 295 | CONFIG_SECCOMP=y | 292 | CONFIG_SECCOMP=y | 
| 296 | # CONFIG_HZ_100 is not set | 293 | # CONFIG_HZ_100 is not set | 
| @@ -2089,7 +2086,7 @@ CONFIG_IO_DELAY_0X80=y | |||
| 2089 | CONFIG_DEFAULT_IO_DELAY_TYPE=0 | 2086 | CONFIG_DEFAULT_IO_DELAY_TYPE=0 | 
| 2090 | CONFIG_DEBUG_BOOT_PARAMS=y | 2087 | CONFIG_DEBUG_BOOT_PARAMS=y | 
| 2091 | # CONFIG_CPA_DEBUG is not set | 2088 | # CONFIG_CPA_DEBUG is not set | 
| 2092 | # CONFIG_OPTIMIZE_INLINING is not set | 2089 | CONFIG_OPTIMIZE_INLINING=y | 
| 2093 | 2090 | ||
| 2094 | # | 2091 | # | 
| 2095 | # Security options | 2092 | # Security options | 
| diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c index a0e1dbe67dc1..127ec3f07214 100644 --- a/arch/x86/ia32/ia32_aout.c +++ b/arch/x86/ia32/ia32_aout.c | |||
| @@ -85,8 +85,10 @@ static void dump_thread32(struct pt_regs *regs, struct user32 *dump) | |||
| 85 | dump->regs.ax = regs->ax; | 85 | dump->regs.ax = regs->ax; | 
| 86 | dump->regs.ds = current->thread.ds; | 86 | dump->regs.ds = current->thread.ds; | 
| 87 | dump->regs.es = current->thread.es; | 87 | dump->regs.es = current->thread.es; | 
| 88 | asm("movl %%fs,%0" : "=r" (fs)); dump->regs.fs = fs; | 88 | savesegment(fs, fs); | 
| 89 | asm("movl %%gs,%0" : "=r" (gs)); dump->regs.gs = gs; | 89 | dump->regs.fs = fs; | 
| 90 | savesegment(gs, gs); | ||
| 91 | dump->regs.gs = gs; | ||
| 90 | dump->regs.orig_ax = regs->orig_ax; | 92 | dump->regs.orig_ax = regs->orig_ax; | 
| 91 | dump->regs.ip = regs->ip; | 93 | dump->regs.ip = regs->ip; | 
| 92 | dump->regs.cs = regs->cs; | 94 | dump->regs.cs = regs->cs; | 
| @@ -430,8 +432,9 @@ beyond_if: | |||
| 430 | current->mm->start_stack = | 432 | current->mm->start_stack = | 
| 431 | (unsigned long)create_aout_tables((char __user *)bprm->p, bprm); | 433 | (unsigned long)create_aout_tables((char __user *)bprm->p, bprm); | 
| 432 | /* start thread */ | 434 | /* start thread */ | 
| 433 | asm volatile("movl %0,%%fs" :: "r" (0)); \ | 435 | loadsegment(fs, 0); | 
| 434 | asm volatile("movl %0,%%es; movl %0,%%ds": :"r" (__USER32_DS)); | 436 | loadsegment(ds, __USER32_DS); | 
| 437 | loadsegment(es, __USER32_DS); | ||
| 435 | load_gs_index(0); | 438 | load_gs_index(0); | 
| 436 | (regs)->ip = ex.a_entry; | 439 | (regs)->ip = ex.a_entry; | 
| 437 | (regs)->sp = current->mm->start_stack; | 440 | (regs)->sp = current->mm->start_stack; | 
| diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c index 20af4c79579a..f1a2ac777faf 100644 --- a/arch/x86/ia32/ia32_signal.c +++ b/arch/x86/ia32/ia32_signal.c | |||
| @@ -206,7 +206,7 @@ struct rt_sigframe | |||
| 206 | { unsigned int cur; \ | 206 | { unsigned int cur; \ | 
| 207 | unsigned short pre; \ | 207 | unsigned short pre; \ | 
| 208 | err |= __get_user(pre, &sc->seg); \ | 208 | err |= __get_user(pre, &sc->seg); \ | 
| 209 | asm volatile("movl %%" #seg ",%0" : "=r" (cur)); \ | 209 | savesegment(seg, cur); \ | 
| 210 | pre |= mask; \ | 210 | pre |= mask; \ | 
| 211 | if (pre != cur) loadsegment(seg, pre); } | 211 | if (pre != cur) loadsegment(seg, pre); } | 
| 212 | 212 | ||
| @@ -235,7 +235,7 @@ static int ia32_restore_sigcontext(struct pt_regs *regs, | |||
| 235 | */ | 235 | */ | 
| 236 | err |= __get_user(gs, &sc->gs); | 236 | err |= __get_user(gs, &sc->gs); | 
| 237 | gs |= 3; | 237 | gs |= 3; | 
| 238 | asm("movl %%gs,%0" : "=r" (oldgs)); | 238 | savesegment(gs, oldgs); | 
| 239 | if (gs != oldgs) | 239 | if (gs != oldgs) | 
| 240 | load_gs_index(gs); | 240 | load_gs_index(gs); | 
| 241 | 241 | ||
| @@ -355,14 +355,13 @@ static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc, | |||
| 355 | { | 355 | { | 
| 356 | int tmp, err = 0; | 356 | int tmp, err = 0; | 
| 357 | 357 | ||
| 358 | tmp = 0; | 358 | savesegment(gs, tmp); | 
| 359 | __asm__("movl %%gs,%0" : "=r"(tmp): "0"(tmp)); | ||
| 360 | err |= __put_user(tmp, (unsigned int __user *)&sc->gs); | 359 | err |= __put_user(tmp, (unsigned int __user *)&sc->gs); | 
| 361 | __asm__("movl %%fs,%0" : "=r"(tmp): "0"(tmp)); | 360 | savesegment(fs, tmp); | 
| 362 | err |= __put_user(tmp, (unsigned int __user *)&sc->fs); | 361 | err |= __put_user(tmp, (unsigned int __user *)&sc->fs); | 
| 363 | __asm__("movl %%ds,%0" : "=r"(tmp): "0"(tmp)); | 362 | savesegment(ds, tmp); | 
| 364 | err |= __put_user(tmp, (unsigned int __user *)&sc->ds); | 363 | err |= __put_user(tmp, (unsigned int __user *)&sc->ds); | 
| 365 | __asm__("movl %%es,%0" : "=r"(tmp): "0"(tmp)); | 364 | savesegment(es, tmp); | 
| 366 | err |= __put_user(tmp, (unsigned int __user *)&sc->es); | 365 | err |= __put_user(tmp, (unsigned int __user *)&sc->es); | 
| 367 | 366 | ||
| 368 | err |= __put_user((u32)regs->di, &sc->di); | 367 | err |= __put_user((u32)regs->di, &sc->di); | 
| @@ -498,8 +497,8 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka, | |||
| 498 | regs->dx = 0; | 497 | regs->dx = 0; | 
| 499 | regs->cx = 0; | 498 | regs->cx = 0; | 
| 500 | 499 | ||
| 501 | asm volatile("movl %0,%%ds" :: "r" (__USER32_DS)); | 500 | loadsegment(ds, __USER32_DS); | 
| 502 | asm volatile("movl %0,%%es" :: "r" (__USER32_DS)); | 501 | loadsegment(es, __USER32_DS); | 
| 503 | 502 | ||
| 504 | regs->cs = __USER32_CS; | 503 | regs->cs = __USER32_CS; | 
| 505 | regs->ss = __USER32_DS; | 504 | regs->ss = __USER32_DS; | 
| @@ -591,8 +590,8 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 591 | regs->dx = (unsigned long) &frame->info; | 590 | regs->dx = (unsigned long) &frame->info; | 
| 592 | regs->cx = (unsigned long) &frame->uc; | 591 | regs->cx = (unsigned long) &frame->uc; | 
| 593 | 592 | ||
| 594 | asm volatile("movl %0,%%ds" :: "r" (__USER32_DS)); | 593 | loadsegment(ds, __USER32_DS); | 
| 595 | asm volatile("movl %0,%%es" :: "r" (__USER32_DS)); | 594 | loadsegment(es, __USER32_DS); | 
| 596 | 595 | ||
| 597 | regs->cs = __USER32_CS; | 596 | regs->cs = __USER32_CS; | 
| 598 | regs->ss = __USER32_DS; | 597 | regs->ss = __USER32_DS; | 
| diff --git a/arch/x86/ia32/sys_ia32.c b/arch/x86/ia32/sys_ia32.c index d3c64088b981..beda4232ce69 100644 --- a/arch/x86/ia32/sys_ia32.c +++ b/arch/x86/ia32/sys_ia32.c | |||
| @@ -556,15 +556,6 @@ asmlinkage long sys32_rt_sigqueueinfo(int pid, int sig, | |||
| 556 | return ret; | 556 | return ret; | 
| 557 | } | 557 | } | 
| 558 | 558 | ||
| 559 | /* These are here just in case some old ia32 binary calls it. */ | ||
| 560 | asmlinkage long sys32_pause(void) | ||
| 561 | { | ||
| 562 | current->state = TASK_INTERRUPTIBLE; | ||
| 563 | schedule(); | ||
| 564 | return -ERESTARTNOHAND; | ||
| 565 | } | ||
| 566 | |||
| 567 | |||
| 568 | #ifdef CONFIG_SYSCTL_SYSCALL | 559 | #ifdef CONFIG_SYSCTL_SYSCALL | 
| 569 | struct sysctl_ia32 { | 560 | struct sysctl_ia32 { | 
| 570 | unsigned int name; | 561 | unsigned int name; | 
| diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index bfd10fd211cd..e5032d7b391d 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -58,7 +58,6 @@ EXPORT_SYMBOL(acpi_disabled); | |||
| 58 | #ifdef CONFIG_X86_64 | 58 | #ifdef CONFIG_X86_64 | 
| 59 | 59 | ||
| 60 | #include <asm/proto.h> | 60 | #include <asm/proto.h> | 
| 61 | #include <asm/genapic.h> | ||
| 62 | 61 | ||
| 63 | #else /* X86 */ | 62 | #else /* X86 */ | 
| 64 | 63 | ||
| @@ -97,8 +96,6 @@ static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; | |||
| 97 | #warning ACPI uses CMPXCHG, i486 and later hardware | 96 | #warning ACPI uses CMPXCHG, i486 and later hardware | 
| 98 | #endif | 97 | #endif | 
| 99 | 98 | ||
| 100 | static int acpi_mcfg_64bit_base_addr __initdata = FALSE; | ||
| 101 | |||
| 102 | /* -------------------------------------------------------------------------- | 99 | /* -------------------------------------------------------------------------- | 
| 103 | Boot-time Configuration | 100 | Boot-time Configuration | 
| 104 | -------------------------------------------------------------------------- */ | 101 | -------------------------------------------------------------------------- */ | 
| @@ -160,6 +157,8 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size) | |||
| 160 | struct acpi_mcfg_allocation *pci_mmcfg_config; | 157 | struct acpi_mcfg_allocation *pci_mmcfg_config; | 
| 161 | int pci_mmcfg_config_num; | 158 | int pci_mmcfg_config_num; | 
| 162 | 159 | ||
| 160 | static int acpi_mcfg_64bit_base_addr __initdata = FALSE; | ||
| 161 | |||
| 163 | static int __init acpi_mcfg_oem_check(struct acpi_table_mcfg *mcfg) | 162 | static int __init acpi_mcfg_oem_check(struct acpi_table_mcfg *mcfg) | 
| 164 | { | 163 | { | 
| 165 | if (!strcmp(mcfg->header.oem_id, "SGI")) | 164 | if (!strcmp(mcfg->header.oem_id, "SGI")) | 
| diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index 65a0c1b48696..fb04e49776ba 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c | |||
| @@ -231,25 +231,25 @@ static void alternatives_smp_lock(u8 **start, u8 **end, u8 *text, u8 *text_end) | |||
| 231 | continue; | 231 | continue; | 
| 232 | if (*ptr > text_end) | 232 | if (*ptr > text_end) | 
| 233 | continue; | 233 | continue; | 
| 234 | text_poke(*ptr, ((unsigned char []){0xf0}), 1); /* add lock prefix */ | 234 | /* turn DS segment override prefix into lock prefix */ | 
| 235 | text_poke(*ptr, ((unsigned char []){0xf0}), 1); | ||
| 235 | }; | 236 | }; | 
| 236 | } | 237 | } | 
| 237 | 238 | ||
| 238 | static void alternatives_smp_unlock(u8 **start, u8 **end, u8 *text, u8 *text_end) | 239 | static void alternatives_smp_unlock(u8 **start, u8 **end, u8 *text, u8 *text_end) | 
| 239 | { | 240 | { | 
| 240 | u8 **ptr; | 241 | u8 **ptr; | 
| 241 | char insn[1]; | ||
| 242 | 242 | ||
| 243 | if (noreplace_smp) | 243 | if (noreplace_smp) | 
| 244 | return; | 244 | return; | 
| 245 | 245 | ||
| 246 | add_nops(insn, 1); | ||
| 247 | for (ptr = start; ptr < end; ptr++) { | 246 | for (ptr = start; ptr < end; ptr++) { | 
| 248 | if (*ptr < text) | 247 | if (*ptr < text) | 
| 249 | continue; | 248 | continue; | 
| 250 | if (*ptr > text_end) | 249 | if (*ptr > text_end) | 
| 251 | continue; | 250 | continue; | 
| 252 | text_poke(*ptr, insn, 1); | 251 | /* turn lock prefix into DS segment override prefix */ | 
| 252 | text_poke(*ptr, ((unsigned char []){0x3E}), 1); | ||
| 253 | }; | 253 | }; | 
| 254 | } | 254 | } | 
| 255 | 255 | ||
| diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c index 44e21826db11..9a32b37ee2ee 100644 --- a/arch/x86/kernel/aperture_64.c +++ b/arch/x86/kernel/aperture_64.c | |||
| @@ -455,11 +455,11 @@ out: | |||
| 455 | force_iommu || | 455 | force_iommu || | 
| 456 | valid_agp || | 456 | valid_agp || | 
| 457 | fallback_aper_force) { | 457 | fallback_aper_force) { | 
| 458 | printk(KERN_ERR | 458 | printk(KERN_INFO | 
| 459 | "Your BIOS doesn't leave a aperture memory hole\n"); | 459 | "Your BIOS doesn't leave a aperture memory hole\n"); | 
| 460 | printk(KERN_ERR | 460 | printk(KERN_INFO | 
| 461 | "Please enable the IOMMU option in the BIOS setup\n"); | 461 | "Please enable the IOMMU option in the BIOS setup\n"); | 
| 462 | printk(KERN_ERR | 462 | printk(KERN_INFO | 
| 463 | "This costs you %d MB of RAM\n", | 463 | "This costs you %d MB of RAM\n", | 
| 464 | 32 << fallback_aper_order); | 464 | 32 << fallback_aper_order); | 
| 465 | 465 | ||
| diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c index 732d1f4e10ee..5145a6e72bbb 100644 --- a/arch/x86/kernel/apm_32.c +++ b/arch/x86/kernel/apm_32.c | |||
| @@ -228,7 +228,6 @@ | |||
| 228 | #include <linux/suspend.h> | 228 | #include <linux/suspend.h> | 
| 229 | #include <linux/kthread.h> | 229 | #include <linux/kthread.h> | 
| 230 | #include <linux/jiffies.h> | 230 | #include <linux/jiffies.h> | 
| 231 | #include <linux/smp_lock.h> | ||
| 232 | 231 | ||
| 233 | #include <asm/system.h> | 232 | #include <asm/system.h> | 
| 234 | #include <asm/uaccess.h> | 233 | #include <asm/uaccess.h> | 
| diff --git a/arch/x86/kernel/asm-offsets_64.c b/arch/x86/kernel/asm-offsets_64.c index aa89387006fe..505543a75a56 100644 --- a/arch/x86/kernel/asm-offsets_64.c +++ b/arch/x86/kernel/asm-offsets_64.c | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | 22 | ||
| 23 | #define __NO_STUBS 1 | 23 | #define __NO_STUBS 1 | 
| 24 | #undef __SYSCALL | 24 | #undef __SYSCALL | 
| 25 | #undef _ASM_X86_64_UNISTD_H_ | 25 | #undef ASM_X86__UNISTD_64_H | 
| 26 | #define __SYSCALL(nr, sym) [nr] = 1, | 26 | #define __SYSCALL(nr, sym) [nr] = 1, | 
| 27 | static char syscalls[] = { | 27 | static char syscalls[] = { | 
| 28 | #include <asm/unistd.h> | 28 | #include <asm/unistd.h> | 
| diff --git a/arch/x86/kernel/bios_uv.c b/arch/x86/kernel/bios_uv.c index c639bd55391c..fdd585f9c53d 100644 --- a/arch/x86/kernel/bios_uv.c +++ b/arch/x86/kernel/bios_uv.c | |||
| @@ -25,11 +25,11 @@ x86_bios_strerror(long status) | |||
| 25 | { | 25 | { | 
| 26 | const char *str; | 26 | const char *str; | 
| 27 | switch (status) { | 27 | switch (status) { | 
| 28 | case 0: str = "Call completed without error"; break; | 28 | case 0: str = "Call completed without error"; break; | 
| 29 | case -1: str = "Not implemented"; break; | 29 | case -1: str = "Not implemented"; break; | 
| 30 | case -2: str = "Invalid argument"; break; | 30 | case -2: str = "Invalid argument"; break; | 
| 31 | case -3: str = "Call completed with error"; break; | 31 | case -3: str = "Call completed with error"; break; | 
| 32 | default: str = "Unknown BIOS status code"; break; | 32 | default: str = "Unknown BIOS status code"; break; | 
| 33 | } | 33 | } | 
| 34 | return str; | 34 | return str; | 
| 35 | } | 35 | } | 
| diff --git a/arch/x86/kernel/cpu/common_64.c b/arch/x86/kernel/cpu/common_64.c index a11f5d4477cd..305b465889b0 100644 --- a/arch/x86/kernel/cpu/common_64.c +++ b/arch/x86/kernel/cpu/common_64.c | |||
| @@ -430,6 +430,49 @@ static __init int setup_noclflush(char *arg) | |||
| 430 | } | 430 | } | 
| 431 | __setup("noclflush", setup_noclflush); | 431 | __setup("noclflush", setup_noclflush); | 
| 432 | 432 | ||
| 433 | struct msr_range { | ||
| 434 | unsigned min; | ||
| 435 | unsigned max; | ||
| 436 | }; | ||
| 437 | |||
| 438 | static struct msr_range msr_range_array[] __cpuinitdata = { | ||
| 439 | { 0x00000000, 0x00000418}, | ||
| 440 | { 0xc0000000, 0xc000040b}, | ||
| 441 | { 0xc0010000, 0xc0010142}, | ||
| 442 | { 0xc0011000, 0xc001103b}, | ||
| 443 | }; | ||
| 444 | |||
| 445 | static void __cpuinit print_cpu_msr(void) | ||
| 446 | { | ||
| 447 | unsigned index; | ||
| 448 | u64 val; | ||
| 449 | int i; | ||
| 450 | unsigned index_min, index_max; | ||
| 451 | |||
| 452 | for (i = 0; i < ARRAY_SIZE(msr_range_array); i++) { | ||
| 453 | index_min = msr_range_array[i].min; | ||
| 454 | index_max = msr_range_array[i].max; | ||
| 455 | for (index = index_min; index < index_max; index++) { | ||
| 456 | if (rdmsrl_amd_safe(index, &val)) | ||
| 457 | continue; | ||
| 458 | printk(KERN_INFO " MSR%08x: %016llx\n", index, val); | ||
| 459 | } | ||
| 460 | } | ||
| 461 | } | ||
| 462 | |||
| 463 | static int show_msr __cpuinitdata; | ||
| 464 | static __init int setup_show_msr(char *arg) | ||
| 465 | { | ||
| 466 | int num; | ||
| 467 | |||
| 468 | get_option(&arg, &num); | ||
| 469 | |||
| 470 | if (num > 0) | ||
| 471 | show_msr = num; | ||
| 472 | return 1; | ||
| 473 | } | ||
| 474 | __setup("show_msr=", setup_show_msr); | ||
| 475 | |||
| 433 | void __cpuinit print_cpu_info(struct cpuinfo_x86 *c) | 476 | void __cpuinit print_cpu_info(struct cpuinfo_x86 *c) | 
| 434 | { | 477 | { | 
| 435 | if (c->x86_model_id[0]) | 478 | if (c->x86_model_id[0]) | 
| @@ -439,6 +482,14 @@ void __cpuinit print_cpu_info(struct cpuinfo_x86 *c) | |||
| 439 | printk(KERN_CONT " stepping %02x\n", c->x86_mask); | 482 | printk(KERN_CONT " stepping %02x\n", c->x86_mask); | 
| 440 | else | 483 | else | 
| 441 | printk(KERN_CONT "\n"); | 484 | printk(KERN_CONT "\n"); | 
| 485 | |||
| 486 | #ifdef CONFIG_SMP | ||
| 487 | if (c->cpu_index < show_msr) | ||
| 488 | print_cpu_msr(); | ||
| 489 | #else | ||
| 490 | if (show_msr) | ||
| 491 | print_cpu_msr(); | ||
| 492 | #endif | ||
| 442 | } | 493 | } | 
| 443 | 494 | ||
| 444 | static __init int setup_disablecpuid(char *arg) | 495 | static __init int setup_disablecpuid(char *arg) | 
| diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index b75f2569b8f8..f113ef4595f6 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
| @@ -222,10 +222,11 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c) | |||
| 222 | set_cpu_cap(c, X86_FEATURE_BTS); | 222 | set_cpu_cap(c, X86_FEATURE_BTS); | 
| 223 | if (!(l1 & (1<<12))) | 223 | if (!(l1 & (1<<12))) | 
| 224 | set_cpu_cap(c, X86_FEATURE_PEBS); | 224 | set_cpu_cap(c, X86_FEATURE_PEBS); | 
| 225 | ds_init_intel(c); | ||
| 225 | } | 226 | } | 
| 226 | 227 | ||
| 227 | if (cpu_has_bts) | 228 | if (cpu_has_bts) | 
| 228 | ds_init_intel(c); | 229 | ptrace_bts_init_intel(c); | 
| 229 | 230 | ||
| 230 | /* | 231 | /* | 
| 231 | * See if we have a good local APIC by checking for buggy Pentia, | 232 | * See if we have a good local APIC by checking for buggy Pentia, | 
| diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c index cb7d3b6a80eb..4e8d77f01eeb 100644 --- a/arch/x86/kernel/cpu/mtrr/generic.c +++ b/arch/x86/kernel/cpu/mtrr/generic.c | |||
| @@ -401,12 +401,7 @@ static void generic_get_mtrr(unsigned int reg, unsigned long *base, | |||
| 401 | tmp |= ~((1<<(hi - 1)) - 1); | 401 | tmp |= ~((1<<(hi - 1)) - 1); | 
| 402 | 402 | ||
| 403 | if (tmp != mask_lo) { | 403 | if (tmp != mask_lo) { | 
| 404 | static int once = 1; | 404 | WARN_ONCE(1, KERN_INFO "mtrr: your BIOS has set up an incorrect mask, fixing it up.\n"); | 
| 405 | |||
| 406 | if (once) { | ||
| 407 | printk(KERN_INFO "mtrr: your BIOS has set up an incorrect mask, fixing it up.\n"); | ||
| 408 | once = 0; | ||
| 409 | } | ||
| 410 | mask_lo = tmp; | 405 | mask_lo = tmp; | 
| 411 | } | 406 | } | 
| 412 | } | 407 | } | 
| diff --git a/arch/x86/kernel/cpu/mtrr/if.c b/arch/x86/kernel/cpu/mtrr/if.c index 84c480bb3715..4c4214690dd1 100644 --- a/arch/x86/kernel/cpu/mtrr/if.c +++ b/arch/x86/kernel/cpu/mtrr/if.c | |||
| @@ -405,9 +405,9 @@ static int mtrr_seq_show(struct seq_file *seq, void *offset) | |||
| 405 | } | 405 | } | 
| 406 | /* RED-PEN: base can be > 32bit */ | 406 | /* RED-PEN: base can be > 32bit */ | 
| 407 | len += seq_printf(seq, | 407 | len += seq_printf(seq, | 
| 408 | "reg%02i: base=0x%05lx000 (%4luMB), size=%4lu%cB: %s, count=%d\n", | 408 | "reg%02i: base=0x%06lx000 (%5luMB), size=%5lu%cB, count=%d: %s\n", | 
| 409 | i, base, base >> (20 - PAGE_SHIFT), size, factor, | 409 | i, base, base >> (20 - PAGE_SHIFT), size, factor, | 
| 410 | mtrr_attrib_to_str(type), mtrr_usage_table[i]); | 410 | mtrr_usage_table[i], mtrr_attrib_to_str(type)); | 
| 411 | } | 411 | } | 
| 412 | } | 412 | } | 
| 413 | return 0; | 413 | return 0; | 
| diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c index b117d7f8a564..c78c04821ea1 100644 --- a/arch/x86/kernel/cpu/mtrr/main.c +++ b/arch/x86/kernel/cpu/mtrr/main.c | |||
| @@ -729,7 +729,7 @@ struct var_mtrr_range_state { | |||
| 729 | mtrr_type type; | 729 | mtrr_type type; | 
| 730 | }; | 730 | }; | 
| 731 | 731 | ||
| 732 | struct var_mtrr_range_state __initdata range_state[RANGE_NUM]; | 732 | static struct var_mtrr_range_state __initdata range_state[RANGE_NUM]; | 
| 733 | static int __initdata debug_print; | 733 | static int __initdata debug_print; | 
| 734 | 734 | ||
| 735 | static int __init | 735 | static int __init | 
| @@ -759,7 +759,8 @@ x86_get_mtrr_mem_range(struct res_range *range, int nr_range, | |||
| 759 | /* take out UC ranges */ | 759 | /* take out UC ranges */ | 
| 760 | for (i = 0; i < num_var_ranges; i++) { | 760 | for (i = 0; i < num_var_ranges; i++) { | 
| 761 | type = range_state[i].type; | 761 | type = range_state[i].type; | 
| 762 | if (type != MTRR_TYPE_UNCACHABLE) | 762 | if (type != MTRR_TYPE_UNCACHABLE && | 
| 763 | type != MTRR_TYPE_WRPROT) | ||
| 763 | continue; | 764 | continue; | 
| 764 | size = range_state[i].size_pfn; | 765 | size = range_state[i].size_pfn; | 
| 765 | if (!size) | 766 | if (!size) | 
| @@ -834,7 +835,14 @@ static int __init enable_mtrr_cleanup_setup(char *str) | |||
| 834 | enable_mtrr_cleanup = 1; | 835 | enable_mtrr_cleanup = 1; | 
| 835 | return 0; | 836 | return 0; | 
| 836 | } | 837 | } | 
| 837 | early_param("enble_mtrr_cleanup", enable_mtrr_cleanup_setup); | 838 | early_param("enable_mtrr_cleanup", enable_mtrr_cleanup_setup); | 
| 839 | |||
| 840 | static int __init mtrr_cleanup_debug_setup(char *str) | ||
| 841 | { | ||
| 842 | debug_print = 1; | ||
| 843 | return 0; | ||
| 844 | } | ||
| 845 | early_param("mtrr_cleanup_debug", mtrr_cleanup_debug_setup); | ||
| 838 | 846 | ||
| 839 | struct var_mtrr_state { | 847 | struct var_mtrr_state { | 
| 840 | unsigned long range_startk; | 848 | unsigned long range_startk; | 
| @@ -898,6 +906,27 @@ set_var_mtrr_all(unsigned int address_bits) | |||
| 898 | } | 906 | } | 
| 899 | } | 907 | } | 
| 900 | 908 | ||
| 909 | static unsigned long to_size_factor(unsigned long sizek, char *factorp) | ||
| 910 | { | ||
| 911 | char factor; | ||
| 912 | unsigned long base = sizek; | ||
| 913 | |||
| 914 | if (base & ((1<<10) - 1)) { | ||
| 915 | /* not MB alignment */ | ||
| 916 | factor = 'K'; | ||
| 917 | } else if (base & ((1<<20) - 1)){ | ||
| 918 | factor = 'M'; | ||
| 919 | base >>= 10; | ||
| 920 | } else { | ||
| 921 | factor = 'G'; | ||
| 922 | base >>= 20; | ||
| 923 | } | ||
| 924 | |||
| 925 | *factorp = factor; | ||
| 926 | |||
| 927 | return base; | ||
| 928 | } | ||
| 929 | |||
| 901 | static unsigned int __init | 930 | static unsigned int __init | 
| 902 | range_to_mtrr(unsigned int reg, unsigned long range_startk, | 931 | range_to_mtrr(unsigned int reg, unsigned long range_startk, | 
| 903 | unsigned long range_sizek, unsigned char type) | 932 | unsigned long range_sizek, unsigned char type) | 
| @@ -919,13 +948,21 @@ range_to_mtrr(unsigned int reg, unsigned long range_startk, | |||
| 919 | align = max_align; | 948 | align = max_align; | 
| 920 | 949 | ||
| 921 | sizek = 1 << align; | 950 | sizek = 1 << align; | 
| 922 | if (debug_print) | 951 | if (debug_print) { | 
| 952 | char start_factor = 'K', size_factor = 'K'; | ||
| 953 | unsigned long start_base, size_base; | ||
| 954 | |||
| 955 | start_base = to_size_factor(range_startk, &start_factor), | ||
| 956 | size_base = to_size_factor(sizek, &size_factor), | ||
| 957 | |||
| 923 | printk(KERN_DEBUG "Setting variable MTRR %d, " | 958 | printk(KERN_DEBUG "Setting variable MTRR %d, " | 
| 924 | "base: %ldMB, range: %ldMB, type %s\n", | 959 | "base: %ld%cB, range: %ld%cB, type %s\n", | 
| 925 | reg, range_startk >> 10, sizek >> 10, | 960 | reg, start_base, start_factor, | 
| 961 | size_base, size_factor, | ||
| 926 | (type == MTRR_TYPE_UNCACHABLE)?"UC": | 962 | (type == MTRR_TYPE_UNCACHABLE)?"UC": | 
| 927 | ((type == MTRR_TYPE_WRBACK)?"WB":"Other") | 963 | ((type == MTRR_TYPE_WRBACK)?"WB":"Other") | 
| 928 | ); | 964 | ); | 
| 965 | } | ||
| 929 | save_var_mtrr(reg++, range_startk, sizek, type); | 966 | save_var_mtrr(reg++, range_startk, sizek, type); | 
| 930 | range_startk += sizek; | 967 | range_startk += sizek; | 
| 931 | range_sizek -= sizek; | 968 | range_sizek -= sizek; | 
| @@ -970,6 +1007,8 @@ range_to_mtrr_with_hole(struct var_mtrr_state *state, unsigned long basek, | |||
| 970 | /* try to append some small hole */ | 1007 | /* try to append some small hole */ | 
| 971 | range0_basek = state->range_startk; | 1008 | range0_basek = state->range_startk; | 
| 972 | range0_sizek = ALIGN(state->range_sizek, chunk_sizek); | 1009 | range0_sizek = ALIGN(state->range_sizek, chunk_sizek); | 
| 1010 | |||
| 1011 | /* no increase */ | ||
| 973 | if (range0_sizek == state->range_sizek) { | 1012 | if (range0_sizek == state->range_sizek) { | 
| 974 | if (debug_print) | 1013 | if (debug_print) | 
| 975 | printk(KERN_DEBUG "rangeX: %016lx - %016lx\n", | 1014 | printk(KERN_DEBUG "rangeX: %016lx - %016lx\n", | 
| @@ -980,13 +1019,40 @@ range_to_mtrr_with_hole(struct var_mtrr_state *state, unsigned long basek, | |||
| 980 | return 0; | 1019 | return 0; | 
| 981 | } | 1020 | } | 
| 982 | 1021 | ||
| 983 | range0_sizek -= chunk_sizek; | 1022 | /* only cut back, when it is not the last */ | 
| 984 | if (range0_sizek && sizek) { | 1023 | if (sizek) { | 
| 985 | while (range0_basek + range0_sizek > (basek + sizek)) { | 1024 | while (range0_basek + range0_sizek > (basek + sizek)) { | 
| 986 | range0_sizek -= chunk_sizek; | 1025 | if (range0_sizek >= chunk_sizek) | 
| 987 | if (!range0_sizek) | 1026 | range0_sizek -= chunk_sizek; | 
| 988 | break; | 1027 | else | 
| 989 | } | 1028 | range0_sizek = 0; | 
| 1029 | |||
| 1030 | if (!range0_sizek) | ||
| 1031 | break; | ||
| 1032 | } | ||
| 1033 | } | ||
| 1034 | |||
| 1035 | second_try: | ||
| 1036 | range_basek = range0_basek + range0_sizek; | ||
| 1037 | |||
| 1038 | /* one hole in the middle */ | ||
| 1039 | if (range_basek > basek && range_basek <= (basek + sizek)) | ||
| 1040 | second_sizek = range_basek - basek; | ||
| 1041 | |||
| 1042 | if (range0_sizek > state->range_sizek) { | ||
| 1043 | |||
| 1044 | /* one hole in middle or at end */ | ||
| 1045 | hole_sizek = range0_sizek - state->range_sizek - second_sizek; | ||
| 1046 | |||
| 1047 | /* hole size should be less than half of range0 size */ | ||
| 1048 | if (hole_sizek >= (range0_sizek >> 1) && | ||
| 1049 | range0_sizek >= chunk_sizek) { | ||
| 1050 | range0_sizek -= chunk_sizek; | ||
| 1051 | second_sizek = 0; | ||
| 1052 | hole_sizek = 0; | ||
| 1053 | |||
| 1054 | goto second_try; | ||
| 1055 | } | ||
| 990 | } | 1056 | } | 
| 991 | 1057 | ||
| 992 | if (range0_sizek) { | 1058 | if (range0_sizek) { | 
| @@ -996,50 +1062,28 @@ range_to_mtrr_with_hole(struct var_mtrr_state *state, unsigned long basek, | |||
| 996 | (range0_basek + range0_sizek)<<10); | 1062 | (range0_basek + range0_sizek)<<10); | 
| 997 | state->reg = range_to_mtrr(state->reg, range0_basek, | 1063 | state->reg = range_to_mtrr(state->reg, range0_basek, | 
| 998 | range0_sizek, MTRR_TYPE_WRBACK); | 1064 | range0_sizek, MTRR_TYPE_WRBACK); | 
| 999 | |||
| 1000 | } | ||
| 1001 | |||
| 1002 | range_basek = range0_basek + range0_sizek; | ||
| 1003 | range_sizek = chunk_sizek; | ||
| 1004 | |||
| 1005 | if (range_basek + range_sizek > basek && | ||
| 1006 | range_basek + range_sizek <= (basek + sizek)) { | ||
| 1007 | /* one hole */ | ||
| 1008 | second_basek = basek; | ||
| 1009 | second_sizek = range_basek + range_sizek - basek; | ||
| 1010 | } | 1065 | } | 
| 1011 | 1066 | ||
| 1012 | /* if last piece, only could one hole near end */ | 1067 | if (range0_sizek < state->range_sizek) { | 
| 1013 | if ((second_basek || !basek) && | 1068 | /* need to handle left over */ | 
| 1014 | range_sizek - (state->range_sizek - range0_sizek) - second_sizek < | ||
| 1015 | (chunk_sizek >> 1)) { | ||
| 1016 | /* | ||
| 1017 | * one hole in middle (second_sizek is 0) or at end | ||
| 1018 | * (second_sizek is 0 ) | ||
| 1019 | */ | ||
| 1020 | hole_sizek = range_sizek - (state->range_sizek - range0_sizek) | ||
| 1021 | - second_sizek; | ||
| 1022 | hole_basek = range_basek + range_sizek - hole_sizek | ||
| 1023 | - second_sizek; | ||
| 1024 | } else { | ||
| 1025 | /* fallback for big hole, or several holes */ | ||
| 1026 | range_sizek = state->range_sizek - range0_sizek; | 1069 | range_sizek = state->range_sizek - range0_sizek; | 
| 1027 | second_basek = 0; | 1070 | |
| 1028 | second_sizek = 0; | 1071 | if (debug_print) | 
| 1072 | printk(KERN_DEBUG "range: %016lx - %016lx\n", | ||
| 1073 | range_basek<<10, | ||
| 1074 | (range_basek + range_sizek)<<10); | ||
| 1075 | state->reg = range_to_mtrr(state->reg, range_basek, | ||
| 1076 | range_sizek, MTRR_TYPE_WRBACK); | ||
| 1029 | } | 1077 | } | 
| 1030 | 1078 | ||
| 1031 | if (debug_print) | ||
| 1032 | printk(KERN_DEBUG "range: %016lx - %016lx\n", range_basek<<10, | ||
| 1033 | (range_basek + range_sizek)<<10); | ||
| 1034 | state->reg = range_to_mtrr(state->reg, range_basek, range_sizek, | ||
| 1035 | MTRR_TYPE_WRBACK); | ||
| 1036 | if (hole_sizek) { | 1079 | if (hole_sizek) { | 
| 1080 | hole_basek = range_basek - hole_sizek - second_sizek; | ||
| 1037 | if (debug_print) | 1081 | if (debug_print) | 
| 1038 | printk(KERN_DEBUG "hole: %016lx - %016lx\n", | 1082 | printk(KERN_DEBUG "hole: %016lx - %016lx\n", | 
| 1039 | hole_basek<<10, (hole_basek + hole_sizek)<<10); | 1083 | hole_basek<<10, | 
| 1040 | state->reg = range_to_mtrr(state->reg, hole_basek, hole_sizek, | 1084 | (hole_basek + hole_sizek)<<10); | 
| 1041 | MTRR_TYPE_UNCACHABLE); | 1085 | state->reg = range_to_mtrr(state->reg, hole_basek, | 
| 1042 | 1086 | hole_sizek, MTRR_TYPE_UNCACHABLE); | |
| 1043 | } | 1087 | } | 
| 1044 | 1088 | ||
| 1045 | return second_sizek; | 1089 | return second_sizek; | 
| @@ -1154,11 +1198,11 @@ struct mtrr_cleanup_result { | |||
| 1154 | }; | 1198 | }; | 
| 1155 | 1199 | ||
| 1156 | /* | 1200 | /* | 
| 1157 | * gran_size: 1M, 2M, ..., 2G | 1201 | * gran_size: 64K, 128K, 256K, 512K, 1M, 2M, ..., 2G | 
| 1158 | * chunk size: gran_size, ..., 4G | 1202 | * chunk size: gran_size, ..., 2G | 
| 1159 | * so we need (2+13)*6 | 1203 | * so we need (1+16)*8 | 
| 1160 | */ | 1204 | */ | 
| 1161 | #define NUM_RESULT 90 | 1205 | #define NUM_RESULT 136 | 
| 1162 | #define PSHIFT (PAGE_SHIFT - 10) | 1206 | #define PSHIFT (PAGE_SHIFT - 10) | 
| 1163 | 1207 | ||
| 1164 | static struct mtrr_cleanup_result __initdata result[NUM_RESULT]; | 1208 | static struct mtrr_cleanup_result __initdata result[NUM_RESULT]; | 
| @@ -1168,13 +1212,14 @@ static unsigned long __initdata min_loss_pfn[RANGE_NUM]; | |||
| 1168 | static int __init mtrr_cleanup(unsigned address_bits) | 1212 | static int __init mtrr_cleanup(unsigned address_bits) | 
| 1169 | { | 1213 | { | 
| 1170 | unsigned long extra_remove_base, extra_remove_size; | 1214 | unsigned long extra_remove_base, extra_remove_size; | 
| 1171 | unsigned long i, base, size, def, dummy; | 1215 | unsigned long base, size, def, dummy; | 
| 1172 | mtrr_type type; | 1216 | mtrr_type type; | 
| 1173 | int nr_range, nr_range_new; | 1217 | int nr_range, nr_range_new; | 
| 1174 | u64 chunk_size, gran_size; | 1218 | u64 chunk_size, gran_size; | 
| 1175 | unsigned long range_sums, range_sums_new; | 1219 | unsigned long range_sums, range_sums_new; | 
| 1176 | int index_good; | 1220 | int index_good; | 
| 1177 | int num_reg_good; | 1221 | int num_reg_good; | 
| 1222 | int i; | ||
| 1178 | 1223 | ||
| 1179 | /* extra one for all 0 */ | 1224 | /* extra one for all 0 */ | 
| 1180 | int num[MTRR_NUM_TYPES + 1]; | 1225 | int num[MTRR_NUM_TYPES + 1]; | 
| @@ -1204,6 +1249,8 @@ static int __init mtrr_cleanup(unsigned address_bits) | |||
| 1204 | continue; | 1249 | continue; | 
| 1205 | if (!size) | 1250 | if (!size) | 
| 1206 | type = MTRR_NUM_TYPES; | 1251 | type = MTRR_NUM_TYPES; | 
| 1252 | if (type == MTRR_TYPE_WRPROT) | ||
| 1253 | type = MTRR_TYPE_UNCACHABLE; | ||
| 1207 | num[type]++; | 1254 | num[type]++; | 
| 1208 | } | 1255 | } | 
| 1209 | 1256 | ||
| @@ -1216,23 +1263,57 @@ static int __init mtrr_cleanup(unsigned address_bits) | |||
| 1216 | num_var_ranges - num[MTRR_NUM_TYPES]) | 1263 | num_var_ranges - num[MTRR_NUM_TYPES]) | 
| 1217 | return 0; | 1264 | return 0; | 
| 1218 | 1265 | ||
| 1266 | /* print original var MTRRs at first, for debugging: */ | ||
| 1267 | printk(KERN_DEBUG "original variable MTRRs\n"); | ||
| 1268 | for (i = 0; i < num_var_ranges; i++) { | ||
| 1269 | char start_factor = 'K', size_factor = 'K'; | ||
| 1270 | unsigned long start_base, size_base; | ||
| 1271 | |||
| 1272 | size_base = range_state[i].size_pfn << (PAGE_SHIFT - 10); | ||
| 1273 | if (!size_base) | ||
| 1274 | continue; | ||
| 1275 | |||
| 1276 | size_base = to_size_factor(size_base, &size_factor), | ||
| 1277 | start_base = range_state[i].base_pfn << (PAGE_SHIFT - 10); | ||
| 1278 | start_base = to_size_factor(start_base, &start_factor), | ||
| 1279 | type = range_state[i].type; | ||
| 1280 | |||
| 1281 | printk(KERN_DEBUG "reg %d, base: %ld%cB, range: %ld%cB, type %s\n", | ||
| 1282 | i, start_base, start_factor, | ||
| 1283 | size_base, size_factor, | ||
| 1284 | (type == MTRR_TYPE_UNCACHABLE) ? "UC" : | ||
| 1285 | ((type == MTRR_TYPE_WRPROT) ? "WP" : | ||
| 1286 | ((type == MTRR_TYPE_WRBACK) ? "WB" : "Other")) | ||
| 1287 | ); | ||
| 1288 | } | ||
| 1289 | |||
| 1219 | memset(range, 0, sizeof(range)); | 1290 | memset(range, 0, sizeof(range)); | 
| 1220 | extra_remove_size = 0; | 1291 | extra_remove_size = 0; | 
| 1221 | if (mtrr_tom2) { | 1292 | extra_remove_base = 1 << (32 - PAGE_SHIFT); | 
| 1222 | extra_remove_base = 1 << (32 - PAGE_SHIFT); | 1293 | if (mtrr_tom2) | 
| 1223 | extra_remove_size = | 1294 | extra_remove_size = | 
| 1224 | (mtrr_tom2 >> PAGE_SHIFT) - extra_remove_base; | 1295 | (mtrr_tom2 >> PAGE_SHIFT) - extra_remove_base; | 
| 1225 | } | ||
| 1226 | nr_range = x86_get_mtrr_mem_range(range, 0, extra_remove_base, | 1296 | nr_range = x86_get_mtrr_mem_range(range, 0, extra_remove_base, | 
| 1227 | extra_remove_size); | 1297 | extra_remove_size); | 
| 1298 | /* | ||
| 1299 | * [0, 1M) should always be coverred by var mtrr with WB | ||
| 1300 | * and fixed mtrrs should take effective before var mtrr for it | ||
| 1301 | */ | ||
| 1302 | nr_range = add_range_with_merge(range, nr_range, 0, | ||
| 1303 | (1ULL<<(20 - PAGE_SHIFT)) - 1); | ||
| 1304 | /* sort the ranges */ | ||
| 1305 | sort(range, nr_range, sizeof(struct res_range), cmp_range, NULL); | ||
| 1306 | |||
| 1228 | range_sums = sum_ranges(range, nr_range); | 1307 | range_sums = sum_ranges(range, nr_range); | 
| 1229 | printk(KERN_INFO "total RAM coverred: %ldM\n", | 1308 | printk(KERN_INFO "total RAM coverred: %ldM\n", | 
| 1230 | range_sums >> (20 - PAGE_SHIFT)); | 1309 | range_sums >> (20 - PAGE_SHIFT)); | 
| 1231 | 1310 | ||
| 1232 | if (mtrr_chunk_size && mtrr_gran_size) { | 1311 | if (mtrr_chunk_size && mtrr_gran_size) { | 
| 1233 | int num_reg; | 1312 | int num_reg; | 
| 1313 | char gran_factor, chunk_factor, lose_factor; | ||
| 1314 | unsigned long gran_base, chunk_base, lose_base; | ||
| 1234 | 1315 | ||
| 1235 | debug_print = 1; | 1316 | debug_print++; | 
| 1236 | /* convert ranges to var ranges state */ | 1317 | /* convert ranges to var ranges state */ | 
| 1237 | num_reg = x86_setup_var_mtrrs(range, nr_range, mtrr_chunk_size, | 1318 | num_reg = x86_setup_var_mtrrs(range, nr_range, mtrr_chunk_size, | 
| 1238 | mtrr_gran_size); | 1319 | mtrr_gran_size); | 
| @@ -1256,34 +1337,48 @@ static int __init mtrr_cleanup(unsigned address_bits) | |||
| 1256 | result[i].lose_cover_sizek = | 1337 | result[i].lose_cover_sizek = | 
| 1257 | (range_sums - range_sums_new) << PSHIFT; | 1338 | (range_sums - range_sums_new) << PSHIFT; | 
| 1258 | 1339 | ||
| 1259 | printk(KERN_INFO "%sgran_size: %ldM \tchunk_size: %ldM \t", | 1340 | gran_base = to_size_factor(result[i].gran_sizek, &gran_factor), | 
| 1260 | result[i].bad?"*BAD*":" ", result[i].gran_sizek >> 10, | 1341 | chunk_base = to_size_factor(result[i].chunk_sizek, &chunk_factor), | 
| 1261 | result[i].chunk_sizek >> 10); | 1342 | lose_base = to_size_factor(result[i].lose_cover_sizek, &lose_factor), | 
| 1262 | printk(KERN_CONT "num_reg: %d \tlose cover RAM: %s%ldM \n", | 1343 | printk(KERN_INFO "%sgran_size: %ld%c \tchunk_size: %ld%c \t", | 
| 1344 | result[i].bad?"*BAD*":" ", | ||
| 1345 | gran_base, gran_factor, chunk_base, chunk_factor); | ||
| 1346 | printk(KERN_CONT "num_reg: %d \tlose cover RAM: %s%ld%c\n", | ||
| 1263 | result[i].num_reg, result[i].bad?"-":"", | 1347 | result[i].num_reg, result[i].bad?"-":"", | 
| 1264 | result[i].lose_cover_sizek >> 10); | 1348 | lose_base, lose_factor); | 
| 1265 | if (!result[i].bad) { | 1349 | if (!result[i].bad) { | 
| 1266 | set_var_mtrr_all(address_bits); | 1350 | set_var_mtrr_all(address_bits); | 
| 1267 | return 1; | 1351 | return 1; | 
| 1268 | } | 1352 | } | 
| 1269 | printk(KERN_INFO "invalid mtrr_gran_size or mtrr_chunk_size, " | 1353 | printk(KERN_INFO "invalid mtrr_gran_size or mtrr_chunk_size, " | 
| 1270 | "will find optimal one\n"); | 1354 | "will find optimal one\n"); | 
| 1271 | debug_print = 0; | 1355 | debug_print--; | 
| 1272 | memset(result, 0, sizeof(result[0])); | 1356 | memset(result, 0, sizeof(result[0])); | 
| 1273 | } | 1357 | } | 
| 1274 | 1358 | ||
| 1275 | i = 0; | 1359 | i = 0; | 
| 1276 | memset(min_loss_pfn, 0xff, sizeof(min_loss_pfn)); | 1360 | memset(min_loss_pfn, 0xff, sizeof(min_loss_pfn)); | 
| 1277 | memset(result, 0, sizeof(result)); | 1361 | memset(result, 0, sizeof(result)); | 
| 1278 | for (gran_size = (1ULL<<20); gran_size < (1ULL<<32); gran_size <<= 1) { | 1362 | for (gran_size = (1ULL<<16); gran_size < (1ULL<<32); gran_size <<= 1) { | 
| 1279 | for (chunk_size = gran_size; chunk_size < (1ULL<<33); | 1363 | char gran_factor; | 
| 1364 | unsigned long gran_base; | ||
| 1365 | |||
| 1366 | if (debug_print) | ||
| 1367 | gran_base = to_size_factor(gran_size >> 10, &gran_factor); | ||
| 1368 | |||
| 1369 | for (chunk_size = gran_size; chunk_size < (1ULL<<32); | ||
| 1280 | chunk_size <<= 1) { | 1370 | chunk_size <<= 1) { | 
| 1281 | int num_reg; | 1371 | int num_reg; | 
| 1282 | 1372 | ||
| 1283 | if (debug_print) | 1373 | if (debug_print) { | 
| 1284 | printk(KERN_INFO | 1374 | char chunk_factor; | 
| 1285 | "\ngran_size: %lldM chunk_size_size: %lldM\n", | 1375 | unsigned long chunk_base; | 
| 1286 | gran_size >> 20, chunk_size >> 20); | 1376 | |
| 1377 | chunk_base = to_size_factor(chunk_size>>10, &chunk_factor), | ||
| 1378 | printk(KERN_INFO "\n"); | ||
| 1379 | printk(KERN_INFO "gran_size: %ld%c chunk_size: %ld%c \n", | ||
| 1380 | gran_base, gran_factor, chunk_base, chunk_factor); | ||
| 1381 | } | ||
| 1287 | if (i >= NUM_RESULT) | 1382 | if (i >= NUM_RESULT) | 
| 1288 | continue; | 1383 | continue; | 
| 1289 | 1384 | ||
| @@ -1326,12 +1421,18 @@ static int __init mtrr_cleanup(unsigned address_bits) | |||
| 1326 | 1421 | ||
| 1327 | /* print out all */ | 1422 | /* print out all */ | 
| 1328 | for (i = 0; i < NUM_RESULT; i++) { | 1423 | for (i = 0; i < NUM_RESULT; i++) { | 
| 1329 | printk(KERN_INFO "%sgran_size: %ldM \tchunk_size: %ldM \t", | 1424 | char gran_factor, chunk_factor, lose_factor; | 
| 1330 | result[i].bad?"*BAD* ":" ", result[i].gran_sizek >> 10, | 1425 | unsigned long gran_base, chunk_base, lose_base; | 
| 1331 | result[i].chunk_sizek >> 10); | 1426 | |
| 1332 | printk(KERN_CONT "num_reg: %d \tlose RAM: %s%ldM\n", | 1427 | gran_base = to_size_factor(result[i].gran_sizek, &gran_factor), | 
| 1333 | result[i].num_reg, result[i].bad?"-":"", | 1428 | chunk_base = to_size_factor(result[i].chunk_sizek, &chunk_factor), | 
| 1334 | result[i].lose_cover_sizek >> 10); | 1429 | lose_base = to_size_factor(result[i].lose_cover_sizek, &lose_factor), | 
| 1430 | printk(KERN_INFO "%sgran_size: %ld%c \tchunk_size: %ld%c \t", | ||
| 1431 | result[i].bad?"*BAD*":" ", | ||
| 1432 | gran_base, gran_factor, chunk_base, chunk_factor); | ||
| 1433 | printk(KERN_CONT "num_reg: %d \tlose cover RAM: %s%ld%c\n", | ||
| 1434 | result[i].num_reg, result[i].bad?"-":"", | ||
| 1435 | lose_base, lose_factor); | ||
| 1335 | } | 1436 | } | 
| 1336 | 1437 | ||
| 1337 | /* try to find the optimal index */ | 1438 | /* try to find the optimal index */ | 
| @@ -1339,10 +1440,8 @@ static int __init mtrr_cleanup(unsigned address_bits) | |||
| 1339 | nr_mtrr_spare_reg = num_var_ranges - 1; | 1440 | nr_mtrr_spare_reg = num_var_ranges - 1; | 
| 1340 | num_reg_good = -1; | 1441 | num_reg_good = -1; | 
| 1341 | for (i = num_var_ranges - nr_mtrr_spare_reg; i > 0; i--) { | 1442 | for (i = num_var_ranges - nr_mtrr_spare_reg; i > 0; i--) { | 
| 1342 | if (!min_loss_pfn[i]) { | 1443 | if (!min_loss_pfn[i]) | 
| 1343 | num_reg_good = i; | 1444 | num_reg_good = i; | 
| 1344 | break; | ||
| 1345 | } | ||
| 1346 | } | 1445 | } | 
| 1347 | 1446 | ||
| 1348 | index_good = -1; | 1447 | index_good = -1; | 
| @@ -1358,21 +1457,26 @@ static int __init mtrr_cleanup(unsigned address_bits) | |||
| 1358 | } | 1457 | } | 
| 1359 | 1458 | ||
| 1360 | if (index_good != -1) { | 1459 | if (index_good != -1) { | 
| 1460 | char gran_factor, chunk_factor, lose_factor; | ||
| 1461 | unsigned long gran_base, chunk_base, lose_base; | ||
| 1462 | |||
| 1361 | printk(KERN_INFO "Found optimal setting for mtrr clean up\n"); | 1463 | printk(KERN_INFO "Found optimal setting for mtrr clean up\n"); | 
| 1362 | i = index_good; | 1464 | i = index_good; | 
| 1363 | printk(KERN_INFO "gran_size: %ldM \tchunk_size: %ldM \t", | 1465 | gran_base = to_size_factor(result[i].gran_sizek, &gran_factor), | 
| 1364 | result[i].gran_sizek >> 10, | 1466 | chunk_base = to_size_factor(result[i].chunk_sizek, &chunk_factor), | 
| 1365 | result[i].chunk_sizek >> 10); | 1467 | lose_base = to_size_factor(result[i].lose_cover_sizek, &lose_factor), | 
| 1366 | printk(KERN_CONT "num_reg: %d \tlose RAM: %ldM\n", | 1468 | printk(KERN_INFO "gran_size: %ld%c \tchunk_size: %ld%c \t", | 
| 1367 | result[i].num_reg, | 1469 | gran_base, gran_factor, chunk_base, chunk_factor); | 
| 1368 | result[i].lose_cover_sizek >> 10); | 1470 | printk(KERN_CONT "num_reg: %d \tlose RAM: %ld%c\n", | 
| 1471 | result[i].num_reg, lose_base, lose_factor); | ||
| 1369 | /* convert ranges to var ranges state */ | 1472 | /* convert ranges to var ranges state */ | 
| 1370 | chunk_size = result[i].chunk_sizek; | 1473 | chunk_size = result[i].chunk_sizek; | 
| 1371 | chunk_size <<= 10; | 1474 | chunk_size <<= 10; | 
| 1372 | gran_size = result[i].gran_sizek; | 1475 | gran_size = result[i].gran_sizek; | 
| 1373 | gran_size <<= 10; | 1476 | gran_size <<= 10; | 
| 1374 | debug_print = 1; | 1477 | debug_print++; | 
| 1375 | x86_setup_var_mtrrs(range, nr_range, chunk_size, gran_size); | 1478 | x86_setup_var_mtrrs(range, nr_range, chunk_size, gran_size); | 
| 1479 | debug_print--; | ||
| 1376 | set_var_mtrr_all(address_bits); | 1480 | set_var_mtrr_all(address_bits); | 
| 1377 | return 1; | 1481 | return 1; | 
| 1378 | } | 1482 | } | 
| diff --git a/arch/x86/kernel/cpu/perfctr-watchdog.c b/arch/x86/kernel/cpu/perfctr-watchdog.c index 05cc22dbd4ff..6bff382094f5 100644 --- a/arch/x86/kernel/cpu/perfctr-watchdog.c +++ b/arch/x86/kernel/cpu/perfctr-watchdog.c | |||
| @@ -295,13 +295,19 @@ static int setup_k7_watchdog(unsigned nmi_hz) | |||
| 295 | /* setup the timer */ | 295 | /* setup the timer */ | 
| 296 | wrmsr(evntsel_msr, evntsel, 0); | 296 | wrmsr(evntsel_msr, evntsel, 0); | 
| 297 | write_watchdog_counter(perfctr_msr, "K7_PERFCTR0",nmi_hz); | 297 | write_watchdog_counter(perfctr_msr, "K7_PERFCTR0",nmi_hz); | 
| 298 | apic_write(APIC_LVTPC, APIC_DM_NMI); | ||
| 299 | evntsel |= K7_EVNTSEL_ENABLE; | ||
| 300 | wrmsr(evntsel_msr, evntsel, 0); | ||
| 301 | 298 | ||
| 299 | /* initialize the wd struct before enabling */ | ||
| 302 | wd->perfctr_msr = perfctr_msr; | 300 | wd->perfctr_msr = perfctr_msr; | 
| 303 | wd->evntsel_msr = evntsel_msr; | 301 | wd->evntsel_msr = evntsel_msr; | 
| 304 | wd->cccr_msr = 0; /* unused */ | 302 | wd->cccr_msr = 0; /* unused */ | 
| 303 | |||
| 304 | /* ok, everything is initialized, announce that we're set */ | ||
| 305 | cpu_nmi_set_wd_enabled(); | ||
| 306 | |||
| 307 | apic_write(APIC_LVTPC, APIC_DM_NMI); | ||
| 308 | evntsel |= K7_EVNTSEL_ENABLE; | ||
| 309 | wrmsr(evntsel_msr, evntsel, 0); | ||
| 310 | |||
| 305 | return 1; | 311 | return 1; | 
| 306 | } | 312 | } | 
| 307 | 313 | ||
| @@ -379,13 +385,19 @@ static int setup_p6_watchdog(unsigned nmi_hz) | |||
| 379 | wrmsr(evntsel_msr, evntsel, 0); | 385 | wrmsr(evntsel_msr, evntsel, 0); | 
| 380 | nmi_hz = adjust_for_32bit_ctr(nmi_hz); | 386 | nmi_hz = adjust_for_32bit_ctr(nmi_hz); | 
| 381 | write_watchdog_counter32(perfctr_msr, "P6_PERFCTR0",nmi_hz); | 387 | write_watchdog_counter32(perfctr_msr, "P6_PERFCTR0",nmi_hz); | 
| 382 | apic_write(APIC_LVTPC, APIC_DM_NMI); | ||
| 383 | evntsel |= P6_EVNTSEL0_ENABLE; | ||
| 384 | wrmsr(evntsel_msr, evntsel, 0); | ||
| 385 | 388 | ||
| 389 | /* initialize the wd struct before enabling */ | ||
| 386 | wd->perfctr_msr = perfctr_msr; | 390 | wd->perfctr_msr = perfctr_msr; | 
| 387 | wd->evntsel_msr = evntsel_msr; | 391 | wd->evntsel_msr = evntsel_msr; | 
| 388 | wd->cccr_msr = 0; /* unused */ | 392 | wd->cccr_msr = 0; /* unused */ | 
| 393 | |||
| 394 | /* ok, everything is initialized, announce that we're set */ | ||
| 395 | cpu_nmi_set_wd_enabled(); | ||
| 396 | |||
| 397 | apic_write(APIC_LVTPC, APIC_DM_NMI); | ||
| 398 | evntsel |= P6_EVNTSEL0_ENABLE; | ||
| 399 | wrmsr(evntsel_msr, evntsel, 0); | ||
| 400 | |||
| 389 | return 1; | 401 | return 1; | 
| 390 | } | 402 | } | 
| 391 | 403 | ||
| @@ -432,6 +444,27 @@ static const struct wd_ops p6_wd_ops = { | |||
| 432 | #define P4_CCCR_ENABLE (1 << 12) | 444 | #define P4_CCCR_ENABLE (1 << 12) | 
| 433 | #define P4_CCCR_OVF (1 << 31) | 445 | #define P4_CCCR_OVF (1 << 31) | 
| 434 | 446 | ||
| 447 | #define P4_CONTROLS 18 | ||
| 448 | static unsigned int p4_controls[18] = { | ||
| 449 | MSR_P4_BPU_CCCR0, | ||
| 450 | MSR_P4_BPU_CCCR1, | ||
| 451 | MSR_P4_BPU_CCCR2, | ||
| 452 | MSR_P4_BPU_CCCR3, | ||
| 453 | MSR_P4_MS_CCCR0, | ||
| 454 | MSR_P4_MS_CCCR1, | ||
| 455 | MSR_P4_MS_CCCR2, | ||
| 456 | MSR_P4_MS_CCCR3, | ||
| 457 | MSR_P4_FLAME_CCCR0, | ||
| 458 | MSR_P4_FLAME_CCCR1, | ||
| 459 | MSR_P4_FLAME_CCCR2, | ||
| 460 | MSR_P4_FLAME_CCCR3, | ||
| 461 | MSR_P4_IQ_CCCR0, | ||
| 462 | MSR_P4_IQ_CCCR1, | ||
| 463 | MSR_P4_IQ_CCCR2, | ||
| 464 | MSR_P4_IQ_CCCR3, | ||
| 465 | MSR_P4_IQ_CCCR4, | ||
| 466 | MSR_P4_IQ_CCCR5, | ||
| 467 | }; | ||
| 435 | /* | 468 | /* | 
| 436 | * Set up IQ_COUNTER0 to behave like a clock, by having IQ_CCCR0 filter | 469 | * Set up IQ_COUNTER0 to behave like a clock, by having IQ_CCCR0 filter | 
| 437 | * CRU_ESCR0 (with any non-null event selector) through a complemented | 470 | * CRU_ESCR0 (with any non-null event selector) through a complemented | 
| @@ -473,6 +506,26 @@ static int setup_p4_watchdog(unsigned nmi_hz) | |||
| 473 | evntsel_msr = MSR_P4_CRU_ESCR0; | 506 | evntsel_msr = MSR_P4_CRU_ESCR0; | 
| 474 | cccr_msr = MSR_P4_IQ_CCCR0; | 507 | cccr_msr = MSR_P4_IQ_CCCR0; | 
| 475 | cccr_val = P4_CCCR_OVF_PMI0 | P4_CCCR_ESCR_SELECT(4); | 508 | cccr_val = P4_CCCR_OVF_PMI0 | P4_CCCR_ESCR_SELECT(4); | 
| 509 | |||
| 510 | /* | ||
| 511 | * If we're on the kdump kernel or other situation, we may | ||
| 512 | * still have other performance counter registers set to | ||
| 513 | * interrupt and they'll keep interrupting forever because | ||
| 514 | * of the P4_CCCR_OVF quirk. So we need to ACK all the | ||
| 515 | * pending interrupts and disable all the registers here, | ||
| 516 | * before reenabling the NMI delivery. Refer to p4_rearm() | ||
| 517 | * about the P4_CCCR_OVF quirk. | ||
| 518 | */ | ||
| 519 | if (reset_devices) { | ||
| 520 | unsigned int low, high; | ||
| 521 | int i; | ||
| 522 | |||
| 523 | for (i = 0; i < P4_CONTROLS; i++) { | ||
| 524 | rdmsr(p4_controls[i], low, high); | ||
| 525 | low &= ~(P4_CCCR_ENABLE | P4_CCCR_OVF); | ||
| 526 | wrmsr(p4_controls[i], low, high); | ||
| 527 | } | ||
| 528 | } | ||
| 476 | } else { | 529 | } else { | 
| 477 | /* logical cpu 1 */ | 530 | /* logical cpu 1 */ | 
| 478 | perfctr_msr = MSR_P4_IQ_PERFCTR1; | 531 | perfctr_msr = MSR_P4_IQ_PERFCTR1; | 
| @@ -499,12 +552,17 @@ static int setup_p4_watchdog(unsigned nmi_hz) | |||
| 499 | wrmsr(evntsel_msr, evntsel, 0); | 552 | wrmsr(evntsel_msr, evntsel, 0); | 
| 500 | wrmsr(cccr_msr, cccr_val, 0); | 553 | wrmsr(cccr_msr, cccr_val, 0); | 
| 501 | write_watchdog_counter(perfctr_msr, "P4_IQ_COUNTER0", nmi_hz); | 554 | write_watchdog_counter(perfctr_msr, "P4_IQ_COUNTER0", nmi_hz); | 
| 502 | apic_write(APIC_LVTPC, APIC_DM_NMI); | 555 | |
| 503 | cccr_val |= P4_CCCR_ENABLE; | ||
| 504 | wrmsr(cccr_msr, cccr_val, 0); | ||
| 505 | wd->perfctr_msr = perfctr_msr; | 556 | wd->perfctr_msr = perfctr_msr; | 
| 506 | wd->evntsel_msr = evntsel_msr; | 557 | wd->evntsel_msr = evntsel_msr; | 
| 507 | wd->cccr_msr = cccr_msr; | 558 | wd->cccr_msr = cccr_msr; | 
| 559 | |||
| 560 | /* ok, everything is initialized, announce that we're set */ | ||
| 561 | cpu_nmi_set_wd_enabled(); | ||
| 562 | |||
| 563 | apic_write(APIC_LVTPC, APIC_DM_NMI); | ||
| 564 | cccr_val |= P4_CCCR_ENABLE; | ||
| 565 | wrmsr(cccr_msr, cccr_val, 0); | ||
| 508 | return 1; | 566 | return 1; | 
| 509 | } | 567 | } | 
| 510 | 568 | ||
| @@ -620,13 +678,17 @@ static int setup_intel_arch_watchdog(unsigned nmi_hz) | |||
| 620 | wrmsr(evntsel_msr, evntsel, 0); | 678 | wrmsr(evntsel_msr, evntsel, 0); | 
| 621 | nmi_hz = adjust_for_32bit_ctr(nmi_hz); | 679 | nmi_hz = adjust_for_32bit_ctr(nmi_hz); | 
| 622 | write_watchdog_counter32(perfctr_msr, "INTEL_ARCH_PERFCTR0", nmi_hz); | 680 | write_watchdog_counter32(perfctr_msr, "INTEL_ARCH_PERFCTR0", nmi_hz); | 
| 623 | apic_write(APIC_LVTPC, APIC_DM_NMI); | ||
| 624 | evntsel |= ARCH_PERFMON_EVENTSEL0_ENABLE; | ||
| 625 | wrmsr(evntsel_msr, evntsel, 0); | ||
| 626 | 681 | ||
| 627 | wd->perfctr_msr = perfctr_msr; | 682 | wd->perfctr_msr = perfctr_msr; | 
| 628 | wd->evntsel_msr = evntsel_msr; | 683 | wd->evntsel_msr = evntsel_msr; | 
| 629 | wd->cccr_msr = 0; /* unused */ | 684 | wd->cccr_msr = 0; /* unused */ | 
| 685 | |||
| 686 | /* ok, everything is initialized, announce that we're set */ | ||
| 687 | cpu_nmi_set_wd_enabled(); | ||
| 688 | |||
| 689 | apic_write(APIC_LVTPC, APIC_DM_NMI); | ||
| 690 | evntsel |= ARCH_PERFMON_EVENTSEL0_ENABLE; | ||
| 691 | wrmsr(evntsel_msr, evntsel, 0); | ||
| 630 | intel_arch_wd_ops.checkbit = 1ULL << (eax.split.bit_width - 1); | 692 | intel_arch_wd_ops.checkbit = 1ULL << (eax.split.bit_width - 1); | 
| 631 | return 1; | 693 | return 1; | 
| 632 | } | 694 | } | 
| diff --git a/arch/x86/kernel/cpuid.c b/arch/x86/kernel/cpuid.c index 8e9cd6a8ec12..6a44d6465991 100644 --- a/arch/x86/kernel/cpuid.c +++ b/arch/x86/kernel/cpuid.c | |||
| @@ -36,7 +36,6 @@ | |||
| 36 | #include <linux/smp_lock.h> | 36 | #include <linux/smp_lock.h> | 
| 37 | #include <linux/major.h> | 37 | #include <linux/major.h> | 
| 38 | #include <linux/fs.h> | 38 | #include <linux/fs.h> | 
| 39 | #include <linux/smp_lock.h> | ||
| 40 | #include <linux/device.h> | 39 | #include <linux/device.h> | 
| 41 | #include <linux/cpu.h> | 40 | #include <linux/cpu.h> | 
| 42 | #include <linux/notifier.h> | 41 | #include <linux/notifier.h> | 
| diff --git a/arch/x86/kernel/crash_dump_64.c b/arch/x86/kernel/crash_dump_64.c index 15e6c6bc4a46..e90a60ef10c2 100644 --- a/arch/x86/kernel/crash_dump_64.c +++ b/arch/x86/kernel/crash_dump_64.c | |||
| @@ -7,9 +7,8 @@ | |||
| 7 | 7 | ||
| 8 | #include <linux/errno.h> | 8 | #include <linux/errno.h> | 
| 9 | #include <linux/crash_dump.h> | 9 | #include <linux/crash_dump.h> | 
| 10 | 10 | #include <linux/uaccess.h> | |
| 11 | #include <asm/uaccess.h> | 11 | #include <linux/io.h> | 
| 12 | #include <asm/io.h> | ||
| 13 | 12 | ||
| 14 | /** | 13 | /** | 
| 15 | * copy_oldmem_page - copy one page from "oldmem" | 14 | * copy_oldmem_page - copy one page from "oldmem" | 
| @@ -25,7 +24,7 @@ | |||
| 25 | * in the current kernel. We stitch up a pte, similar to kmap_atomic. | 24 | * in the current kernel. We stitch up a pte, similar to kmap_atomic. | 
| 26 | */ | 25 | */ | 
| 27 | ssize_t copy_oldmem_page(unsigned long pfn, char *buf, | 26 | ssize_t copy_oldmem_page(unsigned long pfn, char *buf, | 
| 28 | size_t csize, unsigned long offset, int userbuf) | 27 | size_t csize, unsigned long offset, int userbuf) | 
| 29 | { | 28 | { | 
| 30 | void *vaddr; | 29 | void *vaddr; | 
| 31 | 30 | ||
| @@ -33,14 +32,16 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, | |||
| 33 | return 0; | 32 | return 0; | 
| 34 | 33 | ||
| 35 | vaddr = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE); | 34 | vaddr = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE); | 
| 35 | if (!vaddr) | ||
| 36 | return -ENOMEM; | ||
| 36 | 37 | ||
| 37 | if (userbuf) { | 38 | if (userbuf) { | 
| 38 | if (copy_to_user(buf, (vaddr + offset), csize)) { | 39 | if (copy_to_user(buf, vaddr + offset, csize)) { | 
| 39 | iounmap(vaddr); | 40 | iounmap(vaddr); | 
| 40 | return -EFAULT; | 41 | return -EFAULT; | 
| 41 | } | 42 | } | 
| 42 | } else | 43 | } else | 
| 43 | memcpy(buf, (vaddr + offset), csize); | 44 | memcpy(buf, vaddr + offset, csize); | 
| 44 | 45 | ||
| 45 | iounmap(vaddr); | 46 | iounmap(vaddr); | 
| 46 | return csize; | 47 | return csize; | 
| diff --git a/arch/x86/kernel/ds.c b/arch/x86/kernel/ds.c index 11c11b8ec48d..2b69994fd3a8 100644 --- a/arch/x86/kernel/ds.c +++ b/arch/x86/kernel/ds.c | |||
| @@ -2,26 +2,49 @@ | |||
| 2 | * Debug Store support | 2 | * Debug Store support | 
| 3 | * | 3 | * | 
| 4 | * This provides a low-level interface to the hardware's Debug Store | 4 | * This provides a low-level interface to the hardware's Debug Store | 
| 5 | * feature that is used for last branch recording (LBR) and | 5 | * feature that is used for branch trace store (BTS) and | 
| 6 | * precise-event based sampling (PEBS). | 6 | * precise-event based sampling (PEBS). | 
| 7 | * | 7 | * | 
| 8 | * Different architectures use a different DS layout/pointer size. | 8 | * It manages: | 
| 9 | * The below functions therefore work on a void*. | 9 | * - per-thread and per-cpu allocation of BTS and PEBS | 
| 10 | * - buffer memory allocation (optional) | ||
| 11 | * - buffer overflow handling | ||
| 12 | * - buffer access | ||
| 10 | * | 13 | * | 
| 14 | * It assumes: | ||
| 15 | * - get_task_struct on all parameter tasks | ||
| 16 | * - current is allowed to trace parameter tasks | ||
| 11 | * | 17 | * | 
| 12 | * Since there is no user for PEBS, yet, only LBR (or branch | ||
| 13 | * trace store, BTS) is supported. | ||
| 14 | * | 18 | * | 
| 15 | * | 19 | * Copyright (C) 2007-2008 Intel Corporation. | 
| 16 | * Copyright (C) 2007 Intel Corporation. | 20 | * Markus Metzger <markus.t.metzger@intel.com>, 2007-2008 | 
| 17 | * Markus Metzger <markus.t.metzger@intel.com>, Dec 2007 | ||
| 18 | */ | 21 | */ | 
| 19 | 22 | ||
| 23 | |||
| 24 | #ifdef CONFIG_X86_DS | ||
| 25 | |||
| 20 | #include <asm/ds.h> | 26 | #include <asm/ds.h> | 
| 21 | 27 | ||
| 22 | #include <linux/errno.h> | 28 | #include <linux/errno.h> | 
| 23 | #include <linux/string.h> | 29 | #include <linux/string.h> | 
| 24 | #include <linux/slab.h> | 30 | #include <linux/slab.h> | 
| 31 | #include <linux/sched.h> | ||
| 32 | #include <linux/mm.h> | ||
| 33 | |||
| 34 | |||
| 35 | /* | ||
| 36 | * The configuration for a particular DS hardware implementation. | ||
| 37 | */ | ||
| 38 | struct ds_configuration { | ||
| 39 | /* the size of the DS structure in bytes */ | ||
| 40 | unsigned char sizeof_ds; | ||
| 41 | /* the size of one pointer-typed field in the DS structure in bytes; | ||
| 42 | this covers the first 8 fields related to buffer management. */ | ||
| 43 | unsigned char sizeof_field; | ||
| 44 | /* the size of a BTS/PEBS record in bytes */ | ||
| 45 | unsigned char sizeof_rec[2]; | ||
| 46 | }; | ||
| 47 | static struct ds_configuration ds_cfg; | ||
| 25 | 48 | ||
| 26 | 49 | ||
| 27 | /* | 50 | /* | 
| @@ -44,378 +67,747 @@ | |||
| 44 | * (interrupt occurs when write pointer passes interrupt pointer) | 67 | * (interrupt occurs when write pointer passes interrupt pointer) | 
| 45 | * - value to which counter is reset following counter overflow | 68 | * - value to which counter is reset following counter overflow | 
| 46 | * | 69 | * | 
| 47 | * On later architectures, the last branch recording hardware uses | 70 | * Later architectures use 64bit pointers throughout, whereas earlier | 
| 48 | * 64bit pointers even in 32bit mode. | 71 | * architectures use 32bit pointers in 32bit mode. | 
| 49 | * | ||
| 50 | * | ||
| 51 | * Branch Trace Store (BTS) records store information about control | ||
| 52 | * flow changes. They at least provide the following information: | ||
| 53 | * - source linear address | ||
| 54 | * - destination linear address | ||
| 55 | * | 72 | * | 
| 56 | * Netburst supported a predicated bit that had been dropped in later | ||
| 57 | * architectures. We do not suppor it. | ||
| 58 | * | 73 | * | 
| 74 | * We compute the base address for the first 8 fields based on: | ||
| 75 | * - the field size stored in the DS configuration | ||
| 76 | * - the relative field position | ||
| 77 | * - an offset giving the start of the respective region | ||
| 59 | * | 78 | * | 
| 60 | * In order to abstract from the actual DS and BTS layout, we describe | 79 | * This offset is further used to index various arrays holding | 
| 61 | * the access to the relevant fields. | 80 | * information for BTS and PEBS at the respective index. | 
| 62 | * Thanks to Andi Kleen for proposing this design. | ||
| 63 | * | 81 | * | 
| 64 | * The implementation, however, is not as general as it might seem. In | 82 | * On later 32bit processors, we only access the lower 32bit of the | 
| 65 | * order to stay somewhat simple and efficient, we assume an | 83 | * 64bit pointer fields. The upper halves will be zeroed out. | 
| 66 | * underlying unsigned type (mostly a pointer type) and we expect the | ||
| 67 | * field to be at least as big as that type. | ||
| 68 | */ | 84 | */ | 
| 69 | 85 | ||
| 70 | /* | 86 | enum ds_field { | 
| 71 | * A special from_ip address to indicate that the BTS record is an | 87 | ds_buffer_base = 0, | 
| 72 | * info record that needs to be interpreted or skipped. | 88 | ds_index, | 
| 73 | */ | 89 | ds_absolute_maximum, | 
| 74 | #define BTS_ESCAPE_ADDRESS (-1) | 90 | ds_interrupt_threshold, | 
| 91 | }; | ||
| 75 | 92 | ||
| 76 | /* | 93 | enum ds_qualifier { | 
| 77 | * A field access descriptor | 94 | ds_bts = 0, | 
| 78 | */ | 95 | ds_pebs | 
| 79 | struct access_desc { | ||
| 80 | unsigned char offset; | ||
| 81 | unsigned char size; | ||
| 82 | }; | 96 | }; | 
| 83 | 97 | ||
| 98 | static inline unsigned long ds_get(const unsigned char *base, | ||
| 99 | enum ds_qualifier qual, enum ds_field field) | ||
| 100 | { | ||
| 101 | base += (ds_cfg.sizeof_field * (field + (4 * qual))); | ||
| 102 | return *(unsigned long *)base; | ||
| 103 | } | ||
| 104 | |||
| 105 | static inline void ds_set(unsigned char *base, enum ds_qualifier qual, | ||
| 106 | enum ds_field field, unsigned long value) | ||
| 107 | { | ||
| 108 | base += (ds_cfg.sizeof_field * (field + (4 * qual))); | ||
| 109 | (*(unsigned long *)base) = value; | ||
| 110 | } | ||
| 111 | |||
| 112 | |||
| 84 | /* | 113 | /* | 
| 85 | * The configuration for a particular DS/BTS hardware implementation. | 114 | * Locking is done only for allocating BTS or PEBS resources and for | 
| 115 | * guarding context and buffer memory allocation. | ||
| 116 | * | ||
| 117 | * Most functions require the current task to own the ds context part | ||
| 118 | * they are going to access. All the locking is done when validating | ||
| 119 | * access to the context. | ||
| 86 | */ | 120 | */ | 
| 87 | struct ds_configuration { | 121 | static spinlock_t ds_lock = __SPIN_LOCK_UNLOCKED(ds_lock); | 
| 88 | /* the DS configuration */ | ||
| 89 | unsigned char sizeof_ds; | ||
| 90 | struct access_desc bts_buffer_base; | ||
| 91 | struct access_desc bts_index; | ||
| 92 | struct access_desc bts_absolute_maximum; | ||
| 93 | struct access_desc bts_interrupt_threshold; | ||
| 94 | /* the BTS configuration */ | ||
| 95 | unsigned char sizeof_bts; | ||
| 96 | struct access_desc from_ip; | ||
| 97 | struct access_desc to_ip; | ||
| 98 | /* BTS variants used to store additional information like | ||
| 99 | timestamps */ | ||
| 100 | struct access_desc info_type; | ||
| 101 | struct access_desc info_data; | ||
| 102 | unsigned long debugctl_mask; | ||
| 103 | }; | ||
| 104 | 122 | ||
| 105 | /* | 123 | /* | 
| 106 | * The global configuration used by the below accessor functions | 124 | * Validate that the current task is allowed to access the BTS/PEBS | 
| 125 | * buffer of the parameter task. | ||
| 126 | * | ||
| 127 | * Returns 0, if access is granted; -Eerrno, otherwise. | ||
| 107 | */ | 128 | */ | 
| 108 | static struct ds_configuration ds_cfg; | 129 | static inline int ds_validate_access(struct ds_context *context, | 
| 130 | enum ds_qualifier qual) | ||
| 131 | { | ||
| 132 | if (!context) | ||
| 133 | return -EPERM; | ||
| 134 | |||
| 135 | if (context->owner[qual] == current) | ||
| 136 | return 0; | ||
| 137 | |||
| 138 | return -EPERM; | ||
| 139 | } | ||
| 140 | |||
| 109 | 141 | ||
| 110 | /* | 142 | /* | 
| 111 | * Accessor functions for some DS and BTS fields using the above | 143 | * We either support (system-wide) per-cpu or per-thread allocation. | 
| 112 | * global ptrace_bts_cfg. | 144 | * We distinguish the two based on the task_struct pointer, where a | 
| 145 | * NULL pointer indicates per-cpu allocation for the current cpu. | ||
| 146 | * | ||
| 147 | * Allocations are use-counted. As soon as resources are allocated, | ||
| 148 | * further allocations must be of the same type (per-cpu or | ||
| 149 | * per-thread). We model this by counting allocations (i.e. the number | ||
| 150 | * of tracers of a certain type) for one type negatively: | ||
| 151 | * =0 no tracers | ||
| 152 | * >0 number of per-thread tracers | ||
| 153 | * <0 number of per-cpu tracers | ||
| 154 | * | ||
| 155 | * The below functions to get and put tracers and to check the | ||
| 156 | * allocation type require the ds_lock to be held by the caller. | ||
| 157 | * | ||
| 158 | * Tracers essentially gives the number of ds contexts for a certain | ||
| 159 | * type of allocation. | ||
| 113 | */ | 160 | */ | 
| 114 | static inline unsigned long get_bts_buffer_base(char *base) | 161 | static long tracers; | 
| 162 | |||
| 163 | static inline void get_tracer(struct task_struct *task) | ||
| 115 | { | 164 | { | 
| 116 | return *(unsigned long *)(base + ds_cfg.bts_buffer_base.offset); | 165 | tracers += (task ? 1 : -1); | 
| 117 | } | 166 | } | 
| 118 | static inline void set_bts_buffer_base(char *base, unsigned long value) | 167 | |
| 168 | static inline void put_tracer(struct task_struct *task) | ||
| 119 | { | 169 | { | 
| 120 | (*(unsigned long *)(base + ds_cfg.bts_buffer_base.offset)) = value; | 170 | tracers -= (task ? 1 : -1); | 
| 121 | } | 171 | } | 
| 122 | static inline unsigned long get_bts_index(char *base) | 172 | |
| 173 | static inline int check_tracer(struct task_struct *task) | ||
| 123 | { | 174 | { | 
| 124 | return *(unsigned long *)(base + ds_cfg.bts_index.offset); | 175 | return (task ? (tracers >= 0) : (tracers <= 0)); | 
| 125 | } | 176 | } | 
| 126 | static inline void set_bts_index(char *base, unsigned long value) | 177 | |
| 178 | |||
| 179 | /* | ||
| 180 | * The DS context is either attached to a thread or to a cpu: | ||
| 181 | * - in the former case, the thread_struct contains a pointer to the | ||
| 182 | * attached context. | ||
| 183 | * - in the latter case, we use a static array of per-cpu context | ||
| 184 | * pointers. | ||
| 185 | * | ||
| 186 | * Contexts are use-counted. They are allocated on first access and | ||
| 187 | * deallocated when the last user puts the context. | ||
| 188 | * | ||
| 189 | * We distinguish between an allocating and a non-allocating get of a | ||
| 190 | * context: | ||
| 191 | * - the allocating get is used for requesting BTS/PEBS resources. It | ||
| 192 | * requires the caller to hold the global ds_lock. | ||
| 193 | * - the non-allocating get is used for all other cases. A | ||
| 194 | * non-existing context indicates an error. It acquires and releases | ||
| 195 | * the ds_lock itself for obtaining the context. | ||
| 196 | * | ||
| 197 | * A context and its DS configuration are allocated and deallocated | ||
| 198 | * together. A context always has a DS configuration of the | ||
| 199 | * appropriate size. | ||
| 200 | */ | ||
| 201 | static DEFINE_PER_CPU(struct ds_context *, system_context); | ||
| 202 | |||
| 203 | #define this_system_context per_cpu(system_context, smp_processor_id()) | ||
| 204 | |||
| 205 | /* | ||
| 206 | * Returns the pointer to the parameter task's context or to the | ||
| 207 | * system-wide context, if task is NULL. | ||
| 208 | * | ||
| 209 | * Increases the use count of the returned context, if not NULL. | ||
| 210 | */ | ||
| 211 | static inline struct ds_context *ds_get_context(struct task_struct *task) | ||
| 127 | { | 212 | { | 
| 128 | (*(unsigned long *)(base + ds_cfg.bts_index.offset)) = value; | 213 | struct ds_context *context; | 
| 214 | |||
| 215 | spin_lock(&ds_lock); | ||
| 216 | |||
| 217 | context = (task ? task->thread.ds_ctx : this_system_context); | ||
| 218 | if (context) | ||
| 219 | context->count++; | ||
| 220 | |||
| 221 | spin_unlock(&ds_lock); | ||
| 222 | |||
| 223 | return context; | ||
| 129 | } | 224 | } | 
| 130 | static inline unsigned long get_bts_absolute_maximum(char *base) | 225 | |
| 226 | /* | ||
| 227 | * Same as ds_get_context, but allocates the context and it's DS | ||
| 228 | * structure, if necessary; returns NULL; if out of memory. | ||
| 229 | * | ||
| 230 | * pre: requires ds_lock to be held | ||
| 231 | */ | ||
| 232 | static inline struct ds_context *ds_alloc_context(struct task_struct *task) | ||
| 131 | { | 233 | { | 
| 132 | return *(unsigned long *)(base + ds_cfg.bts_absolute_maximum.offset); | 234 | struct ds_context **p_context = | 
| 235 | (task ? &task->thread.ds_ctx : &this_system_context); | ||
| 236 | struct ds_context *context = *p_context; | ||
| 237 | |||
| 238 | if (!context) { | ||
| 239 | context = kzalloc(sizeof(*context), GFP_KERNEL); | ||
| 240 | |||
| 241 | if (!context) | ||
| 242 | return NULL; | ||
| 243 | |||
| 244 | context->ds = kzalloc(ds_cfg.sizeof_ds, GFP_KERNEL); | ||
| 245 | if (!context->ds) { | ||
| 246 | kfree(context); | ||
| 247 | return NULL; | ||
| 248 | } | ||
| 249 | |||
| 250 | *p_context = context; | ||
| 251 | |||
| 252 | context->this = p_context; | ||
| 253 | context->task = task; | ||
| 254 | |||
| 255 | if (task) | ||
| 256 | set_tsk_thread_flag(task, TIF_DS_AREA_MSR); | ||
| 257 | |||
| 258 | if (!task || (task == current)) | ||
| 259 | wrmsr(MSR_IA32_DS_AREA, (unsigned long)context->ds, 0); | ||
| 260 | |||
| 261 | get_tracer(task); | ||
| 262 | } | ||
| 263 | |||
| 264 | context->count++; | ||
| 265 | |||
| 266 | return context; | ||
| 133 | } | 267 | } | 
| 134 | static inline void set_bts_absolute_maximum(char *base, unsigned long value) | 268 | |
| 269 | /* | ||
| 270 | * Decreases the use count of the parameter context, if not NULL. | ||
| 271 | * Deallocates the context, if the use count reaches zero. | ||
| 272 | */ | ||
| 273 | static inline void ds_put_context(struct ds_context *context) | ||
| 135 | { | 274 | { | 
| 136 | (*(unsigned long *)(base + ds_cfg.bts_absolute_maximum.offset)) = value; | 275 | if (!context) | 
| 276 | return; | ||
| 277 | |||
| 278 | spin_lock(&ds_lock); | ||
| 279 | |||
| 280 | if (--context->count) | ||
| 281 | goto out; | ||
| 282 | |||
| 283 | *(context->this) = NULL; | ||
| 284 | |||
| 285 | if (context->task) | ||
| 286 | clear_tsk_thread_flag(context->task, TIF_DS_AREA_MSR); | ||
| 287 | |||
| 288 | if (!context->task || (context->task == current)) | ||
| 289 | wrmsrl(MSR_IA32_DS_AREA, 0); | ||
| 290 | |||
| 291 | put_tracer(context->task); | ||
| 292 | |||
| 293 | /* free any leftover buffers from tracers that did not | ||
| 294 | * deallocate them properly. */ | ||
| 295 | kfree(context->buffer[ds_bts]); | ||
| 296 | kfree(context->buffer[ds_pebs]); | ||
| 297 | kfree(context->ds); | ||
| 298 | kfree(context); | ||
| 299 | out: | ||
| 300 | spin_unlock(&ds_lock); | ||
| 137 | } | 301 | } | 
| 138 | static inline unsigned long get_bts_interrupt_threshold(char *base) | 302 | |
| 303 | |||
| 304 | /* | ||
| 305 | * Handle a buffer overflow | ||
| 306 | * | ||
| 307 | * task: the task whose buffers are overflowing; | ||
| 308 | * NULL for a buffer overflow on the current cpu | ||
| 309 | * context: the ds context | ||
| 310 | * qual: the buffer type | ||
| 311 | */ | ||
| 312 | static void ds_overflow(struct task_struct *task, struct ds_context *context, | ||
| 313 | enum ds_qualifier qual) | ||
| 139 | { | 314 | { | 
| 140 | return *(unsigned long *)(base + ds_cfg.bts_interrupt_threshold.offset); | 315 | if (!context) | 
| 316 | return; | ||
| 317 | |||
| 318 | if (context->callback[qual]) | ||
| 319 | (*context->callback[qual])(task); | ||
| 320 | |||
| 321 | /* todo: do some more overflow handling */ | ||
| 141 | } | 322 | } | 
| 142 | static inline void set_bts_interrupt_threshold(char *base, unsigned long value) | 323 | |
| 324 | |||
| 325 | /* | ||
| 326 | * Allocate a non-pageable buffer of the parameter size. | ||
| 327 | * Checks the memory and the locked memory rlimit. | ||
| 328 | * | ||
| 329 | * Returns the buffer, if successful; | ||
| 330 | * NULL, if out of memory or rlimit exceeded. | ||
| 331 | * | ||
| 332 | * size: the requested buffer size in bytes | ||
| 333 | * pages (out): if not NULL, contains the number of pages reserved | ||
| 334 | */ | ||
| 335 | static inline void *ds_allocate_buffer(size_t size, unsigned int *pages) | ||
| 143 | { | 336 | { | 
| 144 | (*(unsigned long *)(base + ds_cfg.bts_interrupt_threshold.offset)) = value; | 337 | unsigned long rlim, vm, pgsz; | 
| 338 | void *buffer; | ||
| 339 | |||
| 340 | pgsz = PAGE_ALIGN(size) >> PAGE_SHIFT; | ||
| 341 | |||
| 342 | rlim = current->signal->rlim[RLIMIT_AS].rlim_cur >> PAGE_SHIFT; | ||
| 343 | vm = current->mm->total_vm + pgsz; | ||
| 344 | if (rlim < vm) | ||
| 345 | return NULL; | ||
| 346 | |||
| 347 | rlim = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur >> PAGE_SHIFT; | ||
| 348 | vm = current->mm->locked_vm + pgsz; | ||
| 349 | if (rlim < vm) | ||
| 350 | return NULL; | ||
| 351 | |||
| 352 | buffer = kzalloc(size, GFP_KERNEL); | ||
| 353 | if (!buffer) | ||
| 354 | return NULL; | ||
| 355 | |||
| 356 | current->mm->total_vm += pgsz; | ||
| 357 | current->mm->locked_vm += pgsz; | ||
| 358 | |||
| 359 | if (pages) | ||
| 360 | *pages = pgsz; | ||
| 361 | |||
| 362 | return buffer; | ||
| 145 | } | 363 | } | 
| 146 | static inline unsigned long get_from_ip(char *base) | 364 | |
| 365 | static int ds_request(struct task_struct *task, void *base, size_t size, | ||
| 366 | ds_ovfl_callback_t ovfl, enum ds_qualifier qual) | ||
| 147 | { | 367 | { | 
| 148 | return *(unsigned long *)(base + ds_cfg.from_ip.offset); | 368 | struct ds_context *context; | 
| 369 | unsigned long buffer, adj; | ||
| 370 | const unsigned long alignment = (1 << 3); | ||
| 371 | int error = 0; | ||
| 372 | |||
| 373 | if (!ds_cfg.sizeof_ds) | ||
| 374 | return -EOPNOTSUPP; | ||
| 375 | |||
| 376 | /* we require some space to do alignment adjustments below */ | ||
| 377 | if (size < (alignment + ds_cfg.sizeof_rec[qual])) | ||
| 378 | return -EINVAL; | ||
| 379 | |||
| 380 | /* buffer overflow notification is not yet implemented */ | ||
| 381 | if (ovfl) | ||
| 382 | return -EOPNOTSUPP; | ||
| 383 | |||
| 384 | |||
| 385 | spin_lock(&ds_lock); | ||
| 386 | |||
| 387 | if (!check_tracer(task)) | ||
| 388 | return -EPERM; | ||
| 389 | |||
| 390 | error = -ENOMEM; | ||
| 391 | context = ds_alloc_context(task); | ||
| 392 | if (!context) | ||
| 393 | goto out_unlock; | ||
| 394 | |||
| 395 | error = -EALREADY; | ||
| 396 | if (context->owner[qual] == current) | ||
| 397 | goto out_unlock; | ||
| 398 | error = -EPERM; | ||
| 399 | if (context->owner[qual] != NULL) | ||
| 400 | goto out_unlock; | ||
| 401 | context->owner[qual] = current; | ||
| 402 | |||
| 403 | spin_unlock(&ds_lock); | ||
| 404 | |||
| 405 | |||
| 406 | error = -ENOMEM; | ||
| 407 | if (!base) { | ||
| 408 | base = ds_allocate_buffer(size, &context->pages[qual]); | ||
| 409 | if (!base) | ||
| 410 | goto out_release; | ||
| 411 | |||
| 412 | context->buffer[qual] = base; | ||
| 413 | } | ||
| 414 | error = 0; | ||
| 415 | |||
| 416 | context->callback[qual] = ovfl; | ||
| 417 | |||
| 418 | /* adjust the buffer address and size to meet alignment | ||
| 419 | * constraints: | ||
| 420 | * - buffer is double-word aligned | ||
| 421 | * - size is multiple of record size | ||
| 422 | * | ||
| 423 | * We checked the size at the very beginning; we have enough | ||
| 424 | * space to do the adjustment. | ||
| 425 | */ | ||
| 426 | buffer = (unsigned long)base; | ||
| 427 | |||
| 428 | adj = ALIGN(buffer, alignment) - buffer; | ||
| 429 | buffer += adj; | ||
| 430 | size -= adj; | ||
| 431 | |||
| 432 | size /= ds_cfg.sizeof_rec[qual]; | ||
| 433 | size *= ds_cfg.sizeof_rec[qual]; | ||
| 434 | |||
| 435 | ds_set(context->ds, qual, ds_buffer_base, buffer); | ||
| 436 | ds_set(context->ds, qual, ds_index, buffer); | ||
| 437 | ds_set(context->ds, qual, ds_absolute_maximum, buffer + size); | ||
| 438 | |||
| 439 | if (ovfl) { | ||
| 440 | /* todo: select a suitable interrupt threshold */ | ||
| 441 | } else | ||
| 442 | ds_set(context->ds, qual, | ||
| 443 | ds_interrupt_threshold, buffer + size + 1); | ||
| 444 | |||
| 445 | /* we keep the context until ds_release */ | ||
| 446 | return error; | ||
| 447 | |||
| 448 | out_release: | ||
| 449 | context->owner[qual] = NULL; | ||
| 450 | ds_put_context(context); | ||
| 451 | return error; | ||
| 452 | |||
| 453 | out_unlock: | ||
| 454 | spin_unlock(&ds_lock); | ||
| 455 | ds_put_context(context); | ||
| 456 | return error; | ||
| 149 | } | 457 | } | 
| 150 | static inline void set_from_ip(char *base, unsigned long value) | 458 | |
| 459 | int ds_request_bts(struct task_struct *task, void *base, size_t size, | ||
| 460 | ds_ovfl_callback_t ovfl) | ||
| 151 | { | 461 | { | 
| 152 | (*(unsigned long *)(base + ds_cfg.from_ip.offset)) = value; | 462 | return ds_request(task, base, size, ovfl, ds_bts); | 
| 153 | } | 463 | } | 
| 154 | static inline unsigned long get_to_ip(char *base) | 464 | |
| 465 | int ds_request_pebs(struct task_struct *task, void *base, size_t size, | ||
| 466 | ds_ovfl_callback_t ovfl) | ||
| 155 | { | 467 | { | 
| 156 | return *(unsigned long *)(base + ds_cfg.to_ip.offset); | 468 | return ds_request(task, base, size, ovfl, ds_pebs); | 
| 157 | } | 469 | } | 
| 158 | static inline void set_to_ip(char *base, unsigned long value) | 470 | |
| 471 | static int ds_release(struct task_struct *task, enum ds_qualifier qual) | ||
| 159 | { | 472 | { | 
| 160 | (*(unsigned long *)(base + ds_cfg.to_ip.offset)) = value; | 473 | struct ds_context *context; | 
| 474 | int error; | ||
| 475 | |||
| 476 | context = ds_get_context(task); | ||
| 477 | error = ds_validate_access(context, qual); | ||
| 478 | if (error < 0) | ||
| 479 | goto out; | ||
| 480 | |||
| 481 | kfree(context->buffer[qual]); | ||
| 482 | context->buffer[qual] = NULL; | ||
| 483 | |||
| 484 | current->mm->total_vm -= context->pages[qual]; | ||
| 485 | current->mm->locked_vm -= context->pages[qual]; | ||
| 486 | context->pages[qual] = 0; | ||
| 487 | context->owner[qual] = NULL; | ||
| 488 | |||
| 489 | /* | ||
| 490 | * we put the context twice: | ||
| 491 | * once for the ds_get_context | ||
| 492 | * once for the corresponding ds_request | ||
| 493 | */ | ||
| 494 | ds_put_context(context); | ||
| 495 | out: | ||
| 496 | ds_put_context(context); | ||
| 497 | return error; | ||
| 161 | } | 498 | } | 
| 162 | static inline unsigned char get_info_type(char *base) | 499 | |
| 500 | int ds_release_bts(struct task_struct *task) | ||
| 163 | { | 501 | { | 
| 164 | return *(unsigned char *)(base + ds_cfg.info_type.offset); | 502 | return ds_release(task, ds_bts); | 
| 165 | } | 503 | } | 
| 166 | static inline void set_info_type(char *base, unsigned char value) | 504 | |
| 505 | int ds_release_pebs(struct task_struct *task) | ||
| 167 | { | 506 | { | 
| 168 | (*(unsigned char *)(base + ds_cfg.info_type.offset)) = value; | 507 | return ds_release(task, ds_pebs); | 
| 169 | } | 508 | } | 
| 170 | static inline unsigned long get_info_data(char *base) | 509 | |
| 510 | static int ds_get_index(struct task_struct *task, size_t *pos, | ||
| 511 | enum ds_qualifier qual) | ||
| 171 | { | 512 | { | 
| 172 | return *(unsigned long *)(base + ds_cfg.info_data.offset); | 513 | struct ds_context *context; | 
| 514 | unsigned long base, index; | ||
| 515 | int error; | ||
| 516 | |||
| 517 | context = ds_get_context(task); | ||
| 518 | error = ds_validate_access(context, qual); | ||
| 519 | if (error < 0) | ||
| 520 | goto out; | ||
| 521 | |||
| 522 | base = ds_get(context->ds, qual, ds_buffer_base); | ||
| 523 | index = ds_get(context->ds, qual, ds_index); | ||
| 524 | |||
| 525 | error = ((index - base) / ds_cfg.sizeof_rec[qual]); | ||
| 526 | if (pos) | ||
| 527 | *pos = error; | ||
| 528 | out: | ||
| 529 | ds_put_context(context); | ||
| 530 | return error; | ||
| 173 | } | 531 | } | 
| 174 | static inline void set_info_data(char *base, unsigned long value) | 532 | |
| 533 | int ds_get_bts_index(struct task_struct *task, size_t *pos) | ||
| 175 | { | 534 | { | 
| 176 | (*(unsigned long *)(base + ds_cfg.info_data.offset)) = value; | 535 | return ds_get_index(task, pos, ds_bts); | 
| 177 | } | 536 | } | 
| 178 | 537 | ||
| 538 | int ds_get_pebs_index(struct task_struct *task, size_t *pos) | ||
| 539 | { | ||
| 540 | return ds_get_index(task, pos, ds_pebs); | ||
| 541 | } | ||
| 179 | 542 | ||
| 180 | int ds_allocate(void **dsp, size_t bts_size_in_bytes) | 543 | static int ds_get_end(struct task_struct *task, size_t *pos, | 
| 544 | enum ds_qualifier qual) | ||
| 181 | { | 545 | { | 
| 182 | size_t bts_size_in_records; | 546 | struct ds_context *context; | 
| 183 | unsigned long bts; | 547 | unsigned long base, end; | 
| 184 | void *ds; | 548 | int error; | 
| 549 | |||
| 550 | context = ds_get_context(task); | ||
| 551 | error = ds_validate_access(context, qual); | ||
| 552 | if (error < 0) | ||
| 553 | goto out; | ||
| 554 | |||
| 555 | base = ds_get(context->ds, qual, ds_buffer_base); | ||
| 556 | end = ds_get(context->ds, qual, ds_absolute_maximum); | ||
| 557 | |||
| 558 | error = ((end - base) / ds_cfg.sizeof_rec[qual]); | ||
| 559 | if (pos) | ||
| 560 | *pos = error; | ||
| 561 | out: | ||
| 562 | ds_put_context(context); | ||
| 563 | return error; | ||
| 564 | } | ||
| 185 | 565 | ||
| 186 | if (!ds_cfg.sizeof_ds || !ds_cfg.sizeof_bts) | 566 | int ds_get_bts_end(struct task_struct *task, size_t *pos) | 
| 187 | return -EOPNOTSUPP; | 567 | { | 
| 568 | return ds_get_end(task, pos, ds_bts); | ||
| 569 | } | ||
| 188 | 570 | ||
| 189 | if (bts_size_in_bytes < 0) | 571 | int ds_get_pebs_end(struct task_struct *task, size_t *pos) | 
| 190 | return -EINVAL; | 572 | { | 
| 573 | return ds_get_end(task, pos, ds_pebs); | ||
| 574 | } | ||
| 191 | 575 | ||
| 192 | bts_size_in_records = | 576 | static int ds_access(struct task_struct *task, size_t index, | 
| 193 | bts_size_in_bytes / ds_cfg.sizeof_bts; | 577 | const void **record, enum ds_qualifier qual) | 
| 194 | bts_size_in_bytes = | 578 | { | 
| 195 | bts_size_in_records * ds_cfg.sizeof_bts; | 579 | struct ds_context *context; | 
| 580 | unsigned long base, idx; | ||
| 581 | int error; | ||
| 196 | 582 | ||
| 197 | if (bts_size_in_bytes <= 0) | 583 | if (!record) | 
| 198 | return -EINVAL; | 584 | return -EINVAL; | 
| 199 | 585 | ||
| 200 | bts = (unsigned long)kzalloc(bts_size_in_bytes, GFP_KERNEL); | 586 | context = ds_get_context(task); | 
| 201 | 587 | error = ds_validate_access(context, qual); | |
| 202 | if (!bts) | 588 | if (error < 0) | 
| 203 | return -ENOMEM; | 589 | goto out; | 
| 204 | 590 | ||
| 205 | ds = kzalloc(ds_cfg.sizeof_ds, GFP_KERNEL); | 591 | base = ds_get(context->ds, qual, ds_buffer_base); | 
| 592 | idx = base + (index * ds_cfg.sizeof_rec[qual]); | ||
| 206 | 593 | ||
| 207 | if (!ds) { | 594 | error = -EINVAL; | 
| 208 | kfree((void *)bts); | 595 | if (idx > ds_get(context->ds, qual, ds_absolute_maximum)) | 
| 209 | return -ENOMEM; | 596 | goto out; | 
| 210 | } | ||
| 211 | |||
| 212 | set_bts_buffer_base(ds, bts); | ||
| 213 | set_bts_index(ds, bts); | ||
| 214 | set_bts_absolute_maximum(ds, bts + bts_size_in_bytes); | ||
| 215 | set_bts_interrupt_threshold(ds, bts + bts_size_in_bytes + 1); | ||
| 216 | 597 | ||
| 217 | *dsp = ds; | 598 | *record = (const void *)idx; | 
| 218 | return 0; | 599 | error = ds_cfg.sizeof_rec[qual]; | 
| 600 | out: | ||
| 601 | ds_put_context(context); | ||
| 602 | return error; | ||
| 219 | } | 603 | } | 
| 220 | 604 | ||
| 221 | int ds_free(void **dsp) | 605 | int ds_access_bts(struct task_struct *task, size_t index, const void **record) | 
| 222 | { | 606 | { | 
| 223 | if (*dsp) { | 607 | return ds_access(task, index, record, ds_bts); | 
| 224 | kfree((void *)get_bts_buffer_base(*dsp)); | ||
| 225 | kfree(*dsp); | ||
| 226 | *dsp = NULL; | ||
| 227 | } | ||
| 228 | return 0; | ||
| 229 | } | 608 | } | 
| 230 | 609 | ||
| 231 | int ds_get_bts_size(void *ds) | 610 | int ds_access_pebs(struct task_struct *task, size_t index, const void **record) | 
| 232 | { | 611 | { | 
| 233 | int size_in_bytes; | 612 | return ds_access(task, index, record, ds_pebs); | 
| 234 | |||
| 235 | if (!ds_cfg.sizeof_ds || !ds_cfg.sizeof_bts) | ||
| 236 | return -EOPNOTSUPP; | ||
| 237 | |||
| 238 | if (!ds) | ||
| 239 | return 0; | ||
| 240 | |||
| 241 | size_in_bytes = | ||
| 242 | get_bts_absolute_maximum(ds) - | ||
| 243 | get_bts_buffer_base(ds); | ||
| 244 | return size_in_bytes; | ||
| 245 | } | 613 | } | 
| 246 | 614 | ||
| 247 | int ds_get_bts_end(void *ds) | 615 | static int ds_write(struct task_struct *task, const void *record, size_t size, | 
| 616 | enum ds_qualifier qual, int force) | ||
| 248 | { | 617 | { | 
| 249 | int size_in_bytes = ds_get_bts_size(ds); | 618 | struct ds_context *context; | 
| 250 | 619 | int error; | |
| 251 | if (size_in_bytes <= 0) | ||
| 252 | return size_in_bytes; | ||
| 253 | 620 | ||
| 254 | return size_in_bytes / ds_cfg.sizeof_bts; | 621 | if (!record) | 
| 255 | } | 622 | return -EINVAL; | 
| 256 | 623 | ||
| 257 | int ds_get_bts_index(void *ds) | 624 | error = -EPERM; | 
| 258 | { | 625 | context = ds_get_context(task); | 
| 259 | int index_offset_in_bytes; | 626 | if (!context) | 
| 627 | goto out; | ||
| 260 | 628 | ||
| 261 | if (!ds_cfg.sizeof_ds || !ds_cfg.sizeof_bts) | 629 | if (!force) { | 
| 262 | return -EOPNOTSUPP; | 630 | error = ds_validate_access(context, qual); | 
| 631 | if (error < 0) | ||
| 632 | goto out; | ||
| 633 | } | ||
| 263 | 634 | ||
| 264 | index_offset_in_bytes = | 635 | error = 0; | 
| 265 | get_bts_index(ds) - | 636 | while (size) { | 
| 266 | get_bts_buffer_base(ds); | 637 | unsigned long base, index, end, write_end, int_th; | 
| 638 | unsigned long write_size, adj_write_size; | ||
| 639 | |||
| 640 | /* | ||
| 641 | * write as much as possible without producing an | ||
| 642 | * overflow interrupt. | ||
| 643 | * | ||
| 644 | * interrupt_threshold must either be | ||
| 645 | * - bigger than absolute_maximum or | ||
| 646 | * - point to a record between buffer_base and absolute_maximum | ||
| 647 | * | ||
| 648 | * index points to a valid record. | ||
| 649 | */ | ||
| 650 | base = ds_get(context->ds, qual, ds_buffer_base); | ||
| 651 | index = ds_get(context->ds, qual, ds_index); | ||
| 652 | end = ds_get(context->ds, qual, ds_absolute_maximum); | ||
| 653 | int_th = ds_get(context->ds, qual, ds_interrupt_threshold); | ||
| 654 | |||
| 655 | write_end = min(end, int_th); | ||
| 656 | |||
| 657 | /* if we are already beyond the interrupt threshold, | ||
| 658 | * we fill the entire buffer */ | ||
| 659 | if (write_end <= index) | ||
| 660 | write_end = end; | ||
| 661 | |||
| 662 | if (write_end <= index) | ||
| 663 | goto out; | ||
| 664 | |||
| 665 | write_size = min((unsigned long) size, write_end - index); | ||
| 666 | memcpy((void *)index, record, write_size); | ||
| 667 | |||
| 668 | record = (const char *)record + write_size; | ||
| 669 | size -= write_size; | ||
| 670 | error += write_size; | ||
| 671 | |||
| 672 | adj_write_size = write_size / ds_cfg.sizeof_rec[qual]; | ||
| 673 | adj_write_size *= ds_cfg.sizeof_rec[qual]; | ||
| 674 | |||
| 675 | /* zero out trailing bytes */ | ||
| 676 | memset((char *)index + write_size, 0, | ||
| 677 | adj_write_size - write_size); | ||
| 678 | index += adj_write_size; | ||
| 679 | |||
| 680 | if (index >= end) | ||
| 681 | index = base; | ||
| 682 | ds_set(context->ds, qual, ds_index, index); | ||
| 683 | |||
| 684 | if (index >= int_th) | ||
| 685 | ds_overflow(task, context, qual); | ||
| 686 | } | ||
| 267 | 687 | ||
| 268 | return index_offset_in_bytes / ds_cfg.sizeof_bts; | 688 | out: | 
| 689 | ds_put_context(context); | ||
| 690 | return error; | ||
| 269 | } | 691 | } | 
| 270 | 692 | ||
| 271 | int ds_set_overflow(void *ds, int method) | 693 | int ds_write_bts(struct task_struct *task, const void *record, size_t size) | 
| 272 | { | 694 | { | 
| 273 | switch (method) { | 695 | return ds_write(task, record, size, ds_bts, /* force = */ 0); | 
| 274 | case DS_O_SIGNAL: | ||
| 275 | return -EOPNOTSUPP; | ||
| 276 | case DS_O_WRAP: | ||
| 277 | return 0; | ||
| 278 | default: | ||
| 279 | return -EINVAL; | ||
| 280 | } | ||
| 281 | } | 696 | } | 
| 282 | 697 | ||
| 283 | int ds_get_overflow(void *ds) | 698 | int ds_write_pebs(struct task_struct *task, const void *record, size_t size) | 
| 284 | { | 699 | { | 
| 285 | return DS_O_WRAP; | 700 | return ds_write(task, record, size, ds_pebs, /* force = */ 0); | 
| 286 | } | 701 | } | 
| 287 | 702 | ||
| 288 | int ds_clear(void *ds) | 703 | int ds_unchecked_write_bts(struct task_struct *task, | 
| 704 | const void *record, size_t size) | ||
| 289 | { | 705 | { | 
| 290 | int bts_size = ds_get_bts_size(ds); | 706 | return ds_write(task, record, size, ds_bts, /* force = */ 1); | 
| 291 | unsigned long bts_base; | ||
| 292 | |||
| 293 | if (bts_size <= 0) | ||
| 294 | return bts_size; | ||
| 295 | |||
| 296 | bts_base = get_bts_buffer_base(ds); | ||
| 297 | memset((void *)bts_base, 0, bts_size); | ||
| 298 | |||
| 299 | set_bts_index(ds, bts_base); | ||
| 300 | return 0; | ||
| 301 | } | 707 | } | 
| 302 | 708 | ||
| 303 | int ds_read_bts(void *ds, int index, struct bts_struct *out) | 709 | int ds_unchecked_write_pebs(struct task_struct *task, | 
| 710 | const void *record, size_t size) | ||
| 304 | { | 711 | { | 
| 305 | void *bts; | 712 | return ds_write(task, record, size, ds_pebs, /* force = */ 1); | 
| 713 | } | ||
| 306 | 714 | ||
| 307 | if (!ds_cfg.sizeof_ds || !ds_cfg.sizeof_bts) | 715 | static int ds_reset_or_clear(struct task_struct *task, | 
| 308 | return -EOPNOTSUPP; | 716 | enum ds_qualifier qual, int clear) | 
| 717 | { | ||
| 718 | struct ds_context *context; | ||
| 719 | unsigned long base, end; | ||
| 720 | int error; | ||
| 309 | 721 | ||
| 310 | if (index < 0) | 722 | context = ds_get_context(task); | 
| 311 | return -EINVAL; | 723 | error = ds_validate_access(context, qual); | 
| 724 | if (error < 0) | ||
| 725 | goto out; | ||
| 312 | 726 | ||
| 313 | if (index >= ds_get_bts_size(ds)) | 727 | base = ds_get(context->ds, qual, ds_buffer_base); | 
| 314 | return -EINVAL; | 728 | end = ds_get(context->ds, qual, ds_absolute_maximum); | 
| 315 | 729 | ||
| 316 | bts = (void *)(get_bts_buffer_base(ds) + (index * ds_cfg.sizeof_bts)); | 730 | if (clear) | 
| 731 | memset((void *)base, 0, end - base); | ||
| 317 | 732 | ||
| 318 | memset(out, 0, sizeof(*out)); | 733 | ds_set(context->ds, qual, ds_index, base); | 
| 319 | if (get_from_ip(bts) == BTS_ESCAPE_ADDRESS) { | ||
| 320 | out->qualifier = get_info_type(bts); | ||
| 321 | out->variant.jiffies = get_info_data(bts); | ||
| 322 | } else { | ||
| 323 | out->qualifier = BTS_BRANCH; | ||
| 324 | out->variant.lbr.from_ip = get_from_ip(bts); | ||
| 325 | out->variant.lbr.to_ip = get_to_ip(bts); | ||
| 326 | } | ||
| 327 | 734 | ||
| 328 | return sizeof(*out);; | 735 | error = 0; | 
| 736 | out: | ||
| 737 | ds_put_context(context); | ||
| 738 | return error; | ||
| 329 | } | 739 | } | 
| 330 | 740 | ||
| 331 | int ds_write_bts(void *ds, const struct bts_struct *in) | 741 | int ds_reset_bts(struct task_struct *task) | 
| 332 | { | 742 | { | 
| 333 | unsigned long bts; | 743 | return ds_reset_or_clear(task, ds_bts, /* clear = */ 0); | 
| 334 | 744 | } | |
| 335 | if (!ds_cfg.sizeof_ds || !ds_cfg.sizeof_bts) | ||
| 336 | return -EOPNOTSUPP; | ||
| 337 | |||
| 338 | if (ds_get_bts_size(ds) <= 0) | ||
| 339 | return -ENXIO; | ||
| 340 | 745 | ||
| 341 | bts = get_bts_index(ds); | 746 | int ds_reset_pebs(struct task_struct *task) | 
| 747 | { | ||
| 748 | return ds_reset_or_clear(task, ds_pebs, /* clear = */ 0); | ||
| 749 | } | ||
| 342 | 750 | ||
| 343 | memset((void *)bts, 0, ds_cfg.sizeof_bts); | 751 | int ds_clear_bts(struct task_struct *task) | 
| 344 | switch (in->qualifier) { | 752 | { | 
| 345 | case BTS_INVALID: | 753 | return ds_reset_or_clear(task, ds_bts, /* clear = */ 1); | 
| 346 | break; | 754 | } | 
| 347 | 755 | ||
| 348 | case BTS_BRANCH: | 756 | int ds_clear_pebs(struct task_struct *task) | 
| 349 | set_from_ip((void *)bts, in->variant.lbr.from_ip); | 757 | { | 
| 350 | set_to_ip((void *)bts, in->variant.lbr.to_ip); | 758 | return ds_reset_or_clear(task, ds_pebs, /* clear = */ 1); | 
| 351 | break; | 759 | } | 
| 352 | 760 | ||
| 353 | case BTS_TASK_ARRIVES: | 761 | int ds_get_pebs_reset(struct task_struct *task, u64 *value) | 
| 354 | case BTS_TASK_DEPARTS: | 762 | { | 
| 355 | set_from_ip((void *)bts, BTS_ESCAPE_ADDRESS); | 763 | struct ds_context *context; | 
| 356 | set_info_type((void *)bts, in->qualifier); | 764 | int error; | 
| 357 | set_info_data((void *)bts, in->variant.jiffies); | ||
| 358 | break; | ||
| 359 | 765 | ||
| 360 | default: | 766 | if (!value) | 
| 361 | return -EINVAL; | 767 | return -EINVAL; | 
| 362 | } | ||
| 363 | 768 | ||
| 364 | bts = bts + ds_cfg.sizeof_bts; | 769 | context = ds_get_context(task); | 
| 365 | if (bts >= get_bts_absolute_maximum(ds)) | 770 | error = ds_validate_access(context, ds_pebs); | 
| 366 | bts = get_bts_buffer_base(ds); | 771 | if (error < 0) | 
| 367 | set_bts_index(ds, bts); | 772 | goto out; | 
| 368 | 773 | ||
| 369 | return ds_cfg.sizeof_bts; | 774 | *value = *(u64 *)(context->ds + (ds_cfg.sizeof_field * 8)); | 
| 775 | |||
| 776 | error = 0; | ||
| 777 | out: | ||
| 778 | ds_put_context(context); | ||
| 779 | return error; | ||
| 370 | } | 780 | } | 
| 371 | 781 | ||
| 372 | unsigned long ds_debugctl_mask(void) | 782 | int ds_set_pebs_reset(struct task_struct *task, u64 value) | 
| 373 | { | 783 | { | 
| 374 | return ds_cfg.debugctl_mask; | 784 | struct ds_context *context; | 
| 375 | } | 785 | int error; | 
| 376 | 786 | ||
| 377 | #ifdef __i386__ | 787 | context = ds_get_context(task); | 
| 378 | static const struct ds_configuration ds_cfg_netburst = { | 788 | error = ds_validate_access(context, ds_pebs); | 
| 379 | .sizeof_ds = 9 * 4, | 789 | if (error < 0) | 
| 380 | .bts_buffer_base = { 0, 4 }, | 790 | goto out; | 
| 381 | .bts_index = { 4, 4 }, | ||
| 382 | .bts_absolute_maximum = { 8, 4 }, | ||
| 383 | .bts_interrupt_threshold = { 12, 4 }, | ||
| 384 | .sizeof_bts = 3 * 4, | ||
| 385 | .from_ip = { 0, 4 }, | ||
| 386 | .to_ip = { 4, 4 }, | ||
| 387 | .info_type = { 4, 1 }, | ||
| 388 | .info_data = { 8, 4 }, | ||
| 389 | .debugctl_mask = (1<<2)|(1<<3) | ||
| 390 | }; | ||
| 391 | 791 | ||
| 392 | static const struct ds_configuration ds_cfg_pentium_m = { | 792 | *(u64 *)(context->ds + (ds_cfg.sizeof_field * 8)) = value; | 
| 393 | .sizeof_ds = 9 * 4, | 793 | |
| 394 | .bts_buffer_base = { 0, 4 }, | 794 | error = 0; | 
| 395 | .bts_index = { 4, 4 }, | 795 | out: | 
| 396 | .bts_absolute_maximum = { 8, 4 }, | 796 | ds_put_context(context); | 
| 397 | .bts_interrupt_threshold = { 12, 4 }, | 797 | return error; | 
| 398 | .sizeof_bts = 3 * 4, | 798 | } | 
| 399 | .from_ip = { 0, 4 }, | 799 | |
| 400 | .to_ip = { 4, 4 }, | 800 | static const struct ds_configuration ds_cfg_var = { | 
| 401 | .info_type = { 4, 1 }, | 801 | .sizeof_ds = sizeof(long) * 12, | 
| 402 | .info_data = { 8, 4 }, | 802 | .sizeof_field = sizeof(long), | 
| 403 | .debugctl_mask = (1<<6)|(1<<7) | 803 | .sizeof_rec[ds_bts] = sizeof(long) * 3, | 
| 804 | .sizeof_rec[ds_pebs] = sizeof(long) * 10 | ||
| 404 | }; | 805 | }; | 
| 405 | #endif /* _i386_ */ | 806 | static const struct ds_configuration ds_cfg_64 = { | 
| 406 | 807 | .sizeof_ds = 8 * 12, | |
| 407 | static const struct ds_configuration ds_cfg_core2 = { | 808 | .sizeof_field = 8, | 
| 408 | .sizeof_ds = 9 * 8, | 809 | .sizeof_rec[ds_bts] = 8 * 3, | 
| 409 | .bts_buffer_base = { 0, 8 }, | 810 | .sizeof_rec[ds_pebs] = 8 * 10 | 
| 410 | .bts_index = { 8, 8 }, | ||
| 411 | .bts_absolute_maximum = { 16, 8 }, | ||
| 412 | .bts_interrupt_threshold = { 24, 8 }, | ||
| 413 | .sizeof_bts = 3 * 8, | ||
| 414 | .from_ip = { 0, 8 }, | ||
| 415 | .to_ip = { 8, 8 }, | ||
| 416 | .info_type = { 8, 1 }, | ||
| 417 | .info_data = { 16, 8 }, | ||
| 418 | .debugctl_mask = (1<<6)|(1<<7)|(1<<9) | ||
| 419 | }; | 811 | }; | 
| 420 | 812 | ||
| 421 | static inline void | 813 | static inline void | 
| @@ -429,14 +821,13 @@ void __cpuinit ds_init_intel(struct cpuinfo_x86 *c) | |||
| 429 | switch (c->x86) { | 821 | switch (c->x86) { | 
| 430 | case 0x6: | 822 | case 0x6: | 
| 431 | switch (c->x86_model) { | 823 | switch (c->x86_model) { | 
| 432 | #ifdef __i386__ | ||
| 433 | case 0xD: | 824 | case 0xD: | 
| 434 | case 0xE: /* Pentium M */ | 825 | case 0xE: /* Pentium M */ | 
| 435 | ds_configure(&ds_cfg_pentium_m); | 826 | ds_configure(&ds_cfg_var); | 
| 436 | break; | 827 | break; | 
| 437 | #endif /* _i386_ */ | ||
| 438 | case 0xF: /* Core2 */ | 828 | case 0xF: /* Core2 */ | 
| 439 | ds_configure(&ds_cfg_core2); | 829 | case 0x1C: /* Atom */ | 
| 830 | ds_configure(&ds_cfg_64); | ||
| 440 | break; | 831 | break; | 
| 441 | default: | 832 | default: | 
| 442 | /* sorry, don't know about them */ | 833 | /* sorry, don't know about them */ | 
| @@ -445,13 +836,11 @@ void __cpuinit ds_init_intel(struct cpuinfo_x86 *c) | |||
| 445 | break; | 836 | break; | 
| 446 | case 0xF: | 837 | case 0xF: | 
| 447 | switch (c->x86_model) { | 838 | switch (c->x86_model) { | 
| 448 | #ifdef __i386__ | ||
| 449 | case 0x0: | 839 | case 0x0: | 
| 450 | case 0x1: | 840 | case 0x1: | 
| 451 | case 0x2: /* Netburst */ | 841 | case 0x2: /* Netburst */ | 
| 452 | ds_configure(&ds_cfg_netburst); | 842 | ds_configure(&ds_cfg_var); | 
| 453 | break; | 843 | break; | 
| 454 | #endif /* _i386_ */ | ||
| 455 | default: | 844 | default: | 
| 456 | /* sorry, don't know about them */ | 845 | /* sorry, don't know about them */ | 
| 457 | break; | 846 | break; | 
| @@ -462,3 +851,14 @@ void __cpuinit ds_init_intel(struct cpuinfo_x86 *c) | |||
| 462 | break; | 851 | break; | 
| 463 | } | 852 | } | 
| 464 | } | 853 | } | 
| 854 | |||
| 855 | void ds_free(struct ds_context *context) | ||
| 856 | { | ||
| 857 | /* This is called when the task owning the parameter context | ||
| 858 | * is dying. There should not be any user of that context left | ||
| 859 | * to disturb us, anymore. */ | ||
| 860 | unsigned long leftovers = context->count; | ||
| 861 | while (leftovers--) | ||
| 862 | ds_put_context(context); | ||
| 863 | } | ||
| 864 | #endif /* CONFIG_X86_DS */ | ||
| diff --git a/arch/x86/kernel/efi.c b/arch/x86/kernel/efi.c index 06cc8d4254b1..945a31cdd81f 100644 --- a/arch/x86/kernel/efi.c +++ b/arch/x86/kernel/efi.c | |||
| @@ -414,9 +414,11 @@ void __init efi_init(void) | |||
| 414 | if (memmap.map == NULL) | 414 | if (memmap.map == NULL) | 
| 415 | printk(KERN_ERR "Could not map the EFI memory map!\n"); | 415 | printk(KERN_ERR "Could not map the EFI memory map!\n"); | 
| 416 | memmap.map_end = memmap.map + (memmap.nr_map * memmap.desc_size); | 416 | memmap.map_end = memmap.map + (memmap.nr_map * memmap.desc_size); | 
| 417 | |||
| 417 | if (memmap.desc_size != sizeof(efi_memory_desc_t)) | 418 | if (memmap.desc_size != sizeof(efi_memory_desc_t)) | 
| 418 | printk(KERN_WARNING "Kernel-defined memdesc" | 419 | printk(KERN_WARNING | 
| 419 | "doesn't match the one from EFI!\n"); | 420 | "Kernel-defined memdesc doesn't match the one from EFI!\n"); | 
| 421 | |||
| 420 | if (add_efi_memmap) | 422 | if (add_efi_memmap) | 
| 421 | do_add_efi_memmap(); | 423 | do_add_efi_memmap(); | 
| 422 | 424 | ||
| diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 89434d439605..cf3a0b2d0059 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
| @@ -275,9 +275,9 @@ ENTRY(native_usergs_sysret64) | |||
| 275 | ENTRY(ret_from_fork) | 275 | ENTRY(ret_from_fork) | 
| 276 | CFI_DEFAULT_STACK | 276 | CFI_DEFAULT_STACK | 
| 277 | push kernel_eflags(%rip) | 277 | push kernel_eflags(%rip) | 
| 278 | CFI_ADJUST_CFA_OFFSET 4 | 278 | CFI_ADJUST_CFA_OFFSET 8 | 
| 279 | popf # reset kernel eflags | 279 | popf # reset kernel eflags | 
| 280 | CFI_ADJUST_CFA_OFFSET -4 | 280 | CFI_ADJUST_CFA_OFFSET -8 | 
| 281 | call schedule_tail | 281 | call schedule_tail | 
| 282 | GET_THREAD_INFO(%rcx) | 282 | GET_THREAD_INFO(%rcx) | 
| 283 | testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),TI_flags(%rcx) | 283 | testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),TI_flags(%rcx) | 
| diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index 9bfc4d72fb2e..d16084f90649 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c | |||
| @@ -108,12 +108,11 @@ void __init x86_64_start_kernel(char * real_mode_data) | |||
| 108 | } | 108 | } | 
| 109 | load_idt((const struct desc_ptr *)&idt_descr); | 109 | load_idt((const struct desc_ptr *)&idt_descr); | 
| 110 | 110 | ||
| 111 | early_printk("Kernel alive\n"); | 111 | if (console_loglevel == 10) | 
| 112 | early_printk("Kernel alive\n"); | ||
| 112 | 113 | ||
| 113 | x86_64_init_pda(); | 114 | x86_64_init_pda(); | 
| 114 | 115 | ||
| 115 | early_printk("Kernel really alive\n"); | ||
| 116 | |||
| 117 | x86_64_start_reservations(real_mode_data); | 116 | x86_64_start_reservations(real_mode_data); | 
| 118 | } | 117 | } | 
| 119 | 118 | ||
| diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c index 50e5e4a31c85..191914302744 100644 --- a/arch/x86/kernel/ioport.c +++ b/arch/x86/kernel/ioport.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/slab.h> | 14 | #include <linux/slab.h> | 
| 15 | #include <linux/thread_info.h> | 15 | #include <linux/thread_info.h> | 
| 16 | #include <linux/syscalls.h> | 16 | #include <linux/syscalls.h> | 
| 17 | #include <asm/syscalls.h> | ||
| 17 | 18 | ||
| 18 | /* Set EXTENT bits starting at BASE in BITMAP to value TURN_ON. */ | 19 | /* Set EXTENT bits starting at BASE in BITMAP to value TURN_ON. */ | 
| 19 | static void set_bitmap(unsigned long *bitmap, unsigned int base, | 20 | static void set_bitmap(unsigned long *bitmap, unsigned int base, | 
| diff --git a/arch/x86/kernel/ipi.c b/arch/x86/kernel/ipi.c index 3f7537b669d3..f1c688e46f35 100644 --- a/arch/x86/kernel/ipi.c +++ b/arch/x86/kernel/ipi.c | |||
| @@ -20,6 +20,8 @@ | |||
| 20 | 20 | ||
| 21 | #ifdef CONFIG_X86_32 | 21 | #ifdef CONFIG_X86_32 | 
| 22 | #include <mach_apic.h> | 22 | #include <mach_apic.h> | 
| 23 | #include <mach_ipi.h> | ||
| 24 | |||
| 23 | /* | 25 | /* | 
| 24 | * the following functions deal with sending IPIs between CPUs. | 26 | * the following functions deal with sending IPIs between CPUs. | 
| 25 | * | 27 | * | 
| @@ -147,7 +149,6 @@ void send_IPI_mask_sequence(cpumask_t mask, int vector) | |||
| 147 | } | 149 | } | 
| 148 | 150 | ||
| 149 | /* must come after the send_IPI functions above for inlining */ | 151 | /* must come after the send_IPI functions above for inlining */ | 
| 150 | #include <mach_ipi.h> | ||
| 151 | static int convert_apicid_to_cpu(int apic_id) | 152 | static int convert_apicid_to_cpu(int apic_id) | 
| 152 | { | 153 | { | 
| 153 | int i; | 154 | int i; | 
| diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c index 1cf8c1fcc088..b71e02d42f4f 100644 --- a/arch/x86/kernel/irq_32.c +++ b/arch/x86/kernel/irq_32.c | |||
| @@ -325,7 +325,7 @@ skip: | |||
| 325 | for_each_online_cpu(j) | 325 | for_each_online_cpu(j) | 
| 326 | seq_printf(p, "%10u ", | 326 | seq_printf(p, "%10u ", | 
| 327 | per_cpu(irq_stat,j).irq_call_count); | 327 | per_cpu(irq_stat,j).irq_call_count); | 
| 328 | seq_printf(p, " function call interrupts\n"); | 328 | seq_printf(p, " Function call interrupts\n"); | 
| 329 | seq_printf(p, "TLB: "); | 329 | seq_printf(p, "TLB: "); | 
| 330 | for_each_online_cpu(j) | 330 | for_each_online_cpu(j) | 
| 331 | seq_printf(p, "%10u ", | 331 | seq_printf(p, "%10u ", | 
| diff --git a/arch/x86/kernel/irq_64.c b/arch/x86/kernel/irq_64.c index 1f78b238d8d2..f065fe9071b9 100644 --- a/arch/x86/kernel/irq_64.c +++ b/arch/x86/kernel/irq_64.c | |||
| @@ -129,7 +129,7 @@ skip: | |||
| 129 | seq_printf(p, "CAL: "); | 129 | seq_printf(p, "CAL: "); | 
| 130 | for_each_online_cpu(j) | 130 | for_each_online_cpu(j) | 
| 131 | seq_printf(p, "%10u ", cpu_pda(j)->irq_call_count); | 131 | seq_printf(p, "%10u ", cpu_pda(j)->irq_call_count); | 
| 132 | seq_printf(p, " function call interrupts\n"); | 132 | seq_printf(p, " Function call interrupts\n"); | 
| 133 | seq_printf(p, "TLB: "); | 133 | seq_printf(p, "TLB: "); | 
| 134 | for_each_online_cpu(j) | 134 | for_each_online_cpu(j) | 
| 135 | seq_printf(p, "%10u ", cpu_pda(j)->irq_tlb_count); | 135 | seq_printf(p, "%10u ", cpu_pda(j)->irq_tlb_count); | 
| diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c index 8b7a3cf37d2b..478bca986eca 100644 --- a/arch/x86/kernel/kvm.c +++ b/arch/x86/kernel/kvm.c | |||
| @@ -178,7 +178,7 @@ static void kvm_flush_tlb(void) | |||
| 178 | kvm_deferred_mmu_op(&ftlb, sizeof ftlb); | 178 | kvm_deferred_mmu_op(&ftlb, sizeof ftlb); | 
| 179 | } | 179 | } | 
| 180 | 180 | ||
| 181 | static void kvm_release_pt(u32 pfn) | 181 | static void kvm_release_pt(unsigned long pfn) | 
| 182 | { | 182 | { | 
| 183 | struct kvm_mmu_op_release_pt rpt = { | 183 | struct kvm_mmu_op_release_pt rpt = { | 
| 184 | .header.op = KVM_MMU_OP_RELEASE_PT, | 184 | .header.op = KVM_MMU_OP_RELEASE_PT, | 
| diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c index b68e21f06f4f..0ed5f939b905 100644 --- a/arch/x86/kernel/ldt.c +++ b/arch/x86/kernel/ldt.c | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #include <asm/ldt.h> | 18 | #include <asm/ldt.h> | 
| 19 | #include <asm/desc.h> | 19 | #include <asm/desc.h> | 
| 20 | #include <asm/mmu_context.h> | 20 | #include <asm/mmu_context.h> | 
| 21 | #include <asm/syscalls.h> | ||
| 21 | 22 | ||
| 22 | #ifdef CONFIG_SMP | 23 | #ifdef CONFIG_SMP | 
| 23 | static void flush_ldt(void *current_mm) | 24 | static void flush_ldt(void *current_mm) | 
| diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index abb78a2cc4ad..2c97f07f1c2c 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c | |||
| @@ -299,6 +299,15 @@ void acpi_nmi_disable(void) | |||
| 299 | on_each_cpu(__acpi_nmi_disable, NULL, 1); | 299 | on_each_cpu(__acpi_nmi_disable, NULL, 1); | 
| 300 | } | 300 | } | 
| 301 | 301 | ||
| 302 | /* | ||
| 303 | * This function is called as soon the LAPIC NMI watchdog driver has everything | ||
| 304 | * in place and it's ready to check if the NMIs belong to the NMI watchdog | ||
| 305 | */ | ||
| 306 | void cpu_nmi_set_wd_enabled(void) | ||
| 307 | { | ||
| 308 | __get_cpu_var(wd_enabled) = 1; | ||
| 309 | } | ||
| 310 | |||
| 302 | void setup_apic_nmi_watchdog(void *unused) | 311 | void setup_apic_nmi_watchdog(void *unused) | 
| 303 | { | 312 | { | 
| 304 | if (__get_cpu_var(wd_enabled)) | 313 | if (__get_cpu_var(wd_enabled)) | 
| @@ -311,8 +320,6 @@ void setup_apic_nmi_watchdog(void *unused) | |||
| 311 | 320 | ||
| 312 | switch (nmi_watchdog) { | 321 | switch (nmi_watchdog) { | 
| 313 | case NMI_LOCAL_APIC: | 322 | case NMI_LOCAL_APIC: | 
| 314 | /* enable it before to avoid race with handler */ | ||
| 315 | __get_cpu_var(wd_enabled) = 1; | ||
| 316 | if (lapic_watchdog_init(nmi_hz) < 0) { | 323 | if (lapic_watchdog_init(nmi_hz) < 0) { | 
| 317 | __get_cpu_var(wd_enabled) = 0; | 324 | __get_cpu_var(wd_enabled) = 0; | 
| 318 | return; | 325 | return; | 
| diff --git a/arch/x86/kernel/olpc.c b/arch/x86/kernel/olpc.c index 3e6672274807..7a13fac63a1f 100644 --- a/arch/x86/kernel/olpc.c +++ b/arch/x86/kernel/olpc.c | |||
| @@ -190,12 +190,12 @@ EXPORT_SYMBOL_GPL(olpc_ec_cmd); | |||
| 190 | static void __init platform_detect(void) | 190 | static void __init platform_detect(void) | 
| 191 | { | 191 | { | 
| 192 | size_t propsize; | 192 | size_t propsize; | 
| 193 | u32 rev; | 193 | __be32 rev; | 
| 194 | 194 | ||
| 195 | if (ofw("getprop", 4, 1, NULL, "board-revision-int", &rev, 4, | 195 | if (ofw("getprop", 4, 1, NULL, "board-revision-int", &rev, 4, | 
| 196 | &propsize) || propsize != 4) { | 196 | &propsize) || propsize != 4) { | 
| 197 | printk(KERN_ERR "ofw: getprop call failed!\n"); | 197 | printk(KERN_ERR "ofw: getprop call failed!\n"); | 
| 198 | rev = 0; | 198 | rev = cpu_to_be32(0); | 
| 199 | } | 199 | } | 
| 200 | olpc_platform_info.boardrev = be32_to_cpu(rev); | 200 | olpc_platform_info.boardrev = be32_to_cpu(rev); | 
| 201 | } | 201 | } | 
| @@ -203,7 +203,7 @@ static void __init platform_detect(void) | |||
| 203 | static void __init platform_detect(void) | 203 | static void __init platform_detect(void) | 
| 204 | { | 204 | { | 
| 205 | /* stopgap until OFW support is added to the kernel */ | 205 | /* stopgap until OFW support is added to the kernel */ | 
| 206 | olpc_platform_info.boardrev = be32_to_cpu(0xc2); | 206 | olpc_platform_info.boardrev = 0xc2; | 
| 207 | } | 207 | } | 
| 208 | #endif | 208 | #endif | 
| 209 | 209 | ||
| diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index 300da17e61cb..e2f43768723a 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c | |||
| @@ -330,6 +330,7 @@ struct pv_cpu_ops pv_cpu_ops = { | |||
| 330 | #endif | 330 | #endif | 
| 331 | .wbinvd = native_wbinvd, | 331 | .wbinvd = native_wbinvd, | 
| 332 | .read_msr = native_read_msr_safe, | 332 | .read_msr = native_read_msr_safe, | 
| 333 | .read_msr_amd = native_read_msr_amd_safe, | ||
| 333 | .write_msr = native_write_msr_safe, | 334 | .write_msr = native_write_msr_safe, | 
| 334 | .read_tsc = native_read_tsc, | 335 | .read_tsc = native_read_tsc, | 
| 335 | .read_pmc = native_read_pmc, | 336 | .read_pmc = native_read_pmc, | 
| diff --git a/arch/x86/kernel/paravirt_patch_32.c b/arch/x86/kernel/paravirt_patch_32.c index 58262218781b..9fe644f4861d 100644 --- a/arch/x86/kernel/paravirt_patch_32.c +++ b/arch/x86/kernel/paravirt_patch_32.c | |||
| @@ -23,7 +23,7 @@ unsigned native_patch(u8 type, u16 clobbers, void *ibuf, | |||
| 23 | start = start_##ops##_##x; \ | 23 | start = start_##ops##_##x; \ | 
| 24 | end = end_##ops##_##x; \ | 24 | end = end_##ops##_##x; \ | 
| 25 | goto patch_site | 25 | goto patch_site | 
| 26 | switch(type) { | 26 | switch (type) { | 
| 27 | PATCH_SITE(pv_irq_ops, irq_disable); | 27 | PATCH_SITE(pv_irq_ops, irq_disable); | 
| 28 | PATCH_SITE(pv_irq_ops, irq_enable); | 28 | PATCH_SITE(pv_irq_ops, irq_enable); | 
| 29 | PATCH_SITE(pv_irq_ops, restore_fl); | 29 | PATCH_SITE(pv_irq_ops, restore_fl); | 
| diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 87d4d6964ec2..f704cb51ff82 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
| @@ -82,7 +82,7 @@ void __init dma32_reserve_bootmem(void) | |||
| 82 | * using 512M as goal | 82 | * using 512M as goal | 
| 83 | */ | 83 | */ | 
| 84 | align = 64ULL<<20; | 84 | align = 64ULL<<20; | 
| 85 | size = round_up(dma32_bootmem_size, align); | 85 | size = roundup(dma32_bootmem_size, align); | 
| 86 | dma32_bootmem_ptr = __alloc_bootmem_nopanic(size, align, | 86 | dma32_bootmem_ptr = __alloc_bootmem_nopanic(size, align, | 
| 87 | 512ULL<<20); | 87 | 512ULL<<20); | 
| 88 | if (dma32_bootmem_ptr) | 88 | if (dma32_bootmem_ptr) | 
| diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c index 49285f8fd4d5..1a895a582534 100644 --- a/arch/x86/kernel/pci-gart_64.c +++ b/arch/x86/kernel/pci-gart_64.c | |||
| @@ -82,7 +82,8 @@ AGPEXTERN __u32 *agp_gatt_table; | |||
| 82 | static unsigned long next_bit; /* protected by iommu_bitmap_lock */ | 82 | static unsigned long next_bit; /* protected by iommu_bitmap_lock */ | 
| 83 | static int need_flush; /* global flush state. set for each gart wrap */ | 83 | static int need_flush; /* global flush state. set for each gart wrap */ | 
| 84 | 84 | ||
| 85 | static unsigned long alloc_iommu(struct device *dev, int size) | 85 | static unsigned long alloc_iommu(struct device *dev, int size, | 
| 86 | unsigned long align_mask) | ||
| 86 | { | 87 | { | 
| 87 | unsigned long offset, flags; | 88 | unsigned long offset, flags; | 
| 88 | unsigned long boundary_size; | 89 | unsigned long boundary_size; | 
| @@ -90,16 +91,17 @@ static unsigned long alloc_iommu(struct device *dev, int size) | |||
| 90 | 91 | ||
| 91 | base_index = ALIGN(iommu_bus_base & dma_get_seg_boundary(dev), | 92 | base_index = ALIGN(iommu_bus_base & dma_get_seg_boundary(dev), | 
| 92 | PAGE_SIZE) >> PAGE_SHIFT; | 93 | PAGE_SIZE) >> PAGE_SHIFT; | 
| 93 | boundary_size = ALIGN(dma_get_seg_boundary(dev) + 1, | 94 | boundary_size = ALIGN((unsigned long long)dma_get_seg_boundary(dev) + 1, | 
| 94 | PAGE_SIZE) >> PAGE_SHIFT; | 95 | PAGE_SIZE) >> PAGE_SHIFT; | 
| 95 | 96 | ||
| 96 | spin_lock_irqsave(&iommu_bitmap_lock, flags); | 97 | spin_lock_irqsave(&iommu_bitmap_lock, flags); | 
| 97 | offset = iommu_area_alloc(iommu_gart_bitmap, iommu_pages, next_bit, | 98 | offset = iommu_area_alloc(iommu_gart_bitmap, iommu_pages, next_bit, | 
| 98 | size, base_index, boundary_size, 0); | 99 | size, base_index, boundary_size, align_mask); | 
| 99 | if (offset == -1) { | 100 | if (offset == -1) { | 
| 100 | need_flush = 1; | 101 | need_flush = 1; | 
| 101 | offset = iommu_area_alloc(iommu_gart_bitmap, iommu_pages, 0, | 102 | offset = iommu_area_alloc(iommu_gart_bitmap, iommu_pages, 0, | 
| 102 | size, base_index, boundary_size, 0); | 103 | size, base_index, boundary_size, | 
| 104 | align_mask); | ||
| 103 | } | 105 | } | 
| 104 | if (offset != -1) { | 106 | if (offset != -1) { | 
| 105 | next_bit = offset+size; | 107 | next_bit = offset+size; | 
| @@ -236,10 +238,10 @@ nonforced_iommu(struct device *dev, unsigned long addr, size_t size) | |||
| 236 | * Caller needs to check if the iommu is needed and flush. | 238 | * Caller needs to check if the iommu is needed and flush. | 
| 237 | */ | 239 | */ | 
| 238 | static dma_addr_t dma_map_area(struct device *dev, dma_addr_t phys_mem, | 240 | static dma_addr_t dma_map_area(struct device *dev, dma_addr_t phys_mem, | 
| 239 | size_t size, int dir) | 241 | size_t size, int dir, unsigned long align_mask) | 
| 240 | { | 242 | { | 
| 241 | unsigned long npages = iommu_num_pages(phys_mem, size); | 243 | unsigned long npages = iommu_num_pages(phys_mem, size); | 
| 242 | unsigned long iommu_page = alloc_iommu(dev, npages); | 244 | unsigned long iommu_page = alloc_iommu(dev, npages, align_mask); | 
| 243 | int i; | 245 | int i; | 
| 244 | 246 | ||
| 245 | if (iommu_page == -1) { | 247 | if (iommu_page == -1) { | 
| @@ -262,7 +264,11 @@ static dma_addr_t dma_map_area(struct device *dev, dma_addr_t phys_mem, | |||
| 262 | static dma_addr_t | 264 | static dma_addr_t | 
| 263 | gart_map_simple(struct device *dev, phys_addr_t paddr, size_t size, int dir) | 265 | gart_map_simple(struct device *dev, phys_addr_t paddr, size_t size, int dir) | 
| 264 | { | 266 | { | 
| 265 | dma_addr_t map = dma_map_area(dev, paddr, size, dir); | 267 | dma_addr_t map; | 
| 268 | unsigned long align_mask; | ||
| 269 | |||
| 270 | align_mask = (1UL << get_order(size)) - 1; | ||
| 271 | map = dma_map_area(dev, paddr, size, dir, align_mask); | ||
| 266 | 272 | ||
| 267 | flush_gart(); | 273 | flush_gart(); | 
| 268 | 274 | ||
| @@ -281,7 +287,8 @@ gart_map_single(struct device *dev, phys_addr_t paddr, size_t size, int dir) | |||
| 281 | if (!need_iommu(dev, paddr, size)) | 287 | if (!need_iommu(dev, paddr, size)) | 
| 282 | return paddr; | 288 | return paddr; | 
| 283 | 289 | ||
| 284 | bus = gart_map_simple(dev, paddr, size, dir); | 290 | bus = dma_map_area(dev, paddr, size, dir, 0); | 
| 291 | flush_gart(); | ||
| 285 | 292 | ||
| 286 | return bus; | 293 | return bus; | 
| 287 | } | 294 | } | 
| @@ -340,7 +347,7 @@ static int dma_map_sg_nonforce(struct device *dev, struct scatterlist *sg, | |||
| 340 | unsigned long addr = sg_phys(s); | 347 | unsigned long addr = sg_phys(s); | 
| 341 | 348 | ||
| 342 | if (nonforced_iommu(dev, addr, s->length)) { | 349 | if (nonforced_iommu(dev, addr, s->length)) { | 
| 343 | addr = dma_map_area(dev, addr, s->length, dir); | 350 | addr = dma_map_area(dev, addr, s->length, dir, 0); | 
| 344 | if (addr == bad_dma_address) { | 351 | if (addr == bad_dma_address) { | 
| 345 | if (i > 0) | 352 | if (i > 0) | 
| 346 | gart_unmap_sg(dev, sg, i, dir); | 353 | gart_unmap_sg(dev, sg, i, dir); | 
| @@ -362,7 +369,7 @@ static int __dma_map_cont(struct device *dev, struct scatterlist *start, | |||
| 362 | int nelems, struct scatterlist *sout, | 369 | int nelems, struct scatterlist *sout, | 
| 363 | unsigned long pages) | 370 | unsigned long pages) | 
| 364 | { | 371 | { | 
| 365 | unsigned long iommu_start = alloc_iommu(dev, pages); | 372 | unsigned long iommu_start = alloc_iommu(dev, pages, 0); | 
| 366 | unsigned long iommu_page = iommu_start; | 373 | unsigned long iommu_page = iommu_start; | 
| 367 | struct scatterlist *s; | 374 | struct scatterlist *s; | 
| 368 | int i; | 375 | int i; | 
| @@ -626,7 +633,6 @@ static __init int init_k8_gatt(struct agp_kern_info *info) | |||
| 626 | struct pci_dev *dev; | 633 | struct pci_dev *dev; | 
| 627 | void *gatt; | 634 | void *gatt; | 
| 628 | int i, error; | 635 | int i, error; | 
| 629 | unsigned long start_pfn, end_pfn; | ||
| 630 | 636 | ||
| 631 | printk(KERN_INFO "PCI-DMA: Disabling AGP.\n"); | 637 | printk(KERN_INFO "PCI-DMA: Disabling AGP.\n"); | 
| 632 | aper_size = aper_base = info->aper_size = 0; | 638 | aper_size = aper_base = info->aper_size = 0; | 
| @@ -672,12 +678,6 @@ static __init int init_k8_gatt(struct agp_kern_info *info) | |||
| 672 | printk(KERN_INFO "PCI-DMA: aperture base @ %x size %u KB\n", | 678 | printk(KERN_INFO "PCI-DMA: aperture base @ %x size %u KB\n", | 
| 673 | aper_base, aper_size>>10); | 679 | aper_base, aper_size>>10); | 
| 674 | 680 | ||
| 675 | /* need to map that range */ | ||
| 676 | end_pfn = (aper_base>>PAGE_SHIFT) + (aper_size>>PAGE_SHIFT); | ||
| 677 | if (end_pfn > max_low_pfn_mapped) { | ||
| 678 | start_pfn = (aper_base>>PAGE_SHIFT); | ||
| 679 | init_memory_mapping(start_pfn<<PAGE_SHIFT, end_pfn<<PAGE_SHIFT); | ||
| 680 | } | ||
| 681 | return 0; | 681 | return 0; | 
| 682 | 682 | ||
| 683 | nommu: | 683 | nommu: | 
| @@ -727,7 +727,8 @@ void __init gart_iommu_init(void) | |||
| 727 | { | 727 | { | 
| 728 | struct agp_kern_info info; | 728 | struct agp_kern_info info; | 
| 729 | unsigned long iommu_start; | 729 | unsigned long iommu_start; | 
| 730 | unsigned long aper_size; | 730 | unsigned long aper_base, aper_size; | 
| 731 | unsigned long start_pfn, end_pfn; | ||
| 731 | unsigned long scratch; | 732 | unsigned long scratch; | 
| 732 | long i; | 733 | long i; | 
| 733 | 734 | ||
| @@ -765,8 +766,16 @@ void __init gart_iommu_init(void) | |||
| 765 | return; | 766 | return; | 
| 766 | } | 767 | } | 
| 767 | 768 | ||
| 769 | /* need to map that range */ | ||
| 770 | aper_size = info.aper_size << 20; | ||
| 771 | aper_base = info.aper_base; | ||
| 772 | end_pfn = (aper_base>>PAGE_SHIFT) + (aper_size>>PAGE_SHIFT); | ||
| 773 | if (end_pfn > max_low_pfn_mapped) { | ||
| 774 | start_pfn = (aper_base>>PAGE_SHIFT); | ||
| 775 | init_memory_mapping(start_pfn<<PAGE_SHIFT, end_pfn<<PAGE_SHIFT); | ||
| 776 | } | ||
| 777 | |||
| 768 | printk(KERN_INFO "PCI-DMA: using GART IOMMU.\n"); | 778 | printk(KERN_INFO "PCI-DMA: using GART IOMMU.\n"); | 
| 769 | aper_size = info.aper_size * 1024 * 1024; | ||
| 770 | iommu_size = check_iommu_size(info.aper_base, aper_size); | 779 | iommu_size = check_iommu_size(info.aper_base, aper_size); | 
| 771 | iommu_pages = iommu_size >> PAGE_SHIFT; | 780 | iommu_pages = iommu_size >> PAGE_SHIFT; | 
| 772 | 781 | ||
| diff --git a/arch/x86/kernel/pcspeaker.c b/arch/x86/kernel/pcspeaker.c index bc1f2d3ea277..a311ffcaad16 100644 --- a/arch/x86/kernel/pcspeaker.c +++ b/arch/x86/kernel/pcspeaker.c | |||
| @@ -1,20 +1,13 @@ | |||
| 1 | #include <linux/platform_device.h> | 1 | #include <linux/platform_device.h> | 
| 2 | #include <linux/errno.h> | 2 | #include <linux/err.h> | 
| 3 | #include <linux/init.h> | 3 | #include <linux/init.h> | 
| 4 | 4 | ||
| 5 | static __init int add_pcspkr(void) | 5 | static __init int add_pcspkr(void) | 
| 6 | { | 6 | { | 
| 7 | struct platform_device *pd; | 7 | struct platform_device *pd; | 
| 8 | int ret; | ||
| 9 | 8 | ||
| 10 | pd = platform_device_alloc("pcspkr", -1); | 9 | pd = platform_device_register_simple("pcspkr", -1, NULL, 0); | 
| 11 | if (!pd) | ||
| 12 | return -ENOMEM; | ||
| 13 | 10 | ||
| 14 | ret = platform_device_add(pd); | 11 | return IS_ERR(pd) ? PTR_ERR(pd) : 0; | 
| 15 | if (ret) | ||
| 16 | platform_device_put(pd); | ||
| 17 | |||
| 18 | return ret; | ||
| 19 | } | 12 | } | 
| 20 | device_initcall(add_pcspkr); | 13 | device_initcall(add_pcspkr); | 
| diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 876e91890777..ec7a2ba9bce8 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
| @@ -185,7 +185,8 @@ static void mwait_idle(void) | |||
| 185 | static void poll_idle(void) | 185 | static void poll_idle(void) | 
| 186 | { | 186 | { | 
| 187 | local_irq_enable(); | 187 | local_irq_enable(); | 
| 188 | cpu_relax(); | 188 | while (!need_resched()) | 
| 189 | cpu_relax(); | ||
| 189 | } | 190 | } | 
| 190 | 191 | ||
| 191 | /* | 192 | /* | 
| diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 31f40b24bf5d..205188db9626 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #include <linux/tick.h> | 37 | #include <linux/tick.h> | 
| 38 | #include <linux/percpu.h> | 38 | #include <linux/percpu.h> | 
| 39 | #include <linux/prctl.h> | 39 | #include <linux/prctl.h> | 
| 40 | #include <linux/dmi.h> | ||
| 40 | 41 | ||
| 41 | #include <asm/uaccess.h> | 42 | #include <asm/uaccess.h> | 
| 42 | #include <asm/pgtable.h> | 43 | #include <asm/pgtable.h> | 
| @@ -56,6 +57,8 @@ | |||
| 56 | #include <asm/cpu.h> | 57 | #include <asm/cpu.h> | 
| 57 | #include <asm/kdebug.h> | 58 | #include <asm/kdebug.h> | 
| 58 | #include <asm/idle.h> | 59 | #include <asm/idle.h> | 
| 60 | #include <asm/syscalls.h> | ||
| 61 | #include <asm/smp.h> | ||
| 59 | 62 | ||
| 60 | asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); | 63 | asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); | 
| 61 | 64 | ||
| @@ -161,6 +164,7 @@ void __show_registers(struct pt_regs *regs, int all) | |||
| 161 | unsigned long d0, d1, d2, d3, d6, d7; | 164 | unsigned long d0, d1, d2, d3, d6, d7; | 
| 162 | unsigned long sp; | 165 | unsigned long sp; | 
| 163 | unsigned short ss, gs; | 166 | unsigned short ss, gs; | 
| 167 | const char *board; | ||
| 164 | 168 | ||
| 165 | if (user_mode_vm(regs)) { | 169 | if (user_mode_vm(regs)) { | 
| 166 | sp = regs->sp; | 170 | sp = regs->sp; | 
| @@ -173,11 +177,15 @@ void __show_registers(struct pt_regs *regs, int all) | |||
| 173 | } | 177 | } | 
| 174 | 178 | ||
| 175 | printk("\n"); | 179 | printk("\n"); | 
| 176 | printk("Pid: %d, comm: %s %s (%s %.*s)\n", | 180 | |
| 181 | board = dmi_get_system_info(DMI_PRODUCT_NAME); | ||
| 182 | if (!board) | ||
| 183 | board = ""; | ||
| 184 | printk("Pid: %d, comm: %s %s (%s %.*s) %s\n", | ||
| 177 | task_pid_nr(current), current->comm, | 185 | task_pid_nr(current), current->comm, | 
| 178 | print_tainted(), init_utsname()->release, | 186 | print_tainted(), init_utsname()->release, | 
| 179 | (int)strcspn(init_utsname()->version, " "), | 187 | (int)strcspn(init_utsname()->version, " "), | 
| 180 | init_utsname()->version); | 188 | init_utsname()->version, board); | 
| 181 | 189 | ||
| 182 | printk("EIP: %04x:[<%08lx>] EFLAGS: %08lx CPU: %d\n", | 190 | printk("EIP: %04x:[<%08lx>] EFLAGS: %08lx CPU: %d\n", | 
| 183 | (u16)regs->cs, regs->ip, regs->flags, | 191 | (u16)regs->cs, regs->ip, regs->flags, | 
| @@ -277,6 +285,14 @@ void exit_thread(void) | |||
| 277 | tss->x86_tss.io_bitmap_base = INVALID_IO_BITMAP_OFFSET; | 285 | tss->x86_tss.io_bitmap_base = INVALID_IO_BITMAP_OFFSET; | 
| 278 | put_cpu(); | 286 | put_cpu(); | 
| 279 | } | 287 | } | 
| 288 | #ifdef CONFIG_X86_DS | ||
| 289 | /* Free any DS contexts that have not been properly released. */ | ||
| 290 | if (unlikely(current->thread.ds_ctx)) { | ||
| 291 | /* we clear debugctl to make sure DS is not used. */ | ||
| 292 | update_debugctlmsr(0); | ||
| 293 | ds_free(current->thread.ds_ctx); | ||
| 294 | } | ||
| 295 | #endif /* CONFIG_X86_DS */ | ||
| 280 | } | 296 | } | 
| 281 | 297 | ||
| 282 | void flush_thread(void) | 298 | void flush_thread(void) | 
| @@ -438,6 +454,35 @@ int set_tsc_mode(unsigned int val) | |||
| 438 | return 0; | 454 | return 0; | 
| 439 | } | 455 | } | 
| 440 | 456 | ||
| 457 | #ifdef CONFIG_X86_DS | ||
| 458 | static int update_debugctl(struct thread_struct *prev, | ||
| 459 | struct thread_struct *next, unsigned long debugctl) | ||
| 460 | { | ||
| 461 | unsigned long ds_prev = 0; | ||
| 462 | unsigned long ds_next = 0; | ||
| 463 | |||
| 464 | if (prev->ds_ctx) | ||
| 465 | ds_prev = (unsigned long)prev->ds_ctx->ds; | ||
| 466 | if (next->ds_ctx) | ||
| 467 | ds_next = (unsigned long)next->ds_ctx->ds; | ||
| 468 | |||
| 469 | if (ds_next != ds_prev) { | ||
| 470 | /* we clear debugctl to make sure DS | ||
| 471 | * is not in use when we change it */ | ||
| 472 | debugctl = 0; | ||
| 473 | update_debugctlmsr(0); | ||
| 474 | wrmsr(MSR_IA32_DS_AREA, ds_next, 0); | ||
| 475 | } | ||
| 476 | return debugctl; | ||
| 477 | } | ||
| 478 | #else | ||
| 479 | static int update_debugctl(struct thread_struct *prev, | ||
| 480 | struct thread_struct *next, unsigned long debugctl) | ||
| 481 | { | ||
| 482 | return debugctl; | ||
| 483 | } | ||
| 484 | #endif /* CONFIG_X86_DS */ | ||
| 485 | |||
| 441 | static noinline void | 486 | static noinline void | 
| 442 | __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p, | 487 | __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p, | 
| 443 | struct tss_struct *tss) | 488 | struct tss_struct *tss) | 
| @@ -448,14 +493,7 @@ __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p, | |||
| 448 | prev = &prev_p->thread; | 493 | prev = &prev_p->thread; | 
| 449 | next = &next_p->thread; | 494 | next = &next_p->thread; | 
| 450 | 495 | ||
| 451 | debugctl = prev->debugctlmsr; | 496 | debugctl = update_debugctl(prev, next, prev->debugctlmsr); | 
| 452 | if (next->ds_area_msr != prev->ds_area_msr) { | ||
| 453 | /* we clear debugctl to make sure DS | ||
| 454 | * is not in use when we change it */ | ||
| 455 | debugctl = 0; | ||
| 456 | update_debugctlmsr(0); | ||
| 457 | wrmsr(MSR_IA32_DS_AREA, next->ds_area_msr, 0); | ||
| 458 | } | ||
| 459 | 497 | ||
| 460 | if (next->debugctlmsr != debugctl) | 498 | if (next->debugctlmsr != debugctl) | 
| 461 | update_debugctlmsr(next->debugctlmsr); | 499 | update_debugctlmsr(next->debugctlmsr); | 
| @@ -479,13 +517,13 @@ __switch_to_xtra(struct task_struct *prev_p, struct task_struct *next_p, | |||
| 479 | hard_enable_TSC(); | 517 | hard_enable_TSC(); | 
| 480 | } | 518 | } | 
| 481 | 519 | ||
| 482 | #ifdef X86_BTS | 520 | #ifdef CONFIG_X86_PTRACE_BTS | 
| 483 | if (test_tsk_thread_flag(prev_p, TIF_BTS_TRACE_TS)) | 521 | if (test_tsk_thread_flag(prev_p, TIF_BTS_TRACE_TS)) | 
| 484 | ptrace_bts_take_timestamp(prev_p, BTS_TASK_DEPARTS); | 522 | ptrace_bts_take_timestamp(prev_p, BTS_TASK_DEPARTS); | 
| 485 | 523 | ||
| 486 | if (test_tsk_thread_flag(next_p, TIF_BTS_TRACE_TS)) | 524 | if (test_tsk_thread_flag(next_p, TIF_BTS_TRACE_TS)) | 
| 487 | ptrace_bts_take_timestamp(next_p, BTS_TASK_ARRIVES); | 525 | ptrace_bts_take_timestamp(next_p, BTS_TASK_ARRIVES); | 
| 488 | #endif | 526 | #endif /* CONFIG_X86_PTRACE_BTS */ | 
| 489 | 527 | ||
| 490 | 528 | ||
| 491 | if (!test_tsk_thread_flag(next_p, TIF_IO_BITMAP)) { | 529 | if (!test_tsk_thread_flag(next_p, TIF_IO_BITMAP)) { | 
| diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index e12e0e4dd256..2a8ccb9238b4 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
| @@ -37,11 +37,11 @@ | |||
| 37 | #include <linux/kdebug.h> | 37 | #include <linux/kdebug.h> | 
| 38 | #include <linux/tick.h> | 38 | #include <linux/tick.h> | 
| 39 | #include <linux/prctl.h> | 39 | #include <linux/prctl.h> | 
| 40 | #include <linux/uaccess.h> | ||
| 41 | #include <linux/io.h> | ||
| 40 | 42 | ||
| 41 | #include <asm/uaccess.h> | ||
| 42 | #include <asm/pgtable.h> | 43 | #include <asm/pgtable.h> | 
| 43 | #include <asm/system.h> | 44 | #include <asm/system.h> | 
| 44 | #include <asm/io.h> | ||
| 45 | #include <asm/processor.h> | 45 | #include <asm/processor.h> | 
| 46 | #include <asm/i387.h> | 46 | #include <asm/i387.h> | 
| 47 | #include <asm/mmu_context.h> | 47 | #include <asm/mmu_context.h> | 
| @@ -51,6 +51,7 @@ | |||
| 51 | #include <asm/proto.h> | 51 | #include <asm/proto.h> | 
| 52 | #include <asm/ia32.h> | 52 | #include <asm/ia32.h> | 
| 53 | #include <asm/idle.h> | 53 | #include <asm/idle.h> | 
| 54 | #include <asm/syscalls.h> | ||
| 54 | 55 | ||
| 55 | asmlinkage extern void ret_from_fork(void); | 56 | asmlinkage extern void ret_from_fork(void); | 
| 56 | 57 | ||
| @@ -88,7 +89,7 @@ void exit_idle(void) | |||
| 88 | #ifdef CONFIG_HOTPLUG_CPU | 89 | #ifdef CONFIG_HOTPLUG_CPU | 
| 89 | DECLARE_PER_CPU(int, cpu_state); | 90 | DECLARE_PER_CPU(int, cpu_state); | 
| 90 | 91 | ||
| 91 | #include <asm/nmi.h> | 92 | #include <linux/nmi.h> | 
| 92 | /* We halt the CPU with physical CPU hotplug */ | 93 | /* We halt the CPU with physical CPU hotplug */ | 
| 93 | static inline void play_dead(void) | 94 | static inline void play_dead(void) | 
| 94 | { | 95 | { | 
| @@ -153,7 +154,7 @@ void cpu_idle(void) | |||
| 153 | } | 154 | } | 
| 154 | 155 | ||
| 155 | /* Prints also some state that isn't saved in the pt_regs */ | 156 | /* Prints also some state that isn't saved in the pt_regs */ | 
| 156 | void __show_regs(struct pt_regs * regs) | 157 | void __show_regs(struct pt_regs *regs) | 
| 157 | { | 158 | { | 
| 158 | unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L, fs, gs, shadowgs; | 159 | unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L, fs, gs, shadowgs; | 
| 159 | unsigned long d0, d1, d2, d3, d6, d7; | 160 | unsigned long d0, d1, d2, d3, d6, d7; | 
| @@ -162,59 +163,61 @@ void __show_regs(struct pt_regs * regs) | |||
| 162 | 163 | ||
| 163 | printk("\n"); | 164 | printk("\n"); | 
| 164 | print_modules(); | 165 | print_modules(); | 
| 165 | printk("Pid: %d, comm: %.20s %s %s %.*s\n", | 166 | printk(KERN_INFO "Pid: %d, comm: %.20s %s %s %.*s\n", | 
| 166 | current->pid, current->comm, print_tainted(), | 167 | current->pid, current->comm, print_tainted(), | 
| 167 | init_utsname()->release, | 168 | init_utsname()->release, | 
| 168 | (int)strcspn(init_utsname()->version, " "), | 169 | (int)strcspn(init_utsname()->version, " "), | 
| 169 | init_utsname()->version); | 170 | init_utsname()->version); | 
| 170 | printk("RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->ip); | 171 | printk(KERN_INFO "RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->ip); | 
| 171 | printk_address(regs->ip, 1); | 172 | printk_address(regs->ip, 1); | 
| 172 | printk("RSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss, regs->sp, | 173 | printk(KERN_INFO "RSP: %04lx:%016lx EFLAGS: %08lx\n", regs->ss, | 
| 173 | regs->flags); | 174 | regs->sp, regs->flags); | 
| 174 | printk("RAX: %016lx RBX: %016lx RCX: %016lx\n", | 175 | printk(KERN_INFO "RAX: %016lx RBX: %016lx RCX: %016lx\n", | 
| 175 | regs->ax, regs->bx, regs->cx); | 176 | regs->ax, regs->bx, regs->cx); | 
| 176 | printk("RDX: %016lx RSI: %016lx RDI: %016lx\n", | 177 | printk(KERN_INFO "RDX: %016lx RSI: %016lx RDI: %016lx\n", | 
| 177 | regs->dx, regs->si, regs->di); | 178 | regs->dx, regs->si, regs->di); | 
| 178 | printk("RBP: %016lx R08: %016lx R09: %016lx\n", | 179 | printk(KERN_INFO "RBP: %016lx R08: %016lx R09: %016lx\n", | 
| 179 | regs->bp, regs->r8, regs->r9); | 180 | regs->bp, regs->r8, regs->r9); | 
| 180 | printk("R10: %016lx R11: %016lx R12: %016lx\n", | 181 | printk(KERN_INFO "R10: %016lx R11: %016lx R12: %016lx\n", | 
| 181 | regs->r10, regs->r11, regs->r12); | 182 | regs->r10, regs->r11, regs->r12); | 
| 182 | printk("R13: %016lx R14: %016lx R15: %016lx\n", | 183 | printk(KERN_INFO "R13: %016lx R14: %016lx R15: %016lx\n", | 
| 183 | regs->r13, regs->r14, regs->r15); | 184 | regs->r13, regs->r14, regs->r15); | 
| 184 | 185 | ||
| 185 | asm("movl %%ds,%0" : "=r" (ds)); | 186 | asm("movl %%ds,%0" : "=r" (ds)); | 
| 186 | asm("movl %%cs,%0" : "=r" (cs)); | 187 | asm("movl %%cs,%0" : "=r" (cs)); | 
| 187 | asm("movl %%es,%0" : "=r" (es)); | 188 | asm("movl %%es,%0" : "=r" (es)); | 
| 188 | asm("movl %%fs,%0" : "=r" (fsindex)); | 189 | asm("movl %%fs,%0" : "=r" (fsindex)); | 
| 189 | asm("movl %%gs,%0" : "=r" (gsindex)); | 190 | asm("movl %%gs,%0" : "=r" (gsindex)); | 
| 190 | 191 | ||
| 191 | rdmsrl(MSR_FS_BASE, fs); | 192 | rdmsrl(MSR_FS_BASE, fs); | 
| 192 | rdmsrl(MSR_GS_BASE, gs); | 193 | rdmsrl(MSR_GS_BASE, gs); | 
| 193 | rdmsrl(MSR_KERNEL_GS_BASE, shadowgs); | 194 | rdmsrl(MSR_KERNEL_GS_BASE, shadowgs); | 
| 194 | 195 | ||
| 195 | cr0 = read_cr0(); | 196 | cr0 = read_cr0(); | 
| 196 | cr2 = read_cr2(); | 197 | cr2 = read_cr2(); | 
| 197 | cr3 = read_cr3(); | 198 | cr3 = read_cr3(); | 
| 198 | cr4 = read_cr4(); | 199 | cr4 = read_cr4(); | 
| 199 | 200 | ||
| 200 | printk("FS: %016lx(%04x) GS:%016lx(%04x) knlGS:%016lx\n", | 201 | printk(KERN_INFO "FS: %016lx(%04x) GS:%016lx(%04x) knlGS:%016lx\n", | 
| 201 | fs,fsindex,gs,gsindex,shadowgs); | 202 | fs, fsindex, gs, gsindex, shadowgs); | 
| 202 | printk("CS: %04x DS: %04x ES: %04x CR0: %016lx\n", cs, ds, es, cr0); | 203 | printk(KERN_INFO "CS: %04x DS: %04x ES: %04x CR0: %016lx\n", cs, ds, | 
| 203 | printk("CR2: %016lx CR3: %016lx CR4: %016lx\n", cr2, cr3, cr4); | 204 | es, cr0); | 
| 205 | printk(KERN_INFO "CR2: %016lx CR3: %016lx CR4: %016lx\n", cr2, cr3, | ||
| 206 | cr4); | ||
| 204 | 207 | ||
| 205 | get_debugreg(d0, 0); | 208 | get_debugreg(d0, 0); | 
| 206 | get_debugreg(d1, 1); | 209 | get_debugreg(d1, 1); | 
| 207 | get_debugreg(d2, 2); | 210 | get_debugreg(d2, 2); | 
| 208 | printk("DR0: %016lx DR1: %016lx DR2: %016lx\n", d0, d1, d2); | 211 | printk(KERN_INFO "DR0: %016lx DR1: %016lx DR2: %016lx\n", d0, d1, d2); | 
| 209 | get_debugreg(d3, 3); | 212 | get_debugreg(d3, 3); | 
| 210 | get_debugreg(d6, 6); | 213 | get_debugreg(d6, 6); | 
| 211 | get_debugreg(d7, 7); | 214 | get_debugreg(d7, 7); | 
| 212 | printk("DR3: %016lx DR6: %016lx DR7: %016lx\n", d3, d6, d7); | 215 | printk(KERN_INFO "DR3: %016lx DR6: %016lx DR7: %016lx\n", d3, d6, d7); | 
| 213 | } | 216 | } | 
| 214 | 217 | ||
| 215 | void show_regs(struct pt_regs *regs) | 218 | void show_regs(struct pt_regs *regs) | 
| 216 | { | 219 | { | 
| 217 | printk("CPU %d:", smp_processor_id()); | 220 | printk(KERN_INFO "CPU %d:", smp_processor_id()); | 
| 218 | __show_regs(regs); | 221 | __show_regs(regs); | 
| 219 | show_trace(NULL, regs, (void *)(regs + 1), regs->bp); | 222 | show_trace(NULL, regs, (void *)(regs + 1), regs->bp); | 
| 220 | } | 223 | } | 
| @@ -240,6 +243,14 @@ void exit_thread(void) | |||
| 240 | t->io_bitmap_max = 0; | 243 | t->io_bitmap_max = 0; | 
| 241 | put_cpu(); | 244 | put_cpu(); | 
| 242 | } | 245 | } | 
| 246 | #ifdef CONFIG_X86_DS | ||
| 247 | /* Free any DS contexts that have not been properly released. */ | ||
| 248 | if (unlikely(t->ds_ctx)) { | ||
| 249 | /* we clear debugctl to make sure DS is not used. */ | ||
| 250 | update_debugctlmsr(0); | ||
| 251 | ds_free(t->ds_ctx); | ||
| 252 | } | ||
| 253 | #endif /* CONFIG_X86_DS */ | ||
| 243 | } | 254 | } | 
| 244 | 255 | ||
| 245 | void flush_thread(void) | 256 | void flush_thread(void) | 
| @@ -315,10 +326,10 @@ void prepare_to_copy(struct task_struct *tsk) | |||
| 315 | 326 | ||
| 316 | int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, | 327 | int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, | 
| 317 | unsigned long unused, | 328 | unsigned long unused, | 
| 318 | struct task_struct * p, struct pt_regs * regs) | 329 | struct task_struct *p, struct pt_regs *regs) | 
| 319 | { | 330 | { | 
| 320 | int err; | 331 | int err; | 
| 321 | struct pt_regs * childregs; | 332 | struct pt_regs *childregs; | 
| 322 | struct task_struct *me = current; | 333 | struct task_struct *me = current; | 
| 323 | 334 | ||
| 324 | childregs = ((struct pt_regs *) | 335 | childregs = ((struct pt_regs *) | 
| @@ -363,10 +374,10 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, | |||
| 363 | if (test_thread_flag(TIF_IA32)) | 374 | if (test_thread_flag(TIF_IA32)) | 
| 364 | err = do_set_thread_area(p, -1, | 375 | err = do_set_thread_area(p, -1, | 
| 365 | (struct user_desc __user *)childregs->si, 0); | 376 | (struct user_desc __user *)childregs->si, 0); | 
| 366 | else | 377 | else | 
| 367 | #endif | 378 | #endif | 
| 368 | err = do_arch_prctl(p, ARCH_SET_FS, childregs->r8); | 379 | err = do_arch_prctl(p, ARCH_SET_FS, childregs->r8); | 
| 369 | if (err) | 380 | if (err) | 
| 370 | goto out; | 381 | goto out; | 
| 371 | } | 382 | } | 
| 372 | err = 0; | 383 | err = 0; | 
| @@ -473,13 +484,27 @@ static inline void __switch_to_xtra(struct task_struct *prev_p, | |||
| 473 | next = &next_p->thread; | 484 | next = &next_p->thread; | 
| 474 | 485 | ||
| 475 | debugctl = prev->debugctlmsr; | 486 | debugctl = prev->debugctlmsr; | 
| 476 | if (next->ds_area_msr != prev->ds_area_msr) { | 487 | |
| 477 | /* we clear debugctl to make sure DS | 488 | #ifdef CONFIG_X86_DS | 
| 478 | * is not in use when we change it */ | 489 | { | 
| 479 | debugctl = 0; | 490 | unsigned long ds_prev = 0, ds_next = 0; | 
| 480 | update_debugctlmsr(0); | 491 | |
| 481 | wrmsrl(MSR_IA32_DS_AREA, next->ds_area_msr); | 492 | if (prev->ds_ctx) | 
| 493 | ds_prev = (unsigned long)prev->ds_ctx->ds; | ||
| 494 | if (next->ds_ctx) | ||
| 495 | ds_next = (unsigned long)next->ds_ctx->ds; | ||
| 496 | |||
| 497 | if (ds_next != ds_prev) { | ||
| 498 | /* | ||
| 499 | * We clear debugctl to make sure DS | ||
| 500 | * is not in use when we change it: | ||
| 501 | */ | ||
| 502 | debugctl = 0; | ||
| 503 | update_debugctlmsr(0); | ||
| 504 | wrmsrl(MSR_IA32_DS_AREA, ds_next); | ||
| 505 | } | ||
| 482 | } | 506 | } | 
| 507 | #endif /* CONFIG_X86_DS */ | ||
| 483 | 508 | ||
| 484 | if (next->debugctlmsr != debugctl) | 509 | if (next->debugctlmsr != debugctl) | 
| 485 | update_debugctlmsr(next->debugctlmsr); | 510 | update_debugctlmsr(next->debugctlmsr); | 
| @@ -517,13 +542,13 @@ static inline void __switch_to_xtra(struct task_struct *prev_p, | |||
| 517 | memset(tss->io_bitmap, 0xff, prev->io_bitmap_max); | 542 | memset(tss->io_bitmap, 0xff, prev->io_bitmap_max); | 
| 518 | } | 543 | } | 
| 519 | 544 | ||
| 520 | #ifdef X86_BTS | 545 | #ifdef CONFIG_X86_PTRACE_BTS | 
| 521 | if (test_tsk_thread_flag(prev_p, TIF_BTS_TRACE_TS)) | 546 | if (test_tsk_thread_flag(prev_p, TIF_BTS_TRACE_TS)) | 
| 522 | ptrace_bts_take_timestamp(prev_p, BTS_TASK_DEPARTS); | 547 | ptrace_bts_take_timestamp(prev_p, BTS_TASK_DEPARTS); | 
| 523 | 548 | ||
| 524 | if (test_tsk_thread_flag(next_p, TIF_BTS_TRACE_TS)) | 549 | if (test_tsk_thread_flag(next_p, TIF_BTS_TRACE_TS)) | 
| 525 | ptrace_bts_take_timestamp(next_p, BTS_TASK_ARRIVES); | 550 | ptrace_bts_take_timestamp(next_p, BTS_TASK_ARRIVES); | 
| 526 | #endif | 551 | #endif /* CONFIG_X86_PTRACE_BTS */ | 
| 527 | } | 552 | } | 
| 528 | 553 | ||
| 529 | /* | 554 | /* | 
| @@ -545,7 +570,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 545 | unsigned fsindex, gsindex; | 570 | unsigned fsindex, gsindex; | 
| 546 | 571 | ||
| 547 | /* we're going to use this soon, after a few expensive things */ | 572 | /* we're going to use this soon, after a few expensive things */ | 
| 548 | if (next_p->fpu_counter>5) | 573 | if (next_p->fpu_counter > 5) | 
| 549 | prefetch(next->xstate); | 574 | prefetch(next->xstate); | 
| 550 | 575 | ||
| 551 | /* | 576 | /* | 
| @@ -553,13 +578,13 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 553 | */ | 578 | */ | 
| 554 | load_sp0(tss, next); | 579 | load_sp0(tss, next); | 
| 555 | 580 | ||
| 556 | /* | 581 | /* | 
| 557 | * Switch DS and ES. | 582 | * Switch DS and ES. | 
| 558 | * This won't pick up thread selector changes, but I guess that is ok. | 583 | * This won't pick up thread selector changes, but I guess that is ok. | 
| 559 | */ | 584 | */ | 
| 560 | savesegment(es, prev->es); | 585 | savesegment(es, prev->es); | 
| 561 | if (unlikely(next->es | prev->es)) | 586 | if (unlikely(next->es | prev->es)) | 
| 562 | loadsegment(es, next->es); | 587 | loadsegment(es, next->es); | 
| 563 | 588 | ||
| 564 | savesegment(ds, prev->ds); | 589 | savesegment(ds, prev->ds); | 
| 565 | if (unlikely(next->ds | prev->ds)) | 590 | if (unlikely(next->ds | prev->ds)) | 
| @@ -585,7 +610,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 585 | */ | 610 | */ | 
| 586 | arch_leave_lazy_cpu_mode(); | 611 | arch_leave_lazy_cpu_mode(); | 
| 587 | 612 | ||
| 588 | /* | 613 | /* | 
| 589 | * Switch FS and GS. | 614 | * Switch FS and GS. | 
| 590 | * | 615 | * | 
| 591 | * Segment register != 0 always requires a reload. Also | 616 | * Segment register != 0 always requires a reload. Also | 
| @@ -594,13 +619,13 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 594 | */ | 619 | */ | 
| 595 | if (unlikely(fsindex | next->fsindex | prev->fs)) { | 620 | if (unlikely(fsindex | next->fsindex | prev->fs)) { | 
| 596 | loadsegment(fs, next->fsindex); | 621 | loadsegment(fs, next->fsindex); | 
| 597 | /* | 622 | /* | 
| 598 | * Check if the user used a selector != 0; if yes | 623 | * Check if the user used a selector != 0; if yes | 
| 599 | * clear 64bit base, since overloaded base is always | 624 | * clear 64bit base, since overloaded base is always | 
| 600 | * mapped to the Null selector | 625 | * mapped to the Null selector | 
| 601 | */ | 626 | */ | 
| 602 | if (fsindex) | 627 | if (fsindex) | 
| 603 | prev->fs = 0; | 628 | prev->fs = 0; | 
| 604 | } | 629 | } | 
| 605 | /* when next process has a 64bit base use it */ | 630 | /* when next process has a 64bit base use it */ | 
| 606 | if (next->fs) | 631 | if (next->fs) | 
| @@ -610,7 +635,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 610 | if (unlikely(gsindex | next->gsindex | prev->gs)) { | 635 | if (unlikely(gsindex | next->gsindex | prev->gs)) { | 
| 611 | load_gs_index(next->gsindex); | 636 | load_gs_index(next->gsindex); | 
| 612 | if (gsindex) | 637 | if (gsindex) | 
| 613 | prev->gs = 0; | 638 | prev->gs = 0; | 
| 614 | } | 639 | } | 
| 615 | if (next->gs) | 640 | if (next->gs) | 
| 616 | wrmsrl(MSR_KERNEL_GS_BASE, next->gs); | 641 | wrmsrl(MSR_KERNEL_GS_BASE, next->gs); | 
| @@ -619,12 +644,12 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 619 | /* Must be after DS reload */ | 644 | /* Must be after DS reload */ | 
| 620 | unlazy_fpu(prev_p); | 645 | unlazy_fpu(prev_p); | 
| 621 | 646 | ||
| 622 | /* | 647 | /* | 
| 623 | * Switch the PDA and FPU contexts. | 648 | * Switch the PDA and FPU contexts. | 
| 624 | */ | 649 | */ | 
| 625 | prev->usersp = read_pda(oldrsp); | 650 | prev->usersp = read_pda(oldrsp); | 
| 626 | write_pda(oldrsp, next->usersp); | 651 | write_pda(oldrsp, next->usersp); | 
| 627 | write_pda(pcurrent, next_p); | 652 | write_pda(pcurrent, next_p); | 
| 628 | 653 | ||
| 629 | write_pda(kernelstack, | 654 | write_pda(kernelstack, | 
| 630 | (unsigned long)task_stack_page(next_p) + | 655 | (unsigned long)task_stack_page(next_p) + | 
| @@ -665,7 +690,7 @@ long sys_execve(char __user *name, char __user * __user *argv, | |||
| 665 | char __user * __user *envp, struct pt_regs *regs) | 690 | char __user * __user *envp, struct pt_regs *regs) | 
| 666 | { | 691 | { | 
| 667 | long error; | 692 | long error; | 
| 668 | char * filename; | 693 | char *filename; | 
| 669 | 694 | ||
| 670 | filename = getname(name); | 695 | filename = getname(name); | 
| 671 | error = PTR_ERR(filename); | 696 | error = PTR_ERR(filename); | 
| @@ -723,55 +748,55 @@ asmlinkage long sys_vfork(struct pt_regs *regs) | |||
| 723 | unsigned long get_wchan(struct task_struct *p) | 748 | unsigned long get_wchan(struct task_struct *p) | 
| 724 | { | 749 | { | 
| 725 | unsigned long stack; | 750 | unsigned long stack; | 
| 726 | u64 fp,ip; | 751 | u64 fp, ip; | 
| 727 | int count = 0; | 752 | int count = 0; | 
| 728 | 753 | ||
| 729 | if (!p || p == current || p->state==TASK_RUNNING) | 754 | if (!p || p == current || p->state == TASK_RUNNING) | 
| 730 | return 0; | 755 | return 0; | 
| 731 | stack = (unsigned long)task_stack_page(p); | 756 | stack = (unsigned long)task_stack_page(p); | 
| 732 | if (p->thread.sp < stack || p->thread.sp > stack+THREAD_SIZE) | 757 | if (p->thread.sp < stack || p->thread.sp > stack+THREAD_SIZE) | 
| 733 | return 0; | 758 | return 0; | 
| 734 | fp = *(u64 *)(p->thread.sp); | 759 | fp = *(u64 *)(p->thread.sp); | 
| 735 | do { | 760 | do { | 
| 736 | if (fp < (unsigned long)stack || | 761 | if (fp < (unsigned long)stack || | 
| 737 | fp > (unsigned long)stack+THREAD_SIZE) | 762 | fp > (unsigned long)stack+THREAD_SIZE) | 
| 738 | return 0; | 763 | return 0; | 
| 739 | ip = *(u64 *)(fp+8); | 764 | ip = *(u64 *)(fp+8); | 
| 740 | if (!in_sched_functions(ip)) | 765 | if (!in_sched_functions(ip)) | 
| 741 | return ip; | 766 | return ip; | 
| 742 | fp = *(u64 *)fp; | 767 | fp = *(u64 *)fp; | 
| 743 | } while (count++ < 16); | 768 | } while (count++ < 16); | 
| 744 | return 0; | 769 | return 0; | 
| 745 | } | 770 | } | 
| 746 | 771 | ||
| 747 | long do_arch_prctl(struct task_struct *task, int code, unsigned long addr) | 772 | long do_arch_prctl(struct task_struct *task, int code, unsigned long addr) | 
| 748 | { | 773 | { | 
| 749 | int ret = 0; | 774 | int ret = 0; | 
| 750 | int doit = task == current; | 775 | int doit = task == current; | 
| 751 | int cpu; | 776 | int cpu; | 
| 752 | 777 | ||
| 753 | switch (code) { | 778 | switch (code) { | 
| 754 | case ARCH_SET_GS: | 779 | case ARCH_SET_GS: | 
| 755 | if (addr >= TASK_SIZE_OF(task)) | 780 | if (addr >= TASK_SIZE_OF(task)) | 
| 756 | return -EPERM; | 781 | return -EPERM; | 
| 757 | cpu = get_cpu(); | 782 | cpu = get_cpu(); | 
| 758 | /* handle small bases via the GDT because that's faster to | 783 | /* handle small bases via the GDT because that's faster to | 
| 759 | switch. */ | 784 | switch. */ | 
| 760 | if (addr <= 0xffffffff) { | 785 | if (addr <= 0xffffffff) { | 
| 761 | set_32bit_tls(task, GS_TLS, addr); | 786 | set_32bit_tls(task, GS_TLS, addr); | 
| 762 | if (doit) { | 787 | if (doit) { | 
| 763 | load_TLS(&task->thread, cpu); | 788 | load_TLS(&task->thread, cpu); | 
| 764 | load_gs_index(GS_TLS_SEL); | 789 | load_gs_index(GS_TLS_SEL); | 
| 765 | } | 790 | } | 
| 766 | task->thread.gsindex = GS_TLS_SEL; | 791 | task->thread.gsindex = GS_TLS_SEL; | 
| 767 | task->thread.gs = 0; | 792 | task->thread.gs = 0; | 
| 768 | } else { | 793 | } else { | 
| 769 | task->thread.gsindex = 0; | 794 | task->thread.gsindex = 0; | 
| 770 | task->thread.gs = addr; | 795 | task->thread.gs = addr; | 
| 771 | if (doit) { | 796 | if (doit) { | 
| 772 | load_gs_index(0); | 797 | load_gs_index(0); | 
| 773 | ret = checking_wrmsrl(MSR_KERNEL_GS_BASE, addr); | 798 | ret = checking_wrmsrl(MSR_KERNEL_GS_BASE, addr); | 
| 774 | } | 799 | } | 
| 775 | } | 800 | } | 
| 776 | put_cpu(); | 801 | put_cpu(); | 
| 777 | break; | 802 | break; | 
| @@ -825,8 +850,7 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr) | |||
| 825 | rdmsrl(MSR_KERNEL_GS_BASE, base); | 850 | rdmsrl(MSR_KERNEL_GS_BASE, base); | 
| 826 | else | 851 | else | 
| 827 | base = task->thread.gs; | 852 | base = task->thread.gs; | 
| 828 | } | 853 | } else | 
| 829 | else | ||
| 830 | base = task->thread.gs; | 854 | base = task->thread.gs; | 
| 831 | ret = put_user(base, (unsigned long __user *)addr); | 855 | ret = put_user(base, (unsigned long __user *)addr); | 
| 832 | break; | 856 | break; | 
| diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index e37dccce85db..e375b658efc3 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/errno.h> | 14 | #include <linux/errno.h> | 
| 15 | #include <linux/ptrace.h> | 15 | #include <linux/ptrace.h> | 
| 16 | #include <linux/regset.h> | 16 | #include <linux/regset.h> | 
| 17 | #include <linux/tracehook.h> | ||
| 17 | #include <linux/user.h> | 18 | #include <linux/user.h> | 
| 18 | #include <linux/elf.h> | 19 | #include <linux/elf.h> | 
| 19 | #include <linux/security.h> | 20 | #include <linux/security.h> | 
| @@ -69,7 +70,7 @@ static inline bool invalid_selector(u16 value) | |||
| 69 | 70 | ||
| 70 | #define FLAG_MASK FLAG_MASK_32 | 71 | #define FLAG_MASK FLAG_MASK_32 | 
| 71 | 72 | ||
| 72 | static long *pt_regs_access(struct pt_regs *regs, unsigned long regno) | 73 | static unsigned long *pt_regs_access(struct pt_regs *regs, unsigned long regno) | 
| 73 | { | 74 | { | 
| 74 | BUILD_BUG_ON(offsetof(struct pt_regs, bx) != 0); | 75 | BUILD_BUG_ON(offsetof(struct pt_regs, bx) != 0); | 
| 75 | regno >>= 2; | 76 | regno >>= 2; | 
| @@ -554,45 +555,115 @@ static int ptrace_set_debugreg(struct task_struct *child, | |||
| 554 | return 0; | 555 | return 0; | 
| 555 | } | 556 | } | 
| 556 | 557 | ||
| 557 | #ifdef X86_BTS | 558 | #ifdef CONFIG_X86_PTRACE_BTS | 
| 559 | /* | ||
| 560 | * The configuration for a particular BTS hardware implementation. | ||
| 561 | */ | ||
| 562 | struct bts_configuration { | ||
| 563 | /* the size of a BTS record in bytes; at most BTS_MAX_RECORD_SIZE */ | ||
| 564 | unsigned char sizeof_bts; | ||
| 565 | /* the size of a field in the BTS record in bytes */ | ||
| 566 | unsigned char sizeof_field; | ||
| 567 | /* a bitmask to enable/disable BTS in DEBUGCTL MSR */ | ||
| 568 | unsigned long debugctl_mask; | ||
| 569 | }; | ||
| 570 | static struct bts_configuration bts_cfg; | ||
| 571 | |||
| 572 | #define BTS_MAX_RECORD_SIZE (8 * 3) | ||
| 573 | |||
| 574 | |||
| 575 | /* | ||
| 576 | * Branch Trace Store (BTS) uses the following format. Different | ||
| 577 | * architectures vary in the size of those fields. | ||
| 578 | * - source linear address | ||
| 579 | * - destination linear address | ||
| 580 | * - flags | ||
| 581 | * | ||
| 582 | * Later architectures use 64bit pointers throughout, whereas earlier | ||
| 583 | * architectures use 32bit pointers in 32bit mode. | ||
| 584 | * | ||
| 585 | * We compute the base address for the first 8 fields based on: | ||
| 586 | * - the field size stored in the DS configuration | ||
| 587 | * - the relative field position | ||
| 588 | * | ||
| 589 | * In order to store additional information in the BTS buffer, we use | ||
| 590 | * a special source address to indicate that the record requires | ||
| 591 | * special interpretation. | ||
| 592 | * | ||
| 593 | * Netburst indicated via a bit in the flags field whether the branch | ||
| 594 | * was predicted; this is ignored. | ||
| 595 | */ | ||
| 596 | |||
| 597 | enum bts_field { | ||
| 598 | bts_from = 0, | ||
| 599 | bts_to, | ||
| 600 | bts_flags, | ||
| 601 | |||
| 602 | bts_escape = (unsigned long)-1, | ||
| 603 | bts_qual = bts_to, | ||
| 604 | bts_jiffies = bts_flags | ||
| 605 | }; | ||
| 606 | |||
| 607 | static inline unsigned long bts_get(const char *base, enum bts_field field) | ||
| 608 | { | ||
| 609 | base += (bts_cfg.sizeof_field * field); | ||
| 610 | return *(unsigned long *)base; | ||
| 611 | } | ||
| 558 | 612 | ||
| 559 | static int ptrace_bts_get_size(struct task_struct *child) | 613 | static inline void bts_set(char *base, enum bts_field field, unsigned long val) | 
| 560 | { | 614 | { | 
| 561 | if (!child->thread.ds_area_msr) | 615 | base += (bts_cfg.sizeof_field * field);; | 
| 562 | return -ENXIO; | 616 | (*(unsigned long *)base) = val; | 
| 617 | } | ||
| 563 | 618 | ||
| 564 | return ds_get_bts_index((void *)child->thread.ds_area_msr); | 619 | /* | 
| 620 | * Translate a BTS record from the raw format into the bts_struct format | ||
| 621 | * | ||
| 622 | * out (out): bts_struct interpretation | ||
| 623 | * raw: raw BTS record | ||
| 624 | */ | ||
| 625 | static void ptrace_bts_translate_record(struct bts_struct *out, const void *raw) | ||
| 626 | { | ||
| 627 | memset(out, 0, sizeof(*out)); | ||
| 628 | if (bts_get(raw, bts_from) == bts_escape) { | ||
| 629 | out->qualifier = bts_get(raw, bts_qual); | ||
| 630 | out->variant.jiffies = bts_get(raw, bts_jiffies); | ||
| 631 | } else { | ||
| 632 | out->qualifier = BTS_BRANCH; | ||
| 633 | out->variant.lbr.from_ip = bts_get(raw, bts_from); | ||
| 634 | out->variant.lbr.to_ip = bts_get(raw, bts_to); | ||
| 635 | } | ||
| 565 | } | 636 | } | 
| 566 | 637 | ||
| 567 | static int ptrace_bts_read_record(struct task_struct *child, | 638 | static int ptrace_bts_read_record(struct task_struct *child, size_t index, | 
| 568 | long index, | ||
| 569 | struct bts_struct __user *out) | 639 | struct bts_struct __user *out) | 
| 570 | { | 640 | { | 
| 571 | struct bts_struct ret; | 641 | struct bts_struct ret; | 
| 572 | int retval; | 642 | const void *bts_record; | 
| 573 | int bts_end; | 643 | size_t bts_index, bts_end; | 
| 574 | int bts_index; | 644 | int error; | 
| 575 | |||
| 576 | if (!child->thread.ds_area_msr) | ||
| 577 | return -ENXIO; | ||
| 578 | 645 | ||
| 579 | if (index < 0) | 646 | error = ds_get_bts_end(child, &bts_end); | 
| 580 | return -EINVAL; | 647 | if (error < 0) | 
| 648 | return error; | ||
| 581 | 649 | ||
| 582 | bts_end = ds_get_bts_end((void *)child->thread.ds_area_msr); | ||
| 583 | if (bts_end <= index) | 650 | if (bts_end <= index) | 
| 584 | return -EINVAL; | 651 | return -EINVAL; | 
| 585 | 652 | ||
| 653 | error = ds_get_bts_index(child, &bts_index); | ||
| 654 | if (error < 0) | ||
| 655 | return error; | ||
| 656 | |||
| 586 | /* translate the ptrace bts index into the ds bts index */ | 657 | /* translate the ptrace bts index into the ds bts index */ | 
| 587 | bts_index = ds_get_bts_index((void *)child->thread.ds_area_msr); | 658 | bts_index += bts_end - (index + 1); | 
| 588 | bts_index -= (index + 1); | 659 | if (bts_end <= bts_index) | 
| 589 | if (bts_index < 0) | 660 | bts_index -= bts_end; | 
| 590 | bts_index += bts_end; | ||
| 591 | 661 | ||
| 592 | retval = ds_read_bts((void *)child->thread.ds_area_msr, | 662 | error = ds_access_bts(child, bts_index, &bts_record); | 
| 593 | bts_index, &ret); | 663 | if (error < 0) | 
| 594 | if (retval < 0) | 664 | return error; | 
| 595 | return retval; | 665 | |
| 666 | ptrace_bts_translate_record(&ret, bts_record); | ||
| 596 | 667 | ||
| 597 | if (copy_to_user(out, &ret, sizeof(ret))) | 668 | if (copy_to_user(out, &ret, sizeof(ret))) | 
| 598 | return -EFAULT; | 669 | return -EFAULT; | 
| @@ -600,101 +671,106 @@ static int ptrace_bts_read_record(struct task_struct *child, | |||
| 600 | return sizeof(ret); | 671 | return sizeof(ret); | 
| 601 | } | 672 | } | 
| 602 | 673 | ||
| 603 | static int ptrace_bts_clear(struct task_struct *child) | ||
| 604 | { | ||
| 605 | if (!child->thread.ds_area_msr) | ||
| 606 | return -ENXIO; | ||
| 607 | |||
| 608 | return ds_clear((void *)child->thread.ds_area_msr); | ||
| 609 | } | ||
| 610 | |||
| 611 | static int ptrace_bts_drain(struct task_struct *child, | 674 | static int ptrace_bts_drain(struct task_struct *child, | 
| 612 | long size, | 675 | long size, | 
| 613 | struct bts_struct __user *out) | 676 | struct bts_struct __user *out) | 
| 614 | { | 677 | { | 
| 615 | int end, i; | 678 | struct bts_struct ret; | 
| 616 | void *ds = (void *)child->thread.ds_area_msr; | 679 | const unsigned char *raw; | 
| 617 | 680 | size_t end, i; | |
| 618 | if (!ds) | 681 | int error; | 
| 619 | return -ENXIO; | ||
| 620 | 682 | ||
| 621 | end = ds_get_bts_index(ds); | 683 | error = ds_get_bts_index(child, &end); | 
| 622 | if (end <= 0) | 684 | if (error < 0) | 
| 623 | return end; | 685 | return error; | 
| 624 | 686 | ||
| 625 | if (size < (end * sizeof(struct bts_struct))) | 687 | if (size < (end * sizeof(struct bts_struct))) | 
| 626 | return -EIO; | 688 | return -EIO; | 
| 627 | 689 | ||
| 628 | for (i = 0; i < end; i++, out++) { | 690 | error = ds_access_bts(child, 0, (const void **)&raw); | 
| 629 | struct bts_struct ret; | 691 | if (error < 0) | 
| 630 | int retval; | 692 | return error; | 
| 631 | 693 | ||
| 632 | retval = ds_read_bts(ds, i, &ret); | 694 | for (i = 0; i < end; i++, out++, raw += bts_cfg.sizeof_bts) { | 
| 633 | if (retval < 0) | 695 | ptrace_bts_translate_record(&ret, raw); | 
| 634 | return retval; | ||
| 635 | 696 | ||
| 636 | if (copy_to_user(out, &ret, sizeof(ret))) | 697 | if (copy_to_user(out, &ret, sizeof(ret))) | 
| 637 | return -EFAULT; | 698 | return -EFAULT; | 
| 638 | } | 699 | } | 
| 639 | 700 | ||
| 640 | ds_clear(ds); | 701 | error = ds_clear_bts(child); | 
| 702 | if (error < 0) | ||
| 703 | return error; | ||
| 641 | 704 | ||
| 642 | return end; | 705 | return end; | 
| 643 | } | 706 | } | 
| 644 | 707 | ||
| 708 | static void ptrace_bts_ovfl(struct task_struct *child) | ||
| 709 | { | ||
| 710 | send_sig(child->thread.bts_ovfl_signal, child, 0); | ||
| 711 | } | ||
| 712 | |||
| 645 | static int ptrace_bts_config(struct task_struct *child, | 713 | static int ptrace_bts_config(struct task_struct *child, | 
| 646 | long cfg_size, | 714 | long cfg_size, | 
| 647 | const struct ptrace_bts_config __user *ucfg) | 715 | const struct ptrace_bts_config __user *ucfg) | 
| 648 | { | 716 | { | 
| 649 | struct ptrace_bts_config cfg; | 717 | struct ptrace_bts_config cfg; | 
| 650 | int bts_size, ret = 0; | 718 | int error = 0; | 
| 651 | void *ds; | 719 | |
| 720 | error = -EOPNOTSUPP; | ||
| 721 | if (!bts_cfg.sizeof_bts) | ||
| 722 | goto errout; | ||
| 652 | 723 | ||
| 724 | error = -EIO; | ||
| 653 | if (cfg_size < sizeof(cfg)) | 725 | if (cfg_size < sizeof(cfg)) | 
| 654 | return -EIO; | 726 | goto errout; | 
| 655 | 727 | ||
| 728 | error = -EFAULT; | ||
| 656 | if (copy_from_user(&cfg, ucfg, sizeof(cfg))) | 729 | if (copy_from_user(&cfg, ucfg, sizeof(cfg))) | 
| 657 | return -EFAULT; | 730 | goto errout; | 
| 658 | 731 | ||
| 659 | if ((int)cfg.size < 0) | 732 | error = -EINVAL; | 
| 660 | return -EINVAL; | 733 | if ((cfg.flags & PTRACE_BTS_O_SIGNAL) && | 
| 734 | !(cfg.flags & PTRACE_BTS_O_ALLOC)) | ||
| 735 | goto errout; | ||
| 661 | 736 | ||
| 662 | bts_size = 0; | 737 | if (cfg.flags & PTRACE_BTS_O_ALLOC) { | 
| 663 | ds = (void *)child->thread.ds_area_msr; | 738 | ds_ovfl_callback_t ovfl = NULL; | 
| 664 | if (ds) { | 739 | unsigned int sig = 0; | 
| 665 | bts_size = ds_get_bts_size(ds); | 740 | |
| 666 | if (bts_size < 0) | 741 | /* we ignore the error in case we were not tracing child */ | 
| 667 | return bts_size; | 742 | (void)ds_release_bts(child); | 
| 668 | } | ||
| 669 | cfg.size = PAGE_ALIGN(cfg.size); | ||
| 670 | 743 | ||
| 671 | if (bts_size != cfg.size) { | 744 | if (cfg.flags & PTRACE_BTS_O_SIGNAL) { | 
| 672 | ret = ptrace_bts_realloc(child, cfg.size, | 745 | if (!cfg.signal) | 
| 673 | cfg.flags & PTRACE_BTS_O_CUT_SIZE); | 746 | goto errout; | 
| 674 | if (ret < 0) | 747 | |
| 748 | sig = cfg.signal; | ||
| 749 | ovfl = ptrace_bts_ovfl; | ||
| 750 | } | ||
| 751 | |||
| 752 | error = ds_request_bts(child, /* base = */ NULL, cfg.size, ovfl); | ||
| 753 | if (error < 0) | ||
| 675 | goto errout; | 754 | goto errout; | 
| 676 | 755 | ||
| 677 | ds = (void *)child->thread.ds_area_msr; | 756 | child->thread.bts_ovfl_signal = sig; | 
| 678 | } | 757 | } | 
| 679 | 758 | ||
| 680 | if (cfg.flags & PTRACE_BTS_O_SIGNAL) | 759 | error = -EINVAL; | 
| 681 | ret = ds_set_overflow(ds, DS_O_SIGNAL); | 760 | if (!child->thread.ds_ctx && cfg.flags) | 
| 682 | else | ||
| 683 | ret = ds_set_overflow(ds, DS_O_WRAP); | ||
| 684 | if (ret < 0) | ||
| 685 | goto errout; | 761 | goto errout; | 
| 686 | 762 | ||
| 687 | if (cfg.flags & PTRACE_BTS_O_TRACE) | 763 | if (cfg.flags & PTRACE_BTS_O_TRACE) | 
| 688 | child->thread.debugctlmsr |= ds_debugctl_mask(); | 764 | child->thread.debugctlmsr |= bts_cfg.debugctl_mask; | 
| 689 | else | 765 | else | 
| 690 | child->thread.debugctlmsr &= ~ds_debugctl_mask(); | 766 | child->thread.debugctlmsr &= ~bts_cfg.debugctl_mask; | 
| 691 | 767 | ||
| 692 | if (cfg.flags & PTRACE_BTS_O_SCHED) | 768 | if (cfg.flags & PTRACE_BTS_O_SCHED) | 
| 693 | set_tsk_thread_flag(child, TIF_BTS_TRACE_TS); | 769 | set_tsk_thread_flag(child, TIF_BTS_TRACE_TS); | 
| 694 | else | 770 | else | 
| 695 | clear_tsk_thread_flag(child, TIF_BTS_TRACE_TS); | 771 | clear_tsk_thread_flag(child, TIF_BTS_TRACE_TS); | 
| 696 | 772 | ||
| 697 | ret = sizeof(cfg); | 773 | error = sizeof(cfg); | 
| 698 | 774 | ||
| 699 | out: | 775 | out: | 
| 700 | if (child->thread.debugctlmsr) | 776 | if (child->thread.debugctlmsr) | 
| @@ -702,10 +778,10 @@ out: | |||
| 702 | else | 778 | else | 
| 703 | clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR); | 779 | clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR); | 
| 704 | 780 | ||
| 705 | return ret; | 781 | return error; | 
| 706 | 782 | ||
| 707 | errout: | 783 | errout: | 
| 708 | child->thread.debugctlmsr &= ~ds_debugctl_mask(); | 784 | child->thread.debugctlmsr &= ~bts_cfg.debugctl_mask; | 
| 709 | clear_tsk_thread_flag(child, TIF_BTS_TRACE_TS); | 785 | clear_tsk_thread_flag(child, TIF_BTS_TRACE_TS); | 
| 710 | goto out; | 786 | goto out; | 
| 711 | } | 787 | } | 
| @@ -714,29 +790,40 @@ static int ptrace_bts_status(struct task_struct *child, | |||
| 714 | long cfg_size, | 790 | long cfg_size, | 
| 715 | struct ptrace_bts_config __user *ucfg) | 791 | struct ptrace_bts_config __user *ucfg) | 
| 716 | { | 792 | { | 
| 717 | void *ds = (void *)child->thread.ds_area_msr; | ||
| 718 | struct ptrace_bts_config cfg; | 793 | struct ptrace_bts_config cfg; | 
| 794 | size_t end; | ||
| 795 | const void *base, *max; | ||
| 796 | int error; | ||
| 719 | 797 | ||
| 720 | if (cfg_size < sizeof(cfg)) | 798 | if (cfg_size < sizeof(cfg)) | 
| 721 | return -EIO; | 799 | return -EIO; | 
| 722 | 800 | ||
| 723 | memset(&cfg, 0, sizeof(cfg)); | 801 | error = ds_get_bts_end(child, &end); | 
| 802 | if (error < 0) | ||
| 803 | return error; | ||
| 724 | 804 | ||
| 725 | if (ds) { | 805 | error = ds_access_bts(child, /* index = */ 0, &base); | 
| 726 | cfg.size = ds_get_bts_size(ds); | 806 | if (error < 0) | 
| 807 | return error; | ||
| 727 | 808 | ||
| 728 | if (ds_get_overflow(ds) == DS_O_SIGNAL) | 809 | error = ds_access_bts(child, /* index = */ end, &max); | 
| 729 | cfg.flags |= PTRACE_BTS_O_SIGNAL; | 810 | if (error < 0) | 
| 811 | return error; | ||
| 730 | 812 | ||
| 731 | if (test_tsk_thread_flag(child, TIF_DEBUGCTLMSR) && | 813 | memset(&cfg, 0, sizeof(cfg)); | 
| 732 | child->thread.debugctlmsr & ds_debugctl_mask()) | 814 | cfg.size = (max - base); | 
| 733 | cfg.flags |= PTRACE_BTS_O_TRACE; | 815 | cfg.signal = child->thread.bts_ovfl_signal; | 
| 816 | cfg.bts_size = sizeof(struct bts_struct); | ||
| 734 | 817 | ||
| 735 | if (test_tsk_thread_flag(child, TIF_BTS_TRACE_TS)) | 818 | if (cfg.signal) | 
| 736 | cfg.flags |= PTRACE_BTS_O_SCHED; | 819 | cfg.flags |= PTRACE_BTS_O_SIGNAL; | 
| 737 | } | ||
| 738 | 820 | ||
| 739 | cfg.bts_size = sizeof(struct bts_struct); | 821 | if (test_tsk_thread_flag(child, TIF_DEBUGCTLMSR) && | 
| 822 | child->thread.debugctlmsr & bts_cfg.debugctl_mask) | ||
| 823 | cfg.flags |= PTRACE_BTS_O_TRACE; | ||
| 824 | |||
| 825 | if (test_tsk_thread_flag(child, TIF_BTS_TRACE_TS)) | ||
| 826 | cfg.flags |= PTRACE_BTS_O_SCHED; | ||
| 740 | 827 | ||
| 741 | if (copy_to_user(ucfg, &cfg, sizeof(cfg))) | 828 | if (copy_to_user(ucfg, &cfg, sizeof(cfg))) | 
| 742 | return -EFAULT; | 829 | return -EFAULT; | 
| @@ -744,89 +831,38 @@ static int ptrace_bts_status(struct task_struct *child, | |||
| 744 | return sizeof(cfg); | 831 | return sizeof(cfg); | 
| 745 | } | 832 | } | 
| 746 | 833 | ||
| 747 | |||
| 748 | static int ptrace_bts_write_record(struct task_struct *child, | 834 | static int ptrace_bts_write_record(struct task_struct *child, | 
| 749 | const struct bts_struct *in) | 835 | const struct bts_struct *in) | 
| 750 | { | 836 | { | 
| 751 | int retval; | 837 | unsigned char bts_record[BTS_MAX_RECORD_SIZE]; | 
| 752 | 838 | ||
| 753 | if (!child->thread.ds_area_msr) | 839 | BUG_ON(BTS_MAX_RECORD_SIZE < bts_cfg.sizeof_bts); | 
| 754 | return -ENXIO; | ||
| 755 | 840 | ||
| 756 | retval = ds_write_bts((void *)child->thread.ds_area_msr, in); | 841 | memset(bts_record, 0, bts_cfg.sizeof_bts); | 
| 757 | if (retval) | 842 | switch (in->qualifier) { | 
| 758 | return retval; | 843 | case BTS_INVALID: | 
| 844 | break; | ||
| 759 | 845 | ||
| 760 | return sizeof(*in); | 846 | case BTS_BRANCH: | 
| 761 | } | 847 | bts_set(bts_record, bts_from, in->variant.lbr.from_ip); | 
| 848 | bts_set(bts_record, bts_to, in->variant.lbr.to_ip); | ||
| 849 | break; | ||
| 762 | 850 | ||
| 763 | static int ptrace_bts_realloc(struct task_struct *child, | 851 | case BTS_TASK_ARRIVES: | 
| 764 | int size, int reduce_size) | 852 | case BTS_TASK_DEPARTS: | 
| 765 | { | 853 | bts_set(bts_record, bts_from, bts_escape); | 
| 766 | unsigned long rlim, vm; | 854 | bts_set(bts_record, bts_qual, in->qualifier); | 
| 767 | int ret, old_size; | 855 | bts_set(bts_record, bts_jiffies, in->variant.jiffies); | 
| 856 | break; | ||
| 768 | 857 | ||
| 769 | if (size < 0) | 858 | default: | 
| 770 | return -EINVAL; | 859 | return -EINVAL; | 
| 771 | |||
| 772 | old_size = ds_get_bts_size((void *)child->thread.ds_area_msr); | ||
| 773 | if (old_size < 0) | ||
| 774 | return old_size; | ||
| 775 | |||
| 776 | ret = ds_free((void **)&child->thread.ds_area_msr); | ||
| 777 | if (ret < 0) | ||
| 778 | goto out; | ||
| 779 | |||
| 780 | size >>= PAGE_SHIFT; | ||
| 781 | old_size >>= PAGE_SHIFT; | ||
| 782 | |||
| 783 | current->mm->total_vm -= old_size; | ||
| 784 | current->mm->locked_vm -= old_size; | ||
| 785 | |||
| 786 | if (size == 0) | ||
| 787 | goto out; | ||
| 788 | |||
| 789 | rlim = current->signal->rlim[RLIMIT_AS].rlim_cur >> PAGE_SHIFT; | ||
| 790 | vm = current->mm->total_vm + size; | ||
| 791 | if (rlim < vm) { | ||
| 792 | ret = -ENOMEM; | ||
| 793 | |||
| 794 | if (!reduce_size) | ||
| 795 | goto out; | ||
| 796 | |||
| 797 | size = rlim - current->mm->total_vm; | ||
| 798 | if (size <= 0) | ||
| 799 | goto out; | ||
| 800 | } | ||
| 801 | |||
| 802 | rlim = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur >> PAGE_SHIFT; | ||
| 803 | vm = current->mm->locked_vm + size; | ||
| 804 | if (rlim < vm) { | ||
| 805 | ret = -ENOMEM; | ||
| 806 | |||
| 807 | if (!reduce_size) | ||
| 808 | goto out; | ||
| 809 | |||
| 810 | size = rlim - current->mm->locked_vm; | ||
| 811 | if (size <= 0) | ||
| 812 | goto out; | ||
| 813 | } | 860 | } | 
| 814 | 861 | ||
| 815 | ret = ds_allocate((void **)&child->thread.ds_area_msr, | 862 | /* The writing task will be the switched-to task on a context | 
| 816 | size << PAGE_SHIFT); | 863 | * switch. It needs to write into the switched-from task's BTS | 
| 817 | if (ret < 0) | 864 | * buffer. */ | 
| 818 | goto out; | 865 | return ds_unchecked_write_bts(child, bts_record, bts_cfg.sizeof_bts); | 
| 819 | |||
| 820 | current->mm->total_vm += size; | ||
| 821 | current->mm->locked_vm += size; | ||
| 822 | |||
| 823 | out: | ||
| 824 | if (child->thread.ds_area_msr) | ||
| 825 | set_tsk_thread_flag(child, TIF_DS_AREA_MSR); | ||
| 826 | else | ||
| 827 | clear_tsk_thread_flag(child, TIF_DS_AREA_MSR); | ||
| 828 | |||
| 829 | return ret; | ||
| 830 | } | 866 | } | 
| 831 | 867 | ||
| 832 | void ptrace_bts_take_timestamp(struct task_struct *tsk, | 868 | void ptrace_bts_take_timestamp(struct task_struct *tsk, | 
| @@ -839,7 +875,66 @@ void ptrace_bts_take_timestamp(struct task_struct *tsk, | |||
| 839 | 875 | ||
| 840 | ptrace_bts_write_record(tsk, &rec); | 876 | ptrace_bts_write_record(tsk, &rec); | 
| 841 | } | 877 | } | 
| 842 | #endif /* X86_BTS */ | 878 | |
| 879 | static const struct bts_configuration bts_cfg_netburst = { | ||
| 880 | .sizeof_bts = sizeof(long) * 3, | ||
| 881 | .sizeof_field = sizeof(long), | ||
| 882 | .debugctl_mask = (1<<2)|(1<<3)|(1<<5) | ||
| 883 | }; | ||
| 884 | |||
| 885 | static const struct bts_configuration bts_cfg_pentium_m = { | ||
| 886 | .sizeof_bts = sizeof(long) * 3, | ||
| 887 | .sizeof_field = sizeof(long), | ||
| 888 | .debugctl_mask = (1<<6)|(1<<7) | ||
| 889 | }; | ||
| 890 | |||
| 891 | static const struct bts_configuration bts_cfg_core2 = { | ||
| 892 | .sizeof_bts = 8 * 3, | ||
| 893 | .sizeof_field = 8, | ||
| 894 | .debugctl_mask = (1<<6)|(1<<7)|(1<<9) | ||
| 895 | }; | ||
| 896 | |||
| 897 | static inline void bts_configure(const struct bts_configuration *cfg) | ||
| 898 | { | ||
| 899 | bts_cfg = *cfg; | ||
| 900 | } | ||
| 901 | |||
| 902 | void __cpuinit ptrace_bts_init_intel(struct cpuinfo_x86 *c) | ||
| 903 | { | ||
| 904 | switch (c->x86) { | ||
| 905 | case 0x6: | ||
| 906 | switch (c->x86_model) { | ||
| 907 | case 0xD: | ||
| 908 | case 0xE: /* Pentium M */ | ||
| 909 | bts_configure(&bts_cfg_pentium_m); | ||
| 910 | break; | ||
| 911 | case 0xF: /* Core2 */ | ||
| 912 | case 0x1C: /* Atom */ | ||
| 913 | bts_configure(&bts_cfg_core2); | ||
| 914 | break; | ||
| 915 | default: | ||
| 916 | /* sorry, don't know about them */ | ||
| 917 | break; | ||
| 918 | } | ||
| 919 | break; | ||
| 920 | case 0xF: | ||
| 921 | switch (c->x86_model) { | ||
| 922 | case 0x0: | ||
| 923 | case 0x1: | ||
| 924 | case 0x2: /* Netburst */ | ||
| 925 | bts_configure(&bts_cfg_netburst); | ||
| 926 | break; | ||
| 927 | default: | ||
| 928 | /* sorry, don't know about them */ | ||
| 929 | break; | ||
| 930 | } | ||
| 931 | break; | ||
| 932 | default: | ||
| 933 | /* sorry, don't know about them */ | ||
| 934 | break; | ||
| 935 | } | ||
| 936 | } | ||
| 937 | #endif /* CONFIG_X86_PTRACE_BTS */ | ||
| 843 | 938 | ||
| 844 | /* | 939 | /* | 
| 845 | * Called by kernel/ptrace.c when detaching.. | 940 | * Called by kernel/ptrace.c when detaching.. | 
| @@ -852,15 +947,15 @@ void ptrace_disable(struct task_struct *child) | |||
| 852 | #ifdef TIF_SYSCALL_EMU | 947 | #ifdef TIF_SYSCALL_EMU | 
| 853 | clear_tsk_thread_flag(child, TIF_SYSCALL_EMU); | 948 | clear_tsk_thread_flag(child, TIF_SYSCALL_EMU); | 
| 854 | #endif | 949 | #endif | 
| 855 | if (child->thread.ds_area_msr) { | 950 | #ifdef CONFIG_X86_PTRACE_BTS | 
| 856 | #ifdef X86_BTS | 951 | (void)ds_release_bts(child); | 
| 857 | ptrace_bts_realloc(child, 0, 0); | 952 | |
| 858 | #endif | 953 | child->thread.debugctlmsr &= ~bts_cfg.debugctl_mask; | 
| 859 | child->thread.debugctlmsr &= ~ds_debugctl_mask(); | 954 | if (!child->thread.debugctlmsr) | 
| 860 | if (!child->thread.debugctlmsr) | 955 | clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR); | 
| 861 | clear_tsk_thread_flag(child, TIF_DEBUGCTLMSR); | 956 | |
| 862 | clear_tsk_thread_flag(child, TIF_BTS_TRACE_TS); | 957 | clear_tsk_thread_flag(child, TIF_BTS_TRACE_TS); | 
| 863 | } | 958 | #endif /* CONFIG_X86_PTRACE_BTS */ | 
| 864 | } | 959 | } | 
| 865 | 960 | ||
| 866 | #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION | 961 | #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION | 
| @@ -980,7 +1075,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 980 | /* | 1075 | /* | 
| 981 | * These bits need more cooking - not enabled yet: | 1076 | * These bits need more cooking - not enabled yet: | 
| 982 | */ | 1077 | */ | 
| 983 | #ifdef X86_BTS | 1078 | #ifdef CONFIG_X86_PTRACE_BTS | 
| 984 | case PTRACE_BTS_CONFIG: | 1079 | case PTRACE_BTS_CONFIG: | 
| 985 | ret = ptrace_bts_config | 1080 | ret = ptrace_bts_config | 
| 986 | (child, data, (struct ptrace_bts_config __user *)addr); | 1081 | (child, data, (struct ptrace_bts_config __user *)addr); | 
| @@ -992,7 +1087,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 992 | break; | 1087 | break; | 
| 993 | 1088 | ||
| 994 | case PTRACE_BTS_SIZE: | 1089 | case PTRACE_BTS_SIZE: | 
| 995 | ret = ptrace_bts_get_size(child); | 1090 | ret = ds_get_bts_index(child, /* pos = */ NULL); | 
| 996 | break; | 1091 | break; | 
| 997 | 1092 | ||
| 998 | case PTRACE_BTS_GET: | 1093 | case PTRACE_BTS_GET: | 
| @@ -1001,14 +1096,14 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
| 1001 | break; | 1096 | break; | 
| 1002 | 1097 | ||
| 1003 | case PTRACE_BTS_CLEAR: | 1098 | case PTRACE_BTS_CLEAR: | 
| 1004 | ret = ptrace_bts_clear(child); | 1099 | ret = ds_clear_bts(child); | 
| 1005 | break; | 1100 | break; | 
| 1006 | 1101 | ||
| 1007 | case PTRACE_BTS_DRAIN: | 1102 | case PTRACE_BTS_DRAIN: | 
| 1008 | ret = ptrace_bts_drain | 1103 | ret = ptrace_bts_drain | 
| 1009 | (child, data, (struct bts_struct __user *) addr); | 1104 | (child, data, (struct bts_struct __user *) addr); | 
| 1010 | break; | 1105 | break; | 
| 1011 | #endif | 1106 | #endif /* CONFIG_X86_PTRACE_BTS */ | 
| 1012 | 1107 | ||
| 1013 | default: | 1108 | default: | 
| 1014 | ret = ptrace_request(child, request, addr, data); | 1109 | ret = ptrace_request(child, request, addr, data); | 
| @@ -1375,30 +1470,6 @@ void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int error_code) | |||
| 1375 | force_sig_info(SIGTRAP, &info, tsk); | 1470 | force_sig_info(SIGTRAP, &info, tsk); | 
| 1376 | } | 1471 | } | 
| 1377 | 1472 | ||
| 1378 | static void syscall_trace(struct pt_regs *regs) | ||
| 1379 | { | ||
| 1380 | if (!(current->ptrace & PT_PTRACED)) | ||
| 1381 | return; | ||
| 1382 | |||
| 1383 | #if 0 | ||
| 1384 | printk("trace %s ip %lx sp %lx ax %d origrax %d caller %lx tiflags %x ptrace %x\n", | ||
| 1385 | current->comm, | ||
| 1386 | regs->ip, regs->sp, regs->ax, regs->orig_ax, __builtin_return_address(0), | ||
| 1387 | current_thread_info()->flags, current->ptrace); | ||
| 1388 | #endif | ||
| 1389 | |||
| 1390 | ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) | ||
| 1391 | ? 0x80 : 0)); | ||
| 1392 | /* | ||
| 1393 | * this isn't the same as continuing with a signal, but it will do | ||
| 1394 | * for normal use. strace only continues with a signal if the | ||
| 1395 | * stopping signal is not SIGTRAP. -brl | ||
| 1396 | */ | ||
| 1397 | if (current->exit_code) { | ||
| 1398 | send_sig(current->exit_code, current, 1); | ||
| 1399 | current->exit_code = 0; | ||
| 1400 | } | ||
| 1401 | } | ||
| 1402 | 1473 | ||
| 1403 | #ifdef CONFIG_X86_32 | 1474 | #ifdef CONFIG_X86_32 | 
| 1404 | # define IS_IA32 1 | 1475 | # define IS_IA32 1 | 
| @@ -1432,8 +1503,9 @@ asmregparm long syscall_trace_enter(struct pt_regs *regs) | |||
| 1432 | if (unlikely(test_thread_flag(TIF_SYSCALL_EMU))) | 1503 | if (unlikely(test_thread_flag(TIF_SYSCALL_EMU))) | 
| 1433 | ret = -1L; | 1504 | ret = -1L; | 
| 1434 | 1505 | ||
| 1435 | if (ret || test_thread_flag(TIF_SYSCALL_TRACE)) | 1506 | if ((ret || test_thread_flag(TIF_SYSCALL_TRACE)) && | 
| 1436 | syscall_trace(regs); | 1507 | tracehook_report_syscall_entry(regs)) | 
| 1508 | ret = -1L; | ||
| 1437 | 1509 | ||
| 1438 | if (unlikely(current->audit_context)) { | 1510 | if (unlikely(current->audit_context)) { | 
| 1439 | if (IS_IA32) | 1511 | if (IS_IA32) | 
| @@ -1459,7 +1531,7 @@ asmregparm void syscall_trace_leave(struct pt_regs *regs) | |||
| 1459 | audit_syscall_exit(AUDITSC_RESULT(regs->ax), regs->ax); | 1531 | audit_syscall_exit(AUDITSC_RESULT(regs->ax), regs->ax); | 
| 1460 | 1532 | ||
| 1461 | if (test_thread_flag(TIF_SYSCALL_TRACE)) | 1533 | if (test_thread_flag(TIF_SYSCALL_TRACE)) | 
| 1462 | syscall_trace(regs); | 1534 | tracehook_report_syscall_exit(regs, 0); | 
| 1463 | 1535 | ||
| 1464 | /* | 1536 | /* | 
| 1465 | * If TIF_SYSCALL_EMU is set, we only get here because of | 1537 | * If TIF_SYSCALL_EMU is set, we only get here because of | 
| @@ -1475,6 +1547,6 @@ asmregparm void syscall_trace_leave(struct pt_regs *regs) | |||
| 1475 | * system call instruction. | 1547 | * system call instruction. | 
| 1476 | */ | 1548 | */ | 
| 1477 | if (test_thread_flag(TIF_SINGLESTEP) && | 1549 | if (test_thread_flag(TIF_SINGLESTEP) && | 
| 1478 | (current->ptrace & PT_PTRACED)) | 1550 | tracehook_consider_fatal_signal(current, SIGTRAP, SIG_DFL)) | 
| 1479 | send_sigtrap(current, regs, 0); | 1551 | send_sigtrap(current, regs, 0); | 
| 1480 | } | 1552 | } | 
| diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 724adfc63cb9..f4c93f1cfc19 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
| @@ -29,7 +29,11 @@ EXPORT_SYMBOL(pm_power_off); | |||
| 29 | 29 | ||
| 30 | static const struct desc_ptr no_idt = {}; | 30 | static const struct desc_ptr no_idt = {}; | 
| 31 | static int reboot_mode; | 31 | static int reboot_mode; | 
| 32 | enum reboot_type reboot_type = BOOT_KBD; | 32 | /* | 
| 33 | * Keyboard reset and triple fault may result in INIT, not RESET, which | ||
| 34 | * doesn't work when we're in vmx root mode. Try ACPI first. | ||
| 35 | */ | ||
| 36 | enum reboot_type reboot_type = BOOT_ACPI; | ||
| 33 | int reboot_force; | 37 | int reboot_force; | 
| 34 | 38 | ||
| 35 | #if defined(CONFIG_X86_32) && defined(CONFIG_SMP) | 39 | #if defined(CONFIG_X86_32) && defined(CONFIG_SMP) | 
| diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 9838f2539dfc..141efab52400 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -223,6 +223,9 @@ unsigned long saved_video_mode; | |||
| 223 | #define RAMDISK_LOAD_FLAG 0x4000 | 223 | #define RAMDISK_LOAD_FLAG 0x4000 | 
| 224 | 224 | ||
| 225 | static char __initdata command_line[COMMAND_LINE_SIZE]; | 225 | static char __initdata command_line[COMMAND_LINE_SIZE]; | 
| 226 | #ifdef CONFIG_CMDLINE_BOOL | ||
| 227 | static char __initdata builtin_cmdline[COMMAND_LINE_SIZE] = CONFIG_CMDLINE; | ||
| 228 | #endif | ||
| 226 | 229 | ||
| 227 | #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE) | 230 | #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE) | 
| 228 | struct edd edd; | 231 | struct edd edd; | 
| @@ -665,6 +668,19 @@ void __init setup_arch(char **cmdline_p) | |||
| 665 | bss_resource.start = virt_to_phys(&__bss_start); | 668 | bss_resource.start = virt_to_phys(&__bss_start); | 
| 666 | bss_resource.end = virt_to_phys(&__bss_stop)-1; | 669 | bss_resource.end = virt_to_phys(&__bss_stop)-1; | 
| 667 | 670 | ||
| 671 | #ifdef CONFIG_CMDLINE_BOOL | ||
| 672 | #ifdef CONFIG_CMDLINE_OVERRIDE | ||
| 673 | strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); | ||
| 674 | #else | ||
| 675 | if (builtin_cmdline[0]) { | ||
| 676 | /* append boot loader cmdline to builtin */ | ||
| 677 | strlcat(builtin_cmdline, " ", COMMAND_LINE_SIZE); | ||
| 678 | strlcat(builtin_cmdline, boot_command_line, COMMAND_LINE_SIZE); | ||
| 679 | strlcpy(boot_command_line, builtin_cmdline, COMMAND_LINE_SIZE); | ||
| 680 | } | ||
| 681 | #endif | ||
| 682 | #endif | ||
| 683 | |||
| 668 | strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE); | 684 | strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE); | 
| 669 | *cmdline_p = command_line; | 685 | *cmdline_p = command_line; | 
| 670 | 686 | ||
| diff --git a/arch/x86/kernel/setup_percpu.c b/arch/x86/kernel/setup_percpu.c index 76e305e064f9..0e67f72d9316 100644 --- a/arch/x86/kernel/setup_percpu.c +++ b/arch/x86/kernel/setup_percpu.c | |||
| @@ -162,9 +162,16 @@ void __init setup_per_cpu_areas(void) | |||
| 162 | printk(KERN_INFO | 162 | printk(KERN_INFO | 
| 163 | "cpu %d has no node %d or node-local memory\n", | 163 | "cpu %d has no node %d or node-local memory\n", | 
| 164 | cpu, node); | 164 | cpu, node); | 
| 165 | if (ptr) | ||
| 166 | printk(KERN_DEBUG "per cpu data for cpu%d at %016lx\n", | ||
| 167 | cpu, __pa(ptr)); | ||
| 165 | } | 168 | } | 
| 166 | else | 169 | else { | 
| 167 | ptr = alloc_bootmem_pages_node(NODE_DATA(node), size); | 170 | ptr = alloc_bootmem_pages_node(NODE_DATA(node), size); | 
| 171 | if (ptr) | ||
| 172 | printk(KERN_DEBUG "per cpu data for cpu%d on node%d at %016lx\n", | ||
| 173 | cpu, node, __pa(ptr)); | ||
| 174 | } | ||
| 168 | #endif | 175 | #endif | 
| 169 | per_cpu_offset(cpu) = ptr - __per_cpu_start; | 176 | per_cpu_offset(cpu) = ptr - __per_cpu_start; | 
| 170 | memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); | 177 | memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); | 
| diff --git a/arch/x86/kernel/sigframe.h b/arch/x86/kernel/sigframe.h index 72bbb519d2dc..8b4956e800ac 100644 --- a/arch/x86/kernel/sigframe.h +++ b/arch/x86/kernel/sigframe.h | |||
| @@ -24,4 +24,9 @@ struct rt_sigframe { | |||
| 24 | struct ucontext uc; | 24 | struct ucontext uc; | 
| 25 | struct siginfo info; | 25 | struct siginfo info; | 
| 26 | }; | 26 | }; | 
| 27 | |||
| 28 | int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | ||
| 29 | sigset_t *set, struct pt_regs *regs); | ||
| 30 | int ia32_setup_frame(int sig, struct k_sigaction *ka, | ||
| 31 | sigset_t *set, struct pt_regs *regs); | ||
| 27 | #endif | 32 | #endif | 
| diff --git a/arch/x86/kernel/signal_32.c b/arch/x86/kernel/signal_32.c index 6fb5bcdd8933..2a2435d3037d 100644 --- a/arch/x86/kernel/signal_32.c +++ b/arch/x86/kernel/signal_32.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/errno.h> | 17 | #include <linux/errno.h> | 
| 18 | #include <linux/sched.h> | 18 | #include <linux/sched.h> | 
| 19 | #include <linux/wait.h> | 19 | #include <linux/wait.h> | 
| 20 | #include <linux/tracehook.h> | ||
| 20 | #include <linux/elf.h> | 21 | #include <linux/elf.h> | 
| 21 | #include <linux/smp.h> | 22 | #include <linux/smp.h> | 
| 22 | #include <linux/mm.h> | 23 | #include <linux/mm.h> | 
| @@ -26,6 +27,7 @@ | |||
| 26 | #include <asm/uaccess.h> | 27 | #include <asm/uaccess.h> | 
| 27 | #include <asm/i387.h> | 28 | #include <asm/i387.h> | 
| 28 | #include <asm/vdso.h> | 29 | #include <asm/vdso.h> | 
| 30 | #include <asm/syscalls.h> | ||
| 29 | 31 | ||
| 30 | #include "sigframe.h" | 32 | #include "sigframe.h" | 
| 31 | 33 | ||
| @@ -558,8 +560,6 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
| 558 | * handler too. | 560 | * handler too. | 
| 559 | */ | 561 | */ | 
| 560 | regs->flags &= ~X86_EFLAGS_TF; | 562 | regs->flags &= ~X86_EFLAGS_TF; | 
| 561 | if (test_thread_flag(TIF_SINGLESTEP)) | ||
| 562 | ptrace_notify(SIGTRAP); | ||
| 563 | 563 | ||
| 564 | spin_lock_irq(¤t->sighand->siglock); | 564 | spin_lock_irq(¤t->sighand->siglock); | 
| 565 | sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask); | 565 | sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask); | 
| @@ -568,6 +568,9 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
| 568 | recalc_sigpending(); | 568 | recalc_sigpending(); | 
| 569 | spin_unlock_irq(¤t->sighand->siglock); | 569 | spin_unlock_irq(¤t->sighand->siglock); | 
| 570 | 570 | ||
| 571 | tracehook_signal_handler(sig, info, ka, regs, | ||
| 572 | test_thread_flag(TIF_SINGLESTEP)); | ||
| 573 | |||
| 571 | return 0; | 574 | return 0; | 
| 572 | } | 575 | } | 
| 573 | 576 | ||
| @@ -661,5 +664,10 @@ do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags) | |||
| 661 | if (thread_info_flags & _TIF_SIGPENDING) | 664 | if (thread_info_flags & _TIF_SIGPENDING) | 
| 662 | do_signal(regs); | 665 | do_signal(regs); | 
| 663 | 666 | ||
| 667 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { | ||
| 668 | clear_thread_flag(TIF_NOTIFY_RESUME); | ||
| 669 | tracehook_notify_resume(regs); | ||
| 670 | } | ||
| 671 | |||
| 664 | clear_thread_flag(TIF_IRET); | 672 | clear_thread_flag(TIF_IRET); | 
| 665 | } | 673 | } | 
| diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c index ca316b5b742c..694aa888bb19 100644 --- a/arch/x86/kernel/signal_64.c +++ b/arch/x86/kernel/signal_64.c | |||
| @@ -15,17 +15,21 @@ | |||
| 15 | #include <linux/errno.h> | 15 | #include <linux/errno.h> | 
| 16 | #include <linux/wait.h> | 16 | #include <linux/wait.h> | 
| 17 | #include <linux/ptrace.h> | 17 | #include <linux/ptrace.h> | 
| 18 | #include <linux/tracehook.h> | ||
| 18 | #include <linux/unistd.h> | 19 | #include <linux/unistd.h> | 
| 19 | #include <linux/stddef.h> | 20 | #include <linux/stddef.h> | 
| 20 | #include <linux/personality.h> | 21 | #include <linux/personality.h> | 
| 21 | #include <linux/compiler.h> | 22 | #include <linux/compiler.h> | 
| 23 | #include <linux/uaccess.h> | ||
| 24 | |||
| 22 | #include <asm/processor.h> | 25 | #include <asm/processor.h> | 
| 23 | #include <asm/ucontext.h> | 26 | #include <asm/ucontext.h> | 
| 24 | #include <asm/uaccess.h> | ||
| 25 | #include <asm/i387.h> | 27 | #include <asm/i387.h> | 
| 26 | #include <asm/proto.h> | 28 | #include <asm/proto.h> | 
| 27 | #include <asm/ia32_unistd.h> | 29 | #include <asm/ia32_unistd.h> | 
| 28 | #include <asm/mce.h> | 30 | #include <asm/mce.h> | 
| 31 | #include <asm/syscall.h> | ||
| 32 | #include <asm/syscalls.h> | ||
| 29 | #include "sigframe.h" | 33 | #include "sigframe.h" | 
| 30 | 34 | ||
| 31 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 35 | #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) | 
| @@ -41,11 +45,6 @@ | |||
| 41 | # define FIX_EFLAGS __FIX_EFLAGS | 45 | # define FIX_EFLAGS __FIX_EFLAGS | 
| 42 | #endif | 46 | #endif | 
| 43 | 47 | ||
| 44 | int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | ||
| 45 | sigset_t *set, struct pt_regs * regs); | ||
| 46 | int ia32_setup_frame(int sig, struct k_sigaction *ka, | ||
| 47 | sigset_t *set, struct pt_regs * regs); | ||
| 48 | |||
| 49 | asmlinkage long | 48 | asmlinkage long | 
| 50 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | 49 | sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | 
| 51 | struct pt_regs *regs) | 50 | struct pt_regs *regs) | 
| @@ -128,7 +127,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, | |||
| 128 | /* Always make any pending restarted system calls return -EINTR */ | 127 | /* Always make any pending restarted system calls return -EINTR */ | 
| 129 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | 128 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | 
| 130 | 129 | ||
| 131 | #define COPY(x) err |= __get_user(regs->x, &sc->x) | 130 | #define COPY(x) (err |= __get_user(regs->x, &sc->x)) | 
| 132 | 131 | ||
| 133 | COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx); | 132 | COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx); | 
| 134 | COPY(dx); COPY(cx); COPY(ip); | 133 | COPY(dx); COPY(cx); COPY(ip); | 
| @@ -158,7 +157,7 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, | |||
| 158 | } | 157 | } | 
| 159 | 158 | ||
| 160 | { | 159 | { | 
| 161 | struct _fpstate __user * buf; | 160 | struct _fpstate __user *buf; | 
| 162 | err |= __get_user(buf, &sc->fpstate); | 161 | err |= __get_user(buf, &sc->fpstate); | 
| 163 | 162 | ||
| 164 | if (buf) { | 163 | if (buf) { | 
| @@ -198,7 +197,7 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) | |||
| 198 | current->blocked = set; | 197 | current->blocked = set; | 
| 199 | recalc_sigpending(); | 198 | recalc_sigpending(); | 
| 200 | spin_unlock_irq(¤t->sighand->siglock); | 199 | spin_unlock_irq(¤t->sighand->siglock); | 
| 201 | 200 | ||
| 202 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) | 201 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ax)) | 
| 203 | goto badframe; | 202 | goto badframe; | 
| 204 | 203 | ||
| @@ -208,16 +207,17 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) | |||
| 208 | return ax; | 207 | return ax; | 
| 209 | 208 | ||
| 210 | badframe: | 209 | badframe: | 
| 211 | signal_fault(regs,frame,"sigreturn"); | 210 | signal_fault(regs, frame, "sigreturn"); | 
| 212 | return 0; | 211 | return 0; | 
| 213 | } | 212 | } | 
| 214 | 213 | ||
| 215 | /* | 214 | /* | 
| 216 | * Set up a signal frame. | 215 | * Set up a signal frame. | 
| 217 | */ | 216 | */ | 
| 218 | 217 | ||
| 219 | static inline int | 218 | static inline int | 
| 220 | setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, unsigned long mask, struct task_struct *me) | 219 | setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, | 
| 220 | unsigned long mask, struct task_struct *me) | ||
| 221 | { | 221 | { | 
| 222 | int err = 0; | 222 | int err = 0; | 
| 223 | 223 | ||
| @@ -273,35 +273,35 @@ get_stack(struct k_sigaction *ka, struct pt_regs *regs, unsigned long size) | |||
| 273 | } | 273 | } | 
| 274 | 274 | ||
| 275 | static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 275 | static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | 
| 276 | sigset_t *set, struct pt_regs * regs) | 276 | sigset_t *set, struct pt_regs *regs) | 
| 277 | { | 277 | { | 
| 278 | struct rt_sigframe __user *frame; | 278 | struct rt_sigframe __user *frame; | 
| 279 | struct _fpstate __user *fp = NULL; | 279 | struct _fpstate __user *fp = NULL; | 
| 280 | int err = 0; | 280 | int err = 0; | 
| 281 | struct task_struct *me = current; | 281 | struct task_struct *me = current; | 
| 282 | 282 | ||
| 283 | if (used_math()) { | 283 | if (used_math()) { | 
| 284 | fp = get_stack(ka, regs, sizeof(struct _fpstate)); | 284 | fp = get_stack(ka, regs, sizeof(struct _fpstate)); | 
| 285 | frame = (void __user *)round_down( | 285 | frame = (void __user *)round_down( | 
| 286 | (unsigned long)fp - sizeof(struct rt_sigframe), 16) - 8; | 286 | (unsigned long)fp - sizeof(struct rt_sigframe), 16) - 8; | 
| 287 | 287 | ||
| 288 | if (!access_ok(VERIFY_WRITE, fp, sizeof(struct _fpstate))) | 288 | if (!access_ok(VERIFY_WRITE, fp, sizeof(struct _fpstate))) | 
| 289 | goto give_sigsegv; | 289 | goto give_sigsegv; | 
| 290 | 290 | ||
| 291 | if (save_i387(fp) < 0) | 291 | if (save_i387(fp) < 0) | 
| 292 | err |= -1; | 292 | err |= -1; | 
| 293 | } else | 293 | } else | 
| 294 | frame = get_stack(ka, regs, sizeof(struct rt_sigframe)) - 8; | 294 | frame = get_stack(ka, regs, sizeof(struct rt_sigframe)) - 8; | 
| 295 | 295 | ||
| 296 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 296 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 
| 297 | goto give_sigsegv; | 297 | goto give_sigsegv; | 
| 298 | 298 | ||
| 299 | if (ka->sa.sa_flags & SA_SIGINFO) { | 299 | if (ka->sa.sa_flags & SA_SIGINFO) { | 
| 300 | err |= copy_siginfo_to_user(&frame->info, info); | 300 | err |= copy_siginfo_to_user(&frame->info, info); | 
| 301 | if (err) | 301 | if (err) | 
| 302 | goto give_sigsegv; | 302 | goto give_sigsegv; | 
| 303 | } | 303 | } | 
| 304 | 304 | ||
| 305 | /* Create the ucontext. */ | 305 | /* Create the ucontext. */ | 
| 306 | err |= __put_user(0, &frame->uc.uc_flags); | 306 | err |= __put_user(0, &frame->uc.uc_flags); | 
| 307 | err |= __put_user(0, &frame->uc.uc_link); | 307 | err |= __put_user(0, &frame->uc.uc_link); | 
| @@ -311,9 +311,9 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 311 | err |= __put_user(me->sas_ss_size, &frame->uc.uc_stack.ss_size); | 311 | err |= __put_user(me->sas_ss_size, &frame->uc.uc_stack.ss_size); | 
| 312 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0], me); | 312 | err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0], me); | 
| 313 | err |= __put_user(fp, &frame->uc.uc_mcontext.fpstate); | 313 | err |= __put_user(fp, &frame->uc.uc_mcontext.fpstate); | 
| 314 | if (sizeof(*set) == 16) { | 314 | if (sizeof(*set) == 16) { | 
| 315 | __put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0]); | 315 | __put_user(set->sig[0], &frame->uc.uc_sigmask.sig[0]); | 
| 316 | __put_user(set->sig[1], &frame->uc.uc_sigmask.sig[1]); | 316 | __put_user(set->sig[1], &frame->uc.uc_sigmask.sig[1]); | 
| 317 | } else | 317 | } else | 
| 318 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 318 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 
| 319 | 319 | ||
| @@ -324,7 +324,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 324 | err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); | 324 | err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); | 
| 325 | } else { | 325 | } else { | 
| 326 | /* could use a vstub here */ | 326 | /* could use a vstub here */ | 
| 327 | goto give_sigsegv; | 327 | goto give_sigsegv; | 
| 328 | } | 328 | } | 
| 329 | 329 | ||
| 330 | if (err) | 330 | if (err) | 
| @@ -332,7 +332,7 @@ static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 332 | 332 | ||
| 333 | /* Set up registers for signal handler */ | 333 | /* Set up registers for signal handler */ | 
| 334 | regs->di = sig; | 334 | regs->di = sig; | 
| 335 | /* In case the signal handler was declared without prototypes */ | 335 | /* In case the signal handler was declared without prototypes */ | 
| 336 | regs->ax = 0; | 336 | regs->ax = 0; | 
| 337 | 337 | ||
| 338 | /* This also works for non SA_SIGINFO handlers because they expect the | 338 | /* This also works for non SA_SIGINFO handlers because they expect the | 
| @@ -355,37 +355,8 @@ give_sigsegv: | |||
| 355 | } | 355 | } | 
| 356 | 356 | ||
| 357 | /* | 357 | /* | 
| 358 | * Return -1L or the syscall number that @regs is executing. | ||
| 359 | */ | ||
| 360 | static long current_syscall(struct pt_regs *regs) | ||
| 361 | { | ||
| 362 | /* | ||
| 363 | * We always sign-extend a -1 value being set here, | ||
| 364 | * so this is always either -1L or a syscall number. | ||
| 365 | */ | ||
| 366 | return regs->orig_ax; | ||
| 367 | } | ||
| 368 | |||
| 369 | /* | ||
| 370 | * Return a value that is -EFOO if the system call in @regs->orig_ax | ||
| 371 | * returned an error. This only works for @regs from @current. | ||
| 372 | */ | ||
| 373 | static long current_syscall_ret(struct pt_regs *regs) | ||
| 374 | { | ||
| 375 | #ifdef CONFIG_IA32_EMULATION | ||
| 376 | if (test_thread_flag(TIF_IA32)) | ||
| 377 | /* | ||
| 378 | * Sign-extend the value so (int)-EFOO becomes (long)-EFOO | ||
| 379 | * and will match correctly in comparisons. | ||
| 380 | */ | ||
| 381 | return (int) regs->ax; | ||
| 382 | #endif | ||
| 383 | return regs->ax; | ||
| 384 | } | ||
| 385 | |||
| 386 | /* | ||
| 387 | * OK, we're invoking a handler | 358 | * OK, we're invoking a handler | 
| 388 | */ | 359 | */ | 
| 389 | 360 | ||
| 390 | static int | 361 | static int | 
| 391 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | 362 | handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | 
| @@ -394,9 +365,9 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
| 394 | int ret; | 365 | int ret; | 
| 395 | 366 | ||
| 396 | /* Are we from a system call? */ | 367 | /* Are we from a system call? */ | 
| 397 | if (current_syscall(regs) >= 0) { | 368 | if (syscall_get_nr(current, regs) >= 0) { | 
| 398 | /* If so, check system call restarting.. */ | 369 | /* If so, check system call restarting.. */ | 
| 399 | switch (current_syscall_ret(regs)) { | 370 | switch (syscall_get_error(current, regs)) { | 
| 400 | case -ERESTART_RESTARTBLOCK: | 371 | case -ERESTART_RESTARTBLOCK: | 
| 401 | case -ERESTARTNOHAND: | 372 | case -ERESTARTNOHAND: | 
| 402 | regs->ax = -EINTR; | 373 | regs->ax = -EINTR; | 
| @@ -429,7 +400,7 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
| 429 | ret = ia32_setup_rt_frame(sig, ka, info, oldset, regs); | 400 | ret = ia32_setup_rt_frame(sig, ka, info, oldset, regs); | 
| 430 | else | 401 | else | 
| 431 | ret = ia32_setup_frame(sig, ka, oldset, regs); | 402 | ret = ia32_setup_frame(sig, ka, oldset, regs); | 
| 432 | } else | 403 | } else | 
| 433 | #endif | 404 | #endif | 
| 434 | ret = setup_rt_frame(sig, ka, info, oldset, regs); | 405 | ret = setup_rt_frame(sig, ka, info, oldset, regs); | 
| 435 | 406 | ||
| @@ -453,15 +424,16 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
| 453 | * handler too. | 424 | * handler too. | 
| 454 | */ | 425 | */ | 
| 455 | regs->flags &= ~X86_EFLAGS_TF; | 426 | regs->flags &= ~X86_EFLAGS_TF; | 
| 456 | if (test_thread_flag(TIF_SINGLESTEP)) | ||
| 457 | ptrace_notify(SIGTRAP); | ||
| 458 | 427 | ||
| 459 | spin_lock_irq(¤t->sighand->siglock); | 428 | spin_lock_irq(¤t->sighand->siglock); | 
| 460 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | 429 | sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask); | 
| 461 | if (!(ka->sa.sa_flags & SA_NODEFER)) | 430 | if (!(ka->sa.sa_flags & SA_NODEFER)) | 
| 462 | sigaddset(¤t->blocked,sig); | 431 | sigaddset(¤t->blocked, sig); | 
| 463 | recalc_sigpending(); | 432 | recalc_sigpending(); | 
| 464 | spin_unlock_irq(¤t->sighand->siglock); | 433 | spin_unlock_irq(¤t->sighand->siglock); | 
| 434 | |||
| 435 | tracehook_signal_handler(sig, info, ka, regs, | ||
| 436 | test_thread_flag(TIF_SINGLESTEP)); | ||
| 465 | } | 437 | } | 
| 466 | 438 | ||
| 467 | return ret; | 439 | return ret; | 
| @@ -518,9 +490,9 @@ static void do_signal(struct pt_regs *regs) | |||
| 518 | } | 490 | } | 
| 519 | 491 | ||
| 520 | /* Did we come from a system call? */ | 492 | /* Did we come from a system call? */ | 
| 521 | if (current_syscall(regs) >= 0) { | 493 | if (syscall_get_nr(current, regs) >= 0) { | 
| 522 | /* Restart the system call - no handlers present */ | 494 | /* Restart the system call - no handlers present */ | 
| 523 | switch (current_syscall_ret(regs)) { | 495 | switch (syscall_get_error(current, regs)) { | 
| 524 | case -ERESTARTNOHAND: | 496 | case -ERESTARTNOHAND: | 
| 525 | case -ERESTARTSYS: | 497 | case -ERESTARTSYS: | 
| 526 | case -ERESTARTNOINTR: | 498 | case -ERESTARTNOINTR: | 
| @@ -558,17 +530,23 @@ void do_notify_resume(struct pt_regs *regs, void *unused, | |||
| 558 | /* deal with pending signal delivery */ | 530 | /* deal with pending signal delivery */ | 
| 559 | if (thread_info_flags & _TIF_SIGPENDING) | 531 | if (thread_info_flags & _TIF_SIGPENDING) | 
| 560 | do_signal(regs); | 532 | do_signal(regs); | 
| 533 | |||
| 534 | if (thread_info_flags & _TIF_NOTIFY_RESUME) { | ||
| 535 | clear_thread_flag(TIF_NOTIFY_RESUME); | ||
| 536 | tracehook_notify_resume(regs); | ||
| 537 | } | ||
| 561 | } | 538 | } | 
| 562 | 539 | ||
| 563 | void signal_fault(struct pt_regs *regs, void __user *frame, char *where) | 540 | void signal_fault(struct pt_regs *regs, void __user *frame, char *where) | 
| 564 | { | 541 | { | 
| 565 | struct task_struct *me = current; | 542 | struct task_struct *me = current; | 
| 566 | if (show_unhandled_signals && printk_ratelimit()) { | 543 | if (show_unhandled_signals && printk_ratelimit()) { | 
| 567 | printk("%s[%d] bad frame in %s frame:%p ip:%lx sp:%lx orax:%lx", | 544 | printk("%s[%d] bad frame in %s frame:%p ip:%lx sp:%lx orax:%lx", | 
| 568 | me->comm,me->pid,where,frame,regs->ip,regs->sp,regs->orig_ax); | 545 | me->comm, me->pid, where, frame, regs->ip, | 
| 546 | regs->sp, regs->orig_ax); | ||
| 569 | print_vma_addr(" in ", regs->ip); | 547 | print_vma_addr(" in ", regs->ip); | 
| 570 | printk("\n"); | 548 | printk("\n"); | 
| 571 | } | 549 | } | 
| 572 | 550 | ||
| 573 | force_sig(SIGSEGV, me); | 551 | force_sig(SIGSEGV, me); | 
| 574 | } | 552 | } | 
| diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 7985c5b3f916..45531e3ba194 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -88,7 +88,7 @@ static DEFINE_PER_CPU(struct task_struct *, idle_thread_array); | |||
| 88 | #define get_idle_for_cpu(x) (per_cpu(idle_thread_array, x)) | 88 | #define get_idle_for_cpu(x) (per_cpu(idle_thread_array, x)) | 
| 89 | #define set_idle_for_cpu(x, p) (per_cpu(idle_thread_array, x) = (p)) | 89 | #define set_idle_for_cpu(x, p) (per_cpu(idle_thread_array, x) = (p)) | 
| 90 | #else | 90 | #else | 
| 91 | struct task_struct *idle_thread_array[NR_CPUS] __cpuinitdata ; | 91 | static struct task_struct *idle_thread_array[NR_CPUS] __cpuinitdata ; | 
| 92 | #define get_idle_for_cpu(x) (idle_thread_array[(x)]) | 92 | #define get_idle_for_cpu(x) (idle_thread_array[(x)]) | 
| 93 | #define set_idle_for_cpu(x, p) (idle_thread_array[(x)] = (p)) | 93 | #define set_idle_for_cpu(x, p) (idle_thread_array[(x)] = (p)) | 
| 94 | #endif | 94 | #endif | 
| @@ -129,7 +129,7 @@ static int boot_cpu_logical_apicid; | |||
| 129 | static cpumask_t cpu_sibling_setup_map; | 129 | static cpumask_t cpu_sibling_setup_map; | 
| 130 | 130 | ||
| 131 | /* Set if we find a B stepping CPU */ | 131 | /* Set if we find a B stepping CPU */ | 
| 132 | int __cpuinitdata smp_b_stepping; | 132 | static int __cpuinitdata smp_b_stepping; | 
| 133 | 133 | ||
| 134 | #if defined(CONFIG_NUMA) && defined(CONFIG_X86_32) | 134 | #if defined(CONFIG_NUMA) && defined(CONFIG_X86_32) | 
| 135 | 135 | ||
| @@ -1313,16 +1313,13 @@ __init void prefill_possible_map(void) | |||
| 1313 | if (!num_processors) | 1313 | if (!num_processors) | 
| 1314 | num_processors = 1; | 1314 | num_processors = 1; | 
| 1315 | 1315 | ||
| 1316 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 1317 | if (additional_cpus == -1) { | 1316 | if (additional_cpus == -1) { | 
| 1318 | if (disabled_cpus > 0) | 1317 | if (disabled_cpus > 0) | 
| 1319 | additional_cpus = disabled_cpus; | 1318 | additional_cpus = disabled_cpus; | 
| 1320 | else | 1319 | else | 
| 1321 | additional_cpus = 0; | 1320 | additional_cpus = 0; | 
| 1322 | } | 1321 | } | 
| 1323 | #else | 1322 | |
| 1324 | additional_cpus = 0; | ||
| 1325 | #endif | ||
| 1326 | possible = num_processors + additional_cpus; | 1323 | possible = num_processors + additional_cpus; | 
| 1327 | if (possible > NR_CPUS) | 1324 | if (possible > NR_CPUS) | 
| 1328 | possible = NR_CPUS; | 1325 | possible = NR_CPUS; | 
| diff --git a/arch/x86/kernel/sys_i386_32.c b/arch/x86/kernel/sys_i386_32.c index 7066cb855a60..1884a8d12bfa 100644 --- a/arch/x86/kernel/sys_i386_32.c +++ b/arch/x86/kernel/sys_i386_32.c | |||
| @@ -22,6 +22,8 @@ | |||
| 22 | #include <linux/uaccess.h> | 22 | #include <linux/uaccess.h> | 
| 23 | #include <linux/unistd.h> | 23 | #include <linux/unistd.h> | 
| 24 | 24 | ||
| 25 | #include <asm/syscalls.h> | ||
| 26 | |||
| 25 | asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, | 27 | asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, | 
| 26 | unsigned long prot, unsigned long flags, | 28 | unsigned long prot, unsigned long flags, | 
| 27 | unsigned long fd, unsigned long pgoff) | 29 | unsigned long fd, unsigned long pgoff) | 
| diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c index 3b360ef33817..6bc211accf08 100644 --- a/arch/x86/kernel/sys_x86_64.c +++ b/arch/x86/kernel/sys_x86_64.c | |||
| @@ -13,15 +13,17 @@ | |||
| 13 | #include <linux/utsname.h> | 13 | #include <linux/utsname.h> | 
| 14 | #include <linux/personality.h> | 14 | #include <linux/personality.h> | 
| 15 | #include <linux/random.h> | 15 | #include <linux/random.h> | 
| 16 | #include <linux/uaccess.h> | ||
| 16 | 17 | ||
| 17 | #include <asm/uaccess.h> | ||
| 18 | #include <asm/ia32.h> | 18 | #include <asm/ia32.h> | 
| 19 | #include <asm/syscalls.h> | ||
| 19 | 20 | ||
| 20 | asmlinkage long sys_mmap(unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags, | 21 | asmlinkage long sys_mmap(unsigned long addr, unsigned long len, | 
| 21 | unsigned long fd, unsigned long off) | 22 | unsigned long prot, unsigned long flags, | 
| 23 | unsigned long fd, unsigned long off) | ||
| 22 | { | 24 | { | 
| 23 | long error; | 25 | long error; | 
| 24 | struct file * file; | 26 | struct file *file; | 
| 25 | 27 | ||
| 26 | error = -EINVAL; | 28 | error = -EINVAL; | 
| 27 | if (off & ~PAGE_MASK) | 29 | if (off & ~PAGE_MASK) | 
| @@ -56,9 +58,9 @@ static void find_start_end(unsigned long flags, unsigned long *begin, | |||
| 56 | unmapped base down for this case. This can give | 58 | unmapped base down for this case. This can give | 
| 57 | conflicts with the heap, but we assume that glibc | 59 | conflicts with the heap, but we assume that glibc | 
| 58 | malloc knows how to fall back to mmap. Give it 1GB | 60 | malloc knows how to fall back to mmap. Give it 1GB | 
| 59 | of playground for now. -AK */ | 61 | of playground for now. -AK */ | 
| 60 | *begin = 0x40000000; | 62 | *begin = 0x40000000; | 
| 61 | *end = 0x80000000; | 63 | *end = 0x80000000; | 
| 62 | if (current->flags & PF_RANDOMIZE) { | 64 | if (current->flags & PF_RANDOMIZE) { | 
| 63 | new_begin = randomize_range(*begin, *begin + 0x02000000, 0); | 65 | new_begin = randomize_range(*begin, *begin + 0x02000000, 0); | 
| 64 | if (new_begin) | 66 | if (new_begin) | 
| @@ -66,9 +68,9 @@ static void find_start_end(unsigned long flags, unsigned long *begin, | |||
| 66 | } | 68 | } | 
| 67 | } else { | 69 | } else { | 
| 68 | *begin = TASK_UNMAPPED_BASE; | 70 | *begin = TASK_UNMAPPED_BASE; | 
| 69 | *end = TASK_SIZE; | 71 | *end = TASK_SIZE; | 
| 70 | } | 72 | } | 
| 71 | } | 73 | } | 
| 72 | 74 | ||
| 73 | unsigned long | 75 | unsigned long | 
| 74 | arch_get_unmapped_area(struct file *filp, unsigned long addr, | 76 | arch_get_unmapped_area(struct file *filp, unsigned long addr, | 
| @@ -78,11 +80,11 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, | |||
| 78 | struct vm_area_struct *vma; | 80 | struct vm_area_struct *vma; | 
| 79 | unsigned long start_addr; | 81 | unsigned long start_addr; | 
| 80 | unsigned long begin, end; | 82 | unsigned long begin, end; | 
| 81 | 83 | ||
| 82 | if (flags & MAP_FIXED) | 84 | if (flags & MAP_FIXED) | 
| 83 | return addr; | 85 | return addr; | 
| 84 | 86 | ||
| 85 | find_start_end(flags, &begin, &end); | 87 | find_start_end(flags, &begin, &end); | 
| 86 | 88 | ||
| 87 | if (len > end) | 89 | if (len > end) | 
| 88 | return -ENOMEM; | 90 | return -ENOMEM; | 
| @@ -96,12 +98,12 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr, | |||
| 96 | } | 98 | } | 
| 97 | if (((flags & MAP_32BIT) || test_thread_flag(TIF_IA32)) | 99 | if (((flags & MAP_32BIT) || test_thread_flag(TIF_IA32)) | 
| 98 | && len <= mm->cached_hole_size) { | 100 | && len <= mm->cached_hole_size) { | 
| 99 | mm->cached_hole_size = 0; | 101 | mm->cached_hole_size = 0; | 
| 100 | mm->free_area_cache = begin; | 102 | mm->free_area_cache = begin; | 
| 101 | } | 103 | } | 
| 102 | addr = mm->free_area_cache; | 104 | addr = mm->free_area_cache; | 
| 103 | if (addr < begin) | 105 | if (addr < begin) | 
| 104 | addr = begin; | 106 | addr = begin; | 
| 105 | start_addr = addr; | 107 | start_addr = addr; | 
| 106 | 108 | ||
| 107 | full_search: | 109 | full_search: | 
| @@ -127,7 +129,7 @@ full_search: | |||
| 127 | return addr; | 129 | return addr; | 
| 128 | } | 130 | } | 
| 129 | if (addr + mm->cached_hole_size < vma->vm_start) | 131 | if (addr + mm->cached_hole_size < vma->vm_start) | 
| 130 | mm->cached_hole_size = vma->vm_start - addr; | 132 | mm->cached_hole_size = vma->vm_start - addr; | 
| 131 | 133 | ||
| 132 | addr = vma->vm_end; | 134 | addr = vma->vm_end; | 
| 133 | } | 135 | } | 
| @@ -177,7 +179,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, | |||
| 177 | vma = find_vma(mm, addr-len); | 179 | vma = find_vma(mm, addr-len); | 
| 178 | if (!vma || addr <= vma->vm_start) | 180 | if (!vma || addr <= vma->vm_start) | 
| 179 | /* remember the address as a hint for next time */ | 181 | /* remember the address as a hint for next time */ | 
| 180 | return (mm->free_area_cache = addr-len); | 182 | return mm->free_area_cache = addr-len; | 
| 181 | } | 183 | } | 
| 182 | 184 | ||
| 183 | if (mm->mmap_base < len) | 185 | if (mm->mmap_base < len) | 
| @@ -194,7 +196,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0, | |||
| 194 | vma = find_vma(mm, addr); | 196 | vma = find_vma(mm, addr); | 
| 195 | if (!vma || addr+len <= vma->vm_start) | 197 | if (!vma || addr+len <= vma->vm_start) | 
| 196 | /* remember the address as a hint for next time */ | 198 | /* remember the address as a hint for next time */ | 
| 197 | return (mm->free_area_cache = addr); | 199 | return mm->free_area_cache = addr; | 
| 198 | 200 | ||
| 199 | /* remember the largest hole we saw so far */ | 201 | /* remember the largest hole we saw so far */ | 
| 200 | if (addr + mm->cached_hole_size < vma->vm_start) | 202 | if (addr + mm->cached_hole_size < vma->vm_start) | 
| @@ -224,13 +226,13 @@ bottomup: | |||
| 224 | } | 226 | } | 
| 225 | 227 | ||
| 226 | 228 | ||
| 227 | asmlinkage long sys_uname(struct new_utsname __user * name) | 229 | asmlinkage long sys_uname(struct new_utsname __user *name) | 
| 228 | { | 230 | { | 
| 229 | int err; | 231 | int err; | 
| 230 | down_read(&uts_sem); | 232 | down_read(&uts_sem); | 
| 231 | err = copy_to_user(name, utsname(), sizeof (*name)); | 233 | err = copy_to_user(name, utsname(), sizeof(*name)); | 
| 232 | up_read(&uts_sem); | 234 | up_read(&uts_sem); | 
| 233 | if (personality(current->personality) == PER_LINUX32) | 235 | if (personality(current->personality) == PER_LINUX32) | 
| 234 | err |= copy_to_user(&name->machine, "i686", 5); | 236 | err |= copy_to_user(&name->machine, "i686", 5); | 
| 235 | return err ? -EFAULT : 0; | 237 | return err ? -EFAULT : 0; | 
| 236 | } | 238 | } | 
| diff --git a/arch/x86/kernel/syscall_64.c b/arch/x86/kernel/syscall_64.c index 170d43c17487..3d1be4f0fac5 100644 --- a/arch/x86/kernel/syscall_64.c +++ b/arch/x86/kernel/syscall_64.c | |||
| @@ -8,12 +8,12 @@ | |||
| 8 | #define __NO_STUBS | 8 | #define __NO_STUBS | 
| 9 | 9 | ||
| 10 | #define __SYSCALL(nr, sym) extern asmlinkage void sym(void) ; | 10 | #define __SYSCALL(nr, sym) extern asmlinkage void sym(void) ; | 
| 11 | #undef _ASM_X86_64_UNISTD_H_ | 11 | #undef ASM_X86__UNISTD_64_H | 
| 12 | #include <asm/unistd_64.h> | 12 | #include <asm/unistd_64.h> | 
| 13 | 13 | ||
| 14 | #undef __SYSCALL | 14 | #undef __SYSCALL | 
| 15 | #define __SYSCALL(nr, sym) [nr] = sym, | 15 | #define __SYSCALL(nr, sym) [nr] = sym, | 
| 16 | #undef _ASM_X86_64_UNISTD_H_ | 16 | #undef ASM_X86__UNISTD_64_H | 
| 17 | 17 | ||
| 18 | typedef void (*sys_call_ptr_t)(void); | 18 | typedef void (*sys_call_ptr_t)(void); | 
| 19 | 19 | ||
| diff --git a/arch/x86/kernel/time_32.c b/arch/x86/kernel/time_32.c index ffe3c664afc0..bbecf8b6bf96 100644 --- a/arch/x86/kernel/time_32.c +++ b/arch/x86/kernel/time_32.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <asm/arch_hooks.h> | 36 | #include <asm/arch_hooks.h> | 
| 37 | #include <asm/hpet.h> | 37 | #include <asm/hpet.h> | 
| 38 | #include <asm/time.h> | 38 | #include <asm/time.h> | 
| 39 | #include <asm/timer.h> | ||
| 39 | 40 | ||
| 40 | #include "do_timer.h" | 41 | #include "do_timer.h" | 
| 41 | 42 | ||
| diff --git a/arch/x86/kernel/tls.c b/arch/x86/kernel/tls.c index ab6bf375a307..6bb7b8579e70 100644 --- a/arch/x86/kernel/tls.c +++ b/arch/x86/kernel/tls.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <asm/ldt.h> | 10 | #include <asm/ldt.h> | 
| 11 | #include <asm/processor.h> | 11 | #include <asm/processor.h> | 
| 12 | #include <asm/proto.h> | 12 | #include <asm/proto.h> | 
| 13 | #include <asm/syscalls.h> | ||
| 13 | 14 | ||
| 14 | #include "tls.h" | 15 | #include "tls.h" | 
| 15 | 16 | ||
| diff --git a/arch/x86/kernel/traps_64.c b/arch/x86/kernel/traps_64.c index 513caaca7115..7a31f104bef9 100644 --- a/arch/x86/kernel/traps_64.c +++ b/arch/x86/kernel/traps_64.c | |||
| @@ -32,6 +32,8 @@ | |||
| 32 | #include <linux/bug.h> | 32 | #include <linux/bug.h> | 
| 33 | #include <linux/nmi.h> | 33 | #include <linux/nmi.h> | 
| 34 | #include <linux/mm.h> | 34 | #include <linux/mm.h> | 
| 35 | #include <linux/smp.h> | ||
| 36 | #include <linux/io.h> | ||
| 35 | 37 | ||
| 36 | #if defined(CONFIG_EDAC) | 38 | #if defined(CONFIG_EDAC) | 
| 37 | #include <linux/edac.h> | 39 | #include <linux/edac.h> | 
| @@ -45,9 +47,6 @@ | |||
| 45 | #include <asm/unwind.h> | 47 | #include <asm/unwind.h> | 
| 46 | #include <asm/desc.h> | 48 | #include <asm/desc.h> | 
| 47 | #include <asm/i387.h> | 49 | #include <asm/i387.h> | 
| 48 | #include <asm/nmi.h> | ||
| 49 | #include <asm/smp.h> | ||
| 50 | #include <asm/io.h> | ||
| 51 | #include <asm/pgalloc.h> | 50 | #include <asm/pgalloc.h> | 
| 52 | #include <asm/proto.h> | 51 | #include <asm/proto.h> | 
| 53 | #include <asm/pda.h> | 52 | #include <asm/pda.h> | 
| @@ -85,7 +84,8 @@ static inline void preempt_conditional_cli(struct pt_regs *regs) | |||
| 85 | 84 | ||
| 86 | void printk_address(unsigned long address, int reliable) | 85 | void printk_address(unsigned long address, int reliable) | 
| 87 | { | 86 | { | 
| 88 | printk(" [<%016lx>] %s%pS\n", address, reliable ? "": "? ", (void *) address); | 87 | printk(" [<%016lx>] %s%pS\n", | 
| 88 | address, reliable ? "" : "? ", (void *) address); | ||
| 89 | } | 89 | } | 
| 90 | 90 | ||
| 91 | static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack, | 91 | static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack, | 
| @@ -98,7 +98,8 @@ static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack, | |||
| 98 | [STACKFAULT_STACK - 1] = "#SS", | 98 | [STACKFAULT_STACK - 1] = "#SS", | 
| 99 | [MCE_STACK - 1] = "#MC", | 99 | [MCE_STACK - 1] = "#MC", | 
| 100 | #if DEBUG_STKSZ > EXCEPTION_STKSZ | 100 | #if DEBUG_STKSZ > EXCEPTION_STKSZ | 
| 101 | [N_EXCEPTION_STACKS ... N_EXCEPTION_STACKS + DEBUG_STKSZ / EXCEPTION_STKSZ - 2] = "#DB[?]" | 101 | [N_EXCEPTION_STACKS ... | 
| 102 | N_EXCEPTION_STACKS + DEBUG_STKSZ / EXCEPTION_STKSZ - 2] = "#DB[?]" | ||
| 102 | #endif | 103 | #endif | 
| 103 | }; | 104 | }; | 
| 104 | unsigned k; | 105 | unsigned k; | 
| @@ -163,7 +164,7 @@ static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack, | |||
| 163 | } | 164 | } | 
| 164 | 165 | ||
| 165 | /* | 166 | /* | 
| 166 | * x86-64 can have up to three kernel stacks: | 167 | * x86-64 can have up to three kernel stacks: | 
| 167 | * process stack | 168 | * process stack | 
| 168 | * interrupt stack | 169 | * interrupt stack | 
| 169 | * severe exception (double fault, nmi, stack fault, debug, mce) hardware stack | 170 | * severe exception (double fault, nmi, stack fault, debug, mce) hardware stack | 
| @@ -219,7 +220,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, | |||
| 219 | const struct stacktrace_ops *ops, void *data) | 220 | const struct stacktrace_ops *ops, void *data) | 
| 220 | { | 221 | { | 
| 221 | const unsigned cpu = get_cpu(); | 222 | const unsigned cpu = get_cpu(); | 
| 222 | unsigned long *irqstack_end = (unsigned long*)cpu_pda(cpu)->irqstackptr; | 223 | unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr; | 
| 223 | unsigned used = 0; | 224 | unsigned used = 0; | 
| 224 | struct thread_info *tinfo; | 225 | struct thread_info *tinfo; | 
| 225 | 226 | ||
| @@ -237,7 +238,7 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, | |||
| 237 | if (!bp) { | 238 | if (!bp) { | 
| 238 | if (task == current) { | 239 | if (task == current) { | 
| 239 | /* Grab bp right from our regs */ | 240 | /* Grab bp right from our regs */ | 
| 240 | asm("movq %%rbp, %0" : "=r" (bp) :); | 241 | asm("movq %%rbp, %0" : "=r" (bp) : ); | 
| 241 | } else { | 242 | } else { | 
| 242 | /* bp is the last reg pushed by switch_to */ | 243 | /* bp is the last reg pushed by switch_to */ | 
| 243 | bp = *(unsigned long *) task->thread.sp; | 244 | bp = *(unsigned long *) task->thread.sp; | 
| @@ -339,9 +340,8 @@ static void | |||
| 339 | show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, | 340 | show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, | 
| 340 | unsigned long *stack, unsigned long bp, char *log_lvl) | 341 | unsigned long *stack, unsigned long bp, char *log_lvl) | 
| 341 | { | 342 | { | 
| 342 | printk("\nCall Trace:\n"); | 343 | printk("Call Trace:\n"); | 
| 343 | dump_trace(task, regs, stack, bp, &print_trace_ops, log_lvl); | 344 | dump_trace(task, regs, stack, bp, &print_trace_ops, log_lvl); | 
| 344 | printk("\n"); | ||
| 345 | } | 345 | } | 
| 346 | 346 | ||
| 347 | void show_trace(struct task_struct *task, struct pt_regs *regs, | 347 | void show_trace(struct task_struct *task, struct pt_regs *regs, | 
| @@ -357,11 +357,15 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | |||
| 357 | unsigned long *stack; | 357 | unsigned long *stack; | 
| 358 | int i; | 358 | int i; | 
| 359 | const int cpu = smp_processor_id(); | 359 | const int cpu = smp_processor_id(); | 
| 360 | unsigned long *irqstack_end = (unsigned long *) (cpu_pda(cpu)->irqstackptr); | 360 | unsigned long *irqstack_end = | 
| 361 | unsigned long *irqstack = (unsigned long *) (cpu_pda(cpu)->irqstackptr - IRQSTACKSIZE); | 361 | (unsigned long *) (cpu_pda(cpu)->irqstackptr); | 
| 362 | unsigned long *irqstack = | ||
| 363 | (unsigned long *) (cpu_pda(cpu)->irqstackptr - IRQSTACKSIZE); | ||
| 362 | 364 | ||
| 363 | // debugging aid: "show_stack(NULL, NULL);" prints the | 365 | /* | 
| 364 | // back trace for this cpu. | 366 | * debugging aid: "show_stack(NULL, NULL);" prints the | 
| 367 | * back trace for this cpu. | ||
| 368 | */ | ||
| 365 | 369 | ||
| 366 | if (sp == NULL) { | 370 | if (sp == NULL) { | 
| 367 | if (task) | 371 | if (task) | 
| @@ -386,6 +390,7 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | |||
| 386 | printk(" %016lx", *stack++); | 390 | printk(" %016lx", *stack++); | 
| 387 | touch_nmi_watchdog(); | 391 | touch_nmi_watchdog(); | 
| 388 | } | 392 | } | 
| 393 | printk("\n"); | ||
| 389 | show_trace_log_lvl(task, regs, sp, bp, log_lvl); | 394 | show_trace_log_lvl(task, regs, sp, bp, log_lvl); | 
| 390 | } | 395 | } | 
| 391 | 396 | ||
| @@ -404,7 +409,7 @@ void dump_stack(void) | |||
| 404 | 409 | ||
| 405 | #ifdef CONFIG_FRAME_POINTER | 410 | #ifdef CONFIG_FRAME_POINTER | 
| 406 | if (!bp) | 411 | if (!bp) | 
| 407 | asm("movq %%rbp, %0" : "=r" (bp):); | 412 | asm("movq %%rbp, %0" : "=r" (bp) : ); | 
| 408 | #endif | 413 | #endif | 
| 409 | 414 | ||
| 410 | printk("Pid: %d, comm: %.20s %s %s %.*s\n", | 415 | printk("Pid: %d, comm: %.20s %s %s %.*s\n", | 
| @@ -414,7 +419,6 @@ void dump_stack(void) | |||
| 414 | init_utsname()->version); | 419 | init_utsname()->version); | 
| 415 | show_trace(NULL, NULL, &stack, bp); | 420 | show_trace(NULL, NULL, &stack, bp); | 
| 416 | } | 421 | } | 
| 417 | |||
| 418 | EXPORT_SYMBOL(dump_stack); | 422 | EXPORT_SYMBOL(dump_stack); | 
| 419 | 423 | ||
| 420 | void show_registers(struct pt_regs *regs) | 424 | void show_registers(struct pt_regs *regs) | 
| @@ -443,7 +447,6 @@ void show_registers(struct pt_regs *regs) | |||
| 443 | printk("Stack: "); | 447 | printk("Stack: "); | 
| 444 | show_stack_log_lvl(NULL, regs, (unsigned long *)sp, | 448 | show_stack_log_lvl(NULL, regs, (unsigned long *)sp, | 
| 445 | regs->bp, ""); | 449 | regs->bp, ""); | 
| 446 | printk("\n"); | ||
| 447 | 450 | ||
| 448 | printk(KERN_EMERG "Code: "); | 451 | printk(KERN_EMERG "Code: "); | 
| 449 | 452 | ||
| @@ -493,7 +496,7 @@ unsigned __kprobes long oops_begin(void) | |||
| 493 | raw_local_irq_save(flags); | 496 | raw_local_irq_save(flags); | 
| 494 | cpu = smp_processor_id(); | 497 | cpu = smp_processor_id(); | 
| 495 | if (!__raw_spin_trylock(&die_lock)) { | 498 | if (!__raw_spin_trylock(&die_lock)) { | 
| 496 | if (cpu == die_owner) | 499 | if (cpu == die_owner) | 
| 497 | /* nested oops. should stop eventually */; | 500 | /* nested oops. should stop eventually */; | 
| 498 | else | 501 | else | 
| 499 | __raw_spin_lock(&die_lock); | 502 | __raw_spin_lock(&die_lock); | 
| @@ -638,7 +641,7 @@ kernel_trap: | |||
| 638 | } | 641 | } | 
| 639 | 642 | ||
| 640 | #define DO_ERROR(trapnr, signr, str, name) \ | 643 | #define DO_ERROR(trapnr, signr, str, name) \ | 
| 641 | asmlinkage void do_##name(struct pt_regs * regs, long error_code) \ | 644 | asmlinkage void do_##name(struct pt_regs *regs, long error_code) \ | 
| 642 | { \ | 645 | { \ | 
| 643 | if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ | 646 | if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \ | 
| 644 | == NOTIFY_STOP) \ | 647 | == NOTIFY_STOP) \ | 
| @@ -648,7 +651,7 @@ asmlinkage void do_##name(struct pt_regs * regs, long error_code) \ | |||
| 648 | } | 651 | } | 
| 649 | 652 | ||
| 650 | #define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \ | 653 | #define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \ | 
| 651 | asmlinkage void do_##name(struct pt_regs * regs, long error_code) \ | 654 | asmlinkage void do_##name(struct pt_regs *regs, long error_code) \ | 
| 652 | { \ | 655 | { \ | 
| 653 | siginfo_t info; \ | 656 | siginfo_t info; \ | 
| 654 | info.si_signo = signr; \ | 657 | info.si_signo = signr; \ | 
| @@ -683,7 +686,7 @@ asmlinkage void do_stack_segment(struct pt_regs *regs, long error_code) | |||
| 683 | preempt_conditional_cli(regs); | 686 | preempt_conditional_cli(regs); | 
| 684 | } | 687 | } | 
| 685 | 688 | ||
| 686 | asmlinkage void do_double_fault(struct pt_regs * regs, long error_code) | 689 | asmlinkage void do_double_fault(struct pt_regs *regs, long error_code) | 
| 687 | { | 690 | { | 
| 688 | static const char str[] = "double fault"; | 691 | static const char str[] = "double fault"; | 
| 689 | struct task_struct *tsk = current; | 692 | struct task_struct *tsk = current; | 
| @@ -778,9 +781,10 @@ io_check_error(unsigned char reason, struct pt_regs *regs) | |||
| 778 | } | 781 | } | 
| 779 | 782 | ||
| 780 | static notrace __kprobes void | 783 | static notrace __kprobes void | 
| 781 | unknown_nmi_error(unsigned char reason, struct pt_regs * regs) | 784 | unknown_nmi_error(unsigned char reason, struct pt_regs *regs) | 
| 782 | { | 785 | { | 
| 783 | if (notify_die(DIE_NMIUNKNOWN, "nmi", regs, reason, 2, SIGINT) == NOTIFY_STOP) | 786 | if (notify_die(DIE_NMIUNKNOWN, "nmi", regs, reason, 2, SIGINT) == | 
| 787 | NOTIFY_STOP) | ||
| 784 | return; | 788 | return; | 
| 785 | printk(KERN_EMERG "Uhhuh. NMI received for unknown reason %02x.\n", | 789 | printk(KERN_EMERG "Uhhuh. NMI received for unknown reason %02x.\n", | 
| 786 | reason); | 790 | reason); | 
| @@ -882,7 +886,7 @@ asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs) | |||
| 882 | else if (user_mode(eregs)) | 886 | else if (user_mode(eregs)) | 
| 883 | regs = task_pt_regs(current); | 887 | regs = task_pt_regs(current); | 
| 884 | /* Exception from kernel and interrupts are enabled. Move to | 888 | /* Exception from kernel and interrupts are enabled. Move to | 
| 885 | kernel process stack. */ | 889 | kernel process stack. */ | 
| 886 | else if (eregs->flags & X86_EFLAGS_IF) | 890 | else if (eregs->flags & X86_EFLAGS_IF) | 
| 887 | regs = (struct pt_regs *)(eregs->sp -= sizeof(struct pt_regs)); | 891 | regs = (struct pt_regs *)(eregs->sp -= sizeof(struct pt_regs)); | 
| 888 | if (eregs != regs) | 892 | if (eregs != regs) | 
| @@ -891,7 +895,7 @@ asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs) | |||
| 891 | } | 895 | } | 
| 892 | 896 | ||
| 893 | /* runs on IST stack. */ | 897 | /* runs on IST stack. */ | 
| 894 | asmlinkage void __kprobes do_debug(struct pt_regs * regs, | 898 | asmlinkage void __kprobes do_debug(struct pt_regs *regs, | 
| 895 | unsigned long error_code) | 899 | unsigned long error_code) | 
| 896 | { | 900 | { | 
| 897 | struct task_struct *tsk = current; | 901 | struct task_struct *tsk = current; | 
| @@ -1035,7 +1039,7 @@ asmlinkage void do_coprocessor_error(struct pt_regs *regs) | |||
| 1035 | 1039 | ||
| 1036 | asmlinkage void bad_intr(void) | 1040 | asmlinkage void bad_intr(void) | 
| 1037 | { | 1041 | { | 
| 1038 | printk("bad interrupt"); | 1042 | printk("bad interrupt"); | 
| 1039 | } | 1043 | } | 
| 1040 | 1044 | ||
| 1041 | asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs) | 1045 | asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs) | 
| @@ -1047,7 +1051,7 @@ asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs) | |||
| 1047 | 1051 | ||
| 1048 | conditional_sti(regs); | 1052 | conditional_sti(regs); | 
| 1049 | if (!user_mode(regs) && | 1053 | if (!user_mode(regs) && | 
| 1050 | kernel_math_error(regs, "kernel simd math error", 19)) | 1054 | kernel_math_error(regs, "kernel simd math error", 19)) | 
| 1051 | return; | 1055 | return; | 
| 1052 | 1056 | ||
| 1053 | /* | 1057 | /* | 
| @@ -1092,7 +1096,7 @@ asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs) | |||
| 1092 | force_sig_info(SIGFPE, &info, task); | 1096 | force_sig_info(SIGFPE, &info, task); | 
| 1093 | } | 1097 | } | 
| 1094 | 1098 | ||
| 1095 | asmlinkage void do_spurious_interrupt_bug(struct pt_regs * regs) | 1099 | asmlinkage void do_spurious_interrupt_bug(struct pt_regs *regs) | 
| 1096 | { | 1100 | { | 
| 1097 | } | 1101 | } | 
| 1098 | 1102 | ||
| @@ -1149,8 +1153,10 @@ void __init trap_init(void) | |||
| 1149 | set_intr_gate(0, ÷_error); | 1153 | set_intr_gate(0, ÷_error); | 
| 1150 | set_intr_gate_ist(1, &debug, DEBUG_STACK); | 1154 | set_intr_gate_ist(1, &debug, DEBUG_STACK); | 
| 1151 | set_intr_gate_ist(2, &nmi, NMI_STACK); | 1155 | set_intr_gate_ist(2, &nmi, NMI_STACK); | 
| 1152 | set_system_gate_ist(3, &int3, DEBUG_STACK); /* int3 can be called from all */ | 1156 | /* int3 can be called from all */ | 
| 1153 | set_system_gate(4, &overflow); /* int4 can be called from all */ | 1157 | set_system_gate_ist(3, &int3, DEBUG_STACK); | 
| 1158 | /* int4 can be called from all */ | ||
| 1159 | set_system_gate(4, &overflow); | ||
| 1154 | set_intr_gate(5, &bounds); | 1160 | set_intr_gate(5, &bounds); | 
| 1155 | set_intr_gate(6, &invalid_op); | 1161 | set_intr_gate(6, &invalid_op); | 
| 1156 | set_intr_gate(7, &device_not_available); | 1162 | set_intr_gate(7, &device_not_available); | 
| diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 8f98e9de1b82..161bb850fc47 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
| @@ -104,7 +104,7 @@ __setup("notsc", notsc_setup); | |||
| 104 | /* | 104 | /* | 
| 105 | * Read TSC and the reference counters. Take care of SMI disturbance | 105 | * Read TSC and the reference counters. Take care of SMI disturbance | 
| 106 | */ | 106 | */ | 
| 107 | static u64 tsc_read_refs(u64 *pm, u64 *hpet) | 107 | static u64 tsc_read_refs(u64 *p, int hpet) | 
| 108 | { | 108 | { | 
| 109 | u64 t1, t2; | 109 | u64 t1, t2; | 
| 110 | int i; | 110 | int i; | 
| @@ -112,9 +112,9 @@ static u64 tsc_read_refs(u64 *pm, u64 *hpet) | |||
| 112 | for (i = 0; i < MAX_RETRIES; i++) { | 112 | for (i = 0; i < MAX_RETRIES; i++) { | 
| 113 | t1 = get_cycles(); | 113 | t1 = get_cycles(); | 
| 114 | if (hpet) | 114 | if (hpet) | 
| 115 | *hpet = hpet_readl(HPET_COUNTER) & 0xFFFFFFFF; | 115 | *p = hpet_readl(HPET_COUNTER) & 0xFFFFFFFF; | 
| 116 | else | 116 | else | 
| 117 | *pm = acpi_pm_read_early(); | 117 | *p = acpi_pm_read_early(); | 
| 118 | t2 = get_cycles(); | 118 | t2 = get_cycles(); | 
| 119 | if ((t2 - t1) < SMI_TRESHOLD) | 119 | if ((t2 - t1) < SMI_TRESHOLD) | 
| 120 | return t2; | 120 | return t2; | 
| @@ -123,13 +123,59 @@ static u64 tsc_read_refs(u64 *pm, u64 *hpet) | |||
| 123 | } | 123 | } | 
| 124 | 124 | ||
| 125 | /* | 125 | /* | 
| 126 | * Calculate the TSC frequency from HPET reference | ||
| 127 | */ | ||
| 128 | static unsigned long calc_hpet_ref(u64 deltatsc, u64 hpet1, u64 hpet2) | ||
| 129 | { | ||
| 130 | u64 tmp; | ||
| 131 | |||
| 132 | if (hpet2 < hpet1) | ||
| 133 | hpet2 += 0x100000000ULL; | ||
| 134 | hpet2 -= hpet1; | ||
| 135 | tmp = ((u64)hpet2 * hpet_readl(HPET_PERIOD)); | ||
| 136 | do_div(tmp, 1000000); | ||
| 137 | do_div(deltatsc, tmp); | ||
| 138 | |||
| 139 | return (unsigned long) deltatsc; | ||
| 140 | } | ||
| 141 | |||
| 142 | /* | ||
| 143 | * Calculate the TSC frequency from PMTimer reference | ||
| 144 | */ | ||
| 145 | static unsigned long calc_pmtimer_ref(u64 deltatsc, u64 pm1, u64 pm2) | ||
| 146 | { | ||
| 147 | u64 tmp; | ||
| 148 | |||
| 149 | if (!pm1 && !pm2) | ||
| 150 | return ULONG_MAX; | ||
| 151 | |||
| 152 | if (pm2 < pm1) | ||
| 153 | pm2 += (u64)ACPI_PM_OVRRUN; | ||
| 154 | pm2 -= pm1; | ||
| 155 | tmp = pm2 * 1000000000LL; | ||
| 156 | do_div(tmp, PMTMR_TICKS_PER_SEC); | ||
| 157 | do_div(deltatsc, tmp); | ||
| 158 | |||
| 159 | return (unsigned long) deltatsc; | ||
| 160 | } | ||
| 161 | |||
| 162 | #define CAL_MS 10 | ||
| 163 | #define CAL_LATCH (CLOCK_TICK_RATE / (1000 / CAL_MS)) | ||
| 164 | #define CAL_PIT_LOOPS 1000 | ||
| 165 | |||
| 166 | #define CAL2_MS 50 | ||
| 167 | #define CAL2_LATCH (CLOCK_TICK_RATE / (1000 / CAL2_MS)) | ||
| 168 | #define CAL2_PIT_LOOPS 5000 | ||
| 169 | |||
| 170 | |||
| 171 | /* | ||
| 126 | * Try to calibrate the TSC against the Programmable | 172 | * Try to calibrate the TSC against the Programmable | 
| 127 | * Interrupt Timer and return the frequency of the TSC | 173 | * Interrupt Timer and return the frequency of the TSC | 
| 128 | * in kHz. | 174 | * in kHz. | 
| 129 | * | 175 | * | 
| 130 | * Return ULONG_MAX on failure to calibrate. | 176 | * Return ULONG_MAX on failure to calibrate. | 
| 131 | */ | 177 | */ | 
| 132 | static unsigned long pit_calibrate_tsc(void) | 178 | static unsigned long pit_calibrate_tsc(u32 latch, unsigned long ms, int loopmin) | 
| 133 | { | 179 | { | 
| 134 | u64 tsc, t1, t2, delta; | 180 | u64 tsc, t1, t2, delta; | 
| 135 | unsigned long tscmin, tscmax; | 181 | unsigned long tscmin, tscmax; | 
| @@ -144,8 +190,8 @@ static unsigned long pit_calibrate_tsc(void) | |||
| 144 | * (LSB then MSB) to begin countdown. | 190 | * (LSB then MSB) to begin countdown. | 
| 145 | */ | 191 | */ | 
| 146 | outb(0xb0, 0x43); | 192 | outb(0xb0, 0x43); | 
| 147 | outb((CLOCK_TICK_RATE / (1000 / 50)) & 0xff, 0x42); | 193 | outb(latch & 0xff, 0x42); | 
| 148 | outb((CLOCK_TICK_RATE / (1000 / 50)) >> 8, 0x42); | 194 | outb(latch >> 8, 0x42); | 
| 149 | 195 | ||
| 150 | tsc = t1 = t2 = get_cycles(); | 196 | tsc = t1 = t2 = get_cycles(); | 
| 151 | 197 | ||
| @@ -166,31 +212,154 @@ static unsigned long pit_calibrate_tsc(void) | |||
| 166 | /* | 212 | /* | 
| 167 | * Sanity checks: | 213 | * Sanity checks: | 
| 168 | * | 214 | * | 
| 169 | * If we were not able to read the PIT more than 5000 | 215 | * If we were not able to read the PIT more than loopmin | 
| 170 | * times, then we have been hit by a massive SMI | 216 | * times, then we have been hit by a massive SMI | 
| 171 | * | 217 | * | 
| 172 | * If the maximum is 10 times larger than the minimum, | 218 | * If the maximum is 10 times larger than the minimum, | 
| 173 | * then we got hit by an SMI as well. | 219 | * then we got hit by an SMI as well. | 
| 174 | */ | 220 | */ | 
| 175 | if (pitcnt < 5000 || tscmax > 10 * tscmin) | 221 | if (pitcnt < loopmin || tscmax > 10 * tscmin) | 
| 176 | return ULONG_MAX; | 222 | return ULONG_MAX; | 
| 177 | 223 | ||
| 178 | /* Calculate the PIT value */ | 224 | /* Calculate the PIT value */ | 
| 179 | delta = t2 - t1; | 225 | delta = t2 - t1; | 
| 180 | do_div(delta, 50); | 226 | do_div(delta, ms); | 
| 181 | return delta; | 227 | return delta; | 
| 182 | } | 228 | } | 
| 183 | 229 | ||
| 230 | /* | ||
| 231 | * This reads the current MSB of the PIT counter, and | ||
| 232 | * checks if we are running on sufficiently fast and | ||
| 233 | * non-virtualized hardware. | ||
| 234 | * | ||
| 235 | * Our expectations are: | ||
| 236 | * | ||
| 237 | * - the PIT is running at roughly 1.19MHz | ||
| 238 | * | ||
| 239 | * - each IO is going to take about 1us on real hardware, | ||
| 240 | * but we allow it to be much faster (by a factor of 10) or | ||
| 241 | * _slightly_ slower (ie we allow up to a 2us read+counter | ||
| 242 | * update - anything else implies a unacceptably slow CPU | ||
| 243 | * or PIT for the fast calibration to work. | ||
| 244 | * | ||
| 245 | * - with 256 PIT ticks to read the value, we have 214us to | ||
| 246 | * see the same MSB (and overhead like doing a single TSC | ||
| 247 | * read per MSB value etc). | ||
| 248 | * | ||
| 249 | * - We're doing 2 reads per loop (LSB, MSB), and we expect | ||
| 250 | * them each to take about a microsecond on real hardware. | ||
| 251 | * So we expect a count value of around 100. But we'll be | ||
| 252 | * generous, and accept anything over 50. | ||
| 253 | * | ||
| 254 | * - if the PIT is stuck, and we see *many* more reads, we | ||
| 255 | * return early (and the next caller of pit_expect_msb() | ||
| 256 | * then consider it a failure when they don't see the | ||
| 257 | * next expected value). | ||
| 258 | * | ||
| 259 | * These expectations mean that we know that we have seen the | ||
| 260 | * transition from one expected value to another with a fairly | ||
| 261 | * high accuracy, and we didn't miss any events. We can thus | ||
| 262 | * use the TSC value at the transitions to calculate a pretty | ||
| 263 | * good value for the TSC frequencty. | ||
| 264 | */ | ||
| 265 | static inline int pit_expect_msb(unsigned char val) | ||
| 266 | { | ||
| 267 | int count = 0; | ||
| 268 | |||
| 269 | for (count = 0; count < 50000; count++) { | ||
| 270 | /* Ignore LSB */ | ||
| 271 | inb(0x42); | ||
| 272 | if (inb(0x42) != val) | ||
| 273 | break; | ||
| 274 | } | ||
| 275 | return count > 50; | ||
| 276 | } | ||
| 277 | |||
| 278 | /* | ||
| 279 | * How many MSB values do we want to see? We aim for a | ||
| 280 | * 15ms calibration, which assuming a 2us counter read | ||
| 281 | * error should give us roughly 150 ppm precision for | ||
| 282 | * the calibration. | ||
| 283 | */ | ||
| 284 | #define QUICK_PIT_MS 15 | ||
| 285 | #define QUICK_PIT_ITERATIONS (QUICK_PIT_MS * PIT_TICK_RATE / 1000 / 256) | ||
| 286 | |||
| 287 | static unsigned long quick_pit_calibrate(void) | ||
| 288 | { | ||
| 289 | /* Set the Gate high, disable speaker */ | ||
| 290 | outb((inb(0x61) & ~0x02) | 0x01, 0x61); | ||
| 291 | |||
| 292 | /* | ||
| 293 | * Counter 2, mode 0 (one-shot), binary count | ||
| 294 | * | ||
| 295 | * NOTE! Mode 2 decrements by two (and then the | ||
| 296 | * output is flipped each time, giving the same | ||
| 297 | * final output frequency as a decrement-by-one), | ||
| 298 | * so mode 0 is much better when looking at the | ||
| 299 | * individual counts. | ||
| 300 | */ | ||
| 301 | outb(0xb0, 0x43); | ||
| 302 | |||
| 303 | /* Start at 0xffff */ | ||
| 304 | outb(0xff, 0x42); | ||
| 305 | outb(0xff, 0x42); | ||
| 306 | |||
| 307 | if (pit_expect_msb(0xff)) { | ||
| 308 | int i; | ||
| 309 | u64 t1, t2, delta; | ||
| 310 | unsigned char expect = 0xfe; | ||
| 311 | |||
| 312 | t1 = get_cycles(); | ||
| 313 | for (i = 0; i < QUICK_PIT_ITERATIONS; i++, expect--) { | ||
| 314 | if (!pit_expect_msb(expect)) | ||
| 315 | goto failed; | ||
| 316 | } | ||
| 317 | t2 = get_cycles(); | ||
| 318 | |||
| 319 | /* | ||
| 320 | * Make sure we can rely on the second TSC timestamp: | ||
| 321 | */ | ||
| 322 | if (!pit_expect_msb(expect)) | ||
| 323 | goto failed; | ||
| 324 | |||
| 325 | /* | ||
| 326 | * Ok, if we get here, then we've seen the | ||
| 327 | * MSB of the PIT decrement QUICK_PIT_ITERATIONS | ||
| 328 | * times, and each MSB had many hits, so we never | ||
| 329 | * had any sudden jumps. | ||
| 330 | * | ||
| 331 | * As a result, we can depend on there not being | ||
| 332 | * any odd delays anywhere, and the TSC reads are | ||
| 333 | * reliable. | ||
| 334 | * | ||
| 335 | * kHz = ticks / time-in-seconds / 1000; | ||
| 336 | * kHz = (t2 - t1) / (QPI * 256 / PIT_TICK_RATE) / 1000 | ||
| 337 | * kHz = ((t2 - t1) * PIT_TICK_RATE) / (QPI * 256 * 1000) | ||
| 338 | */ | ||
| 339 | delta = (t2 - t1)*PIT_TICK_RATE; | ||
| 340 | do_div(delta, QUICK_PIT_ITERATIONS*256*1000); | ||
| 341 | printk("Fast TSC calibration using PIT\n"); | ||
| 342 | return delta; | ||
| 343 | } | ||
| 344 | failed: | ||
| 345 | return 0; | ||
| 346 | } | ||
| 184 | 347 | ||
| 185 | /** | 348 | /** | 
| 186 | * native_calibrate_tsc - calibrate the tsc on boot | 349 | * native_calibrate_tsc - calibrate the tsc on boot | 
| 187 | */ | 350 | */ | 
| 188 | unsigned long native_calibrate_tsc(void) | 351 | unsigned long native_calibrate_tsc(void) | 
| 189 | { | 352 | { | 
| 190 | u64 tsc1, tsc2, delta, pm1, pm2, hpet1, hpet2; | 353 | u64 tsc1, tsc2, delta, ref1, ref2; | 
| 191 | unsigned long tsc_pit_min = ULONG_MAX, tsc_ref_min = ULONG_MAX; | 354 | unsigned long tsc_pit_min = ULONG_MAX, tsc_ref_min = ULONG_MAX; | 
| 192 | unsigned long flags; | 355 | unsigned long flags, latch, ms, fast_calibrate; | 
| 193 | int hpet = is_hpet_enabled(), i; | 356 | int hpet = is_hpet_enabled(), i, loopmin; | 
| 357 | |||
| 358 | local_irq_save(flags); | ||
| 359 | fast_calibrate = quick_pit_calibrate(); | ||
| 360 | local_irq_restore(flags); | ||
| 361 | if (fast_calibrate) | ||
| 362 | return fast_calibrate; | ||
| 194 | 363 | ||
| 195 | /* | 364 | /* | 
| 196 | * Run 5 calibration loops to get the lowest frequency value | 365 | * Run 5 calibration loops to get the lowest frequency value | 
| @@ -216,7 +385,13 @@ unsigned long native_calibrate_tsc(void) | |||
| 216 | * calibration delay loop as we have to wait for a certain | 385 | * calibration delay loop as we have to wait for a certain | 
| 217 | * amount of time anyway. | 386 | * amount of time anyway. | 
| 218 | */ | 387 | */ | 
| 219 | for (i = 0; i < 5; i++) { | 388 | |
| 389 | /* Preset PIT loop values */ | ||
| 390 | latch = CAL_LATCH; | ||
| 391 | ms = CAL_MS; | ||
| 392 | loopmin = CAL_PIT_LOOPS; | ||
| 393 | |||
| 394 | for (i = 0; i < 3; i++) { | ||
| 220 | unsigned long tsc_pit_khz; | 395 | unsigned long tsc_pit_khz; | 
| 221 | 396 | ||
| 222 | /* | 397 | /* | 
| @@ -226,16 +401,16 @@ unsigned long native_calibrate_tsc(void) | |||
| 226 | * read the end value. | 401 | * read the end value. | 
| 227 | */ | 402 | */ | 
| 228 | local_irq_save(flags); | 403 | local_irq_save(flags); | 
| 229 | tsc1 = tsc_read_refs(&pm1, hpet ? &hpet1 : NULL); | 404 | tsc1 = tsc_read_refs(&ref1, hpet); | 
| 230 | tsc_pit_khz = pit_calibrate_tsc(); | 405 | tsc_pit_khz = pit_calibrate_tsc(latch, ms, loopmin); | 
| 231 | tsc2 = tsc_read_refs(&pm2, hpet ? &hpet2 : NULL); | 406 | tsc2 = tsc_read_refs(&ref2, hpet); | 
| 232 | local_irq_restore(flags); | 407 | local_irq_restore(flags); | 
| 233 | 408 | ||
| 234 | /* Pick the lowest PIT TSC calibration so far */ | 409 | /* Pick the lowest PIT TSC calibration so far */ | 
| 235 | tsc_pit_min = min(tsc_pit_min, tsc_pit_khz); | 410 | tsc_pit_min = min(tsc_pit_min, tsc_pit_khz); | 
| 236 | 411 | ||
| 237 | /* hpet or pmtimer available ? */ | 412 | /* hpet or pmtimer available ? */ | 
| 238 | if (!hpet && !pm1 && !pm2) | 413 | if (!hpet && !ref1 && !ref2) | 
| 239 | continue; | 414 | continue; | 
| 240 | 415 | ||
| 241 | /* Check, whether the sampling was disturbed by an SMI */ | 416 | /* Check, whether the sampling was disturbed by an SMI */ | 
| @@ -243,23 +418,41 @@ unsigned long native_calibrate_tsc(void) | |||
| 243 | continue; | 418 | continue; | 
| 244 | 419 | ||
| 245 | tsc2 = (tsc2 - tsc1) * 1000000LL; | 420 | tsc2 = (tsc2 - tsc1) * 1000000LL; | 
| 421 | if (hpet) | ||
| 422 | tsc2 = calc_hpet_ref(tsc2, ref1, ref2); | ||
| 423 | else | ||
| 424 | tsc2 = calc_pmtimer_ref(tsc2, ref1, ref2); | ||
| 246 | 425 | ||
| 247 | if (hpet) { | 426 | tsc_ref_min = min(tsc_ref_min, (unsigned long) tsc2); | 
| 248 | if (hpet2 < hpet1) | 427 | |
| 249 | hpet2 += 0x100000000ULL; | 428 | /* Check the reference deviation */ | 
| 250 | hpet2 -= hpet1; | 429 | delta = ((u64) tsc_pit_min) * 100; | 
| 251 | tsc1 = ((u64)hpet2 * hpet_readl(HPET_PERIOD)); | 430 | do_div(delta, tsc_ref_min); | 
| 252 | do_div(tsc1, 1000000); | 431 | |
| 253 | } else { | 432 | /* | 
| 254 | if (pm2 < pm1) | 433 | * If both calibration results are inside a 10% window | 
| 255 | pm2 += (u64)ACPI_PM_OVRRUN; | 434 | * then we can be sure, that the calibration | 
| 256 | pm2 -= pm1; | 435 | * succeeded. We break out of the loop right away. We | 
| 257 | tsc1 = pm2 * 1000000000LL; | 436 | * use the reference value, as it is more precise. | 
| 258 | do_div(tsc1, PMTMR_TICKS_PER_SEC); | 437 | */ | 
| 438 | if (delta >= 90 && delta <= 110) { | ||
| 439 | printk(KERN_INFO | ||
| 440 | "TSC: PIT calibration matches %s. %d loops\n", | ||
| 441 | hpet ? "HPET" : "PMTIMER", i + 1); | ||
| 442 | return tsc_ref_min; | ||
| 259 | } | 443 | } | 
| 260 | 444 | ||
| 261 | do_div(tsc2, tsc1); | 445 | /* | 
| 262 | tsc_ref_min = min(tsc_ref_min, (unsigned long) tsc2); | 446 | * Check whether PIT failed more than once. This | 
| 447 | * happens in virtualized environments. We need to | ||
| 448 | * give the virtual PC a slightly longer timeframe for | ||
| 449 | * the HPET/PMTIMER to make the result precise. | ||
| 450 | */ | ||
| 451 | if (i == 1 && tsc_pit_min == ULONG_MAX) { | ||
| 452 | latch = CAL2_LATCH; | ||
| 453 | ms = CAL2_MS; | ||
| 454 | loopmin = CAL2_PIT_LOOPS; | ||
| 455 | } | ||
| 263 | } | 456 | } | 
| 264 | 457 | ||
| 265 | /* | 458 | /* | 
| @@ -270,7 +463,7 @@ unsigned long native_calibrate_tsc(void) | |||
| 270 | printk(KERN_WARNING "TSC: Unable to calibrate against PIT\n"); | 463 | printk(KERN_WARNING "TSC: Unable to calibrate against PIT\n"); | 
| 271 | 464 | ||
| 272 | /* We don't have an alternative source, disable TSC */ | 465 | /* We don't have an alternative source, disable TSC */ | 
| 273 | if (!hpet && !pm1 && !pm2) { | 466 | if (!hpet && !ref1 && !ref2) { | 
| 274 | printk("TSC: No reference (HPET/PMTIMER) available\n"); | 467 | printk("TSC: No reference (HPET/PMTIMER) available\n"); | 
| 275 | return 0; | 468 | return 0; | 
| 276 | } | 469 | } | 
| @@ -278,7 +471,7 @@ unsigned long native_calibrate_tsc(void) | |||
| 278 | /* The alternative source failed as well, disable TSC */ | 471 | /* The alternative source failed as well, disable TSC */ | 
| 279 | if (tsc_ref_min == ULONG_MAX) { | 472 | if (tsc_ref_min == ULONG_MAX) { | 
| 280 | printk(KERN_WARNING "TSC: HPET/PMTIMER calibration " | 473 | printk(KERN_WARNING "TSC: HPET/PMTIMER calibration " | 
| 281 | "failed due to SMI disturbance.\n"); | 474 | "failed.\n"); | 
| 282 | return 0; | 475 | return 0; | 
| 283 | } | 476 | } | 
| 284 | 477 | ||
| @@ -290,44 +483,25 @@ unsigned long native_calibrate_tsc(void) | |||
| 290 | } | 483 | } | 
| 291 | 484 | ||
| 292 | /* We don't have an alternative source, use the PIT calibration value */ | 485 | /* We don't have an alternative source, use the PIT calibration value */ | 
| 293 | if (!hpet && !pm1 && !pm2) { | 486 | if (!hpet && !ref1 && !ref2) { | 
| 294 | printk(KERN_INFO "TSC: Using PIT calibration value\n"); | 487 | printk(KERN_INFO "TSC: Using PIT calibration value\n"); | 
| 295 | return tsc_pit_min; | 488 | return tsc_pit_min; | 
| 296 | } | 489 | } | 
| 297 | 490 | ||
| 298 | /* The alternative source failed, use the PIT calibration value */ | 491 | /* The alternative source failed, use the PIT calibration value */ | 
| 299 | if (tsc_ref_min == ULONG_MAX) { | 492 | if (tsc_ref_min == ULONG_MAX) { | 
| 300 | printk(KERN_WARNING "TSC: HPET/PMTIMER calibration failed due " | 493 | printk(KERN_WARNING "TSC: HPET/PMTIMER calibration failed. " | 
| 301 | "to SMI disturbance. Using PIT calibration\n"); | 494 | "Using PIT calibration\n"); | 
| 302 | return tsc_pit_min; | 495 | return tsc_pit_min; | 
| 303 | } | 496 | } | 
| 304 | 497 | ||
| 305 | /* Check the reference deviation */ | ||
| 306 | delta = ((u64) tsc_pit_min) * 100; | ||
| 307 | do_div(delta, tsc_ref_min); | ||
| 308 | |||
| 309 | /* | ||
| 310 | * If both calibration results are inside a 5% window, the we | ||
| 311 | * use the lower frequency of those as it is probably the | ||
| 312 | * closest estimate. | ||
| 313 | */ | ||
| 314 | if (delta >= 95 && delta <= 105) { | ||
| 315 | printk(KERN_INFO "TSC: PIT calibration confirmed by %s.\n", | ||
| 316 | hpet ? "HPET" : "PMTIMER"); | ||
| 317 | printk(KERN_INFO "TSC: using %s calibration value\n", | ||
| 318 | tsc_pit_min <= tsc_ref_min ? "PIT" : | ||
| 319 | hpet ? "HPET" : "PMTIMER"); | ||
| 320 | return tsc_pit_min <= tsc_ref_min ? tsc_pit_min : tsc_ref_min; | ||
| 321 | } | ||
| 322 | |||
| 323 | printk(KERN_WARNING "TSC: PIT calibration deviates from %s: %lu %lu.\n", | ||
| 324 | hpet ? "HPET" : "PMTIMER", tsc_pit_min, tsc_ref_min); | ||
| 325 | |||
| 326 | /* | 498 | /* | 
| 327 | * The calibration values differ too much. In doubt, we use | 499 | * The calibration values differ too much. In doubt, we use | 
| 328 | * the PIT value as we know that there are PMTIMERs around | 500 | * the PIT value as we know that there are PMTIMERs around | 
| 329 | * running at double speed. | 501 | * running at double speed. At least we let the user know: | 
| 330 | */ | 502 | */ | 
| 503 | printk(KERN_WARNING "TSC: PIT calibration deviates from %s: %lu %lu.\n", | ||
| 504 | hpet ? "HPET" : "PMTIMER", tsc_pit_min, tsc_ref_min); | ||
| 331 | printk(KERN_INFO "TSC: Using PIT calibration value\n"); | 505 | printk(KERN_INFO "TSC: Using PIT calibration value\n"); | 
| 332 | return tsc_pit_min; | 506 | return tsc_pit_min; | 
| 333 | } | 507 | } | 
| diff --git a/arch/x86/kernel/visws_quirks.c b/arch/x86/kernel/visws_quirks.c index 594ef47f0a63..61a97e616f70 100644 --- a/arch/x86/kernel/visws_quirks.c +++ b/arch/x86/kernel/visws_quirks.c | |||
| @@ -25,45 +25,31 @@ | |||
| 25 | #include <asm/visws/cobalt.h> | 25 | #include <asm/visws/cobalt.h> | 
| 26 | #include <asm/visws/piix4.h> | 26 | #include <asm/visws/piix4.h> | 
| 27 | #include <asm/arch_hooks.h> | 27 | #include <asm/arch_hooks.h> | 
| 28 | #include <asm/io_apic.h> | ||
| 28 | #include <asm/fixmap.h> | 29 | #include <asm/fixmap.h> | 
| 29 | #include <asm/reboot.h> | 30 | #include <asm/reboot.h> | 
| 30 | #include <asm/setup.h> | 31 | #include <asm/setup.h> | 
| 31 | #include <asm/e820.h> | 32 | #include <asm/e820.h> | 
| 32 | #include <asm/smp.h> | ||
| 33 | #include <asm/io.h> | 33 | #include <asm/io.h> | 
| 34 | 34 | ||
| 35 | #include <mach_ipi.h> | 35 | #include <mach_ipi.h> | 
| 36 | 36 | ||
| 37 | #include "mach_apic.h" | 37 | #include "mach_apic.h" | 
| 38 | 38 | ||
| 39 | #include <linux/init.h> | ||
| 40 | #include <linux/smp.h> | ||
| 41 | |||
| 42 | #include <linux/kernel_stat.h> | 39 | #include <linux/kernel_stat.h> | 
| 43 | #include <linux/interrupt.h> | ||
| 44 | #include <linux/init.h> | ||
| 45 | 40 | ||
| 46 | #include <asm/io.h> | ||
| 47 | #include <asm/apic.h> | ||
| 48 | #include <asm/i8259.h> | 41 | #include <asm/i8259.h> | 
| 49 | #include <asm/irq_vectors.h> | 42 | #include <asm/irq_vectors.h> | 
| 50 | #include <asm/visws/cobalt.h> | ||
| 51 | #include <asm/visws/lithium.h> | 43 | #include <asm/visws/lithium.h> | 
| 52 | #include <asm/visws/piix4.h> | ||
| 53 | 44 | ||
| 54 | #include <linux/sched.h> | 45 | #include <linux/sched.h> | 
| 55 | #include <linux/kernel.h> | 46 | #include <linux/kernel.h> | 
| 56 | #include <linux/init.h> | ||
| 57 | #include <linux/pci.h> | 47 | #include <linux/pci.h> | 
| 58 | #include <linux/pci_ids.h> | 48 | #include <linux/pci_ids.h> | 
| 59 | 49 | ||
| 60 | extern int no_broadcast; | 50 | extern int no_broadcast; | 
| 61 | 51 | ||
| 62 | #include <asm/io.h> | ||
| 63 | #include <asm/apic.h> | 52 | #include <asm/apic.h> | 
| 64 | #include <asm/arch_hooks.h> | ||
| 65 | #include <asm/visws/cobalt.h> | ||
| 66 | #include <asm/visws/lithium.h> | ||
| 67 | 53 | ||
| 68 | char visws_board_type = -1; | 54 | char visws_board_type = -1; | 
| 69 | char visws_board_rev = -1; | 55 | char visws_board_rev = -1; | 
| diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c index 38f566fa27d2..4eeb5cf9720d 100644 --- a/arch/x86/kernel/vm86_32.c +++ b/arch/x86/kernel/vm86_32.c | |||
| @@ -46,6 +46,7 @@ | |||
| 46 | #include <asm/io.h> | 46 | #include <asm/io.h> | 
| 47 | #include <asm/tlbflush.h> | 47 | #include <asm/tlbflush.h> | 
| 48 | #include <asm/irq.h> | 48 | #include <asm/irq.h> | 
| 49 | #include <asm/syscalls.h> | ||
| 49 | 50 | ||
| 50 | /* | 51 | /* | 
| 51 | * Known problems: | 52 | * Known problems: | 
| diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c index 6ca515d6db54..8c9ad02af5a2 100644 --- a/arch/x86/kernel/vmi_32.c +++ b/arch/x86/kernel/vmi_32.c | |||
| @@ -235,7 +235,7 @@ static void vmi_write_ldt_entry(struct desc_struct *dt, int entry, | |||
| 235 | const void *desc) | 235 | const void *desc) | 
| 236 | { | 236 | { | 
| 237 | u32 *ldt_entry = (u32 *)desc; | 237 | u32 *ldt_entry = (u32 *)desc; | 
| 238 | vmi_ops.write_idt_entry(dt, entry, ldt_entry[0], ldt_entry[1]); | 238 | vmi_ops.write_ldt_entry(dt, entry, ldt_entry[0], ldt_entry[1]); | 
| 239 | } | 239 | } | 
| 240 | 240 | ||
| 241 | static void vmi_load_sp0(struct tss_struct *tss, | 241 | static void vmi_load_sp0(struct tss_struct *tss, | 
| @@ -393,13 +393,13 @@ static void *vmi_kmap_atomic_pte(struct page *page, enum km_type type) | |||
| 393 | } | 393 | } | 
| 394 | #endif | 394 | #endif | 
| 395 | 395 | ||
| 396 | static void vmi_allocate_pte(struct mm_struct *mm, u32 pfn) | 396 | static void vmi_allocate_pte(struct mm_struct *mm, unsigned long pfn) | 
| 397 | { | 397 | { | 
| 398 | vmi_set_page_type(pfn, VMI_PAGE_L1); | 398 | vmi_set_page_type(pfn, VMI_PAGE_L1); | 
| 399 | vmi_ops.allocate_page(pfn, VMI_PAGE_L1, 0, 0, 0); | 399 | vmi_ops.allocate_page(pfn, VMI_PAGE_L1, 0, 0, 0); | 
| 400 | } | 400 | } | 
| 401 | 401 | ||
| 402 | static void vmi_allocate_pmd(struct mm_struct *mm, u32 pfn) | 402 | static void vmi_allocate_pmd(struct mm_struct *mm, unsigned long pfn) | 
| 403 | { | 403 | { | 
| 404 | /* | 404 | /* | 
| 405 | * This call comes in very early, before mem_map is setup. | 405 | * This call comes in very early, before mem_map is setup. | 
| @@ -410,20 +410,20 @@ static void vmi_allocate_pmd(struct mm_struct *mm, u32 pfn) | |||
| 410 | vmi_ops.allocate_page(pfn, VMI_PAGE_L2, 0, 0, 0); | 410 | vmi_ops.allocate_page(pfn, VMI_PAGE_L2, 0, 0, 0); | 
| 411 | } | 411 | } | 
| 412 | 412 | ||
| 413 | static void vmi_allocate_pmd_clone(u32 pfn, u32 clonepfn, u32 start, u32 count) | 413 | static void vmi_allocate_pmd_clone(unsigned long pfn, unsigned long clonepfn, unsigned long start, unsigned long count) | 
| 414 | { | 414 | { | 
| 415 | vmi_set_page_type(pfn, VMI_PAGE_L2 | VMI_PAGE_CLONE); | 415 | vmi_set_page_type(pfn, VMI_PAGE_L2 | VMI_PAGE_CLONE); | 
| 416 | vmi_check_page_type(clonepfn, VMI_PAGE_L2); | 416 | vmi_check_page_type(clonepfn, VMI_PAGE_L2); | 
| 417 | vmi_ops.allocate_page(pfn, VMI_PAGE_L2 | VMI_PAGE_CLONE, clonepfn, start, count); | 417 | vmi_ops.allocate_page(pfn, VMI_PAGE_L2 | VMI_PAGE_CLONE, clonepfn, start, count); | 
| 418 | } | 418 | } | 
| 419 | 419 | ||
| 420 | static void vmi_release_pte(u32 pfn) | 420 | static void vmi_release_pte(unsigned long pfn) | 
| 421 | { | 421 | { | 
| 422 | vmi_ops.release_page(pfn, VMI_PAGE_L1); | 422 | vmi_ops.release_page(pfn, VMI_PAGE_L1); | 
| 423 | vmi_set_page_type(pfn, VMI_PAGE_NORMAL); | 423 | vmi_set_page_type(pfn, VMI_PAGE_NORMAL); | 
| 424 | } | 424 | } | 
| 425 | 425 | ||
| 426 | static void vmi_release_pmd(u32 pfn) | 426 | static void vmi_release_pmd(unsigned long pfn) | 
| 427 | { | 427 | { | 
| 428 | vmi_ops.release_page(pfn, VMI_PAGE_L2); | 428 | vmi_ops.release_page(pfn, VMI_PAGE_L2); | 
| 429 | vmi_set_page_type(pfn, VMI_PAGE_NORMAL); | 429 | vmi_set_page_type(pfn, VMI_PAGE_NORMAL); | 
| diff --git a/arch/x86/lib/msr-on-cpu.c b/arch/x86/lib/msr-on-cpu.c index 01b868ba82f8..321cf720dbb6 100644 --- a/arch/x86/lib/msr-on-cpu.c +++ b/arch/x86/lib/msr-on-cpu.c | |||
| @@ -16,37 +16,46 @@ static void __rdmsr_on_cpu(void *info) | |||
| 16 | rdmsr(rv->msr_no, rv->l, rv->h); | 16 | rdmsr(rv->msr_no, rv->l, rv->h); | 
| 17 | } | 17 | } | 
| 18 | 18 | ||
| 19 | static void __rdmsr_safe_on_cpu(void *info) | 19 | static void __wrmsr_on_cpu(void *info) | 
| 20 | { | 20 | { | 
| 21 | struct msr_info *rv = info; | 21 | struct msr_info *rv = info; | 
| 22 | 22 | ||
| 23 | rv->err = rdmsr_safe(rv->msr_no, &rv->l, &rv->h); | 23 | wrmsr(rv->msr_no, rv->l, rv->h); | 
| 24 | } | 24 | } | 
| 25 | 25 | ||
| 26 | static int _rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h, int safe) | 26 | int rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h) | 
| 27 | { | 27 | { | 
| 28 | int err = 0; | 28 | int err; | 
| 29 | struct msr_info rv; | 29 | struct msr_info rv; | 
| 30 | 30 | ||
| 31 | rv.msr_no = msr_no; | 31 | rv.msr_no = msr_no; | 
| 32 | if (safe) { | 32 | err = smp_call_function_single(cpu, __rdmsr_on_cpu, &rv, 1); | 
| 33 | err = smp_call_function_single(cpu, __rdmsr_safe_on_cpu, | ||
| 34 | &rv, 1); | ||
| 35 | err = err ? err : rv.err; | ||
| 36 | } else { | ||
| 37 | err = smp_call_function_single(cpu, __rdmsr_on_cpu, &rv, 1); | ||
| 38 | } | ||
| 39 | *l = rv.l; | 33 | *l = rv.l; | 
| 40 | *h = rv.h; | 34 | *h = rv.h; | 
| 41 | 35 | ||
| 42 | return err; | 36 | return err; | 
| 43 | } | 37 | } | 
| 44 | 38 | ||
| 45 | static void __wrmsr_on_cpu(void *info) | 39 | int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) | 
| 40 | { | ||
| 41 | int err; | ||
| 42 | struct msr_info rv; | ||
| 43 | |||
| 44 | rv.msr_no = msr_no; | ||
| 45 | rv.l = l; | ||
| 46 | rv.h = h; | ||
| 47 | err = smp_call_function_single(cpu, __wrmsr_on_cpu, &rv, 1); | ||
| 48 | |||
| 49 | return err; | ||
| 50 | } | ||
| 51 | |||
| 52 | /* These "safe" variants are slower and should be used when the target MSR | ||
| 53 | may not actually exist. */ | ||
| 54 | static void __rdmsr_safe_on_cpu(void *info) | ||
| 46 | { | 55 | { | 
| 47 | struct msr_info *rv = info; | 56 | struct msr_info *rv = info; | 
| 48 | 57 | ||
| 49 | wrmsr(rv->msr_no, rv->l, rv->h); | 58 | rv->err = rdmsr_safe(rv->msr_no, &rv->l, &rv->h); | 
| 50 | } | 59 | } | 
| 51 | 60 | ||
| 52 | static void __wrmsr_safe_on_cpu(void *info) | 61 | static void __wrmsr_safe_on_cpu(void *info) | 
| @@ -56,45 +65,30 @@ static void __wrmsr_safe_on_cpu(void *info) | |||
| 56 | rv->err = wrmsr_safe(rv->msr_no, rv->l, rv->h); | 65 | rv->err = wrmsr_safe(rv->msr_no, rv->l, rv->h); | 
| 57 | } | 66 | } | 
| 58 | 67 | ||
| 59 | static int _wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h, int safe) | 68 | int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h) | 
| 60 | { | 69 | { | 
| 61 | int err = 0; | 70 | int err; | 
| 62 | struct msr_info rv; | 71 | struct msr_info rv; | 
| 63 | 72 | ||
| 64 | rv.msr_no = msr_no; | 73 | rv.msr_no = msr_no; | 
| 65 | rv.l = l; | 74 | err = smp_call_function_single(cpu, __rdmsr_safe_on_cpu, &rv, 1); | 
| 66 | rv.h = h; | 75 | *l = rv.l; | 
| 67 | if (safe) { | 76 | *h = rv.h; | 
| 68 | err = smp_call_function_single(cpu, __wrmsr_safe_on_cpu, | ||
| 69 | &rv, 1); | ||
| 70 | err = err ? err : rv.err; | ||
| 71 | } else { | ||
| 72 | err = smp_call_function_single(cpu, __wrmsr_on_cpu, &rv, 1); | ||
| 73 | } | ||
| 74 | |||
| 75 | return err; | ||
| 76 | } | ||
| 77 | 77 | ||
| 78 | int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) | 78 | return err ? err : rv.err; | 
| 79 | { | ||
| 80 | return _wrmsr_on_cpu(cpu, msr_no, l, h, 0); | ||
| 81 | } | 79 | } | 
| 82 | 80 | ||
| 83 | int rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h) | ||
| 84 | { | ||
| 85 | return _rdmsr_on_cpu(cpu, msr_no, l, h, 0); | ||
| 86 | } | ||
| 87 | |||
| 88 | /* These "safe" variants are slower and should be used when the target MSR | ||
| 89 | may not actually exist. */ | ||
| 90 | int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) | 81 | int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) | 
| 91 | { | 82 | { | 
| 92 | return _wrmsr_on_cpu(cpu, msr_no, l, h, 1); | 83 | int err; | 
| 93 | } | 84 | struct msr_info rv; | 
| 94 | 85 | ||
| 95 | int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h) | 86 | rv.msr_no = msr_no; | 
| 96 | { | 87 | rv.l = l; | 
| 97 | return _rdmsr_on_cpu(cpu, msr_no, l, h, 1); | 88 | rv.h = h; | 
| 89 | err = smp_call_function_single(cpu, __wrmsr_safe_on_cpu, &rv, 1); | ||
| 90 | |||
| 91 | return err ? err : rv.err; | ||
| 98 | } | 92 | } | 
| 99 | 93 | ||
| 100 | EXPORT_SYMBOL(rdmsr_on_cpu); | 94 | EXPORT_SYMBOL(rdmsr_on_cpu); | 
| diff --git a/arch/x86/lib/string_32.c b/arch/x86/lib/string_32.c index 94972e7c094d..82004d2bf05e 100644 --- a/arch/x86/lib/string_32.c +++ b/arch/x86/lib/string_32.c | |||
| @@ -22,7 +22,7 @@ char *strcpy(char *dest, const char *src) | |||
| 22 | "testb %%al,%%al\n\t" | 22 | "testb %%al,%%al\n\t" | 
| 23 | "jne 1b" | 23 | "jne 1b" | 
| 24 | : "=&S" (d0), "=&D" (d1), "=&a" (d2) | 24 | : "=&S" (d0), "=&D" (d1), "=&a" (d2) | 
| 25 | :"0" (src), "1" (dest) : "memory"); | 25 | : "0" (src), "1" (dest) : "memory"); | 
| 26 | return dest; | 26 | return dest; | 
| 27 | } | 27 | } | 
| 28 | EXPORT_SYMBOL(strcpy); | 28 | EXPORT_SYMBOL(strcpy); | 
| @@ -42,7 +42,7 @@ char *strncpy(char *dest, const char *src, size_t count) | |||
| 42 | "stosb\n" | 42 | "stosb\n" | 
| 43 | "2:" | 43 | "2:" | 
| 44 | : "=&S" (d0), "=&D" (d1), "=&c" (d2), "=&a" (d3) | 44 | : "=&S" (d0), "=&D" (d1), "=&c" (d2), "=&a" (d3) | 
| 45 | :"0" (src), "1" (dest), "2" (count) : "memory"); | 45 | : "0" (src), "1" (dest), "2" (count) : "memory"); | 
| 46 | return dest; | 46 | return dest; | 
| 47 | } | 47 | } | 
| 48 | EXPORT_SYMBOL(strncpy); | 48 | EXPORT_SYMBOL(strncpy); | 
| @@ -60,7 +60,7 @@ char *strcat(char *dest, const char *src) | |||
| 60 | "testb %%al,%%al\n\t" | 60 | "testb %%al,%%al\n\t" | 
| 61 | "jne 1b" | 61 | "jne 1b" | 
| 62 | : "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3) | 62 | : "=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3) | 
| 63 | : "0" (src), "1" (dest), "2" (0), "3" (0xffffffffu): "memory"); | 63 | : "0" (src), "1" (dest), "2" (0), "3" (0xffffffffu) : "memory"); | 
| 64 | return dest; | 64 | return dest; | 
| 65 | } | 65 | } | 
| 66 | EXPORT_SYMBOL(strcat); | 66 | EXPORT_SYMBOL(strcat); | 
| @@ -105,9 +105,9 @@ int strcmp(const char *cs, const char *ct) | |||
| 105 | "2:\tsbbl %%eax,%%eax\n\t" | 105 | "2:\tsbbl %%eax,%%eax\n\t" | 
| 106 | "orb $1,%%al\n" | 106 | "orb $1,%%al\n" | 
| 107 | "3:" | 107 | "3:" | 
| 108 | :"=a" (res), "=&S" (d0), "=&D" (d1) | 108 | : "=a" (res), "=&S" (d0), "=&D" (d1) | 
| 109 | :"1" (cs), "2" (ct) | 109 | : "1" (cs), "2" (ct) | 
| 110 | :"memory"); | 110 | : "memory"); | 
| 111 | return res; | 111 | return res; | 
| 112 | } | 112 | } | 
| 113 | EXPORT_SYMBOL(strcmp); | 113 | EXPORT_SYMBOL(strcmp); | 
| @@ -130,9 +130,9 @@ int strncmp(const char *cs, const char *ct, size_t count) | |||
| 130 | "3:\tsbbl %%eax,%%eax\n\t" | 130 | "3:\tsbbl %%eax,%%eax\n\t" | 
| 131 | "orb $1,%%al\n" | 131 | "orb $1,%%al\n" | 
| 132 | "4:" | 132 | "4:" | 
| 133 | :"=a" (res), "=&S" (d0), "=&D" (d1), "=&c" (d2) | 133 | : "=a" (res), "=&S" (d0), "=&D" (d1), "=&c" (d2) | 
| 134 | :"1" (cs), "2" (ct), "3" (count) | 134 | : "1" (cs), "2" (ct), "3" (count) | 
| 135 | :"memory"); | 135 | : "memory"); | 
| 136 | return res; | 136 | return res; | 
| 137 | } | 137 | } | 
| 138 | EXPORT_SYMBOL(strncmp); | 138 | EXPORT_SYMBOL(strncmp); | 
| @@ -152,9 +152,9 @@ char *strchr(const char *s, int c) | |||
| 152 | "movl $1,%1\n" | 152 | "movl $1,%1\n" | 
| 153 | "2:\tmovl %1,%0\n\t" | 153 | "2:\tmovl %1,%0\n\t" | 
| 154 | "decl %0" | 154 | "decl %0" | 
| 155 | :"=a" (res), "=&S" (d0) | 155 | : "=a" (res), "=&S" (d0) | 
| 156 | :"1" (s), "0" (c) | 156 | : "1" (s), "0" (c) | 
| 157 | :"memory"); | 157 | : "memory"); | 
| 158 | return res; | 158 | return res; | 
| 159 | } | 159 | } | 
| 160 | EXPORT_SYMBOL(strchr); | 160 | EXPORT_SYMBOL(strchr); | 
| @@ -169,9 +169,9 @@ size_t strlen(const char *s) | |||
| 169 | "scasb\n\t" | 169 | "scasb\n\t" | 
| 170 | "notl %0\n\t" | 170 | "notl %0\n\t" | 
| 171 | "decl %0" | 171 | "decl %0" | 
| 172 | :"=c" (res), "=&D" (d0) | 172 | : "=c" (res), "=&D" (d0) | 
| 173 | :"1" (s), "a" (0), "0" (0xffffffffu) | 173 | : "1" (s), "a" (0), "0" (0xffffffffu) | 
| 174 | :"memory"); | 174 | : "memory"); | 
| 175 | return res; | 175 | return res; | 
| 176 | } | 176 | } | 
| 177 | EXPORT_SYMBOL(strlen); | 177 | EXPORT_SYMBOL(strlen); | 
| @@ -189,9 +189,9 @@ void *memchr(const void *cs, int c, size_t count) | |||
| 189 | "je 1f\n\t" | 189 | "je 1f\n\t" | 
| 190 | "movl $1,%0\n" | 190 | "movl $1,%0\n" | 
| 191 | "1:\tdecl %0" | 191 | "1:\tdecl %0" | 
| 192 | :"=D" (res), "=&c" (d0) | 192 | : "=D" (res), "=&c" (d0) | 
| 193 | :"a" (c), "0" (cs), "1" (count) | 193 | : "a" (c), "0" (cs), "1" (count) | 
| 194 | :"memory"); | 194 | : "memory"); | 
| 195 | return res; | 195 | return res; | 
| 196 | } | 196 | } | 
| 197 | EXPORT_SYMBOL(memchr); | 197 | EXPORT_SYMBOL(memchr); | 
| @@ -228,9 +228,9 @@ size_t strnlen(const char *s, size_t count) | |||
| 228 | "cmpl $-1,%1\n\t" | 228 | "cmpl $-1,%1\n\t" | 
| 229 | "jne 1b\n" | 229 | "jne 1b\n" | 
| 230 | "3:\tsubl %2,%0" | 230 | "3:\tsubl %2,%0" | 
| 231 | :"=a" (res), "=&d" (d0) | 231 | : "=a" (res), "=&d" (d0) | 
| 232 | :"c" (s), "1" (count) | 232 | : "c" (s), "1" (count) | 
| 233 | :"memory"); | 233 | : "memory"); | 
| 234 | return res; | 234 | return res; | 
| 235 | } | 235 | } | 
| 236 | EXPORT_SYMBOL(strnlen); | 236 | EXPORT_SYMBOL(strnlen); | 
| diff --git a/arch/x86/lib/strstr_32.c b/arch/x86/lib/strstr_32.c index 42e8a50303f3..8e2d55f754bf 100644 --- a/arch/x86/lib/strstr_32.c +++ b/arch/x86/lib/strstr_32.c | |||
| @@ -23,9 +23,9 @@ __asm__ __volatile__( | |||
| 23 | "jne 1b\n\t" | 23 | "jne 1b\n\t" | 
| 24 | "xorl %%eax,%%eax\n\t" | 24 | "xorl %%eax,%%eax\n\t" | 
| 25 | "2:" | 25 | "2:" | 
| 26 | :"=a" (__res), "=&c" (d0), "=&S" (d1) | 26 | : "=a" (__res), "=&c" (d0), "=&S" (d1) | 
| 27 | :"0" (0), "1" (0xffffffff), "2" (cs), "g" (ct) | 27 | : "0" (0), "1" (0xffffffff), "2" (cs), "g" (ct) | 
| 28 | :"dx", "di"); | 28 | : "dx", "di"); | 
| 29 | return __res; | 29 | return __res; | 
| 30 | } | 30 | } | 
| 31 | 31 | ||
| diff --git a/arch/x86/mach-default/setup.c b/arch/x86/mach-default/setup.c index 3d317836be9e..3f2cf11f201a 100644 --- a/arch/x86/mach-default/setup.c +++ b/arch/x86/mach-default/setup.c | |||
| @@ -10,13 +10,15 @@ | |||
| 10 | #include <asm/e820.h> | 10 | #include <asm/e820.h> | 
| 11 | #include <asm/setup.h> | 11 | #include <asm/setup.h> | 
| 12 | 12 | ||
| 13 | #include <mach_ipi.h> | ||
| 14 | |||
| 13 | #ifdef CONFIG_HOTPLUG_CPU | 15 | #ifdef CONFIG_HOTPLUG_CPU | 
| 14 | #define DEFAULT_SEND_IPI (1) | 16 | #define DEFAULT_SEND_IPI (1) | 
| 15 | #else | 17 | #else | 
| 16 | #define DEFAULT_SEND_IPI (0) | 18 | #define DEFAULT_SEND_IPI (0) | 
| 17 | #endif | 19 | #endif | 
| 18 | 20 | ||
| 19 | int no_broadcast=DEFAULT_SEND_IPI; | 21 | int no_broadcast = DEFAULT_SEND_IPI; | 
| 20 | 22 | ||
| 21 | /** | 23 | /** | 
| 22 | * pre_intr_init_hook - initialisation prior to setting up interrupt vectors | 24 | * pre_intr_init_hook - initialisation prior to setting up interrupt vectors | 
| diff --git a/arch/x86/mm/discontig_32.c b/arch/x86/mm/discontig_32.c index 62fa440678d8..847c164725f4 100644 --- a/arch/x86/mm/discontig_32.c +++ b/arch/x86/mm/discontig_32.c | |||
| @@ -328,7 +328,7 @@ void __init initmem_init(unsigned long start_pfn, | |||
| 328 | 328 | ||
| 329 | get_memcfg_numa(); | 329 | get_memcfg_numa(); | 
| 330 | 330 | ||
| 331 | kva_pages = round_up(calculate_numa_remap_pages(), PTRS_PER_PTE); | 331 | kva_pages = roundup(calculate_numa_remap_pages(), PTRS_PER_PTE); | 
| 332 | 332 | ||
| 333 | kva_target_pfn = round_down(max_low_pfn - kva_pages, PTRS_PER_PTE); | 333 | kva_target_pfn = round_down(max_low_pfn - kva_pages, PTRS_PER_PTE); | 
| 334 | do { | 334 | do { | 
| diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c index a20d1fa64b4e..e7277cbcfb40 100644 --- a/arch/x86/mm/dump_pagetables.c +++ b/arch/x86/mm/dump_pagetables.c | |||
| @@ -148,8 +148,8 @@ static void note_page(struct seq_file *m, struct pg_state *st, | |||
| 148 | * we have now. "break" is either changing perms, levels or | 148 | * we have now. "break" is either changing perms, levels or | 
| 149 | * address space marker. | 149 | * address space marker. | 
| 150 | */ | 150 | */ | 
| 151 | prot = pgprot_val(new_prot) & ~(PTE_PFN_MASK); | 151 | prot = pgprot_val(new_prot) & PTE_FLAGS_MASK; | 
| 152 | cur = pgprot_val(st->current_prot) & ~(PTE_PFN_MASK); | 152 | cur = pgprot_val(st->current_prot) & PTE_FLAGS_MASK; | 
| 153 | 153 | ||
| 154 | if (!st->level) { | 154 | if (!st->level) { | 
| 155 | /* First entry */ | 155 | /* First entry */ | 
| diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 455f3fe67b42..8f92cac4e6db 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <asm/tlbflush.h> | 35 | #include <asm/tlbflush.h> | 
| 36 | #include <asm/proto.h> | 36 | #include <asm/proto.h> | 
| 37 | #include <asm-generic/sections.h> | 37 | #include <asm-generic/sections.h> | 
| 38 | #include <asm/traps.h> | ||
| 38 | 39 | ||
| 39 | /* | 40 | /* | 
| 40 | * Page fault error code bits | 41 | * Page fault error code bits | 
| @@ -357,8 +358,6 @@ static int is_errata100(struct pt_regs *regs, unsigned long address) | |||
| 357 | return 0; | 358 | return 0; | 
| 358 | } | 359 | } | 
| 359 | 360 | ||
| 360 | void do_invalid_op(struct pt_regs *, unsigned long); | ||
| 361 | |||
| 362 | static int is_f00f_bug(struct pt_regs *regs, unsigned long address) | 361 | static int is_f00f_bug(struct pt_regs *regs, unsigned long address) | 
| 363 | { | 362 | { | 
| 364 | #ifdef CONFIG_X86_F00F_BUG | 363 | #ifdef CONFIG_X86_F00F_BUG | 
| diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 60ec1d08ff24..6b9a9358b330 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
| @@ -47,6 +47,7 @@ | |||
| 47 | #include <asm/paravirt.h> | 47 | #include <asm/paravirt.h> | 
| 48 | #include <asm/setup.h> | 48 | #include <asm/setup.h> | 
| 49 | #include <asm/cacheflush.h> | 49 | #include <asm/cacheflush.h> | 
| 50 | #include <asm/smp.h> | ||
| 50 | 51 | ||
| 51 | unsigned int __VMALLOC_RESERVE = 128 << 20; | 52 | unsigned int __VMALLOC_RESERVE = 128 << 20; | 
| 52 | 53 | ||
| diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index d3746efb060d..770536ebf7e9 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
| @@ -225,7 +225,7 @@ void __init init_extra_mapping_uc(unsigned long phys, unsigned long size) | |||
| 225 | void __init cleanup_highmap(void) | 225 | void __init cleanup_highmap(void) | 
| 226 | { | 226 | { | 
| 227 | unsigned long vaddr = __START_KERNEL_map; | 227 | unsigned long vaddr = __START_KERNEL_map; | 
| 228 | unsigned long end = round_up((unsigned long)_end, PMD_SIZE) - 1; | 228 | unsigned long end = roundup((unsigned long)_end, PMD_SIZE) - 1; | 
| 229 | pmd_t *pmd = level2_kernel_pgt; | 229 | pmd_t *pmd = level2_kernel_pgt; | 
| 230 | pmd_t *last_pmd = pmd + PTRS_PER_PMD; | 230 | pmd_t *last_pmd = pmd + PTRS_PER_PMD; | 
| 231 | 231 | ||
| @@ -451,14 +451,14 @@ static void __init find_early_table_space(unsigned long end) | |||
| 451 | unsigned long puds, pmds, ptes, tables, start; | 451 | unsigned long puds, pmds, ptes, tables, start; | 
| 452 | 452 | ||
| 453 | puds = (end + PUD_SIZE - 1) >> PUD_SHIFT; | 453 | puds = (end + PUD_SIZE - 1) >> PUD_SHIFT; | 
| 454 | tables = round_up(puds * sizeof(pud_t), PAGE_SIZE); | 454 | tables = roundup(puds * sizeof(pud_t), PAGE_SIZE); | 
| 455 | if (direct_gbpages) { | 455 | if (direct_gbpages) { | 
| 456 | unsigned long extra; | 456 | unsigned long extra; | 
| 457 | extra = end - ((end>>PUD_SHIFT) << PUD_SHIFT); | 457 | extra = end - ((end>>PUD_SHIFT) << PUD_SHIFT); | 
| 458 | pmds = (extra + PMD_SIZE - 1) >> PMD_SHIFT; | 458 | pmds = (extra + PMD_SIZE - 1) >> PMD_SHIFT; | 
| 459 | } else | 459 | } else | 
| 460 | pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT; | 460 | pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT; | 
| 461 | tables += round_up(pmds * sizeof(pmd_t), PAGE_SIZE); | 461 | tables += roundup(pmds * sizeof(pmd_t), PAGE_SIZE); | 
| 462 | 462 | ||
| 463 | if (cpu_has_pse) { | 463 | if (cpu_has_pse) { | 
| 464 | unsigned long extra; | 464 | unsigned long extra; | 
| @@ -466,7 +466,7 @@ static void __init find_early_table_space(unsigned long end) | |||
| 466 | ptes = (extra + PAGE_SIZE - 1) >> PAGE_SHIFT; | 466 | ptes = (extra + PAGE_SIZE - 1) >> PAGE_SHIFT; | 
| 467 | } else | 467 | } else | 
| 468 | ptes = (end + PAGE_SIZE - 1) >> PAGE_SHIFT; | 468 | ptes = (end + PAGE_SIZE - 1) >> PAGE_SHIFT; | 
| 469 | tables += round_up(ptes * sizeof(pte_t), PAGE_SIZE); | 469 | tables += roundup(ptes * sizeof(pte_t), PAGE_SIZE); | 
| 470 | 470 | ||
| 471 | /* | 471 | /* | 
| 472 | * RED-PEN putting page tables only on node 0 could | 472 | * RED-PEN putting page tables only on node 0 could | 
| diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index d4b6e6a29ae3..cac6da54203b 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c | |||
| @@ -421,7 +421,7 @@ void unxlate_dev_mem_ptr(unsigned long phys, void *addr) | |||
| 421 | return; | 421 | return; | 
| 422 | } | 422 | } | 
| 423 | 423 | ||
| 424 | int __initdata early_ioremap_debug; | 424 | static int __initdata early_ioremap_debug; | 
| 425 | 425 | ||
| 426 | static int __init early_ioremap_debug_setup(char *str) | 426 | static int __init early_ioremap_debug_setup(char *str) | 
| 427 | { | 427 | { | 
| @@ -547,7 +547,7 @@ static inline void __init early_clear_fixmap(enum fixed_addresses idx) | |||
| 547 | } | 547 | } | 
| 548 | 548 | ||
| 549 | 549 | ||
| 550 | int __initdata early_ioremap_nested; | 550 | static int __initdata early_ioremap_nested; | 
| 551 | 551 | ||
| 552 | static int __init check_early_ioremap_leak(void) | 552 | static int __init check_early_ioremap_leak(void) | 
| 553 | { | 553 | { | 
| diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c index a4dd793d6003..cebcbf152d46 100644 --- a/arch/x86/mm/numa_64.c +++ b/arch/x86/mm/numa_64.c | |||
| @@ -79,7 +79,7 @@ static int __init allocate_cachealigned_memnodemap(void) | |||
| 79 | return 0; | 79 | return 0; | 
| 80 | 80 | ||
| 81 | addr = 0x8000; | 81 | addr = 0x8000; | 
| 82 | nodemap_size = round_up(sizeof(s16) * memnodemapsize, L1_CACHE_BYTES); | 82 | nodemap_size = roundup(sizeof(s16) * memnodemapsize, L1_CACHE_BYTES); | 
| 83 | nodemap_addr = find_e820_area(addr, max_pfn<<PAGE_SHIFT, | 83 | nodemap_addr = find_e820_area(addr, max_pfn<<PAGE_SHIFT, | 
| 84 | nodemap_size, L1_CACHE_BYTES); | 84 | nodemap_size, L1_CACHE_BYTES); | 
| 85 | if (nodemap_addr == -1UL) { | 85 | if (nodemap_addr == -1UL) { | 
| @@ -176,10 +176,10 @@ void __init setup_node_bootmem(int nodeid, unsigned long start, | |||
| 176 | unsigned long start_pfn, last_pfn, bootmap_pages, bootmap_size; | 176 | unsigned long start_pfn, last_pfn, bootmap_pages, bootmap_size; | 
| 177 | unsigned long bootmap_start, nodedata_phys; | 177 | unsigned long bootmap_start, nodedata_phys; | 
| 178 | void *bootmap; | 178 | void *bootmap; | 
| 179 | const int pgdat_size = round_up(sizeof(pg_data_t), PAGE_SIZE); | 179 | const int pgdat_size = roundup(sizeof(pg_data_t), PAGE_SIZE); | 
| 180 | int nid; | 180 | int nid; | 
| 181 | 181 | ||
| 182 | start = round_up(start, ZONE_ALIGN); | 182 | start = roundup(start, ZONE_ALIGN); | 
| 183 | 183 | ||
| 184 | printk(KERN_INFO "Bootmem setup node %d %016lx-%016lx\n", nodeid, | 184 | printk(KERN_INFO "Bootmem setup node %d %016lx-%016lx\n", nodeid, | 
| 185 | start, end); | 185 | start, end); | 
| @@ -210,9 +210,9 @@ void __init setup_node_bootmem(int nodeid, unsigned long start, | |||
| 210 | bootmap_pages = bootmem_bootmap_pages(last_pfn - start_pfn); | 210 | bootmap_pages = bootmem_bootmap_pages(last_pfn - start_pfn); | 
| 211 | nid = phys_to_nid(nodedata_phys); | 211 | nid = phys_to_nid(nodedata_phys); | 
| 212 | if (nid == nodeid) | 212 | if (nid == nodeid) | 
| 213 | bootmap_start = round_up(nodedata_phys + pgdat_size, PAGE_SIZE); | 213 | bootmap_start = roundup(nodedata_phys + pgdat_size, PAGE_SIZE); | 
| 214 | else | 214 | else | 
| 215 | bootmap_start = round_up(start, PAGE_SIZE); | 215 | bootmap_start = roundup(start, PAGE_SIZE); | 
| 216 | /* | 216 | /* | 
| 217 | * SMP_CACHE_BYTES could be enough, but init_bootmem_node like | 217 | * SMP_CACHE_BYTES could be enough, but init_bootmem_node like | 
| 218 | * to use that to align to PAGE_SIZE | 218 | * to use that to align to PAGE_SIZE | 
| diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 62c1eefcce05..898fad617abe 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
| @@ -84,7 +84,7 @@ static inline unsigned long highmap_start_pfn(void) | |||
| 84 | 84 | ||
| 85 | static inline unsigned long highmap_end_pfn(void) | 85 | static inline unsigned long highmap_end_pfn(void) | 
| 86 | { | 86 | { | 
| 87 | return __pa(round_up((unsigned long)_end, PMD_SIZE)) >> PAGE_SHIFT; | 87 | return __pa(roundup((unsigned long)_end, PMD_SIZE)) >> PAGE_SHIFT; | 
| 88 | } | 88 | } | 
| 89 | 89 | ||
| 90 | #endif | 90 | #endif | 
| diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c index d50302774fe2..86f2ffc43c3d 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c | |||
| @@ -63,10 +63,8 @@ static inline void pgd_list_del(pgd_t *pgd) | |||
| 63 | #define UNSHARED_PTRS_PER_PGD \ | 63 | #define UNSHARED_PTRS_PER_PGD \ | 
| 64 | (SHARED_KERNEL_PMD ? KERNEL_PGD_BOUNDARY : PTRS_PER_PGD) | 64 | (SHARED_KERNEL_PMD ? KERNEL_PGD_BOUNDARY : PTRS_PER_PGD) | 
| 65 | 65 | ||
| 66 | static void pgd_ctor(void *p) | 66 | static void pgd_ctor(pgd_t *pgd) | 
| 67 | { | 67 | { | 
| 68 | pgd_t *pgd = p; | ||
| 69 | |||
| 70 | /* If the pgd points to a shared pagetable level (either the | 68 | /* If the pgd points to a shared pagetable level (either the | 
| 71 | ptes in non-PAE, or shared PMD in PAE), then just copy the | 69 | ptes in non-PAE, or shared PMD in PAE), then just copy the | 
| 72 | references from swapper_pg_dir. */ | 70 | references from swapper_pg_dir. */ | 
| @@ -87,7 +85,7 @@ static void pgd_ctor(void *p) | |||
| 87 | pgd_list_add(pgd); | 85 | pgd_list_add(pgd); | 
| 88 | } | 86 | } | 
| 89 | 87 | ||
| 90 | static void pgd_dtor(void *pgd) | 88 | static void pgd_dtor(pgd_t *pgd) | 
| 91 | { | 89 | { | 
| 92 | unsigned long flags; /* can be called from interrupt context */ | 90 | unsigned long flags; /* can be called from interrupt context */ | 
| 93 | 91 | ||
| diff --git a/arch/x86/mm/pgtable_32.c b/arch/x86/mm/pgtable_32.c index cab0abbd1ebe..0951db9ee519 100644 --- a/arch/x86/mm/pgtable_32.c +++ b/arch/x86/mm/pgtable_32.c | |||
| @@ -123,7 +123,8 @@ static int __init parse_vmalloc(char *arg) | |||
| 123 | if (!arg) | 123 | if (!arg) | 
| 124 | return -EINVAL; | 124 | return -EINVAL; | 
| 125 | 125 | ||
| 126 | __VMALLOC_RESERVE = memparse(arg, &arg); | 126 | /* Add VMALLOC_OFFSET to the parsed value due to vm area guard hole*/ | 
| 127 | __VMALLOC_RESERVE = memparse(arg, &arg) + VMALLOC_OFFSET; | ||
| 127 | return 0; | 128 | return 0; | 
| 128 | } | 129 | } | 
| 129 | early_param("vmalloc", parse_vmalloc); | 130 | early_param("vmalloc", parse_vmalloc); | 
| diff --git a/arch/x86/oprofile/op_model_p4.c b/arch/x86/oprofile/op_model_p4.c index 56b4757a1f47..43ac5af338d8 100644 --- a/arch/x86/oprofile/op_model_p4.c +++ b/arch/x86/oprofile/op_model_p4.c | |||
| @@ -10,11 +10,12 @@ | |||
| 10 | 10 | ||
| 11 | #include <linux/oprofile.h> | 11 | #include <linux/oprofile.h> | 
| 12 | #include <linux/smp.h> | 12 | #include <linux/smp.h> | 
| 13 | #include <linux/ptrace.h> | ||
| 14 | #include <linux/nmi.h> | ||
| 13 | #include <asm/msr.h> | 15 | #include <asm/msr.h> | 
| 14 | #include <asm/ptrace.h> | ||
| 15 | #include <asm/fixmap.h> | 16 | #include <asm/fixmap.h> | 
| 16 | #include <asm/apic.h> | 17 | #include <asm/apic.h> | 
| 17 | #include <asm/nmi.h> | 18 | |
| 18 | 19 | ||
| 19 | #include "op_x86_model.h" | 20 | #include "op_x86_model.h" | 
| 20 | #include "op_counter.h" | 21 | #include "op_counter.h" | 
| @@ -40,7 +41,7 @@ static unsigned int num_controls = NUM_CONTROLS_NON_HT; | |||
| 40 | static inline void setup_num_counters(void) | 41 | static inline void setup_num_counters(void) | 
| 41 | { | 42 | { | 
| 42 | #ifdef CONFIG_SMP | 43 | #ifdef CONFIG_SMP | 
| 43 | if (smp_num_siblings == 2){ | 44 | if (smp_num_siblings == 2) { | 
| 44 | num_counters = NUM_COUNTERS_HT2; | 45 | num_counters = NUM_COUNTERS_HT2; | 
| 45 | num_controls = NUM_CONTROLS_HT2; | 46 | num_controls = NUM_CONTROLS_HT2; | 
| 46 | } | 47 | } | 
| @@ -86,7 +87,7 @@ struct p4_event_binding { | |||
| 86 | #define CTR_FLAME_2 (1 << 6) | 87 | #define CTR_FLAME_2 (1 << 6) | 
| 87 | #define CTR_IQ_5 (1 << 7) | 88 | #define CTR_IQ_5 (1 << 7) | 
| 88 | 89 | ||
| 89 | static struct p4_counter_binding p4_counters [NUM_COUNTERS_NON_HT] = { | 90 | static struct p4_counter_binding p4_counters[NUM_COUNTERS_NON_HT] = { | 
| 90 | { CTR_BPU_0, MSR_P4_BPU_PERFCTR0, MSR_P4_BPU_CCCR0 }, | 91 | { CTR_BPU_0, MSR_P4_BPU_PERFCTR0, MSR_P4_BPU_CCCR0 }, | 
| 91 | { CTR_MS_0, MSR_P4_MS_PERFCTR0, MSR_P4_MS_CCCR0 }, | 92 | { CTR_MS_0, MSR_P4_MS_PERFCTR0, MSR_P4_MS_CCCR0 }, | 
| 92 | { CTR_FLAME_0, MSR_P4_FLAME_PERFCTR0, MSR_P4_FLAME_CCCR0 }, | 93 | { CTR_FLAME_0, MSR_P4_FLAME_PERFCTR0, MSR_P4_FLAME_CCCR0 }, | 
| @@ -97,32 +98,32 @@ static struct p4_counter_binding p4_counters [NUM_COUNTERS_NON_HT] = { | |||
| 97 | { CTR_IQ_5, MSR_P4_IQ_PERFCTR5, MSR_P4_IQ_CCCR5 } | 98 | { CTR_IQ_5, MSR_P4_IQ_PERFCTR5, MSR_P4_IQ_CCCR5 } | 
| 98 | }; | 99 | }; | 
| 99 | 100 | ||
| 100 | #define NUM_UNUSED_CCCRS NUM_CCCRS_NON_HT - NUM_COUNTERS_NON_HT | 101 | #define NUM_UNUSED_CCCRS (NUM_CCCRS_NON_HT - NUM_COUNTERS_NON_HT) | 
| 101 | 102 | ||
| 102 | /* p4 event codes in libop/op_event.h are indices into this table. */ | 103 | /* p4 event codes in libop/op_event.h are indices into this table. */ | 
| 103 | 104 | ||
| 104 | static struct p4_event_binding p4_events[NUM_EVENTS] = { | 105 | static struct p4_event_binding p4_events[NUM_EVENTS] = { | 
| 105 | 106 | ||
| 106 | { /* BRANCH_RETIRED */ | 107 | { /* BRANCH_RETIRED */ | 
| 107 | 0x05, 0x06, | 108 | 0x05, 0x06, | 
| 108 | { {CTR_IQ_4, MSR_P4_CRU_ESCR2}, | 109 | { {CTR_IQ_4, MSR_P4_CRU_ESCR2}, | 
| 109 | {CTR_IQ_5, MSR_P4_CRU_ESCR3} } | 110 | {CTR_IQ_5, MSR_P4_CRU_ESCR3} } | 
| 110 | }, | 111 | }, | 
| 111 | 112 | ||
| 112 | { /* MISPRED_BRANCH_RETIRED */ | 113 | { /* MISPRED_BRANCH_RETIRED */ | 
| 113 | 0x04, 0x03, | 114 | 0x04, 0x03, | 
| 114 | { { CTR_IQ_4, MSR_P4_CRU_ESCR0}, | 115 | { { CTR_IQ_4, MSR_P4_CRU_ESCR0}, | 
| 115 | { CTR_IQ_5, MSR_P4_CRU_ESCR1} } | 116 | { CTR_IQ_5, MSR_P4_CRU_ESCR1} } | 
| 116 | }, | 117 | }, | 
| 117 | 118 | ||
| 118 | { /* TC_DELIVER_MODE */ | 119 | { /* TC_DELIVER_MODE */ | 
| 119 | 0x01, 0x01, | 120 | 0x01, 0x01, | 
| 120 | { { CTR_MS_0, MSR_P4_TC_ESCR0}, | 121 | { { CTR_MS_0, MSR_P4_TC_ESCR0}, | 
| 121 | { CTR_MS_2, MSR_P4_TC_ESCR1} } | 122 | { CTR_MS_2, MSR_P4_TC_ESCR1} } | 
| 122 | }, | 123 | }, | 
| 123 | 124 | ||
| 124 | { /* BPU_FETCH_REQUEST */ | 125 | { /* BPU_FETCH_REQUEST */ | 
| 125 | 0x00, 0x03, | 126 | 0x00, 0x03, | 
| 126 | { { CTR_BPU_0, MSR_P4_BPU_ESCR0}, | 127 | { { CTR_BPU_0, MSR_P4_BPU_ESCR0}, | 
| 127 | { CTR_BPU_2, MSR_P4_BPU_ESCR1} } | 128 | { CTR_BPU_2, MSR_P4_BPU_ESCR1} } | 
| 128 | }, | 129 | }, | 
| @@ -146,7 +147,7 @@ static struct p4_event_binding p4_events[NUM_EVENTS] = { | |||
| 146 | }, | 147 | }, | 
| 147 | 148 | ||
| 148 | { /* LOAD_PORT_REPLAY */ | 149 | { /* LOAD_PORT_REPLAY */ | 
| 149 | 0x02, 0x04, | 150 | 0x02, 0x04, | 
| 150 | { { CTR_FLAME_0, MSR_P4_SAAT_ESCR0}, | 151 | { { CTR_FLAME_0, MSR_P4_SAAT_ESCR0}, | 
| 151 | { CTR_FLAME_2, MSR_P4_SAAT_ESCR1} } | 152 | { CTR_FLAME_2, MSR_P4_SAAT_ESCR1} } | 
| 152 | }, | 153 | }, | 
| @@ -170,43 +171,43 @@ static struct p4_event_binding p4_events[NUM_EVENTS] = { | |||
| 170 | }, | 171 | }, | 
| 171 | 172 | ||
| 172 | { /* BSQ_CACHE_REFERENCE */ | 173 | { /* BSQ_CACHE_REFERENCE */ | 
| 173 | 0x07, 0x0c, | 174 | 0x07, 0x0c, | 
| 174 | { { CTR_BPU_0, MSR_P4_BSU_ESCR0}, | 175 | { { CTR_BPU_0, MSR_P4_BSU_ESCR0}, | 
| 175 | { CTR_BPU_2, MSR_P4_BSU_ESCR1} } | 176 | { CTR_BPU_2, MSR_P4_BSU_ESCR1} } | 
| 176 | }, | 177 | }, | 
| 177 | 178 | ||
| 178 | { /* IOQ_ALLOCATION */ | 179 | { /* IOQ_ALLOCATION */ | 
| 179 | 0x06, 0x03, | 180 | 0x06, 0x03, | 
| 180 | { { CTR_BPU_0, MSR_P4_FSB_ESCR0}, | 181 | { { CTR_BPU_0, MSR_P4_FSB_ESCR0}, | 
| 181 | { 0, 0 } } | 182 | { 0, 0 } } | 
| 182 | }, | 183 | }, | 
| 183 | 184 | ||
| 184 | { /* IOQ_ACTIVE_ENTRIES */ | 185 | { /* IOQ_ACTIVE_ENTRIES */ | 
| 185 | 0x06, 0x1a, | 186 | 0x06, 0x1a, | 
| 186 | { { CTR_BPU_2, MSR_P4_FSB_ESCR1}, | 187 | { { CTR_BPU_2, MSR_P4_FSB_ESCR1}, | 
| 187 | { 0, 0 } } | 188 | { 0, 0 } } | 
| 188 | }, | 189 | }, | 
| 189 | 190 | ||
| 190 | { /* FSB_DATA_ACTIVITY */ | 191 | { /* FSB_DATA_ACTIVITY */ | 
| 191 | 0x06, 0x17, | 192 | 0x06, 0x17, | 
| 192 | { { CTR_BPU_0, MSR_P4_FSB_ESCR0}, | 193 | { { CTR_BPU_0, MSR_P4_FSB_ESCR0}, | 
| 193 | { CTR_BPU_2, MSR_P4_FSB_ESCR1} } | 194 | { CTR_BPU_2, MSR_P4_FSB_ESCR1} } | 
| 194 | }, | 195 | }, | 
| 195 | 196 | ||
| 196 | { /* BSQ_ALLOCATION */ | 197 | { /* BSQ_ALLOCATION */ | 
| 197 | 0x07, 0x05, | 198 | 0x07, 0x05, | 
| 198 | { { CTR_BPU_0, MSR_P4_BSU_ESCR0}, | 199 | { { CTR_BPU_0, MSR_P4_BSU_ESCR0}, | 
| 199 | { 0, 0 } } | 200 | { 0, 0 } } | 
| 200 | }, | 201 | }, | 
| 201 | 202 | ||
| 202 | { /* BSQ_ACTIVE_ENTRIES */ | 203 | { /* BSQ_ACTIVE_ENTRIES */ | 
| 203 | 0x07, 0x06, | 204 | 0x07, 0x06, | 
| 204 | { { CTR_BPU_2, MSR_P4_BSU_ESCR1 /* guess */}, | 205 | { { CTR_BPU_2, MSR_P4_BSU_ESCR1 /* guess */}, | 
| 205 | { 0, 0 } } | 206 | { 0, 0 } } | 
| 206 | }, | 207 | }, | 
| 207 | 208 | ||
| 208 | { /* X87_ASSIST */ | 209 | { /* X87_ASSIST */ | 
| 209 | 0x05, 0x03, | 210 | 0x05, 0x03, | 
| 210 | { { CTR_IQ_4, MSR_P4_CRU_ESCR2}, | 211 | { { CTR_IQ_4, MSR_P4_CRU_ESCR2}, | 
| 211 | { CTR_IQ_5, MSR_P4_CRU_ESCR3} } | 212 | { CTR_IQ_5, MSR_P4_CRU_ESCR3} } | 
| 212 | }, | 213 | }, | 
| @@ -216,21 +217,21 @@ static struct p4_event_binding p4_events[NUM_EVENTS] = { | |||
| 216 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 217 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 
| 217 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 218 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 
| 218 | }, | 219 | }, | 
| 219 | 220 | ||
| 220 | { /* PACKED_SP_UOP */ | 221 | { /* PACKED_SP_UOP */ | 
| 221 | 0x01, 0x08, | 222 | 0x01, 0x08, | 
| 222 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 223 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 
| 223 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 224 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 
| 224 | }, | 225 | }, | 
| 225 | 226 | ||
| 226 | { /* PACKED_DP_UOP */ | 227 | { /* PACKED_DP_UOP */ | 
| 227 | 0x01, 0x0c, | 228 | 0x01, 0x0c, | 
| 228 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 229 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 
| 229 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 230 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 
| 230 | }, | 231 | }, | 
| 231 | 232 | ||
| 232 | { /* SCALAR_SP_UOP */ | 233 | { /* SCALAR_SP_UOP */ | 
| 233 | 0x01, 0x0a, | 234 | 0x01, 0x0a, | 
| 234 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 235 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 
| 235 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 236 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 
| 236 | }, | 237 | }, | 
| @@ -242,31 +243,31 @@ static struct p4_event_binding p4_events[NUM_EVENTS] = { | |||
| 242 | }, | 243 | }, | 
| 243 | 244 | ||
| 244 | { /* 64BIT_MMX_UOP */ | 245 | { /* 64BIT_MMX_UOP */ | 
| 245 | 0x01, 0x02, | 246 | 0x01, 0x02, | 
| 246 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 247 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 
| 247 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 248 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 
| 248 | }, | 249 | }, | 
| 249 | 250 | ||
| 250 | { /* 128BIT_MMX_UOP */ | 251 | { /* 128BIT_MMX_UOP */ | 
| 251 | 0x01, 0x1a, | 252 | 0x01, 0x1a, | 
| 252 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 253 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 
| 253 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 254 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 
| 254 | }, | 255 | }, | 
| 255 | 256 | ||
| 256 | { /* X87_FP_UOP */ | 257 | { /* X87_FP_UOP */ | 
| 257 | 0x01, 0x04, | 258 | 0x01, 0x04, | 
| 258 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 259 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 
| 259 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 260 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 
| 260 | }, | 261 | }, | 
| 261 | 262 | ||
| 262 | { /* X87_SIMD_MOVES_UOP */ | 263 | { /* X87_SIMD_MOVES_UOP */ | 
| 263 | 0x01, 0x2e, | 264 | 0x01, 0x2e, | 
| 264 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 265 | { { CTR_FLAME_0, MSR_P4_FIRM_ESCR0}, | 
| 265 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 266 | { CTR_FLAME_2, MSR_P4_FIRM_ESCR1} } | 
| 266 | }, | 267 | }, | 
| 267 | 268 | ||
| 268 | { /* MACHINE_CLEAR */ | 269 | { /* MACHINE_CLEAR */ | 
| 269 | 0x05, 0x02, | 270 | 0x05, 0x02, | 
| 270 | { { CTR_IQ_4, MSR_P4_CRU_ESCR2}, | 271 | { { CTR_IQ_4, MSR_P4_CRU_ESCR2}, | 
| 271 | { CTR_IQ_5, MSR_P4_CRU_ESCR3} } | 272 | { CTR_IQ_5, MSR_P4_CRU_ESCR3} } | 
| 272 | }, | 273 | }, | 
| @@ -276,9 +277,9 @@ static struct p4_event_binding p4_events[NUM_EVENTS] = { | |||
| 276 | { { CTR_BPU_0, MSR_P4_FSB_ESCR0}, | 277 | { { CTR_BPU_0, MSR_P4_FSB_ESCR0}, | 
| 277 | { CTR_BPU_2, MSR_P4_FSB_ESCR1} } | 278 | { CTR_BPU_2, MSR_P4_FSB_ESCR1} } | 
| 278 | }, | 279 | }, | 
| 279 | 280 | ||
| 280 | { /* TC_MS_XFER */ | 281 | { /* TC_MS_XFER */ | 
| 281 | 0x00, 0x05, | 282 | 0x00, 0x05, | 
| 282 | { { CTR_MS_0, MSR_P4_MS_ESCR0}, | 283 | { { CTR_MS_0, MSR_P4_MS_ESCR0}, | 
| 283 | { CTR_MS_2, MSR_P4_MS_ESCR1} } | 284 | { CTR_MS_2, MSR_P4_MS_ESCR1} } | 
| 284 | }, | 285 | }, | 
| @@ -308,7 +309,7 @@ static struct p4_event_binding p4_events[NUM_EVENTS] = { | |||
| 308 | }, | 309 | }, | 
| 309 | 310 | ||
| 310 | { /* INSTR_RETIRED */ | 311 | { /* INSTR_RETIRED */ | 
| 311 | 0x04, 0x02, | 312 | 0x04, 0x02, | 
| 312 | { { CTR_IQ_4, MSR_P4_CRU_ESCR0}, | 313 | { { CTR_IQ_4, MSR_P4_CRU_ESCR0}, | 
| 313 | { CTR_IQ_5, MSR_P4_CRU_ESCR1} } | 314 | { CTR_IQ_5, MSR_P4_CRU_ESCR1} } | 
| 314 | }, | 315 | }, | 
| @@ -319,14 +320,14 @@ static struct p4_event_binding p4_events[NUM_EVENTS] = { | |||
| 319 | { CTR_IQ_5, MSR_P4_CRU_ESCR1} } | 320 | { CTR_IQ_5, MSR_P4_CRU_ESCR1} } | 
| 320 | }, | 321 | }, | 
| 321 | 322 | ||
| 322 | { /* UOP_TYPE */ | 323 | { /* UOP_TYPE */ | 
| 323 | 0x02, 0x02, | 324 | 0x02, 0x02, | 
| 324 | { { CTR_IQ_4, MSR_P4_RAT_ESCR0}, | 325 | { { CTR_IQ_4, MSR_P4_RAT_ESCR0}, | 
| 325 | { CTR_IQ_5, MSR_P4_RAT_ESCR1} } | 326 | { CTR_IQ_5, MSR_P4_RAT_ESCR1} } | 
| 326 | }, | 327 | }, | 
| 327 | 328 | ||
| 328 | { /* RETIRED_MISPRED_BRANCH_TYPE */ | 329 | { /* RETIRED_MISPRED_BRANCH_TYPE */ | 
| 329 | 0x02, 0x05, | 330 | 0x02, 0x05, | 
| 330 | { { CTR_MS_0, MSR_P4_TBPU_ESCR0}, | 331 | { { CTR_MS_0, MSR_P4_TBPU_ESCR0}, | 
| 331 | { CTR_MS_2, MSR_P4_TBPU_ESCR1} } | 332 | { CTR_MS_2, MSR_P4_TBPU_ESCR1} } | 
| 332 | }, | 333 | }, | 
| @@ -349,8 +350,8 @@ static struct p4_event_binding p4_events[NUM_EVENTS] = { | |||
| 349 | #define ESCR_SET_OS_1(escr, os) ((escr) |= (((os) & 1) << 1)) | 350 | #define ESCR_SET_OS_1(escr, os) ((escr) |= (((os) & 1) << 1)) | 
| 350 | #define ESCR_SET_EVENT_SELECT(escr, sel) ((escr) |= (((sel) & 0x3f) << 25)) | 351 | #define ESCR_SET_EVENT_SELECT(escr, sel) ((escr) |= (((sel) & 0x3f) << 25)) | 
| 351 | #define ESCR_SET_EVENT_MASK(escr, mask) ((escr) |= (((mask) & 0xffff) << 9)) | 352 | #define ESCR_SET_EVENT_MASK(escr, mask) ((escr) |= (((mask) & 0xffff) << 9)) | 
| 352 | #define ESCR_READ(escr,high,ev,i) do {rdmsr(ev->bindings[(i)].escr_address, (escr), (high));} while (0) | 353 | #define ESCR_READ(escr, high, ev, i) do {rdmsr(ev->bindings[(i)].escr_address, (escr), (high)); } while (0) | 
| 353 | #define ESCR_WRITE(escr,high,ev,i) do {wrmsr(ev->bindings[(i)].escr_address, (escr), (high));} while (0) | 354 | #define ESCR_WRITE(escr, high, ev, i) do {wrmsr(ev->bindings[(i)].escr_address, (escr), (high)); } while (0) | 
| 354 | 355 | ||
| 355 | #define CCCR_RESERVED_BITS 0x38030FFF | 356 | #define CCCR_RESERVED_BITS 0x38030FFF | 
| 356 | #define CCCR_CLEAR(cccr) ((cccr) &= CCCR_RESERVED_BITS) | 357 | #define CCCR_CLEAR(cccr) ((cccr) &= CCCR_RESERVED_BITS) | 
| @@ -360,15 +361,15 @@ static struct p4_event_binding p4_events[NUM_EVENTS] = { | |||
| 360 | #define CCCR_SET_PMI_OVF_1(cccr) ((cccr) |= (1<<27)) | 361 | #define CCCR_SET_PMI_OVF_1(cccr) ((cccr) |= (1<<27)) | 
| 361 | #define CCCR_SET_ENABLE(cccr) ((cccr) |= (1<<12)) | 362 | #define CCCR_SET_ENABLE(cccr) ((cccr) |= (1<<12)) | 
| 362 | #define CCCR_SET_DISABLE(cccr) ((cccr) &= ~(1<<12)) | 363 | #define CCCR_SET_DISABLE(cccr) ((cccr) &= ~(1<<12)) | 
| 363 | #define CCCR_READ(low, high, i) do {rdmsr(p4_counters[(i)].cccr_address, (low), (high));} while (0) | 364 | #define CCCR_READ(low, high, i) do {rdmsr(p4_counters[(i)].cccr_address, (low), (high)); } while (0) | 
| 364 | #define CCCR_WRITE(low, high, i) do {wrmsr(p4_counters[(i)].cccr_address, (low), (high));} while (0) | 365 | #define CCCR_WRITE(low, high, i) do {wrmsr(p4_counters[(i)].cccr_address, (low), (high)); } while (0) | 
| 365 | #define CCCR_OVF_P(cccr) ((cccr) & (1U<<31)) | 366 | #define CCCR_OVF_P(cccr) ((cccr) & (1U<<31)) | 
| 366 | #define CCCR_CLEAR_OVF(cccr) ((cccr) &= (~(1U<<31))) | 367 | #define CCCR_CLEAR_OVF(cccr) ((cccr) &= (~(1U<<31))) | 
| 367 | 368 | ||
| 368 | #define CTRL_IS_RESERVED(msrs,c) (msrs->controls[(c)].addr ? 1 : 0) | 369 | #define CTRL_IS_RESERVED(msrs, c) (msrs->controls[(c)].addr ? 1 : 0) | 
| 369 | #define CTR_IS_RESERVED(msrs,c) (msrs->counters[(c)].addr ? 1 : 0) | 370 | #define CTR_IS_RESERVED(msrs, c) (msrs->counters[(c)].addr ? 1 : 0) | 
| 370 | #define CTR_READ(l,h,i) do {rdmsr(p4_counters[(i)].counter_address, (l), (h));} while (0) | 371 | #define CTR_READ(l, h, i) do {rdmsr(p4_counters[(i)].counter_address, (l), (h)); } while (0) | 
| 371 | #define CTR_WRITE(l,i) do {wrmsr(p4_counters[(i)].counter_address, -(u32)(l), -1);} while (0) | 372 | #define CTR_WRITE(l, i) do {wrmsr(p4_counters[(i)].counter_address, -(u32)(l), -1); } while (0) | 
| 372 | #define CTR_OVERFLOW_P(ctr) (!((ctr) & 0x80000000)) | 373 | #define CTR_OVERFLOW_P(ctr) (!((ctr) & 0x80000000)) | 
| 373 | 374 | ||
| 374 | 375 | ||
| @@ -380,7 +381,7 @@ static unsigned int get_stagger(void) | |||
| 380 | #ifdef CONFIG_SMP | 381 | #ifdef CONFIG_SMP | 
| 381 | int cpu = smp_processor_id(); | 382 | int cpu = smp_processor_id(); | 
| 382 | return (cpu != first_cpu(per_cpu(cpu_sibling_map, cpu))); | 383 | return (cpu != first_cpu(per_cpu(cpu_sibling_map, cpu))); | 
| 383 | #endif | 384 | #endif | 
| 384 | return 0; | 385 | return 0; | 
| 385 | } | 386 | } | 
| 386 | 387 | ||
| @@ -395,25 +396,23 @@ static unsigned long reset_value[NUM_COUNTERS_NON_HT]; | |||
| 395 | 396 | ||
| 396 | static void p4_fill_in_addresses(struct op_msrs * const msrs) | 397 | static void p4_fill_in_addresses(struct op_msrs * const msrs) | 
| 397 | { | 398 | { | 
| 398 | unsigned int i; | 399 | unsigned int i; | 
| 399 | unsigned int addr, cccraddr, stag; | 400 | unsigned int addr, cccraddr, stag; | 
| 400 | 401 | ||
| 401 | setup_num_counters(); | 402 | setup_num_counters(); | 
| 402 | stag = get_stagger(); | 403 | stag = get_stagger(); | 
| 403 | 404 | ||
| 404 | /* initialize some registers */ | 405 | /* initialize some registers */ | 
| 405 | for (i = 0; i < num_counters; ++i) { | 406 | for (i = 0; i < num_counters; ++i) | 
| 406 | msrs->counters[i].addr = 0; | 407 | msrs->counters[i].addr = 0; | 
| 407 | } | 408 | for (i = 0; i < num_controls; ++i) | 
| 408 | for (i = 0; i < num_controls; ++i) { | ||
| 409 | msrs->controls[i].addr = 0; | 409 | msrs->controls[i].addr = 0; | 
| 410 | } | 410 | |
| 411 | |||
| 412 | /* the counter & cccr registers we pay attention to */ | 411 | /* the counter & cccr registers we pay attention to */ | 
| 413 | for (i = 0; i < num_counters; ++i) { | 412 | for (i = 0; i < num_counters; ++i) { | 
| 414 | addr = p4_counters[VIRT_CTR(stag, i)].counter_address; | 413 | addr = p4_counters[VIRT_CTR(stag, i)].counter_address; | 
| 415 | cccraddr = p4_counters[VIRT_CTR(stag, i)].cccr_address; | 414 | cccraddr = p4_counters[VIRT_CTR(stag, i)].cccr_address; | 
| 416 | if (reserve_perfctr_nmi(addr)){ | 415 | if (reserve_perfctr_nmi(addr)) { | 
| 417 | msrs->counters[i].addr = addr; | 416 | msrs->counters[i].addr = addr; | 
| 418 | msrs->controls[i].addr = cccraddr; | 417 | msrs->controls[i].addr = cccraddr; | 
| 419 | } | 418 | } | 
| @@ -447,22 +446,22 @@ static void p4_fill_in_addresses(struct op_msrs * const msrs) | |||
| 447 | if (reserve_evntsel_nmi(addr)) | 446 | if (reserve_evntsel_nmi(addr)) | 
| 448 | msrs->controls[i].addr = addr; | 447 | msrs->controls[i].addr = addr; | 
| 449 | } | 448 | } | 
| 450 | 449 | ||
| 451 | for (addr = MSR_P4_MS_ESCR0 + stag; | 450 | for (addr = MSR_P4_MS_ESCR0 + stag; | 
| 452 | addr <= MSR_P4_TC_ESCR1; ++i, addr += addr_increment()) { | 451 | addr <= MSR_P4_TC_ESCR1; ++i, addr += addr_increment()) { | 
| 453 | if (reserve_evntsel_nmi(addr)) | 452 | if (reserve_evntsel_nmi(addr)) | 
| 454 | msrs->controls[i].addr = addr; | 453 | msrs->controls[i].addr = addr; | 
| 455 | } | 454 | } | 
| 456 | 455 | ||
| 457 | for (addr = MSR_P4_IX_ESCR0 + stag; | 456 | for (addr = MSR_P4_IX_ESCR0 + stag; | 
| 458 | addr <= MSR_P4_CRU_ESCR3; ++i, addr += addr_increment()) { | 457 | addr <= MSR_P4_CRU_ESCR3; ++i, addr += addr_increment()) { | 
| 459 | if (reserve_evntsel_nmi(addr)) | 458 | if (reserve_evntsel_nmi(addr)) | 
| 460 | msrs->controls[i].addr = addr; | 459 | msrs->controls[i].addr = addr; | 
| 461 | } | 460 | } | 
| 462 | 461 | ||
| 463 | /* there are 2 remaining non-contiguously located ESCRs */ | 462 | /* there are 2 remaining non-contiguously located ESCRs */ | 
| 464 | 463 | ||
| 465 | if (num_counters == NUM_COUNTERS_NON_HT) { | 464 | if (num_counters == NUM_COUNTERS_NON_HT) { | 
| 466 | /* standard non-HT CPUs handle both remaining ESCRs*/ | 465 | /* standard non-HT CPUs handle both remaining ESCRs*/ | 
| 467 | if (reserve_evntsel_nmi(MSR_P4_CRU_ESCR5)) | 466 | if (reserve_evntsel_nmi(MSR_P4_CRU_ESCR5)) | 
| 468 | msrs->controls[i++].addr = MSR_P4_CRU_ESCR5; | 467 | msrs->controls[i++].addr = MSR_P4_CRU_ESCR5; | 
| @@ -498,20 +497,20 @@ static void pmc_setup_one_p4_counter(unsigned int ctr) | |||
| 498 | unsigned int stag; | 497 | unsigned int stag; | 
| 499 | 498 | ||
| 500 | stag = get_stagger(); | 499 | stag = get_stagger(); | 
| 501 | 500 | ||
| 502 | /* convert from counter *number* to counter *bit* */ | 501 | /* convert from counter *number* to counter *bit* */ | 
| 503 | counter_bit = 1 << VIRT_CTR(stag, ctr); | 502 | counter_bit = 1 << VIRT_CTR(stag, ctr); | 
| 504 | 503 | ||
| 505 | /* find our event binding structure. */ | 504 | /* find our event binding structure. */ | 
| 506 | if (counter_config[ctr].event <= 0 || counter_config[ctr].event > NUM_EVENTS) { | 505 | if (counter_config[ctr].event <= 0 || counter_config[ctr].event > NUM_EVENTS) { | 
| 507 | printk(KERN_ERR | 506 | printk(KERN_ERR | 
| 508 | "oprofile: P4 event code 0x%lx out of range\n", | 507 | "oprofile: P4 event code 0x%lx out of range\n", | 
| 509 | counter_config[ctr].event); | 508 | counter_config[ctr].event); | 
| 510 | return; | 509 | return; | 
| 511 | } | 510 | } | 
| 512 | 511 | ||
| 513 | ev = &(p4_events[counter_config[ctr].event - 1]); | 512 | ev = &(p4_events[counter_config[ctr].event - 1]); | 
| 514 | 513 | ||
| 515 | for (i = 0; i < maxbind; i++) { | 514 | for (i = 0; i < maxbind; i++) { | 
| 516 | if (ev->bindings[i].virt_counter & counter_bit) { | 515 | if (ev->bindings[i].virt_counter & counter_bit) { | 
| 517 | 516 | ||
| @@ -526,25 +525,24 @@ static void pmc_setup_one_p4_counter(unsigned int ctr) | |||
| 526 | ESCR_SET_OS_1(escr, counter_config[ctr].kernel); | 525 | ESCR_SET_OS_1(escr, counter_config[ctr].kernel); | 
| 527 | } | 526 | } | 
| 528 | ESCR_SET_EVENT_SELECT(escr, ev->event_select); | 527 | ESCR_SET_EVENT_SELECT(escr, ev->event_select); | 
| 529 | ESCR_SET_EVENT_MASK(escr, counter_config[ctr].unit_mask); | 528 | ESCR_SET_EVENT_MASK(escr, counter_config[ctr].unit_mask); | 
| 530 | ESCR_WRITE(escr, high, ev, i); | 529 | ESCR_WRITE(escr, high, ev, i); | 
| 531 | 530 | ||
| 532 | /* modify CCCR */ | 531 | /* modify CCCR */ | 
| 533 | CCCR_READ(cccr, high, VIRT_CTR(stag, ctr)); | 532 | CCCR_READ(cccr, high, VIRT_CTR(stag, ctr)); | 
| 534 | CCCR_CLEAR(cccr); | 533 | CCCR_CLEAR(cccr); | 
| 535 | CCCR_SET_REQUIRED_BITS(cccr); | 534 | CCCR_SET_REQUIRED_BITS(cccr); | 
| 536 | CCCR_SET_ESCR_SELECT(cccr, ev->escr_select); | 535 | CCCR_SET_ESCR_SELECT(cccr, ev->escr_select); | 
| 537 | if (stag == 0) { | 536 | if (stag == 0) | 
| 538 | CCCR_SET_PMI_OVF_0(cccr); | 537 | CCCR_SET_PMI_OVF_0(cccr); | 
| 539 | } else { | 538 | else | 
| 540 | CCCR_SET_PMI_OVF_1(cccr); | 539 | CCCR_SET_PMI_OVF_1(cccr); | 
| 541 | } | ||
| 542 | CCCR_WRITE(cccr, high, VIRT_CTR(stag, ctr)); | 540 | CCCR_WRITE(cccr, high, VIRT_CTR(stag, ctr)); | 
| 543 | return; | 541 | return; | 
| 544 | } | 542 | } | 
| 545 | } | 543 | } | 
| 546 | 544 | ||
| 547 | printk(KERN_ERR | 545 | printk(KERN_ERR | 
| 548 | "oprofile: P4 event code 0x%lx no binding, stag %d ctr %d\n", | 546 | "oprofile: P4 event code 0x%lx no binding, stag %d ctr %d\n", | 
| 549 | counter_config[ctr].event, stag, ctr); | 547 | counter_config[ctr].event, stag, ctr); | 
| 550 | } | 548 | } | 
| @@ -559,14 +557,14 @@ static void p4_setup_ctrs(struct op_msrs const * const msrs) | |||
| 559 | stag = get_stagger(); | 557 | stag = get_stagger(); | 
| 560 | 558 | ||
| 561 | rdmsr(MSR_IA32_MISC_ENABLE, low, high); | 559 | rdmsr(MSR_IA32_MISC_ENABLE, low, high); | 
| 562 | if (! MISC_PMC_ENABLED_P(low)) { | 560 | if (!MISC_PMC_ENABLED_P(low)) { | 
| 563 | printk(KERN_ERR "oprofile: P4 PMC not available\n"); | 561 | printk(KERN_ERR "oprofile: P4 PMC not available\n"); | 
| 564 | return; | 562 | return; | 
| 565 | } | 563 | } | 
| 566 | 564 | ||
| 567 | /* clear the cccrs we will use */ | 565 | /* clear the cccrs we will use */ | 
| 568 | for (i = 0 ; i < num_counters ; i++) { | 566 | for (i = 0 ; i < num_counters ; i++) { | 
| 569 | if (unlikely(!CTRL_IS_RESERVED(msrs,i))) | 567 | if (unlikely(!CTRL_IS_RESERVED(msrs, i))) | 
| 570 | continue; | 568 | continue; | 
| 571 | rdmsr(p4_counters[VIRT_CTR(stag, i)].cccr_address, low, high); | 569 | rdmsr(p4_counters[VIRT_CTR(stag, i)].cccr_address, low, high); | 
| 572 | CCCR_CLEAR(low); | 570 | CCCR_CLEAR(low); | 
| @@ -576,14 +574,14 @@ static void p4_setup_ctrs(struct op_msrs const * const msrs) | |||
| 576 | 574 | ||
| 577 | /* clear all escrs (including those outside our concern) */ | 575 | /* clear all escrs (including those outside our concern) */ | 
| 578 | for (i = num_counters; i < num_controls; i++) { | 576 | for (i = num_counters; i < num_controls; i++) { | 
| 579 | if (unlikely(!CTRL_IS_RESERVED(msrs,i))) | 577 | if (unlikely(!CTRL_IS_RESERVED(msrs, i))) | 
| 580 | continue; | 578 | continue; | 
| 581 | wrmsr(msrs->controls[i].addr, 0, 0); | 579 | wrmsr(msrs->controls[i].addr, 0, 0); | 
| 582 | } | 580 | } | 
| 583 | 581 | ||
| 584 | /* setup all counters */ | 582 | /* setup all counters */ | 
| 585 | for (i = 0 ; i < num_counters ; ++i) { | 583 | for (i = 0 ; i < num_counters ; ++i) { | 
| 586 | if ((counter_config[i].enabled) && (CTRL_IS_RESERVED(msrs,i))) { | 584 | if ((counter_config[i].enabled) && (CTRL_IS_RESERVED(msrs, i))) { | 
| 587 | reset_value[i] = counter_config[i].count; | 585 | reset_value[i] = counter_config[i].count; | 
| 588 | pmc_setup_one_p4_counter(i); | 586 | pmc_setup_one_p4_counter(i); | 
| 589 | CTR_WRITE(counter_config[i].count, VIRT_CTR(stag, i)); | 587 | CTR_WRITE(counter_config[i].count, VIRT_CTR(stag, i)); | 
| @@ -603,11 +601,11 @@ static int p4_check_ctrs(struct pt_regs * const regs, | |||
| 603 | stag = get_stagger(); | 601 | stag = get_stagger(); | 
| 604 | 602 | ||
| 605 | for (i = 0; i < num_counters; ++i) { | 603 | for (i = 0; i < num_counters; ++i) { | 
| 606 | 604 | ||
| 607 | if (!reset_value[i]) | 605 | if (!reset_value[i]) | 
| 608 | continue; | 606 | continue; | 
| 609 | 607 | ||
| 610 | /* | 608 | /* | 
| 611 | * there is some eccentricity in the hardware which | 609 | * there is some eccentricity in the hardware which | 
| 612 | * requires that we perform 2 extra corrections: | 610 | * requires that we perform 2 extra corrections: | 
| 613 | * | 611 | * | 
| @@ -616,24 +614,24 @@ static int p4_check_ctrs(struct pt_regs * const regs, | |||
| 616 | * | 614 | * | 
| 617 | * - write the counter back twice to ensure it gets | 615 | * - write the counter back twice to ensure it gets | 
| 618 | * updated properly. | 616 | * updated properly. | 
| 619 | * | 617 | * | 
| 620 | * the former seems to be related to extra NMIs happening | 618 | * the former seems to be related to extra NMIs happening | 
| 621 | * during the current NMI; the latter is reported as errata | 619 | * during the current NMI; the latter is reported as errata | 
| 622 | * N15 in intel doc 249199-029, pentium 4 specification | 620 | * N15 in intel doc 249199-029, pentium 4 specification | 
| 623 | * update, though their suggested work-around does not | 621 | * update, though their suggested work-around does not | 
| 624 | * appear to solve the problem. | 622 | * appear to solve the problem. | 
| 625 | */ | 623 | */ | 
| 626 | 624 | ||
| 627 | real = VIRT_CTR(stag, i); | 625 | real = VIRT_CTR(stag, i); | 
| 628 | 626 | ||
| 629 | CCCR_READ(low, high, real); | 627 | CCCR_READ(low, high, real); | 
| 630 | CTR_READ(ctr, high, real); | 628 | CTR_READ(ctr, high, real); | 
| 631 | if (CCCR_OVF_P(low) || CTR_OVERFLOW_P(ctr)) { | 629 | if (CCCR_OVF_P(low) || CTR_OVERFLOW_P(ctr)) { | 
| 632 | oprofile_add_sample(regs, i); | 630 | oprofile_add_sample(regs, i); | 
| 633 | CTR_WRITE(reset_value[i], real); | 631 | CTR_WRITE(reset_value[i], real); | 
| 634 | CCCR_CLEAR_OVF(low); | 632 | CCCR_CLEAR_OVF(low); | 
| 635 | CCCR_WRITE(low, high, real); | 633 | CCCR_WRITE(low, high, real); | 
| 636 | CTR_WRITE(reset_value[i], real); | 634 | CTR_WRITE(reset_value[i], real); | 
| 637 | } | 635 | } | 
| 638 | } | 636 | } | 
| 639 | 637 | ||
| @@ -683,15 +681,16 @@ static void p4_shutdown(struct op_msrs const * const msrs) | |||
| 683 | int i; | 681 | int i; | 
| 684 | 682 | ||
| 685 | for (i = 0 ; i < num_counters ; ++i) { | 683 | for (i = 0 ; i < num_counters ; ++i) { | 
| 686 | if (CTR_IS_RESERVED(msrs,i)) | 684 | if (CTR_IS_RESERVED(msrs, i)) | 
| 687 | release_perfctr_nmi(msrs->counters[i].addr); | 685 | release_perfctr_nmi(msrs->counters[i].addr); | 
| 688 | } | 686 | } | 
| 689 | /* some of the control registers are specially reserved in | 687 | /* | 
| 688 | * some of the control registers are specially reserved in | ||
| 690 | * conjunction with the counter registers (hence the starting offset). | 689 | * conjunction with the counter registers (hence the starting offset). | 
| 691 | * This saves a few bits. | 690 | * This saves a few bits. | 
| 692 | */ | 691 | */ | 
| 693 | for (i = num_counters ; i < num_controls ; ++i) { | 692 | for (i = num_counters ; i < num_controls ; ++i) { | 
| 694 | if (CTRL_IS_RESERVED(msrs,i)) | 693 | if (CTRL_IS_RESERVED(msrs, i)) | 
| 695 | release_evntsel_nmi(msrs->controls[i].addr); | 694 | release_evntsel_nmi(msrs->controls[i].addr); | 
| 696 | } | 695 | } | 
| 697 | } | 696 | } | 
| diff --git a/arch/x86/pci/amd_bus.c b/arch/x86/pci/amd_bus.c index 6a0fca78c362..22e057665e55 100644 --- a/arch/x86/pci/amd_bus.c +++ b/arch/x86/pci/amd_bus.c | |||
| @@ -580,7 +580,7 @@ static int __cpuinit amd_cpu_notify(struct notifier_block *self, | |||
| 580 | unsigned long action, void *hcpu) | 580 | unsigned long action, void *hcpu) | 
| 581 | { | 581 | { | 
| 582 | int cpu = (long)hcpu; | 582 | int cpu = (long)hcpu; | 
| 583 | switch(action) { | 583 | switch (action) { | 
| 584 | case CPU_ONLINE: | 584 | case CPU_ONLINE: | 
| 585 | case CPU_ONLINE_FROZEN: | 585 | case CPU_ONLINE_FROZEN: | 
| 586 | smp_call_function_single(cpu, enable_pci_io_ecs, NULL, 0); | 586 | smp_call_function_single(cpu, enable_pci_io_ecs, NULL, 0); | 
| diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c index 8e077185e185..006599db0dc7 100644 --- a/arch/x86/pci/irq.c +++ b/arch/x86/pci/irq.c | |||
| @@ -1043,35 +1043,44 @@ static void __init pcibios_fixup_irqs(void) | |||
| 1043 | if (io_apic_assign_pci_irqs) { | 1043 | if (io_apic_assign_pci_irqs) { | 
| 1044 | int irq; | 1044 | int irq; | 
| 1045 | 1045 | ||
| 1046 | if (pin) { | 1046 | if (!pin) | 
| 1047 | /* | 1047 | continue; | 
| 1048 | * interrupt pins are numbered starting | 1048 | |
| 1049 | * from 1 | 1049 | /* | 
| 1050 | */ | 1050 | * interrupt pins are numbered starting from 1 | 
| 1051 | pin--; | 1051 | */ | 
| 1052 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, | 1052 | pin--; | 
| 1053 | PCI_SLOT(dev->devfn), pin); | 1053 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, | 
| 1054 | /* | 1054 | PCI_SLOT(dev->devfn), pin); | 
| 1055 | * Busses behind bridges are typically not listed in the MP-table. | 1055 | /* | 
| 1056 | * In this case we have to look up the IRQ based on the parent bus, | 1056 | * Busses behind bridges are typically not listed in the | 
| 1057 | * parent slot, and pin number. The SMP code detects such bridged | 1057 | * MP-table. In this case we have to look up the IRQ | 
| 1058 | * busses itself so we should get into this branch reliably. | 1058 | * based on the parent bus, parent slot, and pin number. | 
| 1059 | */ | 1059 | * The SMP code detects such bridged busses itself so we | 
| 1060 | if (irq < 0 && dev->bus->parent) { /* go back to the bridge */ | 1060 | * should get into this branch reliably. | 
| 1061 | struct pci_dev *bridge = dev->bus->self; | 1061 | */ | 
| 1062 | 1062 | if (irq < 0 && dev->bus->parent) { | |
| 1063 | pin = (pin + PCI_SLOT(dev->devfn)) % 4; | 1063 | /* go back to the bridge */ | 
| 1064 | irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, | 1064 | struct pci_dev *bridge = dev->bus->self; | 
| 1065 | PCI_SLOT(bridge->devfn), pin); | 1065 | int bus; | 
| 1066 | if (irq >= 0) | 1066 | |
| 1067 | dev_warn(&dev->dev, "using bridge %s INT %c to get IRQ %d\n", | 1067 | pin = (pin + PCI_SLOT(dev->devfn)) % 4; | 
| 1068 | pci_name(bridge), | 1068 | bus = bridge->bus->number; | 
| 1069 | 'A' + pin, irq); | 1069 | irq = IO_APIC_get_PCI_irq_vector(bus, | 
| 1070 | } | 1070 | PCI_SLOT(bridge->devfn), pin); | 
| 1071 | if (irq >= 0) { | 1071 | if (irq >= 0) | 
| 1072 | dev_info(&dev->dev, "PCI->APIC IRQ transform: INT %c -> IRQ %d\n", 'A' + pin, irq); | 1072 | dev_warn(&dev->dev, | 
| 1073 | dev->irq = irq; | 1073 | "using bridge %s INT %c to " | 
| 1074 | } | 1074 | "get IRQ %d\n", | 
| 1075 | pci_name(bridge), | ||
| 1076 | 'A' + pin, irq); | ||
| 1077 | } | ||
| 1078 | if (irq >= 0) { | ||
| 1079 | dev_info(&dev->dev, | ||
| 1080 | "PCI->APIC IRQ transform: INT %c " | ||
| 1081 | "-> IRQ %d\n", | ||
| 1082 | 'A' + pin, irq); | ||
| 1083 | dev->irq = irq; | ||
| 1075 | } | 1084 | } | 
| 1076 | } | 1085 | } | 
| 1077 | #endif | 1086 | #endif | 
| diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S index 4fc7e872c85e..d1e9b53f9d33 100644 --- a/arch/x86/power/hibernate_asm_32.S +++ b/arch/x86/power/hibernate_asm_32.S | |||
| @@ -1,5 +1,3 @@ | |||
| 1 | .text | ||
| 2 | |||
| 3 | /* | 1 | /* | 
| 4 | * This may not use any stack, nor any variable that is not "NoSave": | 2 | * This may not use any stack, nor any variable that is not "NoSave": | 
| 5 | * | 3 | * | 
| @@ -12,17 +10,18 @@ | |||
| 12 | #include <asm/segment.h> | 10 | #include <asm/segment.h> | 
| 13 | #include <asm/page.h> | 11 | #include <asm/page.h> | 
| 14 | #include <asm/asm-offsets.h> | 12 | #include <asm/asm-offsets.h> | 
| 13 | #include <asm/processor-flags.h> | ||
| 15 | 14 | ||
| 16 | .text | 15 | .text | 
| 17 | 16 | ||
| 18 | ENTRY(swsusp_arch_suspend) | 17 | ENTRY(swsusp_arch_suspend) | 
| 19 | |||
| 20 | movl %esp, saved_context_esp | 18 | movl %esp, saved_context_esp | 
| 21 | movl %ebx, saved_context_ebx | 19 | movl %ebx, saved_context_ebx | 
| 22 | movl %ebp, saved_context_ebp | 20 | movl %ebp, saved_context_ebp | 
| 23 | movl %esi, saved_context_esi | 21 | movl %esi, saved_context_esi | 
| 24 | movl %edi, saved_context_edi | 22 | movl %edi, saved_context_edi | 
| 25 | pushfl ; popl saved_context_eflags | 23 | pushfl | 
| 24 | popl saved_context_eflags | ||
| 26 | 25 | ||
| 27 | call swsusp_save | 26 | call swsusp_save | 
| 28 | ret | 27 | ret | 
| @@ -59,7 +58,7 @@ done: | |||
| 59 | movl mmu_cr4_features, %ecx | 58 | movl mmu_cr4_features, %ecx | 
| 60 | jecxz 1f # cr4 Pentium and higher, skip if zero | 59 | jecxz 1f # cr4 Pentium and higher, skip if zero | 
| 61 | movl %ecx, %edx | 60 | movl %ecx, %edx | 
| 62 | andl $~(1<<7), %edx; # PGE | 61 | andl $~(X86_CR4_PGE), %edx | 
| 63 | movl %edx, %cr4; # turn off PGE | 62 | movl %edx, %cr4; # turn off PGE | 
| 64 | 1: | 63 | 1: | 
| 65 | movl %cr3, %eax; # flush TLB | 64 | movl %cr3, %eax; # flush TLB | 
| @@ -74,7 +73,8 @@ done: | |||
| 74 | movl saved_context_esi, %esi | 73 | movl saved_context_esi, %esi | 
| 75 | movl saved_context_edi, %edi | 74 | movl saved_context_edi, %edi | 
| 76 | 75 | ||
| 77 | pushl saved_context_eflags ; popfl | 76 | pushl saved_context_eflags | 
| 77 | popfl | ||
| 78 | 78 | ||
| 79 | xorl %eax, %eax | 79 | xorl %eax, %eax | 
| 80 | 80 | ||
| diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index a4e201b47f64..7dcd321a0508 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -812,7 +812,7 @@ static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high) | |||
| 812 | 812 | ||
| 813 | /* Early in boot, while setting up the initial pagetable, assume | 813 | /* Early in boot, while setting up the initial pagetable, assume | 
| 814 | everything is pinned. */ | 814 | everything is pinned. */ | 
| 815 | static __init void xen_alloc_pte_init(struct mm_struct *mm, u32 pfn) | 815 | static __init void xen_alloc_pte_init(struct mm_struct *mm, unsigned long pfn) | 
| 816 | { | 816 | { | 
| 817 | #ifdef CONFIG_FLATMEM | 817 | #ifdef CONFIG_FLATMEM | 
| 818 | BUG_ON(mem_map); /* should only be used early */ | 818 | BUG_ON(mem_map); /* should only be used early */ | 
| @@ -822,7 +822,7 @@ static __init void xen_alloc_pte_init(struct mm_struct *mm, u32 pfn) | |||
| 822 | 822 | ||
| 823 | /* Early release_pte assumes that all pts are pinned, since there's | 823 | /* Early release_pte assumes that all pts are pinned, since there's | 
| 824 | only init_mm and anything attached to that is pinned. */ | 824 | only init_mm and anything attached to that is pinned. */ | 
| 825 | static void xen_release_pte_init(u32 pfn) | 825 | static void xen_release_pte_init(unsigned long pfn) | 
| 826 | { | 826 | { | 
| 827 | make_lowmem_page_readwrite(__va(PFN_PHYS(pfn))); | 827 | make_lowmem_page_readwrite(__va(PFN_PHYS(pfn))); | 
| 828 | } | 828 | } | 
| @@ -838,7 +838,7 @@ static void pin_pagetable_pfn(unsigned cmd, unsigned long pfn) | |||
| 838 | 838 | ||
| 839 | /* This needs to make sure the new pte page is pinned iff its being | 839 | /* This needs to make sure the new pte page is pinned iff its being | 
| 840 | attached to a pinned pagetable. */ | 840 | attached to a pinned pagetable. */ | 
| 841 | static void xen_alloc_ptpage(struct mm_struct *mm, u32 pfn, unsigned level) | 841 | static void xen_alloc_ptpage(struct mm_struct *mm, unsigned long pfn, unsigned level) | 
| 842 | { | 842 | { | 
| 843 | struct page *page = pfn_to_page(pfn); | 843 | struct page *page = pfn_to_page(pfn); | 
| 844 | 844 | ||
| @@ -856,12 +856,12 @@ static void xen_alloc_ptpage(struct mm_struct *mm, u32 pfn, unsigned level) | |||
| 856 | } | 856 | } | 
| 857 | } | 857 | } | 
| 858 | 858 | ||
| 859 | static void xen_alloc_pte(struct mm_struct *mm, u32 pfn) | 859 | static void xen_alloc_pte(struct mm_struct *mm, unsigned long pfn) | 
| 860 | { | 860 | { | 
| 861 | xen_alloc_ptpage(mm, pfn, PT_PTE); | 861 | xen_alloc_ptpage(mm, pfn, PT_PTE); | 
| 862 | } | 862 | } | 
| 863 | 863 | ||
| 864 | static void xen_alloc_pmd(struct mm_struct *mm, u32 pfn) | 864 | static void xen_alloc_pmd(struct mm_struct *mm, unsigned long pfn) | 
| 865 | { | 865 | { | 
| 866 | xen_alloc_ptpage(mm, pfn, PT_PMD); | 866 | xen_alloc_ptpage(mm, pfn, PT_PMD); | 
| 867 | } | 867 | } | 
| @@ -909,7 +909,7 @@ static void xen_pgd_free(struct mm_struct *mm, pgd_t *pgd) | |||
| 909 | } | 909 | } | 
| 910 | 910 | ||
| 911 | /* This should never happen until we're OK to use struct page */ | 911 | /* This should never happen until we're OK to use struct page */ | 
| 912 | static void xen_release_ptpage(u32 pfn, unsigned level) | 912 | static void xen_release_ptpage(unsigned long pfn, unsigned level) | 
| 913 | { | 913 | { | 
| 914 | struct page *page = pfn_to_page(pfn); | 914 | struct page *page = pfn_to_page(pfn); | 
| 915 | 915 | ||
| @@ -923,23 +923,23 @@ static void xen_release_ptpage(u32 pfn, unsigned level) | |||
| 923 | } | 923 | } | 
| 924 | } | 924 | } | 
| 925 | 925 | ||
| 926 | static void xen_release_pte(u32 pfn) | 926 | static void xen_release_pte(unsigned long pfn) | 
| 927 | { | 927 | { | 
| 928 | xen_release_ptpage(pfn, PT_PTE); | 928 | xen_release_ptpage(pfn, PT_PTE); | 
| 929 | } | 929 | } | 
| 930 | 930 | ||
| 931 | static void xen_release_pmd(u32 pfn) | 931 | static void xen_release_pmd(unsigned long pfn) | 
| 932 | { | 932 | { | 
| 933 | xen_release_ptpage(pfn, PT_PMD); | 933 | xen_release_ptpage(pfn, PT_PMD); | 
| 934 | } | 934 | } | 
| 935 | 935 | ||
| 936 | #if PAGETABLE_LEVELS == 4 | 936 | #if PAGETABLE_LEVELS == 4 | 
| 937 | static void xen_alloc_pud(struct mm_struct *mm, u32 pfn) | 937 | static void xen_alloc_pud(struct mm_struct *mm, unsigned long pfn) | 
| 938 | { | 938 | { | 
| 939 | xen_alloc_ptpage(mm, pfn, PT_PUD); | 939 | xen_alloc_ptpage(mm, pfn, PT_PUD); | 
| 940 | } | 940 | } | 
| 941 | 941 | ||
| 942 | static void xen_release_pud(u32 pfn) | 942 | static void xen_release_pud(unsigned long pfn) | 
| 943 | { | 943 | { | 
| 944 | xen_release_ptpage(pfn, PT_PUD); | 944 | xen_release_ptpage(pfn, PT_PUD); | 
| 945 | } | 945 | } | 
| diff --git a/drivers/accessibility/braille/braille_console.c b/drivers/accessibility/braille/braille_console.c index 0a5f6b2114c5..d672cfe7ca59 100644 --- a/drivers/accessibility/braille/braille_console.c +++ b/drivers/accessibility/braille/braille_console.c | |||
| @@ -376,6 +376,8 @@ int braille_register_console(struct console *console, int index, | |||
| 376 | console->flags |= CON_ENABLED; | 376 | console->flags |= CON_ENABLED; | 
| 377 | console->index = index; | 377 | console->index = index; | 
| 378 | braille_co = console; | 378 | braille_co = console; | 
| 379 | register_keyboard_notifier(&keyboard_notifier_block); | ||
| 380 | register_vt_notifier(&vt_notifier_block); | ||
| 379 | return 0; | 381 | return 0; | 
| 380 | } | 382 | } | 
| 381 | 383 | ||
| @@ -383,15 +385,8 @@ int braille_unregister_console(struct console *console) | |||
| 383 | { | 385 | { | 
| 384 | if (braille_co != console) | 386 | if (braille_co != console) | 
| 385 | return -EINVAL; | 387 | return -EINVAL; | 
| 388 | unregister_keyboard_notifier(&keyboard_notifier_block); | ||
| 389 | unregister_vt_notifier(&vt_notifier_block); | ||
| 386 | braille_co = NULL; | 390 | braille_co = NULL; | 
| 387 | return 0; | 391 | return 0; | 
| 388 | } | 392 | } | 
| 389 | |||
| 390 | static int __init braille_init(void) | ||
| 391 | { | ||
| 392 | register_keyboard_notifier(&keyboard_notifier_block); | ||
| 393 | register_vt_notifier(&vt_notifier_block); | ||
| 394 | return 0; | ||
| 395 | } | ||
| 396 | |||
| 397 | console_initcall(braille_init); | ||
| diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index 084109507c9f..8dd3336efd7e 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c | |||
| @@ -165,8 +165,11 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle) | |||
| 165 | "firmware_node"); | 165 | "firmware_node"); | 
| 166 | ret = sysfs_create_link(&acpi_dev->dev.kobj, &dev->kobj, | 166 | ret = sysfs_create_link(&acpi_dev->dev.kobj, &dev->kobj, | 
| 167 | "physical_node"); | 167 | "physical_node"); | 
| 168 | if (acpi_dev->wakeup.flags.valid) | 168 | if (acpi_dev->wakeup.flags.valid) { | 
| 169 | device_set_wakeup_capable(dev, true); | 169 | device_set_wakeup_capable(dev, true); | 
| 170 | device_set_wakeup_enable(dev, | ||
| 171 | acpi_dev->wakeup.state.enabled); | ||
| 172 | } | ||
| 170 | } | 173 | } | 
| 171 | 174 | ||
| 172 | return 0; | 175 | return 0; | 
| diff --git a/drivers/acpi/sleep/proc.c b/drivers/acpi/sleep/proc.c index 4ebbba2b6b19..bf5b04de02d1 100644 --- a/drivers/acpi/sleep/proc.c +++ b/drivers/acpi/sleep/proc.c | |||
| @@ -377,6 +377,14 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset) | |||
| 377 | return 0; | 377 | return 0; | 
| 378 | } | 378 | } | 
| 379 | 379 | ||
| 380 | static void physical_device_enable_wakeup(struct acpi_device *adev) | ||
| 381 | { | ||
| 382 | struct device *dev = acpi_get_physical_device(adev->handle); | ||
| 383 | |||
| 384 | if (dev && device_can_wakeup(dev)) | ||
| 385 | device_set_wakeup_enable(dev, adev->wakeup.state.enabled); | ||
| 386 | } | ||
| 387 | |||
| 380 | static ssize_t | 388 | static ssize_t | 
| 381 | acpi_system_write_wakeup_device(struct file *file, | 389 | acpi_system_write_wakeup_device(struct file *file, | 
| 382 | const char __user * buffer, | 390 | const char __user * buffer, | 
| @@ -411,6 +419,7 @@ acpi_system_write_wakeup_device(struct file *file, | |||
| 411 | } | 419 | } | 
| 412 | } | 420 | } | 
| 413 | if (found_dev) { | 421 | if (found_dev) { | 
| 422 | physical_device_enable_wakeup(found_dev); | ||
| 414 | list_for_each_safe(node, next, &acpi_wakeup_device_list) { | 423 | list_for_each_safe(node, next, &acpi_wakeup_device_list) { | 
| 415 | struct acpi_device *dev = container_of(node, | 424 | struct acpi_device *dev = container_of(node, | 
| 416 | struct | 425 | struct | 
| @@ -428,6 +437,7 @@ acpi_system_write_wakeup_device(struct file *file, | |||
| 428 | dev->pnp.bus_id, found_dev->pnp.bus_id); | 437 | dev->pnp.bus_id, found_dev->pnp.bus_id); | 
| 429 | dev->wakeup.state.enabled = | 438 | dev->wakeup.state.enabled = | 
| 430 | found_dev->wakeup.state.enabled; | 439 | found_dev->wakeup.state.enabled; | 
| 440 | physical_device_enable_wakeup(dev); | ||
| 431 | } | 441 | } | 
| 432 | } | 442 | } | 
| 433 | } | 443 | } | 
| diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c index 94df91771243..0778d99aea7c 100644 --- a/drivers/dma/dw_dmac.c +++ b/drivers/dma/dw_dmac.c | |||
| @@ -364,7 +364,7 @@ static void dw_dma_tasklet(unsigned long data) | |||
| 364 | int i; | 364 | int i; | 
| 365 | 365 | ||
| 366 | status_block = dma_readl(dw, RAW.BLOCK); | 366 | status_block = dma_readl(dw, RAW.BLOCK); | 
| 367 | status_xfer = dma_readl(dw, RAW.BLOCK); | 367 | status_xfer = dma_readl(dw, RAW.XFER); | 
| 368 | status_err = dma_readl(dw, RAW.ERROR); | 368 | status_err = dma_readl(dw, RAW.ERROR); | 
| 369 | 369 | ||
| 370 | dev_vdbg(dw->dma.dev, "tasklet: status_block=%x status_err=%x\n", | 370 | dev_vdbg(dw->dma.dev, "tasklet: status_block=%x status_err=%x\n", | 
| diff --git a/drivers/leds/leds-fsg.c b/drivers/leds/leds-fsg.c index be0e12144b8b..34935155c1c0 100644 --- a/drivers/leds/leds-fsg.c +++ b/drivers/leds/leds-fsg.c | |||
| @@ -161,6 +161,16 @@ static int fsg_led_probe(struct platform_device *pdev) | |||
| 161 | { | 161 | { | 
| 162 | int ret; | 162 | int ret; | 
| 163 | 163 | ||
| 164 | /* Map the LED chip select address space */ | ||
| 165 | latch_address = (unsigned short *) ioremap(IXP4XX_EXP_BUS_BASE(2), 512); | ||
| 166 | if (!latch_address) { | ||
| 167 | ret = -ENOMEM; | ||
| 168 | goto failremap; | ||
| 169 | } | ||
| 170 | |||
| 171 | latch_value = 0xffff; | ||
| 172 | *latch_address = latch_value; | ||
| 173 | |||
| 164 | ret = led_classdev_register(&pdev->dev, &fsg_wlan_led); | 174 | ret = led_classdev_register(&pdev->dev, &fsg_wlan_led); | 
| 165 | if (ret < 0) | 175 | if (ret < 0) | 
| 166 | goto failwlan; | 176 | goto failwlan; | 
| @@ -185,20 +195,8 @@ static int fsg_led_probe(struct platform_device *pdev) | |||
| 185 | if (ret < 0) | 195 | if (ret < 0) | 
| 186 | goto failring; | 196 | goto failring; | 
| 187 | 197 | ||
| 188 | /* Map the LED chip select address space */ | ||
| 189 | latch_address = (unsigned short *) ioremap(IXP4XX_EXP_BUS_BASE(2), 512); | ||
| 190 | if (!latch_address) { | ||
| 191 | ret = -ENOMEM; | ||
| 192 | goto failremap; | ||
| 193 | } | ||
| 194 | |||
| 195 | latch_value = 0xffff; | ||
| 196 | *latch_address = latch_value; | ||
| 197 | |||
| 198 | return ret; | 198 | return ret; | 
| 199 | 199 | ||
| 200 | failremap: | ||
| 201 | led_classdev_unregister(&fsg_ring_led); | ||
| 202 | failring: | 200 | failring: | 
| 203 | led_classdev_unregister(&fsg_sync_led); | 201 | led_classdev_unregister(&fsg_sync_led); | 
| 204 | failsync: | 202 | failsync: | 
| @@ -210,14 +208,14 @@ static int fsg_led_probe(struct platform_device *pdev) | |||
| 210 | failwan: | 208 | failwan: | 
| 211 | led_classdev_unregister(&fsg_wlan_led); | 209 | led_classdev_unregister(&fsg_wlan_led); | 
| 212 | failwlan: | 210 | failwlan: | 
| 211 | iounmap(latch_address); | ||
| 212 | failremap: | ||
| 213 | 213 | ||
| 214 | return ret; | 214 | return ret; | 
| 215 | } | 215 | } | 
| 216 | 216 | ||
| 217 | static int fsg_led_remove(struct platform_device *pdev) | 217 | static int fsg_led_remove(struct platform_device *pdev) | 
| 218 | { | 218 | { | 
| 219 | iounmap(latch_address); | ||
| 220 | |||
| 221 | led_classdev_unregister(&fsg_wlan_led); | 219 | led_classdev_unregister(&fsg_wlan_led); | 
| 222 | led_classdev_unregister(&fsg_wan_led); | 220 | led_classdev_unregister(&fsg_wan_led); | 
| 223 | led_classdev_unregister(&fsg_sata_led); | 221 | led_classdev_unregister(&fsg_sata_led); | 
| @@ -225,6 +223,8 @@ static int fsg_led_remove(struct platform_device *pdev) | |||
| 225 | led_classdev_unregister(&fsg_sync_led); | 223 | led_classdev_unregister(&fsg_sync_led); | 
| 226 | led_classdev_unregister(&fsg_ring_led); | 224 | led_classdev_unregister(&fsg_ring_led); | 
| 227 | 225 | ||
| 226 | iounmap(latch_address); | ||
| 227 | |||
| 228 | return 0; | 228 | return 0; | 
| 229 | } | 229 | } | 
| 230 | 230 | ||
| diff --git a/drivers/leds/leds-pca955x.c b/drivers/leds/leds-pca955x.c index 146c06972863..f508729123b5 100644 --- a/drivers/leds/leds-pca955x.c +++ b/drivers/leds/leds-pca955x.c | |||
| @@ -248,11 +248,10 @@ static int __devinit pca955x_probe(struct i2c_client *client, | |||
| 248 | const struct i2c_device_id *id) | 248 | const struct i2c_device_id *id) | 
| 249 | { | 249 | { | 
| 250 | struct pca955x_led *pca955x; | 250 | struct pca955x_led *pca955x; | 
| 251 | int i; | ||
| 252 | int err = -ENODEV; | ||
| 253 | struct pca955x_chipdef *chip; | 251 | struct pca955x_chipdef *chip; | 
| 254 | struct i2c_adapter *adapter; | 252 | struct i2c_adapter *adapter; | 
| 255 | struct led_platform_data *pdata; | 253 | struct led_platform_data *pdata; | 
| 254 | int i, err; | ||
| 256 | 255 | ||
| 257 | chip = &pca955x_chipdefs[id->driver_data]; | 256 | chip = &pca955x_chipdefs[id->driver_data]; | 
| 258 | adapter = to_i2c_adapter(client->dev.parent); | 257 | adapter = to_i2c_adapter(client->dev.parent); | 
| @@ -282,43 +281,41 @@ static int __devinit pca955x_probe(struct i2c_client *client, | |||
| 282 | } | 281 | } | 
| 283 | } | 282 | } | 
| 284 | 283 | ||
| 284 | pca955x = kzalloc(sizeof(*pca955x) * chip->bits, GFP_KERNEL); | ||
| 285 | if (!pca955x) | ||
| 286 | return -ENOMEM; | ||
| 287 | |||
| 288 | i2c_set_clientdata(client, pca955x); | ||
| 289 | |||
| 285 | for (i = 0; i < chip->bits; i++) { | 290 | for (i = 0; i < chip->bits; i++) { | 
| 286 | pca955x = kzalloc(sizeof(struct pca955x_led), GFP_KERNEL); | 291 | pca955x[i].chipdef = chip; | 
| 287 | if (!pca955x) { | 292 | pca955x[i].client = client; | 
| 288 | err = -ENOMEM; | 293 | pca955x[i].led_num = i; | 
| 289 | goto exit; | ||
| 290 | } | ||
| 291 | 294 | ||
| 292 | pca955x->chipdef = chip; | ||
| 293 | pca955x->client = client; | ||
| 294 | pca955x->led_num = i; | ||
| 295 | /* Platform data can specify LED names and default triggers */ | 295 | /* Platform data can specify LED names and default triggers */ | 
| 296 | if (pdata) { | 296 | if (pdata) { | 
| 297 | if (pdata->leds[i].name) | 297 | if (pdata->leds[i].name) | 
| 298 | snprintf(pca955x->name, 32, "pca955x:%s", | 298 | snprintf(pca955x[i].name, | 
| 299 | pdata->leds[i].name); | 299 | sizeof(pca955x[i].name), "pca955x:%s", | 
| 300 | pdata->leds[i].name); | ||
| 300 | if (pdata->leds[i].default_trigger) | 301 | if (pdata->leds[i].default_trigger) | 
| 301 | pca955x->led_cdev.default_trigger = | 302 | pca955x[i].led_cdev.default_trigger = | 
| 302 | pdata->leds[i].default_trigger; | 303 | pdata->leds[i].default_trigger; | 
| 303 | } else { | 304 | } else { | 
| 304 | snprintf(pca955x->name, 32, "pca955x:%d", i); | 305 | snprintf(pca955x[i].name, sizeof(pca955x[i].name), | 
| 306 | "pca955x:%d", i); | ||
| 305 | } | 307 | } | 
| 306 | spin_lock_init(&pca955x->lock); | ||
| 307 | 308 | ||
| 308 | pca955x->led_cdev.name = pca955x->name; | 309 | spin_lock_init(&pca955x[i].lock); | 
| 309 | pca955x->led_cdev.brightness_set = | ||
| 310 | pca955x_led_set; | ||
| 311 | 310 | ||
| 312 | /* | 311 | pca955x[i].led_cdev.name = pca955x[i].name; | 
| 313 | * Client data is a pointer to the _first_ pca955x_led | 312 | pca955x[i].led_cdev.brightness_set = pca955x_led_set; | 
| 314 | * struct | ||
| 315 | */ | ||
| 316 | if (i == 0) | ||
| 317 | i2c_set_clientdata(client, pca955x); | ||
| 318 | 313 | ||
| 319 | INIT_WORK(&(pca955x->work), pca955x_led_work); | 314 | INIT_WORK(&pca955x[i].work, pca955x_led_work); | 
| 320 | 315 | ||
| 321 | led_classdev_register(&client->dev, &(pca955x->led_cdev)); | 316 | err = led_classdev_register(&client->dev, &pca955x[i].led_cdev); | 
| 317 | if (err < 0) | ||
| 318 | goto exit; | ||
| 322 | } | 319 | } | 
| 323 | 320 | ||
| 324 | /* Turn off LEDs */ | 321 | /* Turn off LEDs */ | 
| @@ -336,23 +333,32 @@ static int __devinit pca955x_probe(struct i2c_client *client, | |||
| 336 | pca955x_write_psc(client, 1, 0); | 333 | pca955x_write_psc(client, 1, 0); | 
| 337 | 334 | ||
| 338 | return 0; | 335 | return 0; | 
| 336 | |||
| 339 | exit: | 337 | exit: | 
| 338 | while (i--) { | ||
| 339 | led_classdev_unregister(&pca955x[i].led_cdev); | ||
| 340 | cancel_work_sync(&pca955x[i].work); | ||
| 341 | } | ||
| 342 | |||
| 343 | kfree(pca955x); | ||
| 344 | i2c_set_clientdata(client, NULL); | ||
| 345 | |||
| 340 | return err; | 346 | return err; | 
| 341 | } | 347 | } | 
| 342 | 348 | ||
| 343 | static int __devexit pca955x_remove(struct i2c_client *client) | 349 | static int __devexit pca955x_remove(struct i2c_client *client) | 
| 344 | { | 350 | { | 
| 345 | struct pca955x_led *pca955x = i2c_get_clientdata(client); | 351 | struct pca955x_led *pca955x = i2c_get_clientdata(client); | 
| 346 | int leds = pca955x->chipdef->bits; | ||
| 347 | int i; | 352 | int i; | 
| 348 | 353 | ||
| 349 | for (i = 0; i < leds; i++) { | 354 | for (i = 0; i < pca955x->chipdef->bits; i++) { | 
| 350 | led_classdev_unregister(&(pca955x->led_cdev)); | 355 | led_classdev_unregister(&pca955x[i].led_cdev); | 
| 351 | cancel_work_sync(&(pca955x->work)); | 356 | cancel_work_sync(&pca955x[i].work); | 
| 352 | kfree(pca955x); | ||
| 353 | pca955x = pca955x + 1; | ||
| 354 | } | 357 | } | 
| 355 | 358 | ||
| 359 | kfree(pca955x); | ||
| 360 | i2c_set_clientdata(client, NULL); | ||
| 361 | |||
| 356 | return 0; | 362 | return 0; | 
| 357 | } | 363 | } | 
| 358 | 364 | ||
| diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index 71dd65aa31b6..c2fcf28b4c70 100644 --- a/drivers/md/dm-mpath.c +++ b/drivers/md/dm-mpath.c | |||
| @@ -63,6 +63,7 @@ struct multipath { | |||
| 63 | 63 | ||
| 64 | const char *hw_handler_name; | 64 | const char *hw_handler_name; | 
| 65 | struct work_struct activate_path; | 65 | struct work_struct activate_path; | 
| 66 | struct pgpath *pgpath_to_activate; | ||
| 66 | unsigned nr_priority_groups; | 67 | unsigned nr_priority_groups; | 
| 67 | struct list_head priority_groups; | 68 | struct list_head priority_groups; | 
| 68 | unsigned pg_init_required; /* pg_init needs calling? */ | 69 | unsigned pg_init_required; /* pg_init needs calling? */ | 
| @@ -146,6 +147,7 @@ static struct priority_group *alloc_priority_group(void) | |||
| 146 | 147 | ||
| 147 | static void free_pgpaths(struct list_head *pgpaths, struct dm_target *ti) | 148 | static void free_pgpaths(struct list_head *pgpaths, struct dm_target *ti) | 
| 148 | { | 149 | { | 
| 150 | unsigned long flags; | ||
| 149 | struct pgpath *pgpath, *tmp; | 151 | struct pgpath *pgpath, *tmp; | 
| 150 | struct multipath *m = ti->private; | 152 | struct multipath *m = ti->private; | 
| 151 | 153 | ||
| @@ -154,6 +156,10 @@ static void free_pgpaths(struct list_head *pgpaths, struct dm_target *ti) | |||
| 154 | if (m->hw_handler_name) | 156 | if (m->hw_handler_name) | 
| 155 | scsi_dh_detach(bdev_get_queue(pgpath->path.dev->bdev)); | 157 | scsi_dh_detach(bdev_get_queue(pgpath->path.dev->bdev)); | 
| 156 | dm_put_device(ti, pgpath->path.dev); | 158 | dm_put_device(ti, pgpath->path.dev); | 
| 159 | spin_lock_irqsave(&m->lock, flags); | ||
| 160 | if (m->pgpath_to_activate == pgpath) | ||
| 161 | m->pgpath_to_activate = NULL; | ||
| 162 | spin_unlock_irqrestore(&m->lock, flags); | ||
| 157 | free_pgpath(pgpath); | 163 | free_pgpath(pgpath); | 
| 158 | } | 164 | } | 
| 159 | } | 165 | } | 
| @@ -421,6 +427,7 @@ static void process_queued_ios(struct work_struct *work) | |||
| 421 | __choose_pgpath(m); | 427 | __choose_pgpath(m); | 
| 422 | 428 | ||
| 423 | pgpath = m->current_pgpath; | 429 | pgpath = m->current_pgpath; | 
| 430 | m->pgpath_to_activate = m->current_pgpath; | ||
| 424 | 431 | ||
| 425 | if ((pgpath && !m->queue_io) || | 432 | if ((pgpath && !m->queue_io) || | 
| 426 | (!pgpath && !m->queue_if_no_path)) | 433 | (!pgpath && !m->queue_if_no_path)) | 
| @@ -1093,8 +1100,15 @@ static void activate_path(struct work_struct *work) | |||
| 1093 | int ret; | 1100 | int ret; | 
| 1094 | struct multipath *m = | 1101 | struct multipath *m = | 
| 1095 | container_of(work, struct multipath, activate_path); | 1102 | container_of(work, struct multipath, activate_path); | 
| 1096 | struct dm_path *path = &m->current_pgpath->path; | 1103 | struct dm_path *path; | 
| 1104 | unsigned long flags; | ||
| 1097 | 1105 | ||
| 1106 | spin_lock_irqsave(&m->lock, flags); | ||
| 1107 | path = &m->pgpath_to_activate->path; | ||
| 1108 | m->pgpath_to_activate = NULL; | ||
| 1109 | spin_unlock_irqrestore(&m->lock, flags); | ||
| 1110 | if (!path) | ||
| 1111 | return; | ||
| 1098 | ret = scsi_dh_activate(bdev_get_queue(path->dev->bdev)); | 1112 | ret = scsi_dh_activate(bdev_get_queue(path->dev->bdev)); | 
| 1099 | pg_init_done(path, ret); | 1113 | pg_init_done(path, ret); | 
| 1100 | } | 1114 | } | 
| diff --git a/drivers/md/dm.c b/drivers/md/dm.c index bca448e11878..ace998ce59f6 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
| @@ -837,12 +837,14 @@ static int dm_merge_bvec(struct request_queue *q, | |||
| 837 | struct dm_table *map = dm_get_table(md); | 837 | struct dm_table *map = dm_get_table(md); | 
| 838 | struct dm_target *ti; | 838 | struct dm_target *ti; | 
| 839 | sector_t max_sectors; | 839 | sector_t max_sectors; | 
| 840 | int max_size; | 840 | int max_size = 0; | 
| 841 | 841 | ||
| 842 | if (unlikely(!map)) | 842 | if (unlikely(!map)) | 
| 843 | return 0; | 843 | goto out; | 
| 844 | 844 | ||
| 845 | ti = dm_table_find_target(map, bvm->bi_sector); | 845 | ti = dm_table_find_target(map, bvm->bi_sector); | 
| 846 | if (!dm_target_is_valid(ti)) | ||
| 847 | goto out_table; | ||
| 846 | 848 | ||
| 847 | /* | 849 | /* | 
| 848 | * Find maximum amount of I/O that won't need splitting | 850 | * Find maximum amount of I/O that won't need splitting | 
| @@ -861,14 +863,16 @@ static int dm_merge_bvec(struct request_queue *q, | |||
| 861 | if (max_size && ti->type->merge) | 863 | if (max_size && ti->type->merge) | 
| 862 | max_size = ti->type->merge(ti, bvm, biovec, max_size); | 864 | max_size = ti->type->merge(ti, bvm, biovec, max_size); | 
| 863 | 865 | ||
| 866 | out_table: | ||
| 867 | dm_table_put(map); | ||
| 868 | |||
| 869 | out: | ||
| 864 | /* | 870 | /* | 
| 865 | * Always allow an entire first page | 871 | * Always allow an entire first page | 
| 866 | */ | 872 | */ | 
| 867 | if (max_size <= biovec->bv_len && !(bvm->bi_size >> SECTOR_SHIFT)) | 873 | if (max_size <= biovec->bv_len && !(bvm->bi_size >> SECTOR_SHIFT)) | 
| 868 | max_size = biovec->bv_len; | 874 | max_size = biovec->bv_len; | 
| 869 | 875 | ||
| 870 | dm_table_put(map); | ||
| 871 | |||
| 872 | return max_size; | 876 | return max_size; | 
| 873 | } | 877 | } | 
| 874 | 878 | ||
| diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index 10c44d3fe01a..68dc8d9eb24e 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig | |||
| @@ -21,7 +21,7 @@ config MFD_SM501 | |||
| 21 | 21 | ||
| 22 | config MFD_SM501_GPIO | 22 | config MFD_SM501_GPIO | 
| 23 | bool "Export GPIO via GPIO layer" | 23 | bool "Export GPIO via GPIO layer" | 
| 24 | depends on MFD_SM501 && HAVE_GPIO_LIB | 24 | depends on MFD_SM501 && GPIOLIB | 
| 25 | ---help--- | 25 | ---help--- | 
| 26 | This option uses the gpio library layer to export the 64 GPIO | 26 | This option uses the gpio library layer to export the 64 GPIO | 
| 27 | lines on the SM501. The platform data is used to supply the | 27 | lines on the SM501. The platform data is used to supply the | 
| @@ -29,7 +29,7 @@ config MFD_SM501_GPIO | |||
| 29 | 29 | ||
| 30 | config MFD_ASIC3 | 30 | config MFD_ASIC3 | 
| 31 | bool "Support for Compaq ASIC3" | 31 | bool "Support for Compaq ASIC3" | 
| 32 | depends on GENERIC_HARDIRQS && HAVE_GPIO_LIB && ARM | 32 | depends on GENERIC_HARDIRQS && GPIOLIB && ARM | 
| 33 | ---help--- | 33 | ---help--- | 
| 34 | This driver supports the ASIC3 multifunction chip found on many | 34 | This driver supports the ASIC3 multifunction chip found on many | 
| 35 | PDAs (mainly iPAQ and HTC based ones) | 35 | PDAs (mainly iPAQ and HTC based ones) | 
| diff --git a/drivers/mfd/asic3.c b/drivers/mfd/asic3.c index bc2a807f210d..ba5aa2008273 100644 --- a/drivers/mfd/asic3.c +++ b/drivers/mfd/asic3.c | |||
| @@ -312,7 +312,6 @@ static int __init asic3_irq_probe(struct platform_device *pdev) | |||
| 312 | struct asic3 *asic = platform_get_drvdata(pdev); | 312 | struct asic3 *asic = platform_get_drvdata(pdev); | 
| 313 | unsigned long clksel = 0; | 313 | unsigned long clksel = 0; | 
| 314 | unsigned int irq, irq_base; | 314 | unsigned int irq, irq_base; | 
| 315 | int map_size; | ||
| 316 | int ret; | 315 | int ret; | 
| 317 | 316 | ||
| 318 | ret = platform_get_irq(pdev, 0); | 317 | ret = platform_get_irq(pdev, 0); | 
| @@ -534,6 +533,7 @@ static int __init asic3_probe(struct platform_device *pdev) | |||
| 534 | struct asic3 *asic; | 533 | struct asic3 *asic; | 
| 535 | struct resource *mem; | 534 | struct resource *mem; | 
| 536 | unsigned long clksel; | 535 | unsigned long clksel; | 
| 536 | int map_size; | ||
| 537 | int ret = 0; | 537 | int ret = 0; | 
| 538 | 538 | ||
| 539 | asic = kzalloc(sizeof(struct asic3), GFP_KERNEL); | 539 | asic = kzalloc(sizeof(struct asic3), GFP_KERNEL); | 
| diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h index ac4e506b4f88..5ea6b60fa377 100644 --- a/drivers/net/e1000e/e1000.h +++ b/drivers/net/e1000e/e1000.h | |||
| @@ -257,7 +257,6 @@ struct e1000_adapter { | |||
| 257 | struct net_device *netdev; | 257 | struct net_device *netdev; | 
| 258 | struct pci_dev *pdev; | 258 | struct pci_dev *pdev; | 
| 259 | struct net_device_stats net_stats; | 259 | struct net_device_stats net_stats; | 
| 260 | spinlock_t stats_lock; /* prevent concurrent stats updates */ | ||
| 261 | 260 | ||
| 262 | /* structs defined in e1000_hw.h */ | 261 | /* structs defined in e1000_hw.h */ | 
| 263 | struct e1000_hw hw; | 262 | struct e1000_hw hw; | 
| @@ -284,6 +283,8 @@ struct e1000_adapter { | |||
| 284 | unsigned long led_status; | 283 | unsigned long led_status; | 
| 285 | 284 | ||
| 286 | unsigned int flags; | 285 | unsigned int flags; | 
| 286 | struct work_struct downshift_task; | ||
| 287 | struct work_struct update_phy_task; | ||
| 287 | }; | 288 | }; | 
| 288 | 289 | ||
| 289 | struct e1000_info { | 290 | struct e1000_info { | 
| @@ -305,6 +306,7 @@ struct e1000_info { | |||
| 305 | #define FLAG_HAS_CTRLEXT_ON_LOAD (1 << 5) | 306 | #define FLAG_HAS_CTRLEXT_ON_LOAD (1 << 5) | 
| 306 | #define FLAG_HAS_SWSM_ON_LOAD (1 << 6) | 307 | #define FLAG_HAS_SWSM_ON_LOAD (1 << 6) | 
| 307 | #define FLAG_HAS_JUMBO_FRAMES (1 << 7) | 308 | #define FLAG_HAS_JUMBO_FRAMES (1 << 7) | 
| 309 | #define FLAG_READ_ONLY_NVM (1 << 8) | ||
| 308 | #define FLAG_IS_ICH (1 << 9) | 310 | #define FLAG_IS_ICH (1 << 9) | 
| 309 | #define FLAG_HAS_SMART_POWER_DOWN (1 << 11) | 311 | #define FLAG_HAS_SMART_POWER_DOWN (1 << 11) | 
| 310 | #define FLAG_IS_QUAD_PORT_A (1 << 12) | 312 | #define FLAG_IS_QUAD_PORT_A (1 << 12) | 
| @@ -385,6 +387,7 @@ extern bool e1000e_enable_mng_pass_thru(struct e1000_hw *hw); | |||
| 385 | extern bool e1000e_get_laa_state_82571(struct e1000_hw *hw); | 387 | extern bool e1000e_get_laa_state_82571(struct e1000_hw *hw); | 
| 386 | extern void e1000e_set_laa_state_82571(struct e1000_hw *hw, bool state); | 388 | extern void e1000e_set_laa_state_82571(struct e1000_hw *hw, bool state); | 
| 387 | 389 | ||
| 390 | extern void e1000e_write_protect_nvm_ich8lan(struct e1000_hw *hw); | ||
| 388 | extern void e1000e_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw, | 391 | extern void e1000e_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw, | 
| 389 | bool state); | 392 | bool state); | 
| 390 | extern void e1000e_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw); | 393 | extern void e1000e_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw); | 
| diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index e21c9e0f3738..33a3ff17b5d0 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c | |||
| @@ -432,6 +432,10 @@ static void e1000_get_regs(struct net_device *netdev, | |||
| 432 | regs_buff[11] = er32(TIDV); | 432 | regs_buff[11] = er32(TIDV); | 
| 433 | 433 | ||
| 434 | regs_buff[12] = adapter->hw.phy.type; /* PHY type (IGP=1, M88=0) */ | 434 | regs_buff[12] = adapter->hw.phy.type; /* PHY type (IGP=1, M88=0) */ | 
| 435 | |||
| 436 | /* ethtool doesn't use anything past this point, so all this | ||
| 437 | * code is likely legacy junk for apps that may or may not | ||
| 438 | * exist */ | ||
| 435 | if (hw->phy.type == e1000_phy_m88) { | 439 | if (hw->phy.type == e1000_phy_m88) { | 
| 436 | e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); | 440 | e1e_rphy(hw, M88E1000_PHY_SPEC_STATUS, &phy_data); | 
| 437 | regs_buff[13] = (u32)phy_data; /* cable length */ | 441 | regs_buff[13] = (u32)phy_data; /* cable length */ | 
| @@ -447,7 +451,7 @@ static void e1000_get_regs(struct net_device *netdev, | |||
| 447 | regs_buff[22] = adapter->phy_stats.receive_errors; | 451 | regs_buff[22] = adapter->phy_stats.receive_errors; | 
| 448 | regs_buff[23] = regs_buff[13]; /* mdix mode */ | 452 | regs_buff[23] = regs_buff[13]; /* mdix mode */ | 
| 449 | } | 453 | } | 
| 450 | regs_buff[21] = adapter->phy_stats.idle_errors; /* phy idle errors */ | 454 | regs_buff[21] = 0; /* was idle_errors */ | 
| 451 | e1e_rphy(hw, PHY_1000T_STATUS, &phy_data); | 455 | e1e_rphy(hw, PHY_1000T_STATUS, &phy_data); | 
| 452 | regs_buff[24] = (u32)phy_data; /* phy local receiver status */ | 456 | regs_buff[24] = (u32)phy_data; /* phy local receiver status */ | 
| 453 | regs_buff[25] = regs_buff[24]; /* phy remote receiver status */ | 457 | regs_buff[25] = regs_buff[24]; /* phy remote receiver status */ | 
| @@ -529,6 +533,9 @@ static int e1000_set_eeprom(struct net_device *netdev, | |||
| 529 | if (eeprom->magic != (adapter->pdev->vendor | (adapter->pdev->device << 16))) | 533 | if (eeprom->magic != (adapter->pdev->vendor | (adapter->pdev->device << 16))) | 
| 530 | return -EFAULT; | 534 | return -EFAULT; | 
| 531 | 535 | ||
| 536 | if (adapter->flags & FLAG_READ_ONLY_NVM) | ||
| 537 | return -EINVAL; | ||
| 538 | |||
| 532 | max_len = hw->nvm.word_size * 2; | 539 | max_len = hw->nvm.word_size * 2; | 
| 533 | 540 | ||
| 534 | first_word = eeprom->offset >> 1; | 541 | first_word = eeprom->offset >> 1; | 
| diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index 9e38452a738c..bcd2bc477af2 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c | |||
| @@ -58,6 +58,7 @@ | |||
| 58 | #define ICH_FLASH_HSFCTL 0x0006 | 58 | #define ICH_FLASH_HSFCTL 0x0006 | 
| 59 | #define ICH_FLASH_FADDR 0x0008 | 59 | #define ICH_FLASH_FADDR 0x0008 | 
| 60 | #define ICH_FLASH_FDATA0 0x0010 | 60 | #define ICH_FLASH_FDATA0 0x0010 | 
| 61 | #define ICH_FLASH_PR0 0x0074 | ||
| 61 | 62 | ||
| 62 | #define ICH_FLASH_READ_COMMAND_TIMEOUT 500 | 63 | #define ICH_FLASH_READ_COMMAND_TIMEOUT 500 | 
| 63 | #define ICH_FLASH_WRITE_COMMAND_TIMEOUT 500 | 64 | #define ICH_FLASH_WRITE_COMMAND_TIMEOUT 500 | 
| @@ -150,6 +151,19 @@ union ich8_hws_flash_regacc { | |||
| 150 | u16 regval; | 151 | u16 regval; | 
| 151 | }; | 152 | }; | 
| 152 | 153 | ||
| 154 | /* ICH Flash Protected Region */ | ||
| 155 | union ich8_flash_protected_range { | ||
| 156 | struct ich8_pr { | ||
| 157 | u32 base:13; /* 0:12 Protected Range Base */ | ||
| 158 | u32 reserved1:2; /* 13:14 Reserved */ | ||
| 159 | u32 rpe:1; /* 15 Read Protection Enable */ | ||
| 160 | u32 limit:13; /* 16:28 Protected Range Limit */ | ||
| 161 | u32 reserved2:2; /* 29:30 Reserved */ | ||
| 162 | u32 wpe:1; /* 31 Write Protection Enable */ | ||
| 163 | } range; | ||
| 164 | u32 regval; | ||
| 165 | }; | ||
| 166 | |||
| 153 | static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw); | 167 | static s32 e1000_setup_link_ich8lan(struct e1000_hw *hw); | 
| 154 | static void e1000_clear_hw_cntrs_ich8lan(struct e1000_hw *hw); | 168 | static void e1000_clear_hw_cntrs_ich8lan(struct e1000_hw *hw); | 
| 155 | static void e1000_initialize_hw_bits_ich8lan(struct e1000_hw *hw); | 169 | static void e1000_initialize_hw_bits_ich8lan(struct e1000_hw *hw); | 
| @@ -366,6 +380,9 @@ static s32 e1000_get_variants_ich8lan(struct e1000_adapter *adapter) | |||
| 366 | return 0; | 380 | return 0; | 
| 367 | } | 381 | } | 
| 368 | 382 | ||
| 383 | static DEFINE_MUTEX(nvm_mutex); | ||
| 384 | static pid_t nvm_owner = -1; | ||
| 385 | |||
| 369 | /** | 386 | /** | 
| 370 | * e1000_acquire_swflag_ich8lan - Acquire software control flag | 387 | * e1000_acquire_swflag_ich8lan - Acquire software control flag | 
| 371 | * @hw: pointer to the HW structure | 388 | * @hw: pointer to the HW structure | 
| @@ -379,6 +396,15 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) | |||
| 379 | u32 extcnf_ctrl; | 396 | u32 extcnf_ctrl; | 
| 380 | u32 timeout = PHY_CFG_TIMEOUT; | 397 | u32 timeout = PHY_CFG_TIMEOUT; | 
| 381 | 398 | ||
| 399 | might_sleep(); | ||
| 400 | |||
| 401 | if (!mutex_trylock(&nvm_mutex)) { | ||
| 402 | WARN(1, KERN_ERR "e1000e mutex contention. Owned by pid %d\n", | ||
| 403 | nvm_owner); | ||
| 404 | mutex_lock(&nvm_mutex); | ||
| 405 | } | ||
| 406 | nvm_owner = current->pid; | ||
| 407 | |||
| 382 | while (timeout) { | 408 | while (timeout) { | 
| 383 | extcnf_ctrl = er32(EXTCNF_CTRL); | 409 | extcnf_ctrl = er32(EXTCNF_CTRL); | 
| 384 | extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; | 410 | extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; | 
| @@ -393,6 +419,8 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) | |||
| 393 | 419 | ||
| 394 | if (!timeout) { | 420 | if (!timeout) { | 
| 395 | hw_dbg(hw, "FW or HW has locked the resource for too long.\n"); | 421 | hw_dbg(hw, "FW or HW has locked the resource for too long.\n"); | 
| 422 | nvm_owner = -1; | ||
| 423 | mutex_unlock(&nvm_mutex); | ||
| 396 | return -E1000_ERR_CONFIG; | 424 | return -E1000_ERR_CONFIG; | 
| 397 | } | 425 | } | 
| 398 | 426 | ||
| @@ -414,6 +442,9 @@ static void e1000_release_swflag_ich8lan(struct e1000_hw *hw) | |||
| 414 | extcnf_ctrl = er32(EXTCNF_CTRL); | 442 | extcnf_ctrl = er32(EXTCNF_CTRL); | 
| 415 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; | 443 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; | 
| 416 | ew32(EXTCNF_CTRL, extcnf_ctrl); | 444 | ew32(EXTCNF_CTRL, extcnf_ctrl); | 
| 445 | |||
| 446 | nvm_owner = -1; | ||
| 447 | mutex_unlock(&nvm_mutex); | ||
| 417 | } | 448 | } | 
| 418 | 449 | ||
| 419 | /** | 450 | /** | 
| @@ -1284,6 +1315,7 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
| 1284 | * programming failed. | 1315 | * programming failed. | 
| 1285 | */ | 1316 | */ | 
| 1286 | if (ret_val) { | 1317 | if (ret_val) { | 
| 1318 | /* Possibly read-only, see e1000e_write_protect_nvm_ich8lan() */ | ||
| 1287 | hw_dbg(hw, "Flash commit failed.\n"); | 1319 | hw_dbg(hw, "Flash commit failed.\n"); | 
| 1288 | e1000_release_swflag_ich8lan(hw); | 1320 | e1000_release_swflag_ich8lan(hw); | 
| 1289 | return ret_val; | 1321 | return ret_val; | 
| @@ -1374,6 +1406,49 @@ static s32 e1000_validate_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
| 1374 | } | 1406 | } | 
| 1375 | 1407 | ||
| 1376 | /** | 1408 | /** | 
| 1409 | * e1000e_write_protect_nvm_ich8lan - Make the NVM read-only | ||
| 1410 | * @hw: pointer to the HW structure | ||
| 1411 | * | ||
| 1412 | * To prevent malicious write/erase of the NVM, set it to be read-only | ||
| 1413 | * so that the hardware ignores all write/erase cycles of the NVM via | ||
| 1414 | * the flash control registers. The shadow-ram copy of the NVM will | ||
| 1415 | * still be updated, however any updates to this copy will not stick | ||
| 1416 | * across driver reloads. | ||
| 1417 | **/ | ||
| 1418 | void e1000e_write_protect_nvm_ich8lan(struct e1000_hw *hw) | ||
| 1419 | { | ||
| 1420 | union ich8_flash_protected_range pr0; | ||
| 1421 | union ich8_hws_flash_status hsfsts; | ||
| 1422 | u32 gfpreg; | ||
| 1423 | s32 ret_val; | ||
| 1424 | |||
| 1425 | ret_val = e1000_acquire_swflag_ich8lan(hw); | ||
| 1426 | if (ret_val) | ||
| 1427 | return; | ||
| 1428 | |||
| 1429 | gfpreg = er32flash(ICH_FLASH_GFPREG); | ||
| 1430 | |||
| 1431 | /* Write-protect GbE Sector of NVM */ | ||
| 1432 | pr0.regval = er32flash(ICH_FLASH_PR0); | ||
| 1433 | pr0.range.base = gfpreg & FLASH_GFPREG_BASE_MASK; | ||
| 1434 | pr0.range.limit = ((gfpreg >> 16) & FLASH_GFPREG_BASE_MASK); | ||
| 1435 | pr0.range.wpe = true; | ||
| 1436 | ew32flash(ICH_FLASH_PR0, pr0.regval); | ||
| 1437 | |||
| 1438 | /* | ||
| 1439 | * Lock down a subset of GbE Flash Control Registers, e.g. | ||
| 1440 | * PR0 to prevent the write-protection from being lifted. | ||
| 1441 | * Once FLOCKDN is set, the registers protected by it cannot | ||
| 1442 | * be written until FLOCKDN is cleared by a hardware reset. | ||
| 1443 | */ | ||
| 1444 | hsfsts.regval = er16flash(ICH_FLASH_HSFSTS); | ||
| 1445 | hsfsts.hsf_status.flockdn = true; | ||
| 1446 | ew32flash(ICH_FLASH_HSFSTS, hsfsts.regval); | ||
| 1447 | |||
| 1448 | e1000_release_swflag_ich8lan(hw); | ||
| 1449 | } | ||
| 1450 | |||
| 1451 | /** | ||
| 1377 | * e1000_write_flash_data_ich8lan - Writes bytes to the NVM | 1452 | * e1000_write_flash_data_ich8lan - Writes bytes to the NVM | 
| 1378 | * @hw: pointer to the HW structure | 1453 | * @hw: pointer to the HW structure | 
| 1379 | * @offset: The offset (in bytes) of the byte/word to read. | 1454 | * @offset: The offset (in bytes) of the byte/word to read. | 
| @@ -1720,6 +1795,9 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) | |||
| 1720 | ew32(CTRL, (ctrl | E1000_CTRL_RST)); | 1795 | ew32(CTRL, (ctrl | E1000_CTRL_RST)); | 
| 1721 | msleep(20); | 1796 | msleep(20); | 
| 1722 | 1797 | ||
| 1798 | /* release the swflag because it is not reset by hardware reset */ | ||
| 1799 | e1000_release_swflag_ich8lan(hw); | ||
| 1800 | |||
| 1723 | ret_val = e1000e_get_auto_rd_done(hw); | 1801 | ret_val = e1000e_get_auto_rd_done(hw); | 
| 1724 | if (ret_val) { | 1802 | if (ret_val) { | 
| 1725 | /* | 1803 | /* | 
| diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index d266510c8a94..b81c4237b5d3 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
| @@ -47,7 +47,7 @@ | |||
| 47 | 47 | ||
| 48 | #include "e1000.h" | 48 | #include "e1000.h" | 
| 49 | 49 | ||
| 50 | #define DRV_VERSION "0.3.3.3-k2" | 50 | #define DRV_VERSION "0.3.3.3-k6" | 
| 51 | char e1000e_driver_name[] = "e1000e"; | 51 | char e1000e_driver_name[] = "e1000e"; | 
| 52 | const char e1000e_driver_version[] = DRV_VERSION; | 52 | const char e1000e_driver_version[] = DRV_VERSION; | 
| 53 | 53 | ||
| @@ -1115,6 +1115,14 @@ static void e1000_clean_rx_ring(struct e1000_adapter *adapter) | |||
| 1115 | writel(0, adapter->hw.hw_addr + rx_ring->tail); | 1115 | writel(0, adapter->hw.hw_addr + rx_ring->tail); | 
| 1116 | } | 1116 | } | 
| 1117 | 1117 | ||
| 1118 | static void e1000e_downshift_workaround(struct work_struct *work) | ||
| 1119 | { | ||
| 1120 | struct e1000_adapter *adapter = container_of(work, | ||
| 1121 | struct e1000_adapter, downshift_task); | ||
| 1122 | |||
| 1123 | e1000e_gig_downshift_workaround_ich8lan(&adapter->hw); | ||
| 1124 | } | ||
| 1125 | |||
| 1118 | /** | 1126 | /** | 
| 1119 | * e1000_intr_msi - Interrupt Handler | 1127 | * e1000_intr_msi - Interrupt Handler | 
| 1120 | * @irq: interrupt number | 1128 | * @irq: interrupt number | 
| @@ -1139,7 +1147,7 @@ static irqreturn_t e1000_intr_msi(int irq, void *data) | |||
| 1139 | */ | 1147 | */ | 
| 1140 | if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) && | 1148 | if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) && | 
| 1141 | (!(er32(STATUS) & E1000_STATUS_LU))) | 1149 | (!(er32(STATUS) & E1000_STATUS_LU))) | 
| 1142 | e1000e_gig_downshift_workaround_ich8lan(hw); | 1150 | schedule_work(&adapter->downshift_task); | 
| 1143 | 1151 | ||
| 1144 | /* | 1152 | /* | 
| 1145 | * 80003ES2LAN workaround-- For packet buffer work-around on | 1153 | * 80003ES2LAN workaround-- For packet buffer work-around on | 
| @@ -1205,7 +1213,7 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
| 1205 | */ | 1213 | */ | 
| 1206 | if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) && | 1214 | if ((adapter->flags & FLAG_LSC_GIG_SPEED_DROP) && | 
| 1207 | (!(er32(STATUS) & E1000_STATUS_LU))) | 1215 | (!(er32(STATUS) & E1000_STATUS_LU))) | 
| 1208 | e1000e_gig_downshift_workaround_ich8lan(hw); | 1216 | schedule_work(&adapter->downshift_task); | 
| 1209 | 1217 | ||
| 1210 | /* | 1218 | /* | 
| 1211 | * 80003ES2LAN workaround-- | 1219 | * 80003ES2LAN workaround-- | 
| @@ -2592,8 +2600,6 @@ static int __devinit e1000_sw_init(struct e1000_adapter *adapter) | |||
| 2592 | /* Explicitly disable IRQ since the NIC can be in any state. */ | 2600 | /* Explicitly disable IRQ since the NIC can be in any state. */ | 
| 2593 | e1000_irq_disable(adapter); | 2601 | e1000_irq_disable(adapter); | 
| 2594 | 2602 | ||
| 2595 | spin_lock_init(&adapter->stats_lock); | ||
| 2596 | |||
| 2597 | set_bit(__E1000_DOWN, &adapter->state); | 2603 | set_bit(__E1000_DOWN, &adapter->state); | 
| 2598 | return 0; | 2604 | return 0; | 
| 2599 | 2605 | ||
| @@ -2912,6 +2918,21 @@ static int e1000_set_mac(struct net_device *netdev, void *p) | |||
| 2912 | return 0; | 2918 | return 0; | 
| 2913 | } | 2919 | } | 
| 2914 | 2920 | ||
| 2921 | /** | ||
| 2922 | * e1000e_update_phy_task - work thread to update phy | ||
| 2923 | * @work: pointer to our work struct | ||
| 2924 | * | ||
| 2925 | * this worker thread exists because we must acquire a | ||
| 2926 | * semaphore to read the phy, which we could msleep while | ||
| 2927 | * waiting for it, and we can't msleep in a timer. | ||
| 2928 | **/ | ||
| 2929 | static void e1000e_update_phy_task(struct work_struct *work) | ||
| 2930 | { | ||
| 2931 | struct e1000_adapter *adapter = container_of(work, | ||
| 2932 | struct e1000_adapter, update_phy_task); | ||
| 2933 | e1000_get_phy_info(&adapter->hw); | ||
| 2934 | } | ||
| 2935 | |||
| 2915 | /* | 2936 | /* | 
| 2916 | * Need to wait a few seconds after link up to get diagnostic information from | 2937 | * Need to wait a few seconds after link up to get diagnostic information from | 
| 2917 | * the phy | 2938 | * the phy | 
| @@ -2919,7 +2940,7 @@ static int e1000_set_mac(struct net_device *netdev, void *p) | |||
| 2919 | static void e1000_update_phy_info(unsigned long data) | 2940 | static void e1000_update_phy_info(unsigned long data) | 
| 2920 | { | 2941 | { | 
| 2921 | struct e1000_adapter *adapter = (struct e1000_adapter *) data; | 2942 | struct e1000_adapter *adapter = (struct e1000_adapter *) data; | 
| 2922 | e1000_get_phy_info(&adapter->hw); | 2943 | schedule_work(&adapter->update_phy_task); | 
| 2923 | } | 2944 | } | 
| 2924 | 2945 | ||
| 2925 | /** | 2946 | /** | 
| @@ -2930,10 +2951,6 @@ void e1000e_update_stats(struct e1000_adapter *adapter) | |||
| 2930 | { | 2951 | { | 
| 2931 | struct e1000_hw *hw = &adapter->hw; | 2952 | struct e1000_hw *hw = &adapter->hw; | 
| 2932 | struct pci_dev *pdev = adapter->pdev; | 2953 | struct pci_dev *pdev = adapter->pdev; | 
| 2933 | unsigned long irq_flags; | ||
| 2934 | u16 phy_tmp; | ||
| 2935 | |||
| 2936 | #define PHY_IDLE_ERROR_COUNT_MASK 0x00FF | ||
| 2937 | 2954 | ||
| 2938 | /* | 2955 | /* | 
| 2939 | * Prevent stats update while adapter is being reset, or if the pci | 2956 | * Prevent stats update while adapter is being reset, or if the pci | 
| @@ -2944,14 +2961,6 @@ void e1000e_update_stats(struct e1000_adapter *adapter) | |||
| 2944 | if (pci_channel_offline(pdev)) | 2961 | if (pci_channel_offline(pdev)) | 
| 2945 | return; | 2962 | return; | 
| 2946 | 2963 | ||
| 2947 | spin_lock_irqsave(&adapter->stats_lock, irq_flags); | ||
| 2948 | |||
| 2949 | /* | ||
| 2950 | * these counters are modified from e1000_adjust_tbi_stats, | ||
| 2951 | * called from the interrupt context, so they must only | ||
| 2952 | * be written while holding adapter->stats_lock | ||
| 2953 | */ | ||
| 2954 | |||
| 2955 | adapter->stats.crcerrs += er32(CRCERRS); | 2964 | adapter->stats.crcerrs += er32(CRCERRS); | 
| 2956 | adapter->stats.gprc += er32(GPRC); | 2965 | adapter->stats.gprc += er32(GPRC); | 
| 2957 | adapter->stats.gorc += er32(GORCL); | 2966 | adapter->stats.gorc += er32(GORCL); | 
| @@ -3022,21 +3031,10 @@ void e1000e_update_stats(struct e1000_adapter *adapter) | |||
| 3022 | 3031 | ||
| 3023 | /* Tx Dropped needs to be maintained elsewhere */ | 3032 | /* Tx Dropped needs to be maintained elsewhere */ | 
| 3024 | 3033 | ||
| 3025 | /* Phy Stats */ | ||
| 3026 | if (hw->phy.media_type == e1000_media_type_copper) { | ||
| 3027 | if ((adapter->link_speed == SPEED_1000) && | ||
| 3028 | (!e1e_rphy(hw, PHY_1000T_STATUS, &phy_tmp))) { | ||
| 3029 | phy_tmp &= PHY_IDLE_ERROR_COUNT_MASK; | ||
| 3030 | adapter->phy_stats.idle_errors += phy_tmp; | ||
| 3031 | } | ||
| 3032 | } | ||
| 3033 | |||
| 3034 | /* Management Stats */ | 3034 | /* Management Stats */ | 
| 3035 | adapter->stats.mgptc += er32(MGTPTC); | 3035 | adapter->stats.mgptc += er32(MGTPTC); | 
| 3036 | adapter->stats.mgprc += er32(MGTPRC); | 3036 | adapter->stats.mgprc += er32(MGTPRC); | 
| 3037 | adapter->stats.mgpdc += er32(MGTPDC); | 3037 | adapter->stats.mgpdc += er32(MGTPDC); | 
| 3038 | |||
| 3039 | spin_unlock_irqrestore(&adapter->stats_lock, irq_flags); | ||
| 3040 | } | 3038 | } | 
| 3041 | 3039 | ||
| 3042 | /** | 3040 | /** | 
| @@ -3048,10 +3046,6 @@ static void e1000_phy_read_status(struct e1000_adapter *adapter) | |||
| 3048 | struct e1000_hw *hw = &adapter->hw; | 3046 | struct e1000_hw *hw = &adapter->hw; | 
| 3049 | struct e1000_phy_regs *phy = &adapter->phy_regs; | 3047 | struct e1000_phy_regs *phy = &adapter->phy_regs; | 
| 3050 | int ret_val; | 3048 | int ret_val; | 
| 3051 | unsigned long irq_flags; | ||
| 3052 | |||
| 3053 | |||
| 3054 | spin_lock_irqsave(&adapter->stats_lock, irq_flags); | ||
| 3055 | 3049 | ||
| 3056 | if ((er32(STATUS) & E1000_STATUS_LU) && | 3050 | if ((er32(STATUS) & E1000_STATUS_LU) && | 
| 3057 | (adapter->hw.phy.media_type == e1000_media_type_copper)) { | 3051 | (adapter->hw.phy.media_type == e1000_media_type_copper)) { | 
| @@ -3082,8 +3076,6 @@ static void e1000_phy_read_status(struct e1000_adapter *adapter) | |||
| 3082 | phy->stat1000 = 0; | 3076 | phy->stat1000 = 0; | 
| 3083 | phy->estatus = (ESTATUS_1000_TFULL | ESTATUS_1000_THALF); | 3077 | phy->estatus = (ESTATUS_1000_TFULL | ESTATUS_1000_THALF); | 
| 3084 | } | 3078 | } | 
| 3085 | |||
| 3086 | spin_unlock_irqrestore(&adapter->stats_lock, irq_flags); | ||
| 3087 | } | 3079 | } | 
| 3088 | 3080 | ||
| 3089 | static void e1000_print_link_info(struct e1000_adapter *adapter) | 3081 | static void e1000_print_link_info(struct e1000_adapter *adapter) | 
| @@ -4467,6 +4459,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 4467 | 4459 | ||
| 4468 | adapter->bd_number = cards_found++; | 4460 | adapter->bd_number = cards_found++; | 
| 4469 | 4461 | ||
| 4462 | e1000e_check_options(adapter); | ||
| 4463 | |||
| 4470 | /* setup adapter struct */ | 4464 | /* setup adapter struct */ | 
| 4471 | err = e1000_sw_init(adapter); | 4465 | err = e1000_sw_init(adapter); | 
| 4472 | if (err) | 4466 | if (err) | 
| @@ -4482,6 +4476,10 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 4482 | if (err) | 4476 | if (err) | 
| 4483 | goto err_hw_init; | 4477 | goto err_hw_init; | 
| 4484 | 4478 | ||
| 4479 | if ((adapter->flags & FLAG_IS_ICH) && | ||
| 4480 | (adapter->flags & FLAG_READ_ONLY_NVM)) | ||
| 4481 | e1000e_write_protect_nvm_ich8lan(&adapter->hw); | ||
| 4482 | |||
| 4485 | hw->mac.ops.get_bus_info(&adapter->hw); | 4483 | hw->mac.ops.get_bus_info(&adapter->hw); | 
| 4486 | 4484 | ||
| 4487 | adapter->hw.phy.autoneg_wait_to_complete = 0; | 4485 | adapter->hw.phy.autoneg_wait_to_complete = 0; | 
| @@ -4572,8 +4570,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 4572 | 4570 | ||
| 4573 | INIT_WORK(&adapter->reset_task, e1000_reset_task); | 4571 | INIT_WORK(&adapter->reset_task, e1000_reset_task); | 
| 4574 | INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task); | 4572 | INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task); | 
| 4575 | 4573 | INIT_WORK(&adapter->downshift_task, e1000e_downshift_workaround); | |
| 4576 | e1000e_check_options(adapter); | 4574 | INIT_WORK(&adapter->update_phy_task, e1000e_update_phy_task); | 
| 4577 | 4575 | ||
| 4578 | /* Initialize link parameters. User can change them with ethtool */ | 4576 | /* Initialize link parameters. User can change them with ethtool */ | 
| 4579 | adapter->hw.mac.autoneg = 1; | 4577 | adapter->hw.mac.autoneg = 1; | 
| diff --git a/drivers/net/e1000e/param.c b/drivers/net/e1000e/param.c index ed912e023a72..d91dbf7ba434 100644 --- a/drivers/net/e1000e/param.c +++ b/drivers/net/e1000e/param.c | |||
| @@ -133,6 +133,15 @@ E1000_PARAM(SmartPowerDownEnable, "Enable PHY smart power down"); | |||
| 133 | */ | 133 | */ | 
| 134 | E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround"); | 134 | E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround"); | 
| 135 | 135 | ||
| 136 | /* | ||
| 137 | * Write Protect NVM | ||
| 138 | * | ||
| 139 | * Valid Range: 0, 1 | ||
| 140 | * | ||
| 141 | * Default Value: 1 (enabled) | ||
| 142 | */ | ||
| 143 | E1000_PARAM(WriteProtectNVM, "Write-protect NVM [WARNING: disabling this can lead to corrupted NVM]"); | ||
| 144 | |||
| 136 | struct e1000_option { | 145 | struct e1000_option { | 
| 137 | enum { enable_option, range_option, list_option } type; | 146 | enum { enable_option, range_option, list_option } type; | 
| 138 | const char *name; | 147 | const char *name; | 
| @@ -388,4 +397,25 @@ void __devinit e1000e_check_options(struct e1000_adapter *adapter) | |||
| 388 | opt.def); | 397 | opt.def); | 
| 389 | } | 398 | } | 
| 390 | } | 399 | } | 
| 400 | { /* Write-protect NVM */ | ||
| 401 | const struct e1000_option opt = { | ||
| 402 | .type = enable_option, | ||
| 403 | .name = "Write-protect NVM", | ||
| 404 | .err = "defaulting to Enabled", | ||
| 405 | .def = OPTION_ENABLED | ||
| 406 | }; | ||
| 407 | |||
| 408 | if (adapter->flags & FLAG_IS_ICH) { | ||
| 409 | if (num_WriteProtectNVM > bd) { | ||
| 410 | unsigned int write_protect_nvm = WriteProtectNVM[bd]; | ||
| 411 | e1000_validate_option(&write_protect_nvm, &opt, | ||
| 412 | adapter); | ||
| 413 | if (write_protect_nvm) | ||
| 414 | adapter->flags |= FLAG_READ_ONLY_NVM; | ||
| 415 | } else { | ||
| 416 | if (opt.def) | ||
| 417 | adapter->flags |= FLAG_READ_ONLY_NVM; | ||
| 418 | } | ||
| 419 | } | ||
| 420 | } | ||
| 391 | } | 421 | } | 
| diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 9c718583a237..77baff022f71 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | 16 | ||
| 17 | 17 | ||
| 18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> | 
| 19 | #include <linux/sched.h> | ||
| 19 | #include <linux/pci.h> | 20 | #include <linux/pci.h> | 
| 20 | #include <linux/stat.h> | 21 | #include <linux/stat.h> | 
| 21 | #include <linux/topology.h> | 22 | #include <linux/topology.h> | 
| @@ -484,6 +485,21 @@ pci_mmap_legacy_mem(struct kobject *kobj, struct bin_attribute *attr, | |||
| 484 | #endif /* HAVE_PCI_LEGACY */ | 485 | #endif /* HAVE_PCI_LEGACY */ | 
| 485 | 486 | ||
| 486 | #ifdef HAVE_PCI_MMAP | 487 | #ifdef HAVE_PCI_MMAP | 
| 488 | |||
| 489 | static int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma) | ||
| 490 | { | ||
| 491 | unsigned long nr, start, size; | ||
| 492 | |||
| 493 | nr = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; | ||
| 494 | start = vma->vm_pgoff; | ||
| 495 | size = pci_resource_len(pdev, resno) >> PAGE_SHIFT; | ||
| 496 | if (start < size && size - start >= nr) | ||
| 497 | return 1; | ||
| 498 | WARN(1, "process \"%s\" tried to map 0x%08lx-0x%08lx on %s BAR %d (size 0x%08lx)\n", | ||
| 499 | current->comm, start, start+nr, pci_name(pdev), resno, size); | ||
| 500 | return 0; | ||
| 501 | } | ||
| 502 | |||
| 487 | /** | 503 | /** | 
| 488 | * pci_mmap_resource - map a PCI resource into user memory space | 504 | * pci_mmap_resource - map a PCI resource into user memory space | 
| 489 | * @kobj: kobject for mapping | 505 | * @kobj: kobject for mapping | 
| @@ -510,6 +526,9 @@ pci_mmap_resource(struct kobject *kobj, struct bin_attribute *attr, | |||
| 510 | if (i >= PCI_ROM_RESOURCE) | 526 | if (i >= PCI_ROM_RESOURCE) | 
| 511 | return -ENODEV; | 527 | return -ENODEV; | 
| 512 | 528 | ||
| 529 | if (!pci_mmap_fits(pdev, i, vma)) | ||
| 530 | return -EINVAL; | ||
| 531 | |||
| 513 | /* pci_mmap_page_range() expects the same kind of entry as coming | 532 | /* pci_mmap_page_range() expects the same kind of entry as coming | 
| 514 | * from /proc/bus/pci/ which is a "user visible" value. If this is | 533 | * from /proc/bus/pci/ which is a "user visible" value. If this is | 
| 515 | * different from the resource itself, arch will do necessary fixup. | 534 | * different from the resource itself, arch will do necessary fixup. | 
| diff --git a/drivers/rtc/rtc-dev.c b/drivers/rtc/rtc-dev.c index f118252f3a9f..52e2743b04ec 100644 --- a/drivers/rtc/rtc-dev.c +++ b/drivers/rtc/rtc-dev.c | |||
| @@ -422,6 +422,12 @@ done: | |||
| 422 | return err; | 422 | return err; | 
| 423 | } | 423 | } | 
| 424 | 424 | ||
| 425 | static int rtc_dev_fasync(int fd, struct file *file, int on) | ||
| 426 | { | ||
| 427 | struct rtc_device *rtc = file->private_data; | ||
| 428 | return fasync_helper(fd, file, on, &rtc->async_queue); | ||
| 429 | } | ||
| 430 | |||
| 425 | static int rtc_dev_release(struct inode *inode, struct file *file) | 431 | static int rtc_dev_release(struct inode *inode, struct file *file) | 
| 426 | { | 432 | { | 
| 427 | struct rtc_device *rtc = file->private_data; | 433 | struct rtc_device *rtc = file->private_data; | 
| @@ -434,16 +440,13 @@ static int rtc_dev_release(struct inode *inode, struct file *file) | |||
| 434 | if (rtc->ops->release) | 440 | if (rtc->ops->release) | 
| 435 | rtc->ops->release(rtc->dev.parent); | 441 | rtc->ops->release(rtc->dev.parent); | 
| 436 | 442 | ||
| 443 | if (file->f_flags & FASYNC) | ||
| 444 | rtc_dev_fasync(-1, file, 0); | ||
| 445 | |||
| 437 | clear_bit_unlock(RTC_DEV_BUSY, &rtc->flags); | 446 | clear_bit_unlock(RTC_DEV_BUSY, &rtc->flags); | 
| 438 | return 0; | 447 | return 0; | 
| 439 | } | 448 | } | 
| 440 | 449 | ||
| 441 | static int rtc_dev_fasync(int fd, struct file *file, int on) | ||
| 442 | { | ||
| 443 | struct rtc_device *rtc = file->private_data; | ||
| 444 | return fasync_helper(fd, file, on, &rtc->async_queue); | ||
| 445 | } | ||
| 446 | |||
| 447 | static const struct file_operations rtc_dev_fops = { | 450 | static const struct file_operations rtc_dev_fops = { | 
| 448 | .owner = THIS_MODULE, | 451 | .owner = THIS_MODULE, | 
| 449 | .llseek = no_llseek, | 452 | .llseek = no_llseek, | 
| diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c index 1679e2f91c94..a0b6b46e7466 100644 --- a/drivers/s390/cio/qdio_setup.c +++ b/drivers/s390/cio/qdio_setup.c | |||
| @@ -447,51 +447,36 @@ void qdio_print_subchannel_info(struct qdio_irq *irq_ptr, | |||
| 447 | { | 447 | { | 
| 448 | char s[80]; | 448 | char s[80]; | 
| 449 | 449 | ||
| 450 | sprintf(s, "%s sc:%x ", cdev->dev.bus_id, irq_ptr->schid.sch_no); | 450 | sprintf(s, "qdio: %s ", dev_name(&cdev->dev)); | 
| 451 | |||
| 452 | switch (irq_ptr->qib.qfmt) { | 451 | switch (irq_ptr->qib.qfmt) { | 
| 453 | case QDIO_QETH_QFMT: | 452 | case QDIO_QETH_QFMT: | 
| 454 | sprintf(s + strlen(s), "OSADE "); | 453 | sprintf(s + strlen(s), "OSA "); | 
| 455 | break; | 454 | break; | 
| 456 | case QDIO_ZFCP_QFMT: | 455 | case QDIO_ZFCP_QFMT: | 
| 457 | sprintf(s + strlen(s), "ZFCP "); | 456 | sprintf(s + strlen(s), "ZFCP "); | 
| 458 | break; | 457 | break; | 
| 459 | case QDIO_IQDIO_QFMT: | 458 | case QDIO_IQDIO_QFMT: | 
| 460 | sprintf(s + strlen(s), "HiperSockets "); | 459 | sprintf(s + strlen(s), "HS "); | 
| 461 | break; | 460 | break; | 
| 462 | } | 461 | } | 
| 463 | sprintf(s + strlen(s), "using: "); | 462 | sprintf(s + strlen(s), "on SC %x using ", irq_ptr->schid.sch_no); | 
| 464 | 463 | sprintf(s + strlen(s), "AI:%d ", is_thinint_irq(irq_ptr)); | |
| 465 | if (!is_thinint_irq(irq_ptr)) | 464 | sprintf(s + strlen(s), "QEBSM:%d ", (irq_ptr->sch_token) ? 1 : 0); | 
| 466 | sprintf(s + strlen(s), "no"); | 465 | sprintf(s + strlen(s), "PCI:%d ", | 
| 467 | sprintf(s + strlen(s), "AdapterInterrupts "); | 466 | (irq_ptr->qib.ac & QIB_AC_OUTBOUND_PCI_SUPPORTED) ? 1 : 0); | 
| 468 | if (!(irq_ptr->sch_token != 0)) | 467 | sprintf(s + strlen(s), "TDD:%d ", css_general_characteristics.aif_tdd); | 
| 469 | sprintf(s + strlen(s), "no"); | 468 | sprintf(s + strlen(s), "SIGA:"); | 
| 470 | sprintf(s + strlen(s), "QEBSM "); | 469 | sprintf(s + strlen(s), "%s", (irq_ptr->siga_flag.input) ? "R" : " "); | 
| 471 | if (!(irq_ptr->qib.ac & QIB_AC_OUTBOUND_PCI_SUPPORTED)) | 470 | sprintf(s + strlen(s), "%s", (irq_ptr->siga_flag.output) ? "W" : " "); | 
| 472 | sprintf(s + strlen(s), "no"); | 471 | sprintf(s + strlen(s), "%s", (irq_ptr->siga_flag.sync) ? "S" : " "); | 
| 473 | sprintf(s + strlen(s), "OutboundPCI "); | 472 | sprintf(s + strlen(s), "%s", | 
| 474 | if (!css_general_characteristics.aif_tdd) | 473 | (!irq_ptr->siga_flag.no_sync_ti) ? "A" : " "); | 
| 475 | sprintf(s + strlen(s), "no"); | 474 | sprintf(s + strlen(s), "%s", | 
| 476 | sprintf(s + strlen(s), "TDD\n"); | 475 | (!irq_ptr->siga_flag.no_sync_out_ti) ? "O" : " "); | 
| 477 | printk(KERN_INFO "qdio: %s", s); | 476 | sprintf(s + strlen(s), "%s", | 
| 478 | 477 | (!irq_ptr->siga_flag.no_sync_out_pci) ? "P" : " "); | |
| 479 | memset(s, 0, sizeof(s)); | ||
| 480 | sprintf(s, "%s SIGA required: ", cdev->dev.bus_id); | ||
| 481 | if (irq_ptr->siga_flag.input) | ||
| 482 | sprintf(s + strlen(s), "Read "); | ||
| 483 | if (irq_ptr->siga_flag.output) | ||
| 484 | sprintf(s + strlen(s), "Write "); | ||
| 485 | if (irq_ptr->siga_flag.sync) | ||
| 486 | sprintf(s + strlen(s), "Sync "); | ||
| 487 | if (!irq_ptr->siga_flag.no_sync_ti) | ||
| 488 | sprintf(s + strlen(s), "SyncAI "); | ||
| 489 | if (!irq_ptr->siga_flag.no_sync_out_ti) | ||
| 490 | sprintf(s + strlen(s), "SyncOutAI "); | ||
| 491 | if (!irq_ptr->siga_flag.no_sync_out_pci) | ||
| 492 | sprintf(s + strlen(s), "SyncOutPCI"); | ||
| 493 | sprintf(s + strlen(s), "\n"); | 478 | sprintf(s + strlen(s), "\n"); | 
| 494 | printk(KERN_INFO "qdio: %s", s); | 479 | printk(KERN_INFO "%s", s); | 
| 495 | } | 480 | } | 
| 496 | 481 | ||
| 497 | int __init qdio_setup_init(void) | 482 | int __init qdio_setup_init(void) | 
| diff --git a/drivers/spi/orion_spi.c b/drivers/spi/orion_spi.c index c4eaacd6e553..b872bfaf4bd2 100644 --- a/drivers/spi/orion_spi.c +++ b/drivers/spi/orion_spi.c | |||
| @@ -427,7 +427,7 @@ static int orion_spi_transfer(struct spi_device *spi, struct spi_message *m) | |||
| 427 | goto msg_rejected; | 427 | goto msg_rejected; | 
| 428 | } | 428 | } | 
| 429 | 429 | ||
| 430 | if (t->speed_hz < orion_spi->min_speed) { | 430 | if (t->speed_hz && t->speed_hz < orion_spi->min_speed) { | 
| 431 | dev_err(&spi->dev, | 431 | dev_err(&spi->dev, | 
| 432 | "message rejected : " | 432 | "message rejected : " | 
| 433 | "device min speed (%d Hz) exceeds " | 433 | "device min speed (%d Hz) exceeds " | 
| diff --git a/drivers/spi/pxa2xx_spi.c b/drivers/spi/pxa2xx_spi.c index 0e53354c1cfe..d47d3636227f 100644 --- a/drivers/spi/pxa2xx_spi.c +++ b/drivers/spi/pxa2xx_spi.c | |||
| @@ -49,7 +49,7 @@ MODULE_ALIAS("platform:pxa2xx-spi"); | |||
| 49 | 49 | ||
| 50 | #define DMA_INT_MASK (DCSR_ENDINTR | DCSR_STARTINTR | DCSR_BUSERR) | 50 | #define DMA_INT_MASK (DCSR_ENDINTR | DCSR_STARTINTR | DCSR_BUSERR) | 
| 51 | #define RESET_DMA_CHANNEL (DCSR_NODESC | DMA_INT_MASK) | 51 | #define RESET_DMA_CHANNEL (DCSR_NODESC | DMA_INT_MASK) | 
| 52 | #define IS_DMA_ALIGNED(x) (((x) & 0x07) == 0) | 52 | #define IS_DMA_ALIGNED(x) ((((u32)(x)) & 0x07) == 0) | 
| 53 | #define MAX_DMA_LEN 8191 | 53 | #define MAX_DMA_LEN 8191 | 
| 54 | 54 | ||
| 55 | /* | 55 | /* | 
| @@ -896,7 +896,7 @@ static void pump_transfers(unsigned long data) | |||
| 896 | || transfer->rx_dma || transfer->tx_dma) { | 896 | || transfer->rx_dma || transfer->tx_dma) { | 
| 897 | dev_err(&drv_data->pdev->dev, | 897 | dev_err(&drv_data->pdev->dev, | 
| 898 | "pump_transfers: mapped transfer length " | 898 | "pump_transfers: mapped transfer length " | 
| 899 | "of %lu is greater than %d\n", | 899 | "of %u is greater than %d\n", | 
| 900 | transfer->len, MAX_DMA_LEN); | 900 | transfer->len, MAX_DMA_LEN); | 
| 901 | message->status = -EINVAL; | 901 | message->status = -EINVAL; | 
| 902 | giveback(drv_data); | 902 | giveback(drv_data); | 
| diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index c6299e8a041d..9cbff84b787d 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
| @@ -2400,11 +2400,15 @@ static int fbcon_blank(struct vc_data *vc, int blank, int mode_switch) | |||
| 2400 | 2400 | ||
| 2401 | if (!fbcon_is_inactive(vc, info)) { | 2401 | if (!fbcon_is_inactive(vc, info)) { | 
| 2402 | if (ops->blank_state != blank) { | 2402 | if (ops->blank_state != blank) { | 
| 2403 | int ret = 1; | ||
| 2404 | |||
| 2403 | ops->blank_state = blank; | 2405 | ops->blank_state = blank; | 
| 2404 | fbcon_cursor(vc, blank ? CM_ERASE : CM_DRAW); | 2406 | fbcon_cursor(vc, blank ? CM_ERASE : CM_DRAW); | 
| 2405 | ops->cursor_flash = (!blank); | 2407 | ops->cursor_flash = (!blank); | 
| 2406 | 2408 | ||
| 2407 | if (fb_blank(info, blank)) | 2409 | if (info->fbops->fb_blank) | 
| 2410 | ret = info->fbops->fb_blank(blank, info); | ||
| 2411 | if (ret) | ||
| 2408 | fbcon_generic_blank(vc, info, blank); | 2412 | fbcon_generic_blank(vc, info, blank); | 
| 2409 | } | 2413 | } | 
| 2410 | 2414 | ||
| diff --git a/drivers/video/console/fbcon.h b/drivers/video/console/fbcon.h index a6e38e9ea73f..89a346880ec0 100644 --- a/drivers/video/console/fbcon.h +++ b/drivers/video/console/fbcon.h | |||
| @@ -110,7 +110,7 @@ static inline int mono_col(const struct fb_info *info) | |||
| 110 | __u32 max_len; | 110 | __u32 max_len; | 
| 111 | max_len = max(info->var.green.length, info->var.red.length); | 111 | max_len = max(info->var.green.length, info->var.red.length); | 
| 112 | max_len = max(info->var.blue.length, max_len); | 112 | max_len = max(info->var.blue.length, max_len); | 
| 113 | return ~(0xfff << (max_len & 0xff)); | 113 | return (~(0xfff << max_len)) & 0xff; | 
| 114 | } | 114 | } | 
| 115 | 115 | ||
| 116 | static inline int attr_col_ec(int shift, struct vc_data *vc, | 116 | static inline int attr_col_ec(int shift, struct vc_data *vc, | 
| diff --git a/fs/inotify_user.c b/fs/inotify_user.c index 60249429a253..d85c7d931cdf 100644 --- a/fs/inotify_user.c +++ b/fs/inotify_user.c | |||
| @@ -323,7 +323,7 @@ out: | |||
| 323 | } | 323 | } | 
| 324 | 324 | ||
| 325 | /* | 325 | /* | 
| 326 | * remove_kevent - cleans up and ultimately frees the given kevent | 326 | * remove_kevent - cleans up the given kevent | 
| 327 | * | 327 | * | 
| 328 | * Caller must hold dev->ev_mutex. | 328 | * Caller must hold dev->ev_mutex. | 
| 329 | */ | 329 | */ | 
| @@ -334,7 +334,13 @@ static void remove_kevent(struct inotify_device *dev, | |||
| 334 | 334 | ||
| 335 | dev->event_count--; | 335 | dev->event_count--; | 
| 336 | dev->queue_size -= sizeof(struct inotify_event) + kevent->event.len; | 336 | dev->queue_size -= sizeof(struct inotify_event) + kevent->event.len; | 
| 337 | } | ||
| 337 | 338 | ||
| 339 | /* | ||
| 340 | * free_kevent - frees the given kevent. | ||
| 341 | */ | ||
| 342 | static void free_kevent(struct inotify_kernel_event *kevent) | ||
| 343 | { | ||
| 338 | kfree(kevent->name); | 344 | kfree(kevent->name); | 
| 339 | kmem_cache_free(event_cachep, kevent); | 345 | kmem_cache_free(event_cachep, kevent); | 
| 340 | } | 346 | } | 
| @@ -350,6 +356,7 @@ static void inotify_dev_event_dequeue(struct inotify_device *dev) | |||
| 350 | struct inotify_kernel_event *kevent; | 356 | struct inotify_kernel_event *kevent; | 
| 351 | kevent = inotify_dev_get_event(dev); | 357 | kevent = inotify_dev_get_event(dev); | 
| 352 | remove_kevent(dev, kevent); | 358 | remove_kevent(dev, kevent); | 
| 359 | free_kevent(kevent); | ||
| 353 | } | 360 | } | 
| 354 | } | 361 | } | 
| 355 | 362 | ||
| @@ -433,17 +440,15 @@ static ssize_t inotify_read(struct file *file, char __user *buf, | |||
| 433 | dev = file->private_data; | 440 | dev = file->private_data; | 
| 434 | 441 | ||
| 435 | while (1) { | 442 | while (1) { | 
| 436 | int events; | ||
| 437 | 443 | ||
| 438 | prepare_to_wait(&dev->wq, &wait, TASK_INTERRUPTIBLE); | 444 | prepare_to_wait(&dev->wq, &wait, TASK_INTERRUPTIBLE); | 
| 439 | 445 | ||
| 440 | mutex_lock(&dev->ev_mutex); | 446 | mutex_lock(&dev->ev_mutex); | 
| 441 | events = !list_empty(&dev->events); | 447 | if (!list_empty(&dev->events)) { | 
| 442 | mutex_unlock(&dev->ev_mutex); | ||
| 443 | if (events) { | ||
| 444 | ret = 0; | 448 | ret = 0; | 
| 445 | break; | 449 | break; | 
| 446 | } | 450 | } | 
| 451 | mutex_unlock(&dev->ev_mutex); | ||
| 447 | 452 | ||
| 448 | if (file->f_flags & O_NONBLOCK) { | 453 | if (file->f_flags & O_NONBLOCK) { | 
| 449 | ret = -EAGAIN; | 454 | ret = -EAGAIN; | 
| @@ -462,7 +467,6 @@ static ssize_t inotify_read(struct file *file, char __user *buf, | |||
| 462 | if (ret) | 467 | if (ret) | 
| 463 | return ret; | 468 | return ret; | 
| 464 | 469 | ||
| 465 | mutex_lock(&dev->ev_mutex); | ||
| 466 | while (1) { | 470 | while (1) { | 
| 467 | struct inotify_kernel_event *kevent; | 471 | struct inotify_kernel_event *kevent; | 
| 468 | 472 | ||
| @@ -481,6 +485,13 @@ static ssize_t inotify_read(struct file *file, char __user *buf, | |||
| 481 | } | 485 | } | 
| 482 | break; | 486 | break; | 
| 483 | } | 487 | } | 
| 488 | remove_kevent(dev, kevent); | ||
| 489 | |||
| 490 | /* | ||
| 491 | * Must perform the copy_to_user outside the mutex in order | ||
| 492 | * to avoid a lock order reversal with mmap_sem. | ||
| 493 | */ | ||
| 494 | mutex_unlock(&dev->ev_mutex); | ||
| 484 | 495 | ||
| 485 | if (copy_to_user(buf, &kevent->event, event_size)) { | 496 | if (copy_to_user(buf, &kevent->event, event_size)) { | 
| 486 | ret = -EFAULT; | 497 | ret = -EFAULT; | 
| @@ -498,7 +509,9 @@ static ssize_t inotify_read(struct file *file, char __user *buf, | |||
| 498 | count -= kevent->event.len; | 509 | count -= kevent->event.len; | 
| 499 | } | 510 | } | 
| 500 | 511 | ||
| 501 | remove_kevent(dev, kevent); | 512 | free_kevent(kevent); | 
| 513 | |||
| 514 | mutex_lock(&dev->ev_mutex); | ||
| 502 | } | 515 | } | 
| 503 | mutex_unlock(&dev->ev_mutex); | 516 | mutex_unlock(&dev->ev_mutex); | 
| 504 | 517 | ||
| diff --git a/fs/ramfs/file-nommu.c b/fs/ramfs/file-nommu.c index 52312ec93ff4..5145cb9125af 100644 --- a/fs/ramfs/file-nommu.c +++ b/fs/ramfs/file-nommu.c | |||
| @@ -58,7 +58,7 @@ const struct inode_operations ramfs_file_inode_operations = { | |||
| 58 | * size 0 on the assumption that it's going to be used for an mmap of shared | 58 | * size 0 on the assumption that it's going to be used for an mmap of shared | 
| 59 | * memory | 59 | * memory | 
| 60 | */ | 60 | */ | 
| 61 | static int ramfs_nommu_expand_for_mapping(struct inode *inode, size_t newsize) | 61 | int ramfs_nommu_expand_for_mapping(struct inode *inode, size_t newsize) | 
| 62 | { | 62 | { | 
| 63 | struct pagevec lru_pvec; | 63 | struct pagevec lru_pvec; | 
| 64 | unsigned long npages, xpages, loop, limit; | 64 | unsigned long npages, xpages, loop, limit; | 
| diff --git a/include/asm-mips/cevt-r4k.h b/include/asm-mips/cevt-r4k.h new file mode 100644 index 000000000000..fa4328f9124f --- /dev/null +++ b/include/asm-mips/cevt-r4k.h | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | /* | ||
| 2 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 3 | * License. See the file "COPYING" in the main directory of this archive | ||
| 4 | * for more details. | ||
| 5 | * | ||
| 6 | * Copyright (C) 2008 Kevin D. Kissell | ||
| 7 | */ | ||
| 8 | |||
| 9 | /* | ||
| 10 | * Definitions used for common event timer implementation | ||
| 11 | * for MIPS 4K-type processors and their MIPS MT variants. | ||
| 12 | * Avoids unsightly extern declarations in C files. | ||
| 13 | */ | ||
| 14 | #ifndef __ASM_CEVT_R4K_H | ||
| 15 | #define __ASM_CEVT_R4K_H | ||
| 16 | |||
| 17 | DECLARE_PER_CPU(struct clock_event_device, mips_clockevent_device); | ||
| 18 | |||
| 19 | void mips_event_handler(struct clock_event_device *dev); | ||
| 20 | int c0_compare_int_usable(void); | ||
| 21 | void mips_set_clock_mode(enum clock_event_mode, struct clock_event_device *); | ||
| 22 | irqreturn_t c0_compare_interrupt(int, void *); | ||
| 23 | |||
| 24 | extern struct irqaction c0_compare_irqaction; | ||
| 25 | extern int cp0_timer_irq_installed; | ||
| 26 | |||
| 27 | /* | ||
| 28 | * Possibly handle a performance counter interrupt. | ||
| 29 | * Return true if the timer interrupt should not be checked | ||
| 30 | */ | ||
| 31 | |||
| 32 | static inline int handle_perf_irq(int r2) | ||
| 33 | { | ||
| 34 | /* | ||
| 35 | * The performance counter overflow interrupt may be shared with the | ||
| 36 | * timer interrupt (cp0_perfcount_irq < 0). If it is and a | ||
| 37 | * performance counter has overflowed (perf_irq() == IRQ_HANDLED) | ||
| 38 | * and we can't reliably determine if a counter interrupt has also | ||
| 39 | * happened (!r2) then don't check for a timer interrupt. | ||
| 40 | */ | ||
| 41 | return (cp0_perfcount_irq < 0) && | ||
| 42 | perf_irq() == IRQ_HANDLED && | ||
| 43 | !r2; | ||
| 44 | } | ||
| 45 | |||
| 46 | #endif /* __ASM_CEVT_R4K_H */ | ||
| diff --git a/include/asm-mips/irqflags.h b/include/asm-mips/irqflags.h index 881e8866501d..701ec0ba8fa9 100644 --- a/include/asm-mips/irqflags.h +++ b/include/asm-mips/irqflags.h | |||
| @@ -38,8 +38,17 @@ __asm__( | |||
| 38 | " .set pop \n" | 38 | " .set pop \n" | 
| 39 | " .endm"); | 39 | " .endm"); | 
| 40 | 40 | ||
| 41 | extern void smtc_ipi_replay(void); | ||
| 42 | |||
| 41 | static inline void raw_local_irq_enable(void) | 43 | static inline void raw_local_irq_enable(void) | 
| 42 | { | 44 | { | 
| 45 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 46 | /* | ||
| 47 | * SMTC kernel needs to do a software replay of queued | ||
| 48 | * IPIs, at the cost of call overhead on each local_irq_enable() | ||
| 49 | */ | ||
| 50 | smtc_ipi_replay(); | ||
| 51 | #endif | ||
| 43 | __asm__ __volatile__( | 52 | __asm__ __volatile__( | 
| 44 | "raw_local_irq_enable" | 53 | "raw_local_irq_enable" | 
| 45 | : /* no outputs */ | 54 | : /* no outputs */ | 
| @@ -47,6 +56,7 @@ static inline void raw_local_irq_enable(void) | |||
| 47 | : "memory"); | 56 | : "memory"); | 
| 48 | } | 57 | } | 
| 49 | 58 | ||
| 59 | |||
| 50 | /* | 60 | /* | 
| 51 | * For cli() we have to insert nops to make sure that the new value | 61 | * For cli() we have to insert nops to make sure that the new value | 
| 52 | * has actually arrived in the status register before the end of this | 62 | * has actually arrived in the status register before the end of this | 
| @@ -185,15 +195,14 @@ __asm__( | |||
| 185 | " .set pop \n" | 195 | " .set pop \n" | 
| 186 | " .endm \n"); | 196 | " .endm \n"); | 
| 187 | 197 | ||
| 188 | extern void smtc_ipi_replay(void); | ||
| 189 | 198 | ||
| 190 | static inline void raw_local_irq_restore(unsigned long flags) | 199 | static inline void raw_local_irq_restore(unsigned long flags) | 
| 191 | { | 200 | { | 
| 192 | unsigned long __tmp1; | 201 | unsigned long __tmp1; | 
| 193 | 202 | ||
| 194 | #ifdef CONFIG_MIPS_MT_SMTC_INSTANT_REPLAY | 203 | #ifdef CONFIG_MIPS_MT_SMTC | 
| 195 | /* | 204 | /* | 
| 196 | * CONFIG_MIPS_MT_SMTC_INSTANT_REPLAY does prompt replay of deferred | 205 | * SMTC kernel needs to do a software replay of queued | 
| 197 | * IPIs, at the cost of branch and call overhead on each | 206 | * IPIs, at the cost of branch and call overhead on each | 
| 198 | * local_irq_restore() | 207 | * local_irq_restore() | 
| 199 | */ | 208 | */ | 
| @@ -208,6 +217,17 @@ static inline void raw_local_irq_restore(unsigned long flags) | |||
| 208 | : "memory"); | 217 | : "memory"); | 
| 209 | } | 218 | } | 
| 210 | 219 | ||
| 220 | static inline void __raw_local_irq_restore(unsigned long flags) | ||
| 221 | { | ||
| 222 | unsigned long __tmp1; | ||
| 223 | |||
| 224 | __asm__ __volatile__( | ||
| 225 | "raw_local_irq_restore\t%0" | ||
| 226 | : "=r" (__tmp1) | ||
| 227 | : "0" (flags) | ||
| 228 | : "memory"); | ||
| 229 | } | ||
| 230 | |||
| 211 | static inline int raw_irqs_disabled_flags(unsigned long flags) | 231 | static inline int raw_irqs_disabled_flags(unsigned long flags) | 
| 212 | { | 232 | { | 
| 213 | #ifdef CONFIG_MIPS_MT_SMTC | 233 | #ifdef CONFIG_MIPS_MT_SMTC | 
| diff --git a/include/asm-mips/mipsregs.h b/include/asm-mips/mipsregs.h index a46f8e258e6b..979866000da4 100644 --- a/include/asm-mips/mipsregs.h +++ b/include/asm-mips/mipsregs.h | |||
| @@ -1462,7 +1462,7 @@ set_c0_##name(unsigned int set) \ | |||
| 1462 | { \ | 1462 | { \ | 
| 1463 | unsigned int res; \ | 1463 | unsigned int res; \ | 
| 1464 | unsigned int omt; \ | 1464 | unsigned int omt; \ | 
| 1465 | unsigned int flags; \ | 1465 | unsigned long flags; \ | 
| 1466 | \ | 1466 | \ | 
| 1467 | local_irq_save(flags); \ | 1467 | local_irq_save(flags); \ | 
| 1468 | omt = __dmt(); \ | 1468 | omt = __dmt(); \ | 
| @@ -1480,7 +1480,7 @@ clear_c0_##name(unsigned int clear) \ | |||
| 1480 | { \ | 1480 | { \ | 
| 1481 | unsigned int res; \ | 1481 | unsigned int res; \ | 
| 1482 | unsigned int omt; \ | 1482 | unsigned int omt; \ | 
| 1483 | unsigned int flags; \ | 1483 | unsigned long flags; \ | 
| 1484 | \ | 1484 | \ | 
| 1485 | local_irq_save(flags); \ | 1485 | local_irq_save(flags); \ | 
| 1486 | omt = __dmt(); \ | 1486 | omt = __dmt(); \ | 
| @@ -1498,7 +1498,7 @@ change_c0_##name(unsigned int change, unsigned int new) \ | |||
| 1498 | { \ | 1498 | { \ | 
| 1499 | unsigned int res; \ | 1499 | unsigned int res; \ | 
| 1500 | unsigned int omt; \ | 1500 | unsigned int omt; \ | 
| 1501 | unsigned int flags; \ | 1501 | unsigned long flags; \ | 
| 1502 | \ | 1502 | \ | 
| 1503 | local_irq_save(flags); \ | 1503 | local_irq_save(flags); \ | 
| 1504 | \ | 1504 | \ | 
| diff --git a/include/asm-mips/smtc.h b/include/asm-mips/smtc.h index 3639b28f80db..ea60bf08dcb0 100644 --- a/include/asm-mips/smtc.h +++ b/include/asm-mips/smtc.h | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | */ | 6 | */ | 
| 7 | 7 | ||
| 8 | #include <asm/mips_mt.h> | 8 | #include <asm/mips_mt.h> | 
| 9 | #include <asm/smtc_ipi.h> | ||
| 9 | 10 | ||
| 10 | /* | 11 | /* | 
| 11 | * System-wide SMTC status information | 12 | * System-wide SMTC status information | 
| @@ -38,14 +39,15 @@ struct mm_struct; | |||
| 38 | struct task_struct; | 39 | struct task_struct; | 
| 39 | 40 | ||
| 40 | void smtc_get_new_mmu_context(struct mm_struct *mm, unsigned long cpu); | 41 | void smtc_get_new_mmu_context(struct mm_struct *mm, unsigned long cpu); | 
| 41 | 42 | void self_ipi(struct smtc_ipi *); | |
| 42 | void smtc_flush_tlb_asid(unsigned long asid); | 43 | void smtc_flush_tlb_asid(unsigned long asid); | 
| 43 | extern int mipsmt_build_cpu_map(int startslot); | 44 | extern int smtc_build_cpu_map(int startslot); | 
| 44 | extern void mipsmt_prepare_cpus(void); | 45 | extern void smtc_prepare_cpus(int cpus); | 
| 45 | extern void smtc_smp_finish(void); | 46 | extern void smtc_smp_finish(void); | 
| 46 | extern void smtc_boot_secondary(int cpu, struct task_struct *t); | 47 | extern void smtc_boot_secondary(int cpu, struct task_struct *t); | 
| 47 | extern void smtc_cpus_done(void); | 48 | extern void smtc_cpus_done(void); | 
| 48 | 49 | ||
| 50 | |||
| 49 | /* | 51 | /* | 
| 50 | * Sharing the TLB between multiple VPEs means that the | 52 | * Sharing the TLB between multiple VPEs means that the | 
| 51 | * "random" index selection function is not allowed to | 53 | * "random" index selection function is not allowed to | 
| diff --git a/include/asm-mips/stackframe.h b/include/asm-mips/stackframe.h index 051e1af0bb95..4c37c4e5f72e 100644 --- a/include/asm-mips/stackframe.h +++ b/include/asm-mips/stackframe.h | |||
| @@ -297,14 +297,31 @@ | |||
| 297 | #ifdef CONFIG_MIPS_MT_SMTC | 297 | #ifdef CONFIG_MIPS_MT_SMTC | 
| 298 | .set mips32r2 | 298 | .set mips32r2 | 
| 299 | /* | 299 | /* | 
| 300 | * This may not really be necessary if ints are already | 300 | * We need to make sure the read-modify-write | 
| 301 | * inhibited here. | 301 | * of Status below isn't perturbed by an interrupt | 
| 302 | * or cross-TC access, so we need to do at least a DMT, | ||
| 303 | * protected by an interrupt-inhibit. But setting IXMT | ||
| 304 | * also creates a few-cycle window where an IPI could | ||
| 305 | * be queued and not be detected before potentially | ||
| 306 | * returning to a WAIT or user-mode loop. It must be | ||
| 307 | * replayed. | ||
| 308 | * | ||
| 309 | * We're in the middle of a context switch, and | ||
| 310 | * we can't dispatch it directly without trashing | ||
| 311 | * some registers, so we'll try to detect this unlikely | ||
| 312 | * case and program a software interrupt in the VPE, | ||
| 313 | * as would be done for a cross-VPE IPI. To accomodate | ||
| 314 | * the handling of that case, we're doing a DVPE instead | ||
| 315 | * of just a DMT here to protect against other threads. | ||
| 316 | * This is a lot of cruft to cover a tiny window. | ||
| 317 | * If you can find a better design, implement it! | ||
| 318 | * | ||
| 302 | */ | 319 | */ | 
| 303 | mfc0 v0, CP0_TCSTATUS | 320 | mfc0 v0, CP0_TCSTATUS | 
| 304 | ori v0, TCSTATUS_IXMT | 321 | ori v0, TCSTATUS_IXMT | 
| 305 | mtc0 v0, CP0_TCSTATUS | 322 | mtc0 v0, CP0_TCSTATUS | 
| 306 | _ehb | 323 | _ehb | 
| 307 | DMT 5 # dmt a1 | 324 | DVPE 5 # dvpe a1 | 
| 308 | jal mips_ihb | 325 | jal mips_ihb | 
| 309 | #endif /* CONFIG_MIPS_MT_SMTC */ | 326 | #endif /* CONFIG_MIPS_MT_SMTC */ | 
| 310 | mfc0 a0, CP0_STATUS | 327 | mfc0 a0, CP0_STATUS | 
| @@ -325,17 +342,50 @@ | |||
| 325 | */ | 342 | */ | 
| 326 | LONG_L v1, PT_TCSTATUS(sp) | 343 | LONG_L v1, PT_TCSTATUS(sp) | 
| 327 | _ehb | 344 | _ehb | 
| 328 | mfc0 v0, CP0_TCSTATUS | 345 | mfc0 a0, CP0_TCSTATUS | 
| 329 | andi v1, TCSTATUS_IXMT | 346 | andi v1, TCSTATUS_IXMT | 
| 330 | /* We know that TCStatua.IXMT should be set from above */ | 347 | bnez v1, 0f | 
| 331 | xori v0, v0, TCSTATUS_IXMT | 348 | |
| 332 | or v0, v0, v1 | 349 | /* | 
| 333 | mtc0 v0, CP0_TCSTATUS | 350 | * We'd like to detect any IPIs queued in the tiny window | 
| 334 | _ehb | 351 | * above and request an software interrupt to service them | 
| 335 | andi a1, a1, VPECONTROL_TE | 352 | * when we ERET. | 
| 353 | * | ||
| 354 | * Computing the offset into the IPIQ array of the executing | ||
| 355 | * TC's IPI queue in-line would be tedious. We use part of | ||
| 356 | * the TCContext register to hold 16 bits of offset that we | ||
| 357 | * can add in-line to find the queue head. | ||
| 358 | */ | ||
| 359 | mfc0 v0, CP0_TCCONTEXT | ||
| 360 | la a2, IPIQ | ||
| 361 | srl v0, v0, 16 | ||
| 362 | addu a2, a2, v0 | ||
| 363 | LONG_L v0, 0(a2) | ||
| 364 | beqz v0, 0f | ||
| 365 | /* | ||
| 366 | * If we have a queue, provoke dispatch within the VPE by setting C_SW1 | ||
| 367 | */ | ||
| 368 | mfc0 v0, CP0_CAUSE | ||
| 369 | ori v0, v0, C_SW1 | ||
| 370 | mtc0 v0, CP0_CAUSE | ||
| 371 | 0: | ||
| 372 | /* | ||
| 373 | * This test should really never branch but | ||
| 374 | * let's be prudent here. Having atomized | ||
| 375 | * the shared register modifications, we can | ||
| 376 | * now EVPE, and must do so before interrupts | ||
| 377 | * are potentially re-enabled. | ||
| 378 | */ | ||
| 379 | andi a1, a1, MVPCONTROL_EVP | ||
| 336 | beqz a1, 1f | 380 | beqz a1, 1f | 
| 337 | emt | 381 | evpe | 
| 338 | 1: | 382 | 1: | 
| 383 | /* We know that TCStatua.IXMT should be set from above */ | ||
| 384 | xori a0, a0, TCSTATUS_IXMT | ||
| 385 | or a0, a0, v1 | ||
| 386 | mtc0 a0, CP0_TCSTATUS | ||
| 387 | _ehb | ||
| 388 | |||
| 339 | .set mips0 | 389 | .set mips0 | 
| 340 | #endif /* CONFIG_MIPS_MT_SMTC */ | 390 | #endif /* CONFIG_MIPS_MT_SMTC */ | 
| 341 | LONG_L v1, PT_EPC(sp) | 391 | LONG_L v1, PT_EPC(sp) | 
| diff --git a/include/asm-x86/a.out-core.h b/include/asm-x86/a.out-core.h index 714207a1c387..f5705761a37b 100644 --- a/include/asm-x86/a.out-core.h +++ b/include/asm-x86/a.out-core.h | |||
| @@ -9,8 +9,8 @@ | |||
| 9 | * 2 of the Licence, or (at your option) any later version. | 9 | * 2 of the Licence, or (at your option) any later version. | 
| 10 | */ | 10 | */ | 
| 11 | 11 | ||
| 12 | #ifndef _ASM_A_OUT_CORE_H | 12 | #ifndef ASM_X86__A_OUT_CORE_H | 
| 13 | #define _ASM_A_OUT_CORE_H | 13 | #define ASM_X86__A_OUT_CORE_H | 
| 14 | 14 | ||
| 15 | #ifdef __KERNEL__ | 15 | #ifdef __KERNEL__ | 
| 16 | #ifdef CONFIG_X86_32 | 16 | #ifdef CONFIG_X86_32 | 
| @@ -70,4 +70,4 @@ static inline void aout_dump_thread(struct pt_regs *regs, struct user *dump) | |||
| 70 | 70 | ||
| 71 | #endif /* CONFIG_X86_32 */ | 71 | #endif /* CONFIG_X86_32 */ | 
| 72 | #endif /* __KERNEL__ */ | 72 | #endif /* __KERNEL__ */ | 
| 73 | #endif /* _ASM_A_OUT_CORE_H */ | 73 | #endif /* ASM_X86__A_OUT_CORE_H */ | 
| diff --git a/include/asm-x86/a.out.h b/include/asm-x86/a.out.h index 4684f97a5bbd..0948748bc69c 100644 --- a/include/asm-x86/a.out.h +++ b/include/asm-x86/a.out.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_A_OUT_H | 1 | #ifndef ASM_X86__A_OUT_H | 
| 2 | #define _ASM_X86_A_OUT_H | 2 | #define ASM_X86__A_OUT_H | 
| 3 | 3 | ||
| 4 | struct exec | 4 | struct exec | 
| 5 | { | 5 | { | 
| @@ -17,4 +17,4 @@ struct exec | |||
| 17 | #define N_DRSIZE(a) ((a).a_drsize) | 17 | #define N_DRSIZE(a) ((a).a_drsize) | 
| 18 | #define N_SYMSIZE(a) ((a).a_syms) | 18 | #define N_SYMSIZE(a) ((a).a_syms) | 
| 19 | 19 | ||
| 20 | #endif /* _ASM_X86_A_OUT_H */ | 20 | #endif /* ASM_X86__A_OUT_H */ | 
| diff --git a/include/asm-x86/acpi.h b/include/asm-x86/acpi.h index 35d1743b57ac..392e17336be1 100644 --- a/include/asm-x86/acpi.h +++ b/include/asm-x86/acpi.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_ACPI_H | 1 | #ifndef ASM_X86__ACPI_H | 
| 2 | #define _ASM_X86_ACPI_H | 2 | #define ASM_X86__ACPI_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> | 5 | * Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com> | 
| @@ -175,4 +175,4 @@ static inline void acpi_fake_nodes(const struct bootnode *fake_nodes, | |||
| 175 | 175 | ||
| 176 | #define acpi_unlazy_tlb(x) leave_mm(x) | 176 | #define acpi_unlazy_tlb(x) leave_mm(x) | 
| 177 | 177 | ||
| 178 | #endif /*__X86_ASM_ACPI_H*/ | 178 | #endif /* ASM_X86__ACPI_H */ | 
| diff --git a/include/asm-x86/agp.h b/include/asm-x86/agp.h index e4004a9f6a9a..3617fd4fcdf9 100644 --- a/include/asm-x86/agp.h +++ b/include/asm-x86/agp.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_AGP_H | 1 | #ifndef ASM_X86__AGP_H | 
| 2 | #define _ASM_X86_AGP_H | 2 | #define ASM_X86__AGP_H | 
| 3 | 3 | ||
| 4 | #include <asm/pgtable.h> | 4 | #include <asm/pgtable.h> | 
| 5 | #include <asm/cacheflush.h> | 5 | #include <asm/cacheflush.h> | 
| @@ -32,4 +32,4 @@ | |||
| 32 | #define free_gatt_pages(table, order) \ | 32 | #define free_gatt_pages(table, order) \ | 
| 33 | free_pages((unsigned long)(table), (order)) | 33 | free_pages((unsigned long)(table), (order)) | 
| 34 | 34 | ||
| 35 | #endif | 35 | #endif /* ASM_X86__AGP_H */ | 
| diff --git a/include/asm-x86/alternative.h b/include/asm-x86/alternative.h index f6aa18eadf71..22d3c9862bf3 100644 --- a/include/asm-x86/alternative.h +++ b/include/asm-x86/alternative.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_ALTERNATIVE_H | 1 | #ifndef ASM_X86__ALTERNATIVE_H | 
| 2 | #define _ASM_X86_ALTERNATIVE_H | 2 | #define ASM_X86__ALTERNATIVE_H | 
| 3 | 3 | ||
| 4 | #include <linux/types.h> | 4 | #include <linux/types.h> | 
| 5 | #include <linux/stddef.h> | 5 | #include <linux/stddef.h> | 
| @@ -180,4 +180,4 @@ extern void add_nops(void *insns, unsigned int len); | |||
| 180 | extern void *text_poke(void *addr, const void *opcode, size_t len); | 180 | extern void *text_poke(void *addr, const void *opcode, size_t len); | 
| 181 | extern void *text_poke_early(void *addr, const void *opcode, size_t len); | 181 | extern void *text_poke_early(void *addr, const void *opcode, size_t len); | 
| 182 | 182 | ||
| 183 | #endif /* _ASM_X86_ALTERNATIVE_H */ | 183 | #endif /* ASM_X86__ALTERNATIVE_H */ | 
| diff --git a/include/asm-x86/amd_iommu.h b/include/asm-x86/amd_iommu.h index 30a12049353b..783f43e58052 100644 --- a/include/asm-x86/amd_iommu.h +++ b/include/asm-x86/amd_iommu.h | |||
| @@ -17,8 +17,8 @@ | |||
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 
| 18 | */ | 18 | */ | 
| 19 | 19 | ||
| 20 | #ifndef _ASM_X86_AMD_IOMMU_H | 20 | #ifndef ASM_X86__AMD_IOMMU_H | 
| 21 | #define _ASM_X86_AMD_IOMMU_H | 21 | #define ASM_X86__AMD_IOMMU_H | 
| 22 | 22 | ||
| 23 | #ifdef CONFIG_AMD_IOMMU | 23 | #ifdef CONFIG_AMD_IOMMU | 
| 24 | extern int amd_iommu_init(void); | 24 | extern int amd_iommu_init(void); | 
| @@ -29,4 +29,4 @@ static inline int amd_iommu_init(void) { return -ENODEV; } | |||
| 29 | static inline void amd_iommu_detect(void) { } | 29 | static inline void amd_iommu_detect(void) { } | 
| 30 | #endif | 30 | #endif | 
| 31 | 31 | ||
| 32 | #endif | 32 | #endif /* ASM_X86__AMD_IOMMU_H */ | 
| diff --git a/include/asm-x86/amd_iommu_types.h b/include/asm-x86/amd_iommu_types.h index dcc812067394..1ffa4e53c989 100644 --- a/include/asm-x86/amd_iommu_types.h +++ b/include/asm-x86/amd_iommu_types.h | |||
| @@ -17,8 +17,8 @@ | |||
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 
| 18 | */ | 18 | */ | 
| 19 | 19 | ||
| 20 | #ifndef __AMD_IOMMU_TYPES_H__ | 20 | #ifndef ASM_X86__AMD_IOMMU_TYPES_H | 
| 21 | #define __AMD_IOMMU_TYPES_H__ | 21 | #define ASM_X86__AMD_IOMMU_TYPES_H | 
| 22 | 22 | ||
| 23 | #include <linux/types.h> | 23 | #include <linux/types.h> | 
| 24 | #include <linux/list.h> | 24 | #include <linux/list.h> | 
| @@ -341,4 +341,4 @@ static inline u16 calc_devid(u8 bus, u8 devfn) | |||
| 341 | return (((u16)bus) << 8) | devfn; | 341 | return (((u16)bus) << 8) | devfn; | 
| 342 | } | 342 | } | 
| 343 | 343 | ||
| 344 | #endif | 344 | #endif /* ASM_X86__AMD_IOMMU_TYPES_H */ | 
| diff --git a/include/asm-x86/apic.h b/include/asm-x86/apic.h index 133c998161ca..65590c9aecd4 100644 --- a/include/asm-x86/apic.h +++ b/include/asm-x86/apic.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_APIC_H | 1 | #ifndef ASM_X86__APIC_H | 
| 2 | #define _ASM_X86_APIC_H | 2 | #define ASM_X86__APIC_H | 
| 3 | 3 | ||
| 4 | #include <linux/pm.h> | 4 | #include <linux/pm.h> | 
| 5 | #include <linux/delay.h> | 5 | #include <linux/delay.h> | 
| @@ -54,6 +54,11 @@ extern int disable_apic; | |||
| 54 | #endif | 54 | #endif | 
| 55 | 55 | ||
| 56 | extern int is_vsmp_box(void); | 56 | extern int is_vsmp_box(void); | 
| 57 | extern void xapic_wait_icr_idle(void); | ||
| 58 | extern u32 safe_xapic_wait_icr_idle(void); | ||
| 59 | extern u64 xapic_icr_read(void); | ||
| 60 | extern void xapic_icr_write(u32, u32); | ||
| 61 | extern int setup_profiling_timer(unsigned int); | ||
| 57 | 62 | ||
| 58 | static inline void native_apic_write(unsigned long reg, u32 v) | 63 | static inline void native_apic_write(unsigned long reg, u32 v) | 
| 59 | { | 64 | { | 
| @@ -76,9 +81,7 @@ extern int get_physical_broadcast(void); | |||
| 76 | static inline void ack_APIC_irq(void) | 81 | static inline void ack_APIC_irq(void) | 
| 77 | { | 82 | { | 
| 78 | /* | 83 | /* | 
| 79 | * ack_APIC_irq() actually gets compiled as a single instruction: | 84 | * ack_APIC_irq() actually gets compiled as a single instruction | 
| 80 | * - a single rmw on Pentium/82489DX | ||
| 81 | * - a single write on P6+ cores (CONFIG_X86_GOOD_APIC) | ||
| 82 | * ... yummie. | 85 | * ... yummie. | 
| 83 | */ | 86 | */ | 
| 84 | 87 | ||
| @@ -128,4 +131,4 @@ static inline void init_apic_mappings(void) { } | |||
| 128 | 131 | ||
| 129 | #endif /* !CONFIG_X86_LOCAL_APIC */ | 132 | #endif /* !CONFIG_X86_LOCAL_APIC */ | 
| 130 | 133 | ||
| 131 | #endif /* __ASM_APIC_H */ | 134 | #endif /* ASM_X86__APIC_H */ | 
| diff --git a/include/asm-x86/apicdef.h b/include/asm-x86/apicdef.h index 6b9008c78731..c40687da20fc 100644 --- a/include/asm-x86/apicdef.h +++ b/include/asm-x86/apicdef.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_APICDEF_H | 1 | #ifndef ASM_X86__APICDEF_H | 
| 2 | #define _ASM_X86_APICDEF_H | 2 | #define ASM_X86__APICDEF_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * Constants for various Intel APICs. (local APIC, IOAPIC, etc.) | 5 | * Constants for various Intel APICs. (local APIC, IOAPIC, etc.) | 
| @@ -411,4 +411,4 @@ struct local_apic { | |||
| 411 | #else | 411 | #else | 
| 412 | #define BAD_APICID 0xFFFFu | 412 | #define BAD_APICID 0xFFFFu | 
| 413 | #endif | 413 | #endif | 
| 414 | #endif | 414 | #endif /* ASM_X86__APICDEF_H */ | 
| diff --git a/include/asm-x86/arch_hooks.h b/include/asm-x86/arch_hooks.h index 8411750ceb63..72adc3a109cc 100644 --- a/include/asm-x86/arch_hooks.h +++ b/include/asm-x86/arch_hooks.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_ARCH_HOOKS_H | 1 | #ifndef ASM_X86__ARCH_HOOKS_H | 
| 2 | #define _ASM_ARCH_HOOKS_H | 2 | #define ASM_X86__ARCH_HOOKS_H | 
| 3 | 3 | ||
| 4 | #include <linux/interrupt.h> | 4 | #include <linux/interrupt.h> | 
| 5 | 5 | ||
| @@ -25,4 +25,4 @@ extern void pre_time_init_hook(void); | |||
| 25 | extern void time_init_hook(void); | 25 | extern void time_init_hook(void); | 
| 26 | extern void mca_nmi_hook(void); | 26 | extern void mca_nmi_hook(void); | 
| 27 | 27 | ||
| 28 | #endif | 28 | #endif /* ASM_X86__ARCH_HOOKS_H */ | 
| diff --git a/include/asm-x86/asm.h b/include/asm-x86/asm.h index 97220321f39d..e1355f44d7c3 100644 --- a/include/asm-x86/asm.h +++ b/include/asm-x86/asm.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_ASM_H | 1 | #ifndef ASM_X86__ASM_H | 
| 2 | #define _ASM_X86_ASM_H | 2 | #define ASM_X86__ASM_H | 
| 3 | 3 | ||
| 4 | #ifdef __ASSEMBLY__ | 4 | #ifdef __ASSEMBLY__ | 
| 5 | # define __ASM_FORM(x) x | 5 | # define __ASM_FORM(x) x | 
| @@ -20,17 +20,22 @@ | |||
| 20 | 20 | ||
| 21 | #define _ASM_PTR __ASM_SEL(.long, .quad) | 21 | #define _ASM_PTR __ASM_SEL(.long, .quad) | 
| 22 | #define _ASM_ALIGN __ASM_SEL(.balign 4, .balign 8) | 22 | #define _ASM_ALIGN __ASM_SEL(.balign 4, .balign 8) | 
| 23 | #define _ASM_MOV_UL __ASM_SIZE(mov) | ||
| 24 | 23 | ||
| 24 | #define _ASM_MOV __ASM_SIZE(mov) | ||
| 25 | #define _ASM_INC __ASM_SIZE(inc) | 25 | #define _ASM_INC __ASM_SIZE(inc) | 
| 26 | #define _ASM_DEC __ASM_SIZE(dec) | 26 | #define _ASM_DEC __ASM_SIZE(dec) | 
| 27 | #define _ASM_ADD __ASM_SIZE(add) | 27 | #define _ASM_ADD __ASM_SIZE(add) | 
| 28 | #define _ASM_SUB __ASM_SIZE(sub) | 28 | #define _ASM_SUB __ASM_SIZE(sub) | 
| 29 | #define _ASM_XADD __ASM_SIZE(xadd) | 29 | #define _ASM_XADD __ASM_SIZE(xadd) | 
| 30 | |||
| 30 | #define _ASM_AX __ASM_REG(ax) | 31 | #define _ASM_AX __ASM_REG(ax) | 
| 31 | #define _ASM_BX __ASM_REG(bx) | 32 | #define _ASM_BX __ASM_REG(bx) | 
| 32 | #define _ASM_CX __ASM_REG(cx) | 33 | #define _ASM_CX __ASM_REG(cx) | 
| 33 | #define _ASM_DX __ASM_REG(dx) | 34 | #define _ASM_DX __ASM_REG(dx) | 
| 35 | #define _ASM_SP __ASM_REG(sp) | ||
| 36 | #define _ASM_BP __ASM_REG(bp) | ||
| 37 | #define _ASM_SI __ASM_REG(si) | ||
| 38 | #define _ASM_DI __ASM_REG(di) | ||
| 34 | 39 | ||
| 35 | /* Exception table entry */ | 40 | /* Exception table entry */ | 
| 36 | # define _ASM_EXTABLE(from,to) \ | 41 | # define _ASM_EXTABLE(from,to) \ | 
| @@ -39,4 +44,4 @@ | |||
| 39 | _ASM_PTR #from "," #to "\n" \ | 44 | _ASM_PTR #from "," #to "\n" \ | 
| 40 | " .previous\n" | 45 | " .previous\n" | 
| 41 | 46 | ||
| 42 | #endif /* _ASM_X86_ASM_H */ | 47 | #endif /* ASM_X86__ASM_H */ | 
| diff --git a/include/asm-x86/atomic_32.h b/include/asm-x86/atomic_32.h index 21a4825148c0..14d3f0beb889 100644 --- a/include/asm-x86/atomic_32.h +++ b/include/asm-x86/atomic_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ARCH_I386_ATOMIC__ | 1 | #ifndef ASM_X86__ATOMIC_32_H | 
| 2 | #define __ARCH_I386_ATOMIC__ | 2 | #define ASM_X86__ATOMIC_32_H | 
| 3 | 3 | ||
| 4 | #include <linux/compiler.h> | 4 | #include <linux/compiler.h> | 
| 5 | #include <asm/processor.h> | 5 | #include <asm/processor.h> | 
| @@ -256,4 +256,4 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u) | |||
| 256 | #define smp_mb__after_atomic_inc() barrier() | 256 | #define smp_mb__after_atomic_inc() barrier() | 
| 257 | 257 | ||
| 258 | #include <asm-generic/atomic.h> | 258 | #include <asm-generic/atomic.h> | 
| 259 | #endif | 259 | #endif /* ASM_X86__ATOMIC_32_H */ | 
| diff --git a/include/asm-x86/atomic_64.h b/include/asm-x86/atomic_64.h index 91c7d03e65bc..2cb218c4a356 100644 --- a/include/asm-x86/atomic_64.h +++ b/include/asm-x86/atomic_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ARCH_X86_64_ATOMIC__ | 1 | #ifndef ASM_X86__ATOMIC_64_H | 
| 2 | #define __ARCH_X86_64_ATOMIC__ | 2 | #define ASM_X86__ATOMIC_64_H | 
| 3 | 3 | ||
| 4 | #include <asm/alternative.h> | 4 | #include <asm/alternative.h> | 
| 5 | #include <asm/cmpxchg.h> | 5 | #include <asm/cmpxchg.h> | 
| @@ -470,4 +470,4 @@ static inline void atomic_or_long(unsigned long *v1, unsigned long v2) | |||
| 470 | #define smp_mb__after_atomic_inc() barrier() | 470 | #define smp_mb__after_atomic_inc() barrier() | 
| 471 | 471 | ||
| 472 | #include <asm-generic/atomic.h> | 472 | #include <asm-generic/atomic.h> | 
| 473 | #endif | 473 | #endif /* ASM_X86__ATOMIC_64_H */ | 
| diff --git a/include/asm-x86/auxvec.h b/include/asm-x86/auxvec.h index 87f5e6d5a020..12c7cac74202 100644 --- a/include/asm-x86/auxvec.h +++ b/include/asm-x86/auxvec.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_AUXVEC_H | 1 | #ifndef ASM_X86__AUXVEC_H | 
| 2 | #define _ASM_X86_AUXVEC_H | 2 | #define ASM_X86__AUXVEC_H | 
| 3 | /* | 3 | /* | 
| 4 | * Architecture-neutral AT_ values in 0-17, leave some room | 4 | * Architecture-neutral AT_ values in 0-17, leave some room | 
| 5 | * for more of them, start the x86-specific ones at 32. | 5 | * for more of them, start the x86-specific ones at 32. | 
| @@ -9,4 +9,4 @@ | |||
| 9 | #endif | 9 | #endif | 
| 10 | #define AT_SYSINFO_EHDR 33 | 10 | #define AT_SYSINFO_EHDR 33 | 
| 11 | 11 | ||
| 12 | #endif | 12 | #endif /* ASM_X86__AUXVEC_H */ | 
| diff --git a/include/asm-x86/bios_ebda.h b/include/asm-x86/bios_ebda.h index 0033e50c13b2..ec42ed874591 100644 --- a/include/asm-x86/bios_ebda.h +++ b/include/asm-x86/bios_ebda.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _MACH_BIOS_EBDA_H | 1 | #ifndef ASM_X86__BIOS_EBDA_H | 
| 2 | #define _MACH_BIOS_EBDA_H | 2 | #define ASM_X86__BIOS_EBDA_H | 
| 3 | 3 | ||
| 4 | #include <asm/io.h> | 4 | #include <asm/io.h> | 
| 5 | 5 | ||
| @@ -16,4 +16,4 @@ static inline unsigned int get_bios_ebda(void) | |||
| 16 | 16 | ||
| 17 | void reserve_ebda_region(void); | 17 | void reserve_ebda_region(void); | 
| 18 | 18 | ||
| 19 | #endif /* _MACH_BIOS_EBDA_H */ | 19 | #endif /* ASM_X86__BIOS_EBDA_H */ | 
| diff --git a/include/asm-x86/bitops.h b/include/asm-x86/bitops.h index cfb2b64f76e7..61989b93b475 100644 --- a/include/asm-x86/bitops.h +++ b/include/asm-x86/bitops.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_BITOPS_H | 1 | #ifndef ASM_X86__BITOPS_H | 
| 2 | #define _ASM_X86_BITOPS_H | 2 | #define ASM_X86__BITOPS_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * Copyright 1992, Linus Torvalds. | 5 | * Copyright 1992, Linus Torvalds. | 
| @@ -458,4 +458,4 @@ static inline void set_bit_string(unsigned long *bitmap, | |||
| 458 | #include <asm-generic/bitops/minix.h> | 458 | #include <asm-generic/bitops/minix.h> | 
| 459 | 459 | ||
| 460 | #endif /* __KERNEL__ */ | 460 | #endif /* __KERNEL__ */ | 
| 461 | #endif /* _ASM_X86_BITOPS_H */ | 461 | #endif /* ASM_X86__BITOPS_H */ | 
| diff --git a/include/asm-x86/boot.h b/include/asm-x86/boot.h index 2faed7ecb092..825de5dc867c 100644 --- a/include/asm-x86/boot.h +++ b/include/asm-x86/boot.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_BOOT_H | 1 | #ifndef ASM_X86__BOOT_H | 
| 2 | #define _ASM_BOOT_H | 2 | #define ASM_X86__BOOT_H | 
| 3 | 3 | ||
| 4 | /* Don't touch these, unless you really know what you're doing. */ | 4 | /* Don't touch these, unless you really know what you're doing. */ | 
| 5 | #define DEF_INITSEG 0x9000 | 5 | #define DEF_INITSEG 0x9000 | 
| @@ -25,4 +25,4 @@ | |||
| 25 | #define BOOT_STACK_SIZE 0x1000 | 25 | #define BOOT_STACK_SIZE 0x1000 | 
| 26 | #endif | 26 | #endif | 
| 27 | 27 | ||
| 28 | #endif /* _ASM_BOOT_H */ | 28 | #endif /* ASM_X86__BOOT_H */ | 
| diff --git a/include/asm-x86/bootparam.h b/include/asm-x86/bootparam.h index ae22bdf0ab14..ccf027e2d97d 100644 --- a/include/asm-x86/bootparam.h +++ b/include/asm-x86/bootparam.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_BOOTPARAM_H | 1 | #ifndef ASM_X86__BOOTPARAM_H | 
| 2 | #define _ASM_BOOTPARAM_H | 2 | #define ASM_X86__BOOTPARAM_H | 
| 3 | 3 | ||
| 4 | #include <linux/types.h> | 4 | #include <linux/types.h> | 
| 5 | #include <linux/screen_info.h> | 5 | #include <linux/screen_info.h> | 
| @@ -108,4 +108,4 @@ struct boot_params { | |||
| 108 | __u8 _pad9[276]; /* 0xeec */ | 108 | __u8 _pad9[276]; /* 0xeec */ | 
| 109 | } __attribute__((packed)); | 109 | } __attribute__((packed)); | 
| 110 | 110 | ||
| 111 | #endif /* _ASM_BOOTPARAM_H */ | 111 | #endif /* ASM_X86__BOOTPARAM_H */ | 
| diff --git a/include/asm-x86/bug.h b/include/asm-x86/bug.h index b69aa64b82a4..91ad43a54c47 100644 --- a/include/asm-x86/bug.h +++ b/include/asm-x86/bug.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_BUG_H | 1 | #ifndef ASM_X86__BUG_H | 
| 2 | #define _ASM_X86_BUG_H | 2 | #define ASM_X86__BUG_H | 
| 3 | 3 | ||
| 4 | #ifdef CONFIG_BUG | 4 | #ifdef CONFIG_BUG | 
| 5 | #define HAVE_ARCH_BUG | 5 | #define HAVE_ARCH_BUG | 
| @@ -36,4 +36,4 @@ do { \ | |||
| 36 | #endif /* !CONFIG_BUG */ | 36 | #endif /* !CONFIG_BUG */ | 
| 37 | 37 | ||
| 38 | #include <asm-generic/bug.h> | 38 | #include <asm-generic/bug.h> | 
| 39 | #endif | 39 | #endif /* ASM_X86__BUG_H */ | 
| diff --git a/include/asm-x86/bugs.h b/include/asm-x86/bugs.h index 021cbdd5f258..4761c461d23a 100644 --- a/include/asm-x86/bugs.h +++ b/include/asm-x86/bugs.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifndef _ASM_X86_BUGS_H | 1 | #ifndef ASM_X86__BUGS_H | 
| 2 | #define _ASM_X86_BUGS_H | 2 | #define ASM_X86__BUGS_H | 
| 3 | 3 | ||
| 4 | extern void check_bugs(void); | 4 | extern void check_bugs(void); | 
| 5 | int ppro_with_ram_bug(void); | 5 | int ppro_with_ram_bug(void); | 
| 6 | 6 | ||
| 7 | #endif /* _ASM_X86_BUGS_H */ | 7 | #endif /* ASM_X86__BUGS_H */ | 
| diff --git a/include/asm-x86/byteorder.h b/include/asm-x86/byteorder.h index e02ae2d89acf..722f27d68105 100644 --- a/include/asm-x86/byteorder.h +++ b/include/asm-x86/byteorder.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_BYTEORDER_H | 1 | #ifndef ASM_X86__BYTEORDER_H | 
| 2 | #define _ASM_X86_BYTEORDER_H | 2 | #define ASM_X86__BYTEORDER_H | 
| 3 | 3 | ||
| 4 | #include <asm/types.h> | 4 | #include <asm/types.h> | 
| 5 | #include <linux/compiler.h> | 5 | #include <linux/compiler.h> | 
| @@ -78,4 +78,4 @@ static inline __attribute_const__ __u32 ___arch__swab32(__u32 x) | |||
| 78 | 78 | ||
| 79 | #include <linux/byteorder/little_endian.h> | 79 | #include <linux/byteorder/little_endian.h> | 
| 80 | 80 | ||
| 81 | #endif /* _ASM_X86_BYTEORDER_H */ | 81 | #endif /* ASM_X86__BYTEORDER_H */ | 
| diff --git a/include/asm-x86/cache.h b/include/asm-x86/cache.h index 1e0bac86f38f..ea3f1cc06a97 100644 --- a/include/asm-x86/cache.h +++ b/include/asm-x86/cache.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ARCH_X86_CACHE_H | 1 | #ifndef ASM_X86__CACHE_H | 
| 2 | #define _ARCH_X86_CACHE_H | 2 | #define ASM_X86__CACHE_H | 
| 3 | 3 | ||
| 4 | /* L1 cache line size */ | 4 | /* L1 cache line size */ | 
| 5 | #define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT) | 5 | #define L1_CACHE_SHIFT (CONFIG_X86_L1_CACHE_SHIFT) | 
| @@ -17,4 +17,4 @@ | |||
| 17 | #endif | 17 | #endif | 
| 18 | #endif | 18 | #endif | 
| 19 | 19 | ||
| 20 | #endif | 20 | #endif /* ASM_X86__CACHE_H */ | 
| diff --git a/include/asm-x86/cacheflush.h b/include/asm-x86/cacheflush.h index f4c0ab50d2c2..59859cb28a36 100644 --- a/include/asm-x86/cacheflush.h +++ b/include/asm-x86/cacheflush.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_CACHEFLUSH_H | 1 | #ifndef ASM_X86__CACHEFLUSH_H | 
| 2 | #define _ASM_X86_CACHEFLUSH_H | 2 | #define ASM_X86__CACHEFLUSH_H | 
| 3 | 3 | ||
| 4 | /* Keep includes the same across arches. */ | 4 | /* Keep includes the same across arches. */ | 
| 5 | #include <linux/mm.h> | 5 | #include <linux/mm.h> | 
| @@ -112,4 +112,4 @@ static inline int rodata_test(void) | |||
| 112 | } | 112 | } | 
| 113 | #endif | 113 | #endif | 
| 114 | 114 | ||
| 115 | #endif | 115 | #endif /* ASM_X86__CACHEFLUSH_H */ | 
| diff --git a/include/asm-x86/calgary.h b/include/asm-x86/calgary.h index 67f60406e2d8..933fd272f826 100644 --- a/include/asm-x86/calgary.h +++ b/include/asm-x86/calgary.h | |||
| @@ -21,8 +21,8 @@ | |||
| 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 
| 22 | */ | 22 | */ | 
| 23 | 23 | ||
| 24 | #ifndef _ASM_X86_64_CALGARY_H | 24 | #ifndef ASM_X86__CALGARY_H | 
| 25 | #define _ASM_X86_64_CALGARY_H | 25 | #define ASM_X86__CALGARY_H | 
| 26 | 26 | ||
| 27 | #include <linux/spinlock.h> | 27 | #include <linux/spinlock.h> | 
| 28 | #include <linux/device.h> | 28 | #include <linux/device.h> | 
| @@ -69,4 +69,4 @@ static inline int calgary_iommu_init(void) { return 1; } | |||
| 69 | static inline void detect_calgary(void) { return; } | 69 | static inline void detect_calgary(void) { return; } | 
| 70 | #endif | 70 | #endif | 
| 71 | 71 | ||
| 72 | #endif /* _ASM_X86_64_CALGARY_H */ | 72 | #endif /* ASM_X86__CALGARY_H */ | 
| diff --git a/include/asm-x86/checksum_32.h b/include/asm-x86/checksum_32.h index 52bbb0d8c4c1..d041e8cda227 100644 --- a/include/asm-x86/checksum_32.h +++ b/include/asm-x86/checksum_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _I386_CHECKSUM_H | 1 | #ifndef ASM_X86__CHECKSUM_32_H | 
| 2 | #define _I386_CHECKSUM_H | 2 | #define ASM_X86__CHECKSUM_32_H | 
| 3 | 3 | ||
| 4 | #include <linux/in6.h> | 4 | #include <linux/in6.h> | 
| 5 | 5 | ||
| @@ -186,4 +186,4 @@ static inline __wsum csum_and_copy_to_user(const void *src, | |||
| 186 | return (__force __wsum)-1; /* invalid checksum */ | 186 | return (__force __wsum)-1; /* invalid checksum */ | 
| 187 | } | 187 | } | 
| 188 | 188 | ||
| 189 | #endif | 189 | #endif /* ASM_X86__CHECKSUM_32_H */ | 
| diff --git a/include/asm-x86/checksum_64.h b/include/asm-x86/checksum_64.h index 8bd861cc5267..110f403beb89 100644 --- a/include/asm-x86/checksum_64.h +++ b/include/asm-x86/checksum_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _X86_64_CHECKSUM_H | 1 | #ifndef ASM_X86__CHECKSUM_64_H | 
| 2 | #define _X86_64_CHECKSUM_H | 2 | #define ASM_X86__CHECKSUM_64_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * Checksums for x86-64 | 5 | * Checksums for x86-64 | 
| @@ -188,4 +188,4 @@ static inline unsigned add32_with_carry(unsigned a, unsigned b) | |||
| 188 | return a; | 188 | return a; | 
| 189 | } | 189 | } | 
| 190 | 190 | ||
| 191 | #endif | 191 | #endif /* ASM_X86__CHECKSUM_64_H */ | 
| diff --git a/include/asm-x86/cmpxchg_32.h b/include/asm-x86/cmpxchg_32.h index bf5a69d1329e..0622e45cdf7c 100644 --- a/include/asm-x86/cmpxchg_32.h +++ b/include/asm-x86/cmpxchg_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_CMPXCHG_H | 1 | #ifndef ASM_X86__CMPXCHG_32_H | 
| 2 | #define __ASM_CMPXCHG_H | 2 | #define ASM_X86__CMPXCHG_32_H | 
| 3 | 3 | ||
| 4 | #include <linux/bitops.h> /* for LOCK_PREFIX */ | 4 | #include <linux/bitops.h> /* for LOCK_PREFIX */ | 
| 5 | 5 | ||
| @@ -341,4 +341,4 @@ extern unsigned long long cmpxchg_486_u64(volatile void *, u64, u64); | |||
| 341 | 341 | ||
| 342 | #endif | 342 | #endif | 
| 343 | 343 | ||
| 344 | #endif | 344 | #endif /* ASM_X86__CMPXCHG_32_H */ | 
| diff --git a/include/asm-x86/cmpxchg_64.h b/include/asm-x86/cmpxchg_64.h index 17463ccf8166..63c1a5e61b99 100644 --- a/include/asm-x86/cmpxchg_64.h +++ b/include/asm-x86/cmpxchg_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_CMPXCHG_H | 1 | #ifndef ASM_X86__CMPXCHG_64_H | 
| 2 | #define __ASM_CMPXCHG_H | 2 | #define ASM_X86__CMPXCHG_64_H | 
| 3 | 3 | ||
| 4 | #include <asm/alternative.h> /* Provides LOCK_PREFIX */ | 4 | #include <asm/alternative.h> /* Provides LOCK_PREFIX */ | 
| 5 | 5 | ||
| @@ -182,4 +182,4 @@ static inline unsigned long __cmpxchg_local(volatile void *ptr, | |||
| 182 | cmpxchg_local((ptr), (o), (n)); \ | 182 | cmpxchg_local((ptr), (o), (n)); \ | 
| 183 | }) | 183 | }) | 
| 184 | 184 | ||
| 185 | #endif | 185 | #endif /* ASM_X86__CMPXCHG_64_H */ | 
| diff --git a/include/asm-x86/compat.h b/include/asm-x86/compat.h index 1793ac317a30..6732b150949e 100644 --- a/include/asm-x86/compat.h +++ b/include/asm-x86/compat.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_64_COMPAT_H | 1 | #ifndef ASM_X86__COMPAT_H | 
| 2 | #define _ASM_X86_64_COMPAT_H | 2 | #define ASM_X86__COMPAT_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * Architecture specific compatibility types | 5 | * Architecture specific compatibility types | 
| @@ -215,4 +215,4 @@ static inline int is_compat_task(void) | |||
| 215 | return current_thread_info()->status & TS_COMPAT; | 215 | return current_thread_info()->status & TS_COMPAT; | 
| 216 | } | 216 | } | 
| 217 | 217 | ||
| 218 | #endif /* _ASM_X86_64_COMPAT_H */ | 218 | #endif /* ASM_X86__COMPAT_H */ | 
| diff --git a/include/asm-x86/cpu.h b/include/asm-x86/cpu.h index 73f2ea84fd74..83a115083f0d 100644 --- a/include/asm-x86/cpu.h +++ b/include/asm-x86/cpu.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_I386_CPU_H_ | 1 | #ifndef ASM_X86__CPU_H | 
| 2 | #define _ASM_I386_CPU_H_ | 2 | #define ASM_X86__CPU_H | 
| 3 | 3 | ||
| 4 | #include <linux/device.h> | 4 | #include <linux/device.h> | 
| 5 | #include <linux/cpu.h> | 5 | #include <linux/cpu.h> | 
| @@ -17,4 +17,4 @@ extern void arch_unregister_cpu(int); | |||
| 17 | #endif | 17 | #endif | 
| 18 | 18 | ||
| 19 | DECLARE_PER_CPU(int, cpu_state); | 19 | DECLARE_PER_CPU(int, cpu_state); | 
| 20 | #endif /* _ASM_I386_CPU_H_ */ | 20 | #endif /* ASM_X86__CPU_H */ | 
| diff --git a/include/asm-x86/cpufeature.h b/include/asm-x86/cpufeature.h index cfcfb0a806ba..250fa0cb144b 100644 --- a/include/asm-x86/cpufeature.h +++ b/include/asm-x86/cpufeature.h | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | /* | 1 | /* | 
| 2 | * Defines x86 CPU feature bits | 2 | * Defines x86 CPU feature bits | 
| 3 | */ | 3 | */ | 
| 4 | #ifndef _ASM_X86_CPUFEATURE_H | 4 | #ifndef ASM_X86__CPUFEATURE_H | 
| 5 | #define _ASM_X86_CPUFEATURE_H | 5 | #define ASM_X86__CPUFEATURE_H | 
| 6 | 6 | ||
| 7 | #include <asm/required-features.h> | 7 | #include <asm/required-features.h> | 
| 8 | 8 | ||
| @@ -224,4 +224,4 @@ extern const char * const x86_power_flags[32]; | |||
| 224 | 224 | ||
| 225 | #endif /* defined(__KERNEL__) && !defined(__ASSEMBLY__) */ | 225 | #endif /* defined(__KERNEL__) && !defined(__ASSEMBLY__) */ | 
| 226 | 226 | ||
| 227 | #endif /* _ASM_X86_CPUFEATURE_H */ | 227 | #endif /* ASM_X86__CPUFEATURE_H */ | 
| diff --git a/include/asm-x86/current.h b/include/asm-x86/current.h index 7515c19d4988..a863ead856f3 100644 --- a/include/asm-x86/current.h +++ b/include/asm-x86/current.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _X86_CURRENT_H | 1 | #ifndef ASM_X86__CURRENT_H | 
| 2 | #define _X86_CURRENT_H | 2 | #define ASM_X86__CURRENT_H | 
| 3 | 3 | ||
| 4 | #ifdef CONFIG_X86_32 | 4 | #ifdef CONFIG_X86_32 | 
| 5 | #include <linux/compiler.h> | 5 | #include <linux/compiler.h> | 
| @@ -36,4 +36,4 @@ static __always_inline struct task_struct *get_current(void) | |||
| 36 | 36 | ||
| 37 | #define current get_current() | 37 | #define current get_current() | 
| 38 | 38 | ||
| 39 | #endif /* X86_CURRENT_H */ | 39 | #endif /* ASM_X86__CURRENT_H */ | 
| diff --git a/include/asm-x86/debugreg.h b/include/asm-x86/debugreg.h index c6344d572b03..ecb6907c3ea4 100644 --- a/include/asm-x86/debugreg.h +++ b/include/asm-x86/debugreg.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_DEBUGREG_H | 1 | #ifndef ASM_X86__DEBUGREG_H | 
| 2 | #define _ASM_X86_DEBUGREG_H | 2 | #define ASM_X86__DEBUGREG_H | 
| 3 | 3 | ||
| 4 | 4 | ||
| 5 | /* Indicate the register numbers for a number of the specific | 5 | /* Indicate the register numbers for a number of the specific | 
| @@ -67,4 +67,4 @@ | |||
| 67 | #define DR_LOCAL_SLOWDOWN (0x100) /* Local slow the pipeline */ | 67 | #define DR_LOCAL_SLOWDOWN (0x100) /* Local slow the pipeline */ | 
| 68 | #define DR_GLOBAL_SLOWDOWN (0x200) /* Global slow the pipeline */ | 68 | #define DR_GLOBAL_SLOWDOWN (0x200) /* Global slow the pipeline */ | 
| 69 | 69 | ||
| 70 | #endif | 70 | #endif /* ASM_X86__DEBUGREG_H */ | 
| diff --git a/include/asm-x86/delay.h b/include/asm-x86/delay.h index 409a649204aa..8a0da95b4fc5 100644 --- a/include/asm-x86/delay.h +++ b/include/asm-x86/delay.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_DELAY_H | 1 | #ifndef ASM_X86__DELAY_H | 
| 2 | #define _ASM_X86_DELAY_H | 2 | #define ASM_X86__DELAY_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * Copyright (C) 1993 Linus Torvalds | 5 | * Copyright (C) 1993 Linus Torvalds | 
| @@ -28,4 +28,4 @@ extern void __delay(unsigned long loops); | |||
| 28 | 28 | ||
| 29 | void use_tsc_delay(void); | 29 | void use_tsc_delay(void); | 
| 30 | 30 | ||
| 31 | #endif /* _ASM_X86_DELAY_H */ | 31 | #endif /* ASM_X86__DELAY_H */ | 
| diff --git a/include/asm-x86/desc.h b/include/asm-x86/desc.h index a44c4dc70590..b73fea54def2 100644 --- a/include/asm-x86/desc.h +++ b/include/asm-x86/desc.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_DESC_H_ | 1 | #ifndef ASM_X86__DESC_H | 
| 2 | #define _ASM_DESC_H_ | 2 | #define ASM_X86__DESC_H | 
| 3 | 3 | ||
| 4 | #ifndef __ASSEMBLY__ | 4 | #ifndef __ASSEMBLY__ | 
| 5 | #include <asm/desc_defs.h> | 5 | #include <asm/desc_defs.h> | 
| @@ -397,4 +397,4 @@ static inline void set_system_gate_ist(int n, void *addr, unsigned ist) | |||
| 397 | 397 | ||
| 398 | #endif /* __ASSEMBLY__ */ | 398 | #endif /* __ASSEMBLY__ */ | 
| 399 | 399 | ||
| 400 | #endif | 400 | #endif /* ASM_X86__DESC_H */ | 
| diff --git a/include/asm-x86/desc_defs.h b/include/asm-x86/desc_defs.h index f7bacf357dac..b881db664b46 100644 --- a/include/asm-x86/desc_defs.h +++ b/include/asm-x86/desc_defs.h | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* Written 2000 by Andi Kleen */ | 1 | /* Written 2000 by Andi Kleen */ | 
| 2 | #ifndef __ARCH_DESC_DEFS_H | 2 | #ifndef ASM_X86__DESC_DEFS_H | 
| 3 | #define __ARCH_DESC_DEFS_H | 3 | #define ASM_X86__DESC_DEFS_H | 
| 4 | 4 | ||
| 5 | /* | 5 | /* | 
| 6 | * Segment descriptor structure definitions, usable from both x86_64 and i386 | 6 | * Segment descriptor structure definitions, usable from both x86_64 and i386 | 
| @@ -92,4 +92,4 @@ struct desc_ptr { | |||
| 92 | 92 | ||
| 93 | #endif /* !__ASSEMBLY__ */ | 93 | #endif /* !__ASSEMBLY__ */ | 
| 94 | 94 | ||
| 95 | #endif | 95 | #endif /* ASM_X86__DESC_DEFS_H */ | 
| diff --git a/include/asm-x86/device.h b/include/asm-x86/device.h index 3c034f48fdb0..1bece04c7d9d 100644 --- a/include/asm-x86/device.h +++ b/include/asm-x86/device.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_DEVICE_H | 1 | #ifndef ASM_X86__DEVICE_H | 
| 2 | #define _ASM_X86_DEVICE_H | 2 | #define ASM_X86__DEVICE_H | 
| 3 | 3 | ||
| 4 | struct dev_archdata { | 4 | struct dev_archdata { | 
| 5 | #ifdef CONFIG_ACPI | 5 | #ifdef CONFIG_ACPI | 
| @@ -13,4 +13,4 @@ struct dma_mapping_ops *dma_ops; | |||
| 13 | #endif | 13 | #endif | 
| 14 | }; | 14 | }; | 
| 15 | 15 | ||
| 16 | #endif /* _ASM_X86_DEVICE_H */ | 16 | #endif /* ASM_X86__DEVICE_H */ | 
| diff --git a/include/asm-x86/div64.h b/include/asm-x86/div64.h index 9a2d644c08ef..f9530f23f1d6 100644 --- a/include/asm-x86/div64.h +++ b/include/asm-x86/div64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_DIV64_H | 1 | #ifndef ASM_X86__DIV64_H | 
| 2 | #define _ASM_X86_DIV64_H | 2 | #define ASM_X86__DIV64_H | 
| 3 | 3 | ||
| 4 | #ifdef CONFIG_X86_32 | 4 | #ifdef CONFIG_X86_32 | 
| 5 | 5 | ||
| @@ -57,4 +57,4 @@ static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) | |||
| 57 | # include <asm-generic/div64.h> | 57 | # include <asm-generic/div64.h> | 
| 58 | #endif /* CONFIG_X86_32 */ | 58 | #endif /* CONFIG_X86_32 */ | 
| 59 | 59 | ||
| 60 | #endif /* _ASM_X86_DIV64_H */ | 60 | #endif /* ASM_X86__DIV64_H */ | 
| diff --git a/include/asm-x86/dma-mapping.h b/include/asm-x86/dma-mapping.h index ad9cd6d49bfc..5d200e78bd81 100644 --- a/include/asm-x86/dma-mapping.h +++ b/include/asm-x86/dma-mapping.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_DMA_MAPPING_H_ | 1 | #ifndef ASM_X86__DMA_MAPPING_H | 
| 2 | #define _ASM_DMA_MAPPING_H_ | 2 | #define ASM_X86__DMA_MAPPING_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * IOMMU interface. See Documentation/DMA-mapping.txt and DMA-API.txt for | 5 | * IOMMU interface. See Documentation/DMA-mapping.txt and DMA-API.txt for | 
| @@ -250,4 +250,4 @@ static inline int dma_get_cache_alignment(void) | |||
| 250 | #define dma_is_consistent(d, h) (1) | 250 | #define dma_is_consistent(d, h) (1) | 
| 251 | 251 | ||
| 252 | #include <asm-generic/dma-coherent.h> | 252 | #include <asm-generic/dma-coherent.h> | 
| 253 | #endif | 253 | #endif /* ASM_X86__DMA_MAPPING_H */ | 
| diff --git a/include/asm-x86/dma.h b/include/asm-x86/dma.h index ca1098a7e580..c9f7a4eec555 100644 --- a/include/asm-x86/dma.h +++ b/include/asm-x86/dma.h | |||
| @@ -5,8 +5,8 @@ | |||
| 5 | * and John Boyd, Nov. 1992. | 5 | * and John Boyd, Nov. 1992. | 
| 6 | */ | 6 | */ | 
| 7 | 7 | ||
| 8 | #ifndef _ASM_X86_DMA_H | 8 | #ifndef ASM_X86__DMA_H | 
| 9 | #define _ASM_X86_DMA_H | 9 | #define ASM_X86__DMA_H | 
| 10 | 10 | ||
| 11 | #include <linux/spinlock.h> /* And spinlocks */ | 11 | #include <linux/spinlock.h> /* And spinlocks */ | 
| 12 | #include <asm/io.h> /* need byte IO */ | 12 | #include <asm/io.h> /* need byte IO */ | 
| @@ -315,4 +315,4 @@ extern int isa_dma_bridge_buggy; | |||
| 315 | #define isa_dma_bridge_buggy (0) | 315 | #define isa_dma_bridge_buggy (0) | 
| 316 | #endif | 316 | #endif | 
| 317 | 317 | ||
| 318 | #endif /* _ASM_X86_DMA_H */ | 318 | #endif /* ASM_X86__DMA_H */ | 
| diff --git a/include/asm-x86/dmi.h b/include/asm-x86/dmi.h index 58a86571fe0f..1cff6fe81fa5 100644 --- a/include/asm-x86/dmi.h +++ b/include/asm-x86/dmi.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_DMI_H | 1 | #ifndef ASM_X86__DMI_H | 
| 2 | #define _ASM_X86_DMI_H | 2 | #define ASM_X86__DMI_H | 
| 3 | 3 | ||
| 4 | #include <asm/io.h> | 4 | #include <asm/io.h> | 
| 5 | 5 | ||
| @@ -23,4 +23,4 @@ static inline void *dmi_alloc(unsigned len) | |||
| 23 | #define dmi_ioremap early_ioremap | 23 | #define dmi_ioremap early_ioremap | 
| 24 | #define dmi_iounmap early_iounmap | 24 | #define dmi_iounmap early_iounmap | 
| 25 | 25 | ||
| 26 | #endif | 26 | #endif /* ASM_X86__DMI_H */ | 
| diff --git a/include/asm-x86/ds.h b/include/asm-x86/ds.h index 7881368142fa..c3c953a45b21 100644 --- a/include/asm-x86/ds.h +++ b/include/asm-x86/ds.h | |||
| @@ -2,71 +2,237 @@ | |||
| 2 | * Debug Store (DS) support | 2 | * Debug Store (DS) support | 
| 3 | * | 3 | * | 
| 4 | * This provides a low-level interface to the hardware's Debug Store | 4 | * This provides a low-level interface to the hardware's Debug Store | 
| 5 | * feature that is used for last branch recording (LBR) and | 5 | * feature that is used for branch trace store (BTS) and | 
| 6 | * precise-event based sampling (PEBS). | 6 | * precise-event based sampling (PEBS). | 
| 7 | * | 7 | * | 
| 8 | * Different architectures use a different DS layout/pointer size. | 8 | * It manages: | 
| 9 | * The below functions therefore work on a void*. | 9 | * - per-thread and per-cpu allocation of BTS and PEBS | 
| 10 | * - buffer memory allocation (optional) | ||
| 11 | * - buffer overflow handling | ||
| 12 | * - buffer access | ||
| 10 | * | 13 | * | 
| 14 | * It assumes: | ||
| 15 | * - get_task_struct on all parameter tasks | ||
| 16 | * - current is allowed to trace parameter tasks | ||
| 11 | * | 17 | * | 
| 12 | * Since there is no user for PEBS, yet, only LBR (or branch | ||
| 13 | * trace store, BTS) is supported. | ||
| 14 | * | 18 | * | 
| 15 | * | 19 | * Copyright (C) 2007-2008 Intel Corporation. | 
| 16 | * Copyright (C) 2007 Intel Corporation. | 20 | * Markus Metzger <markus.t.metzger@intel.com>, 2007-2008 | 
| 17 | * Markus Metzger <markus.t.metzger@intel.com>, Dec 2007 | ||
| 18 | */ | 21 | */ | 
| 19 | 22 | ||
| 20 | #ifndef _ASM_X86_DS_H | 23 | #ifndef ASM_X86__DS_H | 
| 21 | #define _ASM_X86_DS_H | 24 | #define ASM_X86__DS_H | 
| 25 | |||
| 26 | #ifdef CONFIG_X86_DS | ||
| 22 | 27 | ||
| 23 | #include <linux/types.h> | 28 | #include <linux/types.h> | 
| 24 | #include <linux/init.h> | 29 | #include <linux/init.h> | 
| 25 | 30 | ||
| 26 | struct cpuinfo_x86; | ||
| 27 | 31 | ||
| 32 | struct task_struct; | ||
| 28 | 33 | ||
| 29 | /* a branch trace record entry | 34 | /* | 
| 35 | * Request BTS or PEBS | ||
| 36 | * | ||
| 37 | * Due to alignement constraints, the actual buffer may be slightly | ||
| 38 | * smaller than the requested or provided buffer. | ||
| 30 | * | 39 | * | 
| 31 | * In order to unify the interface between various processor versions, | 40 | * Returns 0 on success; -Eerrno otherwise | 
| 32 | * we use the below data structure for all processors. | 41 | * | 
| 42 | * task: the task to request recording for; | ||
| 43 | * NULL for per-cpu recording on the current cpu | ||
| 44 | * base: the base pointer for the (non-pageable) buffer; | ||
| 45 | * NULL if buffer allocation requested | ||
| 46 | * size: the size of the requested or provided buffer | ||
| 47 | * ovfl: pointer to a function to be called on buffer overflow; | ||
| 48 | * NULL if cyclic buffer requested | ||
| 33 | */ | 49 | */ | 
| 34 | enum bts_qualifier { | 50 | typedef void (*ds_ovfl_callback_t)(struct task_struct *); | 
| 35 | BTS_INVALID = 0, | 51 | extern int ds_request_bts(struct task_struct *task, void *base, size_t size, | 
| 36 | BTS_BRANCH, | 52 | ds_ovfl_callback_t ovfl); | 
| 37 | BTS_TASK_ARRIVES, | 53 | extern int ds_request_pebs(struct task_struct *task, void *base, size_t size, | 
| 38 | BTS_TASK_DEPARTS | 54 | ds_ovfl_callback_t ovfl); | 
| 39 | }; | ||
| 40 | 55 | ||
| 41 | struct bts_struct { | 56 | /* | 
| 42 | u64 qualifier; | 57 | * Release BTS or PEBS resources | 
| 43 | union { | 58 | * | 
| 44 | /* BTS_BRANCH */ | 59 | * Frees buffers allocated on ds_request. | 
| 45 | struct { | 60 | * | 
| 46 | u64 from_ip; | 61 | * Returns 0 on success; -Eerrno otherwise | 
| 47 | u64 to_ip; | 62 | * | 
| 48 | } lbr; | 63 | * task: the task to release resources for; | 
| 49 | /* BTS_TASK_ARRIVES or | 64 | * NULL to release resources for the current cpu | 
| 50 | BTS_TASK_DEPARTS */ | 65 | */ | 
| 51 | u64 jiffies; | 66 | extern int ds_release_bts(struct task_struct *task); | 
| 52 | } variant; | 67 | extern int ds_release_pebs(struct task_struct *task); | 
| 68 | |||
| 69 | /* | ||
| 70 | * Return the (array) index of the write pointer. | ||
| 71 | * (assuming an array of BTS/PEBS records) | ||
| 72 | * | ||
| 73 | * Returns -Eerrno on error | ||
| 74 | * | ||
| 75 | * task: the task to access; | ||
| 76 | * NULL to access the current cpu | ||
| 77 | * pos (out): if not NULL, will hold the result | ||
| 78 | */ | ||
| 79 | extern int ds_get_bts_index(struct task_struct *task, size_t *pos); | ||
| 80 | extern int ds_get_pebs_index(struct task_struct *task, size_t *pos); | ||
| 81 | |||
| 82 | /* | ||
| 83 | * Return the (array) index one record beyond the end of the array. | ||
| 84 | * (assuming an array of BTS/PEBS records) | ||
| 85 | * | ||
| 86 | * Returns -Eerrno on error | ||
| 87 | * | ||
| 88 | * task: the task to access; | ||
| 89 | * NULL to access the current cpu | ||
| 90 | * pos (out): if not NULL, will hold the result | ||
| 91 | */ | ||
| 92 | extern int ds_get_bts_end(struct task_struct *task, size_t *pos); | ||
| 93 | extern int ds_get_pebs_end(struct task_struct *task, size_t *pos); | ||
| 94 | |||
| 95 | /* | ||
| 96 | * Provide a pointer to the BTS/PEBS record at parameter index. | ||
| 97 | * (assuming an array of BTS/PEBS records) | ||
| 98 | * | ||
| 99 | * The pointer points directly into the buffer. The user is | ||
| 100 | * responsible for copying the record. | ||
| 101 | * | ||
| 102 | * Returns the size of a single record on success; -Eerrno on error | ||
| 103 | * | ||
| 104 | * task: the task to access; | ||
| 105 | * NULL to access the current cpu | ||
| 106 | * index: the index of the requested record | ||
| 107 | * record (out): pointer to the requested record | ||
| 108 | */ | ||
| 109 | extern int ds_access_bts(struct task_struct *task, | ||
| 110 | size_t index, const void **record); | ||
| 111 | extern int ds_access_pebs(struct task_struct *task, | ||
| 112 | size_t index, const void **record); | ||
| 113 | |||
| 114 | /* | ||
| 115 | * Write one or more BTS/PEBS records at the write pointer index and | ||
| 116 | * advance the write pointer. | ||
| 117 | * | ||
| 118 | * If size is not a multiple of the record size, trailing bytes are | ||
| 119 | * zeroed out. | ||
| 120 | * | ||
| 121 | * May result in one or more overflow notifications. | ||
| 122 | * | ||
| 123 | * If called during overflow handling, that is, with index >= | ||
| 124 | * interrupt threshold, the write will wrap around. | ||
| 125 | * | ||
| 126 | * An overflow notification is given if and when the interrupt | ||
| 127 | * threshold is reached during or after the write. | ||
| 128 | * | ||
| 129 | * Returns the number of bytes written or -Eerrno. | ||
| 130 | * | ||
| 131 | * task: the task to access; | ||
| 132 | * NULL to access the current cpu | ||
| 133 | * buffer: the buffer to write | ||
| 134 | * size: the size of the buffer | ||
| 135 | */ | ||
| 136 | extern int ds_write_bts(struct task_struct *task, | ||
| 137 | const void *buffer, size_t size); | ||
| 138 | extern int ds_write_pebs(struct task_struct *task, | ||
| 139 | const void *buffer, size_t size); | ||
| 140 | |||
| 141 | /* | ||
| 142 | * Same as ds_write_bts/pebs, but omit ownership checks. | ||
| 143 | * | ||
| 144 | * This is needed to have some other task than the owner of the | ||
| 145 | * BTS/PEBS buffer or the parameter task itself write into the | ||
| 146 | * respective buffer. | ||
| 147 | */ | ||
| 148 | extern int ds_unchecked_write_bts(struct task_struct *task, | ||
| 149 | const void *buffer, size_t size); | ||
| 150 | extern int ds_unchecked_write_pebs(struct task_struct *task, | ||
| 151 | const void *buffer, size_t size); | ||
| 152 | |||
| 153 | /* | ||
| 154 | * Reset the write pointer of the BTS/PEBS buffer. | ||
| 155 | * | ||
| 156 | * Returns 0 on success; -Eerrno on error | ||
| 157 | * | ||
| 158 | * task: the task to access; | ||
| 159 | * NULL to access the current cpu | ||
| 160 | */ | ||
| 161 | extern int ds_reset_bts(struct task_struct *task); | ||
| 162 | extern int ds_reset_pebs(struct task_struct *task); | ||
| 163 | |||
| 164 | /* | ||
| 165 | * Clear the BTS/PEBS buffer and reset the write pointer. | ||
| 166 | * The entire buffer will be zeroed out. | ||
| 167 | * | ||
| 168 | * Returns 0 on success; -Eerrno on error | ||
| 169 | * | ||
| 170 | * task: the task to access; | ||
| 171 | * NULL to access the current cpu | ||
| 172 | */ | ||
| 173 | extern int ds_clear_bts(struct task_struct *task); | ||
| 174 | extern int ds_clear_pebs(struct task_struct *task); | ||
| 175 | |||
| 176 | /* | ||
| 177 | * Provide the PEBS counter reset value. | ||
| 178 | * | ||
| 179 | * Returns 0 on success; -Eerrno on error | ||
| 180 | * | ||
| 181 | * task: the task to access; | ||
| 182 | * NULL to access the current cpu | ||
| 183 | * value (out): the counter reset value | ||
| 184 | */ | ||
| 185 | extern int ds_get_pebs_reset(struct task_struct *task, u64 *value); | ||
| 186 | |||
| 187 | /* | ||
| 188 | * Set the PEBS counter reset value. | ||
| 189 | * | ||
| 190 | * Returns 0 on success; -Eerrno on error | ||
| 191 | * | ||
| 192 | * task: the task to access; | ||
| 193 | * NULL to access the current cpu | ||
| 194 | * value: the new counter reset value | ||
| 195 | */ | ||
| 196 | extern int ds_set_pebs_reset(struct task_struct *task, u64 value); | ||
| 197 | |||
| 198 | /* | ||
| 199 | * Initialization | ||
| 200 | */ | ||
| 201 | struct cpuinfo_x86; | ||
| 202 | extern void __cpuinit ds_init_intel(struct cpuinfo_x86 *); | ||
| 203 | |||
| 204 | |||
| 205 | |||
| 206 | /* | ||
| 207 | * The DS context - part of struct thread_struct. | ||
| 208 | */ | ||
| 209 | struct ds_context { | ||
| 210 | /* pointer to the DS configuration; goes into MSR_IA32_DS_AREA */ | ||
| 211 | unsigned char *ds; | ||
| 212 | /* the owner of the BTS and PEBS configuration, respectively */ | ||
| 213 | struct task_struct *owner[2]; | ||
| 214 | /* buffer overflow notification function for BTS and PEBS */ | ||
| 215 | ds_ovfl_callback_t callback[2]; | ||
| 216 | /* the original buffer address */ | ||
| 217 | void *buffer[2]; | ||
| 218 | /* the number of allocated pages for on-request allocated buffers */ | ||
| 219 | unsigned int pages[2]; | ||
| 220 | /* use count */ | ||
| 221 | unsigned long count; | ||
| 222 | /* a pointer to the context location inside the thread_struct | ||
| 223 | * or the per_cpu context array */ | ||
| 224 | struct ds_context **this; | ||
| 225 | /* a pointer to the task owning this context, or NULL, if the | ||
| 226 | * context is owned by a cpu */ | ||
| 227 | struct task_struct *task; | ||
| 53 | }; | 228 | }; | 
| 54 | 229 | ||
| 55 | /* Overflow handling mechanisms */ | 230 | /* called by exit_thread() to free leftover contexts */ | 
| 56 | #define DS_O_SIGNAL 1 /* send overflow signal */ | 231 | extern void ds_free(struct ds_context *context); | 
| 57 | #define DS_O_WRAP 2 /* wrap around */ | 232 | |
| 58 | 233 | #else /* CONFIG_X86_DS */ | |
| 59 | extern int ds_allocate(void **, size_t); | 234 | |
| 60 | extern int ds_free(void **); | 235 | #define ds_init_intel(config) do {} while (0) | 
| 61 | extern int ds_get_bts_size(void *); | 236 | |
| 62 | extern int ds_get_bts_end(void *); | 237 | #endif /* CONFIG_X86_DS */ | 
| 63 | extern int ds_get_bts_index(void *); | 238 | #endif /* ASM_X86__DS_H */ | 
| 64 | extern int ds_set_overflow(void *, int); | ||
| 65 | extern int ds_get_overflow(void *); | ||
| 66 | extern int ds_clear(void *); | ||
| 67 | extern int ds_read_bts(void *, int, struct bts_struct *); | ||
| 68 | extern int ds_write_bts(void *, const struct bts_struct *); | ||
| 69 | extern unsigned long ds_debugctl_mask(void); | ||
| 70 | extern void __cpuinit ds_init_intel(struct cpuinfo_x86 *c); | ||
| 71 | |||
| 72 | #endif /* _ASM_X86_DS_H */ | ||
| diff --git a/include/asm-x86/dwarf2.h b/include/asm-x86/dwarf2.h index 738bb9fb3e53..21d1bc32ad7c 100644 --- a/include/asm-x86/dwarf2.h +++ b/include/asm-x86/dwarf2.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _DWARF2_H | 1 | #ifndef ASM_X86__DWARF2_H | 
| 2 | #define _DWARF2_H | 2 | #define ASM_X86__DWARF2_H | 
| 3 | 3 | ||
| 4 | #ifndef __ASSEMBLY__ | 4 | #ifndef __ASSEMBLY__ | 
| 5 | #warning "asm/dwarf2.h should be only included in pure assembly files" | 5 | #warning "asm/dwarf2.h should be only included in pure assembly files" | 
| @@ -58,4 +58,4 @@ | |||
| 58 | 58 | ||
| 59 | #endif | 59 | #endif | 
| 60 | 60 | ||
| 61 | #endif | 61 | #endif /* ASM_X86__DWARF2_H */ | 
| diff --git a/include/asm-x86/e820.h b/include/asm-x86/e820.h index 16a31e2c7c57..f52daf176bcb 100644 --- a/include/asm-x86/e820.h +++ b/include/asm-x86/e820.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_E820_H | 1 | #ifndef ASM_X86__E820_H | 
| 2 | #define __ASM_E820_H | 2 | #define ASM_X86__E820_H | 
| 3 | #define E820MAP 0x2d0 /* our map */ | 3 | #define E820MAP 0x2d0 /* our map */ | 
| 4 | #define E820MAX 128 /* number of entries in E820MAP */ | 4 | #define E820MAX 128 /* number of entries in E820MAP */ | 
| 5 | 5 | ||
| @@ -64,6 +64,7 @@ struct e820map { | |||
| 64 | extern struct e820map e820; | 64 | extern struct e820map e820; | 
| 65 | extern struct e820map e820_saved; | 65 | extern struct e820map e820_saved; | 
| 66 | 66 | ||
| 67 | extern unsigned long pci_mem_start; | ||
| 67 | extern int e820_any_mapped(u64 start, u64 end, unsigned type); | 68 | extern int e820_any_mapped(u64 start, u64 end, unsigned type); | 
| 68 | extern int e820_all_mapped(u64 start, u64 end, unsigned type); | 69 | extern int e820_all_mapped(u64 start, u64 end, unsigned type); | 
| 69 | extern void e820_add_region(u64 start, u64 size, int type); | 70 | extern void e820_add_region(u64 start, u64 size, int type); | 
| @@ -140,4 +141,4 @@ extern char *memory_setup(void); | |||
| 140 | #define HIGH_MEMORY (1024*1024) | 141 | #define HIGH_MEMORY (1024*1024) | 
| 141 | #endif /* __KERNEL__ */ | 142 | #endif /* __KERNEL__ */ | 
| 142 | 143 | ||
| 143 | #endif /* __ASM_E820_H */ | 144 | #endif /* ASM_X86__E820_H */ | 
| diff --git a/include/asm-x86/edac.h b/include/asm-x86/edac.h index a8088f63a30e..9493c5b27bbd 100644 --- a/include/asm-x86/edac.h +++ b/include/asm-x86/edac.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_EDAC_H | 1 | #ifndef ASM_X86__EDAC_H | 
| 2 | #define _ASM_X86_EDAC_H | 2 | #define ASM_X86__EDAC_H | 
| 3 | 3 | ||
| 4 | /* ECC atomic, DMA, SMP and interrupt safe scrub function */ | 4 | /* ECC atomic, DMA, SMP and interrupt safe scrub function */ | 
| 5 | 5 | ||
| @@ -15,4 +15,4 @@ static inline void atomic_scrub(void *va, u32 size) | |||
| 15 | asm volatile("lock; addl $0, %0"::"m" (*virt_addr)); | 15 | asm volatile("lock; addl $0, %0"::"m" (*virt_addr)); | 
| 16 | } | 16 | } | 
| 17 | 17 | ||
| 18 | #endif | 18 | #endif /* ASM_X86__EDAC_H */ | 
| diff --git a/include/asm-x86/efi.h b/include/asm-x86/efi.h index d4f2b0abe929..ed2de22e8705 100644 --- a/include/asm-x86/efi.h +++ b/include/asm-x86/efi.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_EFI_H | 1 | #ifndef ASM_X86__EFI_H | 
| 2 | #define _ASM_X86_EFI_H | 2 | #define ASM_X86__EFI_H | 
| 3 | 3 | ||
| 4 | #ifdef CONFIG_X86_32 | 4 | #ifdef CONFIG_X86_32 | 
| 5 | 5 | ||
| @@ -94,4 +94,4 @@ extern void efi_reserve_early(void); | |||
| 94 | extern void efi_call_phys_prelog(void); | 94 | extern void efi_call_phys_prelog(void); | 
| 95 | extern void efi_call_phys_epilog(void); | 95 | extern void efi_call_phys_epilog(void); | 
| 96 | 96 | ||
| 97 | #endif | 97 | #endif /* ASM_X86__EFI_H */ | 
| diff --git a/include/asm-x86/elf.h b/include/asm-x86/elf.h index 7be4733c793e..5c4745bec906 100644 --- a/include/asm-x86/elf.h +++ b/include/asm-x86/elf.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_ELF_H | 1 | #ifndef ASM_X86__ELF_H | 
| 2 | #define _ASM_X86_ELF_H | 2 | #define ASM_X86__ELF_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * ELF register definitions.. | 5 | * ELF register definitions.. | 
| @@ -148,8 +148,9 @@ do { \ | |||
| 148 | 148 | ||
| 149 | static inline void start_ia32_thread(struct pt_regs *regs, u32 ip, u32 sp) | 149 | static inline void start_ia32_thread(struct pt_regs *regs, u32 ip, u32 sp) | 
| 150 | { | 150 | { | 
| 151 | asm volatile("movl %0,%%fs" :: "r" (0)); | 151 | loadsegment(fs, 0); | 
| 152 | asm volatile("movl %0,%%es; movl %0,%%ds" : : "r" (__USER32_DS)); | 152 | loadsegment(ds, __USER32_DS); | 
| 153 | loadsegment(es, __USER32_DS); | ||
| 153 | load_gs_index(0); | 154 | load_gs_index(0); | 
| 154 | regs->ip = ip; | 155 | regs->ip = ip; | 
| 155 | regs->sp = sp; | 156 | regs->sp = sp; | 
| @@ -332,4 +333,4 @@ extern int syscall32_setup_pages(struct linux_binprm *, int exstack); | |||
| 332 | extern unsigned long arch_randomize_brk(struct mm_struct *mm); | 333 | extern unsigned long arch_randomize_brk(struct mm_struct *mm); | 
| 333 | #define arch_randomize_brk arch_randomize_brk | 334 | #define arch_randomize_brk arch_randomize_brk | 
| 334 | 335 | ||
| 335 | #endif | 336 | #endif /* ASM_X86__ELF_H */ | 
| diff --git a/include/asm-x86/emergency-restart.h b/include/asm-x86/emergency-restart.h index 8e6aef19f8f0..190d0d8b71e3 100644 --- a/include/asm-x86/emergency-restart.h +++ b/include/asm-x86/emergency-restart.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_EMERGENCY_RESTART_H | 1 | #ifndef ASM_X86__EMERGENCY_RESTART_H | 
| 2 | #define _ASM_EMERGENCY_RESTART_H | 2 | #define ASM_X86__EMERGENCY_RESTART_H | 
| 3 | 3 | ||
| 4 | enum reboot_type { | 4 | enum reboot_type { | 
| 5 | BOOT_TRIPLE = 't', | 5 | BOOT_TRIPLE = 't', | 
| @@ -15,4 +15,4 @@ extern enum reboot_type reboot_type; | |||
| 15 | 15 | ||
| 16 | extern void machine_emergency_restart(void); | 16 | extern void machine_emergency_restart(void); | 
| 17 | 17 | ||
| 18 | #endif /* _ASM_EMERGENCY_RESTART_H */ | 18 | #endif /* ASM_X86__EMERGENCY_RESTART_H */ | 
| diff --git a/include/asm-x86/fb.h b/include/asm-x86/fb.h index 53018464aea6..aca38dbd9a64 100644 --- a/include/asm-x86/fb.h +++ b/include/asm-x86/fb.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_FB_H | 1 | #ifndef ASM_X86__FB_H | 
| 2 | #define _ASM_X86_FB_H | 2 | #define ASM_X86__FB_H | 
| 3 | 3 | ||
| 4 | #include <linux/fb.h> | 4 | #include <linux/fb.h> | 
| 5 | #include <linux/fs.h> | 5 | #include <linux/fs.h> | 
| @@ -18,4 +18,4 @@ extern int fb_is_primary_device(struct fb_info *info); | |||
| 18 | static inline int fb_is_primary_device(struct fb_info *info) { return 0; } | 18 | static inline int fb_is_primary_device(struct fb_info *info) { return 0; } | 
| 19 | #endif | 19 | #endif | 
| 20 | 20 | ||
| 21 | #endif /* _ASM_X86_FB_H */ | 21 | #endif /* ASM_X86__FB_H */ | 
| diff --git a/include/asm-x86/fixmap.h b/include/asm-x86/fixmap.h index 44d4f8217349..78e33a1bc591 100644 --- a/include/asm-x86/fixmap.h +++ b/include/asm-x86/fixmap.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_FIXMAP_H | 1 | #ifndef ASM_X86__FIXMAP_H | 
| 2 | #define _ASM_FIXMAP_H | 2 | #define ASM_X86__FIXMAP_H | 
| 3 | 3 | ||
| 4 | #ifdef CONFIG_X86_32 | 4 | #ifdef CONFIG_X86_32 | 
| 5 | # include "fixmap_32.h" | 5 | # include "fixmap_32.h" | 
| @@ -65,4 +65,4 @@ static inline unsigned long virt_to_fix(const unsigned long vaddr) | |||
| 65 | BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START); | 65 | BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START); | 
| 66 | return __virt_to_fix(vaddr); | 66 | return __virt_to_fix(vaddr); | 
| 67 | } | 67 | } | 
| 68 | #endif | 68 | #endif /* ASM_X86__FIXMAP_H */ | 
| diff --git a/include/asm-x86/fixmap_32.h b/include/asm-x86/fixmap_32.h index f1ac2b2167d7..784e3e759866 100644 --- a/include/asm-x86/fixmap_32.h +++ b/include/asm-x86/fixmap_32.h | |||
| @@ -10,8 +10,8 @@ | |||
| 10 | * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999 | 10 | * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999 | 
| 11 | */ | 11 | */ | 
| 12 | 12 | ||
| 13 | #ifndef _ASM_FIXMAP_32_H | 13 | #ifndef ASM_X86__FIXMAP_32_H | 
| 14 | #define _ASM_FIXMAP_32_H | 14 | #define ASM_X86__FIXMAP_32_H | 
| 15 | 15 | ||
| 16 | 16 | ||
| 17 | /* used by vmalloc.c, vsyscall.lds.S. | 17 | /* used by vmalloc.c, vsyscall.lds.S. | 
| @@ -120,4 +120,4 @@ extern void reserve_top_address(unsigned long reserve); | |||
| 120 | #define FIXADDR_BOOT_START (FIXADDR_TOP - __FIXADDR_BOOT_SIZE) | 120 | #define FIXADDR_BOOT_START (FIXADDR_TOP - __FIXADDR_BOOT_SIZE) | 
| 121 | 121 | ||
| 122 | #endif /* !__ASSEMBLY__ */ | 122 | #endif /* !__ASSEMBLY__ */ | 
| 123 | #endif | 123 | #endif /* ASM_X86__FIXMAP_32_H */ | 
| diff --git a/include/asm-x86/fixmap_64.h b/include/asm-x86/fixmap_64.h index 00f3d74a0524..dafb24bc0424 100644 --- a/include/asm-x86/fixmap_64.h +++ b/include/asm-x86/fixmap_64.h | |||
| @@ -8,8 +8,8 @@ | |||
| 8 | * Copyright (C) 1998 Ingo Molnar | 8 | * Copyright (C) 1998 Ingo Molnar | 
| 9 | */ | 9 | */ | 
| 10 | 10 | ||
| 11 | #ifndef _ASM_FIXMAP_64_H | 11 | #ifndef ASM_X86__FIXMAP_64_H | 
| 12 | #define _ASM_FIXMAP_64_H | 12 | #define ASM_X86__FIXMAP_64_H | 
| 13 | 13 | ||
| 14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> | 
| 15 | #include <asm/acpi.h> | 15 | #include <asm/acpi.h> | 
| @@ -80,4 +80,4 @@ enum fixed_addresses { | |||
| 80 | #define FIXADDR_USER_START ((unsigned long)VSYSCALL32_VSYSCALL) | 80 | #define FIXADDR_USER_START ((unsigned long)VSYSCALL32_VSYSCALL) | 
| 81 | #define FIXADDR_USER_END (FIXADDR_USER_START + PAGE_SIZE) | 81 | #define FIXADDR_USER_END (FIXADDR_USER_START + PAGE_SIZE) | 
| 82 | 82 | ||
| 83 | #endif | 83 | #endif /* ASM_X86__FIXMAP_64_H */ | 
| diff --git a/include/asm-x86/floppy.h b/include/asm-x86/floppy.h index dbe82a5c5eac..7d83a3a83e37 100644 --- a/include/asm-x86/floppy.h +++ b/include/asm-x86/floppy.h | |||
| @@ -7,8 +7,8 @@ | |||
| 7 | * | 7 | * | 
| 8 | * Copyright (C) 1995 | 8 | * Copyright (C) 1995 | 
| 9 | */ | 9 | */ | 
| 10 | #ifndef _ASM_X86_FLOPPY_H | 10 | #ifndef ASM_X86__FLOPPY_H | 
| 11 | #define _ASM_X86_FLOPPY_H | 11 | #define ASM_X86__FLOPPY_H | 
| 12 | 12 | ||
| 13 | #include <linux/vmalloc.h> | 13 | #include <linux/vmalloc.h> | 
| 14 | 14 | ||
| @@ -278,4 +278,4 @@ static int FDC2 = -1; | |||
| 278 | 278 | ||
| 279 | #define EXTRA_FLOPPY_PARAMS | 279 | #define EXTRA_FLOPPY_PARAMS | 
| 280 | 280 | ||
| 281 | #endif /* _ASM_X86_FLOPPY_H */ | 281 | #endif /* ASM_X86__FLOPPY_H */ | 
| diff --git a/include/asm-x86/ftrace.h b/include/asm-x86/ftrace.h index 5c68b32ee1c8..be0e004ad148 100644 --- a/include/asm-x86/ftrace.h +++ b/include/asm-x86/ftrace.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_FTRACE | 1 | #ifndef ASM_X86__FTRACE_H | 
| 2 | #define _ASM_X86_FTRACE | 2 | #define ASM_X86__FTRACE_H | 
| 3 | 3 | ||
| 4 | #ifdef CONFIG_FTRACE | 4 | #ifdef CONFIG_FTRACE | 
| 5 | #define MCOUNT_ADDR ((long)(mcount)) | 5 | #define MCOUNT_ADDR ((long)(mcount)) | 
| @@ -11,4 +11,4 @@ extern void mcount(void); | |||
| 11 | 11 | ||
| 12 | #endif /* CONFIG_FTRACE */ | 12 | #endif /* CONFIG_FTRACE */ | 
| 13 | 13 | ||
| 14 | #endif /* _ASM_X86_FTRACE */ | 14 | #endif /* ASM_X86__FTRACE_H */ | 
| diff --git a/include/asm-x86/futex.h b/include/asm-x86/futex.h index e7a76b37b333..06b924ef6fa5 100644 --- a/include/asm-x86/futex.h +++ b/include/asm-x86/futex.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_FUTEX_H | 1 | #ifndef ASM_X86__FUTEX_H | 
| 2 | #define _ASM_X86_FUTEX_H | 2 | #define ASM_X86__FUTEX_H | 
| 3 | 3 | ||
| 4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ | 
| 5 | 5 | ||
| @@ -25,7 +25,7 @@ | |||
| 25 | asm volatile("1:\tmovl %2, %0\n" \ | 25 | asm volatile("1:\tmovl %2, %0\n" \ | 
| 26 | "\tmovl\t%0, %3\n" \ | 26 | "\tmovl\t%0, %3\n" \ | 
| 27 | "\t" insn "\n" \ | 27 | "\t" insn "\n" \ | 
| 28 | "2:\tlock; cmpxchgl %3, %2\n" \ | 28 | "2:\t" LOCK_PREFIX "cmpxchgl %3, %2\n" \ | 
| 29 | "\tjnz\t1b\n" \ | 29 | "\tjnz\t1b\n" \ | 
| 30 | "3:\t.section .fixup,\"ax\"\n" \ | 30 | "3:\t.section .fixup,\"ax\"\n" \ | 
| 31 | "4:\tmov\t%5, %1\n" \ | 31 | "4:\tmov\t%5, %1\n" \ | 
| @@ -64,7 +64,7 @@ static inline int futex_atomic_op_inuser(int encoded_op, int __user *uaddr) | |||
| 64 | __futex_atomic_op1("xchgl %0, %2", ret, oldval, uaddr, oparg); | 64 | __futex_atomic_op1("xchgl %0, %2", ret, oldval, uaddr, oparg); | 
| 65 | break; | 65 | break; | 
| 66 | case FUTEX_OP_ADD: | 66 | case FUTEX_OP_ADD: | 
| 67 | __futex_atomic_op1("lock; xaddl %0, %2", ret, oldval, | 67 | __futex_atomic_op1(LOCK_PREFIX "xaddl %0, %2", ret, oldval, | 
| 68 | uaddr, oparg); | 68 | uaddr, oparg); | 
| 69 | break; | 69 | break; | 
| 70 | case FUTEX_OP_OR: | 70 | case FUTEX_OP_OR: | 
| @@ -122,7 +122,7 @@ static inline int futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, | |||
| 122 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) | 122 | if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) | 
| 123 | return -EFAULT; | 123 | return -EFAULT; | 
| 124 | 124 | ||
| 125 | asm volatile("1:\tlock; cmpxchgl %3, %1\n" | 125 | asm volatile("1:\t" LOCK_PREFIX "cmpxchgl %3, %1\n" | 
| 126 | "2:\t.section .fixup, \"ax\"\n" | 126 | "2:\t.section .fixup, \"ax\"\n" | 
| 127 | "3:\tmov %2, %0\n" | 127 | "3:\tmov %2, %0\n" | 
| 128 | "\tjmp 2b\n" | 128 | "\tjmp 2b\n" | 
| @@ -137,4 +137,4 @@ static inline int futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, | |||
| 137 | } | 137 | } | 
| 138 | 138 | ||
| 139 | #endif | 139 | #endif | 
| 140 | #endif | 140 | #endif /* ASM_X86__FUTEX_H */ | 
| diff --git a/include/asm-x86/gart.h b/include/asm-x86/gart.h index 3f62a83887f3..baa54faba892 100644 --- a/include/asm-x86/gart.h +++ b/include/asm-x86/gart.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X8664_GART_H | 1 | #ifndef ASM_X86__GART_H | 
| 2 | #define _ASM_X8664_GART_H 1 | 2 | #define ASM_X86__GART_H | 
| 3 | 3 | ||
| 4 | #include <asm/e820.h> | 4 | #include <asm/e820.h> | 
| 5 | 5 | ||
| @@ -52,15 +52,15 @@ static inline int aperture_valid(u64 aper_base, u32 aper_size, u32 min_size) | |||
| 52 | return 0; | 52 | return 0; | 
| 53 | 53 | ||
| 54 | if (aper_base + aper_size > 0x100000000ULL) { | 54 | if (aper_base + aper_size > 0x100000000ULL) { | 
| 55 | printk(KERN_ERR "Aperture beyond 4GB. Ignoring.\n"); | 55 | printk(KERN_INFO "Aperture beyond 4GB. Ignoring.\n"); | 
| 56 | return 0; | 56 | return 0; | 
| 57 | } | 57 | } | 
| 58 | if (e820_any_mapped(aper_base, aper_base + aper_size, E820_RAM)) { | 58 | if (e820_any_mapped(aper_base, aper_base + aper_size, E820_RAM)) { | 
| 59 | printk(KERN_ERR "Aperture pointing to e820 RAM. Ignoring.\n"); | 59 | printk(KERN_INFO "Aperture pointing to e820 RAM. Ignoring.\n"); | 
| 60 | return 0; | 60 | return 0; | 
| 61 | } | 61 | } | 
| 62 | if (aper_size < min_size) { | 62 | if (aper_size < min_size) { | 
| 63 | printk(KERN_ERR "Aperture too small (%d MB) than (%d MB)\n", | 63 | printk(KERN_INFO "Aperture too small (%d MB) than (%d MB)\n", | 
| 64 | aper_size>>20, min_size>>20); | 64 | aper_size>>20, min_size>>20); | 
| 65 | return 0; | 65 | return 0; | 
| 66 | } | 66 | } | 
| @@ -68,4 +68,4 @@ static inline int aperture_valid(u64 aper_base, u32 aper_size, u32 min_size) | |||
| 68 | return 1; | 68 | return 1; | 
| 69 | } | 69 | } | 
| 70 | 70 | ||
| 71 | #endif | 71 | #endif /* ASM_X86__GART_H */ | 
| diff --git a/include/asm-x86/genapic_32.h b/include/asm-x86/genapic_32.h index 754d635f90ff..34280f027664 100644 --- a/include/asm-x86/genapic_32.h +++ b/include/asm-x86/genapic_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_GENAPIC_H | 1 | #ifndef ASM_X86__GENAPIC_32_H | 
| 2 | #define _ASM_GENAPIC_H 1 | 2 | #define ASM_X86__GENAPIC_32_H | 
| 3 | 3 | ||
| 4 | #include <asm/mpspec.h> | 4 | #include <asm/mpspec.h> | 
| 5 | 5 | ||
| @@ -121,4 +121,4 @@ enum uv_system_type {UV_NONE, UV_LEGACY_APIC, UV_X2APIC, UV_NON_UNIQUE_APIC}; | |||
| 121 | #define uv_system_init() do {} while (0) | 121 | #define uv_system_init() do {} while (0) | 
| 122 | 122 | ||
| 123 | 123 | ||
| 124 | #endif | 124 | #endif /* ASM_X86__GENAPIC_32_H */ | 
| diff --git a/include/asm-x86/genapic_64.h b/include/asm-x86/genapic_64.h index a47d63129135..25097a8cc5ef 100644 --- a/include/asm-x86/genapic_64.h +++ b/include/asm-x86/genapic_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_GENAPIC_H | 1 | #ifndef ASM_X86__GENAPIC_64_H | 
| 2 | #define _ASM_GENAPIC_H 1 | 2 | #define ASM_X86__GENAPIC_64_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * Copyright 2004 James Cleverdon, IBM. | 5 | * Copyright 2004 James Cleverdon, IBM. | 
| @@ -47,4 +47,4 @@ extern int uv_wakeup_secondary(int phys_apicid, unsigned int start_rip); | |||
| 47 | 47 | ||
| 48 | extern void setup_apic_routing(void); | 48 | extern void setup_apic_routing(void); | 
| 49 | 49 | ||
| 50 | #endif | 50 | #endif /* ASM_X86__GENAPIC_64_H */ | 
| diff --git a/include/asm-x86/geode.h b/include/asm-x86/geode.h index 2c1cda0b8a86..3f3444be2638 100644 --- a/include/asm-x86/geode.h +++ b/include/asm-x86/geode.h | |||
| @@ -7,8 +7,8 @@ | |||
| 7 | * as published by the Free Software Foundation. | 7 | * as published by the Free Software Foundation. | 
| 8 | */ | 8 | */ | 
| 9 | 9 | ||
| 10 | #ifndef _ASM_GEODE_H_ | 10 | #ifndef ASM_X86__GEODE_H | 
| 11 | #define _ASM_GEODE_H_ | 11 | #define ASM_X86__GEODE_H | 
| 12 | 12 | ||
| 13 | #include <asm/processor.h> | 13 | #include <asm/processor.h> | 
| 14 | #include <linux/io.h> | 14 | #include <linux/io.h> | 
| @@ -250,4 +250,4 @@ extern int __init mfgpt_timer_setup(void); | |||
| 250 | static inline int mfgpt_timer_setup(void) { return 0; } | 250 | static inline int mfgpt_timer_setup(void) { return 0; } | 
| 251 | #endif | 251 | #endif | 
| 252 | 252 | ||
| 253 | #endif | 253 | #endif /* ASM_X86__GEODE_H */ | 
| diff --git a/include/asm-x86/gpio.h b/include/asm-x86/gpio.h index c4c91b37c104..497fb980d962 100644 --- a/include/asm-x86/gpio.h +++ b/include/asm-x86/gpio.h | |||
| @@ -53,4 +53,4 @@ static inline int irq_to_gpio(unsigned int irq) | |||
| 53 | 53 | ||
| 54 | #endif /* CONFIG_GPIOLIB */ | 54 | #endif /* CONFIG_GPIOLIB */ | 
| 55 | 55 | ||
| 56 | #endif /* _ASM_I386_GPIO_H */ | 56 | #endif /* ASM_X86__GPIO_H */ | 
| diff --git a/include/asm-x86/hardirq_32.h b/include/asm-x86/hardirq_32.h index 4f85f0f4b563..700fe230d919 100644 --- a/include/asm-x86/hardirq_32.h +++ b/include/asm-x86/hardirq_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_HARDIRQ_H | 1 | #ifndef ASM_X86__HARDIRQ_32_H | 
| 2 | #define __ASM_HARDIRQ_H | 2 | #define ASM_X86__HARDIRQ_32_H | 
| 3 | 3 | ||
| 4 | #include <linux/threads.h> | 4 | #include <linux/threads.h> | 
| 5 | #include <linux/irq.h> | 5 | #include <linux/irq.h> | 
| @@ -25,4 +25,4 @@ DECLARE_PER_CPU(irq_cpustat_t, irq_stat); | |||
| 25 | void ack_bad_irq(unsigned int irq); | 25 | void ack_bad_irq(unsigned int irq); | 
| 26 | #include <linux/irq_cpustat.h> | 26 | #include <linux/irq_cpustat.h> | 
| 27 | 27 | ||
| 28 | #endif /* __ASM_HARDIRQ_H */ | 28 | #endif /* ASM_X86__HARDIRQ_32_H */ | 
| diff --git a/include/asm-x86/hardirq_64.h b/include/asm-x86/hardirq_64.h index 95d5e090ed89..f8bd2919a8ce 100644 --- a/include/asm-x86/hardirq_64.h +++ b/include/asm-x86/hardirq_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_HARDIRQ_H | 1 | #ifndef ASM_X86__HARDIRQ_64_H | 
| 2 | #define __ASM_HARDIRQ_H | 2 | #define ASM_X86__HARDIRQ_64_H | 
| 3 | 3 | ||
| 4 | #include <linux/threads.h> | 4 | #include <linux/threads.h> | 
| 5 | #include <linux/irq.h> | 5 | #include <linux/irq.h> | 
| @@ -20,4 +20,4 @@ | |||
| 20 | 20 | ||
| 21 | extern void ack_bad_irq(unsigned int irq); | 21 | extern void ack_bad_irq(unsigned int irq); | 
| 22 | 22 | ||
| 23 | #endif /* __ASM_HARDIRQ_H */ | 23 | #endif /* ASM_X86__HARDIRQ_64_H */ | 
| diff --git a/include/asm-x86/highmem.h b/include/asm-x86/highmem.h index 4514b16cc723..bc3f6a280316 100644 --- a/include/asm-x86/highmem.h +++ b/include/asm-x86/highmem.h | |||
| @@ -15,8 +15,8 @@ | |||
| 15 | * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com> | 15 | * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com> | 
| 16 | */ | 16 | */ | 
| 17 | 17 | ||
| 18 | #ifndef _ASM_HIGHMEM_H | 18 | #ifndef ASM_X86__HIGHMEM_H | 
| 19 | #define _ASM_HIGHMEM_H | 19 | #define ASM_X86__HIGHMEM_H | 
| 20 | 20 | ||
| 21 | #ifdef __KERNEL__ | 21 | #ifdef __KERNEL__ | 
| 22 | 22 | ||
| @@ -79,4 +79,4 @@ extern void add_highpages_with_active_regions(int nid, unsigned long start_pfn, | |||
| 79 | 79 | ||
| 80 | #endif /* __KERNEL__ */ | 80 | #endif /* __KERNEL__ */ | 
| 81 | 81 | ||
| 82 | #endif /* _ASM_HIGHMEM_H */ | 82 | #endif /* ASM_X86__HIGHMEM_H */ | 
| diff --git a/include/asm-x86/hpet.h b/include/asm-x86/hpet.h index 82f1ac641bd7..cbbbb6d4dd32 100644 --- a/include/asm-x86/hpet.h +++ b/include/asm-x86/hpet.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef ASM_X86_HPET_H | 1 | #ifndef ASM_X86__HPET_H | 
| 2 | #define ASM_X86_HPET_H | 2 | #define ASM_X86__HPET_H | 
| 3 | 3 | ||
| 4 | #ifdef CONFIG_HPET_TIMER | 4 | #ifdef CONFIG_HPET_TIMER | 
| 5 | 5 | ||
| @@ -90,4 +90,4 @@ static inline int is_hpet_enabled(void) { return 0; } | |||
| 90 | #define hpet_readl(a) 0 | 90 | #define hpet_readl(a) 0 | 
| 91 | 91 | ||
| 92 | #endif | 92 | #endif | 
| 93 | #endif /* ASM_X86_HPET_H */ | 93 | #endif /* ASM_X86__HPET_H */ | 
| diff --git a/include/asm-x86/hugetlb.h b/include/asm-x86/hugetlb.h index 439a9acc132d..0b7ec5dc0884 100644 --- a/include/asm-x86/hugetlb.h +++ b/include/asm-x86/hugetlb.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_HUGETLB_H | 1 | #ifndef ASM_X86__HUGETLB_H | 
| 2 | #define _ASM_X86_HUGETLB_H | 2 | #define ASM_X86__HUGETLB_H | 
| 3 | 3 | ||
| 4 | #include <asm/page.h> | 4 | #include <asm/page.h> | 
| 5 | 5 | ||
| @@ -90,4 +90,4 @@ static inline void arch_release_hugepage(struct page *page) | |||
| 90 | { | 90 | { | 
| 91 | } | 91 | } | 
| 92 | 92 | ||
| 93 | #endif /* _ASM_X86_HUGETLB_H */ | 93 | #endif /* ASM_X86__HUGETLB_H */ | 
| diff --git a/include/asm-x86/hw_irq.h b/include/asm-x86/hw_irq.h index edd0b95f14d0..65997b15d56a 100644 --- a/include/asm-x86/hw_irq.h +++ b/include/asm-x86/hw_irq.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_HW_IRQ_H | 1 | #ifndef ASM_X86__HW_IRQ_H | 
| 2 | #define _ASM_HW_IRQ_H | 2 | #define ASM_X86__HW_IRQ_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar | 5 | * (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar | 
| @@ -93,6 +93,26 @@ extern asmlinkage void qic_reschedule_interrupt(void); | |||
| 93 | extern asmlinkage void qic_enable_irq_interrupt(void); | 93 | extern asmlinkage void qic_enable_irq_interrupt(void); | 
| 94 | extern asmlinkage void qic_call_function_interrupt(void); | 94 | extern asmlinkage void qic_call_function_interrupt(void); | 
| 95 | 95 | ||
| 96 | /* SMP */ | ||
| 97 | extern void smp_apic_timer_interrupt(struct pt_regs *); | ||
| 98 | #ifdef CONFIG_X86_32 | ||
| 99 | extern void smp_spurious_interrupt(struct pt_regs *); | ||
| 100 | extern void smp_error_interrupt(struct pt_regs *); | ||
| 101 | #else | ||
| 102 | extern asmlinkage void smp_spurious_interrupt(void); | ||
| 103 | extern asmlinkage void smp_error_interrupt(void); | ||
| 104 | #endif | ||
| 105 | #ifdef CONFIG_X86_SMP | ||
| 106 | extern void smp_reschedule_interrupt(struct pt_regs *); | ||
| 107 | extern void smp_call_function_interrupt(struct pt_regs *); | ||
| 108 | extern void smp_call_function_single_interrupt(struct pt_regs *); | ||
| 109 | #ifdef CONFIG_X86_32 | ||
| 110 | extern void smp_invalidate_interrupt(struct pt_regs *); | ||
| 111 | #else | ||
| 112 | extern asmlinkage void smp_invalidate_interrupt(struct pt_regs *); | ||
| 113 | #endif | ||
| 114 | #endif | ||
| 115 | |||
| 96 | #ifdef CONFIG_X86_32 | 116 | #ifdef CONFIG_X86_32 | 
| 97 | extern void (*const interrupt[NR_IRQS])(void); | 117 | extern void (*const interrupt[NR_IRQS])(void); | 
| 98 | #else | 118 | #else | 
| @@ -112,4 +132,4 @@ static inline void __setup_vector_irq(int cpu) {} | |||
| 112 | 132 | ||
| 113 | #endif /* !ASSEMBLY_ */ | 133 | #endif /* !ASSEMBLY_ */ | 
| 114 | 134 | ||
| 115 | #endif | 135 | #endif /* ASM_X86__HW_IRQ_H */ | 
| diff --git a/include/asm-x86/hypertransport.h b/include/asm-x86/hypertransport.h index d2bbd238b3e1..cc011a3bc1c2 100644 --- a/include/asm-x86/hypertransport.h +++ b/include/asm-x86/hypertransport.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef ASM_HYPERTRANSPORT_H | 1 | #ifndef ASM_X86__HYPERTRANSPORT_H | 
| 2 | #define ASM_HYPERTRANSPORT_H | 2 | #define ASM_X86__HYPERTRANSPORT_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * Constants for x86 Hypertransport Interrupts. | 5 | * Constants for x86 Hypertransport Interrupts. | 
| @@ -42,4 +42,4 @@ | |||
| 42 | #define HT_IRQ_HIGH_DEST_ID(v) \ | 42 | #define HT_IRQ_HIGH_DEST_ID(v) \ | 
| 43 | ((((v) >> 8) << HT_IRQ_HIGH_DEST_ID_SHIFT) & HT_IRQ_HIGH_DEST_ID_MASK) | 43 | ((((v) >> 8) << HT_IRQ_HIGH_DEST_ID_SHIFT) & HT_IRQ_HIGH_DEST_ID_MASK) | 
| 44 | 44 | ||
| 45 | #endif /* ASM_HYPERTRANSPORT_H */ | 45 | #endif /* ASM_X86__HYPERTRANSPORT_H */ | 
| diff --git a/include/asm-x86/i387.h b/include/asm-x86/i387.h index 56d00e31aec0..1ecdc3ed96e4 100644 --- a/include/asm-x86/i387.h +++ b/include/asm-x86/i387.h | |||
| @@ -7,8 +7,8 @@ | |||
| 7 | * x86-64 work by Andi Kleen 2002 | 7 | * x86-64 work by Andi Kleen 2002 | 
| 8 | */ | 8 | */ | 
| 9 | 9 | ||
| 10 | #ifndef _ASM_X86_I387_H | 10 | #ifndef ASM_X86__I387_H | 
| 11 | #define _ASM_X86_I387_H | 11 | #define ASM_X86__I387_H | 
| 12 | 12 | ||
| 13 | #include <linux/sched.h> | 13 | #include <linux/sched.h> | 
| 14 | #include <linux/kernel_stat.h> | 14 | #include <linux/kernel_stat.h> | 
| @@ -25,6 +25,7 @@ extern void mxcsr_feature_mask_init(void); | |||
| 25 | extern int init_fpu(struct task_struct *child); | 25 | extern int init_fpu(struct task_struct *child); | 
| 26 | extern asmlinkage void math_state_restore(void); | 26 | extern asmlinkage void math_state_restore(void); | 
| 27 | extern void init_thread_xstate(void); | 27 | extern void init_thread_xstate(void); | 
| 28 | extern int dump_fpu(struct pt_regs *, struct user_i387_struct *); | ||
| 28 | 29 | ||
| 29 | extern user_regset_active_fn fpregs_active, xfpregs_active; | 30 | extern user_regset_active_fn fpregs_active, xfpregs_active; | 
| 30 | extern user_regset_get_fn fpregs_get, xfpregs_get, fpregs_soft_get; | 31 | extern user_regset_get_fn fpregs_get, xfpregs_get, fpregs_soft_get; | 
| @@ -336,4 +337,4 @@ static inline unsigned short get_fpu_mxcsr(struct task_struct *tsk) | |||
| 336 | } | 337 | } | 
| 337 | } | 338 | } | 
| 338 | 339 | ||
| 339 | #endif /* _ASM_X86_I387_H */ | 340 | #endif /* ASM_X86__I387_H */ | 
| diff --git a/include/asm-x86/i8253.h b/include/asm-x86/i8253.h index b51c0487fc41..15a5b530044e 100644 --- a/include/asm-x86/i8253.h +++ b/include/asm-x86/i8253.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_I8253_H__ | 1 | #ifndef ASM_X86__I8253_H | 
| 2 | #define __ASM_I8253_H__ | 2 | #define ASM_X86__I8253_H | 
| 3 | 3 | ||
| 4 | /* i8253A PIT registers */ | 4 | /* i8253A PIT registers */ | 
| 5 | #define PIT_MODE 0x43 | 5 | #define PIT_MODE 0x43 | 
| @@ -15,4 +15,4 @@ extern void setup_pit_timer(void); | |||
| 15 | #define inb_pit inb_p | 15 | #define inb_pit inb_p | 
| 16 | #define outb_pit outb_p | 16 | #define outb_pit outb_p | 
| 17 | 17 | ||
| 18 | #endif /* __ASM_I8253_H__ */ | 18 | #endif /* ASM_X86__I8253_H */ | 
| diff --git a/include/asm-x86/i8259.h b/include/asm-x86/i8259.h index 2f98df91f1f2..c586559a6957 100644 --- a/include/asm-x86/i8259.h +++ b/include/asm-x86/i8259.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_I8259_H__ | 1 | #ifndef ASM_X86__I8259_H | 
| 2 | #define __ASM_I8259_H__ | 2 | #define ASM_X86__I8259_H | 
| 3 | 3 | ||
| 4 | #include <linux/delay.h> | 4 | #include <linux/delay.h> | 
| 5 | 5 | ||
| @@ -57,4 +57,4 @@ static inline void outb_pic(unsigned char value, unsigned int port) | |||
| 57 | 57 | ||
| 58 | extern struct irq_chip i8259A_chip; | 58 | extern struct irq_chip i8259A_chip; | 
| 59 | 59 | ||
| 60 | #endif /* __ASM_I8259_H__ */ | 60 | #endif /* ASM_X86__I8259_H */ | 
| diff --git a/include/asm-x86/ia32.h b/include/asm-x86/ia32.h index 55d3abe5276f..f932f7ad51dd 100644 --- a/include/asm-x86/ia32.h +++ b/include/asm-x86/ia32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_64_IA32_H | 1 | #ifndef ASM_X86__IA32_H | 
| 2 | #define _ASM_X86_64_IA32_H | 2 | #define ASM_X86__IA32_H | 
| 3 | 3 | ||
| 4 | 4 | ||
| 5 | #ifdef CONFIG_IA32_EMULATION | 5 | #ifdef CONFIG_IA32_EMULATION | 
| @@ -167,4 +167,4 @@ extern void ia32_pick_mmap_layout(struct mm_struct *mm); | |||
| 167 | 167 | ||
| 168 | #endif /* !CONFIG_IA32_SUPPORT */ | 168 | #endif /* !CONFIG_IA32_SUPPORT */ | 
| 169 | 169 | ||
| 170 | #endif | 170 | #endif /* ASM_X86__IA32_H */ | 
| diff --git a/include/asm-x86/ia32_unistd.h b/include/asm-x86/ia32_unistd.h index 61cea9e7c5c1..dbd887d8a5a5 100644 --- a/include/asm-x86/ia32_unistd.h +++ b/include/asm-x86/ia32_unistd.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_64_IA32_UNISTD_H_ | 1 | #ifndef ASM_X86__IA32_UNISTD_H | 
| 2 | #define _ASM_X86_64_IA32_UNISTD_H_ | 2 | #define ASM_X86__IA32_UNISTD_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * This file contains the system call numbers of the ia32 port, | 5 | * This file contains the system call numbers of the ia32 port, | 
| @@ -15,4 +15,4 @@ | |||
| 15 | #define __NR_ia32_sigreturn 119 | 15 | #define __NR_ia32_sigreturn 119 | 
| 16 | #define __NR_ia32_rt_sigreturn 173 | 16 | #define __NR_ia32_rt_sigreturn 173 | 
| 17 | 17 | ||
| 18 | #endif /* _ASM_X86_64_IA32_UNISTD_H_ */ | 18 | #endif /* ASM_X86__IA32_UNISTD_H */ | 
| diff --git a/include/asm-x86/idle.h b/include/asm-x86/idle.h index cbb649123612..baa3f783d27d 100644 --- a/include/asm-x86/idle.h +++ b/include/asm-x86/idle.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_64_IDLE_H | 1 | #ifndef ASM_X86__IDLE_H | 
| 2 | #define _ASM_X86_64_IDLE_H 1 | 2 | #define ASM_X86__IDLE_H | 
| 3 | 3 | ||
| 4 | #define IDLE_START 1 | 4 | #define IDLE_START 1 | 
| 5 | #define IDLE_END 2 | 5 | #define IDLE_END 2 | 
| @@ -12,4 +12,4 @@ void exit_idle(void); | |||
| 12 | 12 | ||
| 13 | void c1e_remove_cpu(int cpu); | 13 | void c1e_remove_cpu(int cpu); | 
| 14 | 14 | ||
| 15 | #endif | 15 | #endif /* ASM_X86__IDLE_H */ | 
| diff --git a/include/asm-x86/intel_arch_perfmon.h b/include/asm-x86/intel_arch_perfmon.h index fa0fd068bc2e..07c03c6c9a16 100644 --- a/include/asm-x86/intel_arch_perfmon.h +++ b/include/asm-x86/intel_arch_perfmon.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_INTEL_ARCH_PERFMON_H | 1 | #ifndef ASM_X86__INTEL_ARCH_PERFMON_H | 
| 2 | #define _ASM_X86_INTEL_ARCH_PERFMON_H | 2 | #define ASM_X86__INTEL_ARCH_PERFMON_H | 
| 3 | 3 | ||
| 4 | #define MSR_ARCH_PERFMON_PERFCTR0 0xc1 | 4 | #define MSR_ARCH_PERFMON_PERFCTR0 0xc1 | 
| 5 | #define MSR_ARCH_PERFMON_PERFCTR1 0xc2 | 5 | #define MSR_ARCH_PERFMON_PERFCTR1 0xc2 | 
| @@ -28,4 +28,4 @@ union cpuid10_eax { | |||
| 28 | unsigned int full; | 28 | unsigned int full; | 
| 29 | }; | 29 | }; | 
| 30 | 30 | ||
| 31 | #endif /* _ASM_X86_INTEL_ARCH_PERFMON_H */ | 31 | #endif /* ASM_X86__INTEL_ARCH_PERFMON_H */ | 
| diff --git a/include/asm-x86/io.h b/include/asm-x86/io.h index 0f954dc89cb3..72b7719523bf 100644 --- a/include/asm-x86/io.h +++ b/include/asm-x86/io.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_IO_H | 1 | #ifndef ASM_X86__IO_H | 
| 2 | #define _ASM_X86_IO_H | 2 | #define ASM_X86__IO_H | 
| 3 | 3 | ||
| 4 | #define ARCH_HAS_IOREMAP_WC | 4 | #define ARCH_HAS_IOREMAP_WC | 
| 5 | 5 | ||
| @@ -73,6 +73,8 @@ build_mmio_write(__writeq, "q", unsigned long, "r", ) | |||
| 73 | #define writeq writeq | 73 | #define writeq writeq | 
| 74 | #endif | 74 | #endif | 
| 75 | 75 | ||
| 76 | extern int iommu_bio_merge; | ||
| 77 | |||
| 76 | #ifdef CONFIG_X86_32 | 78 | #ifdef CONFIG_X86_32 | 
| 77 | # include "io_32.h" | 79 | # include "io_32.h" | 
| 78 | #else | 80 | #else | 
| @@ -99,4 +101,4 @@ extern void early_iounmap(void *addr, unsigned long size); | |||
| 99 | extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys); | 101 | extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys); | 
| 100 | 102 | ||
| 101 | 103 | ||
| 102 | #endif /* _ASM_X86_IO_H */ | 104 | #endif /* ASM_X86__IO_H */ | 
| diff --git a/include/asm-x86/io_32.h b/include/asm-x86/io_32.h index e876d89ac156..4f7d878bda18 100644 --- a/include/asm-x86/io_32.h +++ b/include/asm-x86/io_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_IO_H | 1 | #ifndef ASM_X86__IO_32_H | 
| 2 | #define _ASM_IO_H | 2 | #define ASM_X86__IO_32_H | 
| 3 | 3 | ||
| 4 | #include <linux/string.h> | 4 | #include <linux/string.h> | 
| 5 | #include <linux/compiler.h> | 5 | #include <linux/compiler.h> | 
| @@ -281,4 +281,4 @@ BUILDIO(b, b, char) | |||
| 281 | BUILDIO(w, w, short) | 281 | BUILDIO(w, w, short) | 
| 282 | BUILDIO(l, , int) | 282 | BUILDIO(l, , int) | 
| 283 | 283 | ||
| 284 | #endif | 284 | #endif /* ASM_X86__IO_32_H */ | 
| diff --git a/include/asm-x86/io_64.h b/include/asm-x86/io_64.h index 22995c5c5adc..64429e9431a8 100644 --- a/include/asm-x86/io_64.h +++ b/include/asm-x86/io_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_IO_H | 1 | #ifndef ASM_X86__IO_64_H | 
| 2 | #define _ASM_IO_H | 2 | #define ASM_X86__IO_64_H | 
| 3 | 3 | ||
| 4 | 4 | ||
| 5 | /* | 5 | /* | 
| @@ -235,7 +235,6 @@ void memset_io(volatile void __iomem *a, int b, size_t c); | |||
| 235 | 235 | ||
| 236 | #define flush_write_buffers() | 236 | #define flush_write_buffers() | 
| 237 | 237 | ||
| 238 | extern int iommu_bio_merge; | ||
| 239 | #define BIO_VMERGE_BOUNDARY iommu_bio_merge | 238 | #define BIO_VMERGE_BOUNDARY iommu_bio_merge | 
| 240 | 239 | ||
| 241 | /* | 240 | /* | 
| @@ -245,4 +244,4 @@ extern int iommu_bio_merge; | |||
| 245 | 244 | ||
| 246 | #endif /* __KERNEL__ */ | 245 | #endif /* __KERNEL__ */ | 
| 247 | 246 | ||
| 248 | #endif | 247 | #endif /* ASM_X86__IO_64_H */ | 
| diff --git a/include/asm-x86/io_apic.h b/include/asm-x86/io_apic.h index 14f82bbcb5fd..be62847ab07e 100644 --- a/include/asm-x86/io_apic.h +++ b/include/asm-x86/io_apic.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_IO_APIC_H | 1 | #ifndef ASM_X86__IO_APIC_H | 
| 2 | #define __ASM_IO_APIC_H | 2 | #define ASM_X86__IO_APIC_H | 
| 3 | 3 | ||
| 4 | #include <linux/types.h> | 4 | #include <linux/types.h> | 
| 5 | #include <asm/mpspec.h> | 5 | #include <asm/mpspec.h> | 
| @@ -189,4 +189,4 @@ static const int timer_through_8259 = 0; | |||
| 189 | static inline void ioapic_init_mappings(void) { } | 189 | static inline void ioapic_init_mappings(void) { } | 
| 190 | #endif | 190 | #endif | 
| 191 | 191 | ||
| 192 | #endif | 192 | #endif /* ASM_X86__IO_APIC_H */ | 
| diff --git a/include/asm-x86/ioctls.h b/include/asm-x86/ioctls.h index c0c338bd4068..336603512399 100644 --- a/include/asm-x86/ioctls.h +++ b/include/asm-x86/ioctls.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_IOCTLS_H | 1 | #ifndef ASM_X86__IOCTLS_H | 
| 2 | #define _ASM_X86_IOCTLS_H | 2 | #define ASM_X86__IOCTLS_H | 
| 3 | 3 | ||
| 4 | #include <asm/ioctl.h> | 4 | #include <asm/ioctl.h> | 
| 5 | 5 | ||
| @@ -85,4 +85,4 @@ | |||
| 85 | 85 | ||
| 86 | #define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ | 86 | #define TIOCSER_TEMT 0x01 /* Transmitter physically empty */ | 
| 87 | 87 | ||
| 88 | #endif | 88 | #endif /* ASM_X86__IOCTLS_H */ | 
| diff --git a/include/asm-x86/iommu.h b/include/asm-x86/iommu.h index 5f888cc5be49..e86f44148c66 100644 --- a/include/asm-x86/iommu.h +++ b/include/asm-x86/iommu.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X8664_IOMMU_H | 1 | #ifndef ASM_X86__IOMMU_H | 
| 2 | #define _ASM_X8664_IOMMU_H 1 | 2 | #define ASM_X86__IOMMU_H | 
| 3 | 3 | ||
| 4 | extern void pci_iommu_shutdown(void); | 4 | extern void pci_iommu_shutdown(void); | 
| 5 | extern void no_iommu_init(void); | 5 | extern void no_iommu_init(void); | 
| @@ -42,4 +42,4 @@ static inline void gart_iommu_hole_init(void) | |||
| 42 | } | 42 | } | 
| 43 | #endif | 43 | #endif | 
| 44 | 44 | ||
| 45 | #endif | 45 | #endif /* ASM_X86__IOMMU_H */ | 
| diff --git a/include/asm-x86/ipcbuf.h b/include/asm-x86/ipcbuf.h index ee678fd51594..910304fbdc8f 100644 --- a/include/asm-x86/ipcbuf.h +++ b/include/asm-x86/ipcbuf.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_IPCBUF_H | 1 | #ifndef ASM_X86__IPCBUF_H | 
| 2 | #define _ASM_X86_IPCBUF_H | 2 | #define ASM_X86__IPCBUF_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * The ipc64_perm structure for x86 architecture. | 5 | * The ipc64_perm structure for x86 architecture. | 
| @@ -25,4 +25,4 @@ struct ipc64_perm { | |||
| 25 | unsigned long __unused2; | 25 | unsigned long __unused2; | 
| 26 | }; | 26 | }; | 
| 27 | 27 | ||
| 28 | #endif /* _ASM_X86_IPCBUF_H */ | 28 | #endif /* ASM_X86__IPCBUF_H */ | 
| diff --git a/include/asm-x86/ipi.h b/include/asm-x86/ipi.h index bb1c09f7a76c..c1b226797518 100644 --- a/include/asm-x86/ipi.h +++ b/include/asm-x86/ipi.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_IPI_H | 1 | #ifndef ASM_X86__IPI_H | 
| 2 | #define __ASM_IPI_H | 2 | #define ASM_X86__IPI_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * Copyright 2004 James Cleverdon, IBM. | 5 | * Copyright 2004 James Cleverdon, IBM. | 
| @@ -129,4 +129,4 @@ static inline void send_IPI_mask_sequence(cpumask_t mask, int vector) | |||
| 129 | local_irq_restore(flags); | 129 | local_irq_restore(flags); | 
| 130 | } | 130 | } | 
| 131 | 131 | ||
| 132 | #endif /* __ASM_IPI_H */ | 132 | #endif /* ASM_X86__IPI_H */ | 
| diff --git a/include/asm-x86/irq.h b/include/asm-x86/irq.h index 1a2925757317..1e5f2909c1db 100644 --- a/include/asm-x86/irq.h +++ b/include/asm-x86/irq.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_IRQ_H | 1 | #ifndef ASM_X86__IRQ_H | 
| 2 | #define _ASM_IRQ_H | 2 | #define ASM_X86__IRQ_H | 
| 3 | /* | 3 | /* | 
| 4 | * (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar | 4 | * (C) 1992, 1993 Linus Torvalds, (C) 1997 Ingo Molnar | 
| 5 | * | 5 | * | 
| @@ -47,4 +47,4 @@ extern void native_init_IRQ(void); | |||
| 47 | /* Interrupt vector management */ | 47 | /* Interrupt vector management */ | 
| 48 | extern DECLARE_BITMAP(used_vectors, NR_VECTORS); | 48 | extern DECLARE_BITMAP(used_vectors, NR_VECTORS); | 
| 49 | 49 | ||
| 50 | #endif /* _ASM_IRQ_H */ | 50 | #endif /* ASM_X86__IRQ_H */ | 
| diff --git a/include/asm-x86/irq_regs_32.h b/include/asm-x86/irq_regs_32.h index 3368b20c0b48..316a3b258871 100644 --- a/include/asm-x86/irq_regs_32.h +++ b/include/asm-x86/irq_regs_32.h | |||
| @@ -4,8 +4,8 @@ | |||
| 4 | * | 4 | * | 
| 5 | * Jeremy Fitzhardinge <jeremy@goop.org> | 5 | * Jeremy Fitzhardinge <jeremy@goop.org> | 
| 6 | */ | 6 | */ | 
| 7 | #ifndef _ASM_I386_IRQ_REGS_H | 7 | #ifndef ASM_X86__IRQ_REGS_32_H | 
| 8 | #define _ASM_I386_IRQ_REGS_H | 8 | #define ASM_X86__IRQ_REGS_32_H | 
| 9 | 9 | ||
| 10 | #include <asm/percpu.h> | 10 | #include <asm/percpu.h> | 
| 11 | 11 | ||
| @@ -26,4 +26,4 @@ static inline struct pt_regs *set_irq_regs(struct pt_regs *new_regs) | |||
| 26 | return old_regs; | 26 | return old_regs; | 
| 27 | } | 27 | } | 
| 28 | 28 | ||
| 29 | #endif /* _ASM_I386_IRQ_REGS_H */ | 29 | #endif /* ASM_X86__IRQ_REGS_32_H */ | 
| diff --git a/include/asm-x86/irq_vectors.h b/include/asm-x86/irq_vectors.h index a48c7f2dbdc0..c5d2d767a1f3 100644 --- a/include/asm-x86/irq_vectors.h +++ b/include/asm-x86/irq_vectors.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_IRQ_VECTORS_H | 1 | #ifndef ASM_X86__IRQ_VECTORS_H | 
| 2 | #define _ASM_IRQ_VECTORS_H | 2 | #define ASM_X86__IRQ_VECTORS_H | 
| 3 | 3 | ||
| 4 | #include <linux/threads.h> | 4 | #include <linux/threads.h> | 
| 5 | 5 | ||
| @@ -179,4 +179,4 @@ | |||
| 179 | #define VIC_CPU_BOOT_ERRATA_CPI (VIC_CPI_LEVEL0 + 8) | 179 | #define VIC_CPU_BOOT_ERRATA_CPI (VIC_CPI_LEVEL0 + 8) | 
| 180 | 180 | ||
| 181 | 181 | ||
| 182 | #endif /* _ASM_IRQ_VECTORS_H */ | 182 | #endif /* ASM_X86__IRQ_VECTORS_H */ | 
| diff --git a/include/asm-x86/ist.h b/include/asm-x86/ist.h index 6ec6ceed95a7..35a2fe9bc921 100644 --- a/include/asm-x86/ist.h +++ b/include/asm-x86/ist.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_IST_H | 1 | #ifndef ASM_X86__IST_H | 
| 2 | #define _ASM_IST_H | 2 | #define ASM_X86__IST_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * Include file for the interface to IST BIOS | 5 | * Include file for the interface to IST BIOS | 
| @@ -31,4 +31,4 @@ struct ist_info { | |||
| 31 | extern struct ist_info ist_info; | 31 | extern struct ist_info ist_info; | 
| 32 | 32 | ||
| 33 | #endif /* __KERNEL__ */ | 33 | #endif /* __KERNEL__ */ | 
| 34 | #endif /* _ASM_IST_H */ | 34 | #endif /* ASM_X86__IST_H */ | 
| diff --git a/include/asm-x86/k8.h b/include/asm-x86/k8.h index 452e2b696ff4..2bbaf4370a55 100644 --- a/include/asm-x86/k8.h +++ b/include/asm-x86/k8.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_K8_H | 1 | #ifndef ASM_X86__K8_H | 
| 2 | #define _ASM_K8_H 1 | 2 | #define ASM_X86__K8_H | 
| 3 | 3 | ||
| 4 | #include <linux/pci.h> | 4 | #include <linux/pci.h> | 
| 5 | 5 | ||
| @@ -12,4 +12,4 @@ extern int cache_k8_northbridges(void); | |||
| 12 | extern void k8_flush_garts(void); | 12 | extern void k8_flush_garts(void); | 
| 13 | extern int k8_scan_nodes(unsigned long start, unsigned long end); | 13 | extern int k8_scan_nodes(unsigned long start, unsigned long end); | 
| 14 | 14 | ||
| 15 | #endif | 15 | #endif /* ASM_X86__K8_H */ | 
| diff --git a/include/asm-x86/kdebug.h b/include/asm-x86/kdebug.h index 96651bb59ba1..5ec3ad3e825c 100644 --- a/include/asm-x86/kdebug.h +++ b/include/asm-x86/kdebug.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_KDEBUG_H | 1 | #ifndef ASM_X86__KDEBUG_H | 
| 2 | #define _ASM_X86_KDEBUG_H | 2 | #define ASM_X86__KDEBUG_H | 
| 3 | 3 | ||
| 4 | #include <linux/notifier.h> | 4 | #include <linux/notifier.h> | 
| 5 | 5 | ||
| @@ -35,4 +35,4 @@ extern void show_regs(struct pt_regs *regs); | |||
| 35 | extern unsigned long oops_begin(void); | 35 | extern unsigned long oops_begin(void); | 
| 36 | extern void oops_end(unsigned long, struct pt_regs *, int signr); | 36 | extern void oops_end(unsigned long, struct pt_regs *, int signr); | 
| 37 | 37 | ||
| 38 | #endif | 38 | #endif /* ASM_X86__KDEBUG_H */ | 
| diff --git a/include/asm-x86/kexec.h b/include/asm-x86/kexec.h index 4246ab7dc988..ea09600d6129 100644 --- a/include/asm-x86/kexec.h +++ b/include/asm-x86/kexec.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _KEXEC_H | 1 | #ifndef ASM_X86__KEXEC_H | 
| 2 | #define _KEXEC_H | 2 | #define ASM_X86__KEXEC_H | 
| 3 | 3 | ||
| 4 | #ifdef CONFIG_X86_32 | 4 | #ifdef CONFIG_X86_32 | 
| 5 | # define PA_CONTROL_PAGE 0 | 5 | # define PA_CONTROL_PAGE 0 | 
| @@ -172,4 +172,4 @@ relocate_kernel(unsigned long indirection_page, | |||
| 172 | 172 | ||
| 173 | #endif /* __ASSEMBLY__ */ | 173 | #endif /* __ASSEMBLY__ */ | 
| 174 | 174 | ||
| 175 | #endif /* _KEXEC_H */ | 175 | #endif /* ASM_X86__KEXEC_H */ | 
| diff --git a/include/asm-x86/kgdb.h b/include/asm-x86/kgdb.h index 94d63db10365..d283863354de 100644 --- a/include/asm-x86/kgdb.h +++ b/include/asm-x86/kgdb.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_KGDB_H_ | 1 | #ifndef ASM_X86__KGDB_H | 
| 2 | #define _ASM_KGDB_H_ | 2 | #define ASM_X86__KGDB_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * Copyright (C) 2001-2004 Amit S. Kale | 5 | * Copyright (C) 2001-2004 Amit S. Kale | 
| @@ -76,4 +76,4 @@ static inline void arch_kgdb_breakpoint(void) | |||
| 76 | #define BREAK_INSTR_SIZE 1 | 76 | #define BREAK_INSTR_SIZE 1 | 
| 77 | #define CACHE_FLUSH_IS_SAFE 1 | 77 | #define CACHE_FLUSH_IS_SAFE 1 | 
| 78 | 78 | ||
| 79 | #endif /* _ASM_KGDB_H_ */ | 79 | #endif /* ASM_X86__KGDB_H */ | 
| diff --git a/include/asm-x86/kmap_types.h b/include/asm-x86/kmap_types.h index 5f4174132a22..89f44493e643 100644 --- a/include/asm-x86/kmap_types.h +++ b/include/asm-x86/kmap_types.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_KMAP_TYPES_H | 1 | #ifndef ASM_X86__KMAP_TYPES_H | 
| 2 | #define _ASM_X86_KMAP_TYPES_H | 2 | #define ASM_X86__KMAP_TYPES_H | 
| 3 | 3 | ||
| 4 | #if defined(CONFIG_X86_32) && defined(CONFIG_DEBUG_HIGHMEM) | 4 | #if defined(CONFIG_X86_32) && defined(CONFIG_DEBUG_HIGHMEM) | 
| 5 | # define D(n) __KM_FENCE_##n , | 5 | # define D(n) __KM_FENCE_##n , | 
| @@ -26,4 +26,4 @@ D(13) KM_TYPE_NR | |||
| 26 | 26 | ||
| 27 | #undef D | 27 | #undef D | 
| 28 | 28 | ||
| 29 | #endif | 29 | #endif /* ASM_X86__KMAP_TYPES_H */ | 
| diff --git a/include/asm-x86/kprobes.h b/include/asm-x86/kprobes.h index 54980b0b3892..bd8407863c13 100644 --- a/include/asm-x86/kprobes.h +++ b/include/asm-x86/kprobes.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_KPROBES_H | 1 | #ifndef ASM_X86__KPROBES_H | 
| 2 | #define _ASM_KPROBES_H | 2 | #define ASM_X86__KPROBES_H | 
| 3 | /* | 3 | /* | 
| 4 | * Kernel Probes (KProbes) | 4 | * Kernel Probes (KProbes) | 
| 5 | * | 5 | * | 
| @@ -94,4 +94,4 @@ static inline void restore_interrupts(struct pt_regs *regs) | |||
| 94 | extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr); | 94 | extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr); | 
| 95 | extern int kprobe_exceptions_notify(struct notifier_block *self, | 95 | extern int kprobe_exceptions_notify(struct notifier_block *self, | 
| 96 | unsigned long val, void *data); | 96 | unsigned long val, void *data); | 
| 97 | #endif /* _ASM_KPROBES_H */ | 97 | #endif /* ASM_X86__KPROBES_H */ | 
| diff --git a/include/asm-x86/kvm.h b/include/asm-x86/kvm.h index 6f1840812e59..78e954db1e7f 100644 --- a/include/asm-x86/kvm.h +++ b/include/asm-x86/kvm.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __LINUX_KVM_X86_H | 1 | #ifndef ASM_X86__KVM_H | 
| 2 | #define __LINUX_KVM_X86_H | 2 | #define ASM_X86__KVM_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * KVM x86 specific structures and definitions | 5 | * KVM x86 specific structures and definitions | 
| @@ -230,4 +230,4 @@ struct kvm_pit_state { | |||
| 230 | #define KVM_TRC_APIC_ACCESS (KVM_TRC_HANDLER + 0x14) | 230 | #define KVM_TRC_APIC_ACCESS (KVM_TRC_HANDLER + 0x14) | 
| 231 | #define KVM_TRC_TDP_FAULT (KVM_TRC_HANDLER + 0x15) | 231 | #define KVM_TRC_TDP_FAULT (KVM_TRC_HANDLER + 0x15) | 
| 232 | 232 | ||
| 233 | #endif | 233 | #endif /* ASM_X86__KVM_H */ | 
| diff --git a/include/asm-x86/kvm_host.h b/include/asm-x86/kvm_host.h index c2e34c275900..69794547f514 100644 --- a/include/asm-x86/kvm_host.h +++ b/include/asm-x86/kvm_host.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | #/* | 1 | /* | 
| 2 | * Kernel-based Virtual Machine driver for Linux | 2 | * Kernel-based Virtual Machine driver for Linux | 
| 3 | * | 3 | * | 
| 4 | * This header defines architecture specific interfaces, x86 version | 4 | * This header defines architecture specific interfaces, x86 version | 
| @@ -8,8 +8,8 @@ | |||
| 8 | * | 8 | * | 
| 9 | */ | 9 | */ | 
| 10 | 10 | ||
| 11 | #ifndef ASM_KVM_HOST_H | 11 | #ifndef ASM_X86__KVM_HOST_H | 
| 12 | #define ASM_KVM_HOST_H | 12 | #define ASM_X86__KVM_HOST_H | 
| 13 | 13 | ||
| 14 | #include <linux/types.h> | 14 | #include <linux/types.h> | 
| 15 | #include <linux/mm.h> | 15 | #include <linux/mm.h> | 
| @@ -735,4 +735,4 @@ asmlinkage void kvm_handle_fault_on_reboot(void); | |||
| 735 | int kvm_unmap_hva(struct kvm *kvm, unsigned long hva); | 735 | int kvm_unmap_hva(struct kvm *kvm, unsigned long hva); | 
| 736 | int kvm_age_hva(struct kvm *kvm, unsigned long hva); | 736 | int kvm_age_hva(struct kvm *kvm, unsigned long hva); | 
| 737 | 737 | ||
| 738 | #endif | 738 | #endif /* ASM_X86__KVM_HOST_H */ | 
| diff --git a/include/asm-x86/kvm_para.h b/include/asm-x86/kvm_para.h index 76f392146daa..30054fded4fb 100644 --- a/include/asm-x86/kvm_para.h +++ b/include/asm-x86/kvm_para.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __X86_KVM_PARA_H | 1 | #ifndef ASM_X86__KVM_PARA_H | 
| 2 | #define __X86_KVM_PARA_H | 2 | #define ASM_X86__KVM_PARA_H | 
| 3 | 3 | ||
| 4 | /* This CPUID returns the signature 'KVMKVMKVM' in ebx, ecx, and edx. It | 4 | /* This CPUID returns the signature 'KVMKVMKVM' in ebx, ecx, and edx. It | 
| 5 | * should be used to determine that a VM is running under KVM. | 5 | * should be used to determine that a VM is running under KVM. | 
| @@ -144,4 +144,4 @@ static inline unsigned int kvm_arch_para_features(void) | |||
| 144 | 144 | ||
| 145 | #endif | 145 | #endif | 
| 146 | 146 | ||
| 147 | #endif | 147 | #endif /* ASM_X86__KVM_PARA_H */ | 
| diff --git a/include/asm-x86/kvm_x86_emulate.h b/include/asm-x86/kvm_x86_emulate.h index 4e8c1e48d91d..e2d9b030c1ac 100644 --- a/include/asm-x86/kvm_x86_emulate.h +++ b/include/asm-x86/kvm_x86_emulate.h | |||
| @@ -8,8 +8,8 @@ | |||
| 8 | * From: xen-unstable 10676:af9809f51f81a3c43f276f00c81a52ef558afda4 | 8 | * From: xen-unstable 10676:af9809f51f81a3c43f276f00c81a52ef558afda4 | 
| 9 | */ | 9 | */ | 
| 10 | 10 | ||
| 11 | #ifndef __X86_EMULATE_H__ | 11 | #ifndef ASM_X86__KVM_X86_EMULATE_H | 
| 12 | #define __X86_EMULATE_H__ | 12 | #define ASM_X86__KVM_X86_EMULATE_H | 
| 13 | 13 | ||
| 14 | struct x86_emulate_ctxt; | 14 | struct x86_emulate_ctxt; | 
| 15 | 15 | ||
| @@ -181,4 +181,4 @@ int x86_decode_insn(struct x86_emulate_ctxt *ctxt, | |||
| 181 | int x86_emulate_insn(struct x86_emulate_ctxt *ctxt, | 181 | int x86_emulate_insn(struct x86_emulate_ctxt *ctxt, | 
| 182 | struct x86_emulate_ops *ops); | 182 | struct x86_emulate_ops *ops); | 
| 183 | 183 | ||
| 184 | #endif /* __X86_EMULATE_H__ */ | 184 | #endif /* ASM_X86__KVM_X86_EMULATE_H */ | 
| diff --git a/include/asm-x86/ldt.h b/include/asm-x86/ldt.h index 20c597242b53..a5228504d867 100644 --- a/include/asm-x86/ldt.h +++ b/include/asm-x86/ldt.h | |||
| @@ -3,8 +3,8 @@ | |||
| 3 | * | 3 | * | 
| 4 | * Definitions of structures used with the modify_ldt system call. | 4 | * Definitions of structures used with the modify_ldt system call. | 
| 5 | */ | 5 | */ | 
| 6 | #ifndef _ASM_X86_LDT_H | 6 | #ifndef ASM_X86__LDT_H | 
| 7 | #define _ASM_X86_LDT_H | 7 | #define ASM_X86__LDT_H | 
| 8 | 8 | ||
| 9 | /* Maximum number of LDT entries supported. */ | 9 | /* Maximum number of LDT entries supported. */ | 
| 10 | #define LDT_ENTRIES 8192 | 10 | #define LDT_ENTRIES 8192 | 
| @@ -37,4 +37,4 @@ struct user_desc { | |||
| 37 | #define MODIFY_LDT_CONTENTS_CODE 2 | 37 | #define MODIFY_LDT_CONTENTS_CODE 2 | 
| 38 | 38 | ||
| 39 | #endif /* !__ASSEMBLY__ */ | 39 | #endif /* !__ASSEMBLY__ */ | 
| 40 | #endif | 40 | #endif /* ASM_X86__LDT_H */ | 
| diff --git a/include/asm-x86/lguest.h b/include/asm-x86/lguest.h index be4a7247fa2b..7505e947ed27 100644 --- a/include/asm-x86/lguest.h +++ b/include/asm-x86/lguest.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _X86_LGUEST_H | 1 | #ifndef ASM_X86__LGUEST_H | 
| 2 | #define _X86_LGUEST_H | 2 | #define ASM_X86__LGUEST_H | 
| 3 | 3 | ||
| 4 | #define GDT_ENTRY_LGUEST_CS 10 | 4 | #define GDT_ENTRY_LGUEST_CS 10 | 
| 5 | #define GDT_ENTRY_LGUEST_DS 11 | 5 | #define GDT_ENTRY_LGUEST_DS 11 | 
| @@ -91,4 +91,4 @@ static inline void lguest_set_ts(void) | |||
| 91 | 91 | ||
| 92 | #endif /* __ASSEMBLY__ */ | 92 | #endif /* __ASSEMBLY__ */ | 
| 93 | 93 | ||
| 94 | #endif | 94 | #endif /* ASM_X86__LGUEST_H */ | 
| diff --git a/include/asm-x86/lguest_hcall.h b/include/asm-x86/lguest_hcall.h index a3241f28e34a..8f034ba4b53e 100644 --- a/include/asm-x86/lguest_hcall.h +++ b/include/asm-x86/lguest_hcall.h | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* Architecture specific portion of the lguest hypercalls */ | 1 | /* Architecture specific portion of the lguest hypercalls */ | 
| 2 | #ifndef _X86_LGUEST_HCALL_H | 2 | #ifndef ASM_X86__LGUEST_HCALL_H | 
| 3 | #define _X86_LGUEST_HCALL_H | 3 | #define ASM_X86__LGUEST_HCALL_H | 
| 4 | 4 | ||
| 5 | #define LHCALL_FLUSH_ASYNC 0 | 5 | #define LHCALL_FLUSH_ASYNC 0 | 
| 6 | #define LHCALL_LGUEST_INIT 1 | 6 | #define LHCALL_LGUEST_INIT 1 | 
| @@ -68,4 +68,4 @@ struct hcall_args { | |||
| 68 | }; | 68 | }; | 
| 69 | 69 | ||
| 70 | #endif /* !__ASSEMBLY__ */ | 70 | #endif /* !__ASSEMBLY__ */ | 
| 71 | #endif /* _I386_LGUEST_HCALL_H */ | 71 | #endif /* ASM_X86__LGUEST_HCALL_H */ | 
| diff --git a/include/asm-x86/linkage.h b/include/asm-x86/linkage.h index 64e444f8e85b..42d8b62ee8ab 100644 --- a/include/asm-x86/linkage.h +++ b/include/asm-x86/linkage.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_LINKAGE_H | 1 | #ifndef ASM_X86__LINKAGE_H | 
| 2 | #define __ASM_LINKAGE_H | 2 | #define ASM_X86__LINKAGE_H | 
| 3 | 3 | ||
| 4 | #undef notrace | 4 | #undef notrace | 
| 5 | #define notrace __attribute__((no_instrument_function)) | 5 | #define notrace __attribute__((no_instrument_function)) | 
| @@ -57,5 +57,5 @@ | |||
| 57 | #define __ALIGN_STR ".align 16,0x90" | 57 | #define __ALIGN_STR ".align 16,0x90" | 
| 58 | #endif | 58 | #endif | 
| 59 | 59 | ||
| 60 | #endif | 60 | #endif /* ASM_X86__LINKAGE_H */ | 
| 61 | 61 | ||
| diff --git a/include/asm-x86/local.h b/include/asm-x86/local.h index 330a72496abd..ae91994fd6c9 100644 --- a/include/asm-x86/local.h +++ b/include/asm-x86/local.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ARCH_LOCAL_H | 1 | #ifndef ASM_X86__LOCAL_H | 
| 2 | #define _ARCH_LOCAL_H | 2 | #define ASM_X86__LOCAL_H | 
| 3 | 3 | ||
| 4 | #include <linux/percpu.h> | 4 | #include <linux/percpu.h> | 
| 5 | 5 | ||
| @@ -232,4 +232,4 @@ static inline long local_sub_return(long i, local_t *l) | |||
| 232 | #define __cpu_local_add(i, l) cpu_local_add((i), (l)) | 232 | #define __cpu_local_add(i, l) cpu_local_add((i), (l)) | 
| 233 | #define __cpu_local_sub(i, l) cpu_local_sub((i), (l)) | 233 | #define __cpu_local_sub(i, l) cpu_local_sub((i), (l)) | 
| 234 | 234 | ||
| 235 | #endif /* _ARCH_LOCAL_H */ | 235 | #endif /* ASM_X86__LOCAL_H */ | 
| diff --git a/include/asm-x86/mach-bigsmp/mach_apic.h b/include/asm-x86/mach-bigsmp/mach_apic.h index c3b9dc6970c9..05362d44a3ee 100644 --- a/include/asm-x86/mach-bigsmp/mach_apic.h +++ b/include/asm-x86/mach-bigsmp/mach_apic.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_APIC_H | 1 | #ifndef ASM_X86__MACH_BIGSMP__MACH_APIC_H | 
| 2 | #define __ASM_MACH_APIC_H | 2 | #define ASM_X86__MACH_BIGSMP__MACH_APIC_H | 
| 3 | 3 | ||
| 4 | #define xapic_phys_to_log_apicid(cpu) (per_cpu(x86_bios_cpu_apicid, cpu)) | 4 | #define xapic_phys_to_log_apicid(cpu) (per_cpu(x86_bios_cpu_apicid, cpu)) | 
| 5 | #define esr_disable (1) | 5 | #define esr_disable (1) | 
| @@ -141,4 +141,4 @@ static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb) | |||
| 141 | return cpuid_apic >> index_msb; | 141 | return cpuid_apic >> index_msb; | 
| 142 | } | 142 | } | 
| 143 | 143 | ||
| 144 | #endif /* __ASM_MACH_APIC_H */ | 144 | #endif /* ASM_X86__MACH_BIGSMP__MACH_APIC_H */ | 
| diff --git a/include/asm-x86/mach-bigsmp/mach_apicdef.h b/include/asm-x86/mach-bigsmp/mach_apicdef.h index a58ab5a75c8c..811935d9d49b 100644 --- a/include/asm-x86/mach-bigsmp/mach_apicdef.h +++ b/include/asm-x86/mach-bigsmp/mach_apicdef.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_APICDEF_H | 1 | #ifndef ASM_X86__MACH_BIGSMP__MACH_APICDEF_H | 
| 2 | #define __ASM_MACH_APICDEF_H | 2 | #define ASM_X86__MACH_BIGSMP__MACH_APICDEF_H | 
| 3 | 3 | ||
| 4 | #define APIC_ID_MASK (0xFF<<24) | 4 | #define APIC_ID_MASK (0xFF<<24) | 
| 5 | 5 | ||
| @@ -10,4 +10,4 @@ static inline unsigned get_apic_id(unsigned long x) | |||
| 10 | 10 | ||
| 11 | #define GET_APIC_ID(x) get_apic_id(x) | 11 | #define GET_APIC_ID(x) get_apic_id(x) | 
| 12 | 12 | ||
| 13 | #endif | 13 | #endif /* ASM_X86__MACH_BIGSMP__MACH_APICDEF_H */ | 
| diff --git a/include/asm-x86/mach-bigsmp/mach_ipi.h b/include/asm-x86/mach-bigsmp/mach_ipi.h index 9404c535b7ec..b1b0f966a009 100644 --- a/include/asm-x86/mach-bigsmp/mach_ipi.h +++ b/include/asm-x86/mach-bigsmp/mach_ipi.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_IPI_H | 1 | #ifndef ASM_X86__MACH_BIGSMP__MACH_IPI_H | 
| 2 | #define __ASM_MACH_IPI_H | 2 | #define ASM_X86__MACH_BIGSMP__MACH_IPI_H | 
| 3 | 3 | ||
| 4 | void send_IPI_mask_sequence(cpumask_t mask, int vector); | 4 | void send_IPI_mask_sequence(cpumask_t mask, int vector); | 
| 5 | 5 | ||
| @@ -22,4 +22,4 @@ static inline void send_IPI_all(int vector) | |||
| 22 | send_IPI_mask(cpu_online_map, vector); | 22 | send_IPI_mask(cpu_online_map, vector); | 
| 23 | } | 23 | } | 
| 24 | 24 | ||
| 25 | #endif /* __ASM_MACH_IPI_H */ | 25 | #endif /* ASM_X86__MACH_BIGSMP__MACH_IPI_H */ | 
| diff --git a/include/asm-x86/mach-default/apm.h b/include/asm-x86/mach-default/apm.h index 989f34c37d32..2aa61b54fbd5 100644 --- a/include/asm-x86/mach-default/apm.h +++ b/include/asm-x86/mach-default/apm.h | |||
| @@ -3,8 +3,8 @@ | |||
| 3 | * Split out from apm.c by Osamu Tomita <tomita@cinet.co.jp> | 3 | * Split out from apm.c by Osamu Tomita <tomita@cinet.co.jp> | 
| 4 | */ | 4 | */ | 
| 5 | 5 | ||
| 6 | #ifndef _ASM_APM_H | 6 | #ifndef ASM_X86__MACH_DEFAULT__APM_H | 
| 7 | #define _ASM_APM_H | 7 | #define ASM_X86__MACH_DEFAULT__APM_H | 
| 8 | 8 | ||
| 9 | #ifdef APM_ZERO_SEGS | 9 | #ifdef APM_ZERO_SEGS | 
| 10 | # define APM_DO_ZERO_SEGS \ | 10 | # define APM_DO_ZERO_SEGS \ | 
| @@ -70,4 +70,4 @@ static inline u8 apm_bios_call_simple_asm(u32 func, u32 ebx_in, | |||
| 70 | return error; | 70 | return error; | 
| 71 | } | 71 | } | 
| 72 | 72 | ||
| 73 | #endif /* _ASM_APM_H */ | 73 | #endif /* ASM_X86__MACH_DEFAULT__APM_H */ | 
| diff --git a/include/asm-x86/mach-default/mach_apic.h b/include/asm-x86/mach-default/mach_apic.h index f3226b9a6b82..b615f40736be 100644 --- a/include/asm-x86/mach-default/mach_apic.h +++ b/include/asm-x86/mach-default/mach_apic.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_APIC_H | 1 | #ifndef ASM_X86__MACH_DEFAULT__MACH_APIC_H | 
| 2 | #define __ASM_MACH_APIC_H | 2 | #define ASM_X86__MACH_DEFAULT__MACH_APIC_H | 
| 3 | 3 | ||
| 4 | #ifdef CONFIG_X86_LOCAL_APIC | 4 | #ifdef CONFIG_X86_LOCAL_APIC | 
| 5 | 5 | ||
| @@ -138,4 +138,4 @@ static inline void enable_apic_mode(void) | |||
| 138 | } | 138 | } | 
| 139 | 139 | ||
| 140 | #endif /* CONFIG_X86_LOCAL_APIC */ | 140 | #endif /* CONFIG_X86_LOCAL_APIC */ | 
| 141 | #endif /* __ASM_MACH_APIC_H */ | 141 | #endif /* ASM_X86__MACH_DEFAULT__MACH_APIC_H */ | 
| diff --git a/include/asm-x86/mach-default/mach_apicdef.h b/include/asm-x86/mach-default/mach_apicdef.h index e4b29ba37de6..936704f816d6 100644 --- a/include/asm-x86/mach-default/mach_apicdef.h +++ b/include/asm-x86/mach-default/mach_apicdef.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_APICDEF_H | 1 | #ifndef ASM_X86__MACH_DEFAULT__MACH_APICDEF_H | 
| 2 | #define __ASM_MACH_APICDEF_H | 2 | #define ASM_X86__MACH_DEFAULT__MACH_APICDEF_H | 
| 3 | 3 | ||
| 4 | #include <asm/apic.h> | 4 | #include <asm/apic.h> | 
| 5 | 5 | ||
| @@ -21,4 +21,4 @@ static inline unsigned get_apic_id(unsigned long x) | |||
| 21 | #define GET_APIC_ID(x) get_apic_id(x) | 21 | #define GET_APIC_ID(x) get_apic_id(x) | 
| 22 | #endif | 22 | #endif | 
| 23 | 23 | ||
| 24 | #endif | 24 | #endif /* ASM_X86__MACH_DEFAULT__MACH_APICDEF_H */ | 
| diff --git a/include/asm-x86/mach-default/mach_ipi.h b/include/asm-x86/mach-default/mach_ipi.h index be323364e68f..674bc7e50c35 100644 --- a/include/asm-x86/mach-default/mach_ipi.h +++ b/include/asm-x86/mach-default/mach_ipi.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_IPI_H | 1 | #ifndef ASM_X86__MACH_DEFAULT__MACH_IPI_H | 
| 2 | #define __ASM_MACH_IPI_H | 2 | #define ASM_X86__MACH_DEFAULT__MACH_IPI_H | 
| 3 | 3 | ||
| 4 | /* Avoid include hell */ | 4 | /* Avoid include hell */ | 
| 5 | #define NMI_VECTOR 0x02 | 5 | #define NMI_VECTOR 0x02 | 
| @@ -61,4 +61,4 @@ static inline void send_IPI_all(int vector) | |||
| 61 | } | 61 | } | 
| 62 | #endif | 62 | #endif | 
| 63 | 63 | ||
| 64 | #endif /* __ASM_MACH_IPI_H */ | 64 | #endif /* ASM_X86__MACH_DEFAULT__MACH_IPI_H */ | 
| diff --git a/include/asm-x86/mach-default/mach_mpparse.h b/include/asm-x86/mach-default/mach_mpparse.h index d14108505bb8..9c381f2815ac 100644 --- a/include/asm-x86/mach-default/mach_mpparse.h +++ b/include/asm-x86/mach-default/mach_mpparse.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_MPPARSE_H | 1 | #ifndef ASM_X86__MACH_DEFAULT__MACH_MPPARSE_H | 
| 2 | #define __ASM_MACH_MPPARSE_H | 2 | #define ASM_X86__MACH_DEFAULT__MACH_MPPARSE_H | 
| 3 | 3 | ||
| 4 | static inline int mps_oem_check(struct mp_config_table *mpc, char *oem, | 4 | static inline int mps_oem_check(struct mp_config_table *mpc, char *oem, | 
| 5 | char *productid) | 5 | char *productid) | 
| @@ -14,4 +14,4 @@ static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) | |||
| 14 | } | 14 | } | 
| 15 | 15 | ||
| 16 | 16 | ||
| 17 | #endif /* __ASM_MACH_MPPARSE_H */ | 17 | #endif /* ASM_X86__MACH_DEFAULT__MACH_MPPARSE_H */ | 
| diff --git a/include/asm-x86/mach-default/mach_mpspec.h b/include/asm-x86/mach-default/mach_mpspec.h index 51c9a9775932..d77646f011f1 100644 --- a/include/asm-x86/mach-default/mach_mpspec.h +++ b/include/asm-x86/mach-default/mach_mpspec.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_MPSPEC_H | 1 | #ifndef ASM_X86__MACH_DEFAULT__MACH_MPSPEC_H | 
| 2 | #define __ASM_MACH_MPSPEC_H | 2 | #define ASM_X86__MACH_DEFAULT__MACH_MPSPEC_H | 
| 3 | 3 | ||
| 4 | #define MAX_IRQ_SOURCES 256 | 4 | #define MAX_IRQ_SOURCES 256 | 
| 5 | 5 | ||
| @@ -9,4 +9,4 @@ | |||
| 9 | #define MAX_MP_BUSSES 32 | 9 | #define MAX_MP_BUSSES 32 | 
| 10 | #endif | 10 | #endif | 
| 11 | 11 | ||
| 12 | #endif /* __ASM_MACH_MPSPEC_H */ | 12 | #endif /* ASM_X86__MACH_DEFAULT__MACH_MPSPEC_H */ | 
| diff --git a/include/asm-x86/mach-default/mach_timer.h b/include/asm-x86/mach-default/mach_timer.h index 4b76e536cd98..990b15833834 100644 --- a/include/asm-x86/mach-default/mach_timer.h +++ b/include/asm-x86/mach-default/mach_timer.h | |||
| @@ -10,8 +10,8 @@ | |||
| 10 | * directly because of the awkward 8-bit access mechanism of the 82C54 | 10 | * directly because of the awkward 8-bit access mechanism of the 82C54 | 
| 11 | * device. | 11 | * device. | 
| 12 | */ | 12 | */ | 
| 13 | #ifndef _MACH_TIMER_H | 13 | #ifndef ASM_X86__MACH_DEFAULT__MACH_TIMER_H | 
| 14 | #define _MACH_TIMER_H | 14 | #define ASM_X86__MACH_DEFAULT__MACH_TIMER_H | 
| 15 | 15 | ||
| 16 | #define CALIBRATE_TIME_MSEC 30 /* 30 msecs */ | 16 | #define CALIBRATE_TIME_MSEC 30 /* 30 msecs */ | 
| 17 | #define CALIBRATE_LATCH \ | 17 | #define CALIBRATE_LATCH \ | 
| @@ -45,4 +45,4 @@ static inline void mach_countup(unsigned long *count_p) | |||
| 45 | *count_p = count; | 45 | *count_p = count; | 
| 46 | } | 46 | } | 
| 47 | 47 | ||
| 48 | #endif /* !_MACH_TIMER_H */ | 48 | #endif /* ASM_X86__MACH_DEFAULT__MACH_TIMER_H */ | 
| diff --git a/include/asm-x86/mach-default/mach_traps.h b/include/asm-x86/mach-default/mach_traps.h index 2fe7705c0484..de9ac3f5c4ce 100644 --- a/include/asm-x86/mach-default/mach_traps.h +++ b/include/asm-x86/mach-default/mach_traps.h | |||
| @@ -2,8 +2,8 @@ | |||
| 2 | * Machine specific NMI handling for generic. | 2 | * Machine specific NMI handling for generic. | 
| 3 | * Split out from traps.c by Osamu Tomita <tomita@cinet.co.jp> | 3 | * Split out from traps.c by Osamu Tomita <tomita@cinet.co.jp> | 
| 4 | */ | 4 | */ | 
| 5 | #ifndef _MACH_TRAPS_H | 5 | #ifndef ASM_X86__MACH_DEFAULT__MACH_TRAPS_H | 
| 6 | #define _MACH_TRAPS_H | 6 | #define ASM_X86__MACH_DEFAULT__MACH_TRAPS_H | 
| 7 | 7 | ||
| 8 | #include <asm/mc146818rtc.h> | 8 | #include <asm/mc146818rtc.h> | 
| 9 | 9 | ||
| @@ -36,4 +36,4 @@ static inline void reassert_nmi(void) | |||
| 36 | unlock_cmos(); | 36 | unlock_cmos(); | 
| 37 | } | 37 | } | 
| 38 | 38 | ||
| 39 | #endif /* !_MACH_TRAPS_H */ | 39 | #endif /* ASM_X86__MACH_DEFAULT__MACH_TRAPS_H */ | 
| diff --git a/include/asm-x86/mach-default/mach_wakecpu.h b/include/asm-x86/mach-default/mach_wakecpu.h index 3ebb17893aa5..361b810f5160 100644 --- a/include/asm-x86/mach-default/mach_wakecpu.h +++ b/include/asm-x86/mach-default/mach_wakecpu.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_WAKECPU_H | 1 | #ifndef ASM_X86__MACH_DEFAULT__MACH_WAKECPU_H | 
| 2 | #define __ASM_MACH_WAKECPU_H | 2 | #define ASM_X86__MACH_DEFAULT__MACH_WAKECPU_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * This file copes with machines that wakeup secondary CPUs by the | 5 | * This file copes with machines that wakeup secondary CPUs by the | 
| @@ -39,4 +39,4 @@ static inline void restore_NMI_vector(unsigned short *high, unsigned short *low) | |||
| 39 | #define inquire_remote_apic(apicid) {} | 39 | #define inquire_remote_apic(apicid) {} | 
| 40 | #endif | 40 | #endif | 
| 41 | 41 | ||
| 42 | #endif /* __ASM_MACH_WAKECPU_H */ | 42 | #endif /* ASM_X86__MACH_DEFAULT__MACH_WAKECPU_H */ | 
| diff --git a/include/asm-x86/mach-es7000/mach_apic.h b/include/asm-x86/mach-es7000/mach_apic.h index 0a3fdf930672..c1f6f682d619 100644 --- a/include/asm-x86/mach-es7000/mach_apic.h +++ b/include/asm-x86/mach-es7000/mach_apic.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_APIC_H | 1 | #ifndef ASM_X86__MACH_ES7000__MACH_APIC_H | 
| 2 | #define __ASM_MACH_APIC_H | 2 | #define ASM_X86__MACH_ES7000__MACH_APIC_H | 
| 3 | 3 | ||
| 4 | #define xapic_phys_to_log_apicid(cpu) per_cpu(x86_bios_cpu_apicid, cpu) | 4 | #define xapic_phys_to_log_apicid(cpu) per_cpu(x86_bios_cpu_apicid, cpu) | 
| 5 | #define esr_disable (1) | 5 | #define esr_disable (1) | 
| @@ -191,4 +191,4 @@ static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb) | |||
| 191 | return cpuid_apic >> index_msb; | 191 | return cpuid_apic >> index_msb; | 
| 192 | } | 192 | } | 
| 193 | 193 | ||
| 194 | #endif /* __ASM_MACH_APIC_H */ | 194 | #endif /* ASM_X86__MACH_ES7000__MACH_APIC_H */ | 
| diff --git a/include/asm-x86/mach-es7000/mach_apicdef.h b/include/asm-x86/mach-es7000/mach_apicdef.h index a58ab5a75c8c..a07e56744028 100644 --- a/include/asm-x86/mach-es7000/mach_apicdef.h +++ b/include/asm-x86/mach-es7000/mach_apicdef.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_APICDEF_H | 1 | #ifndef ASM_X86__MACH_ES7000__MACH_APICDEF_H | 
| 2 | #define __ASM_MACH_APICDEF_H | 2 | #define ASM_X86__MACH_ES7000__MACH_APICDEF_H | 
| 3 | 3 | ||
| 4 | #define APIC_ID_MASK (0xFF<<24) | 4 | #define APIC_ID_MASK (0xFF<<24) | 
| 5 | 5 | ||
| @@ -10,4 +10,4 @@ static inline unsigned get_apic_id(unsigned long x) | |||
| 10 | 10 | ||
| 11 | #define GET_APIC_ID(x) get_apic_id(x) | 11 | #define GET_APIC_ID(x) get_apic_id(x) | 
| 12 | 12 | ||
| 13 | #endif | 13 | #endif /* ASM_X86__MACH_ES7000__MACH_APICDEF_H */ | 
| diff --git a/include/asm-x86/mach-es7000/mach_ipi.h b/include/asm-x86/mach-es7000/mach_ipi.h index 5e61bd220b06..3a21240e03dc 100644 --- a/include/asm-x86/mach-es7000/mach_ipi.h +++ b/include/asm-x86/mach-es7000/mach_ipi.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_IPI_H | 1 | #ifndef ASM_X86__MACH_ES7000__MACH_IPI_H | 
| 2 | #define __ASM_MACH_IPI_H | 2 | #define ASM_X86__MACH_ES7000__MACH_IPI_H | 
| 3 | 3 | ||
| 4 | void send_IPI_mask_sequence(cpumask_t mask, int vector); | 4 | void send_IPI_mask_sequence(cpumask_t mask, int vector); | 
| 5 | 5 | ||
| @@ -21,4 +21,4 @@ static inline void send_IPI_all(int vector) | |||
| 21 | send_IPI_mask(cpu_online_map, vector); | 21 | send_IPI_mask(cpu_online_map, vector); | 
| 22 | } | 22 | } | 
| 23 | 23 | ||
| 24 | #endif /* __ASM_MACH_IPI_H */ | 24 | #endif /* ASM_X86__MACH_ES7000__MACH_IPI_H */ | 
| diff --git a/include/asm-x86/mach-es7000/mach_mpparse.h b/include/asm-x86/mach-es7000/mach_mpparse.h index ef26d3523625..befde24705b7 100644 --- a/include/asm-x86/mach-es7000/mach_mpparse.h +++ b/include/asm-x86/mach-es7000/mach_mpparse.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_MPPARSE_H | 1 | #ifndef ASM_X86__MACH_ES7000__MACH_MPPARSE_H | 
| 2 | #define __ASM_MACH_MPPARSE_H | 2 | #define ASM_X86__MACH_ES7000__MACH_MPPARSE_H | 
| 3 | 3 | ||
| 4 | #include <linux/acpi.h> | 4 | #include <linux/acpi.h> | 
| 5 | 5 | ||
| @@ -26,4 +26,4 @@ static inline int es7000_check_dsdt(void) | |||
| 26 | } | 26 | } | 
| 27 | #endif | 27 | #endif | 
| 28 | 28 | ||
| 29 | #endif /* __ASM_MACH_MPPARSE_H */ | 29 | #endif /* ASM_X86__MACH_ES7000__MACH_MPPARSE_H */ | 
| diff --git a/include/asm-x86/mach-es7000/mach_wakecpu.h b/include/asm-x86/mach-es7000/mach_wakecpu.h index 84ff58314501..97c776ce13f2 100644 --- a/include/asm-x86/mach-es7000/mach_wakecpu.h +++ b/include/asm-x86/mach-es7000/mach_wakecpu.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_WAKECPU_H | 1 | #ifndef ASM_X86__MACH_ES7000__MACH_WAKECPU_H | 
| 2 | #define __ASM_MACH_WAKECPU_H | 2 | #define ASM_X86__MACH_ES7000__MACH_WAKECPU_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * This file copes with machines that wakeup secondary CPUs by the | 5 | * This file copes with machines that wakeup secondary CPUs by the | 
| @@ -56,4 +56,4 @@ static inline void restore_NMI_vector(unsigned short *high, unsigned short *low) | |||
| 56 | #define inquire_remote_apic(apicid) {} | 56 | #define inquire_remote_apic(apicid) {} | 
| 57 | #endif | 57 | #endif | 
| 58 | 58 | ||
| 59 | #endif /* __ASM_MACH_WAKECPU_H */ | 59 | #endif /* ASM_X86__MACH_ES7000__MACH_WAKECPU_H */ | 
| diff --git a/include/asm-x86/mach-generic/gpio.h b/include/asm-x86/mach-generic/gpio.h index 5305dcb96df2..6ce0f7786ef8 100644 --- a/include/asm-x86/mach-generic/gpio.h +++ b/include/asm-x86/mach-generic/gpio.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_GENERIC_GPIO_H | 1 | #ifndef ASM_X86__MACH_GENERIC__GPIO_H | 
| 2 | #define __ASM_MACH_GENERIC_GPIO_H | 2 | #define ASM_X86__MACH_GENERIC__GPIO_H | 
| 3 | 3 | ||
| 4 | int gpio_request(unsigned gpio, const char *label); | 4 | int gpio_request(unsigned gpio, const char *label); | 
| 5 | void gpio_free(unsigned gpio); | 5 | void gpio_free(unsigned gpio); | 
| @@ -12,4 +12,4 @@ int irq_to_gpio(unsigned irq); | |||
| 12 | 12 | ||
| 13 | #include <asm-generic/gpio.h> /* cansleep wrappers */ | 13 | #include <asm-generic/gpio.h> /* cansleep wrappers */ | 
| 14 | 14 | ||
| 15 | #endif /* __ASM_MACH_GENERIC_GPIO_H */ | 15 | #endif /* ASM_X86__MACH_GENERIC__GPIO_H */ | 
| diff --git a/include/asm-x86/mach-generic/irq_vectors_limits.h b/include/asm-x86/mach-generic/irq_vectors_limits.h index 890ce3f5e09a..f7870e1a220d 100644 --- a/include/asm-x86/mach-generic/irq_vectors_limits.h +++ b/include/asm-x86/mach-generic/irq_vectors_limits.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_IRQ_VECTORS_LIMITS_H | 1 | #ifndef ASM_X86__MACH_GENERIC__IRQ_VECTORS_LIMITS_H | 
| 2 | #define _ASM_IRQ_VECTORS_LIMITS_H | 2 | #define ASM_X86__MACH_GENERIC__IRQ_VECTORS_LIMITS_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * For Summit or generic (i.e. installer) kernels, we have lots of I/O APICs, | 5 | * For Summit or generic (i.e. installer) kernels, we have lots of I/O APICs, | 
| @@ -11,4 +11,4 @@ | |||
| 11 | #define NR_IRQS 224 | 11 | #define NR_IRQS 224 | 
| 12 | #define NR_IRQ_VECTORS 1024 | 12 | #define NR_IRQ_VECTORS 1024 | 
| 13 | 13 | ||
| 14 | #endif /* _ASM_IRQ_VECTORS_LIMITS_H */ | 14 | #endif /* ASM_X86__MACH_GENERIC__IRQ_VECTORS_LIMITS_H */ | 
| diff --git a/include/asm-x86/mach-generic/mach_apic.h b/include/asm-x86/mach-generic/mach_apic.h index 6eff343e1233..5d010c6881dd 100644 --- a/include/asm-x86/mach-generic/mach_apic.h +++ b/include/asm-x86/mach-generic/mach_apic.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_APIC_H | 1 | #ifndef ASM_X86__MACH_GENERIC__MACH_APIC_H | 
| 2 | #define __ASM_MACH_APIC_H | 2 | #define ASM_X86__MACH_GENERIC__MACH_APIC_H | 
| 3 | 3 | ||
| 4 | #include <asm/genapic.h> | 4 | #include <asm/genapic.h> | 
| 5 | 5 | ||
| @@ -29,4 +29,4 @@ | |||
| 29 | 29 | ||
| 30 | extern void generic_bigsmp_probe(void); | 30 | extern void generic_bigsmp_probe(void); | 
| 31 | 31 | ||
| 32 | #endif /* __ASM_MACH_APIC_H */ | 32 | #endif /* ASM_X86__MACH_GENERIC__MACH_APIC_H */ | 
| diff --git a/include/asm-x86/mach-generic/mach_apicdef.h b/include/asm-x86/mach-generic/mach_apicdef.h index 28ed98972ca8..1657f38b8f27 100644 --- a/include/asm-x86/mach-generic/mach_apicdef.h +++ b/include/asm-x86/mach-generic/mach_apicdef.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _GENAPIC_MACH_APICDEF_H | 1 | #ifndef ASM_X86__MACH_GENERIC__MACH_APICDEF_H | 
| 2 | #define _GENAPIC_MACH_APICDEF_H 1 | 2 | #define ASM_X86__MACH_GENERIC__MACH_APICDEF_H | 
| 3 | 3 | ||
| 4 | #ifndef APIC_DEFINITION | 4 | #ifndef APIC_DEFINITION | 
| 5 | #include <asm/genapic.h> | 5 | #include <asm/genapic.h> | 
| @@ -8,4 +8,4 @@ | |||
| 8 | #define APIC_ID_MASK (genapic->apic_id_mask) | 8 | #define APIC_ID_MASK (genapic->apic_id_mask) | 
| 9 | #endif | 9 | #endif | 
| 10 | 10 | ||
| 11 | #endif | 11 | #endif /* ASM_X86__MACH_GENERIC__MACH_APICDEF_H */ | 
| diff --git a/include/asm-x86/mach-generic/mach_ipi.h b/include/asm-x86/mach-generic/mach_ipi.h index 441b0fe3ed1d..f67433dbd65f 100644 --- a/include/asm-x86/mach-generic/mach_ipi.h +++ b/include/asm-x86/mach-generic/mach_ipi.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _MACH_IPI_H | 1 | #ifndef ASM_X86__MACH_GENERIC__MACH_IPI_H | 
| 2 | #define _MACH_IPI_H 1 | 2 | #define ASM_X86__MACH_GENERIC__MACH_IPI_H | 
| 3 | 3 | ||
| 4 | #include <asm/genapic.h> | 4 | #include <asm/genapic.h> | 
| 5 | 5 | ||
| @@ -7,4 +7,4 @@ | |||
| 7 | #define send_IPI_allbutself (genapic->send_IPI_allbutself) | 7 | #define send_IPI_allbutself (genapic->send_IPI_allbutself) | 
| 8 | #define send_IPI_all (genapic->send_IPI_all) | 8 | #define send_IPI_all (genapic->send_IPI_all) | 
| 9 | 9 | ||
| 10 | #endif | 10 | #endif /* ASM_X86__MACH_GENERIC__MACH_IPI_H */ | 
| diff --git a/include/asm-x86/mach-generic/mach_mpparse.h b/include/asm-x86/mach-generic/mach_mpparse.h index 586cadbf3787..3115564e557c 100644 --- a/include/asm-x86/mach-generic/mach_mpparse.h +++ b/include/asm-x86/mach-generic/mach_mpparse.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _MACH_MPPARSE_H | 1 | #ifndef ASM_X86__MACH_GENERIC__MACH_MPPARSE_H | 
| 2 | #define _MACH_MPPARSE_H 1 | 2 | #define ASM_X86__MACH_GENERIC__MACH_MPPARSE_H | 
| 3 | 3 | ||
| 4 | 4 | ||
| 5 | extern int mps_oem_check(struct mp_config_table *mpc, char *oem, | 5 | extern int mps_oem_check(struct mp_config_table *mpc, char *oem, | 
| @@ -7,4 +7,4 @@ extern int mps_oem_check(struct mp_config_table *mpc, char *oem, | |||
| 7 | 7 | ||
| 8 | extern int acpi_madt_oem_check(char *oem_id, char *oem_table_id); | 8 | extern int acpi_madt_oem_check(char *oem_id, char *oem_table_id); | 
| 9 | 9 | ||
| 10 | #endif | 10 | #endif /* ASM_X86__MACH_GENERIC__MACH_MPPARSE_H */ | 
| diff --git a/include/asm-x86/mach-generic/mach_mpspec.h b/include/asm-x86/mach-generic/mach_mpspec.h index c83c120be538..6061b153613e 100644 --- a/include/asm-x86/mach-generic/mach_mpspec.h +++ b/include/asm-x86/mach-generic/mach_mpspec.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_MPSPEC_H | 1 | #ifndef ASM_X86__MACH_GENERIC__MACH_MPSPEC_H | 
| 2 | #define __ASM_MACH_MPSPEC_H | 2 | #define ASM_X86__MACH_GENERIC__MACH_MPSPEC_H | 
| 3 | 3 | ||
| 4 | #define MAX_IRQ_SOURCES 256 | 4 | #define MAX_IRQ_SOURCES 256 | 
| 5 | 5 | ||
| @@ -9,4 +9,4 @@ | |||
| 9 | 9 | ||
| 10 | extern void numaq_mps_oem_check(struct mp_config_table *mpc, char *oem, | 10 | extern void numaq_mps_oem_check(struct mp_config_table *mpc, char *oem, | 
| 11 | char *productid); | 11 | char *productid); | 
| 12 | #endif /* __ASM_MACH_MPSPEC_H */ | 12 | #endif /* ASM_X86__MACH_GENERIC__MACH_MPSPEC_H */ | 
| diff --git a/include/asm-x86/mach-numaq/mach_apic.h b/include/asm-x86/mach-numaq/mach_apic.h index d802465e026a..7a0d39edfcfa 100644 --- a/include/asm-x86/mach-numaq/mach_apic.h +++ b/include/asm-x86/mach-numaq/mach_apic.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_APIC_H | 1 | #ifndef ASM_X86__MACH_NUMAQ__MACH_APIC_H | 
| 2 | #define __ASM_MACH_APIC_H | 2 | #define ASM_X86__MACH_NUMAQ__MACH_APIC_H | 
| 3 | 3 | ||
| 4 | #include <asm/io.h> | 4 | #include <asm/io.h> | 
| 5 | #include <linux/mmzone.h> | 5 | #include <linux/mmzone.h> | 
| @@ -135,4 +135,4 @@ static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb) | |||
| 135 | return cpuid_apic >> index_msb; | 135 | return cpuid_apic >> index_msb; | 
| 136 | } | 136 | } | 
| 137 | 137 | ||
| 138 | #endif /* __ASM_MACH_APIC_H */ | 138 | #endif /* ASM_X86__MACH_NUMAQ__MACH_APIC_H */ | 
| diff --git a/include/asm-x86/mach-numaq/mach_apicdef.h b/include/asm-x86/mach-numaq/mach_apicdef.h index bf439d0690f5..f870ec5f7782 100644 --- a/include/asm-x86/mach-numaq/mach_apicdef.h +++ b/include/asm-x86/mach-numaq/mach_apicdef.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_APICDEF_H | 1 | #ifndef ASM_X86__MACH_NUMAQ__MACH_APICDEF_H | 
| 2 | #define __ASM_MACH_APICDEF_H | 2 | #define ASM_X86__MACH_NUMAQ__MACH_APICDEF_H | 
| 3 | 3 | ||
| 4 | 4 | ||
| 5 | #define APIC_ID_MASK (0xF<<24) | 5 | #define APIC_ID_MASK (0xF<<24) | 
| @@ -11,4 +11,4 @@ static inline unsigned get_apic_id(unsigned long x) | |||
| 11 | 11 | ||
| 12 | #define GET_APIC_ID(x) get_apic_id(x) | 12 | #define GET_APIC_ID(x) get_apic_id(x) | 
| 13 | 13 | ||
| 14 | #endif | 14 | #endif /* ASM_X86__MACH_NUMAQ__MACH_APICDEF_H */ | 
| diff --git a/include/asm-x86/mach-numaq/mach_ipi.h b/include/asm-x86/mach-numaq/mach_ipi.h index c6044488e9e6..1e835823f4bc 100644 --- a/include/asm-x86/mach-numaq/mach_ipi.h +++ b/include/asm-x86/mach-numaq/mach_ipi.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_IPI_H | 1 | #ifndef ASM_X86__MACH_NUMAQ__MACH_IPI_H | 
| 2 | #define __ASM_MACH_IPI_H | 2 | #define ASM_X86__MACH_NUMAQ__MACH_IPI_H | 
| 3 | 3 | ||
| 4 | void send_IPI_mask_sequence(cpumask_t, int vector); | 4 | void send_IPI_mask_sequence(cpumask_t, int vector); | 
| 5 | 5 | ||
| @@ -22,4 +22,4 @@ static inline void send_IPI_all(int vector) | |||
| 22 | send_IPI_mask(cpu_online_map, vector); | 22 | send_IPI_mask(cpu_online_map, vector); | 
| 23 | } | 23 | } | 
| 24 | 24 | ||
| 25 | #endif /* __ASM_MACH_IPI_H */ | 25 | #endif /* ASM_X86__MACH_NUMAQ__MACH_IPI_H */ | 
| diff --git a/include/asm-x86/mach-numaq/mach_mpparse.h b/include/asm-x86/mach-numaq/mach_mpparse.h index 626aef6b155f..74ade184920b 100644 --- a/include/asm-x86/mach-numaq/mach_mpparse.h +++ b/include/asm-x86/mach-numaq/mach_mpparse.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifndef __ASM_MACH_MPPARSE_H | 1 | #ifndef ASM_X86__MACH_NUMAQ__MACH_MPPARSE_H | 
| 2 | #define __ASM_MACH_MPPARSE_H | 2 | #define ASM_X86__MACH_NUMAQ__MACH_MPPARSE_H | 
| 3 | 3 | ||
| 4 | extern void numaq_mps_oem_check(struct mp_config_table *mpc, char *oem, | 4 | extern void numaq_mps_oem_check(struct mp_config_table *mpc, char *oem, | 
| 5 | char *productid); | 5 | char *productid); | 
| 6 | 6 | ||
| 7 | #endif /* __ASM_MACH_MPPARSE_H */ | 7 | #endif /* ASM_X86__MACH_NUMAQ__MACH_MPPARSE_H */ | 
| diff --git a/include/asm-x86/mach-numaq/mach_wakecpu.h b/include/asm-x86/mach-numaq/mach_wakecpu.h index 00530041a991..0db8cea643c0 100644 --- a/include/asm-x86/mach-numaq/mach_wakecpu.h +++ b/include/asm-x86/mach-numaq/mach_wakecpu.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_WAKECPU_H | 1 | #ifndef ASM_X86__MACH_NUMAQ__MACH_WAKECPU_H | 
| 2 | #define __ASM_MACH_WAKECPU_H | 2 | #define ASM_X86__MACH_NUMAQ__MACH_WAKECPU_H | 
| 3 | 3 | ||
| 4 | /* This file copes with machines that wakeup secondary CPUs by NMIs */ | 4 | /* This file copes with machines that wakeup secondary CPUs by NMIs */ | 
| 5 | 5 | ||
| @@ -40,4 +40,4 @@ static inline void restore_NMI_vector(unsigned short *high, unsigned short *low) | |||
| 40 | 40 | ||
| 41 | #define inquire_remote_apic(apicid) {} | 41 | #define inquire_remote_apic(apicid) {} | 
| 42 | 42 | ||
| 43 | #endif /* __ASM_MACH_WAKECPU_H */ | 43 | #endif /* ASM_X86__MACH_NUMAQ__MACH_WAKECPU_H */ | 
| diff --git a/include/asm-x86/mach-rdc321x/gpio.h b/include/asm-x86/mach-rdc321x/gpio.h index acce0b7d397b..94b6cdf532e2 100644 --- a/include/asm-x86/mach-rdc321x/gpio.h +++ b/include/asm-x86/mach-rdc321x/gpio.h | |||
| @@ -1,5 +1,7 @@ | |||
| 1 | #ifndef _RDC321X_GPIO_H | 1 | #ifndef ASM_X86__MACH_RDC321X__GPIO_H | 
| 2 | #define _RDC321X_GPIO_H | 2 | #define ASM_X86__MACH_RDC321X__GPIO_H | 
| 3 | |||
| 4 | #include <linux/kernel.h> | ||
| 3 | 5 | ||
| 4 | extern int rdc_gpio_get_value(unsigned gpio); | 6 | extern int rdc_gpio_get_value(unsigned gpio); | 
| 5 | extern void rdc_gpio_set_value(unsigned gpio, int value); | 7 | extern void rdc_gpio_set_value(unsigned gpio, int value); | 
| @@ -18,6 +20,7 @@ static inline int gpio_request(unsigned gpio, const char *label) | |||
| 18 | 20 | ||
| 19 | static inline void gpio_free(unsigned gpio) | 21 | static inline void gpio_free(unsigned gpio) | 
| 20 | { | 22 | { | 
| 23 | might_sleep(); | ||
| 21 | rdc_gpio_free(gpio); | 24 | rdc_gpio_free(gpio); | 
| 22 | } | 25 | } | 
| 23 | 26 | ||
| @@ -54,4 +57,4 @@ static inline int irq_to_gpio(unsigned irq) | |||
| 54 | /* For cansleep */ | 57 | /* For cansleep */ | 
| 55 | #include <asm-generic/gpio.h> | 58 | #include <asm-generic/gpio.h> | 
| 56 | 59 | ||
| 57 | #endif /* _RDC321X_GPIO_H_ */ | 60 | #endif /* ASM_X86__MACH_RDC321X__GPIO_H */ | 
| diff --git a/include/asm-x86/mach-summit/irq_vectors_limits.h b/include/asm-x86/mach-summit/irq_vectors_limits.h index 890ce3f5e09a..22f376ad68e1 100644 --- a/include/asm-x86/mach-summit/irq_vectors_limits.h +++ b/include/asm-x86/mach-summit/irq_vectors_limits.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_IRQ_VECTORS_LIMITS_H | 1 | #ifndef ASM_X86__MACH_SUMMIT__IRQ_VECTORS_LIMITS_H | 
| 2 | #define _ASM_IRQ_VECTORS_LIMITS_H | 2 | #define ASM_X86__MACH_SUMMIT__IRQ_VECTORS_LIMITS_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * For Summit or generic (i.e. installer) kernels, we have lots of I/O APICs, | 5 | * For Summit or generic (i.e. installer) kernels, we have lots of I/O APICs, | 
| @@ -11,4 +11,4 @@ | |||
| 11 | #define NR_IRQS 224 | 11 | #define NR_IRQS 224 | 
| 12 | #define NR_IRQ_VECTORS 1024 | 12 | #define NR_IRQ_VECTORS 1024 | 
| 13 | 13 | ||
| 14 | #endif /* _ASM_IRQ_VECTORS_LIMITS_H */ | 14 | #endif /* ASM_X86__MACH_SUMMIT__IRQ_VECTORS_LIMITS_H */ | 
| diff --git a/include/asm-x86/mach-summit/mach_apic.h b/include/asm-x86/mach-summit/mach_apic.h index c47e2ab5c5ca..7a66758d701d 100644 --- a/include/asm-x86/mach-summit/mach_apic.h +++ b/include/asm-x86/mach-summit/mach_apic.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_APIC_H | 1 | #ifndef ASM_X86__MACH_SUMMIT__MACH_APIC_H | 
| 2 | #define __ASM_MACH_APIC_H | 2 | #define ASM_X86__MACH_SUMMIT__MACH_APIC_H | 
| 3 | 3 | ||
| 4 | #include <asm/smp.h> | 4 | #include <asm/smp.h> | 
| 5 | 5 | ||
| @@ -182,4 +182,4 @@ static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb) | |||
| 182 | return hard_smp_processor_id() >> index_msb; | 182 | return hard_smp_processor_id() >> index_msb; | 
| 183 | } | 183 | } | 
| 184 | 184 | ||
| 185 | #endif /* __ASM_MACH_APIC_H */ | 185 | #endif /* ASM_X86__MACH_SUMMIT__MACH_APIC_H */ | 
| diff --git a/include/asm-x86/mach-summit/mach_apicdef.h b/include/asm-x86/mach-summit/mach_apicdef.h index a58ab5a75c8c..d4bc8590c4f6 100644 --- a/include/asm-x86/mach-summit/mach_apicdef.h +++ b/include/asm-x86/mach-summit/mach_apicdef.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_APICDEF_H | 1 | #ifndef ASM_X86__MACH_SUMMIT__MACH_APICDEF_H | 
| 2 | #define __ASM_MACH_APICDEF_H | 2 | #define ASM_X86__MACH_SUMMIT__MACH_APICDEF_H | 
| 3 | 3 | ||
| 4 | #define APIC_ID_MASK (0xFF<<24) | 4 | #define APIC_ID_MASK (0xFF<<24) | 
| 5 | 5 | ||
| @@ -10,4 +10,4 @@ static inline unsigned get_apic_id(unsigned long x) | |||
| 10 | 10 | ||
| 11 | #define GET_APIC_ID(x) get_apic_id(x) | 11 | #define GET_APIC_ID(x) get_apic_id(x) | 
| 12 | 12 | ||
| 13 | #endif | 13 | #endif /* ASM_X86__MACH_SUMMIT__MACH_APICDEF_H */ | 
| diff --git a/include/asm-x86/mach-summit/mach_ipi.h b/include/asm-x86/mach-summit/mach_ipi.h index 9404c535b7ec..a3b31c528d90 100644 --- a/include/asm-x86/mach-summit/mach_ipi.h +++ b/include/asm-x86/mach-summit/mach_ipi.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_IPI_H | 1 | #ifndef ASM_X86__MACH_SUMMIT__MACH_IPI_H | 
| 2 | #define __ASM_MACH_IPI_H | 2 | #define ASM_X86__MACH_SUMMIT__MACH_IPI_H | 
| 3 | 3 | ||
| 4 | void send_IPI_mask_sequence(cpumask_t mask, int vector); | 4 | void send_IPI_mask_sequence(cpumask_t mask, int vector); | 
| 5 | 5 | ||
| @@ -22,4 +22,4 @@ static inline void send_IPI_all(int vector) | |||
| 22 | send_IPI_mask(cpu_online_map, vector); | 22 | send_IPI_mask(cpu_online_map, vector); | 
| 23 | } | 23 | } | 
| 24 | 24 | ||
| 25 | #endif /* __ASM_MACH_IPI_H */ | 25 | #endif /* ASM_X86__MACH_SUMMIT__MACH_IPI_H */ | 
| diff --git a/include/asm-x86/mach-summit/mach_mpparse.h b/include/asm-x86/mach-summit/mach_mpparse.h index fdf591701339..92396f28772b 100644 --- a/include/asm-x86/mach-summit/mach_mpparse.h +++ b/include/asm-x86/mach-summit/mach_mpparse.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MACH_MPPARSE_H | 1 | #ifndef ASM_X86__MACH_SUMMIT__MACH_MPPARSE_H | 
| 2 | #define __ASM_MACH_MPPARSE_H | 2 | #define ASM_X86__MACH_SUMMIT__MACH_MPPARSE_H | 
| 3 | 3 | ||
| 4 | #include <mach_apic.h> | 4 | #include <mach_apic.h> | 
| 5 | #include <asm/tsc.h> | 5 | #include <asm/tsc.h> | 
| @@ -107,4 +107,4 @@ static inline int is_WPEG(struct rio_detail *rio){ | |||
| 107 | rio->type == LookOutAWPEG || rio->type == LookOutBWPEG); | 107 | rio->type == LookOutAWPEG || rio->type == LookOutBWPEG); | 
| 108 | } | 108 | } | 
| 109 | 109 | ||
| 110 | #endif /* __ASM_MACH_MPPARSE_H */ | 110 | #endif /* ASM_X86__MACH_SUMMIT__MACH_MPPARSE_H */ | 
| diff --git a/include/asm-x86/math_emu.h b/include/asm-x86/math_emu.h index 9bf4ae93ab10..5768d8e95c8c 100644 --- a/include/asm-x86/math_emu.h +++ b/include/asm-x86/math_emu.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _I386_MATH_EMU_H | 1 | #ifndef ASM_X86__MATH_EMU_H | 
| 2 | #define _I386_MATH_EMU_H | 2 | #define ASM_X86__MATH_EMU_H | 
| 3 | 3 | ||
| 4 | /* This structure matches the layout of the data saved to the stack | 4 | /* This structure matches the layout of the data saved to the stack | 
| 5 | following a device-not-present interrupt, part of it saved | 5 | following a device-not-present interrupt, part of it saved | 
| @@ -28,4 +28,4 @@ struct info { | |||
| 28 | long ___vm86_fs; | 28 | long ___vm86_fs; | 
| 29 | long ___vm86_gs; | 29 | long ___vm86_gs; | 
| 30 | }; | 30 | }; | 
| 31 | #endif | 31 | #endif /* ASM_X86__MATH_EMU_H */ | 
| diff --git a/include/asm-x86/mc146818rtc.h b/include/asm-x86/mc146818rtc.h index daf1ccde77af..a995f33176cd 100644 --- a/include/asm-x86/mc146818rtc.h +++ b/include/asm-x86/mc146818rtc.h | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | /* | 1 | /* | 
| 2 | * Machine dependent access functions for RTC registers. | 2 | * Machine dependent access functions for RTC registers. | 
| 3 | */ | 3 | */ | 
| 4 | #ifndef _ASM_MC146818RTC_H | 4 | #ifndef ASM_X86__MC146818RTC_H | 
| 5 | #define _ASM_MC146818RTC_H | 5 | #define ASM_X86__MC146818RTC_H | 
| 6 | 6 | ||
| 7 | #include <asm/io.h> | 7 | #include <asm/io.h> | 
| 8 | #include <asm/system.h> | 8 | #include <asm/system.h> | 
| @@ -101,4 +101,4 @@ extern unsigned long mach_get_cmos_time(void); | |||
| 101 | 101 | ||
| 102 | #define RTC_IRQ 8 | 102 | #define RTC_IRQ 8 | 
| 103 | 103 | ||
| 104 | #endif /* _ASM_MC146818RTC_H */ | 104 | #endif /* ASM_X86__MC146818RTC_H */ | 
| diff --git a/include/asm-x86/mca.h b/include/asm-x86/mca.h index 09adf2eac4dc..60d1ed287b13 100644 --- a/include/asm-x86/mca.h +++ b/include/asm-x86/mca.h | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | /* -*- mode: c; c-basic-offset: 8 -*- */ | 1 | /* -*- mode: c; c-basic-offset: 8 -*- */ | 
| 2 | 2 | ||
| 3 | /* Platform specific MCA defines */ | 3 | /* Platform specific MCA defines */ | 
| 4 | #ifndef _ASM_MCA_H | 4 | #ifndef ASM_X86__MCA_H | 
| 5 | #define _ASM_MCA_H | 5 | #define ASM_X86__MCA_H | 
| 6 | 6 | ||
| 7 | /* Maximal number of MCA slots - actually, some machines have less, but | 7 | /* Maximal number of MCA slots - actually, some machines have less, but | 
| 8 | * they all have sufficient number of POS registers to cover 8. | 8 | * they all have sufficient number of POS registers to cover 8. | 
| @@ -40,4 +40,4 @@ | |||
| 40 | */ | 40 | */ | 
| 41 | #define MCA_NUMADAPTERS (MCA_MAX_SLOT_NR+3) | 41 | #define MCA_NUMADAPTERS (MCA_MAX_SLOT_NR+3) | 
| 42 | 42 | ||
| 43 | #endif | 43 | #endif /* ASM_X86__MCA_H */ | 
| diff --git a/include/asm-x86/mca_dma.h b/include/asm-x86/mca_dma.h index c3dca6edc6b1..49f22be237d2 100644 --- a/include/asm-x86/mca_dma.h +++ b/include/asm-x86/mca_dma.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef MCA_DMA_H | 1 | #ifndef ASM_X86__MCA_DMA_H | 
| 2 | #define MCA_DMA_H | 2 | #define ASM_X86__MCA_DMA_H | 
| 3 | 3 | ||
| 4 | #include <asm/io.h> | 4 | #include <asm/io.h> | 
| 5 | #include <linux/ioport.h> | 5 | #include <linux/ioport.h> | 
| @@ -198,4 +198,4 @@ static inline void mca_set_dma_mode(unsigned int dmanr, unsigned int mode) | |||
| 198 | outb(mode, MCA_DMA_REG_EXE); | 198 | outb(mode, MCA_DMA_REG_EXE); | 
| 199 | } | 199 | } | 
| 200 | 200 | ||
| 201 | #endif /* MCA_DMA_H */ | 201 | #endif /* ASM_X86__MCA_DMA_H */ | 
| diff --git a/include/asm-x86/mce.h b/include/asm-x86/mce.h index 531eaa587455..036133eaf744 100644 --- a/include/asm-x86/mce.h +++ b/include/asm-x86/mce.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_MCE_H | 1 | #ifndef ASM_X86__MCE_H | 
| 2 | #define _ASM_X86_MCE_H | 2 | #define ASM_X86__MCE_H | 
| 3 | 3 | ||
| 4 | #ifdef __x86_64__ | 4 | #ifdef __x86_64__ | 
| 5 | 5 | ||
| @@ -127,4 +127,4 @@ extern void restart_mce(void); | |||
| 127 | 127 | ||
| 128 | #endif /* __KERNEL__ */ | 128 | #endif /* __KERNEL__ */ | 
| 129 | 129 | ||
| 130 | #endif | 130 | #endif /* ASM_X86__MCE_H */ | 
| diff --git a/include/asm-x86/mman.h b/include/asm-x86/mman.h index 90bc4108a4fd..4ef28e6de383 100644 --- a/include/asm-x86/mman.h +++ b/include/asm-x86/mman.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_MMAN_H | 1 | #ifndef ASM_X86__MMAN_H | 
| 2 | #define _ASM_X86_MMAN_H | 2 | #define ASM_X86__MMAN_H | 
| 3 | 3 | ||
| 4 | #include <asm-generic/mman.h> | 4 | #include <asm-generic/mman.h> | 
| 5 | 5 | ||
| @@ -17,4 +17,4 @@ | |||
| 17 | #define MCL_CURRENT 1 /* lock all current mappings */ | 17 | #define MCL_CURRENT 1 /* lock all current mappings */ | 
| 18 | #define MCL_FUTURE 2 /* lock all future mappings */ | 18 | #define MCL_FUTURE 2 /* lock all future mappings */ | 
| 19 | 19 | ||
| 20 | #endif /* _ASM_X86_MMAN_H */ | 20 | #endif /* ASM_X86__MMAN_H */ | 
| diff --git a/include/asm-x86/mmconfig.h b/include/asm-x86/mmconfig.h index e293ab81e850..fb79b1cf5d07 100644 --- a/include/asm-x86/mmconfig.h +++ b/include/asm-x86/mmconfig.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_MMCONFIG_H | 1 | #ifndef ASM_X86__MMCONFIG_H | 
| 2 | #define _ASM_MMCONFIG_H | 2 | #define ASM_X86__MMCONFIG_H | 
| 3 | 3 | ||
| 4 | #ifdef CONFIG_PCI_MMCONFIG | 4 | #ifdef CONFIG_PCI_MMCONFIG | 
| 5 | extern void __cpuinit fam10h_check_enable_mmcfg(void); | 5 | extern void __cpuinit fam10h_check_enable_mmcfg(void); | 
| @@ -9,4 +9,4 @@ static inline void fam10h_check_enable_mmcfg(void) { } | |||
| 9 | static inline void check_enable_amd_mmconf_dmi(void) { } | 9 | static inline void check_enable_amd_mmconf_dmi(void) { } | 
| 10 | #endif | 10 | #endif | 
| 11 | 11 | ||
| 12 | #endif | 12 | #endif /* ASM_X86__MMCONFIG_H */ | 
| diff --git a/include/asm-x86/mmu.h b/include/asm-x86/mmu.h index 00e88679e11f..9d5aff14334a 100644 --- a/include/asm-x86/mmu.h +++ b/include/asm-x86/mmu.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_MMU_H | 1 | #ifndef ASM_X86__MMU_H | 
| 2 | #define _ASM_X86_MMU_H | 2 | #define ASM_X86__MMU_H | 
| 3 | 3 | ||
| 4 | #include <linux/spinlock.h> | 4 | #include <linux/spinlock.h> | 
| 5 | #include <linux/mutex.h> | 5 | #include <linux/mutex.h> | 
| @@ -7,14 +7,9 @@ | |||
| 7 | /* | 7 | /* | 
| 8 | * The x86 doesn't have a mmu context, but | 8 | * The x86 doesn't have a mmu context, but | 
| 9 | * we put the segment information here. | 9 | * we put the segment information here. | 
| 10 | * | ||
| 11 | * cpu_vm_mask is used to optimize ldt flushing. | ||
| 12 | */ | 10 | */ | 
| 13 | typedef struct { | 11 | typedef struct { | 
| 14 | void *ldt; | 12 | void *ldt; | 
| 15 | #ifdef CONFIG_X86_64 | ||
| 16 | rwlock_t ldtlock; | ||
| 17 | #endif | ||
| 18 | int size; | 13 | int size; | 
| 19 | struct mutex lock; | 14 | struct mutex lock; | 
| 20 | void *vdso; | 15 | void *vdso; | 
| @@ -28,4 +23,4 @@ static inline void leave_mm(int cpu) | |||
| 28 | } | 23 | } | 
| 29 | #endif | 24 | #endif | 
| 30 | 25 | ||
| 31 | #endif /* _ASM_X86_MMU_H */ | 26 | #endif /* ASM_X86__MMU_H */ | 
| diff --git a/include/asm-x86/mmu_context.h b/include/asm-x86/mmu_context.h index fac57014e7c6..8ec940bfd079 100644 --- a/include/asm-x86/mmu_context.h +++ b/include/asm-x86/mmu_context.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_X86_MMU_CONTEXT_H | 1 | #ifndef ASM_X86__MMU_CONTEXT_H | 
| 2 | #define __ASM_X86_MMU_CONTEXT_H | 2 | #define ASM_X86__MMU_CONTEXT_H | 
| 3 | 3 | ||
| 4 | #include <asm/desc.h> | 4 | #include <asm/desc.h> | 
| 5 | #include <asm/atomic.h> | 5 | #include <asm/atomic.h> | 
| @@ -34,4 +34,4 @@ do { \ | |||
| 34 | } while (0); | 34 | } while (0); | 
| 35 | 35 | ||
| 36 | 36 | ||
| 37 | #endif /* __ASM_X86_MMU_CONTEXT_H */ | 37 | #endif /* ASM_X86__MMU_CONTEXT_H */ | 
| diff --git a/include/asm-x86/mmu_context_32.h b/include/asm-x86/mmu_context_32.h index 824fc575c6d8..cce6f6e4afd6 100644 --- a/include/asm-x86/mmu_context_32.h +++ b/include/asm-x86/mmu_context_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __I386_SCHED_H | 1 | #ifndef ASM_X86__MMU_CONTEXT_32_H | 
| 2 | #define __I386_SCHED_H | 2 | #define ASM_X86__MMU_CONTEXT_32_H | 
| 3 | 3 | ||
| 4 | static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) | 4 | static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) | 
| 5 | { | 5 | { | 
| @@ -53,4 +53,4 @@ static inline void switch_mm(struct mm_struct *prev, | |||
| 53 | #define deactivate_mm(tsk, mm) \ | 53 | #define deactivate_mm(tsk, mm) \ | 
| 54 | asm("movl %0,%%gs": :"r" (0)); | 54 | asm("movl %0,%%gs": :"r" (0)); | 
| 55 | 55 | ||
| 56 | #endif | 56 | #endif /* ASM_X86__MMU_CONTEXT_32_H */ | 
| diff --git a/include/asm-x86/mmu_context_64.h b/include/asm-x86/mmu_context_64.h index c7000634ccae..26758673c828 100644 --- a/include/asm-x86/mmu_context_64.h +++ b/include/asm-x86/mmu_context_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __X86_64_MMU_CONTEXT_H | 1 | #ifndef ASM_X86__MMU_CONTEXT_64_H | 
| 2 | #define __X86_64_MMU_CONTEXT_H | 2 | #define ASM_X86__MMU_CONTEXT_64_H | 
| 3 | 3 | ||
| 4 | #include <asm/pda.h> | 4 | #include <asm/pda.h> | 
| 5 | 5 | ||
| @@ -51,4 +51,4 @@ do { \ | |||
| 51 | asm volatile("movl %0,%%fs"::"r"(0)); \ | 51 | asm volatile("movl %0,%%fs"::"r"(0)); \ | 
| 52 | } while (0) | 52 | } while (0) | 
| 53 | 53 | ||
| 54 | #endif | 54 | #endif /* ASM_X86__MMU_CONTEXT_64_H */ | 
| diff --git a/include/asm-x86/mmx.h b/include/asm-x86/mmx.h index 940881218ff8..2e7299bb3653 100644 --- a/include/asm-x86/mmx.h +++ b/include/asm-x86/mmx.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_MMX_H | 1 | #ifndef ASM_X86__MMX_H | 
| 2 | #define _ASM_MMX_H | 2 | #define ASM_X86__MMX_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * MMX 3Dnow! helper operations | 5 | * MMX 3Dnow! helper operations | 
| @@ -11,4 +11,4 @@ extern void *_mmx_memcpy(void *to, const void *from, size_t size); | |||
| 11 | extern void mmx_clear_page(void *page); | 11 | extern void mmx_clear_page(void *page); | 
| 12 | extern void mmx_copy_page(void *to, void *from); | 12 | extern void mmx_copy_page(void *to, void *from); | 
| 13 | 13 | ||
| 14 | #endif | 14 | #endif /* ASM_X86__MMX_H */ | 
| diff --git a/include/asm-x86/mmzone_32.h b/include/asm-x86/mmzone_32.h index 5862e6460658..121b65d61d86 100644 --- a/include/asm-x86/mmzone_32.h +++ b/include/asm-x86/mmzone_32.h | |||
| @@ -3,8 +3,8 @@ | |||
| 3 | * | 3 | * | 
| 4 | */ | 4 | */ | 
| 5 | 5 | ||
| 6 | #ifndef _ASM_MMZONE_H_ | 6 | #ifndef ASM_X86__MMZONE_32_H | 
| 7 | #define _ASM_MMZONE_H_ | 7 | #define ASM_X86__MMZONE_32_H | 
| 8 | 8 | ||
| 9 | #include <asm/smp.h> | 9 | #include <asm/smp.h> | 
| 10 | 10 | ||
| @@ -131,4 +131,4 @@ static inline int pfn_valid(int pfn) | |||
| 131 | }) | 131 | }) | 
| 132 | #endif /* CONFIG_NEED_MULTIPLE_NODES */ | 132 | #endif /* CONFIG_NEED_MULTIPLE_NODES */ | 
| 133 | 133 | ||
| 134 | #endif /* _ASM_MMZONE_H_ */ | 134 | #endif /* ASM_X86__MMZONE_32_H */ | 
| diff --git a/include/asm-x86/mmzone_64.h b/include/asm-x86/mmzone_64.h index 594bd0dc1d08..626b03a14875 100644 --- a/include/asm-x86/mmzone_64.h +++ b/include/asm-x86/mmzone_64.h | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | /* K8 NUMA support */ | 1 | /* K8 NUMA support */ | 
| 2 | /* Copyright 2002,2003 by Andi Kleen, SuSE Labs */ | 2 | /* Copyright 2002,2003 by Andi Kleen, SuSE Labs */ | 
| 3 | /* 2.5 Version loosely based on the NUMAQ Code by Pat Gaughen. */ | 3 | /* 2.5 Version loosely based on the NUMAQ Code by Pat Gaughen. */ | 
| 4 | #ifndef _ASM_X86_64_MMZONE_H | 4 | #ifndef ASM_X86__MMZONE_64_H | 
| 5 | #define _ASM_X86_64_MMZONE_H 1 | 5 | #define ASM_X86__MMZONE_64_H | 
| 6 | 6 | ||
| 7 | 7 | ||
| 8 | #ifdef CONFIG_NUMA | 8 | #ifdef CONFIG_NUMA | 
| @@ -49,4 +49,4 @@ extern int early_pfn_to_nid(unsigned long pfn); | |||
| 49 | #endif | 49 | #endif | 
| 50 | 50 | ||
| 51 | #endif | 51 | #endif | 
| 52 | #endif | 52 | #endif /* ASM_X86__MMZONE_64_H */ | 
| diff --git a/include/asm-x86/module.h b/include/asm-x86/module.h index bfedb247871c..48dc3e0c07d9 100644 --- a/include/asm-x86/module.h +++ b/include/asm-x86/module.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_MODULE_H | 1 | #ifndef ASM_X86__MODULE_H | 
| 2 | #define _ASM_MODULE_H | 2 | #define ASM_X86__MODULE_H | 
| 3 | 3 | ||
| 4 | /* x86_32/64 are simple */ | 4 | /* x86_32/64 are simple */ | 
| 5 | struct mod_arch_specific {}; | 5 | struct mod_arch_specific {}; | 
| @@ -79,4 +79,4 @@ struct mod_arch_specific {}; | |||
| 79 | # define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY MODULE_STACKSIZE | 79 | # define MODULE_ARCH_VERMAGIC MODULE_PROC_FAMILY MODULE_STACKSIZE | 
| 80 | #endif | 80 | #endif | 
| 81 | 81 | ||
| 82 | #endif /* _ASM_MODULE_H */ | 82 | #endif /* ASM_X86__MODULE_H */ | 
| diff --git a/include/asm-x86/mpspec.h b/include/asm-x86/mpspec.h index b6995e567fcc..118da365e371 100644 --- a/include/asm-x86/mpspec.h +++ b/include/asm-x86/mpspec.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _AM_X86_MPSPEC_H | 1 | #ifndef ASM_X86__MPSPEC_H | 
| 2 | #define _AM_X86_MPSPEC_H | 2 | #define ASM_X86__MPSPEC_H | 
| 3 | 3 | ||
| 4 | #include <linux/init.h> | 4 | #include <linux/init.h> | 
| 5 | 5 | ||
| @@ -141,4 +141,4 @@ static inline void physid_set_mask_of_physid(int physid, physid_mask_t *map) | |||
| 141 | 141 | ||
| 142 | extern physid_mask_t phys_cpu_present_map; | 142 | extern physid_mask_t phys_cpu_present_map; | 
| 143 | 143 | ||
| 144 | #endif | 144 | #endif /* ASM_X86__MPSPEC_H */ | 
| diff --git a/include/asm-x86/mpspec_def.h b/include/asm-x86/mpspec_def.h index 38d1e73b49e4..79166b048012 100644 --- a/include/asm-x86/mpspec_def.h +++ b/include/asm-x86/mpspec_def.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MPSPEC_DEF_H | 1 | #ifndef ASM_X86__MPSPEC_DEF_H | 
| 2 | #define __ASM_MPSPEC_DEF_H | 2 | #define ASM_X86__MPSPEC_DEF_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * Structure definitions for SMP machines following the | 5 | * Structure definitions for SMP machines following the | 
| @@ -177,4 +177,4 @@ enum mp_bustype { | |||
| 177 | MP_BUS_PCI, | 177 | MP_BUS_PCI, | 
| 178 | MP_BUS_MCA, | 178 | MP_BUS_MCA, | 
| 179 | }; | 179 | }; | 
| 180 | #endif | 180 | #endif /* ASM_X86__MPSPEC_DEF_H */ | 
| diff --git a/include/asm-x86/msgbuf.h b/include/asm-x86/msgbuf.h index 7e4e9481f51c..1b538c907a3d 100644 --- a/include/asm-x86/msgbuf.h +++ b/include/asm-x86/msgbuf.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_MSGBUF_H | 1 | #ifndef ASM_X86__MSGBUF_H | 
| 2 | #define _ASM_X86_MSGBUF_H | 2 | #define ASM_X86__MSGBUF_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * The msqid64_ds structure for i386 architecture. | 5 | * The msqid64_ds structure for i386 architecture. | 
| @@ -36,4 +36,4 @@ struct msqid64_ds { | |||
| 36 | unsigned long __unused5; | 36 | unsigned long __unused5; | 
| 37 | }; | 37 | }; | 
| 38 | 38 | ||
| 39 | #endif /* _ASM_X86_MSGBUF_H */ | 39 | #endif /* ASM_X86__MSGBUF_H */ | 
| diff --git a/include/asm-x86/msidef.h b/include/asm-x86/msidef.h index 296f29ce426d..3139666a94fa 100644 --- a/include/asm-x86/msidef.h +++ b/include/asm-x86/msidef.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef ASM_MSIDEF_H | 1 | #ifndef ASM_X86__MSIDEF_H | 
| 2 | #define ASM_MSIDEF_H | 2 | #define ASM_X86__MSIDEF_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * Constants for Intel APIC based MSI messages. | 5 | * Constants for Intel APIC based MSI messages. | 
| @@ -48,4 +48,4 @@ | |||
| 48 | #define MSI_ADDR_DEST_ID(dest) (((dest) << MSI_ADDR_DEST_ID_SHIFT) & \ | 48 | #define MSI_ADDR_DEST_ID(dest) (((dest) << MSI_ADDR_DEST_ID_SHIFT) & \ | 
| 49 | MSI_ADDR_DEST_ID_MASK) | 49 | MSI_ADDR_DEST_ID_MASK) | 
| 50 | 50 | ||
| 51 | #endif /* ASM_MSIDEF_H */ | 51 | #endif /* ASM_X86__MSIDEF_H */ | 
| diff --git a/include/asm-x86/msr-index.h b/include/asm-x86/msr-index.h index 44bce773012e..3052f058ab06 100644 --- a/include/asm-x86/msr-index.h +++ b/include/asm-x86/msr-index.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_MSR_INDEX_H | 1 | #ifndef ASM_X86__MSR_INDEX_H | 
| 2 | #define __ASM_MSR_INDEX_H | 2 | #define ASM_X86__MSR_INDEX_H | 
| 3 | 3 | ||
| 4 | /* CPU model specific register (MSR) numbers */ | 4 | /* CPU model specific register (MSR) numbers */ | 
| 5 | 5 | ||
| @@ -310,4 +310,4 @@ | |||
| 310 | /* Geode defined MSRs */ | 310 | /* Geode defined MSRs */ | 
| 311 | #define MSR_GEODE_BUSCONT_CONF0 0x00001900 | 311 | #define MSR_GEODE_BUSCONT_CONF0 0x00001900 | 
| 312 | 312 | ||
| 313 | #endif /* __ASM_MSR_INDEX_H */ | 313 | #endif /* ASM_X86__MSR_INDEX_H */ | 
| diff --git a/include/asm-x86/msr.h b/include/asm-x86/msr.h index 2362cfda1fbc..530af1f6389e 100644 --- a/include/asm-x86/msr.h +++ b/include/asm-x86/msr.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_X86_MSR_H_ | 1 | #ifndef ASM_X86__MSR_H | 
| 2 | #define __ASM_X86_MSR_H_ | 2 | #define ASM_X86__MSR_H | 
| 3 | 3 | ||
| 4 | #include <asm/msr-index.h> | 4 | #include <asm/msr-index.h> | 
| 5 | 5 | ||
| @@ -63,6 +63,22 @@ static inline unsigned long long native_read_msr_safe(unsigned int msr, | |||
| 63 | return EAX_EDX_VAL(val, low, high); | 63 | return EAX_EDX_VAL(val, low, high); | 
| 64 | } | 64 | } | 
| 65 | 65 | ||
| 66 | static inline unsigned long long native_read_msr_amd_safe(unsigned int msr, | ||
| 67 | int *err) | ||
| 68 | { | ||
| 69 | DECLARE_ARGS(val, low, high); | ||
| 70 | |||
| 71 | asm volatile("2: rdmsr ; xor %0,%0\n" | ||
| 72 | "1:\n\t" | ||
| 73 | ".section .fixup,\"ax\"\n\t" | ||
| 74 | "3: mov %3,%0 ; jmp 1b\n\t" | ||
| 75 | ".previous\n\t" | ||
| 76 | _ASM_EXTABLE(2b, 3b) | ||
| 77 | : "=r" (*err), EAX_EDX_RET(val, low, high) | ||
| 78 | : "c" (msr), "D" (0x9c5a203a), "i" (-EFAULT)); | ||
| 79 | return EAX_EDX_VAL(val, low, high); | ||
| 80 | } | ||
| 81 | |||
| 66 | static inline void native_write_msr(unsigned int msr, | 82 | static inline void native_write_msr(unsigned int msr, | 
| 67 | unsigned low, unsigned high) | 83 | unsigned low, unsigned high) | 
| 68 | { | 84 | { | 
| @@ -158,6 +174,13 @@ static inline int rdmsrl_safe(unsigned msr, unsigned long long *p) | |||
| 158 | *p = native_read_msr_safe(msr, &err); | 174 | *p = native_read_msr_safe(msr, &err); | 
| 159 | return err; | 175 | return err; | 
| 160 | } | 176 | } | 
| 177 | static inline int rdmsrl_amd_safe(unsigned msr, unsigned long long *p) | ||
| 178 | { | ||
| 179 | int err; | ||
| 180 | |||
| 181 | *p = native_read_msr_amd_safe(msr, &err); | ||
| 182 | return err; | ||
| 183 | } | ||
| 161 | 184 | ||
| 162 | #define rdtscl(low) \ | 185 | #define rdtscl(low) \ | 
| 163 | ((low) = (u32)native_read_tsc()) | 186 | ((low) = (u32)native_read_tsc()) | 
| @@ -221,4 +244,4 @@ static inline int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) | |||
| 221 | #endif /* __KERNEL__ */ | 244 | #endif /* __KERNEL__ */ | 
| 222 | 245 | ||
| 223 | 246 | ||
| 224 | #endif | 247 | #endif /* ASM_X86__MSR_H */ | 
| diff --git a/include/asm-x86/mtrr.h b/include/asm-x86/mtrr.h index a69a01a51729..23a7f83da953 100644 --- a/include/asm-x86/mtrr.h +++ b/include/asm-x86/mtrr.h | |||
| @@ -20,8 +20,8 @@ | |||
| 20 | The postal address is: | 20 | The postal address is: | 
| 21 | Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia. | 21 | Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia. | 
| 22 | */ | 22 | */ | 
| 23 | #ifndef _ASM_X86_MTRR_H | 23 | #ifndef ASM_X86__MTRR_H | 
| 24 | #define _ASM_X86_MTRR_H | 24 | #define ASM_X86__MTRR_H | 
| 25 | 25 | ||
| 26 | #include <linux/ioctl.h> | 26 | #include <linux/ioctl.h> | 
| 27 | #include <linux/errno.h> | 27 | #include <linux/errno.h> | 
| @@ -170,4 +170,4 @@ struct mtrr_gentry32 { | |||
| 170 | 170 | ||
| 171 | #endif /* __KERNEL__ */ | 171 | #endif /* __KERNEL__ */ | 
| 172 | 172 | ||
| 173 | #endif /* _ASM_X86_MTRR_H */ | 173 | #endif /* ASM_X86__MTRR_H */ | 
| diff --git a/include/asm-x86/mutex_32.h b/include/asm-x86/mutex_32.h index 73e928ef5f03..25c16d8ba3c7 100644 --- a/include/asm-x86/mutex_32.h +++ b/include/asm-x86/mutex_32.h | |||
| @@ -6,8 +6,8 @@ | |||
| 6 | * | 6 | * | 
| 7 | * Copyright (C) 2004, 2005, 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> | 7 | * Copyright (C) 2004, 2005, 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> | 
| 8 | */ | 8 | */ | 
| 9 | #ifndef _ASM_MUTEX_H | 9 | #ifndef ASM_X86__MUTEX_32_H | 
| 10 | #define _ASM_MUTEX_H | 10 | #define ASM_X86__MUTEX_32_H | 
| 11 | 11 | ||
| 12 | #include <asm/alternative.h> | 12 | #include <asm/alternative.h> | 
| 13 | 13 | ||
| @@ -122,4 +122,4 @@ static inline int __mutex_fastpath_trylock(atomic_t *count, | |||
| 122 | #endif | 122 | #endif | 
| 123 | } | 123 | } | 
| 124 | 124 | ||
| 125 | #endif | 125 | #endif /* ASM_X86__MUTEX_32_H */ | 
| diff --git a/include/asm-x86/mutex_64.h b/include/asm-x86/mutex_64.h index f3fae9becb38..918ba21ab9d9 100644 --- a/include/asm-x86/mutex_64.h +++ b/include/asm-x86/mutex_64.h | |||
| @@ -6,8 +6,8 @@ | |||
| 6 | * | 6 | * | 
| 7 | * Copyright (C) 2004, 2005, 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> | 7 | * Copyright (C) 2004, 2005, 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> | 
| 8 | */ | 8 | */ | 
| 9 | #ifndef _ASM_MUTEX_H | 9 | #ifndef ASM_X86__MUTEX_64_H | 
| 10 | #define _ASM_MUTEX_H | 10 | #define ASM_X86__MUTEX_64_H | 
| 11 | 11 | ||
| 12 | /** | 12 | /** | 
| 13 | * __mutex_fastpath_lock - decrement and call function if negative | 13 | * __mutex_fastpath_lock - decrement and call function if negative | 
| @@ -97,4 +97,4 @@ static inline int __mutex_fastpath_trylock(atomic_t *count, | |||
| 97 | return 0; | 97 | return 0; | 
| 98 | } | 98 | } | 
| 99 | 99 | ||
| 100 | #endif | 100 | #endif /* ASM_X86__MUTEX_64_H */ | 
| diff --git a/include/asm-x86/nmi.h b/include/asm-x86/nmi.h index 21f8d0202a82..d5e715f024dc 100644 --- a/include/asm-x86/nmi.h +++ b/include/asm-x86/nmi.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_NMI_H_ | 1 | #ifndef ASM_X86__NMI_H | 
| 2 | #define _ASM_X86_NMI_H_ | 2 | #define ASM_X86__NMI_H | 
| 3 | 3 | ||
| 4 | #include <linux/pm.h> | 4 | #include <linux/pm.h> | 
| 5 | #include <asm/irq.h> | 5 | #include <asm/irq.h> | 
| @@ -34,6 +34,7 @@ extern void stop_apic_nmi_watchdog(void *); | |||
| 34 | extern void disable_timer_nmi_watchdog(void); | 34 | extern void disable_timer_nmi_watchdog(void); | 
| 35 | extern void enable_timer_nmi_watchdog(void); | 35 | extern void enable_timer_nmi_watchdog(void); | 
| 36 | extern int nmi_watchdog_tick(struct pt_regs *regs, unsigned reason); | 36 | extern int nmi_watchdog_tick(struct pt_regs *regs, unsigned reason); | 
| 37 | extern void cpu_nmi_set_wd_enabled(void); | ||
| 37 | 38 | ||
| 38 | extern atomic_t nmi_active; | 39 | extern atomic_t nmi_active; | 
| 39 | extern unsigned int nmi_watchdog; | 40 | extern unsigned int nmi_watchdog; | 
| @@ -81,4 +82,4 @@ void enable_lapic_nmi_watchdog(void); | |||
| 81 | void stop_nmi(void); | 82 | void stop_nmi(void); | 
| 82 | void restart_nmi(void); | 83 | void restart_nmi(void); | 
| 83 | 84 | ||
| 84 | #endif | 85 | #endif /* ASM_X86__NMI_H */ | 
| diff --git a/include/asm-x86/nops.h b/include/asm-x86/nops.h index ad0bedd10b89..ae742721ae73 100644 --- a/include/asm-x86/nops.h +++ b/include/asm-x86/nops.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_NOPS_H | 1 | #ifndef ASM_X86__NOPS_H | 
| 2 | #define _ASM_NOPS_H 1 | 2 | #define ASM_X86__NOPS_H | 
| 3 | 3 | ||
| 4 | /* Define nops for use with alternative() */ | 4 | /* Define nops for use with alternative() */ | 
| 5 | 5 | ||
| @@ -115,4 +115,4 @@ | |||
| 115 | 115 | ||
| 116 | #define ASM_NOP_MAX 8 | 116 | #define ASM_NOP_MAX 8 | 
| 117 | 117 | ||
| 118 | #endif | 118 | #endif /* ASM_X86__NOPS_H */ | 
| diff --git a/include/asm-x86/numa_32.h b/include/asm-x86/numa_32.h index 220d7b7707a0..44cb07855c5b 100644 --- a/include/asm-x86/numa_32.h +++ b/include/asm-x86/numa_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_32_NUMA_H | 1 | #ifndef ASM_X86__NUMA_32_H | 
| 2 | #define _ASM_X86_32_NUMA_H 1 | 2 | #define ASM_X86__NUMA_32_H | 
| 3 | 3 | ||
| 4 | extern int pxm_to_nid(int pxm); | 4 | extern int pxm_to_nid(int pxm); | 
| 5 | extern void numa_remove_cpu(int cpu); | 5 | extern void numa_remove_cpu(int cpu); | 
| @@ -8,4 +8,4 @@ extern void numa_remove_cpu(int cpu); | |||
| 8 | extern void set_highmem_pages_init(void); | 8 | extern void set_highmem_pages_init(void); | 
| 9 | #endif | 9 | #endif | 
| 10 | 10 | ||
| 11 | #endif /* _ASM_X86_32_NUMA_H */ | 11 | #endif /* ASM_X86__NUMA_32_H */ | 
| diff --git a/include/asm-x86/numa_64.h b/include/asm-x86/numa_64.h index 3830094434a9..15c990395b02 100644 --- a/include/asm-x86/numa_64.h +++ b/include/asm-x86/numa_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X8664_NUMA_H | 1 | #ifndef ASM_X86__NUMA_64_H | 
| 2 | #define _ASM_X8664_NUMA_H 1 | 2 | #define ASM_X86__NUMA_64_H | 
| 3 | 3 | ||
| 4 | #include <linux/nodemask.h> | 4 | #include <linux/nodemask.h> | 
| 5 | #include <asm/apicdef.h> | 5 | #include <asm/apicdef.h> | 
| @@ -40,4 +40,4 @@ static inline void numa_add_cpu(int cpu, int node) { } | |||
| 40 | static inline void numa_remove_cpu(int cpu) { } | 40 | static inline void numa_remove_cpu(int cpu) { } | 
| 41 | #endif | 41 | #endif | 
| 42 | 42 | ||
| 43 | #endif | 43 | #endif /* ASM_X86__NUMA_64_H */ | 
| diff --git a/include/asm-x86/numaq.h b/include/asm-x86/numaq.h index 34b92d581fa3..124bf7d4b70a 100644 --- a/include/asm-x86/numaq.h +++ b/include/asm-x86/numaq.h | |||
| @@ -23,8 +23,8 @@ | |||
| 23 | * Send feedback to <gone@us.ibm.com> | 23 | * Send feedback to <gone@us.ibm.com> | 
| 24 | */ | 24 | */ | 
| 25 | 25 | ||
| 26 | #ifndef NUMAQ_H | 26 | #ifndef ASM_X86__NUMAQ_H | 
| 27 | #define NUMAQ_H | 27 | #define ASM_X86__NUMAQ_H | 
| 28 | 28 | ||
| 29 | #ifdef CONFIG_X86_NUMAQ | 29 | #ifdef CONFIG_X86_NUMAQ | 
| 30 | 30 | ||
| @@ -165,5 +165,5 @@ static inline int get_memcfg_numaq(void) | |||
| 165 | return 0; | 165 | return 0; | 
| 166 | } | 166 | } | 
| 167 | #endif /* CONFIG_X86_NUMAQ */ | 167 | #endif /* CONFIG_X86_NUMAQ */ | 
| 168 | #endif /* NUMAQ_H */ | 168 | #endif /* ASM_X86__NUMAQ_H */ | 
| 169 | 169 | ||
| diff --git a/include/asm-x86/olpc.h b/include/asm-x86/olpc.h index 97d47133486f..d7328b1a05c1 100644 --- a/include/asm-x86/olpc.h +++ b/include/asm-x86/olpc.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* OLPC machine specific definitions */ | 1 | /* OLPC machine specific definitions */ | 
| 2 | 2 | ||
| 3 | #ifndef ASM_OLPC_H_ | 3 | #ifndef ASM_X86__OLPC_H | 
| 4 | #define ASM_OLPC_H_ | 4 | #define ASM_X86__OLPC_H | 
| 5 | 5 | ||
| 6 | #include <asm/geode.h> | 6 | #include <asm/geode.h> | 
| 7 | 7 | ||
| @@ -129,4 +129,4 @@ extern int olpc_ec_mask_unset(uint8_t bits); | |||
| 129 | #define OLPC_GPIO_LID geode_gpio(26) | 129 | #define OLPC_GPIO_LID geode_gpio(26) | 
| 130 | #define OLPC_GPIO_ECSCI geode_gpio(27) | 130 | #define OLPC_GPIO_ECSCI geode_gpio(27) | 
| 131 | 131 | ||
| 132 | #endif | 132 | #endif /* ASM_X86__OLPC_H */ | 
| diff --git a/include/asm-x86/page.h b/include/asm-x86/page.h index 49982110e4d9..79544e6ffb8b 100644 --- a/include/asm-x86/page.h +++ b/include/asm-x86/page.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_PAGE_H | 1 | #ifndef ASM_X86__PAGE_H | 
| 2 | #define _ASM_X86_PAGE_H | 2 | #define ASM_X86__PAGE_H | 
| 3 | 3 | ||
| 4 | #include <linux/const.h> | 4 | #include <linux/const.h> | 
| 5 | 5 | ||
| @@ -199,4 +199,4 @@ static inline pteval_t native_pte_flags(pte_t pte) | |||
| 199 | #define __HAVE_ARCH_GATE_AREA 1 | 199 | #define __HAVE_ARCH_GATE_AREA 1 | 
| 200 | 200 | ||
| 201 | #endif /* __KERNEL__ */ | 201 | #endif /* __KERNEL__ */ | 
| 202 | #endif /* _ASM_X86_PAGE_H */ | 202 | #endif /* ASM_X86__PAGE_H */ | 
| diff --git a/include/asm-x86/page_32.h b/include/asm-x86/page_32.h index ab8528793f08..72f7305682c6 100644 --- a/include/asm-x86/page_32.h +++ b/include/asm-x86/page_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_PAGE_32_H | 1 | #ifndef ASM_X86__PAGE_32_H | 
| 2 | #define _ASM_X86_PAGE_32_H | 2 | #define ASM_X86__PAGE_32_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * This handles the memory map. | 5 | * This handles the memory map. | 
| @@ -89,13 +89,11 @@ extern int nx_enabled; | |||
| 89 | extern unsigned int __VMALLOC_RESERVE; | 89 | extern unsigned int __VMALLOC_RESERVE; | 
| 90 | extern int sysctl_legacy_va_layout; | 90 | extern int sysctl_legacy_va_layout; | 
| 91 | 91 | ||
| 92 | #define VMALLOC_RESERVE ((unsigned long)__VMALLOC_RESERVE) | ||
| 93 | #define MAXMEM (-__PAGE_OFFSET - __VMALLOC_RESERVE) | ||
| 94 | |||
| 95 | extern void find_low_pfn_range(void); | 92 | extern void find_low_pfn_range(void); | 
| 96 | extern unsigned long init_memory_mapping(unsigned long start, | 93 | extern unsigned long init_memory_mapping(unsigned long start, | 
| 97 | unsigned long end); | 94 | unsigned long end); | 
| 98 | extern void initmem_init(unsigned long, unsigned long); | 95 | extern void initmem_init(unsigned long, unsigned long); | 
| 96 | extern void free_initmem(void); | ||
| 99 | extern void setup_bootmem_allocator(void); | 97 | extern void setup_bootmem_allocator(void); | 
| 100 | 98 | ||
| 101 | 99 | ||
| @@ -126,4 +124,4 @@ static inline void copy_page(void *to, void *from) | |||
| 126 | #endif /* CONFIG_X86_3DNOW */ | 124 | #endif /* CONFIG_X86_3DNOW */ | 
| 127 | #endif /* !__ASSEMBLY__ */ | 125 | #endif /* !__ASSEMBLY__ */ | 
| 128 | 126 | ||
| 129 | #endif /* _ASM_X86_PAGE_32_H */ | 127 | #endif /* ASM_X86__PAGE_32_H */ | 
| diff --git a/include/asm-x86/page_64.h b/include/asm-x86/page_64.h index c6916c83e6b1..5e64acfed0a4 100644 --- a/include/asm-x86/page_64.h +++ b/include/asm-x86/page_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _X86_64_PAGE_H | 1 | #ifndef ASM_X86__PAGE_64_H | 
| 2 | #define _X86_64_PAGE_H | 2 | #define ASM_X86__PAGE_64_H | 
| 3 | 3 | ||
| 4 | #define PAGETABLE_LEVELS 4 | 4 | #define PAGETABLE_LEVELS 4 | 
| 5 | 5 | ||
| @@ -91,6 +91,7 @@ extern unsigned long init_memory_mapping(unsigned long start, | |||
| 91 | unsigned long end); | 91 | unsigned long end); | 
| 92 | 92 | ||
| 93 | extern void initmem_init(unsigned long start_pfn, unsigned long end_pfn); | 93 | extern void initmem_init(unsigned long start_pfn, unsigned long end_pfn); | 
| 94 | extern void free_initmem(void); | ||
| 94 | 95 | ||
| 95 | extern void init_extra_mapping_uc(unsigned long phys, unsigned long size); | 96 | extern void init_extra_mapping_uc(unsigned long phys, unsigned long size); | 
| 96 | extern void init_extra_mapping_wb(unsigned long phys, unsigned long size); | 97 | extern void init_extra_mapping_wb(unsigned long phys, unsigned long size); | 
| @@ -102,4 +103,4 @@ extern void init_extra_mapping_wb(unsigned long phys, unsigned long size); | |||
| 102 | #endif | 103 | #endif | 
| 103 | 104 | ||
| 104 | 105 | ||
| 105 | #endif /* _X86_64_PAGE_H */ | 106 | #endif /* ASM_X86__PAGE_64_H */ | 
| diff --git a/include/asm-x86/param.h b/include/asm-x86/param.h index 6f0d0422f4ca..0009cfb11a5f 100644 --- a/include/asm-x86/param.h +++ b/include/asm-x86/param.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_PARAM_H | 1 | #ifndef ASM_X86__PARAM_H | 
| 2 | #define _ASM_X86_PARAM_H | 2 | #define ASM_X86__PARAM_H | 
| 3 | 3 | ||
| 4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ | 
| 5 | # define HZ CONFIG_HZ /* Internal kernel timer frequency */ | 5 | # define HZ CONFIG_HZ /* Internal kernel timer frequency */ | 
| @@ -19,4 +19,4 @@ | |||
| 19 | 19 | ||
| 20 | #define MAXHOSTNAMELEN 64 /* max length of hostname */ | 20 | #define MAXHOSTNAMELEN 64 /* max length of hostname */ | 
| 21 | 21 | ||
| 22 | #endif /* _ASM_X86_PARAM_H */ | 22 | #endif /* ASM_X86__PARAM_H */ | 
| diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h index fbbde93f12d6..891971f57d35 100644 --- a/include/asm-x86/paravirt.h +++ b/include/asm-x86/paravirt.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_PARAVIRT_H | 1 | #ifndef ASM_X86__PARAVIRT_H | 
| 2 | #define __ASM_PARAVIRT_H | 2 | #define ASM_X86__PARAVIRT_H | 
| 3 | /* Various instructions on x86 need to be replaced for | 3 | /* Various instructions on x86 need to be replaced for | 
| 4 | * para-virtualization: those hooks are defined here. */ | 4 | * para-virtualization: those hooks are defined here. */ | 
| 5 | 5 | ||
| @@ -137,6 +137,7 @@ struct pv_cpu_ops { | |||
| 137 | 137 | ||
| 138 | /* MSR, PMC and TSR operations. | 138 | /* MSR, PMC and TSR operations. | 
| 139 | err = 0/-EFAULT. wrmsr returns 0/-EFAULT. */ | 139 | err = 0/-EFAULT. wrmsr returns 0/-EFAULT. */ | 
| 140 | u64 (*read_msr_amd)(unsigned int msr, int *err); | ||
| 140 | u64 (*read_msr)(unsigned int msr, int *err); | 141 | u64 (*read_msr)(unsigned int msr, int *err); | 
| 141 | int (*write_msr)(unsigned int msr, unsigned low, unsigned high); | 142 | int (*write_msr)(unsigned int msr, unsigned low, unsigned high); | 
| 142 | 143 | ||
| @@ -257,13 +258,13 @@ struct pv_mmu_ops { | |||
| 257 | * Hooks for allocating/releasing pagetable pages when they're | 258 | * Hooks for allocating/releasing pagetable pages when they're | 
| 258 | * attached to a pagetable | 259 | * attached to a pagetable | 
| 259 | */ | 260 | */ | 
| 260 | void (*alloc_pte)(struct mm_struct *mm, u32 pfn); | 261 | void (*alloc_pte)(struct mm_struct *mm, unsigned long pfn); | 
| 261 | void (*alloc_pmd)(struct mm_struct *mm, u32 pfn); | 262 | void (*alloc_pmd)(struct mm_struct *mm, unsigned long pfn); | 
| 262 | void (*alloc_pmd_clone)(u32 pfn, u32 clonepfn, u32 start, u32 count); | 263 | void (*alloc_pmd_clone)(unsigned long pfn, unsigned long clonepfn, unsigned long start, unsigned long count); | 
| 263 | void (*alloc_pud)(struct mm_struct *mm, u32 pfn); | 264 | void (*alloc_pud)(struct mm_struct *mm, unsigned long pfn); | 
| 264 | void (*release_pte)(u32 pfn); | 265 | void (*release_pte)(unsigned long pfn); | 
| 265 | void (*release_pmd)(u32 pfn); | 266 | void (*release_pmd)(unsigned long pfn); | 
| 266 | void (*release_pud)(u32 pfn); | 267 | void (*release_pud)(unsigned long pfn); | 
| 267 | 268 | ||
| 268 | /* Pagetable manipulation functions */ | 269 | /* Pagetable manipulation functions */ | 
| 269 | void (*set_pte)(pte_t *ptep, pte_t pteval); | 270 | void (*set_pte)(pte_t *ptep, pte_t pteval); | 
| @@ -726,6 +727,10 @@ static inline u64 paravirt_read_msr(unsigned msr, int *err) | |||
| 726 | { | 727 | { | 
| 727 | return PVOP_CALL2(u64, pv_cpu_ops.read_msr, msr, err); | 728 | return PVOP_CALL2(u64, pv_cpu_ops.read_msr, msr, err); | 
| 728 | } | 729 | } | 
| 730 | static inline u64 paravirt_read_msr_amd(unsigned msr, int *err) | ||
| 731 | { | ||
| 732 | return PVOP_CALL2(u64, pv_cpu_ops.read_msr_amd, msr, err); | ||
| 733 | } | ||
| 729 | static inline int paravirt_write_msr(unsigned msr, unsigned low, unsigned high) | 734 | static inline int paravirt_write_msr(unsigned msr, unsigned low, unsigned high) | 
| 730 | { | 735 | { | 
| 731 | return PVOP_CALL3(int, pv_cpu_ops.write_msr, msr, low, high); | 736 | return PVOP_CALL3(int, pv_cpu_ops.write_msr, msr, low, high); | 
| @@ -771,6 +776,13 @@ static inline int rdmsrl_safe(unsigned msr, unsigned long long *p) | |||
| 771 | *p = paravirt_read_msr(msr, &err); | 776 | *p = paravirt_read_msr(msr, &err); | 
| 772 | return err; | 777 | return err; | 
| 773 | } | 778 | } | 
| 779 | static inline int rdmsrl_amd_safe(unsigned msr, unsigned long long *p) | ||
| 780 | { | ||
| 781 | int err; | ||
| 782 | |||
| 783 | *p = paravirt_read_msr_amd(msr, &err); | ||
| 784 | return err; | ||
| 785 | } | ||
| 774 | 786 | ||
| 775 | static inline u64 paravirt_read_tsc(void) | 787 | static inline u64 paravirt_read_tsc(void) | 
| 776 | { | 788 | { | 
| @@ -993,35 +1005,35 @@ static inline void paravirt_pgd_free(struct mm_struct *mm, pgd_t *pgd) | |||
| 993 | PVOP_VCALL2(pv_mmu_ops.pgd_free, mm, pgd); | 1005 | PVOP_VCALL2(pv_mmu_ops.pgd_free, mm, pgd); | 
| 994 | } | 1006 | } | 
| 995 | 1007 | ||
| 996 | static inline void paravirt_alloc_pte(struct mm_struct *mm, unsigned pfn) | 1008 | static inline void paravirt_alloc_pte(struct mm_struct *mm, unsigned long pfn) | 
| 997 | { | 1009 | { | 
| 998 | PVOP_VCALL2(pv_mmu_ops.alloc_pte, mm, pfn); | 1010 | PVOP_VCALL2(pv_mmu_ops.alloc_pte, mm, pfn); | 
| 999 | } | 1011 | } | 
| 1000 | static inline void paravirt_release_pte(unsigned pfn) | 1012 | static inline void paravirt_release_pte(unsigned long pfn) | 
| 1001 | { | 1013 | { | 
| 1002 | PVOP_VCALL1(pv_mmu_ops.release_pte, pfn); | 1014 | PVOP_VCALL1(pv_mmu_ops.release_pte, pfn); | 
| 1003 | } | 1015 | } | 
| 1004 | 1016 | ||
| 1005 | static inline void paravirt_alloc_pmd(struct mm_struct *mm, unsigned pfn) | 1017 | static inline void paravirt_alloc_pmd(struct mm_struct *mm, unsigned long pfn) | 
| 1006 | { | 1018 | { | 
| 1007 | PVOP_VCALL2(pv_mmu_ops.alloc_pmd, mm, pfn); | 1019 | PVOP_VCALL2(pv_mmu_ops.alloc_pmd, mm, pfn); | 
| 1008 | } | 1020 | } | 
| 1009 | 1021 | ||
| 1010 | static inline void paravirt_alloc_pmd_clone(unsigned pfn, unsigned clonepfn, | 1022 | static inline void paravirt_alloc_pmd_clone(unsigned long pfn, unsigned long clonepfn, | 
| 1011 | unsigned start, unsigned count) | 1023 | unsigned long start, unsigned long count) | 
| 1012 | { | 1024 | { | 
| 1013 | PVOP_VCALL4(pv_mmu_ops.alloc_pmd_clone, pfn, clonepfn, start, count); | 1025 | PVOP_VCALL4(pv_mmu_ops.alloc_pmd_clone, pfn, clonepfn, start, count); | 
| 1014 | } | 1026 | } | 
| 1015 | static inline void paravirt_release_pmd(unsigned pfn) | 1027 | static inline void paravirt_release_pmd(unsigned long pfn) | 
| 1016 | { | 1028 | { | 
| 1017 | PVOP_VCALL1(pv_mmu_ops.release_pmd, pfn); | 1029 | PVOP_VCALL1(pv_mmu_ops.release_pmd, pfn); | 
| 1018 | } | 1030 | } | 
| 1019 | 1031 | ||
| 1020 | static inline void paravirt_alloc_pud(struct mm_struct *mm, unsigned pfn) | 1032 | static inline void paravirt_alloc_pud(struct mm_struct *mm, unsigned long pfn) | 
| 1021 | { | 1033 | { | 
| 1022 | PVOP_VCALL2(pv_mmu_ops.alloc_pud, mm, pfn); | 1034 | PVOP_VCALL2(pv_mmu_ops.alloc_pud, mm, pfn); | 
| 1023 | } | 1035 | } | 
| 1024 | static inline void paravirt_release_pud(unsigned pfn) | 1036 | static inline void paravirt_release_pud(unsigned long pfn) | 
| 1025 | { | 1037 | { | 
| 1026 | PVOP_VCALL1(pv_mmu_ops.release_pud, pfn); | 1038 | PVOP_VCALL1(pv_mmu_ops.release_pud, pfn); | 
| 1027 | } | 1039 | } | 
| @@ -1634,4 +1646,4 @@ static inline unsigned long __raw_local_irq_save(void) | |||
| 1634 | 1646 | ||
| 1635 | #endif /* __ASSEMBLY__ */ | 1647 | #endif /* __ASSEMBLY__ */ | 
| 1636 | #endif /* CONFIG_PARAVIRT */ | 1648 | #endif /* CONFIG_PARAVIRT */ | 
| 1637 | #endif /* __ASM_PARAVIRT_H */ | 1649 | #endif /* ASM_X86__PARAVIRT_H */ | 
| diff --git a/include/asm-x86/parport.h b/include/asm-x86/parport.h index 3c4ffeb467e9..2e3dda4dc3d9 100644 --- a/include/asm-x86/parport.h +++ b/include/asm-x86/parport.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_PARPORT_H | 1 | #ifndef ASM_X86__PARPORT_H | 
| 2 | #define _ASM_X86_PARPORT_H | 2 | #define ASM_X86__PARPORT_H | 
| 3 | 3 | ||
| 4 | static int __devinit parport_pc_find_isa_ports(int autoirq, int autodma); | 4 | static int __devinit parport_pc_find_isa_ports(int autoirq, int autodma); | 
| 5 | static int __devinit parport_pc_find_nonpci_ports(int autoirq, int autodma) | 5 | static int __devinit parport_pc_find_nonpci_ports(int autoirq, int autodma) | 
| @@ -7,4 +7,4 @@ static int __devinit parport_pc_find_nonpci_ports(int autoirq, int autodma) | |||
| 7 | return parport_pc_find_isa_ports(autoirq, autodma); | 7 | return parport_pc_find_isa_ports(autoirq, autodma); | 
| 8 | } | 8 | } | 
| 9 | 9 | ||
| 10 | #endif /* _ASM_X86_PARPORT_H */ | 10 | #endif /* ASM_X86__PARPORT_H */ | 
| diff --git a/include/asm-x86/pat.h b/include/asm-x86/pat.h index 7edc47307217..482c3e3f9879 100644 --- a/include/asm-x86/pat.h +++ b/include/asm-x86/pat.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_PAT_H | 1 | #ifndef ASM_X86__PAT_H | 
| 2 | #define _ASM_PAT_H | 2 | #define ASM_X86__PAT_H | 
| 3 | 3 | ||
| 4 | #include <linux/types.h> | 4 | #include <linux/types.h> | 
| 5 | 5 | ||
| @@ -19,4 +19,4 @@ extern int free_memtype(u64 start, u64 end); | |||
| 19 | 19 | ||
| 20 | extern void pat_disable(char *reason); | 20 | extern void pat_disable(char *reason); | 
| 21 | 21 | ||
| 22 | #endif | 22 | #endif /* ASM_X86__PAT_H */ | 
| diff --git a/include/asm-x86/pci-direct.h b/include/asm-x86/pci-direct.h index 80c775d9fe20..da42be07b690 100644 --- a/include/asm-x86/pci-direct.h +++ b/include/asm-x86/pci-direct.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef ASM_PCI_DIRECT_H | 1 | #ifndef ASM_X86__PCI_DIRECT_H | 
| 2 | #define ASM_PCI_DIRECT_H 1 | 2 | #define ASM_X86__PCI_DIRECT_H | 
| 3 | 3 | ||
| 4 | #include <linux/types.h> | 4 | #include <linux/types.h> | 
| 5 | 5 | ||
| @@ -18,4 +18,4 @@ extern int early_pci_allowed(void); | |||
| 18 | extern unsigned int pci_early_dump_regs; | 18 | extern unsigned int pci_early_dump_regs; | 
| 19 | extern void early_dump_pci_device(u8 bus, u8 slot, u8 func); | 19 | extern void early_dump_pci_device(u8 bus, u8 slot, u8 func); | 
| 20 | extern void early_dump_pci_devices(void); | 20 | extern void early_dump_pci_devices(void); | 
| 21 | #endif | 21 | #endif /* ASM_X86__PCI_DIRECT_H */ | 
| diff --git a/include/asm-x86/pci.h b/include/asm-x86/pci.h index 2db14cf17db8..602583192991 100644 --- a/include/asm-x86/pci.h +++ b/include/asm-x86/pci.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __x86_PCI_H | 1 | #ifndef ASM_X86__PCI_H | 
| 2 | #define __x86_PCI_H | 2 | #define ASM_X86__PCI_H | 
| 3 | 3 | ||
| 4 | #include <linux/mm.h> /* for struct page */ | 4 | #include <linux/mm.h> /* for struct page */ | 
| 5 | #include <linux/types.h> | 5 | #include <linux/types.h> | 
| @@ -111,4 +111,4 @@ static inline cpumask_t __pcibus_to_cpumask(struct pci_bus *bus) | |||
| 111 | } | 111 | } | 
| 112 | #endif | 112 | #endif | 
| 113 | 113 | ||
| 114 | #endif | 114 | #endif /* ASM_X86__PCI_H */ | 
| diff --git a/include/asm-x86/pci_32.h b/include/asm-x86/pci_32.h index a50d46851285..3f2288207c0c 100644 --- a/include/asm-x86/pci_32.h +++ b/include/asm-x86/pci_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __i386_PCI_H | 1 | #ifndef ASM_X86__PCI_32_H | 
| 2 | #define __i386_PCI_H | 2 | #define ASM_X86__PCI_32_H | 
| 3 | 3 | ||
| 4 | 4 | ||
| 5 | #ifdef __KERNEL__ | 5 | #ifdef __KERNEL__ | 
| @@ -31,4 +31,4 @@ struct pci_dev; | |||
| 31 | #endif /* __KERNEL__ */ | 31 | #endif /* __KERNEL__ */ | 
| 32 | 32 | ||
| 33 | 33 | ||
| 34 | #endif /* __i386_PCI_H */ | 34 | #endif /* ASM_X86__PCI_32_H */ | 
| diff --git a/include/asm-x86/pci_64.h b/include/asm-x86/pci_64.h index f330234ffa5c..f72e12d5770e 100644 --- a/include/asm-x86/pci_64.h +++ b/include/asm-x86/pci_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __x8664_PCI_H | 1 | #ifndef ASM_X86__PCI_64_H | 
| 2 | #define __x8664_PCI_H | 2 | #define ASM_X86__PCI_64_H | 
| 3 | 3 | ||
| 4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ | 
| 5 | 5 | ||
| @@ -63,4 +63,4 @@ extern void pci_iommu_alloc(void); | |||
| 63 | 63 | ||
| 64 | #endif /* __KERNEL__ */ | 64 | #endif /* __KERNEL__ */ | 
| 65 | 65 | ||
| 66 | #endif /* __x8664_PCI_H */ | 66 | #endif /* ASM_X86__PCI_64_H */ | 
| diff --git a/include/asm-x86/pda.h b/include/asm-x86/pda.h index b34e9a7cc80b..80860afffbdb 100644 --- a/include/asm-x86/pda.h +++ b/include/asm-x86/pda.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef X86_64_PDA_H | 1 | #ifndef ASM_X86__PDA_H | 
| 2 | #define X86_64_PDA_H | 2 | #define ASM_X86__PDA_H | 
| 3 | 3 | ||
| 4 | #ifndef __ASSEMBLY__ | 4 | #ifndef __ASSEMBLY__ | 
| 5 | #include <linux/stddef.h> | 5 | #include <linux/stddef.h> | 
| @@ -134,4 +134,4 @@ do { \ | |||
| 134 | 134 | ||
| 135 | #define PDA_STACKOFFSET (5*8) | 135 | #define PDA_STACKOFFSET (5*8) | 
| 136 | 136 | ||
| 137 | #endif | 137 | #endif /* ASM_X86__PDA_H */ | 
| diff --git a/include/asm-x86/percpu.h b/include/asm-x86/percpu.h index f643a3a92da0..e10a1d0678cf 100644 --- a/include/asm-x86/percpu.h +++ b/include/asm-x86/percpu.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_PERCPU_H_ | 1 | #ifndef ASM_X86__PERCPU_H | 
| 2 | #define _ASM_X86_PERCPU_H_ | 2 | #define ASM_X86__PERCPU_H | 
| 3 | 3 | ||
| 4 | #ifdef CONFIG_X86_64 | 4 | #ifdef CONFIG_X86_64 | 
| 5 | #include <linux/compiler.h> | 5 | #include <linux/compiler.h> | 
| @@ -215,4 +215,4 @@ do { \ | |||
| 215 | 215 | ||
| 216 | #endif /* !CONFIG_SMP */ | 216 | #endif /* !CONFIG_SMP */ | 
| 217 | 217 | ||
| 218 | #endif /* _ASM_X86_PERCPU_H_ */ | 218 | #endif /* ASM_X86__PERCPU_H */ | 
| diff --git a/include/asm-x86/pgalloc.h b/include/asm-x86/pgalloc.h index d63ea431cb3b..3cd23adedae8 100644 --- a/include/asm-x86/pgalloc.h +++ b/include/asm-x86/pgalloc.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_PGALLOC_H | 1 | #ifndef ASM_X86__PGALLOC_H | 
| 2 | #define _ASM_X86_PGALLOC_H | 2 | #define ASM_X86__PGALLOC_H | 
| 3 | 3 | ||
| 4 | #include <linux/threads.h> | 4 | #include <linux/threads.h> | 
| 5 | #include <linux/mm.h> /* for struct page */ | 5 | #include <linux/mm.h> /* for struct page */ | 
| @@ -111,4 +111,4 @@ extern void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pud); | |||
| 111 | #endif /* PAGETABLE_LEVELS > 3 */ | 111 | #endif /* PAGETABLE_LEVELS > 3 */ | 
| 112 | #endif /* PAGETABLE_LEVELS > 2 */ | 112 | #endif /* PAGETABLE_LEVELS > 2 */ | 
| 113 | 113 | ||
| 114 | #endif /* _ASM_X86_PGALLOC_H */ | 114 | #endif /* ASM_X86__PGALLOC_H */ | 
| diff --git a/include/asm-x86/pgtable-2level-defs.h b/include/asm-x86/pgtable-2level-defs.h index 0f71c9f13da4..7ec48f4e5347 100644 --- a/include/asm-x86/pgtable-2level-defs.h +++ b/include/asm-x86/pgtable-2level-defs.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _I386_PGTABLE_2LEVEL_DEFS_H | 1 | #ifndef ASM_X86__PGTABLE_2LEVEL_DEFS_H | 
| 2 | #define _I386_PGTABLE_2LEVEL_DEFS_H | 2 | #define ASM_X86__PGTABLE_2LEVEL_DEFS_H | 
| 3 | 3 | ||
| 4 | #define SHARED_KERNEL_PMD 0 | 4 | #define SHARED_KERNEL_PMD 0 | 
| 5 | 5 | ||
| @@ -17,4 +17,4 @@ | |||
| 17 | 17 | ||
| 18 | #define PTRS_PER_PTE 1024 | 18 | #define PTRS_PER_PTE 1024 | 
| 19 | 19 | ||
| 20 | #endif /* _I386_PGTABLE_2LEVEL_DEFS_H */ | 20 | #endif /* ASM_X86__PGTABLE_2LEVEL_DEFS_H */ | 
| diff --git a/include/asm-x86/pgtable-2level.h b/include/asm-x86/pgtable-2level.h index 46bc52c0eae1..81762081dcd8 100644 --- a/include/asm-x86/pgtable-2level.h +++ b/include/asm-x86/pgtable-2level.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _I386_PGTABLE_2LEVEL_H | 1 | #ifndef ASM_X86__PGTABLE_2LEVEL_H | 
| 2 | #define _I386_PGTABLE_2LEVEL_H | 2 | #define ASM_X86__PGTABLE_2LEVEL_H | 
| 3 | 3 | ||
| 4 | #define pte_ERROR(e) \ | 4 | #define pte_ERROR(e) \ | 
| 5 | printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, (e).pte_low) | 5 | printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, (e).pte_low) | 
| @@ -53,9 +53,7 @@ static inline pte_t native_ptep_get_and_clear(pte_t *xp) | |||
| 53 | #define native_ptep_get_and_clear(xp) native_local_ptep_get_and_clear(xp) | 53 | #define native_ptep_get_and_clear(xp) native_local_ptep_get_and_clear(xp) | 
| 54 | #endif | 54 | #endif | 
| 55 | 55 | ||
| 56 | #define pte_page(x) pfn_to_page(pte_pfn(x)) | ||
| 57 | #define pte_none(x) (!(x).pte_low) | 56 | #define pte_none(x) (!(x).pte_low) | 
| 58 | #define pte_pfn(x) (pte_val(x) >> PAGE_SHIFT) | ||
| 59 | 57 | ||
| 60 | /* | 58 | /* | 
| 61 | * Bits 0, 6 and 7 are taken, split up the 29 bits of offset | 59 | * Bits 0, 6 and 7 are taken, split up the 29 bits of offset | 
| @@ -78,4 +76,4 @@ static inline pte_t native_ptep_get_and_clear(pte_t *xp) | |||
| 78 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { (pte).pte_low }) | 76 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { (pte).pte_low }) | 
| 79 | #define __swp_entry_to_pte(x) ((pte_t) { .pte = (x).val }) | 77 | #define __swp_entry_to_pte(x) ((pte_t) { .pte = (x).val }) | 
| 80 | 78 | ||
| 81 | #endif /* _I386_PGTABLE_2LEVEL_H */ | 79 | #endif /* ASM_X86__PGTABLE_2LEVEL_H */ | 
| diff --git a/include/asm-x86/pgtable-3level-defs.h b/include/asm-x86/pgtable-3level-defs.h index 448ac9516314..c05fe6ff3720 100644 --- a/include/asm-x86/pgtable-3level-defs.h +++ b/include/asm-x86/pgtable-3level-defs.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _I386_PGTABLE_3LEVEL_DEFS_H | 1 | #ifndef ASM_X86__PGTABLE_3LEVEL_DEFS_H | 
| 2 | #define _I386_PGTABLE_3LEVEL_DEFS_H | 2 | #define ASM_X86__PGTABLE_3LEVEL_DEFS_H | 
| 3 | 3 | ||
| 4 | #ifdef CONFIG_PARAVIRT | 4 | #ifdef CONFIG_PARAVIRT | 
| 5 | #define SHARED_KERNEL_PMD (pv_info.shared_kernel_pmd) | 5 | #define SHARED_KERNEL_PMD (pv_info.shared_kernel_pmd) | 
| @@ -25,4 +25,4 @@ | |||
| 25 | */ | 25 | */ | 
| 26 | #define PTRS_PER_PTE 512 | 26 | #define PTRS_PER_PTE 512 | 
| 27 | 27 | ||
| 28 | #endif /* _I386_PGTABLE_3LEVEL_DEFS_H */ | 28 | #endif /* ASM_X86__PGTABLE_3LEVEL_DEFS_H */ | 
| diff --git a/include/asm-x86/pgtable-3level.h b/include/asm-x86/pgtable-3level.h index 105057f34032..75f4276b5ddb 100644 --- a/include/asm-x86/pgtable-3level.h +++ b/include/asm-x86/pgtable-3level.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _I386_PGTABLE_3LEVEL_H | 1 | #ifndef ASM_X86__PGTABLE_3LEVEL_H | 
| 2 | #define _I386_PGTABLE_3LEVEL_H | 2 | #define ASM_X86__PGTABLE_3LEVEL_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * Intel Physical Address Extension (PAE) Mode - three-level page | 5 | * Intel Physical Address Extension (PAE) Mode - three-level page | 
| @@ -151,18 +151,11 @@ static inline int pte_same(pte_t a, pte_t b) | |||
| 151 | return a.pte_low == b.pte_low && a.pte_high == b.pte_high; | 151 | return a.pte_low == b.pte_low && a.pte_high == b.pte_high; | 
| 152 | } | 152 | } | 
| 153 | 153 | ||
| 154 | #define pte_page(x) pfn_to_page(pte_pfn(x)) | ||
| 155 | |||
| 156 | static inline int pte_none(pte_t pte) | 154 | static inline int pte_none(pte_t pte) | 
| 157 | { | 155 | { | 
| 158 | return !pte.pte_low && !pte.pte_high; | 156 | return !pte.pte_low && !pte.pte_high; | 
| 159 | } | 157 | } | 
| 160 | 158 | ||
| 161 | static inline unsigned long pte_pfn(pte_t pte) | ||
| 162 | { | ||
| 163 | return (pte_val(pte) & PTE_PFN_MASK) >> PAGE_SHIFT; | ||
| 164 | } | ||
| 165 | |||
| 166 | /* | 159 | /* | 
| 167 | * Bits 0, 6 and 7 are taken in the low part of the pte, | 160 | * Bits 0, 6 and 7 are taken in the low part of the pte, | 
| 168 | * put the 32 bits of offset into the high part. | 161 | * put the 32 bits of offset into the high part. | 
| @@ -179,4 +172,4 @@ static inline unsigned long pte_pfn(pte_t pte) | |||
| 179 | #define __pte_to_swp_entry(pte) ((swp_entry_t){ (pte).pte_high }) | 172 | #define __pte_to_swp_entry(pte) ((swp_entry_t){ (pte).pte_high }) | 
| 180 | #define __swp_entry_to_pte(x) ((pte_t){ { .pte_high = (x).val } }) | 173 | #define __swp_entry_to_pte(x) ((pte_t){ { .pte_high = (x).val } }) | 
| 181 | 174 | ||
| 182 | #endif /* _I386_PGTABLE_3LEVEL_H */ | 175 | #endif /* ASM_X86__PGTABLE_3LEVEL_H */ | 
| diff --git a/include/asm-x86/pgtable.h b/include/asm-x86/pgtable.h index 04caa2f544df..888add7b0882 100644 --- a/include/asm-x86/pgtable.h +++ b/include/asm-x86/pgtable.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_PGTABLE_H | 1 | #ifndef ASM_X86__PGTABLE_H | 
| 2 | #define _ASM_X86_PGTABLE_H | 2 | #define ASM_X86__PGTABLE_H | 
| 3 | 3 | ||
| 4 | #define FIRST_USER_ADDRESS 0 | 4 | #define FIRST_USER_ADDRESS 0 | 
| 5 | 5 | ||
| @@ -186,6 +186,13 @@ static inline int pte_special(pte_t pte) | |||
| 186 | return pte_val(pte) & _PAGE_SPECIAL; | 186 | return pte_val(pte) & _PAGE_SPECIAL; | 
| 187 | } | 187 | } | 
| 188 | 188 | ||
| 189 | static inline unsigned long pte_pfn(pte_t pte) | ||
| 190 | { | ||
| 191 | return (pte_val(pte) & PTE_PFN_MASK) >> PAGE_SHIFT; | ||
| 192 | } | ||
| 193 | |||
| 194 | #define pte_page(pte) pfn_to_page(pte_pfn(pte)) | ||
| 195 | |||
| 189 | static inline int pmd_large(pmd_t pte) | 196 | static inline int pmd_large(pmd_t pte) | 
| 190 | { | 197 | { | 
| 191 | return (pmd_val(pte) & (_PAGE_PSE | _PAGE_PRESENT)) == | 198 | return (pmd_val(pte) & (_PAGE_PSE | _PAGE_PRESENT)) == | 
| @@ -313,6 +320,8 @@ static inline void native_pagetable_setup_start(pgd_t *base) {} | |||
| 313 | static inline void native_pagetable_setup_done(pgd_t *base) {} | 320 | static inline void native_pagetable_setup_done(pgd_t *base) {} | 
| 314 | #endif | 321 | #endif | 
| 315 | 322 | ||
| 323 | extern int arch_report_meminfo(char *page); | ||
| 324 | |||
| 316 | #ifdef CONFIG_PARAVIRT | 325 | #ifdef CONFIG_PARAVIRT | 
| 317 | #include <asm/paravirt.h> | 326 | #include <asm/paravirt.h> | 
| 318 | #else /* !CONFIG_PARAVIRT */ | 327 | #else /* !CONFIG_PARAVIRT */ | 
| @@ -521,4 +530,4 @@ static inline void clone_pgd_range(pgd_t *dst, pgd_t *src, int count) | |||
| 521 | #include <asm-generic/pgtable.h> | 530 | #include <asm-generic/pgtable.h> | 
| 522 | #endif /* __ASSEMBLY__ */ | 531 | #endif /* __ASSEMBLY__ */ | 
| 523 | 532 | ||
| 524 | #endif /* _ASM_X86_PGTABLE_H */ | 533 | #endif /* ASM_X86__PGTABLE_H */ | 
| diff --git a/include/asm-x86/pgtable_32.h b/include/asm-x86/pgtable_32.h index 5c3b26567a95..8de702dc7d62 100644 --- a/include/asm-x86/pgtable_32.h +++ b/include/asm-x86/pgtable_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _I386_PGTABLE_H | 1 | #ifndef ASM_X86__PGTABLE_32_H | 
| 2 | #define _I386_PGTABLE_H | 2 | #define ASM_X86__PGTABLE_32_H | 
| 3 | 3 | ||
| 4 | 4 | ||
| 5 | /* | 5 | /* | 
| @@ -31,6 +31,7 @@ static inline void pgtable_cache_init(void) { } | |||
| 31 | static inline void check_pgt_cache(void) { } | 31 | static inline void check_pgt_cache(void) { } | 
| 32 | void paging_init(void); | 32 | void paging_init(void); | 
| 33 | 33 | ||
| 34 | extern void set_pmd_pfn(unsigned long, unsigned long, pgprot_t); | ||
| 34 | 35 | ||
| 35 | /* | 36 | /* | 
| 36 | * The Linux x86 paging architecture is 'compile-time dual-mode', it | 37 | * The Linux x86 paging architecture is 'compile-time dual-mode', it | 
| @@ -56,8 +57,7 @@ void paging_init(void); | |||
| 56 | * area for the same reason. ;) | 57 | * area for the same reason. ;) | 
| 57 | */ | 58 | */ | 
| 58 | #define VMALLOC_OFFSET (8 * 1024 * 1024) | 59 | #define VMALLOC_OFFSET (8 * 1024 * 1024) | 
| 59 | #define VMALLOC_START (((unsigned long)high_memory + 2 * VMALLOC_OFFSET - 1) \ | 60 | #define VMALLOC_START ((unsigned long)high_memory + VMALLOC_OFFSET) | 
| 60 | & ~(VMALLOC_OFFSET - 1)) | ||
| 61 | #ifdef CONFIG_X86_PAE | 61 | #ifdef CONFIG_X86_PAE | 
| 62 | #define LAST_PKMAP 512 | 62 | #define LAST_PKMAP 512 | 
| 63 | #else | 63 | #else | 
| @@ -73,6 +73,8 @@ void paging_init(void); | |||
| 73 | # define VMALLOC_END (FIXADDR_START - 2 * PAGE_SIZE) | 73 | # define VMALLOC_END (FIXADDR_START - 2 * PAGE_SIZE) | 
| 74 | #endif | 74 | #endif | 
| 75 | 75 | ||
| 76 | #define MAXMEM (VMALLOC_END - PAGE_OFFSET - __VMALLOC_RESERVE) | ||
| 77 | |||
| 76 | /* | 78 | /* | 
| 77 | * Define this if things work differently on an i386 and an i486: | 79 | * Define this if things work differently on an i386 and an i486: | 
| 78 | * it will (on an i486) warn about kernel memory accesses that are | 80 | * it will (on an i486) warn about kernel memory accesses that are | 
| @@ -186,4 +188,4 @@ do { \ | |||
| 186 | #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ | 188 | #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ | 
| 187 | remap_pfn_range(vma, vaddr, pfn, size, prot) | 189 | remap_pfn_range(vma, vaddr, pfn, size, prot) | 
| 188 | 190 | ||
| 189 | #endif /* _I386_PGTABLE_H */ | 191 | #endif /* ASM_X86__PGTABLE_32_H */ | 
| diff --git a/include/asm-x86/pgtable_64.h b/include/asm-x86/pgtable_64.h index 549144d03d99..fde9770e53d1 100644 --- a/include/asm-x86/pgtable_64.h +++ b/include/asm-x86/pgtable_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _X86_64_PGTABLE_H | 1 | #ifndef ASM_X86__PGTABLE_64_H | 
| 2 | #define _X86_64_PGTABLE_H | 2 | #define ASM_X86__PGTABLE_64_H | 
| 3 | 3 | ||
| 4 | #include <linux/const.h> | 4 | #include <linux/const.h> | 
| 5 | #ifndef __ASSEMBLY__ | 5 | #ifndef __ASSEMBLY__ | 
| @@ -175,8 +175,6 @@ static inline int pmd_bad(pmd_t pmd) | |||
| 175 | #define pte_present(x) (pte_val((x)) & (_PAGE_PRESENT | _PAGE_PROTNONE)) | 175 | #define pte_present(x) (pte_val((x)) & (_PAGE_PRESENT | _PAGE_PROTNONE)) | 
| 176 | 176 | ||
| 177 | #define pages_to_mb(x) ((x) >> (20 - PAGE_SHIFT)) /* FIXME: is this right? */ | 177 | #define pages_to_mb(x) ((x) >> (20 - PAGE_SHIFT)) /* FIXME: is this right? */ | 
| 178 | #define pte_page(x) pfn_to_page(pte_pfn((x))) | ||
| 179 | #define pte_pfn(x) ((pte_val((x)) & __PHYSICAL_MASK) >> PAGE_SHIFT) | ||
| 180 | 178 | ||
| 181 | /* | 179 | /* | 
| 182 | * Macro to mark a page protection value as "uncacheable". | 180 | * Macro to mark a page protection value as "uncacheable". | 
| @@ -284,4 +282,4 @@ extern void cleanup_highmap(void); | |||
| 284 | #define __HAVE_ARCH_PTE_SAME | 282 | #define __HAVE_ARCH_PTE_SAME | 
| 285 | #endif /* !__ASSEMBLY__ */ | 283 | #endif /* !__ASSEMBLY__ */ | 
| 286 | 284 | ||
| 287 | #endif /* _X86_64_PGTABLE_H */ | 285 | #endif /* ASM_X86__PGTABLE_64_H */ | 
| diff --git a/include/asm-x86/posix_types_32.h b/include/asm-x86/posix_types_32.h index b031efda37ec..70cf2bb05939 100644 --- a/include/asm-x86/posix_types_32.h +++ b/include/asm-x86/posix_types_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ARCH_I386_POSIX_TYPES_H | 1 | #ifndef ASM_X86__POSIX_TYPES_32_H | 
| 2 | #define __ARCH_I386_POSIX_TYPES_H | 2 | #define ASM_X86__POSIX_TYPES_32_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * This file is generally used by user-level software, so you need to | 5 | * This file is generally used by user-level software, so you need to | 
| @@ -82,4 +82,4 @@ do { \ | |||
| 82 | 82 | ||
| 83 | #endif /* defined(__KERNEL__) */ | 83 | #endif /* defined(__KERNEL__) */ | 
| 84 | 84 | ||
| 85 | #endif | 85 | #endif /* ASM_X86__POSIX_TYPES_32_H */ | 
| diff --git a/include/asm-x86/posix_types_64.h b/include/asm-x86/posix_types_64.h index d6624c95854a..388b4e7f4a44 100644 --- a/include/asm-x86/posix_types_64.h +++ b/include/asm-x86/posix_types_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_64_POSIX_TYPES_H | 1 | #ifndef ASM_X86__POSIX_TYPES_64_H | 
| 2 | #define _ASM_X86_64_POSIX_TYPES_H | 2 | #define ASM_X86__POSIX_TYPES_64_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * This file is generally used by user-level software, so you need to | 5 | * This file is generally used by user-level software, so you need to | 
| @@ -116,4 +116,4 @@ static inline void __FD_ZERO(__kernel_fd_set *p) | |||
| 116 | 116 | ||
| 117 | #endif /* defined(__KERNEL__) */ | 117 | #endif /* defined(__KERNEL__) */ | 
| 118 | 118 | ||
| 119 | #endif | 119 | #endif /* ASM_X86__POSIX_TYPES_64_H */ | 
| diff --git a/include/asm-x86/prctl.h b/include/asm-x86/prctl.h index 52952adef1ca..e7ae34eb4103 100644 --- a/include/asm-x86/prctl.h +++ b/include/asm-x86/prctl.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef X86_64_PRCTL_H | 1 | #ifndef ASM_X86__PRCTL_H | 
| 2 | #define X86_64_PRCTL_H 1 | 2 | #define ASM_X86__PRCTL_H | 
| 3 | 3 | ||
| 4 | #define ARCH_SET_GS 0x1001 | 4 | #define ARCH_SET_GS 0x1001 | 
| 5 | #define ARCH_SET_FS 0x1002 | 5 | #define ARCH_SET_FS 0x1002 | 
| @@ -7,4 +7,4 @@ | |||
| 7 | #define ARCH_GET_GS 0x1004 | 7 | #define ARCH_GET_GS 0x1004 | 
| 8 | 8 | ||
| 9 | 9 | ||
| 10 | #endif | 10 | #endif /* ASM_X86__PRCTL_H */ | 
| diff --git a/include/asm-x86/processor-flags.h b/include/asm-x86/processor-flags.h index eff2ecd7fff0..5dd79774f693 100644 --- a/include/asm-x86/processor-flags.h +++ b/include/asm-x86/processor-flags.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_I386_PROCESSOR_FLAGS_H | 1 | #ifndef ASM_X86__PROCESSOR_FLAGS_H | 
| 2 | #define __ASM_I386_PROCESSOR_FLAGS_H | 2 | #define ASM_X86__PROCESSOR_FLAGS_H | 
| 3 | /* Various flags defined: can be included from assembler. */ | 3 | /* Various flags defined: can be included from assembler. */ | 
| 4 | 4 | ||
| 5 | /* | 5 | /* | 
| @@ -96,4 +96,4 @@ | |||
| 96 | #endif | 96 | #endif | 
| 97 | #endif | 97 | #endif | 
| 98 | 98 | ||
| 99 | #endif /* __ASM_I386_PROCESSOR_FLAGS_H */ | 99 | #endif /* ASM_X86__PROCESSOR_FLAGS_H */ | 
| diff --git a/include/asm-x86/processor.h b/include/asm-x86/processor.h index 4df3e2f6fb56..5eaf9bf0a623 100644 --- a/include/asm-x86/processor.h +++ b/include/asm-x86/processor.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_X86_PROCESSOR_H | 1 | #ifndef ASM_X86__PROCESSOR_H | 
| 2 | #define __ASM_X86_PROCESSOR_H | 2 | #define ASM_X86__PROCESSOR_H | 
| 3 | 3 | ||
| 4 | #include <asm/processor-flags.h> | 4 | #include <asm/processor-flags.h> | 
| 5 | 5 | ||
| @@ -20,6 +20,7 @@ struct mm_struct; | |||
| 20 | #include <asm/msr.h> | 20 | #include <asm/msr.h> | 
| 21 | #include <asm/desc_defs.h> | 21 | #include <asm/desc_defs.h> | 
| 22 | #include <asm/nops.h> | 22 | #include <asm/nops.h> | 
| 23 | #include <asm/ds.h> | ||
| 23 | 24 | ||
| 24 | #include <linux/personality.h> | 25 | #include <linux/personality.h> | 
| 25 | #include <linux/cpumask.h> | 26 | #include <linux/cpumask.h> | 
| @@ -140,6 +141,8 @@ DECLARE_PER_CPU(struct cpuinfo_x86, cpu_info); | |||
| 140 | #define current_cpu_data boot_cpu_data | 141 | #define current_cpu_data boot_cpu_data | 
| 141 | #endif | 142 | #endif | 
| 142 | 143 | ||
| 144 | extern const struct seq_operations cpuinfo_op; | ||
| 145 | |||
| 143 | static inline int hlt_works(int cpu) | 146 | static inline int hlt_works(int cpu) | 
| 144 | { | 147 | { | 
| 145 | #ifdef CONFIG_X86_32 | 148 | #ifdef CONFIG_X86_32 | 
| @@ -153,6 +156,8 @@ static inline int hlt_works(int cpu) | |||
| 153 | 156 | ||
| 154 | extern void cpu_detect(struct cpuinfo_x86 *c); | 157 | extern void cpu_detect(struct cpuinfo_x86 *c); | 
| 155 | 158 | ||
| 159 | extern struct pt_regs *idle_regs(struct pt_regs *); | ||
| 160 | |||
| 156 | extern void early_cpu_init(void); | 161 | extern void early_cpu_init(void); | 
| 157 | extern void identify_boot_cpu(void); | 162 | extern void identify_boot_cpu(void); | 
| 158 | extern void identify_secondary_cpu(struct cpuinfo_x86 *); | 163 | extern void identify_secondary_cpu(struct cpuinfo_x86 *); | 
| @@ -411,9 +416,14 @@ struct thread_struct { | |||
| 411 | unsigned io_bitmap_max; | 416 | unsigned io_bitmap_max; | 
| 412 | /* MSR_IA32_DEBUGCTLMSR value to switch in if TIF_DEBUGCTLMSR is set. */ | 417 | /* MSR_IA32_DEBUGCTLMSR value to switch in if TIF_DEBUGCTLMSR is set. */ | 
| 413 | unsigned long debugctlmsr; | 418 | unsigned long debugctlmsr; | 
| 414 | /* Debug Store - if not 0 points to a DS Save Area configuration; | 419 | #ifdef CONFIG_X86_DS | 
| 415 | * goes into MSR_IA32_DS_AREA */ | 420 | /* Debug Store context; see include/asm-x86/ds.h; goes into MSR_IA32_DS_AREA */ | 
| 416 | unsigned long ds_area_msr; | 421 | struct ds_context *ds_ctx; | 
| 422 | #endif /* CONFIG_X86_DS */ | ||
| 423 | #ifdef CONFIG_X86_PTRACE_BTS | ||
| 424 | /* the signal to send on a bts buffer overflow */ | ||
| 425 | unsigned int bts_ovfl_signal; | ||
| 426 | #endif /* CONFIG_X86_PTRACE_BTS */ | ||
| 417 | }; | 427 | }; | 
| 418 | 428 | ||
| 419 | static inline unsigned long native_get_debugreg(int regno) | 429 | static inline unsigned long native_get_debugreg(int regno) | 
| @@ -943,4 +953,4 @@ extern void start_thread(struct pt_regs *regs, unsigned long new_ip, | |||
| 943 | extern int get_tsc_mode(unsigned long adr); | 953 | extern int get_tsc_mode(unsigned long adr); | 
| 944 | extern int set_tsc_mode(unsigned int val); | 954 | extern int set_tsc_mode(unsigned int val); | 
| 945 | 955 | ||
| 946 | #endif | 956 | #endif /* ASM_X86__PROCESSOR_H */ | 
| diff --git a/include/asm-x86/proto.h b/include/asm-x86/proto.h index 3dd458c385c0..6e89e8b4de0e 100644 --- a/include/asm-x86/proto.h +++ b/include/asm-x86/proto.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X8664_PROTO_H | 1 | #ifndef ASM_X86__PROTO_H | 
| 2 | #define _ASM_X8664_PROTO_H 1 | 2 | #define ASM_X86__PROTO_H | 
| 3 | 3 | ||
| 4 | #include <asm/ldt.h> | 4 | #include <asm/ldt.h> | 
| 5 | 5 | ||
| @@ -29,4 +29,4 @@ long do_arch_prctl(struct task_struct *task, int code, unsigned long addr); | |||
| 29 | #define round_up(x, y) (((x) + (y) - 1) & ~((y) - 1)) | 29 | #define round_up(x, y) (((x) + (y) - 1) & ~((y) - 1)) | 
| 30 | #define round_down(x, y) ((x) & ~((y) - 1)) | 30 | #define round_down(x, y) ((x) & ~((y) - 1)) | 
| 31 | 31 | ||
| 32 | #endif | 32 | #endif /* ASM_X86__PROTO_H */ | 
| diff --git a/include/asm-x86/ptrace-abi.h b/include/asm-x86/ptrace-abi.h index 72e7b9db29bb..4298b8882a78 100644 --- a/include/asm-x86/ptrace-abi.h +++ b/include/asm-x86/ptrace-abi.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_PTRACE_ABI_H | 1 | #ifndef ASM_X86__PTRACE_ABI_H | 
| 2 | #define _ASM_X86_PTRACE_ABI_H | 2 | #define ASM_X86__PTRACE_ABI_H | 
| 3 | 3 | ||
| 4 | #ifdef __i386__ | 4 | #ifdef __i386__ | 
| 5 | 5 | ||
| @@ -80,8 +80,9 @@ | |||
| 80 | 80 | ||
| 81 | #define PTRACE_SINGLEBLOCK 33 /* resume execution until next branch */ | 81 | #define PTRACE_SINGLEBLOCK 33 /* resume execution until next branch */ | 
| 82 | 82 | ||
| 83 | #ifndef __ASSEMBLY__ | 83 | #ifdef CONFIG_X86_PTRACE_BTS | 
| 84 | 84 | ||
| 85 | #ifndef __ASSEMBLY__ | ||
| 85 | #include <asm/types.h> | 86 | #include <asm/types.h> | 
| 86 | 87 | ||
| 87 | /* configuration/status structure used in PTRACE_BTS_CONFIG and | 88 | /* configuration/status structure used in PTRACE_BTS_CONFIG and | 
| @@ -97,20 +98,20 @@ struct ptrace_bts_config { | |||
| 97 | /* actual size of bts_struct in bytes */ | 98 | /* actual size of bts_struct in bytes */ | 
| 98 | __u32 bts_size; | 99 | __u32 bts_size; | 
| 99 | }; | 100 | }; | 
| 100 | #endif | 101 | #endif /* __ASSEMBLY__ */ | 
| 101 | 102 | ||
| 102 | #define PTRACE_BTS_O_TRACE 0x1 /* branch trace */ | 103 | #define PTRACE_BTS_O_TRACE 0x1 /* branch trace */ | 
| 103 | #define PTRACE_BTS_O_SCHED 0x2 /* scheduling events w/ jiffies */ | 104 | #define PTRACE_BTS_O_SCHED 0x2 /* scheduling events w/ jiffies */ | 
| 104 | #define PTRACE_BTS_O_SIGNAL 0x4 /* send SIG<signal> on buffer overflow | 105 | #define PTRACE_BTS_O_SIGNAL 0x4 /* send SIG<signal> on buffer overflow | 
| 105 | instead of wrapping around */ | 106 | instead of wrapping around */ | 
| 106 | #define PTRACE_BTS_O_CUT_SIZE 0x8 /* cut requested size to max available | 107 | #define PTRACE_BTS_O_ALLOC 0x8 /* (re)allocate buffer */ | 
| 107 | instead of failing */ | ||
| 108 | 108 | ||
| 109 | #define PTRACE_BTS_CONFIG 40 | 109 | #define PTRACE_BTS_CONFIG 40 | 
| 110 | /* Configure branch trace recording. | 110 | /* Configure branch trace recording. | 
| 111 | ADDR points to a struct ptrace_bts_config. | 111 | ADDR points to a struct ptrace_bts_config. | 
| 112 | DATA gives the size of that buffer. | 112 | DATA gives the size of that buffer. | 
| 113 | A new buffer is allocated, iff the size changes. | 113 | A new buffer is allocated, if requested in the flags. | 
| 114 | An overflow signal may only be requested for new buffers. | ||
| 114 | Returns the number of bytes read. | 115 | Returns the number of bytes read. | 
| 115 | */ | 116 | */ | 
| 116 | #define PTRACE_BTS_STATUS 41 | 117 | #define PTRACE_BTS_STATUS 41 | 
| @@ -119,7 +120,7 @@ struct ptrace_bts_config { | |||
| 119 | Returns the number of bytes written. | 120 | Returns the number of bytes written. | 
| 120 | */ | 121 | */ | 
| 121 | #define PTRACE_BTS_SIZE 42 | 122 | #define PTRACE_BTS_SIZE 42 | 
| 122 | /* Return the number of available BTS records. | 123 | /* Return the number of available BTS records for draining. | 
| 123 | DATA and ADDR are ignored. | 124 | DATA and ADDR are ignored. | 
| 124 | */ | 125 | */ | 
| 125 | #define PTRACE_BTS_GET 43 | 126 | #define PTRACE_BTS_GET 43 | 
| @@ -139,5 +140,6 @@ struct ptrace_bts_config { | |||
| 139 | BTS records are read from oldest to newest. | 140 | BTS records are read from oldest to newest. | 
| 140 | Returns number of BTS records drained. | 141 | Returns number of BTS records drained. | 
| 141 | */ | 142 | */ | 
| 143 | #endif /* CONFIG_X86_PTRACE_BTS */ | ||
| 142 | 144 | ||
| 143 | #endif | 145 | #endif /* ASM_X86__PTRACE_ABI_H */ | 
| diff --git a/include/asm-x86/ptrace.h b/include/asm-x86/ptrace.h index 8a71db803da6..d64a61097165 100644 --- a/include/asm-x86/ptrace.h +++ b/include/asm-x86/ptrace.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_PTRACE_H | 1 | #ifndef ASM_X86__PTRACE_H | 
| 2 | #define _ASM_X86_PTRACE_H | 2 | #define ASM_X86__PTRACE_H | 
| 3 | 3 | ||
| 4 | #include <linux/compiler.h> /* For __user */ | 4 | #include <linux/compiler.h> /* For __user */ | 
| 5 | #include <asm/ptrace-abi.h> | 5 | #include <asm/ptrace-abi.h> | 
| @@ -127,14 +127,48 @@ struct pt_regs { | |||
| 127 | #endif /* __KERNEL__ */ | 127 | #endif /* __KERNEL__ */ | 
| 128 | #endif /* !__i386__ */ | 128 | #endif /* !__i386__ */ | 
| 129 | 129 | ||
| 130 | |||
| 131 | #ifdef CONFIG_X86_PTRACE_BTS | ||
| 132 | /* a branch trace record entry | ||
| 133 | * | ||
| 134 | * In order to unify the interface between various processor versions, | ||
| 135 | * we use the below data structure for all processors. | ||
| 136 | */ | ||
| 137 | enum bts_qualifier { | ||
| 138 | BTS_INVALID = 0, | ||
| 139 | BTS_BRANCH, | ||
| 140 | BTS_TASK_ARRIVES, | ||
| 141 | BTS_TASK_DEPARTS | ||
| 142 | }; | ||
| 143 | |||
| 144 | struct bts_struct { | ||
| 145 | __u64 qualifier; | ||
| 146 | union { | ||
| 147 | /* BTS_BRANCH */ | ||
| 148 | struct { | ||
| 149 | __u64 from_ip; | ||
| 150 | __u64 to_ip; | ||
| 151 | } lbr; | ||
| 152 | /* BTS_TASK_ARRIVES or | ||
| 153 | BTS_TASK_DEPARTS */ | ||
| 154 | __u64 jiffies; | ||
| 155 | } variant; | ||
| 156 | }; | ||
| 157 | #endif /* CONFIG_X86_PTRACE_BTS */ | ||
| 158 | |||
| 130 | #ifdef __KERNEL__ | 159 | #ifdef __KERNEL__ | 
| 131 | 160 | ||
| 132 | /* the DS BTS struct is used for ptrace as well */ | 161 | #include <linux/init.h> | 
| 133 | #include <asm/ds.h> | ||
| 134 | 162 | ||
| 163 | struct cpuinfo_x86; | ||
| 135 | struct task_struct; | 164 | struct task_struct; | 
| 136 | 165 | ||
| 166 | #ifdef CONFIG_X86_PTRACE_BTS | ||
| 167 | extern void __cpuinit ptrace_bts_init_intel(struct cpuinfo_x86 *); | ||
| 137 | extern void ptrace_bts_take_timestamp(struct task_struct *, enum bts_qualifier); | 168 | extern void ptrace_bts_take_timestamp(struct task_struct *, enum bts_qualifier); | 
| 169 | #else | ||
| 170 | #define ptrace_bts_init_intel(config) do {} while (0) | ||
| 171 | #endif /* CONFIG_X86_PTRACE_BTS */ | ||
| 138 | 172 | ||
| 139 | extern unsigned long profile_pc(struct pt_regs *regs); | 173 | extern unsigned long profile_pc(struct pt_regs *regs); | 
| 140 | 174 | ||
| @@ -148,6 +182,9 @@ extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, | |||
| 148 | void signal_fault(struct pt_regs *regs, void __user *frame, char *where); | 182 | void signal_fault(struct pt_regs *regs, void __user *frame, char *where); | 
| 149 | #endif | 183 | #endif | 
| 150 | 184 | ||
| 185 | extern long syscall_trace_enter(struct pt_regs *); | ||
| 186 | extern void syscall_trace_leave(struct pt_regs *); | ||
| 187 | |||
| 151 | static inline unsigned long regs_return_value(struct pt_regs *regs) | 188 | static inline unsigned long regs_return_value(struct pt_regs *regs) | 
| 152 | { | 189 | { | 
| 153 | return regs->ax; | 190 | return regs->ax; | 
| @@ -213,6 +250,11 @@ static inline unsigned long frame_pointer(struct pt_regs *regs) | |||
| 213 | return regs->bp; | 250 | return regs->bp; | 
| 214 | } | 251 | } | 
| 215 | 252 | ||
| 253 | static inline unsigned long user_stack_pointer(struct pt_regs *regs) | ||
| 254 | { | ||
| 255 | return regs->sp; | ||
| 256 | } | ||
| 257 | |||
| 216 | /* | 258 | /* | 
| 217 | * These are defined as per linux/ptrace.h, which see. | 259 | * These are defined as per linux/ptrace.h, which see. | 
| 218 | */ | 260 | */ | 
| @@ -239,4 +281,4 @@ extern int do_set_thread_area(struct task_struct *p, int idx, | |||
| 239 | 281 | ||
| 240 | #endif /* !__ASSEMBLY__ */ | 282 | #endif /* !__ASSEMBLY__ */ | 
| 241 | 283 | ||
| 242 | #endif | 284 | #endif /* ASM_X86__PTRACE_H */ | 
| diff --git a/include/asm-x86/pvclock-abi.h b/include/asm-x86/pvclock-abi.h index 6857f840b243..edb3b4ecfc81 100644 --- a/include/asm-x86/pvclock-abi.h +++ b/include/asm-x86/pvclock-abi.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_PVCLOCK_ABI_H_ | 1 | #ifndef ASM_X86__PVCLOCK_ABI_H | 
| 2 | #define _ASM_X86_PVCLOCK_ABI_H_ | 2 | #define ASM_X86__PVCLOCK_ABI_H | 
| 3 | #ifndef __ASSEMBLY__ | 3 | #ifndef __ASSEMBLY__ | 
| 4 | 4 | ||
| 5 | /* | 5 | /* | 
| @@ -39,4 +39,4 @@ struct pvclock_wall_clock { | |||
| 39 | } __attribute__((__packed__)); | 39 | } __attribute__((__packed__)); | 
| 40 | 40 | ||
| 41 | #endif /* __ASSEMBLY__ */ | 41 | #endif /* __ASSEMBLY__ */ | 
| 42 | #endif /* _ASM_X86_PVCLOCK_ABI_H_ */ | 42 | #endif /* ASM_X86__PVCLOCK_ABI_H */ | 
| diff --git a/include/asm-x86/pvclock.h b/include/asm-x86/pvclock.h index 85b1bba8e0a3..1a38f6834800 100644 --- a/include/asm-x86/pvclock.h +++ b/include/asm-x86/pvclock.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_PVCLOCK_H_ | 1 | #ifndef ASM_X86__PVCLOCK_H | 
| 2 | #define _ASM_X86_PVCLOCK_H_ | 2 | #define ASM_X86__PVCLOCK_H | 
| 3 | 3 | ||
| 4 | #include <linux/clocksource.h> | 4 | #include <linux/clocksource.h> | 
| 5 | #include <asm/pvclock-abi.h> | 5 | #include <asm/pvclock-abi.h> | 
| @@ -10,4 +10,4 @@ void pvclock_read_wallclock(struct pvclock_wall_clock *wall, | |||
| 10 | struct pvclock_vcpu_time_info *vcpu, | 10 | struct pvclock_vcpu_time_info *vcpu, | 
| 11 | struct timespec *ts); | 11 | struct timespec *ts); | 
| 12 | 12 | ||
| 13 | #endif /* _ASM_X86_PVCLOCK_H_ */ | 13 | #endif /* ASM_X86__PVCLOCK_H */ | 
| diff --git a/include/asm-x86/reboot.h b/include/asm-x86/reboot.h index 206f355786dc..1c2f0ce9e31e 100644 --- a/include/asm-x86/reboot.h +++ b/include/asm-x86/reboot.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_REBOOT_H | 1 | #ifndef ASM_X86__REBOOT_H | 
| 2 | #define _ASM_REBOOT_H | 2 | #define ASM_X86__REBOOT_H | 
| 3 | 3 | ||
| 4 | struct pt_regs; | 4 | struct pt_regs; | 
| 5 | 5 | ||
| @@ -18,4 +18,4 @@ void native_machine_crash_shutdown(struct pt_regs *regs); | |||
| 18 | void native_machine_shutdown(void); | 18 | void native_machine_shutdown(void); | 
| 19 | void machine_real_restart(const unsigned char *code, int length); | 19 | void machine_real_restart(const unsigned char *code, int length); | 
| 20 | 20 | ||
| 21 | #endif /* _ASM_REBOOT_H */ | 21 | #endif /* ASM_X86__REBOOT_H */ | 
| diff --git a/include/asm-x86/reboot_fixups.h b/include/asm-x86/reboot_fixups.h index 0cb7d87c2b68..2c2987d97570 100644 --- a/include/asm-x86/reboot_fixups.h +++ b/include/asm-x86/reboot_fixups.h | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | #ifndef _LINUX_REBOOT_FIXUPS_H | 1 | #ifndef ASM_X86__REBOOT_FIXUPS_H | 
| 2 | #define _LINUX_REBOOT_FIXUPS_H | 2 | #define ASM_X86__REBOOT_FIXUPS_H | 
| 3 | 3 | ||
| 4 | extern void mach_reboot_fixups(void); | 4 | extern void mach_reboot_fixups(void); | 
| 5 | 5 | ||
| 6 | #endif /* _LINUX_REBOOT_FIXUPS_H */ | 6 | #endif /* ASM_X86__REBOOT_FIXUPS_H */ | 
| diff --git a/include/asm-x86/required-features.h b/include/asm-x86/required-features.h index 5c2ff4bc2980..a01c4e376331 100644 --- a/include/asm-x86/required-features.h +++ b/include/asm-x86/required-features.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_REQUIRED_FEATURES_H | 1 | #ifndef ASM_X86__REQUIRED_FEATURES_H | 
| 2 | #define _ASM_REQUIRED_FEATURES_H 1 | 2 | #define ASM_X86__REQUIRED_FEATURES_H | 
| 3 | 3 | ||
| 4 | /* Define minimum CPUID feature set for kernel These bits are checked | 4 | /* Define minimum CPUID feature set for kernel These bits are checked | 
| 5 | really early to actually display a visible error message before the | 5 | really early to actually display a visible error message before the | 
| @@ -79,4 +79,4 @@ | |||
| 79 | #define REQUIRED_MASK6 0 | 79 | #define REQUIRED_MASK6 0 | 
| 80 | #define REQUIRED_MASK7 0 | 80 | #define REQUIRED_MASK7 0 | 
| 81 | 81 | ||
| 82 | #endif | 82 | #endif /* ASM_X86__REQUIRED_FEATURES_H */ | 
| diff --git a/include/asm-x86/resume-trace.h b/include/asm-x86/resume-trace.h index 8d9f0b41ee86..e39376d7de50 100644 --- a/include/asm-x86/resume-trace.h +++ b/include/asm-x86/resume-trace.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_RESUME_TRACE_H | 1 | #ifndef ASM_X86__RESUME_TRACE_H | 
| 2 | #define _ASM_X86_RESUME_TRACE_H | 2 | #define ASM_X86__RESUME_TRACE_H | 
| 3 | 3 | ||
| 4 | #include <asm/asm.h> | 4 | #include <asm/asm.h> | 
| 5 | 5 | ||
| @@ -7,7 +7,7 @@ | |||
| 7 | do { \ | 7 | do { \ | 
| 8 | if (pm_trace_enabled) { \ | 8 | if (pm_trace_enabled) { \ | 
| 9 | const void *tracedata; \ | 9 | const void *tracedata; \ | 
| 10 | asm volatile(_ASM_MOV_UL " $1f,%0\n" \ | 10 | asm volatile(_ASM_MOV " $1f,%0\n" \ | 
| 11 | ".section .tracedata,\"a\"\n" \ | 11 | ".section .tracedata,\"a\"\n" \ | 
| 12 | "1:\t.word %c1\n\t" \ | 12 | "1:\t.word %c1\n\t" \ | 
| 13 | _ASM_PTR " %c2\n" \ | 13 | _ASM_PTR " %c2\n" \ | 
| @@ -18,4 +18,4 @@ do { \ | |||
| 18 | } \ | 18 | } \ | 
| 19 | } while (0) | 19 | } while (0) | 
| 20 | 20 | ||
| 21 | #endif | 21 | #endif /* ASM_X86__RESUME_TRACE_H */ | 
| diff --git a/include/asm-x86/rio.h b/include/asm-x86/rio.h index c9448bd8968f..5e1256bdee83 100644 --- a/include/asm-x86/rio.h +++ b/include/asm-x86/rio.h | |||
| @@ -5,8 +5,8 @@ | |||
| 5 | * Author: Laurent Vivier <Laurent.Vivier@bull.net> | 5 | * Author: Laurent Vivier <Laurent.Vivier@bull.net> | 
| 6 | */ | 6 | */ | 
| 7 | 7 | ||
| 8 | #ifndef __ASM_RIO_H | 8 | #ifndef ASM_X86__RIO_H | 
| 9 | #define __ASM_RIO_H | 9 | #define ASM_X86__RIO_H | 
| 10 | 10 | ||
| 11 | #define RIO_TABLE_VERSION 3 | 11 | #define RIO_TABLE_VERSION 3 | 
| 12 | 12 | ||
| @@ -60,4 +60,4 @@ enum { | |||
| 60 | ALT_CALGARY = 5, /* Second Planar Calgary */ | 60 | ALT_CALGARY = 5, /* Second Planar Calgary */ | 
| 61 | }; | 61 | }; | 
| 62 | 62 | ||
| 63 | #endif /* __ASM_RIO_H */ | 63 | #endif /* ASM_X86__RIO_H */ | 
| diff --git a/include/asm-x86/rwlock.h b/include/asm-x86/rwlock.h index 6a8c0d645108..48a3109e1a7d 100644 --- a/include/asm-x86/rwlock.h +++ b/include/asm-x86/rwlock.h | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | #ifndef _ASM_X86_RWLOCK_H | 1 | #ifndef ASM_X86__RWLOCK_H | 
| 2 | #define _ASM_X86_RWLOCK_H | 2 | #define ASM_X86__RWLOCK_H | 
| 3 | 3 | ||
| 4 | #define RW_LOCK_BIAS 0x01000000 | 4 | #define RW_LOCK_BIAS 0x01000000 | 
| 5 | 5 | ||
| 6 | /* Actual code is in asm/spinlock.h or in arch/x86/lib/rwlock.S */ | 6 | /* Actual code is in asm/spinlock.h or in arch/x86/lib/rwlock.S */ | 
| 7 | 7 | ||
| 8 | #endif /* _ASM_X86_RWLOCK_H */ | 8 | #endif /* ASM_X86__RWLOCK_H */ | 
| diff --git a/include/asm-x86/rwsem.h b/include/asm-x86/rwsem.h index 750f2a3542b3..3ff3015b71a8 100644 --- a/include/asm-x86/rwsem.h +++ b/include/asm-x86/rwsem.h | |||
| @@ -29,8 +29,8 @@ | |||
| 29 | * front, then they'll all be woken up, but no other readers will be. | 29 | * front, then they'll all be woken up, but no other readers will be. | 
| 30 | */ | 30 | */ | 
| 31 | 31 | ||
| 32 | #ifndef _I386_RWSEM_H | 32 | #ifndef ASM_X86__RWSEM_H | 
| 33 | #define _I386_RWSEM_H | 33 | #define ASM_X86__RWSEM_H | 
| 34 | 34 | ||
| 35 | #ifndef _LINUX_RWSEM_H | 35 | #ifndef _LINUX_RWSEM_H | 
| 36 | #error "please don't include asm/rwsem.h directly, use linux/rwsem.h instead" | 36 | #error "please don't include asm/rwsem.h directly, use linux/rwsem.h instead" | 
| @@ -262,4 +262,4 @@ static inline int rwsem_is_locked(struct rw_semaphore *sem) | |||
| 262 | } | 262 | } | 
| 263 | 263 | ||
| 264 | #endif /* __KERNEL__ */ | 264 | #endif /* __KERNEL__ */ | 
| 265 | #endif /* _I386_RWSEM_H */ | 265 | #endif /* ASM_X86__RWSEM_H */ | 
| diff --git a/include/asm-x86/scatterlist.h b/include/asm-x86/scatterlist.h index c0432061f81a..ee48f880005d 100644 --- a/include/asm-x86/scatterlist.h +++ b/include/asm-x86/scatterlist.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_SCATTERLIST_H | 1 | #ifndef ASM_X86__SCATTERLIST_H | 
| 2 | #define _ASM_X86_SCATTERLIST_H | 2 | #define ASM_X86__SCATTERLIST_H | 
| 3 | 3 | ||
| 4 | #include <asm/types.h> | 4 | #include <asm/types.h> | 
| 5 | 5 | ||
| @@ -30,4 +30,4 @@ struct scatterlist { | |||
| 30 | # define sg_dma_len(sg) ((sg)->dma_length) | 30 | # define sg_dma_len(sg) ((sg)->dma_length) | 
| 31 | #endif | 31 | #endif | 
| 32 | 32 | ||
| 33 | #endif | 33 | #endif /* ASM_X86__SCATTERLIST_H */ | 
| diff --git a/include/asm-x86/seccomp_32.h b/include/asm-x86/seccomp_32.h index 36e71c5f306f..cf9ab2dbcef1 100644 --- a/include/asm-x86/seccomp_32.h +++ b/include/asm-x86/seccomp_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_SECCOMP_H | 1 | #ifndef ASM_X86__SECCOMP_32_H | 
| 2 | #define _ASM_SECCOMP_H | 2 | #define ASM_X86__SECCOMP_32_H | 
| 3 | 3 | ||
| 4 | #include <linux/thread_info.h> | 4 | #include <linux/thread_info.h> | 
| 5 | 5 | ||
| @@ -14,4 +14,4 @@ | |||
| 14 | #define __NR_seccomp_exit __NR_exit | 14 | #define __NR_seccomp_exit __NR_exit | 
| 15 | #define __NR_seccomp_sigreturn __NR_sigreturn | 15 | #define __NR_seccomp_sigreturn __NR_sigreturn | 
| 16 | 16 | ||
| 17 | #endif /* _ASM_SECCOMP_H */ | 17 | #endif /* ASM_X86__SECCOMP_32_H */ | 
| diff --git a/include/asm-x86/seccomp_64.h b/include/asm-x86/seccomp_64.h index 76cfe69aa63c..03274cea751f 100644 --- a/include/asm-x86/seccomp_64.h +++ b/include/asm-x86/seccomp_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_SECCOMP_H | 1 | #ifndef ASM_X86__SECCOMP_64_H | 
| 2 | #define _ASM_SECCOMP_H | 2 | #define ASM_X86__SECCOMP_64_H | 
| 3 | 3 | ||
| 4 | #include <linux/thread_info.h> | 4 | #include <linux/thread_info.h> | 
| 5 | 5 | ||
| @@ -22,4 +22,4 @@ | |||
| 22 | #define __NR_seccomp_exit_32 __NR_ia32_exit | 22 | #define __NR_seccomp_exit_32 __NR_ia32_exit | 
| 23 | #define __NR_seccomp_sigreturn_32 __NR_ia32_sigreturn | 23 | #define __NR_seccomp_sigreturn_32 __NR_ia32_sigreturn | 
| 24 | 24 | ||
| 25 | #endif /* _ASM_SECCOMP_H */ | 25 | #endif /* ASM_X86__SECCOMP_64_H */ | 
| diff --git a/include/asm-x86/segment.h b/include/asm-x86/segment.h index 646452ea9ea3..ea5f0a8686f7 100644 --- a/include/asm-x86/segment.h +++ b/include/asm-x86/segment.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_SEGMENT_H_ | 1 | #ifndef ASM_X86__SEGMENT_H | 
| 2 | #define _ASM_X86_SEGMENT_H_ | 2 | #define ASM_X86__SEGMENT_H | 
| 3 | 3 | ||
| 4 | /* Constructor for a conventional segment GDT (or LDT) entry */ | 4 | /* Constructor for a conventional segment GDT (or LDT) entry */ | 
| 5 | /* This is a macro so it can be used in initializers */ | 5 | /* This is a macro so it can be used in initializers */ | 
| @@ -212,4 +212,4 @@ extern const char early_idt_handlers[NUM_EXCEPTION_VECTORS][10]; | |||
| 212 | #endif | 212 | #endif | 
| 213 | #endif | 213 | #endif | 
| 214 | 214 | ||
| 215 | #endif | 215 | #endif /* ASM_X86__SEGMENT_H */ | 
| diff --git a/include/asm-x86/sembuf.h b/include/asm-x86/sembuf.h index ee50c801f7b7..81f06b7e5a3f 100644 --- a/include/asm-x86/sembuf.h +++ b/include/asm-x86/sembuf.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_SEMBUF_H | 1 | #ifndef ASM_X86__SEMBUF_H | 
| 2 | #define _ASM_X86_SEMBUF_H | 2 | #define ASM_X86__SEMBUF_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * The semid64_ds structure for x86 architecture. | 5 | * The semid64_ds structure for x86 architecture. | 
| @@ -21,4 +21,4 @@ struct semid64_ds { | |||
| 21 | unsigned long __unused4; | 21 | unsigned long __unused4; | 
| 22 | }; | 22 | }; | 
| 23 | 23 | ||
| 24 | #endif /* _ASM_X86_SEMBUF_H */ | 24 | #endif /* ASM_X86__SEMBUF_H */ | 
| diff --git a/include/asm-x86/serial.h b/include/asm-x86/serial.h index 628c801535ea..303660b671e5 100644 --- a/include/asm-x86/serial.h +++ b/include/asm-x86/serial.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_SERIAL_H | 1 | #ifndef ASM_X86__SERIAL_H | 
| 2 | #define _ASM_X86_SERIAL_H | 2 | #define ASM_X86__SERIAL_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * This assumes you have a 1.8432 MHz clock for your UART. | 5 | * This assumes you have a 1.8432 MHz clock for your UART. | 
| @@ -26,4 +26,4 @@ | |||
| 26 | { 0, BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS }, /* ttyS2 */ \ | 26 | { 0, BASE_BAUD, 0x3E8, 4, STD_COM_FLAGS }, /* ttyS2 */ \ | 
| 27 | { 0, BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS }, /* ttyS3 */ | 27 | { 0, BASE_BAUD, 0x2E8, 3, STD_COM4_FLAGS }, /* ttyS3 */ | 
| 28 | 28 | ||
| 29 | #endif /* _ASM_X86_SERIAL_H */ | 29 | #endif /* ASM_X86__SERIAL_H */ | 
| diff --git a/include/asm-x86/setup.h b/include/asm-x86/setup.h index a07c6f1c01e1..9030cb73c4d7 100644 --- a/include/asm-x86/setup.h +++ b/include/asm-x86/setup.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_SETUP_H | 1 | #ifndef ASM_X86__SETUP_H | 
| 2 | #define _ASM_X86_SETUP_H | 2 | #define ASM_X86__SETUP_H | 
| 3 | 3 | ||
| 4 | #define COMMAND_LINE_SIZE 2048 | 4 | #define COMMAND_LINE_SIZE 2048 | 
| 5 | 5 | ||
| @@ -41,6 +41,7 @@ struct x86_quirks { | |||
| 41 | }; | 41 | }; | 
| 42 | 42 | ||
| 43 | extern struct x86_quirks *x86_quirks; | 43 | extern struct x86_quirks *x86_quirks; | 
| 44 | extern unsigned long saved_video_mode; | ||
| 44 | 45 | ||
| 45 | #ifndef CONFIG_PARAVIRT | 46 | #ifndef CONFIG_PARAVIRT | 
| 46 | #define paravirt_post_allocator_init() do {} while (0) | 47 | #define paravirt_post_allocator_init() do {} while (0) | 
| @@ -100,4 +101,4 @@ void __init x86_64_start_reservations(char *real_mode_data); | |||
| 100 | #endif /* __ASSEMBLY__ */ | 101 | #endif /* __ASSEMBLY__ */ | 
| 101 | #endif /* __KERNEL__ */ | 102 | #endif /* __KERNEL__ */ | 
| 102 | 103 | ||
| 103 | #endif /* _ASM_X86_SETUP_H */ | 104 | #endif /* ASM_X86__SETUP_H */ | 
| diff --git a/include/asm-x86/shmbuf.h b/include/asm-x86/shmbuf.h index b51413b74971..f51aec2298e9 100644 --- a/include/asm-x86/shmbuf.h +++ b/include/asm-x86/shmbuf.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_SHMBUF_H | 1 | #ifndef ASM_X86__SHMBUF_H | 
| 2 | #define _ASM_X86_SHMBUF_H | 2 | #define ASM_X86__SHMBUF_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * The shmid64_ds structure for x86 architecture. | 5 | * The shmid64_ds structure for x86 architecture. | 
| @@ -48,4 +48,4 @@ struct shminfo64 { | |||
| 48 | unsigned long __unused4; | 48 | unsigned long __unused4; | 
| 49 | }; | 49 | }; | 
| 50 | 50 | ||
| 51 | #endif /* _ASM_X86_SHMBUF_H */ | 51 | #endif /* ASM_X86__SHMBUF_H */ | 
| diff --git a/include/asm-x86/shmparam.h b/include/asm-x86/shmparam.h index 0880cf0917b9..a83a1fd96a0e 100644 --- a/include/asm-x86/shmparam.h +++ b/include/asm-x86/shmparam.h | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | #ifndef _ASM_X86_SHMPARAM_H | 1 | #ifndef ASM_X86__SHMPARAM_H | 
| 2 | #define _ASM_X86_SHMPARAM_H | 2 | #define ASM_X86__SHMPARAM_H | 
| 3 | 3 | ||
| 4 | #define SHMLBA PAGE_SIZE /* attach addr a multiple of this */ | 4 | #define SHMLBA PAGE_SIZE /* attach addr a multiple of this */ | 
| 5 | 5 | ||
| 6 | #endif /* _ASM_X86_SHMPARAM_H */ | 6 | #endif /* ASM_X86__SHMPARAM_H */ | 
| diff --git a/include/asm-x86/sigcontext.h b/include/asm-x86/sigcontext.h index 2f9c884d2c0f..24879c85b291 100644 --- a/include/asm-x86/sigcontext.h +++ b/include/asm-x86/sigcontext.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_SIGCONTEXT_H | 1 | #ifndef ASM_X86__SIGCONTEXT_H | 
| 2 | #define _ASM_X86_SIGCONTEXT_H | 2 | #define ASM_X86__SIGCONTEXT_H | 
| 3 | 3 | ||
| 4 | #include <linux/compiler.h> | 4 | #include <linux/compiler.h> | 
| 5 | #include <asm/types.h> | 5 | #include <asm/types.h> | 
| @@ -202,4 +202,4 @@ struct sigcontext { | |||
| 202 | 202 | ||
| 203 | #endif /* !__i386__ */ | 203 | #endif /* !__i386__ */ | 
| 204 | 204 | ||
| 205 | #endif | 205 | #endif /* ASM_X86__SIGCONTEXT_H */ | 
| diff --git a/include/asm-x86/sigcontext32.h b/include/asm-x86/sigcontext32.h index 57a9686fb491..4e2ec732dd01 100644 --- a/include/asm-x86/sigcontext32.h +++ b/include/asm-x86/sigcontext32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _SIGCONTEXT32_H | 1 | #ifndef ASM_X86__SIGCONTEXT32_H | 
| 2 | #define _SIGCONTEXT32_H 1 | 2 | #define ASM_X86__SIGCONTEXT32_H | 
| 3 | 3 | ||
| 4 | /* signal context for 32bit programs. */ | 4 | /* signal context for 32bit programs. */ | 
| 5 | 5 | ||
| @@ -68,4 +68,4 @@ struct sigcontext_ia32 { | |||
| 68 | unsigned int cr2; | 68 | unsigned int cr2; | 
| 69 | }; | 69 | }; | 
| 70 | 70 | ||
| 71 | #endif | 71 | #endif /* ASM_X86__SIGCONTEXT32_H */ | 
| diff --git a/include/asm-x86/siginfo.h b/include/asm-x86/siginfo.h index a477bea0c2a1..808bdfb2958c 100644 --- a/include/asm-x86/siginfo.h +++ b/include/asm-x86/siginfo.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_SIGINFO_H | 1 | #ifndef ASM_X86__SIGINFO_H | 
| 2 | #define _ASM_X86_SIGINFO_H | 2 | #define ASM_X86__SIGINFO_H | 
| 3 | 3 | ||
| 4 | #ifdef __x86_64__ | 4 | #ifdef __x86_64__ | 
| 5 | # define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int)) | 5 | # define __ARCH_SI_PREAMBLE_SIZE (4 * sizeof(int)) | 
| @@ -7,4 +7,4 @@ | |||
| 7 | 7 | ||
| 8 | #include <asm-generic/siginfo.h> | 8 | #include <asm-generic/siginfo.h> | 
| 9 | 9 | ||
| 10 | #endif | 10 | #endif /* ASM_X86__SIGINFO_H */ | 
| diff --git a/include/asm-x86/signal.h b/include/asm-x86/signal.h index 6dac49364e95..65acc82d267a 100644 --- a/include/asm-x86/signal.h +++ b/include/asm-x86/signal.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_SIGNAL_H | 1 | #ifndef ASM_X86__SIGNAL_H | 
| 2 | #define _ASM_X86_SIGNAL_H | 2 | #define ASM_X86__SIGNAL_H | 
| 3 | 3 | ||
| 4 | #ifndef __ASSEMBLY__ | 4 | #ifndef __ASSEMBLY__ | 
| 5 | #include <linux/types.h> | 5 | #include <linux/types.h> | 
| @@ -140,6 +140,9 @@ struct sigaction { | |||
| 140 | struct k_sigaction { | 140 | struct k_sigaction { | 
| 141 | struct sigaction sa; | 141 | struct sigaction sa; | 
| 142 | }; | 142 | }; | 
| 143 | |||
| 144 | extern void do_notify_resume(struct pt_regs *, void *, __u32); | ||
| 145 | |||
| 143 | # else /* __KERNEL__ */ | 146 | # else /* __KERNEL__ */ | 
| 144 | /* Here we must cater to libcs that poke about in kernel headers. */ | 147 | /* Here we must cater to libcs that poke about in kernel headers. */ | 
| 145 | 148 | ||
| @@ -256,4 +259,4 @@ struct pt_regs; | |||
| 256 | #endif /* __KERNEL__ */ | 259 | #endif /* __KERNEL__ */ | 
| 257 | #endif /* __ASSEMBLY__ */ | 260 | #endif /* __ASSEMBLY__ */ | 
| 258 | 261 | ||
| 259 | #endif | 262 | #endif /* ASM_X86__SIGNAL_H */ | 
| diff --git a/include/asm-x86/smp.h b/include/asm-x86/smp.h index 3c877f74f279..04f84f4e2c8b 100644 --- a/include/asm-x86/smp.h +++ b/include/asm-x86/smp.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_SMP_H_ | 1 | #ifndef ASM_X86__SMP_H | 
| 2 | #define _ASM_X86_SMP_H_ | 2 | #define ASM_X86__SMP_H | 
| 3 | #ifndef __ASSEMBLY__ | 3 | #ifndef __ASSEMBLY__ | 
| 4 | #include <linux/cpumask.h> | 4 | #include <linux/cpumask.h> | 
| 5 | #include <linux/init.h> | 5 | #include <linux/init.h> | 
| @@ -34,6 +34,9 @@ extern cpumask_t cpu_initialized; | |||
| 34 | DECLARE_PER_CPU(cpumask_t, cpu_sibling_map); | 34 | DECLARE_PER_CPU(cpumask_t, cpu_sibling_map); | 
| 35 | DECLARE_PER_CPU(cpumask_t, cpu_core_map); | 35 | DECLARE_PER_CPU(cpumask_t, cpu_core_map); | 
| 36 | DECLARE_PER_CPU(u16, cpu_llc_id); | 36 | DECLARE_PER_CPU(u16, cpu_llc_id); | 
| 37 | #ifdef CONFIG_X86_32 | ||
| 38 | DECLARE_PER_CPU(int, cpu_number); | ||
| 39 | #endif | ||
| 37 | 40 | ||
| 38 | DECLARE_EARLY_PER_CPU(u16, x86_cpu_to_apicid); | 41 | DECLARE_EARLY_PER_CPU(u16, x86_cpu_to_apicid); | 
| 39 | DECLARE_EARLY_PER_CPU(u16, x86_bios_cpu_apicid); | 42 | DECLARE_EARLY_PER_CPU(u16, x86_bios_cpu_apicid); | 
| @@ -142,7 +145,6 @@ extern unsigned disabled_cpus __cpuinitdata; | |||
| 142 | * from the initial startup. We map APIC_BASE very early in page_setup(), | 145 | * from the initial startup. We map APIC_BASE very early in page_setup(), | 
| 143 | * so this is correct in the x86 case. | 146 | * so this is correct in the x86 case. | 
| 144 | */ | 147 | */ | 
| 145 | DECLARE_PER_CPU(int, cpu_number); | ||
| 146 | #define raw_smp_processor_id() (x86_read_percpu(cpu_number)) | 148 | #define raw_smp_processor_id() (x86_read_percpu(cpu_number)) | 
| 147 | extern int safe_smp_processor_id(void); | 149 | extern int safe_smp_processor_id(void); | 
| 148 | 150 | ||
| @@ -205,4 +207,4 @@ extern void cpu_uninit(void); | |||
| 205 | #endif | 207 | #endif | 
| 206 | 208 | ||
| 207 | #endif /* __ASSEMBLY__ */ | 209 | #endif /* __ASSEMBLY__ */ | 
| 208 | #endif | 210 | #endif /* ASM_X86__SMP_H */ | 
| diff --git a/include/asm-x86/socket.h b/include/asm-x86/socket.h index 80af9c4ccad7..db73274c83c3 100644 --- a/include/asm-x86/socket.h +++ b/include/asm-x86/socket.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_SOCKET_H | 1 | #ifndef ASM_X86__SOCKET_H | 
| 2 | #define _ASM_SOCKET_H | 2 | #define ASM_X86__SOCKET_H | 
| 3 | 3 | ||
| 4 | #include <asm/sockios.h> | 4 | #include <asm/sockios.h> | 
| 5 | 5 | ||
| @@ -54,4 +54,4 @@ | |||
| 54 | 54 | ||
| 55 | #define SO_MARK 36 | 55 | #define SO_MARK 36 | 
| 56 | 56 | ||
| 57 | #endif /* _ASM_SOCKET_H */ | 57 | #endif /* ASM_X86__SOCKET_H */ | 
| diff --git a/include/asm-x86/sockios.h b/include/asm-x86/sockios.h index 49cc72b5d3c9..a006704fdc84 100644 --- a/include/asm-x86/sockios.h +++ b/include/asm-x86/sockios.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_SOCKIOS_H | 1 | #ifndef ASM_X86__SOCKIOS_H | 
| 2 | #define _ASM_X86_SOCKIOS_H | 2 | #define ASM_X86__SOCKIOS_H | 
| 3 | 3 | ||
| 4 | /* Socket-level I/O control calls. */ | 4 | /* Socket-level I/O control calls. */ | 
| 5 | #define FIOSETOWN 0x8901 | 5 | #define FIOSETOWN 0x8901 | 
| @@ -10,4 +10,4 @@ | |||
| 10 | #define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ | 10 | #define SIOCGSTAMP 0x8906 /* Get stamp (timeval) */ | 
| 11 | #define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ | 11 | #define SIOCGSTAMPNS 0x8907 /* Get stamp (timespec) */ | 
| 12 | 12 | ||
| 13 | #endif /* _ASM_X86_SOCKIOS_H */ | 13 | #endif /* ASM_X86__SOCKIOS_H */ | 
| diff --git a/include/asm-x86/sparsemem.h b/include/asm-x86/sparsemem.h index 9bd48b0a534b..38f8e6bc3186 100644 --- a/include/asm-x86/sparsemem.h +++ b/include/asm-x86/sparsemem.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_SPARSEMEM_H | 1 | #ifndef ASM_X86__SPARSEMEM_H | 
| 2 | #define _ASM_X86_SPARSEMEM_H | 2 | #define ASM_X86__SPARSEMEM_H | 
| 3 | 3 | ||
| 4 | #ifdef CONFIG_SPARSEMEM | 4 | #ifdef CONFIG_SPARSEMEM | 
| 5 | /* | 5 | /* | 
| @@ -31,4 +31,4 @@ | |||
| 31 | #endif | 31 | #endif | 
| 32 | 32 | ||
| 33 | #endif /* CONFIG_SPARSEMEM */ | 33 | #endif /* CONFIG_SPARSEMEM */ | 
| 34 | #endif | 34 | #endif /* ASM_X86__SPARSEMEM_H */ | 
| diff --git a/include/asm-x86/spinlock.h b/include/asm-x86/spinlock.h index e39c790dbfd2..93adae338ac6 100644 --- a/include/asm-x86/spinlock.h +++ b/include/asm-x86/spinlock.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _X86_SPINLOCK_H_ | 1 | #ifndef ASM_X86__SPINLOCK_H | 
| 2 | #define _X86_SPINLOCK_H_ | 2 | #define ASM_X86__SPINLOCK_H | 
| 3 | 3 | ||
| 4 | #include <asm/atomic.h> | 4 | #include <asm/atomic.h> | 
| 5 | #include <asm/rwlock.h> | 5 | #include <asm/rwlock.h> | 
| @@ -97,7 +97,7 @@ static __always_inline int __ticket_spin_trylock(raw_spinlock_t *lock) | |||
| 97 | "jne 1f\n\t" | 97 | "jne 1f\n\t" | 
| 98 | "movw %w0,%w1\n\t" | 98 | "movw %w0,%w1\n\t" | 
| 99 | "incb %h1\n\t" | 99 | "incb %h1\n\t" | 
| 100 | "lock ; cmpxchgw %w1,%2\n\t" | 100 | LOCK_PREFIX "cmpxchgw %w1,%2\n\t" | 
| 101 | "1:" | 101 | "1:" | 
| 102 | "sete %b1\n\t" | 102 | "sete %b1\n\t" | 
| 103 | "movzbl %b1,%0\n\t" | 103 | "movzbl %b1,%0\n\t" | 
| @@ -135,7 +135,7 @@ static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) | |||
| 135 | int inc = 0x00010000; | 135 | int inc = 0x00010000; | 
| 136 | int tmp; | 136 | int tmp; | 
| 137 | 137 | ||
| 138 | asm volatile("lock ; xaddl %0, %1\n" | 138 | asm volatile(LOCK_PREFIX "xaddl %0, %1\n" | 
| 139 | "movzwl %w0, %2\n\t" | 139 | "movzwl %w0, %2\n\t" | 
| 140 | "shrl $16, %0\n\t" | 140 | "shrl $16, %0\n\t" | 
| 141 | "1:\t" | 141 | "1:\t" | 
| @@ -162,7 +162,7 @@ static __always_inline int __ticket_spin_trylock(raw_spinlock_t *lock) | |||
| 162 | "cmpl %0,%1\n\t" | 162 | "cmpl %0,%1\n\t" | 
| 163 | "jne 1f\n\t" | 163 | "jne 1f\n\t" | 
| 164 | "addl $0x00010000, %1\n\t" | 164 | "addl $0x00010000, %1\n\t" | 
| 165 | "lock ; cmpxchgl %1,%2\n\t" | 165 | LOCK_PREFIX "cmpxchgl %1,%2\n\t" | 
| 166 | "1:" | 166 | "1:" | 
| 167 | "sete %b1\n\t" | 167 | "sete %b1\n\t" | 
| 168 | "movzbl %b1,%0\n\t" | 168 | "movzbl %b1,%0\n\t" | 
| @@ -366,4 +366,4 @@ static inline void __raw_write_unlock(raw_rwlock_t *rw) | |||
| 366 | #define _raw_read_relax(lock) cpu_relax() | 366 | #define _raw_read_relax(lock) cpu_relax() | 
| 367 | #define _raw_write_relax(lock) cpu_relax() | 367 | #define _raw_write_relax(lock) cpu_relax() | 
| 368 | 368 | ||
| 369 | #endif | 369 | #endif /* ASM_X86__SPINLOCK_H */ | 
| diff --git a/include/asm-x86/spinlock_types.h b/include/asm-x86/spinlock_types.h index 06c071c9eee9..6aa9b562c508 100644 --- a/include/asm-x86/spinlock_types.h +++ b/include/asm-x86/spinlock_types.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_SPINLOCK_TYPES_H | 1 | #ifndef ASM_X86__SPINLOCK_TYPES_H | 
| 2 | #define __ASM_SPINLOCK_TYPES_H | 2 | #define ASM_X86__SPINLOCK_TYPES_H | 
| 3 | 3 | ||
| 4 | #ifndef __LINUX_SPINLOCK_TYPES_H | 4 | #ifndef __LINUX_SPINLOCK_TYPES_H | 
| 5 | # error "please don't include this file directly" | 5 | # error "please don't include this file directly" | 
| @@ -17,4 +17,4 @@ typedef struct { | |||
| 17 | 17 | ||
| 18 | #define __RAW_RW_LOCK_UNLOCKED { RW_LOCK_BIAS } | 18 | #define __RAW_RW_LOCK_UNLOCKED { RW_LOCK_BIAS } | 
| 19 | 19 | ||
| 20 | #endif | 20 | #endif /* ASM_X86__SPINLOCK_TYPES_H */ | 
| diff --git a/include/asm-x86/srat.h b/include/asm-x86/srat.h index 774c919dc232..5363e4f7e1cd 100644 --- a/include/asm-x86/srat.h +++ b/include/asm-x86/srat.h | |||
| @@ -24,8 +24,8 @@ | |||
| 24 | * Send feedback to Pat Gaughen <gone@us.ibm.com> | 24 | * Send feedback to Pat Gaughen <gone@us.ibm.com> | 
| 25 | */ | 25 | */ | 
| 26 | 26 | ||
| 27 | #ifndef _ASM_SRAT_H_ | 27 | #ifndef ASM_X86__SRAT_H | 
| 28 | #define _ASM_SRAT_H_ | 28 | #define ASM_X86__SRAT_H | 
| 29 | 29 | ||
| 30 | #ifdef CONFIG_ACPI_NUMA | 30 | #ifdef CONFIG_ACPI_NUMA | 
| 31 | extern int get_memcfg_from_srat(void); | 31 | extern int get_memcfg_from_srat(void); | 
| @@ -36,4 +36,4 @@ static inline int get_memcfg_from_srat(void) | |||
| 36 | } | 36 | } | 
| 37 | #endif | 37 | #endif | 
| 38 | 38 | ||
| 39 | #endif /* _ASM_SRAT_H_ */ | 39 | #endif /* ASM_X86__SRAT_H */ | 
| diff --git a/include/asm-x86/stacktrace.h b/include/asm-x86/stacktrace.h index 30f82526a8e2..f43517e28532 100644 --- a/include/asm-x86/stacktrace.h +++ b/include/asm-x86/stacktrace.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_STACKTRACE_H | 1 | #ifndef ASM_X86__STACKTRACE_H | 
| 2 | #define _ASM_STACKTRACE_H 1 | 2 | #define ASM_X86__STACKTRACE_H | 
| 3 | 3 | ||
| 4 | extern int kstack_depth_to_print; | 4 | extern int kstack_depth_to_print; | 
| 5 | 5 | ||
| @@ -18,4 +18,4 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs, | |||
| 18 | unsigned long *stack, unsigned long bp, | 18 | unsigned long *stack, unsigned long bp, | 
| 19 | const struct stacktrace_ops *ops, void *data); | 19 | const struct stacktrace_ops *ops, void *data); | 
| 20 | 20 | ||
| 21 | #endif | 21 | #endif /* ASM_X86__STACKTRACE_H */ | 
| diff --git a/include/asm-x86/stat.h b/include/asm-x86/stat.h index 5c22dcb5d17e..1e120f628905 100644 --- a/include/asm-x86/stat.h +++ b/include/asm-x86/stat.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_STAT_H | 1 | #ifndef ASM_X86__STAT_H | 
| 2 | #define _ASM_X86_STAT_H | 2 | #define ASM_X86__STAT_H | 
| 3 | 3 | ||
| 4 | #define STAT_HAVE_NSEC 1 | 4 | #define STAT_HAVE_NSEC 1 | 
| 5 | 5 | ||
| @@ -111,4 +111,4 @@ struct __old_kernel_stat { | |||
| 111 | #endif | 111 | #endif | 
| 112 | }; | 112 | }; | 
| 113 | 113 | ||
| 114 | #endif | 114 | #endif /* ASM_X86__STAT_H */ | 
| diff --git a/include/asm-x86/statfs.h b/include/asm-x86/statfs.h index 7c651aa97252..3f005bc3aa5b 100644 --- a/include/asm-x86/statfs.h +++ b/include/asm-x86/statfs.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_STATFS_H | 1 | #ifndef ASM_X86__STATFS_H | 
| 2 | #define _ASM_X86_STATFS_H | 2 | #define ASM_X86__STATFS_H | 
| 3 | 3 | ||
| 4 | #ifdef __i386__ | 4 | #ifdef __i386__ | 
| 5 | #include <asm-generic/statfs.h> | 5 | #include <asm-generic/statfs.h> | 
| @@ -60,4 +60,4 @@ struct compat_statfs64 { | |||
| 60 | } __attribute__((packed)); | 60 | } __attribute__((packed)); | 
| 61 | 61 | ||
| 62 | #endif /* !__i386__ */ | 62 | #endif /* !__i386__ */ | 
| 63 | #endif | 63 | #endif /* ASM_X86__STATFS_H */ | 
| diff --git a/include/asm-x86/string_32.h b/include/asm-x86/string_32.h index 193578cd1fd9..487843ed245a 100644 --- a/include/asm-x86/string_32.h +++ b/include/asm-x86/string_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _I386_STRING_H_ | 1 | #ifndef ASM_X86__STRING_32_H | 
| 2 | #define _I386_STRING_H_ | 2 | #define ASM_X86__STRING_32_H | 
| 3 | 3 | ||
| 4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ | 
| 5 | 5 | ||
| @@ -323,4 +323,4 @@ extern void *memscan(void *addr, int c, size_t size); | |||
| 323 | 323 | ||
| 324 | #endif /* __KERNEL__ */ | 324 | #endif /* __KERNEL__ */ | 
| 325 | 325 | ||
| 326 | #endif | 326 | #endif /* ASM_X86__STRING_32_H */ | 
| diff --git a/include/asm-x86/string_64.h b/include/asm-x86/string_64.h index 52b5ab383395..a2add11d3b66 100644 --- a/include/asm-x86/string_64.h +++ b/include/asm-x86/string_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _X86_64_STRING_H_ | 1 | #ifndef ASM_X86__STRING_64_H | 
| 2 | #define _X86_64_STRING_H_ | 2 | #define ASM_X86__STRING_64_H | 
| 3 | 3 | ||
| 4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ | 
| 5 | 5 | ||
| @@ -57,4 +57,4 @@ int strcmp(const char *cs, const char *ct); | |||
| 57 | 57 | ||
| 58 | #endif /* __KERNEL__ */ | 58 | #endif /* __KERNEL__ */ | 
| 59 | 59 | ||
| 60 | #endif | 60 | #endif /* ASM_X86__STRING_64_H */ | 
| diff --git a/include/asm-x86/suspend_32.h b/include/asm-x86/suspend_32.h index 8675c6782a7d..acb6d4d491f4 100644 --- a/include/asm-x86/suspend_32.h +++ b/include/asm-x86/suspend_32.h | |||
| @@ -3,8 +3,8 @@ | |||
| 3 | * Based on code | 3 | * Based on code | 
| 4 | * Copyright 2001 Patrick Mochel <mochel@osdl.org> | 4 | * Copyright 2001 Patrick Mochel <mochel@osdl.org> | 
| 5 | */ | 5 | */ | 
| 6 | #ifndef __ASM_X86_32_SUSPEND_H | 6 | #ifndef ASM_X86__SUSPEND_32_H | 
| 7 | #define __ASM_X86_32_SUSPEND_H | 7 | #define ASM_X86__SUSPEND_32_H | 
| 8 | 8 | ||
| 9 | #include <asm/desc.h> | 9 | #include <asm/desc.h> | 
| 10 | #include <asm/i387.h> | 10 | #include <asm/i387.h> | 
| @@ -48,4 +48,4 @@ static inline void acpi_save_register_state(unsigned long return_point) | |||
| 48 | extern int acpi_save_state_mem(void); | 48 | extern int acpi_save_state_mem(void); | 
| 49 | #endif | 49 | #endif | 
| 50 | 50 | ||
| 51 | #endif /* __ASM_X86_32_SUSPEND_H */ | 51 | #endif /* ASM_X86__SUSPEND_32_H */ | 
| diff --git a/include/asm-x86/suspend_64.h b/include/asm-x86/suspend_64.h index dc3262b43072..cf821dd310e8 100644 --- a/include/asm-x86/suspend_64.h +++ b/include/asm-x86/suspend_64.h | |||
| @@ -3,8 +3,8 @@ | |||
| 3 | * Based on code | 3 | * Based on code | 
| 4 | * Copyright 2001 Patrick Mochel <mochel@osdl.org> | 4 | * Copyright 2001 Patrick Mochel <mochel@osdl.org> | 
| 5 | */ | 5 | */ | 
| 6 | #ifndef __ASM_X86_64_SUSPEND_H | 6 | #ifndef ASM_X86__SUSPEND_64_H | 
| 7 | #define __ASM_X86_64_SUSPEND_H | 7 | #define ASM_X86__SUSPEND_64_H | 
| 8 | 8 | ||
| 9 | #include <asm/desc.h> | 9 | #include <asm/desc.h> | 
| 10 | #include <asm/i387.h> | 10 | #include <asm/i387.h> | 
| @@ -49,4 +49,4 @@ extern int acpi_save_state_mem(void); | |||
| 49 | extern char core_restore_code; | 49 | extern char core_restore_code; | 
| 50 | extern char restore_registers; | 50 | extern char restore_registers; | 
| 51 | 51 | ||
| 52 | #endif /* __ASM_X86_64_SUSPEND_H */ | 52 | #endif /* ASM_X86__SUSPEND_64_H */ | 
| diff --git a/include/asm-x86/swiotlb.h b/include/asm-x86/swiotlb.h index 2730b351afcf..1e20adbcad4b 100644 --- a/include/asm-x86/swiotlb.h +++ b/include/asm-x86/swiotlb.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_SWIOTLB_H | 1 | #ifndef ASM_X86__SWIOTLB_H | 
| 2 | #define _ASM_SWIOTLB_H 1 | 2 | #define ASM_X86__SWIOTLB_H | 
| 3 | 3 | ||
| 4 | #include <asm/dma-mapping.h> | 4 | #include <asm/dma-mapping.h> | 
| 5 | 5 | ||
| @@ -55,4 +55,4 @@ static inline void pci_swiotlb_init(void) | |||
| 55 | 55 | ||
| 56 | static inline void dma_mark_clean(void *addr, size_t size) {} | 56 | static inline void dma_mark_clean(void *addr, size_t size) {} | 
| 57 | 57 | ||
| 58 | #endif /* _ASM_SWIOTLB_H */ | 58 | #endif /* ASM_X86__SWIOTLB_H */ | 
| diff --git a/include/asm-x86/sync_bitops.h b/include/asm-x86/sync_bitops.h index b47a1d0b8a83..b689bee71104 100644 --- a/include/asm-x86/sync_bitops.h +++ b/include/asm-x86/sync_bitops.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _I386_SYNC_BITOPS_H | 1 | #ifndef ASM_X86__SYNC_BITOPS_H | 
| 2 | #define _I386_SYNC_BITOPS_H | 2 | #define ASM_X86__SYNC_BITOPS_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * Copyright 1992, Linus Torvalds. | 5 | * Copyright 1992, Linus Torvalds. | 
| @@ -127,4 +127,4 @@ static inline int sync_test_and_change_bit(int nr, volatile unsigned long *addr) | |||
| 127 | 127 | ||
| 128 | #undef ADDR | 128 | #undef ADDR | 
| 129 | 129 | ||
| 130 | #endif /* _I386_SYNC_BITOPS_H */ | 130 | #endif /* ASM_X86__SYNC_BITOPS_H */ | 
| diff --git a/include/asm-x86/syscall.h b/include/asm-x86/syscall.h new file mode 100644 index 000000000000..04c47dc5597c --- /dev/null +++ b/include/asm-x86/syscall.h | |||
| @@ -0,0 +1,211 @@ | |||
| 1 | /* | ||
| 2 | * Access to user system call parameters and results | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008 Red Hat, Inc. All rights reserved. | ||
| 5 | * | ||
| 6 | * This copyrighted material is made available to anyone wishing to use, | ||
| 7 | * modify, copy, or redistribute it subject to the terms and conditions | ||
| 8 | * of the GNU General Public License v.2. | ||
| 9 | * | ||
| 10 | * See asm-generic/syscall.h for descriptions of what we must do here. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #ifndef _ASM_SYSCALL_H | ||
| 14 | #define _ASM_SYSCALL_H 1 | ||
| 15 | |||
| 16 | #include <linux/sched.h> | ||
| 17 | #include <linux/err.h> | ||
| 18 | |||
| 19 | static inline long syscall_get_nr(struct task_struct *task, | ||
| 20 | struct pt_regs *regs) | ||
| 21 | { | ||
| 22 | /* | ||
| 23 | * We always sign-extend a -1 value being set here, | ||
| 24 | * so this is always either -1L or a syscall number. | ||
| 25 | */ | ||
| 26 | return regs->orig_ax; | ||
| 27 | } | ||
| 28 | |||
| 29 | static inline void syscall_rollback(struct task_struct *task, | ||
| 30 | struct pt_regs *regs) | ||
| 31 | { | ||
| 32 | regs->ax = regs->orig_ax; | ||
| 33 | } | ||
| 34 | |||
| 35 | static inline long syscall_get_error(struct task_struct *task, | ||
| 36 | struct pt_regs *regs) | ||
| 37 | { | ||
| 38 | unsigned long error = regs->ax; | ||
| 39 | #ifdef CONFIG_IA32_EMULATION | ||
| 40 | /* | ||
| 41 | * TS_COMPAT is set for 32-bit syscall entries and then | ||
| 42 | * remains set until we return to user mode. | ||
| 43 | */ | ||
| 44 | if (task_thread_info(task)->status & TS_COMPAT) | ||
| 45 | /* | ||
| 46 | * Sign-extend the value so (int)-EFOO becomes (long)-EFOO | ||
| 47 | * and will match correctly in comparisons. | ||
| 48 | */ | ||
| 49 | error = (long) (int) error; | ||
| 50 | #endif | ||
| 51 | return IS_ERR_VALUE(error) ? error : 0; | ||
| 52 | } | ||
| 53 | |||
| 54 | static inline long syscall_get_return_value(struct task_struct *task, | ||
| 55 | struct pt_regs *regs) | ||
| 56 | { | ||
| 57 | return regs->ax; | ||
| 58 | } | ||
| 59 | |||
| 60 | static inline void syscall_set_return_value(struct task_struct *task, | ||
| 61 | struct pt_regs *regs, | ||
| 62 | int error, long val) | ||
| 63 | { | ||
| 64 | regs->ax = (long) error ?: val; | ||
| 65 | } | ||
| 66 | |||
| 67 | #ifdef CONFIG_X86_32 | ||
| 68 | |||
| 69 | static inline void syscall_get_arguments(struct task_struct *task, | ||
| 70 | struct pt_regs *regs, | ||
| 71 | unsigned int i, unsigned int n, | ||
| 72 | unsigned long *args) | ||
| 73 | { | ||
| 74 | BUG_ON(i + n > 6); | ||
| 75 | memcpy(args, ®s->bx + i, n * sizeof(args[0])); | ||
| 76 | } | ||
| 77 | |||
| 78 | static inline void syscall_set_arguments(struct task_struct *task, | ||
| 79 | struct pt_regs *regs, | ||
| 80 | unsigned int i, unsigned int n, | ||
| 81 | const unsigned long *args) | ||
| 82 | { | ||
| 83 | BUG_ON(i + n > 6); | ||
| 84 | memcpy(®s->bx + i, args, n * sizeof(args[0])); | ||
| 85 | } | ||
| 86 | |||
| 87 | #else /* CONFIG_X86_64 */ | ||
| 88 | |||
| 89 | static inline void syscall_get_arguments(struct task_struct *task, | ||
| 90 | struct pt_regs *regs, | ||
| 91 | unsigned int i, unsigned int n, | ||
| 92 | unsigned long *args) | ||
| 93 | { | ||
| 94 | # ifdef CONFIG_IA32_EMULATION | ||
| 95 | if (task_thread_info(task)->status & TS_COMPAT) | ||
| 96 | switch (i + n) { | ||
| 97 | case 6: | ||
| 98 | if (!n--) break; | ||
| 99 | *args++ = regs->bp; | ||
| 100 | case 5: | ||
| 101 | if (!n--) break; | ||
| 102 | *args++ = regs->di; | ||
| 103 | case 4: | ||
| 104 | if (!n--) break; | ||
| 105 | *args++ = regs->si; | ||
| 106 | case 3: | ||
| 107 | if (!n--) break; | ||
| 108 | *args++ = regs->dx; | ||
| 109 | case 2: | ||
| 110 | if (!n--) break; | ||
| 111 | *args++ = regs->cx; | ||
| 112 | case 1: | ||
| 113 | if (!n--) break; | ||
| 114 | *args++ = regs->bx; | ||
| 115 | case 0: | ||
| 116 | if (!n--) break; | ||
| 117 | default: | ||
| 118 | BUG(); | ||
| 119 | break; | ||
| 120 | } | ||
| 121 | else | ||
| 122 | # endif | ||
| 123 | switch (i + n) { | ||
| 124 | case 6: | ||
| 125 | if (!n--) break; | ||
| 126 | *args++ = regs->r9; | ||
| 127 | case 5: | ||
| 128 | if (!n--) break; | ||
| 129 | *args++ = regs->r8; | ||
| 130 | case 4: | ||
| 131 | if (!n--) break; | ||
| 132 | *args++ = regs->r10; | ||
| 133 | case 3: | ||
| 134 | if (!n--) break; | ||
| 135 | *args++ = regs->dx; | ||
| 136 | case 2: | ||
| 137 | if (!n--) break; | ||
| 138 | *args++ = regs->si; | ||
| 139 | case 1: | ||
| 140 | if (!n--) break; | ||
| 141 | *args++ = regs->di; | ||
| 142 | case 0: | ||
| 143 | if (!n--) break; | ||
| 144 | default: | ||
| 145 | BUG(); | ||
| 146 | break; | ||
| 147 | } | ||
| 148 | } | ||
| 149 | |||
| 150 | static inline void syscall_set_arguments(struct task_struct *task, | ||
| 151 | struct pt_regs *regs, | ||
| 152 | unsigned int i, unsigned int n, | ||
| 153 | const unsigned long *args) | ||
| 154 | { | ||
| 155 | # ifdef CONFIG_IA32_EMULATION | ||
| 156 | if (task_thread_info(task)->status & TS_COMPAT) | ||
| 157 | switch (i + n) { | ||
| 158 | case 6: | ||
| 159 | if (!n--) break; | ||
| 160 | regs->bp = *args++; | ||
| 161 | case 5: | ||
| 162 | if (!n--) break; | ||
| 163 | regs->di = *args++; | ||
| 164 | case 4: | ||
| 165 | if (!n--) break; | ||
| 166 | regs->si = *args++; | ||
| 167 | case 3: | ||
| 168 | if (!n--) break; | ||
| 169 | regs->dx = *args++; | ||
| 170 | case 2: | ||
| 171 | if (!n--) break; | ||
| 172 | regs->cx = *args++; | ||
| 173 | case 1: | ||
| 174 | if (!n--) break; | ||
| 175 | regs->bx = *args++; | ||
| 176 | case 0: | ||
| 177 | if (!n--) break; | ||
| 178 | default: | ||
| 179 | BUG(); | ||
| 180 | } | ||
| 181 | else | ||
| 182 | # endif | ||
| 183 | switch (i + n) { | ||
| 184 | case 6: | ||
| 185 | if (!n--) break; | ||
| 186 | regs->r9 = *args++; | ||
| 187 | case 5: | ||
| 188 | if (!n--) break; | ||
| 189 | regs->r8 = *args++; | ||
| 190 | case 4: | ||
| 191 | if (!n--) break; | ||
| 192 | regs->r10 = *args++; | ||
| 193 | case 3: | ||
| 194 | if (!n--) break; | ||
| 195 | regs->dx = *args++; | ||
| 196 | case 2: | ||
| 197 | if (!n--) break; | ||
| 198 | regs->si = *args++; | ||
| 199 | case 1: | ||
| 200 | if (!n--) break; | ||
| 201 | regs->di = *args++; | ||
| 202 | case 0: | ||
| 203 | if (!n--) break; | ||
| 204 | default: | ||
| 205 | BUG(); | ||
| 206 | } | ||
| 207 | } | ||
| 208 | |||
| 209 | #endif /* CONFIG_X86_32 */ | ||
| 210 | |||
| 211 | #endif /* _ASM_SYSCALL_H */ | ||
| diff --git a/include/asm-x86/syscalls.h b/include/asm-x86/syscalls.h new file mode 100644 index 000000000000..87803da44010 --- /dev/null +++ b/include/asm-x86/syscalls.h | |||
| @@ -0,0 +1,93 @@ | |||
| 1 | /* | ||
| 2 | * syscalls.h - Linux syscall interfaces (arch-specific) | ||
| 3 | * | ||
| 4 | * Copyright (c) 2008 Jaswinder Singh | ||
| 5 | * | ||
| 6 | * This file is released under the GPLv2. | ||
| 7 | * See the file COPYING for more details. | ||
| 8 | */ | ||
| 9 | |||
| 10 | #ifndef _ASM_X86_SYSCALLS_H | ||
| 11 | #define _ASM_X86_SYSCALLS_H | ||
| 12 | |||
| 13 | #include <linux/compiler.h> | ||
| 14 | #include <linux/linkage.h> | ||
| 15 | #include <linux/types.h> | ||
| 16 | #include <linux/signal.h> | ||
| 17 | |||
| 18 | /* Common in X86_32 and X86_64 */ | ||
| 19 | /* kernel/ioport.c */ | ||
| 20 | asmlinkage long sys_ioperm(unsigned long, unsigned long, int); | ||
| 21 | |||
| 22 | /* X86_32 only */ | ||
| 23 | #ifdef CONFIG_X86_32 | ||
| 24 | /* kernel/process_32.c */ | ||
| 25 | asmlinkage int sys_fork(struct pt_regs); | ||
| 26 | asmlinkage int sys_clone(struct pt_regs); | ||
| 27 | asmlinkage int sys_vfork(struct pt_regs); | ||
| 28 | asmlinkage int sys_execve(struct pt_regs); | ||
| 29 | |||
| 30 | /* kernel/signal_32.c */ | ||
| 31 | asmlinkage int sys_sigsuspend(int, int, old_sigset_t); | ||
| 32 | asmlinkage int sys_sigaction(int, const struct old_sigaction __user *, | ||
| 33 | struct old_sigaction __user *); | ||
| 34 | asmlinkage int sys_sigaltstack(unsigned long); | ||
| 35 | asmlinkage unsigned long sys_sigreturn(unsigned long); | ||
| 36 | asmlinkage int sys_rt_sigreturn(unsigned long); | ||
| 37 | |||
| 38 | /* kernel/ioport.c */ | ||
| 39 | asmlinkage long sys_iopl(unsigned long); | ||
| 40 | |||
| 41 | /* kernel/ldt.c */ | ||
| 42 | asmlinkage int sys_modify_ldt(int, void __user *, unsigned long); | ||
| 43 | |||
| 44 | /* kernel/sys_i386_32.c */ | ||
| 45 | asmlinkage long sys_mmap2(unsigned long, unsigned long, unsigned long, | ||
| 46 | unsigned long, unsigned long, unsigned long); | ||
| 47 | struct mmap_arg_struct; | ||
| 48 | asmlinkage int old_mmap(struct mmap_arg_struct __user *); | ||
| 49 | struct sel_arg_struct; | ||
| 50 | asmlinkage int old_select(struct sel_arg_struct __user *); | ||
| 51 | asmlinkage int sys_ipc(uint, int, int, int, void __user *, long); | ||
| 52 | struct old_utsname; | ||
| 53 | asmlinkage int sys_uname(struct old_utsname __user *); | ||
| 54 | struct oldold_utsname; | ||
| 55 | asmlinkage int sys_olduname(struct oldold_utsname __user *); | ||
| 56 | |||
| 57 | /* kernel/tls.c */ | ||
| 58 | asmlinkage int sys_set_thread_area(struct user_desc __user *); | ||
| 59 | asmlinkage int sys_get_thread_area(struct user_desc __user *); | ||
| 60 | |||
| 61 | /* kernel/vm86_32.c */ | ||
| 62 | asmlinkage int sys_vm86old(struct pt_regs); | ||
| 63 | asmlinkage int sys_vm86(struct pt_regs); | ||
| 64 | |||
| 65 | #else /* CONFIG_X86_32 */ | ||
| 66 | |||
| 67 | /* X86_64 only */ | ||
| 68 | /* kernel/process_64.c */ | ||
| 69 | asmlinkage long sys_fork(struct pt_regs *); | ||
| 70 | asmlinkage long sys_clone(unsigned long, unsigned long, | ||
| 71 | void __user *, void __user *, | ||
| 72 | struct pt_regs *); | ||
| 73 | asmlinkage long sys_vfork(struct pt_regs *); | ||
| 74 | asmlinkage long sys_execve(char __user *, char __user * __user *, | ||
| 75 | char __user * __user *, | ||
| 76 | struct pt_regs *); | ||
| 77 | |||
| 78 | /* kernel/ioport.c */ | ||
| 79 | asmlinkage long sys_iopl(unsigned int, struct pt_regs *); | ||
| 80 | |||
| 81 | /* kernel/signal_64.c */ | ||
| 82 | asmlinkage long sys_sigaltstack(const stack_t __user *, stack_t __user *, | ||
| 83 | struct pt_regs *); | ||
| 84 | asmlinkage long sys_rt_sigreturn(struct pt_regs *); | ||
| 85 | |||
| 86 | /* kernel/sys_x86_64.c */ | ||
| 87 | asmlinkage long sys_mmap(unsigned long, unsigned long, unsigned long, | ||
| 88 | unsigned long, unsigned long, unsigned long); | ||
| 89 | struct new_utsname; | ||
| 90 | asmlinkage long sys_uname(struct new_utsname __user *); | ||
| 91 | |||
| 92 | #endif /* CONFIG_X86_32 */ | ||
| 93 | #endif /* _ASM_X86_SYSCALLS_H */ | ||
| diff --git a/include/asm-x86/system.h b/include/asm-x86/system.h index 983ce37c491f..34505dd7b24d 100644 --- a/include/asm-x86/system.h +++ b/include/asm-x86/system.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_SYSTEM_H_ | 1 | #ifndef ASM_X86__SYSTEM_H | 
| 2 | #define _ASM_X86_SYSTEM_H_ | 2 | #define ASM_X86__SYSTEM_H | 
| 3 | 3 | ||
| 4 | #include <asm/asm.h> | 4 | #include <asm/asm.h> | 
| 5 | #include <asm/segment.h> | 5 | #include <asm/segment.h> | 
| @@ -419,4 +419,4 @@ static inline void rdtsc_barrier(void) | |||
| 419 | alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC); | 419 | alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC); | 
| 420 | } | 420 | } | 
| 421 | 421 | ||
| 422 | #endif | 422 | #endif /* ASM_X86__SYSTEM_H */ | 
| diff --git a/include/asm-x86/system_64.h b/include/asm-x86/system_64.h index 97fa251ccb2b..5aedb8bffc5a 100644 --- a/include/asm-x86/system_64.h +++ b/include/asm-x86/system_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_SYSTEM_H | 1 | #ifndef ASM_X86__SYSTEM_64_H | 
| 2 | #define __ASM_SYSTEM_H | 2 | #define ASM_X86__SYSTEM_64_H | 
| 3 | 3 | ||
| 4 | #include <asm/segment.h> | 4 | #include <asm/segment.h> | 
| 5 | #include <asm/cmpxchg.h> | 5 | #include <asm/cmpxchg.h> | 
| @@ -19,4 +19,4 @@ static inline void write_cr8(unsigned long val) | |||
| 19 | 19 | ||
| 20 | #include <linux/irqflags.h> | 20 | #include <linux/irqflags.h> | 
| 21 | 21 | ||
| 22 | #endif | 22 | #endif /* ASM_X86__SYSTEM_64_H */ | 
| diff --git a/include/asm-x86/tce.h b/include/asm-x86/tce.h index b1a4ea00df78..e7932d7fbbab 100644 --- a/include/asm-x86/tce.h +++ b/include/asm-x86/tce.h | |||
| @@ -21,8 +21,8 @@ | |||
| 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 
| 22 | */ | 22 | */ | 
| 23 | 23 | ||
| 24 | #ifndef _ASM_X86_64_TCE_H | 24 | #ifndef ASM_X86__TCE_H | 
| 25 | #define _ASM_X86_64_TCE_H | 25 | #define ASM_X86__TCE_H | 
| 26 | 26 | ||
| 27 | extern unsigned int specified_table_size; | 27 | extern unsigned int specified_table_size; | 
| 28 | struct iommu_table; | 28 | struct iommu_table; | 
| @@ -45,4 +45,4 @@ extern void * __init alloc_tce_table(void); | |||
| 45 | extern void __init free_tce_table(void *tbl); | 45 | extern void __init free_tce_table(void *tbl); | 
| 46 | extern int __init build_tce_table(struct pci_dev *dev, void __iomem *bbar); | 46 | extern int __init build_tce_table(struct pci_dev *dev, void __iomem *bbar); | 
| 47 | 47 | ||
| 48 | #endif /* _ASM_X86_64_TCE_H */ | 48 | #endif /* ASM_X86__TCE_H */ | 
| diff --git a/include/asm-x86/termbits.h b/include/asm-x86/termbits.h index af1b70ea440f..3d00dc5e0c71 100644 --- a/include/asm-x86/termbits.h +++ b/include/asm-x86/termbits.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_TERMBITS_H | 1 | #ifndef ASM_X86__TERMBITS_H | 
| 2 | #define _ASM_X86_TERMBITS_H | 2 | #define ASM_X86__TERMBITS_H | 
| 3 | 3 | ||
| 4 | #include <linux/posix_types.h> | 4 | #include <linux/posix_types.h> | 
| 5 | 5 | ||
| @@ -195,4 +195,4 @@ struct ktermios { | |||
| 195 | #define TCSADRAIN 1 | 195 | #define TCSADRAIN 1 | 
| 196 | #define TCSAFLUSH 2 | 196 | #define TCSAFLUSH 2 | 
| 197 | 197 | ||
| 198 | #endif /* _ASM_X86_TERMBITS_H */ | 198 | #endif /* ASM_X86__TERMBITS_H */ | 
| diff --git a/include/asm-x86/termios.h b/include/asm-x86/termios.h index f72956331c49..e235db248071 100644 --- a/include/asm-x86/termios.h +++ b/include/asm-x86/termios.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_TERMIOS_H | 1 | #ifndef ASM_X86__TERMIOS_H | 
| 2 | #define _ASM_X86_TERMIOS_H | 2 | #define ASM_X86__TERMIOS_H | 
| 3 | 3 | ||
| 4 | #include <asm/termbits.h> | 4 | #include <asm/termbits.h> | 
| 5 | #include <asm/ioctls.h> | 5 | #include <asm/ioctls.h> | 
| @@ -110,4 +110,4 @@ static inline int kernel_termios_to_user_termios_1(struct termios __user *u, | |||
| 110 | 110 | ||
| 111 | #endif /* __KERNEL__ */ | 111 | #endif /* __KERNEL__ */ | 
| 112 | 112 | ||
| 113 | #endif /* _ASM_X86_TERMIOS_H */ | 113 | #endif /* ASM_X86__TERMIOS_H */ | 
| diff --git a/include/asm-x86/therm_throt.h b/include/asm-x86/therm_throt.h index 399bf6026b16..1c7f57b6b66e 100644 --- a/include/asm-x86/therm_throt.h +++ b/include/asm-x86/therm_throt.h | |||
| @@ -1,9 +1,9 @@ | |||
| 1 | #ifndef __ASM_I386_THERM_THROT_H__ | 1 | #ifndef ASM_X86__THERM_THROT_H | 
| 2 | #define __ASM_I386_THERM_THROT_H__ 1 | 2 | #define ASM_X86__THERM_THROT_H | 
| 3 | 3 | ||
| 4 | #include <asm/atomic.h> | 4 | #include <asm/atomic.h> | 
| 5 | 5 | ||
| 6 | extern atomic_t therm_throt_en; | 6 | extern atomic_t therm_throt_en; | 
| 7 | int therm_throt_process(int curr); | 7 | int therm_throt_process(int curr); | 
| 8 | 8 | ||
| 9 | #endif /* __ASM_I386_THERM_THROT_H__ */ | 9 | #endif /* ASM_X86__THERM_THROT_H */ | 
| diff --git a/include/asm-x86/thread_info.h b/include/asm-x86/thread_info.h index da0a675adf94..4db0066a3a35 100644 --- a/include/asm-x86/thread_info.h +++ b/include/asm-x86/thread_info.h | |||
| @@ -4,8 +4,8 @@ | |||
| 4 | * - Incorporating suggestions made by Linus Torvalds and Dave Miller | 4 | * - Incorporating suggestions made by Linus Torvalds and Dave Miller | 
| 5 | */ | 5 | */ | 
| 6 | 6 | ||
| 7 | #ifndef _ASM_X86_THREAD_INFO_H | 7 | #ifndef ASM_X86__THREAD_INFO_H | 
| 8 | #define _ASM_X86_THREAD_INFO_H | 8 | #define ASM_X86__THREAD_INFO_H | 
| 9 | 9 | ||
| 10 | #include <linux/compiler.h> | 10 | #include <linux/compiler.h> | 
| 11 | #include <asm/page.h> | 11 | #include <asm/page.h> | 
| @@ -71,6 +71,7 @@ struct thread_info { | |||
| 71 | * Warning: layout of LSW is hardcoded in entry.S | 71 | * Warning: layout of LSW is hardcoded in entry.S | 
| 72 | */ | 72 | */ | 
| 73 | #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ | 73 | #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ | 
| 74 | #define TIF_NOTIFY_RESUME 1 /* callback before returning to user */ | ||
| 74 | #define TIF_SIGPENDING 2 /* signal pending */ | 75 | #define TIF_SIGPENDING 2 /* signal pending */ | 
| 75 | #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ | 76 | #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ | 
| 76 | #define TIF_SINGLESTEP 4 /* reenable singlestep on user return*/ | 77 | #define TIF_SINGLESTEP 4 /* reenable singlestep on user return*/ | 
| @@ -93,6 +94,7 @@ struct thread_info { | |||
| 93 | #define TIF_BTS_TRACE_TS 27 /* record scheduling event timestamps */ | 94 | #define TIF_BTS_TRACE_TS 27 /* record scheduling event timestamps */ | 
| 94 | 95 | ||
| 95 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) | 96 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) | 
| 97 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) | ||
| 96 | #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) | 98 | #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) | 
| 97 | #define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) | 99 | #define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) | 
| 98 | #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) | 100 | #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) | 
| @@ -133,7 +135,7 @@ struct thread_info { | |||
| 133 | 135 | ||
| 134 | /* Only used for 64 bit */ | 136 | /* Only used for 64 bit */ | 
| 135 | #define _TIF_DO_NOTIFY_MASK \ | 137 | #define _TIF_DO_NOTIFY_MASK \ | 
| 136 | (_TIF_SIGPENDING|_TIF_MCE_NOTIFY) | 138 | (_TIF_SIGPENDING|_TIF_MCE_NOTIFY|_TIF_NOTIFY_RESUME) | 
| 137 | 139 | ||
| 138 | /* flags to check in __switch_to() */ | 140 | /* flags to check in __switch_to() */ | 
| 139 | #define _TIF_WORK_CTXSW \ | 141 | #define _TIF_WORK_CTXSW \ | 
| @@ -258,4 +260,4 @@ extern void free_thread_info(struct thread_info *ti); | |||
| 258 | extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); | 260 | extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); | 
| 259 | #define arch_task_cache_init arch_task_cache_init | 261 | #define arch_task_cache_init arch_task_cache_init | 
| 260 | #endif | 262 | #endif | 
| 261 | #endif /* _ASM_X86_THREAD_INFO_H */ | 263 | #endif /* ASM_X86__THREAD_INFO_H */ | 
| diff --git a/include/asm-x86/time.h b/include/asm-x86/time.h index a17fa473e91d..3e724eef7ac4 100644 --- a/include/asm-x86/time.h +++ b/include/asm-x86/time.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASMX86_TIME_H | 1 | #ifndef ASM_X86__TIME_H | 
| 2 | #define _ASMX86_TIME_H | 2 | #define ASM_X86__TIME_H | 
| 3 | 3 | ||
| 4 | extern void hpet_time_init(void); | 4 | extern void hpet_time_init(void); | 
| 5 | 5 | ||
| @@ -46,6 +46,8 @@ static inline int native_set_wallclock(unsigned long nowtime) | |||
| 46 | 46 | ||
| 47 | #endif | 47 | #endif | 
| 48 | 48 | ||
| 49 | extern void time_init(void); | ||
| 50 | |||
| 49 | #ifdef CONFIG_PARAVIRT | 51 | #ifdef CONFIG_PARAVIRT | 
| 50 | #include <asm/paravirt.h> | 52 | #include <asm/paravirt.h> | 
| 51 | #else /* !CONFIG_PARAVIRT */ | 53 | #else /* !CONFIG_PARAVIRT */ | 
| @@ -58,4 +60,4 @@ static inline int native_set_wallclock(unsigned long nowtime) | |||
| 58 | 60 | ||
| 59 | extern unsigned long __init calibrate_cpu(void); | 61 | extern unsigned long __init calibrate_cpu(void); | 
| 60 | 62 | ||
| 61 | #endif | 63 | #endif /* ASM_X86__TIME_H */ | 
| diff --git a/include/asm-x86/timer.h b/include/asm-x86/timer.h index fb2a4ddddf3d..d0babce4b47a 100644 --- a/include/asm-x86/timer.h +++ b/include/asm-x86/timer.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASMi386_TIMER_H | 1 | #ifndef ASM_X86__TIMER_H | 
| 2 | #define _ASMi386_TIMER_H | 2 | #define ASM_X86__TIMER_H | 
| 3 | #include <linux/init.h> | 3 | #include <linux/init.h> | 
| 4 | #include <linux/pm.h> | 4 | #include <linux/pm.h> | 
| 5 | #include <linux/percpu.h> | 5 | #include <linux/percpu.h> | 
| @@ -9,9 +9,12 @@ | |||
| 9 | unsigned long long native_sched_clock(void); | 9 | unsigned long long native_sched_clock(void); | 
| 10 | unsigned long native_calibrate_tsc(void); | 10 | unsigned long native_calibrate_tsc(void); | 
| 11 | 11 | ||
| 12 | #ifdef CONFIG_X86_32 | ||
| 12 | extern int timer_ack; | 13 | extern int timer_ack; | 
| 13 | extern int no_timer_check; | ||
| 14 | extern int recalibrate_cpu_khz(void); | 14 | extern int recalibrate_cpu_khz(void); | 
| 15 | #endif /* CONFIG_X86_32 */ | ||
| 16 | |||
| 17 | extern int no_timer_check; | ||
| 15 | 18 | ||
| 16 | #ifndef CONFIG_PARAVIRT | 19 | #ifndef CONFIG_PARAVIRT | 
| 17 | #define calibrate_tsc() native_calibrate_tsc() | 20 | #define calibrate_tsc() native_calibrate_tsc() | 
| @@ -60,4 +63,4 @@ static inline unsigned long long cycles_2_ns(unsigned long long cyc) | |||
| 60 | return ns; | 63 | return ns; | 
| 61 | } | 64 | } | 
| 62 | 65 | ||
| 63 | #endif | 66 | #endif /* ASM_X86__TIMER_H */ | 
| diff --git a/include/asm-x86/timex.h b/include/asm-x86/timex.h index 43e5a78500c5..d1ce2416a5da 100644 --- a/include/asm-x86/timex.h +++ b/include/asm-x86/timex.h | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* x86 architecture timex specifications */ | 1 | /* x86 architecture timex specifications */ | 
| 2 | #ifndef _ASM_X86_TIMEX_H | 2 | #ifndef ASM_X86__TIMEX_H | 
| 3 | #define _ASM_X86_TIMEX_H | 3 | #define ASM_X86__TIMEX_H | 
| 4 | 4 | ||
| 5 | #include <asm/processor.h> | 5 | #include <asm/processor.h> | 
| 6 | #include <asm/tsc.h> | 6 | #include <asm/tsc.h> | 
| @@ -16,4 +16,4 @@ | |||
| 16 | 16 | ||
| 17 | #define ARCH_HAS_READ_CURRENT_TIMER | 17 | #define ARCH_HAS_READ_CURRENT_TIMER | 
| 18 | 18 | ||
| 19 | #endif | 19 | #endif /* ASM_X86__TIMEX_H */ | 
| diff --git a/include/asm-x86/tlb.h b/include/asm-x86/tlb.h index e4e9e2d07a93..db36e9e89e87 100644 --- a/include/asm-x86/tlb.h +++ b/include/asm-x86/tlb.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_TLB_H | 1 | #ifndef ASM_X86__TLB_H | 
| 2 | #define _ASM_X86_TLB_H | 2 | #define ASM_X86__TLB_H | 
| 3 | 3 | ||
| 4 | #define tlb_start_vma(tlb, vma) do { } while (0) | 4 | #define tlb_start_vma(tlb, vma) do { } while (0) | 
| 5 | #define tlb_end_vma(tlb, vma) do { } while (0) | 5 | #define tlb_end_vma(tlb, vma) do { } while (0) | 
| @@ -8,4 +8,4 @@ | |||
| 8 | 8 | ||
| 9 | #include <asm-generic/tlb.h> | 9 | #include <asm-generic/tlb.h> | 
| 10 | 10 | ||
| 11 | #endif | 11 | #endif /* ASM_X86__TLB_H */ | 
| diff --git a/include/asm-x86/tlbflush.h b/include/asm-x86/tlbflush.h index 35c76ceb9f40..ef68b76dc3c5 100644 --- a/include/asm-x86/tlbflush.h +++ b/include/asm-x86/tlbflush.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_TLBFLUSH_H | 1 | #ifndef ASM_X86__TLBFLUSH_H | 
| 2 | #define _ASM_X86_TLBFLUSH_H | 2 | #define ASM_X86__TLBFLUSH_H | 
| 3 | 3 | ||
| 4 | #include <linux/mm.h> | 4 | #include <linux/mm.h> | 
| 5 | #include <linux/sched.h> | 5 | #include <linux/sched.h> | 
| @@ -165,4 +165,4 @@ static inline void flush_tlb_kernel_range(unsigned long start, | |||
| 165 | flush_tlb_all(); | 165 | flush_tlb_all(); | 
| 166 | } | 166 | } | 
| 167 | 167 | ||
| 168 | #endif /* _ASM_X86_TLBFLUSH_H */ | 168 | #endif /* ASM_X86__TLBFLUSH_H */ | 
| diff --git a/include/asm-x86/topology.h b/include/asm-x86/topology.h index 90ac7718469a..7eca9bc022b2 100644 --- a/include/asm-x86/topology.h +++ b/include/asm-x86/topology.h | |||
| @@ -22,8 +22,8 @@ | |||
| 22 | * | 22 | * | 
| 23 | * Send feedback to <colpatch@us.ibm.com> | 23 | * Send feedback to <colpatch@us.ibm.com> | 
| 24 | */ | 24 | */ | 
| 25 | #ifndef _ASM_X86_TOPOLOGY_H | 25 | #ifndef ASM_X86__TOPOLOGY_H | 
| 26 | #define _ASM_X86_TOPOLOGY_H | 26 | #define ASM_X86__TOPOLOGY_H | 
| 27 | 27 | ||
| 28 | #ifdef CONFIG_X86_32 | 28 | #ifdef CONFIG_X86_32 | 
| 29 | # ifdef CONFIG_X86_HT | 29 | # ifdef CONFIG_X86_HT | 
| @@ -255,4 +255,4 @@ static inline void set_mp_bus_to_node(int busnum, int node) | |||
| 255 | } | 255 | } | 
| 256 | #endif | 256 | #endif | 
| 257 | 257 | ||
| 258 | #endif /* _ASM_X86_TOPOLOGY_H */ | 258 | #endif /* ASM_X86__TOPOLOGY_H */ | 
| diff --git a/include/asm-x86/trampoline.h b/include/asm-x86/trampoline.h index b156b08d0131..0406bbd898a9 100644 --- a/include/asm-x86/trampoline.h +++ b/include/asm-x86/trampoline.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __TRAMPOLINE_HEADER | 1 | #ifndef ASM_X86__TRAMPOLINE_H | 
| 2 | #define __TRAMPOLINE_HEADER | 2 | #define ASM_X86__TRAMPOLINE_H | 
| 3 | 3 | ||
| 4 | #ifndef __ASSEMBLY__ | 4 | #ifndef __ASSEMBLY__ | 
| 5 | 5 | ||
| @@ -18,4 +18,4 @@ extern unsigned long setup_trampoline(void); | |||
| 18 | 18 | ||
| 19 | #endif /* __ASSEMBLY__ */ | 19 | #endif /* __ASSEMBLY__ */ | 
| 20 | 20 | ||
| 21 | #endif /* __TRAMPOLINE_HEADER */ | 21 | #endif /* ASM_X86__TRAMPOLINE_H */ | 
| diff --git a/include/asm-x86/traps.h b/include/asm-x86/traps.h index a4b65a71bd66..2ccebc6fb0b0 100644 --- a/include/asm-x86/traps.h +++ b/include/asm-x86/traps.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_TRAPS_H | 1 | #ifndef ASM_X86__TRAPS_H | 
| 2 | #define _ASM_X86_TRAPS_H | 2 | #define ASM_X86__TRAPS_H | 
| 3 | 3 | ||
| 4 | /* Common in X86_32 and X86_64 */ | 4 | /* Common in X86_32 and X86_64 */ | 
| 5 | asmlinkage void divide_error(void); | 5 | asmlinkage void divide_error(void); | 
| @@ -51,6 +51,8 @@ void do_spurious_interrupt_bug(struct pt_regs *, long); | |||
| 51 | unsigned long patch_espfix_desc(unsigned long, unsigned long); | 51 | unsigned long patch_espfix_desc(unsigned long, unsigned long); | 
| 52 | asmlinkage void math_emulate(long); | 52 | asmlinkage void math_emulate(long); | 
| 53 | 53 | ||
| 54 | void do_page_fault(struct pt_regs *regs, unsigned long error_code); | ||
| 55 | |||
| 54 | #else /* CONFIG_X86_32 */ | 56 | #else /* CONFIG_X86_32 */ | 
| 55 | 57 | ||
| 56 | asmlinkage void double_fault(void); | 58 | asmlinkage void double_fault(void); | 
| @@ -62,5 +64,7 @@ asmlinkage void do_coprocessor_error(struct pt_regs *); | |||
| 62 | asmlinkage void do_simd_coprocessor_error(struct pt_regs *); | 64 | asmlinkage void do_simd_coprocessor_error(struct pt_regs *); | 
| 63 | asmlinkage void do_spurious_interrupt_bug(struct pt_regs *); | 65 | asmlinkage void do_spurious_interrupt_bug(struct pt_regs *); | 
| 64 | 66 | ||
| 67 | asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code); | ||
| 68 | |||
| 65 | #endif /* CONFIG_X86_32 */ | 69 | #endif /* CONFIG_X86_32 */ | 
| 66 | #endif /* _ASM_X86_TRAPS_H */ | 70 | #endif /* ASM_X86__TRAPS_H */ | 
| diff --git a/include/asm-x86/tsc.h b/include/asm-x86/tsc.h index cb6f6ee45b8f..ad0f5c41e78c 100644 --- a/include/asm-x86/tsc.h +++ b/include/asm-x86/tsc.h | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | /* | 1 | /* | 
| 2 | * x86 TSC related functions | 2 | * x86 TSC related functions | 
| 3 | */ | 3 | */ | 
| 4 | #ifndef _ASM_X86_TSC_H | 4 | #ifndef ASM_X86__TSC_H | 
| 5 | #define _ASM_X86_TSC_H | 5 | #define ASM_X86__TSC_H | 
| 6 | 6 | ||
| 7 | #include <asm/processor.h> | 7 | #include <asm/processor.h> | 
| 8 | 8 | ||
| @@ -59,4 +59,4 @@ extern void check_tsc_sync_target(void); | |||
| 59 | 59 | ||
| 60 | extern int notsc_setup(char *); | 60 | extern int notsc_setup(char *); | 
| 61 | 61 | ||
| 62 | #endif | 62 | #endif /* ASM_X86__TSC_H */ | 
| diff --git a/include/asm-x86/types.h b/include/asm-x86/types.h index 1ac80cd9acf8..e78b52e17444 100644 --- a/include/asm-x86/types.h +++ b/include/asm-x86/types.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_TYPES_H | 1 | #ifndef ASM_X86__TYPES_H | 
| 2 | #define _ASM_X86_TYPES_H | 2 | #define ASM_X86__TYPES_H | 
| 3 | 3 | ||
| 4 | #include <asm-generic/int-ll64.h> | 4 | #include <asm-generic/int-ll64.h> | 
| 5 | 5 | ||
| @@ -33,4 +33,4 @@ typedef u32 dma_addr_t; | |||
| 33 | #endif /* __ASSEMBLY__ */ | 33 | #endif /* __ASSEMBLY__ */ | 
| 34 | #endif /* __KERNEL__ */ | 34 | #endif /* __KERNEL__ */ | 
| 35 | 35 | ||
| 36 | #endif | 36 | #endif /* ASM_X86__TYPES_H */ | 
| diff --git a/include/asm-x86/uaccess.h b/include/asm-x86/uaccess.h index 5f702d1d5218..48ebc0ad40ec 100644 --- a/include/asm-x86/uaccess.h +++ b/include/asm-x86/uaccess.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_UACCES_H_ | 1 | #ifndef ASM_X86__UACCESS_H | 
| 2 | #define _ASM_UACCES_H_ | 2 | #define ASM_X86__UACCESS_H | 
| 3 | /* | 3 | /* | 
| 4 | * User space memory access functions | 4 | * User space memory access functions | 
| 5 | */ | 5 | */ | 
| @@ -450,5 +450,5 @@ extern struct movsl_mask { | |||
| 450 | # include "uaccess_64.h" | 450 | # include "uaccess_64.h" | 
| 451 | #endif | 451 | #endif | 
| 452 | 452 | ||
| 453 | #endif | 453 | #endif /* ASM_X86__UACCESS_H */ | 
| 454 | 454 | ||
| diff --git a/include/asm-x86/uaccess_32.h b/include/asm-x86/uaccess_32.h index 6fdef39a0bcb..6b5b57d9c6d1 100644 --- a/include/asm-x86/uaccess_32.h +++ b/include/asm-x86/uaccess_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __i386_UACCESS_H | 1 | #ifndef ASM_X86__UACCESS_32_H | 
| 2 | #define __i386_UACCESS_H | 2 | #define ASM_X86__UACCESS_32_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * User space memory access functions | 5 | * User space memory access functions | 
| @@ -215,4 +215,4 @@ long strnlen_user(const char __user *str, long n); | |||
| 215 | unsigned long __must_check clear_user(void __user *mem, unsigned long len); | 215 | unsigned long __must_check clear_user(void __user *mem, unsigned long len); | 
| 216 | unsigned long __must_check __clear_user(void __user *mem, unsigned long len); | 216 | unsigned long __must_check __clear_user(void __user *mem, unsigned long len); | 
| 217 | 217 | ||
| 218 | #endif /* __i386_UACCESS_H */ | 218 | #endif /* ASM_X86__UACCESS_32_H */ | 
| diff --git a/include/asm-x86/uaccess_64.h b/include/asm-x86/uaccess_64.h index 515d4dce96b5..c96c1f5d07a2 100644 --- a/include/asm-x86/uaccess_64.h +++ b/include/asm-x86/uaccess_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __X86_64_UACCESS_H | 1 | #ifndef ASM_X86__UACCESS_64_H | 
| 2 | #define __X86_64_UACCESS_H | 2 | #define ASM_X86__UACCESS_64_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * User space memory access functions | 5 | * User space memory access functions | 
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <linux/compiler.h> | 7 | #include <linux/compiler.h> | 
| 8 | #include <linux/errno.h> | 8 | #include <linux/errno.h> | 
| 9 | #include <linux/prefetch.h> | 9 | #include <linux/prefetch.h> | 
| 10 | #include <linux/lockdep.h> | ||
| 10 | #include <asm/page.h> | 11 | #include <asm/page.h> | 
| 11 | 12 | ||
| 12 | /* | 13 | /* | 
| @@ -198,4 +199,4 @@ static inline int __copy_from_user_inatomic_nocache(void *dst, | |||
| 198 | unsigned long | 199 | unsigned long | 
| 199 | copy_user_handle_tail(char *to, char *from, unsigned len, unsigned zerorest); | 200 | copy_user_handle_tail(char *to, char *from, unsigned len, unsigned zerorest); | 
| 200 | 201 | ||
| 201 | #endif /* __X86_64_UACCESS_H */ | 202 | #endif /* ASM_X86__UACCESS_64_H */ | 
| diff --git a/include/asm-x86/ucontext.h b/include/asm-x86/ucontext.h index 50a79f7fcde9..9948dd328084 100644 --- a/include/asm-x86/ucontext.h +++ b/include/asm-x86/ucontext.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_UCONTEXT_H | 1 | #ifndef ASM_X86__UCONTEXT_H | 
| 2 | #define _ASM_X86_UCONTEXT_H | 2 | #define ASM_X86__UCONTEXT_H | 
| 3 | 3 | ||
| 4 | struct ucontext { | 4 | struct ucontext { | 
| 5 | unsigned long uc_flags; | 5 | unsigned long uc_flags; | 
| @@ -9,4 +9,4 @@ struct ucontext { | |||
| 9 | sigset_t uc_sigmask; /* mask last for extensibility */ | 9 | sigset_t uc_sigmask; /* mask last for extensibility */ | 
| 10 | }; | 10 | }; | 
| 11 | 11 | ||
| 12 | #endif /* _ASM_X86_UCONTEXT_H */ | 12 | #endif /* ASM_X86__UCONTEXT_H */ | 
| diff --git a/include/asm-x86/unaligned.h b/include/asm-x86/unaligned.h index a7bd416b4763..59dcdec37160 100644 --- a/include/asm-x86/unaligned.h +++ b/include/asm-x86/unaligned.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_UNALIGNED_H | 1 | #ifndef ASM_X86__UNALIGNED_H | 
| 2 | #define _ASM_X86_UNALIGNED_H | 2 | #define ASM_X86__UNALIGNED_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * The x86 can do unaligned accesses itself. | 5 | * The x86 can do unaligned accesses itself. | 
| @@ -11,4 +11,4 @@ | |||
| 11 | #define get_unaligned __get_unaligned_le | 11 | #define get_unaligned __get_unaligned_le | 
| 12 | #define put_unaligned __put_unaligned_le | 12 | #define put_unaligned __put_unaligned_le | 
| 13 | 13 | ||
| 14 | #endif /* _ASM_X86_UNALIGNED_H */ | 14 | #endif /* ASM_X86__UNALIGNED_H */ | 
| diff --git a/include/asm-x86/unistd_32.h b/include/asm-x86/unistd_32.h index d7394673b772..017f4a87c913 100644 --- a/include/asm-x86/unistd_32.h +++ b/include/asm-x86/unistd_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_I386_UNISTD_H_ | 1 | #ifndef ASM_X86__UNISTD_32_H | 
| 2 | #define _ASM_I386_UNISTD_H_ | 2 | #define ASM_X86__UNISTD_32_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * This file contains the system call numbers. | 5 | * This file contains the system call numbers. | 
| @@ -376,4 +376,4 @@ | |||
| 376 | #endif | 376 | #endif | 
| 377 | 377 | ||
| 378 | #endif /* __KERNEL__ */ | 378 | #endif /* __KERNEL__ */ | 
| 379 | #endif /* _ASM_I386_UNISTD_H_ */ | 379 | #endif /* ASM_X86__UNISTD_32_H */ | 
| diff --git a/include/asm-x86/unistd_64.h b/include/asm-x86/unistd_64.h index 3a341d791792..ace83f1f6787 100644 --- a/include/asm-x86/unistd_64.h +++ b/include/asm-x86/unistd_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_64_UNISTD_H_ | 1 | #ifndef ASM_X86__UNISTD_64_H | 
| 2 | #define _ASM_X86_64_UNISTD_H_ | 2 | #define ASM_X86__UNISTD_64_H | 
| 3 | 3 | ||
| 4 | #ifndef __SYSCALL | 4 | #ifndef __SYSCALL | 
| 5 | #define __SYSCALL(a, b) | 5 | #define __SYSCALL(a, b) | 
| @@ -690,4 +690,4 @@ __SYSCALL(__NR_inotify_init1, sys_inotify_init1) | |||
| 690 | #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") | 690 | #define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall") | 
| 691 | #endif /* __KERNEL__ */ | 691 | #endif /* __KERNEL__ */ | 
| 692 | 692 | ||
| 693 | #endif /* _ASM_X86_64_UNISTD_H_ */ | 693 | #endif /* ASM_X86__UNISTD_64_H */ | 
| diff --git a/include/asm-x86/unwind.h b/include/asm-x86/unwind.h index 8b064bd9c553..a2151567db44 100644 --- a/include/asm-x86/unwind.h +++ b/include/asm-x86/unwind.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_UNWIND_H | 1 | #ifndef ASM_X86__UNWIND_H | 
| 2 | #define _ASM_X86_UNWIND_H | 2 | #define ASM_X86__UNWIND_H | 
| 3 | 3 | ||
| 4 | #define UNW_PC(frame) ((void)(frame), 0UL) | 4 | #define UNW_PC(frame) ((void)(frame), 0UL) | 
| 5 | #define UNW_SP(frame) ((void)(frame), 0UL) | 5 | #define UNW_SP(frame) ((void)(frame), 0UL) | 
| @@ -10,4 +10,4 @@ static inline int arch_unw_user_mode(const void *info) | |||
| 10 | return 0; | 10 | return 0; | 
| 11 | } | 11 | } | 
| 12 | 12 | ||
| 13 | #endif /* _ASM_X86_UNWIND_H */ | 13 | #endif /* ASM_X86__UNWIND_H */ | 
| diff --git a/include/asm-x86/user32.h b/include/asm-x86/user32.h index a3d910047879..aa66c1857f06 100644 --- a/include/asm-x86/user32.h +++ b/include/asm-x86/user32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef USER32_H | 1 | #ifndef ASM_X86__USER32_H | 
| 2 | #define USER32_H 1 | 2 | #define ASM_X86__USER32_H | 
| 3 | 3 | ||
| 4 | /* IA32 compatible user structures for ptrace. | 4 | /* IA32 compatible user structures for ptrace. | 
| 5 | * These should be used for 32bit coredumps too. */ | 5 | * These should be used for 32bit coredumps too. */ | 
| @@ -67,4 +67,4 @@ struct user32 { | |||
| 67 | }; | 67 | }; | 
| 68 | 68 | ||
| 69 | 69 | ||
| 70 | #endif | 70 | #endif /* ASM_X86__USER32_H */ | 
| diff --git a/include/asm-x86/user_32.h b/include/asm-x86/user_32.h index d6e51edc259d..e0fe2f55f1a6 100644 --- a/include/asm-x86/user_32.h +++ b/include/asm-x86/user_32.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _I386_USER_H | 1 | #ifndef ASM_X86__USER_32_H | 
| 2 | #define _I386_USER_H | 2 | #define ASM_X86__USER_32_H | 
| 3 | 3 | ||
| 4 | #include <asm/page.h> | 4 | #include <asm/page.h> | 
| 5 | /* Core file format: The core file is written in such a way that gdb | 5 | /* Core file format: The core file is written in such a way that gdb | 
| @@ -128,4 +128,4 @@ struct user{ | |||
| 128 | #define HOST_TEXT_START_ADDR (u.start_code) | 128 | #define HOST_TEXT_START_ADDR (u.start_code) | 
| 129 | #define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG) | 129 | #define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG) | 
| 130 | 130 | ||
| 131 | #endif /* _I386_USER_H */ | 131 | #endif /* ASM_X86__USER_32_H */ | 
| diff --git a/include/asm-x86/user_64.h b/include/asm-x86/user_64.h index 6037b634c77f..38b5799863b4 100644 --- a/include/asm-x86/user_64.h +++ b/include/asm-x86/user_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _X86_64_USER_H | 1 | #ifndef ASM_X86__USER_64_H | 
| 2 | #define _X86_64_USER_H | 2 | #define ASM_X86__USER_64_H | 
| 3 | 3 | ||
| 4 | #include <asm/types.h> | 4 | #include <asm/types.h> | 
| 5 | #include <asm/page.h> | 5 | #include <asm/page.h> | 
| @@ -134,4 +134,4 @@ struct user { | |||
| 134 | #define HOST_TEXT_START_ADDR (u.start_code) | 134 | #define HOST_TEXT_START_ADDR (u.start_code) | 
| 135 | #define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG) | 135 | #define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG) | 
| 136 | 136 | ||
| 137 | #endif /* _X86_64_USER_H */ | 137 | #endif /* ASM_X86__USER_64_H */ | 
| diff --git a/include/asm-x86/uv/bios.h b/include/asm-x86/uv/bios.h index aa73362ff5df..7cd6d7ec1308 100644 --- a/include/asm-x86/uv/bios.h +++ b/include/asm-x86/uv/bios.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_BIOS_H | 1 | #ifndef ASM_X86__UV__BIOS_H | 
| 2 | #define _ASM_X86_BIOS_H | 2 | #define ASM_X86__UV__BIOS_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * BIOS layer definitions. | 5 | * BIOS layer definitions. | 
| @@ -65,4 +65,4 @@ x86_bios_freq_base(unsigned long which, unsigned long *ticks_per_second, | |||
| 65 | unsigned long *drift_info); | 65 | unsigned long *drift_info); | 
| 66 | extern const char *x86_bios_strerror(long status); | 66 | extern const char *x86_bios_strerror(long status); | 
| 67 | 67 | ||
| 68 | #endif /* _ASM_X86_BIOS_H */ | 68 | #endif /* ASM_X86__UV__BIOS_H */ | 
| diff --git a/include/asm-x86/uv/uv_bau.h b/include/asm-x86/uv/uv_bau.h index 610b6b308e93..77153fb18f5e 100644 --- a/include/asm-x86/uv/uv_bau.h +++ b/include/asm-x86/uv/uv_bau.h | |||
| @@ -8,8 +8,8 @@ | |||
| 8 | * Copyright (C) 2008 Silicon Graphics, Inc. All rights reserved. | 8 | * Copyright (C) 2008 Silicon Graphics, Inc. All rights reserved. | 
| 9 | */ | 9 | */ | 
| 10 | 10 | ||
| 11 | #ifndef __ASM_X86_UV_BAU__ | 11 | #ifndef ASM_X86__UV__UV_BAU_H | 
| 12 | #define __ASM_X86_UV_BAU__ | 12 | #define ASM_X86__UV__UV_BAU_H | 
| 13 | 13 | ||
| 14 | #include <linux/bitmap.h> | 14 | #include <linux/bitmap.h> | 
| 15 | #define BITSPERBYTE 8 | 15 | #define BITSPERBYTE 8 | 
| @@ -329,4 +329,4 @@ extern int uv_flush_tlb_others(cpumask_t *, struct mm_struct *, unsigned long); | |||
| 329 | extern void uv_bau_message_intr1(void); | 329 | extern void uv_bau_message_intr1(void); | 
| 330 | extern void uv_bau_timeout_intr1(void); | 330 | extern void uv_bau_timeout_intr1(void); | 
| 331 | 331 | ||
| 332 | #endif /* __ASM_X86_UV_BAU__ */ | 332 | #endif /* ASM_X86__UV__UV_BAU_H */ | 
| diff --git a/include/asm-x86/uv/uv_hub.h b/include/asm-x86/uv/uv_hub.h index a4ef26e5850b..bdb5b01afbf5 100644 --- a/include/asm-x86/uv/uv_hub.h +++ b/include/asm-x86/uv/uv_hub.h | |||
| @@ -8,8 +8,8 @@ | |||
| 8 | * Copyright (C) 2007-2008 Silicon Graphics, Inc. All rights reserved. | 8 | * Copyright (C) 2007-2008 Silicon Graphics, Inc. All rights reserved. | 
| 9 | */ | 9 | */ | 
| 10 | 10 | ||
| 11 | #ifndef __ASM_X86_UV_HUB_H__ | 11 | #ifndef ASM_X86__UV__UV_HUB_H | 
| 12 | #define __ASM_X86_UV_HUB_H__ | 12 | #define ASM_X86__UV__UV_HUB_H | 
| 13 | 13 | ||
| 14 | #include <linux/numa.h> | 14 | #include <linux/numa.h> | 
| 15 | #include <linux/percpu.h> | 15 | #include <linux/percpu.h> | 
| @@ -350,5 +350,5 @@ static inline int uv_num_possible_blades(void) | |||
| 350 | return uv_possible_blades; | 350 | return uv_possible_blades; | 
| 351 | } | 351 | } | 
| 352 | 352 | ||
| 353 | #endif /* __ASM_X86_UV_HUB__ */ | 353 | #endif /* ASM_X86__UV__UV_HUB_H */ | 
| 354 | 354 | ||
| diff --git a/include/asm-x86/uv/uv_mmrs.h b/include/asm-x86/uv/uv_mmrs.h index 151fd7fcb809..8b03d89d2459 100644 --- a/include/asm-x86/uv/uv_mmrs.h +++ b/include/asm-x86/uv/uv_mmrs.h | |||
| @@ -8,8 +8,8 @@ | |||
| 8 | * Copyright (C) 2007-2008 Silicon Graphics, Inc. All rights reserved. | 8 | * Copyright (C) 2007-2008 Silicon Graphics, Inc. All rights reserved. | 
| 9 | */ | 9 | */ | 
| 10 | 10 | ||
| 11 | #ifndef __ASM_X86_UV_MMRS__ | 11 | #ifndef ASM_X86__UV__UV_MMRS_H | 
| 12 | #define __ASM_X86_UV_MMRS__ | 12 | #define ASM_X86__UV__UV_MMRS_H | 
| 13 | 13 | ||
| 14 | #define UV_MMR_ENABLE (1UL << 63) | 14 | #define UV_MMR_ENABLE (1UL << 63) | 
| 15 | 15 | ||
| @@ -1292,4 +1292,4 @@ union uvh_si_alias2_overlay_config_u { | |||
| 1292 | }; | 1292 | }; | 
| 1293 | 1293 | ||
| 1294 | 1294 | ||
| 1295 | #endif /* __ASM_X86_UV_MMRS__ */ | 1295 | #endif /* ASM_X86__UV__UV_MMRS_H */ | 
| diff --git a/include/asm-x86/vdso.h b/include/asm-x86/vdso.h index 8e18fb80f5e6..4ab320913ea3 100644 --- a/include/asm-x86/vdso.h +++ b/include/asm-x86/vdso.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_VDSO_H | 1 | #ifndef ASM_X86__VDSO_H | 
| 2 | #define _ASM_X86_VDSO_H 1 | 2 | #define ASM_X86__VDSO_H | 
| 3 | 3 | ||
| 4 | #ifdef CONFIG_X86_64 | 4 | #ifdef CONFIG_X86_64 | 
| 5 | extern const char VDSO64_PRELINK[]; | 5 | extern const char VDSO64_PRELINK[]; | 
| @@ -44,4 +44,4 @@ extern const char vdso32_int80_start, vdso32_int80_end; | |||
| 44 | extern const char vdso32_syscall_start, vdso32_syscall_end; | 44 | extern const char vdso32_syscall_start, vdso32_syscall_end; | 
| 45 | extern const char vdso32_sysenter_start, vdso32_sysenter_end; | 45 | extern const char vdso32_sysenter_start, vdso32_sysenter_end; | 
| 46 | 46 | ||
| 47 | #endif /* asm-x86/vdso.h */ | 47 | #endif /* ASM_X86__VDSO_H */ | 
| diff --git a/include/asm-x86/vga.h b/include/asm-x86/vga.h index 0ccf804377e6..b9e493d07d07 100644 --- a/include/asm-x86/vga.h +++ b/include/asm-x86/vga.h | |||
| @@ -4,8 +4,8 @@ | |||
| 4 | * (c) 1998 Martin Mares <mj@ucw.cz> | 4 | * (c) 1998 Martin Mares <mj@ucw.cz> | 
| 5 | */ | 5 | */ | 
| 6 | 6 | ||
| 7 | #ifndef _LINUX_ASM_VGA_H_ | 7 | #ifndef ASM_X86__VGA_H | 
| 8 | #define _LINUX_ASM_VGA_H_ | 8 | #define ASM_X86__VGA_H | 
| 9 | 9 | ||
| 10 | /* | 10 | /* | 
| 11 | * On the PC, we can just recalculate addresses and then | 11 | * On the PC, we can just recalculate addresses and then | 
| @@ -17,4 +17,4 @@ | |||
| 17 | #define vga_readb(x) (*(x)) | 17 | #define vga_readb(x) (*(x)) | 
| 18 | #define vga_writeb(x, y) (*(y) = (x)) | 18 | #define vga_writeb(x, y) (*(y) = (x)) | 
| 19 | 19 | ||
| 20 | #endif | 20 | #endif /* ASM_X86__VGA_H */ | 
| diff --git a/include/asm-x86/vgtod.h b/include/asm-x86/vgtod.h index 3301f0929342..38fd13364021 100644 --- a/include/asm-x86/vgtod.h +++ b/include/asm-x86/vgtod.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_VGTOD_H | 1 | #ifndef ASM_X86__VGTOD_H | 
| 2 | #define _ASM_VGTOD_H 1 | 2 | #define ASM_X86__VGTOD_H | 
| 3 | 3 | ||
| 4 | #include <asm/vsyscall.h> | 4 | #include <asm/vsyscall.h> | 
| 5 | #include <linux/clocksource.h> | 5 | #include <linux/clocksource.h> | 
| @@ -26,4 +26,4 @@ extern struct vsyscall_gtod_data __vsyscall_gtod_data | |||
| 26 | __section_vsyscall_gtod_data; | 26 | __section_vsyscall_gtod_data; | 
| 27 | extern struct vsyscall_gtod_data vsyscall_gtod_data; | 27 | extern struct vsyscall_gtod_data vsyscall_gtod_data; | 
| 28 | 28 | ||
| 29 | #endif | 29 | #endif /* ASM_X86__VGTOD_H */ | 
| diff --git a/include/asm-x86/visws/cobalt.h b/include/asm-x86/visws/cobalt.h index 995258831b7f..9627a8fe84e9 100644 --- a/include/asm-x86/visws/cobalt.h +++ b/include/asm-x86/visws/cobalt.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __I386_SGI_COBALT_H | 1 | #ifndef ASM_X86__VISWS__COBALT_H | 
| 2 | #define __I386_SGI_COBALT_H | 2 | #define ASM_X86__VISWS__COBALT_H | 
| 3 | 3 | ||
| 4 | #include <asm/fixmap.h> | 4 | #include <asm/fixmap.h> | 
| 5 | 5 | ||
| @@ -122,4 +122,4 @@ extern char visws_board_type; | |||
| 122 | 122 | ||
| 123 | extern char visws_board_rev; | 123 | extern char visws_board_rev; | 
| 124 | 124 | ||
| 125 | #endif /* __I386_SGI_COBALT_H */ | 125 | #endif /* ASM_X86__VISWS__COBALT_H */ | 
| diff --git a/include/asm-x86/visws/lithium.h b/include/asm-x86/visws/lithium.h index dfcd4f07ab85..b36d3b378c63 100644 --- a/include/asm-x86/visws/lithium.h +++ b/include/asm-x86/visws/lithium.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __I386_SGI_LITHIUM_H | 1 | #ifndef ASM_X86__VISWS__LITHIUM_H | 
| 2 | #define __I386_SGI_LITHIUM_H | 2 | #define ASM_X86__VISWS__LITHIUM_H | 
| 3 | 3 | ||
| 4 | #include <asm/fixmap.h> | 4 | #include <asm/fixmap.h> | 
| 5 | 5 | ||
| @@ -49,5 +49,5 @@ static inline unsigned short li_pcib_read16(unsigned long reg) | |||
| 49 | return *((volatile unsigned short *)(LI_PCIB_VADDR+reg)); | 49 | return *((volatile unsigned short *)(LI_PCIB_VADDR+reg)); | 
| 50 | } | 50 | } | 
| 51 | 51 | ||
| 52 | #endif | 52 | #endif /* ASM_X86__VISWS__LITHIUM_H */ | 
| 53 | 53 | ||
| diff --git a/include/asm-x86/visws/piix4.h b/include/asm-x86/visws/piix4.h index 83ea4f46e419..61c938045ec9 100644 --- a/include/asm-x86/visws/piix4.h +++ b/include/asm-x86/visws/piix4.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __I386_SGI_PIIX_H | 1 | #ifndef ASM_X86__VISWS__PIIX4_H | 
| 2 | #define __I386_SGI_PIIX_H | 2 | #define ASM_X86__VISWS__PIIX4_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * PIIX4 as used on SGI Visual Workstations | 5 | * PIIX4 as used on SGI Visual Workstations | 
| @@ -104,4 +104,4 @@ | |||
| 104 | */ | 104 | */ | 
| 105 | #define PIIX_GPI_STPCLK 0x4 // STPCLK signal routed back in | 105 | #define PIIX_GPI_STPCLK 0x4 // STPCLK signal routed back in | 
| 106 | 106 | ||
| 107 | #endif | 107 | #endif /* ASM_X86__VISWS__PIIX4_H */ | 
| diff --git a/include/asm-x86/vm86.h b/include/asm-x86/vm86.h index 5ce351325e01..998bd18eb737 100644 --- a/include/asm-x86/vm86.h +++ b/include/asm-x86/vm86.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _LINUX_VM86_H | 1 | #ifndef ASM_X86__VM86_H | 
| 2 | #define _LINUX_VM86_H | 2 | #define ASM_X86__VM86_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * I'm guessing at the VIF/VIP flag usage, but hope that this is how | 5 | * I'm guessing at the VIF/VIP flag usage, but hope that this is how | 
| @@ -205,4 +205,4 @@ static inline int handle_vm86_trap(struct kernel_vm86_regs *a, long b, int c) | |||
| 205 | 205 | ||
| 206 | #endif /* __KERNEL__ */ | 206 | #endif /* __KERNEL__ */ | 
| 207 | 207 | ||
| 208 | #endif | 208 | #endif /* ASM_X86__VM86_H */ | 
| diff --git a/include/asm-x86/vmi_time.h b/include/asm-x86/vmi_time.h index c3118c385156..b2d39e6a08b7 100644 --- a/include/asm-x86/vmi_time.h +++ b/include/asm-x86/vmi_time.h | |||
| @@ -22,8 +22,8 @@ | |||
| 22 | * | 22 | * | 
| 23 | */ | 23 | */ | 
| 24 | 24 | ||
| 25 | #ifndef __VMI_TIME_H | 25 | #ifndef ASM_X86__VMI_TIME_H | 
| 26 | #define __VMI_TIME_H | 26 | #define ASM_X86__VMI_TIME_H | 
| 27 | 27 | ||
| 28 | /* | 28 | /* | 
| 29 | * Raw VMI call indices for timer functions | 29 | * Raw VMI call indices for timer functions | 
| @@ -95,4 +95,4 @@ extern void __devinit vmi_time_ap_init(void); | |||
| 95 | 95 | ||
| 96 | #define CONFIG_VMI_ALARM_HZ 100 | 96 | #define CONFIG_VMI_ALARM_HZ 100 | 
| 97 | 97 | ||
| 98 | #endif | 98 | #endif /* ASM_X86__VMI_TIME_H */ | 
| diff --git a/include/asm-x86/vsyscall.h b/include/asm-x86/vsyscall.h index 6b66ff905af0..dcd4682413de 100644 --- a/include/asm-x86/vsyscall.h +++ b/include/asm-x86/vsyscall.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_X86_64_VSYSCALL_H_ | 1 | #ifndef ASM_X86__VSYSCALL_H | 
| 2 | #define _ASM_X86_64_VSYSCALL_H_ | 2 | #define ASM_X86__VSYSCALL_H | 
| 3 | 3 | ||
| 4 | enum vsyscall_num { | 4 | enum vsyscall_num { | 
| 5 | __NR_vgettimeofday, | 5 | __NR_vgettimeofday, | 
| @@ -41,4 +41,4 @@ extern void map_vsyscall(void); | |||
| 41 | 41 | ||
| 42 | #endif /* __KERNEL__ */ | 42 | #endif /* __KERNEL__ */ | 
| 43 | 43 | ||
| 44 | #endif /* _ASM_X86_64_VSYSCALL_H_ */ | 44 | #endif /* ASM_X86__VSYSCALL_H */ | 
| diff --git a/include/asm-x86/xen/events.h b/include/asm-x86/xen/events.h index 8ded74720024..8151f5b8b6cb 100644 --- a/include/asm-x86/xen/events.h +++ b/include/asm-x86/xen/events.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __XEN_EVENTS_H | 1 | #ifndef ASM_X86__XEN__EVENTS_H | 
| 2 | #define __XEN_EVENTS_H | 2 | #define ASM_X86__XEN__EVENTS_H | 
| 3 | 3 | ||
| 4 | enum ipi_vector { | 4 | enum ipi_vector { | 
| 5 | XEN_RESCHEDULE_VECTOR, | 5 | XEN_RESCHEDULE_VECTOR, | 
| @@ -21,4 +21,4 @@ static inline void xen_do_IRQ(int irq, struct pt_regs *regs) | |||
| 21 | do_IRQ(regs); | 21 | do_IRQ(regs); | 
| 22 | } | 22 | } | 
| 23 | 23 | ||
| 24 | #endif /* __XEN_EVENTS_H */ | 24 | #endif /* ASM_X86__XEN__EVENTS_H */ | 
| diff --git a/include/asm-x86/xen/grant_table.h b/include/asm-x86/xen/grant_table.h index 2444d4593a3b..c4baab4d2b68 100644 --- a/include/asm-x86/xen/grant_table.h +++ b/include/asm-x86/xen/grant_table.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifndef __XEN_GRANT_TABLE_H | 1 | #ifndef ASM_X86__XEN__GRANT_TABLE_H | 
| 2 | #define __XEN_GRANT_TABLE_H | 2 | #define ASM_X86__XEN__GRANT_TABLE_H | 
| 3 | 3 | ||
| 4 | #define xen_alloc_vm_area(size) alloc_vm_area(size) | 4 | #define xen_alloc_vm_area(size) alloc_vm_area(size) | 
| 5 | #define xen_free_vm_area(area) free_vm_area(area) | 5 | #define xen_free_vm_area(area) free_vm_area(area) | 
| 6 | 6 | ||
| 7 | #endif /* __XEN_GRANT_TABLE_H */ | 7 | #endif /* ASM_X86__XEN__GRANT_TABLE_H */ | 
| diff --git a/include/asm-x86/xen/hypercall.h b/include/asm-x86/xen/hypercall.h index 91cb7fd5c123..44f4259bee3f 100644 --- a/include/asm-x86/xen/hypercall.h +++ b/include/asm-x86/xen/hypercall.h | |||
| @@ -30,8 +30,8 @@ | |||
| 30 | * IN THE SOFTWARE. | 30 | * IN THE SOFTWARE. | 
| 31 | */ | 31 | */ | 
| 32 | 32 | ||
| 33 | #ifndef __HYPERCALL_H__ | 33 | #ifndef ASM_X86__XEN__HYPERCALL_H | 
| 34 | #define __HYPERCALL_H__ | 34 | #define ASM_X86__XEN__HYPERCALL_H | 
| 35 | 35 | ||
| 36 | #include <linux/errno.h> | 36 | #include <linux/errno.h> | 
| 37 | #include <linux/string.h> | 37 | #include <linux/string.h> | 
| @@ -524,4 +524,4 @@ MULTI_stack_switch(struct multicall_entry *mcl, | |||
| 524 | mcl->args[1] = esp; | 524 | mcl->args[1] = esp; | 
| 525 | } | 525 | } | 
| 526 | 526 | ||
| 527 | #endif /* __HYPERCALL_H__ */ | 527 | #endif /* ASM_X86__XEN__HYPERCALL_H */ | 
| diff --git a/include/asm-x86/xen/hypervisor.h b/include/asm-x86/xen/hypervisor.h index 04ee0610014a..0ef3a88b869d 100644 --- a/include/asm-x86/xen/hypervisor.h +++ b/include/asm-x86/xen/hypervisor.h | |||
| @@ -30,8 +30,8 @@ | |||
| 30 | * IN THE SOFTWARE. | 30 | * IN THE SOFTWARE. | 
| 31 | */ | 31 | */ | 
| 32 | 32 | ||
| 33 | #ifndef __HYPERVISOR_H__ | 33 | #ifndef ASM_X86__XEN__HYPERVISOR_H | 
| 34 | #define __HYPERVISOR_H__ | 34 | #define ASM_X86__XEN__HYPERVISOR_H | 
| 35 | 35 | ||
| 36 | #include <linux/types.h> | 36 | #include <linux/types.h> | 
| 37 | #include <linux/kernel.h> | 37 | #include <linux/kernel.h> | 
| @@ -69,4 +69,4 @@ u64 jiffies_to_st(unsigned long jiffies); | |||
| 69 | 69 | ||
| 70 | #define is_running_on_xen() (xen_start_info ? 1 : 0) | 70 | #define is_running_on_xen() (xen_start_info ? 1 : 0) | 
| 71 | 71 | ||
| 72 | #endif /* __HYPERVISOR_H__ */ | 72 | #endif /* ASM_X86__XEN__HYPERVISOR_H */ | 
| diff --git a/include/asm-x86/xen/interface.h b/include/asm-x86/xen/interface.h index 9d810f2538a2..d077bba96da9 100644 --- a/include/asm-x86/xen/interface.h +++ b/include/asm-x86/xen/interface.h | |||
| @@ -6,8 +6,8 @@ | |||
| 6 | * Copyright (c) 2004, K A Fraser | 6 | * Copyright (c) 2004, K A Fraser | 
| 7 | */ | 7 | */ | 
| 8 | 8 | ||
| 9 | #ifndef __ASM_X86_XEN_INTERFACE_H | 9 | #ifndef ASM_X86__XEN__INTERFACE_H | 
| 10 | #define __ASM_X86_XEN_INTERFACE_H | 10 | #define ASM_X86__XEN__INTERFACE_H | 
| 11 | 11 | ||
| 12 | #ifdef __XEN__ | 12 | #ifdef __XEN__ | 
| 13 | #define __DEFINE_GUEST_HANDLE(name, type) \ | 13 | #define __DEFINE_GUEST_HANDLE(name, type) \ | 
| @@ -172,4 +172,4 @@ DEFINE_GUEST_HANDLE_STRUCT(vcpu_guest_context); | |||
| 172 | #define XEN_CPUID XEN_EMULATE_PREFIX "cpuid" | 172 | #define XEN_CPUID XEN_EMULATE_PREFIX "cpuid" | 
| 173 | #endif | 173 | #endif | 
| 174 | 174 | ||
| 175 | #endif /* __ASM_X86_XEN_INTERFACE_H */ | 175 | #endif /* ASM_X86__XEN__INTERFACE_H */ | 
| diff --git a/include/asm-x86/xen/interface_32.h b/include/asm-x86/xen/interface_32.h index d8ac41d5db86..08167e19fc66 100644 --- a/include/asm-x86/xen/interface_32.h +++ b/include/asm-x86/xen/interface_32.h | |||
| @@ -6,8 +6,8 @@ | |||
| 6 | * Copyright (c) 2004, K A Fraser | 6 | * Copyright (c) 2004, K A Fraser | 
| 7 | */ | 7 | */ | 
| 8 | 8 | ||
| 9 | #ifndef __ASM_X86_XEN_INTERFACE_32_H | 9 | #ifndef ASM_X86__XEN__INTERFACE_32_H | 
| 10 | #define __ASM_X86_XEN_INTERFACE_32_H | 10 | #define ASM_X86__XEN__INTERFACE_32_H | 
| 11 | 11 | ||
| 12 | 12 | ||
| 13 | /* | 13 | /* | 
| @@ -94,4 +94,4 @@ typedef struct xen_callback xen_callback_t; | |||
| 94 | #define xen_pfn_to_cr3(pfn) (((unsigned)(pfn) << 12) | ((unsigned)(pfn) >> 20)) | 94 | #define xen_pfn_to_cr3(pfn) (((unsigned)(pfn) << 12) | ((unsigned)(pfn) >> 20)) | 
| 95 | #define xen_cr3_to_pfn(cr3) (((unsigned)(cr3) >> 12) | ((unsigned)(cr3) << 20)) | 95 | #define xen_cr3_to_pfn(cr3) (((unsigned)(cr3) >> 12) | ((unsigned)(cr3) << 20)) | 
| 96 | 96 | ||
| 97 | #endif /* __ASM_X86_XEN_INTERFACE_32_H */ | 97 | #endif /* ASM_X86__XEN__INTERFACE_32_H */ | 
| diff --git a/include/asm-x86/xen/interface_64.h b/include/asm-x86/xen/interface_64.h index 842266ce96e6..046c0f1e01d4 100644 --- a/include/asm-x86/xen/interface_64.h +++ b/include/asm-x86/xen/interface_64.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __ASM_X86_XEN_INTERFACE_64_H | 1 | #ifndef ASM_X86__XEN__INTERFACE_64_H | 
| 2 | #define __ASM_X86_XEN_INTERFACE_64_H | 2 | #define ASM_X86__XEN__INTERFACE_64_H | 
| 3 | 3 | ||
| 4 | /* | 4 | /* | 
| 5 | * 64-bit segment selectors | 5 | * 64-bit segment selectors | 
| @@ -156,4 +156,4 @@ typedef unsigned long xen_callback_t; | |||
| 156 | #endif /* !__ASSEMBLY__ */ | 156 | #endif /* !__ASSEMBLY__ */ | 
| 157 | 157 | ||
| 158 | 158 | ||
| 159 | #endif /* __ASM_X86_XEN_INTERFACE_64_H */ | 159 | #endif /* ASM_X86__XEN__INTERFACE_64_H */ | 
| diff --git a/include/asm-x86/xen/page.h b/include/asm-x86/xen/page.h index 7b3835d3b77d..c50185dccec1 100644 --- a/include/asm-x86/xen/page.h +++ b/include/asm-x86/xen/page.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __XEN_PAGE_H | 1 | #ifndef ASM_X86__XEN__PAGE_H | 
| 2 | #define __XEN_PAGE_H | 2 | #define ASM_X86__XEN__PAGE_H | 
| 3 | 3 | ||
| 4 | #include <linux/pfn.h> | 4 | #include <linux/pfn.h> | 
| 5 | 5 | ||
| @@ -162,4 +162,4 @@ xmaddr_t arbitrary_virt_to_machine(void *address); | |||
| 162 | void make_lowmem_page_readonly(void *vaddr); | 162 | void make_lowmem_page_readonly(void *vaddr); | 
| 163 | void make_lowmem_page_readwrite(void *vaddr); | 163 | void make_lowmem_page_readwrite(void *vaddr); | 
| 164 | 164 | ||
| 165 | #endif /* __XEN_PAGE_H */ | 165 | #endif /* ASM_X86__XEN__PAGE_H */ | 
| diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h index 6d93dce61cbb..2f245fe63bda 100644 --- a/include/linux/hrtimer.h +++ b/include/linux/hrtimer.h | |||
| @@ -47,14 +47,22 @@ enum hrtimer_restart { | |||
| 47 | * HRTIMER_CB_IRQSAFE: Callback may run in hardirq context | 47 | * HRTIMER_CB_IRQSAFE: Callback may run in hardirq context | 
| 48 | * HRTIMER_CB_IRQSAFE_NO_RESTART: Callback may run in hardirq context and | 48 | * HRTIMER_CB_IRQSAFE_NO_RESTART: Callback may run in hardirq context and | 
| 49 | * does not restart the timer | 49 | * does not restart the timer | 
| 50 | * HRTIMER_CB_IRQSAFE_NO_SOFTIRQ: Callback must run in hardirq context | 50 | * HRTIMER_CB_IRQSAFE_PERCPU: Callback must run in hardirq context | 
| 51 | * Special mode for tick emultation | 51 | * Special mode for tick emulation and | 
| 52 | * scheduler timer. Such timers are per | ||
| 53 | * cpu and not allowed to be migrated on | ||
| 54 | * cpu unplug. | ||
| 55 | * HRTIMER_CB_IRQSAFE_UNLOCKED: Callback should run in hardirq context | ||
| 56 | * with timer->base lock unlocked | ||
| 57 | * used for timers which call wakeup to | ||
| 58 | * avoid lock order problems with rq->lock | ||
| 52 | */ | 59 | */ | 
| 53 | enum hrtimer_cb_mode { | 60 | enum hrtimer_cb_mode { | 
| 54 | HRTIMER_CB_SOFTIRQ, | 61 | HRTIMER_CB_SOFTIRQ, | 
| 55 | HRTIMER_CB_IRQSAFE, | 62 | HRTIMER_CB_IRQSAFE, | 
| 56 | HRTIMER_CB_IRQSAFE_NO_RESTART, | 63 | HRTIMER_CB_IRQSAFE_NO_RESTART, | 
| 57 | HRTIMER_CB_IRQSAFE_NO_SOFTIRQ, | 64 | HRTIMER_CB_IRQSAFE_PERCPU, | 
| 65 | HRTIMER_CB_IRQSAFE_UNLOCKED, | ||
| 58 | }; | 66 | }; | 
| 59 | 67 | ||
| 60 | /* | 68 | /* | 
| @@ -67,9 +75,10 @@ enum hrtimer_cb_mode { | |||
| 67 | * 0x02 callback function running | 75 | * 0x02 callback function running | 
| 68 | * 0x04 callback pending (high resolution mode) | 76 | * 0x04 callback pending (high resolution mode) | 
| 69 | * | 77 | * | 
| 70 | * Special case: | 78 | * Special cases: | 
| 71 | * 0x03 callback function running and enqueued | 79 | * 0x03 callback function running and enqueued | 
| 72 | * (was requeued on another CPU) | 80 | * (was requeued on another CPU) | 
| 81 | * 0x09 timer was migrated on CPU hotunplug | ||
| 73 | * The "callback function running and enqueued" status is only possible on | 82 | * The "callback function running and enqueued" status is only possible on | 
| 74 | * SMP. It happens for example when a posix timer expired and the callback | 83 | * SMP. It happens for example when a posix timer expired and the callback | 
| 75 | * queued a signal. Between dropping the lock which protects the posix timer | 84 | * queued a signal. Between dropping the lock which protects the posix timer | 
| @@ -87,6 +96,7 @@ enum hrtimer_cb_mode { | |||
| 87 | #define HRTIMER_STATE_ENQUEUED 0x01 | 96 | #define HRTIMER_STATE_ENQUEUED 0x01 | 
| 88 | #define HRTIMER_STATE_CALLBACK 0x02 | 97 | #define HRTIMER_STATE_CALLBACK 0x02 | 
| 89 | #define HRTIMER_STATE_PENDING 0x04 | 98 | #define HRTIMER_STATE_PENDING 0x04 | 
| 99 | #define HRTIMER_STATE_MIGRATE 0x08 | ||
| 90 | 100 | ||
| 91 | /** | 101 | /** | 
| 92 | * struct hrtimer - the basic hrtimer structure | 102 | * struct hrtimer - the basic hrtimer structure | 
| diff --git a/include/linux/ramfs.h b/include/linux/ramfs.h index b160fb18e8d6..37aaf2b39863 100644 --- a/include/linux/ramfs.h +++ b/include/linux/ramfs.h | |||
| @@ -6,6 +6,7 @@ extern int ramfs_get_sb(struct file_system_type *fs_type, | |||
| 6 | int flags, const char *dev_name, void *data, struct vfsmount *mnt); | 6 | int flags, const char *dev_name, void *data, struct vfsmount *mnt); | 
| 7 | 7 | ||
| 8 | #ifndef CONFIG_MMU | 8 | #ifndef CONFIG_MMU | 
| 9 | extern int ramfs_nommu_expand_for_mapping(struct inode *inode, size_t newsize); | ||
| 9 | extern unsigned long ramfs_nommu_get_unmapped_area(struct file *file, | 10 | extern unsigned long ramfs_nommu_get_unmapped_area(struct file *file, | 
| 10 | unsigned long addr, | 11 | unsigned long addr, | 
| 11 | unsigned long len, | 12 | unsigned long len, | 
| diff --git a/include/linux/stacktrace.h b/include/linux/stacktrace.h index 5da9794b2d78..b106fd8e0d5c 100644 --- a/include/linux/stacktrace.h +++ b/include/linux/stacktrace.h | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | #ifndef __LINUX_STACKTRACE_H | 1 | #ifndef __LINUX_STACKTRACE_H | 
| 2 | #define __LINUX_STACKTRACE_H | 2 | #define __LINUX_STACKTRACE_H | 
| 3 | 3 | ||
| 4 | struct task_struct; | ||
| 5 | |||
| 4 | #ifdef CONFIG_STACKTRACE | 6 | #ifdef CONFIG_STACKTRACE | 
| 5 | struct stack_trace { | 7 | struct stack_trace { | 
| 6 | unsigned int nr_entries, max_entries; | 8 | unsigned int nr_entries, max_entries; | 
| diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h index 24811732bdb2..029a54a02396 100644 --- a/include/net/sctp/sm.h +++ b/include/net/sctp/sm.h | |||
| @@ -227,6 +227,9 @@ struct sctp_chunk *sctp_make_abort_violation(const struct sctp_association *, | |||
| 227 | const struct sctp_chunk *, | 227 | const struct sctp_chunk *, | 
| 228 | const __u8 *, | 228 | const __u8 *, | 
| 229 | const size_t ); | 229 | const size_t ); | 
| 230 | struct sctp_chunk *sctp_make_violation_paramlen(const struct sctp_association *, | ||
| 231 | const struct sctp_chunk *, | ||
| 232 | struct sctp_paramhdr *); | ||
| 230 | struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *, | 233 | struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *, | 
| 231 | const struct sctp_transport *, | 234 | const struct sctp_transport *, | 
| 232 | const void *payload, | 235 | const void *payload, | 
| diff --git a/init/main.c b/init/main.c index f6f7042331dc..3820323c4c84 100644 --- a/init/main.c +++ b/init/main.c | |||
| @@ -708,7 +708,7 @@ int do_one_initcall(initcall_t fn) | |||
| 708 | int result; | 708 | int result; | 
| 709 | 709 | ||
| 710 | if (initcall_debug) { | 710 | if (initcall_debug) { | 
| 711 | print_fn_descriptor_symbol("calling %s\n", fn); | 711 | printk("calling %pF\n", fn); | 
| 712 | t0 = ktime_get(); | 712 | t0 = ktime_get(); | 
| 713 | } | 713 | } | 
| 714 | 714 | ||
| @@ -718,8 +718,8 @@ int do_one_initcall(initcall_t fn) | |||
| 718 | t1 = ktime_get(); | 718 | t1 = ktime_get(); | 
| 719 | delta = ktime_sub(t1, t0); | 719 | delta = ktime_sub(t1, t0); | 
| 720 | 720 | ||
| 721 | print_fn_descriptor_symbol("initcall %s", fn); | 721 | printk("initcall %pF returned %d after %Ld msecs\n", | 
| 722 | printk(" returned %d after %Ld msecs\n", result, | 722 | fn, result, | 
| 723 | (unsigned long long) delta.tv64 >> 20); | 723 | (unsigned long long) delta.tv64 >> 20); | 
| 724 | } | 724 | } | 
| 725 | 725 | ||
| @@ -737,8 +737,7 @@ int do_one_initcall(initcall_t fn) | |||
| 737 | local_irq_enable(); | 737 | local_irq_enable(); | 
| 738 | } | 738 | } | 
| 739 | if (msgbuf[0]) { | 739 | if (msgbuf[0]) { | 
| 740 | print_fn_descriptor_symbol(KERN_WARNING "initcall %s", fn); | 740 | printk("initcall %pF returned with %s\n", fn, msgbuf); | 
| 741 | printk(" returned with %s\n", msgbuf); | ||
| 742 | } | 741 | } | 
| 743 | 742 | ||
| 744 | return result; | 743 | return result; | 
| diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c index b8e4dce80a74..cdec83e722fa 100644 --- a/kernel/hrtimer.c +++ b/kernel/hrtimer.c | |||
| @@ -672,13 +672,14 @@ static inline int hrtimer_enqueue_reprogram(struct hrtimer *timer, | |||
| 672 | */ | 672 | */ | 
| 673 | BUG_ON(timer->function(timer) != HRTIMER_NORESTART); | 673 | BUG_ON(timer->function(timer) != HRTIMER_NORESTART); | 
| 674 | return 1; | 674 | return 1; | 
| 675 | case HRTIMER_CB_IRQSAFE_NO_SOFTIRQ: | 675 | case HRTIMER_CB_IRQSAFE_PERCPU: | 
| 676 | case HRTIMER_CB_IRQSAFE_UNLOCKED: | ||
| 676 | /* | 677 | /* | 
| 677 | * This is solely for the sched tick emulation with | 678 | * This is solely for the sched tick emulation with | 
| 678 | * dynamic tick support to ensure that we do not | 679 | * dynamic tick support to ensure that we do not | 
| 679 | * restart the tick right on the edge and end up with | 680 | * restart the tick right on the edge and end up with | 
| 680 | * the tick timer in the softirq ! The calling site | 681 | * the tick timer in the softirq ! The calling site | 
| 681 | * takes care of this. | 682 | * takes care of this. Also used for hrtimer sleeper ! | 
| 682 | */ | 683 | */ | 
| 683 | debug_hrtimer_deactivate(timer); | 684 | debug_hrtimer_deactivate(timer); | 
| 684 | return 1; | 685 | return 1; | 
| @@ -1245,7 +1246,8 @@ static void __run_hrtimer(struct hrtimer *timer) | |||
| 1245 | timer_stats_account_hrtimer(timer); | 1246 | timer_stats_account_hrtimer(timer); | 
| 1246 | 1247 | ||
| 1247 | fn = timer->function; | 1248 | fn = timer->function; | 
| 1248 | if (timer->cb_mode == HRTIMER_CB_IRQSAFE_NO_SOFTIRQ) { | 1249 | if (timer->cb_mode == HRTIMER_CB_IRQSAFE_PERCPU || | 
| 1250 | timer->cb_mode == HRTIMER_CB_IRQSAFE_UNLOCKED) { | ||
| 1249 | /* | 1251 | /* | 
| 1250 | * Used for scheduler timers, avoid lock inversion with | 1252 | * Used for scheduler timers, avoid lock inversion with | 
| 1251 | * rq->lock and tasklist_lock. | 1253 | * rq->lock and tasklist_lock. | 
| @@ -1452,7 +1454,7 @@ void hrtimer_init_sleeper(struct hrtimer_sleeper *sl, struct task_struct *task) | |||
| 1452 | sl->timer.function = hrtimer_wakeup; | 1454 | sl->timer.function = hrtimer_wakeup; | 
| 1453 | sl->task = task; | 1455 | sl->task = task; | 
| 1454 | #ifdef CONFIG_HIGH_RES_TIMERS | 1456 | #ifdef CONFIG_HIGH_RES_TIMERS | 
| 1455 | sl->timer.cb_mode = HRTIMER_CB_IRQSAFE_NO_SOFTIRQ; | 1457 | sl->timer.cb_mode = HRTIMER_CB_IRQSAFE_UNLOCKED; | 
| 1456 | #endif | 1458 | #endif | 
| 1457 | } | 1459 | } | 
| 1458 | 1460 | ||
| @@ -1591,29 +1593,95 @@ static void __cpuinit init_hrtimers_cpu(int cpu) | |||
| 1591 | 1593 | ||
| 1592 | #ifdef CONFIG_HOTPLUG_CPU | 1594 | #ifdef CONFIG_HOTPLUG_CPU | 
| 1593 | 1595 | ||
| 1594 | static void migrate_hrtimer_list(struct hrtimer_clock_base *old_base, | 1596 | static int migrate_hrtimer_list(struct hrtimer_clock_base *old_base, | 
| 1595 | struct hrtimer_clock_base *new_base) | 1597 | struct hrtimer_clock_base *new_base, int dcpu) | 
| 1596 | { | 1598 | { | 
| 1597 | struct hrtimer *timer; | 1599 | struct hrtimer *timer; | 
| 1598 | struct rb_node *node; | 1600 | struct rb_node *node; | 
| 1601 | int raise = 0; | ||
| 1599 | 1602 | ||
| 1600 | while ((node = rb_first(&old_base->active))) { | 1603 | while ((node = rb_first(&old_base->active))) { | 
| 1601 | timer = rb_entry(node, struct hrtimer, node); | 1604 | timer = rb_entry(node, struct hrtimer, node); | 
| 1602 | BUG_ON(hrtimer_callback_running(timer)); | 1605 | BUG_ON(hrtimer_callback_running(timer)); | 
| 1603 | debug_hrtimer_deactivate(timer); | 1606 | debug_hrtimer_deactivate(timer); | 
| 1604 | __remove_hrtimer(timer, old_base, HRTIMER_STATE_INACTIVE, 0); | 1607 | |
| 1608 | /* | ||
| 1609 | * Should not happen. Per CPU timers should be | ||
| 1610 | * canceled _before_ the migration code is called | ||
| 1611 | */ | ||
| 1612 | if (timer->cb_mode == HRTIMER_CB_IRQSAFE_PERCPU) { | ||
| 1613 | __remove_hrtimer(timer, old_base, | ||
| 1614 | HRTIMER_STATE_INACTIVE, 0); | ||
| 1615 | WARN(1, "hrtimer (%p %p)active but cpu %d dead\n", | ||
| 1616 | timer, timer->function, dcpu); | ||
| 1617 | continue; | ||
| 1618 | } | ||
| 1619 | |||
| 1620 | /* | ||
| 1621 | * Mark it as STATE_MIGRATE not INACTIVE otherwise the | ||
| 1622 | * timer could be seen as !active and just vanish away | ||
| 1623 | * under us on another CPU | ||
| 1624 | */ | ||
| 1625 | __remove_hrtimer(timer, old_base, HRTIMER_STATE_MIGRATE, 0); | ||
| 1605 | timer->base = new_base; | 1626 | timer->base = new_base; | 
| 1606 | /* | 1627 | /* | 
| 1607 | * Enqueue the timer. Allow reprogramming of the event device | 1628 | * Enqueue the timer. Allow reprogramming of the event device | 
| 1608 | */ | 1629 | */ | 
| 1609 | enqueue_hrtimer(timer, new_base, 1); | 1630 | enqueue_hrtimer(timer, new_base, 1); | 
| 1631 | |||
| 1632 | #ifdef CONFIG_HIGH_RES_TIMERS | ||
| 1633 | /* | ||
| 1634 | * Happens with high res enabled when the timer was | ||
| 1635 | * already expired and the callback mode is | ||
| 1636 | * HRTIMER_CB_IRQSAFE_UNLOCKED (hrtimer_sleeper). The | ||
| 1637 | * enqueue code does not move them to the soft irq | ||
| 1638 | * pending list for performance/latency reasons, but | ||
| 1639 | * in the migration state, we need to do that | ||
| 1640 | * otherwise we end up with a stale timer. | ||
| 1641 | */ | ||
| 1642 | if (timer->state == HRTIMER_STATE_MIGRATE) { | ||
| 1643 | timer->state = HRTIMER_STATE_PENDING; | ||
| 1644 | list_add_tail(&timer->cb_entry, | ||
| 1645 | &new_base->cpu_base->cb_pending); | ||
| 1646 | raise = 1; | ||
| 1647 | } | ||
| 1648 | #endif | ||
| 1649 | /* Clear the migration state bit */ | ||
| 1650 | timer->state &= ~HRTIMER_STATE_MIGRATE; | ||
| 1651 | } | ||
| 1652 | return raise; | ||
| 1653 | } | ||
| 1654 | |||
| 1655 | #ifdef CONFIG_HIGH_RES_TIMERS | ||
| 1656 | static int migrate_hrtimer_pending(struct hrtimer_cpu_base *old_base, | ||
| 1657 | struct hrtimer_cpu_base *new_base) | ||
| 1658 | { | ||
| 1659 | struct hrtimer *timer; | ||
| 1660 | int raise = 0; | ||
| 1661 | |||
| 1662 | while (!list_empty(&old_base->cb_pending)) { | ||
| 1663 | timer = list_entry(old_base->cb_pending.next, | ||
| 1664 | struct hrtimer, cb_entry); | ||
| 1665 | |||
| 1666 | __remove_hrtimer(timer, timer->base, HRTIMER_STATE_PENDING, 0); | ||
| 1667 | timer->base = &new_base->clock_base[timer->base->index]; | ||
| 1668 | list_add_tail(&timer->cb_entry, &new_base->cb_pending); | ||
| 1669 | raise = 1; | ||
| 1610 | } | 1670 | } | 
| 1671 | return raise; | ||
| 1672 | } | ||
| 1673 | #else | ||
| 1674 | static int migrate_hrtimer_pending(struct hrtimer_cpu_base *old_base, | ||
| 1675 | struct hrtimer_cpu_base *new_base) | ||
| 1676 | { | ||
| 1677 | return 0; | ||
| 1611 | } | 1678 | } | 
| 1679 | #endif | ||
| 1612 | 1680 | ||
| 1613 | static void migrate_hrtimers(int cpu) | 1681 | static void migrate_hrtimers(int cpu) | 
| 1614 | { | 1682 | { | 
| 1615 | struct hrtimer_cpu_base *old_base, *new_base; | 1683 | struct hrtimer_cpu_base *old_base, *new_base; | 
| 1616 | int i; | 1684 | int i, raise = 0; | 
| 1617 | 1685 | ||
| 1618 | BUG_ON(cpu_online(cpu)); | 1686 | BUG_ON(cpu_online(cpu)); | 
| 1619 | old_base = &per_cpu(hrtimer_bases, cpu); | 1687 | old_base = &per_cpu(hrtimer_bases, cpu); | 
| @@ -1626,14 +1694,21 @@ static void migrate_hrtimers(int cpu) | |||
| 1626 | spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING); | 1694 | spin_lock_nested(&old_base->lock, SINGLE_DEPTH_NESTING); | 
| 1627 | 1695 | ||
| 1628 | for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) { | 1696 | for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) { | 
| 1629 | migrate_hrtimer_list(&old_base->clock_base[i], | 1697 | if (migrate_hrtimer_list(&old_base->clock_base[i], | 
| 1630 | &new_base->clock_base[i]); | 1698 | &new_base->clock_base[i], cpu)) | 
| 1699 | raise = 1; | ||
| 1631 | } | 1700 | } | 
| 1632 | 1701 | ||
| 1702 | if (migrate_hrtimer_pending(old_base, new_base)) | ||
| 1703 | raise = 1; | ||
| 1704 | |||
| 1633 | spin_unlock(&old_base->lock); | 1705 | spin_unlock(&old_base->lock); | 
| 1634 | spin_unlock(&new_base->lock); | 1706 | spin_unlock(&new_base->lock); | 
| 1635 | local_irq_enable(); | 1707 | local_irq_enable(); | 
| 1636 | put_cpu_var(hrtimer_bases); | 1708 | put_cpu_var(hrtimer_bases); | 
| 1709 | |||
| 1710 | if (raise) | ||
| 1711 | hrtimer_raise_softirq(); | ||
| 1637 | } | 1712 | } | 
| 1638 | #endif /* CONFIG_HOTPLUG_CPU */ | 1713 | #endif /* CONFIG_HOTPLUG_CPU */ | 
| 1639 | 1714 | ||
| diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c index e36d5798cbff..5131e5471169 100644 --- a/kernel/posix-timers.c +++ b/kernel/posix-timers.c | |||
| @@ -441,7 +441,7 @@ static struct k_itimer * alloc_posix_timer(void) | |||
| 441 | return tmr; | 441 | return tmr; | 
| 442 | if (unlikely(!(tmr->sigq = sigqueue_alloc()))) { | 442 | if (unlikely(!(tmr->sigq = sigqueue_alloc()))) { | 
| 443 | kmem_cache_free(posix_timers_cache, tmr); | 443 | kmem_cache_free(posix_timers_cache, tmr); | 
| 444 | tmr = NULL; | 444 | return NULL; | 
| 445 | } | 445 | } | 
| 446 | memset(&tmr->sigq->info, 0, sizeof(siginfo_t)); | 446 | memset(&tmr->sigq->info, 0, sizeof(siginfo_t)); | 
| 447 | return tmr; | 447 | return tmr; | 
| diff --git a/kernel/sched.c b/kernel/sched.c index 13dd2db9fb2d..ad1962dc0aa2 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -201,7 +201,7 @@ void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime) | |||
| 201 | hrtimer_init(&rt_b->rt_period_timer, | 201 | hrtimer_init(&rt_b->rt_period_timer, | 
| 202 | CLOCK_MONOTONIC, HRTIMER_MODE_REL); | 202 | CLOCK_MONOTONIC, HRTIMER_MODE_REL); | 
| 203 | rt_b->rt_period_timer.function = sched_rt_period_timer; | 203 | rt_b->rt_period_timer.function = sched_rt_period_timer; | 
| 204 | rt_b->rt_period_timer.cb_mode = HRTIMER_CB_IRQSAFE_NO_SOFTIRQ; | 204 | rt_b->rt_period_timer.cb_mode = HRTIMER_CB_IRQSAFE_UNLOCKED; | 
| 205 | } | 205 | } | 
| 206 | 206 | ||
| 207 | static void start_rt_bandwidth(struct rt_bandwidth *rt_b) | 207 | static void start_rt_bandwidth(struct rt_bandwidth *rt_b) | 
| @@ -1119,7 +1119,7 @@ static void init_rq_hrtick(struct rq *rq) | |||
| 1119 | 1119 | ||
| 1120 | hrtimer_init(&rq->hrtick_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | 1120 | hrtimer_init(&rq->hrtick_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | 
| 1121 | rq->hrtick_timer.function = hrtick; | 1121 | rq->hrtick_timer.function = hrtick; | 
| 1122 | rq->hrtick_timer.cb_mode = HRTIMER_CB_IRQSAFE_NO_SOFTIRQ; | 1122 | rq->hrtick_timer.cb_mode = HRTIMER_CB_IRQSAFE_PERCPU; | 
| 1123 | } | 1123 | } | 
| 1124 | #else | 1124 | #else | 
| 1125 | static inline void hrtick_clear(struct rq *rq) | 1125 | static inline void hrtick_clear(struct rq *rq) | 
| diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index bd7034542399..cb01cd8f919b 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c | |||
| @@ -235,7 +235,8 @@ static void tick_do_broadcast_on_off(void *why) | |||
| 235 | case CLOCK_EVT_NOTIFY_BROADCAST_FORCE: | 235 | case CLOCK_EVT_NOTIFY_BROADCAST_FORCE: | 
| 236 | if (!cpu_isset(cpu, tick_broadcast_mask)) { | 236 | if (!cpu_isset(cpu, tick_broadcast_mask)) { | 
| 237 | cpu_set(cpu, tick_broadcast_mask); | 237 | cpu_set(cpu, tick_broadcast_mask); | 
| 238 | if (bc->mode == TICKDEV_MODE_PERIODIC) | 238 | if (tick_broadcast_device.mode == | 
| 239 | TICKDEV_MODE_PERIODIC) | ||
| 239 | clockevents_shutdown(dev); | 240 | clockevents_shutdown(dev); | 
| 240 | } | 241 | } | 
| 241 | if (*reason == CLOCK_EVT_NOTIFY_BROADCAST_FORCE) | 242 | if (*reason == CLOCK_EVT_NOTIFY_BROADCAST_FORCE) | 
| @@ -245,7 +246,8 @@ static void tick_do_broadcast_on_off(void *why) | |||
| 245 | if (!tick_broadcast_force && | 246 | if (!tick_broadcast_force && | 
| 246 | cpu_isset(cpu, tick_broadcast_mask)) { | 247 | cpu_isset(cpu, tick_broadcast_mask)) { | 
| 247 | cpu_clear(cpu, tick_broadcast_mask); | 248 | cpu_clear(cpu, tick_broadcast_mask); | 
| 248 | if (bc->mode == TICKDEV_MODE_PERIODIC) | 249 | if (tick_broadcast_device.mode == | 
| 250 | TICKDEV_MODE_PERIODIC) | ||
| 249 | tick_setup_periodic(dev, 0); | 251 | tick_setup_periodic(dev, 0); | 
| 250 | } | 252 | } | 
| 251 | break; | 253 | break; | 
| diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 39019b3f7621..cb02324bdb88 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
| @@ -625,7 +625,7 @@ void tick_setup_sched_timer(void) | |||
| 625 | */ | 625 | */ | 
| 626 | hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); | 626 | hrtimer_init(&ts->sched_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); | 
| 627 | ts->sched_timer.function = tick_sched_timer; | 627 | ts->sched_timer.function = tick_sched_timer; | 
| 628 | ts->sched_timer.cb_mode = HRTIMER_CB_IRQSAFE_NO_SOFTIRQ; | 628 | ts->sched_timer.cb_mode = HRTIMER_CB_IRQSAFE_PERCPU; | 
| 629 | 629 | ||
| 630 | /* Get the next period (per cpu) */ | 630 | /* Get the next period (per cpu) */ | 
| 631 | ts->sched_timer.expires = tick_init_jiffy_update(); | 631 | ts->sched_timer.expires = tick_init_jiffy_update(); | 
| diff --git a/kernel/trace/trace_sysprof.c b/kernel/trace/trace_sysprof.c index bb948e52ce20..db58fb66a135 100644 --- a/kernel/trace/trace_sysprof.c +++ b/kernel/trace/trace_sysprof.c | |||
| @@ -202,7 +202,7 @@ static void start_stack_timer(int cpu) | |||
| 202 | 202 | ||
| 203 | hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | 203 | hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | 
| 204 | hrtimer->function = stack_trace_timer_fn; | 204 | hrtimer->function = stack_trace_timer_fn; | 
| 205 | hrtimer->cb_mode = HRTIMER_CB_IRQSAFE_NO_SOFTIRQ; | 205 | hrtimer->cb_mode = HRTIMER_CB_IRQSAFE_PERCPU; | 
| 206 | 206 | ||
| 207 | hrtimer_start(hrtimer, ns_to_ktime(sample_period), HRTIMER_MODE_REL); | 207 | hrtimer_start(hrtimer, ns_to_ktime(sample_period), HRTIMER_MODE_REL); | 
| 208 | } | 208 | } | 
| diff --git a/mm/page_alloc.c b/mm/page_alloc.c index e293c58bea58..27b8681139fd 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -268,13 +268,14 @@ void prep_compound_page(struct page *page, unsigned long order) | |||
| 268 | { | 268 | { | 
| 269 | int i; | 269 | int i; | 
| 270 | int nr_pages = 1 << order; | 270 | int nr_pages = 1 << order; | 
| 271 | struct page *p = page + 1; | ||
| 271 | 272 | ||
| 272 | set_compound_page_dtor(page, free_compound_page); | 273 | set_compound_page_dtor(page, free_compound_page); | 
| 273 | set_compound_order(page, order); | 274 | set_compound_order(page, order); | 
| 274 | __SetPageHead(page); | 275 | __SetPageHead(page); | 
| 275 | for (i = 1; i < nr_pages; i++) { | 276 | for (i = 1; i < nr_pages; i++, p++) { | 
| 276 | struct page *p = page + i; | 277 | if (unlikely((i & (MAX_ORDER_NR_PAGES - 1)) == 0)) | 
| 277 | 278 | p = pfn_to_page(page_to_pfn(page) + i); | |
| 278 | __SetPageTail(p); | 279 | __SetPageTail(p); | 
| 279 | p->first_page = page; | 280 | p->first_page = page; | 
| 280 | } | 281 | } | 
| @@ -284,6 +285,7 @@ static void destroy_compound_page(struct page *page, unsigned long order) | |||
| 284 | { | 285 | { | 
| 285 | int i; | 286 | int i; | 
| 286 | int nr_pages = 1 << order; | 287 | int nr_pages = 1 << order; | 
| 288 | struct page *p = page + 1; | ||
| 287 | 289 | ||
| 288 | if (unlikely(compound_order(page) != order)) | 290 | if (unlikely(compound_order(page) != order)) | 
| 289 | bad_page(page); | 291 | bad_page(page); | 
| @@ -291,8 +293,9 @@ static void destroy_compound_page(struct page *page, unsigned long order) | |||
| 291 | if (unlikely(!PageHead(page))) | 293 | if (unlikely(!PageHead(page))) | 
| 292 | bad_page(page); | 294 | bad_page(page); | 
| 293 | __ClearPageHead(page); | 295 | __ClearPageHead(page); | 
| 294 | for (i = 1; i < nr_pages; i++) { | 296 | for (i = 1; i < nr_pages; i++, p++) { | 
| 295 | struct page *p = page + i; | 297 | if (unlikely((i & (MAX_ORDER_NR_PAGES - 1)) == 0)) | 
| 298 | p = pfn_to_page(page_to_pfn(page) + i); | ||
| 296 | 299 | ||
| 297 | if (unlikely(!PageTail(p) | | 300 | if (unlikely(!PageTail(p) | | 
| 298 | (p->first_page != page))) | 301 | (p->first_page != page))) | 
| diff --git a/mm/page_isolation.c b/mm/page_isolation.c index c69f84fe038d..b70a7fec1ff6 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c | |||
| @@ -114,8 +114,10 @@ __test_page_isolated_in_pageblock(unsigned long pfn, unsigned long end_pfn) | |||
| 114 | 114 | ||
| 115 | int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn) | 115 | int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn) | 
| 116 | { | 116 | { | 
| 117 | unsigned long pfn; | 117 | unsigned long pfn, flags; | 
| 118 | struct page *page; | 118 | struct page *page; | 
| 119 | struct zone *zone; | ||
| 120 | int ret; | ||
| 119 | 121 | ||
| 120 | pfn = start_pfn; | 122 | pfn = start_pfn; | 
| 121 | /* | 123 | /* | 
| @@ -131,7 +133,9 @@ int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn) | |||
| 131 | if (pfn < end_pfn) | 133 | if (pfn < end_pfn) | 
| 132 | return -EBUSY; | 134 | return -EBUSY; | 
| 133 | /* Check all pages are free or Marked as ISOLATED */ | 135 | /* Check all pages are free or Marked as ISOLATED */ | 
| 134 | if (__test_page_isolated_in_pageblock(start_pfn, end_pfn)) | 136 | zone = page_zone(pfn_to_page(pfn)); | 
| 135 | return 0; | 137 | spin_lock_irqsave(&zone->lock, flags); | 
| 136 | return -EBUSY; | 138 | ret = __test_page_isolated_in_pageblock(start_pfn, end_pfn); | 
| 139 | spin_unlock_irqrestore(&zone->lock, flags); | ||
| 140 | return ret ? 0 : -EBUSY; | ||
| 137 | } | 141 | } | 
| diff --git a/mm/tiny-shmem.c b/mm/tiny-shmem.c index d17cb6f6ab10..8d7a27a6335c 100644 --- a/mm/tiny-shmem.c +++ b/mm/tiny-shmem.c | |||
| @@ -80,6 +80,12 @@ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags) | |||
| 80 | inode->i_nlink = 0; /* It is unlinked */ | 80 | inode->i_nlink = 0; /* It is unlinked */ | 
| 81 | init_file(file, shm_mnt, dentry, FMODE_WRITE | FMODE_READ, | 81 | init_file(file, shm_mnt, dentry, FMODE_WRITE | FMODE_READ, | 
| 82 | &ramfs_file_operations); | 82 | &ramfs_file_operations); | 
| 83 | |||
| 84 | #ifndef CONFIG_MMU | ||
| 85 | error = ramfs_nommu_expand_for_mapping(inode, size); | ||
| 86 | if (error) | ||
| 87 | goto close_file; | ||
| 88 | #endif | ||
| 83 | return file; | 89 | return file; | 
| 84 | 90 | ||
| 85 | close_file: | 91 | close_file: | 
| diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 1b4fee20fc93..011478e46c40 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -618,7 +618,7 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack, | |||
| 618 | ]; | 618 | ]; | 
| 619 | } rep; | 619 | } rep; | 
| 620 | struct ip_reply_arg arg; | 620 | struct ip_reply_arg arg; | 
| 621 | struct net *net = dev_net(skb->dev); | 621 | struct net *net = dev_net(skb->dst->dev); | 
| 622 | 622 | ||
| 623 | memset(&rep.th, 0, sizeof(struct tcphdr)); | 623 | memset(&rep.th, 0, sizeof(struct tcphdr)); | 
| 624 | memset(&arg, 0, sizeof(arg)); | 624 | memset(&arg, 0, sizeof(arg)); | 
| diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 9af6115f0f50..63442a1e741c 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -2688,6 +2688,8 @@ int __init ip6_route_init(void) | |||
| 2688 | if (ret) | 2688 | if (ret) | 
| 2689 | goto out_kmem_cache; | 2689 | goto out_kmem_cache; | 
| 2690 | 2690 | ||
| 2691 | ip6_dst_blackhole_ops.kmem_cachep = ip6_dst_ops_template.kmem_cachep; | ||
| 2692 | |||
| 2691 | /* Registering of the loopback is done before this portion of code, | 2693 | /* Registering of the loopback is done before this portion of code, | 
| 2692 | * the loopback reference in rt6_info will not be taken, do it | 2694 | * the loopback reference in rt6_info will not be taken, do it | 
| 2693 | * manually for init_net */ | 2695 | * manually for init_net */ | 
| diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index b585c850a89a..10e22fd48222 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
| @@ -1050,7 +1050,7 @@ static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 | |||
| 1050 | struct tcphdr *th = tcp_hdr(skb), *t1; | 1050 | struct tcphdr *th = tcp_hdr(skb), *t1; | 
| 1051 | struct sk_buff *buff; | 1051 | struct sk_buff *buff; | 
| 1052 | struct flowi fl; | 1052 | struct flowi fl; | 
| 1053 | struct net *net = dev_net(skb->dev); | 1053 | struct net *net = dev_net(skb->dst->dev); | 
| 1054 | struct sock *ctl_sk = net->ipv6.tcp_sk; | 1054 | struct sock *ctl_sk = net->ipv6.tcp_sk; | 
| 1055 | unsigned int tot_len = sizeof(struct tcphdr); | 1055 | unsigned int tot_len = sizeof(struct tcphdr); | 
| 1056 | __be32 *topt; | 1056 | __be32 *topt; | 
| diff --git a/net/iucv/iucv.c b/net/iucv/iucv.c index 705959b31e24..d7b54b5bfa69 100644 --- a/net/iucv/iucv.c +++ b/net/iucv/iucv.c | |||
| @@ -524,7 +524,6 @@ static int iucv_enable(void) | |||
| 524 | get_online_cpus(); | 524 | get_online_cpus(); | 
| 525 | for_each_online_cpu(cpu) | 525 | for_each_online_cpu(cpu) | 
| 526 | smp_call_function_single(cpu, iucv_declare_cpu, NULL, 1); | 526 | smp_call_function_single(cpu, iucv_declare_cpu, NULL, 1); | 
| 527 | preempt_enable(); | ||
| 528 | if (cpus_empty(iucv_buffer_cpumask)) | 527 | if (cpus_empty(iucv_buffer_cpumask)) | 
| 529 | /* No cpu could declare an iucv buffer. */ | 528 | /* No cpu could declare an iucv buffer. */ | 
| 530 | goto out_path; | 529 | goto out_path; | 
| @@ -547,7 +546,9 @@ out: | |||
| 547 | */ | 546 | */ | 
| 548 | static void iucv_disable(void) | 547 | static void iucv_disable(void) | 
| 549 | { | 548 | { | 
| 549 | get_online_cpus(); | ||
| 550 | on_each_cpu(iucv_retrieve_cpu, NULL, 1); | 550 | on_each_cpu(iucv_retrieve_cpu, NULL, 1); | 
| 551 | put_online_cpus(); | ||
| 551 | kfree(iucv_path_table); | 552 | kfree(iucv_path_table); | 
| 552 | } | 553 | } | 
| 553 | 554 | ||
| diff --git a/net/key/af_key.c b/net/key/af_key.c index d628df97e02e..b7f5a1c353ee 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
| @@ -73,22 +73,18 @@ static int pfkey_can_dump(struct sock *sk) | |||
| 73 | return 0; | 73 | return 0; | 
| 74 | } | 74 | } | 
| 75 | 75 | ||
| 76 | static int pfkey_do_dump(struct pfkey_sock *pfk) | 76 | static void pfkey_terminate_dump(struct pfkey_sock *pfk) | 
| 77 | { | 77 | { | 
| 78 | int rc; | 78 | if (pfk->dump.dump) { | 
| 79 | 79 | pfk->dump.done(pfk); | |
| 80 | rc = pfk->dump.dump(pfk); | 80 | pfk->dump.dump = NULL; | 
| 81 | if (rc == -ENOBUFS) | 81 | pfk->dump.done = NULL; | 
| 82 | return 0; | 82 | } | 
| 83 | |||
| 84 | pfk->dump.done(pfk); | ||
| 85 | pfk->dump.dump = NULL; | ||
| 86 | pfk->dump.done = NULL; | ||
| 87 | return rc; | ||
| 88 | } | 83 | } | 
| 89 | 84 | ||
| 90 | static void pfkey_sock_destruct(struct sock *sk) | 85 | static void pfkey_sock_destruct(struct sock *sk) | 
| 91 | { | 86 | { | 
| 87 | pfkey_terminate_dump(pfkey_sk(sk)); | ||
| 92 | skb_queue_purge(&sk->sk_receive_queue); | 88 | skb_queue_purge(&sk->sk_receive_queue); | 
| 93 | 89 | ||
| 94 | if (!sock_flag(sk, SOCK_DEAD)) { | 90 | if (!sock_flag(sk, SOCK_DEAD)) { | 
| @@ -310,6 +306,18 @@ static int pfkey_broadcast(struct sk_buff *skb, gfp_t allocation, | |||
| 310 | return err; | 306 | return err; | 
| 311 | } | 307 | } | 
| 312 | 308 | ||
| 309 | static int pfkey_do_dump(struct pfkey_sock *pfk) | ||
| 310 | { | ||
| 311 | int rc; | ||
| 312 | |||
| 313 | rc = pfk->dump.dump(pfk); | ||
| 314 | if (rc == -ENOBUFS) | ||
| 315 | return 0; | ||
| 316 | |||
| 317 | pfkey_terminate_dump(pfk); | ||
| 318 | return rc; | ||
| 319 | } | ||
| 320 | |||
| 313 | static inline void pfkey_hdr_dup(struct sadb_msg *new, struct sadb_msg *orig) | 321 | static inline void pfkey_hdr_dup(struct sadb_msg *new, struct sadb_msg *orig) | 
| 314 | { | 322 | { | 
| 315 | *new = *orig; | 323 | *new = *orig; | 
| diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index b599cbba4fbe..d68869f966c3 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
| @@ -1012,6 +1012,29 @@ end: | |||
| 1012 | return retval; | 1012 | return retval; | 
| 1013 | } | 1013 | } | 
| 1014 | 1014 | ||
| 1015 | struct sctp_chunk *sctp_make_violation_paramlen( | ||
| 1016 | const struct sctp_association *asoc, | ||
| 1017 | const struct sctp_chunk *chunk, | ||
| 1018 | struct sctp_paramhdr *param) | ||
| 1019 | { | ||
| 1020 | struct sctp_chunk *retval; | ||
| 1021 | static const char error[] = "The following parameter had invalid length:"; | ||
| 1022 | size_t payload_len = sizeof(error) + sizeof(sctp_errhdr_t) + | ||
| 1023 | sizeof(sctp_paramhdr_t); | ||
| 1024 | |||
| 1025 | retval = sctp_make_abort(asoc, chunk, payload_len); | ||
| 1026 | if (!retval) | ||
| 1027 | goto nodata; | ||
| 1028 | |||
| 1029 | sctp_init_cause(retval, SCTP_ERROR_PROTO_VIOLATION, | ||
| 1030 | sizeof(error) + sizeof(sctp_paramhdr_t)); | ||
| 1031 | sctp_addto_chunk(retval, sizeof(error), error); | ||
| 1032 | sctp_addto_param(retval, sizeof(sctp_paramhdr_t), param); | ||
| 1033 | |||
| 1034 | nodata: | ||
| 1035 | return retval; | ||
| 1036 | } | ||
| 1037 | |||
| 1015 | /* Make a HEARTBEAT chunk. */ | 1038 | /* Make a HEARTBEAT chunk. */ | 
| 1016 | struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *asoc, | 1039 | struct sctp_chunk *sctp_make_heartbeat(const struct sctp_association *asoc, | 
| 1017 | const struct sctp_transport *transport, | 1040 | const struct sctp_transport *transport, | 
| @@ -1782,11 +1805,6 @@ static int sctp_process_inv_paramlength(const struct sctp_association *asoc, | |||
| 1782 | const struct sctp_chunk *chunk, | 1805 | const struct sctp_chunk *chunk, | 
| 1783 | struct sctp_chunk **errp) | 1806 | struct sctp_chunk **errp) | 
| 1784 | { | 1807 | { | 
| 1785 | static const char error[] = "The following parameter had invalid length:"; | ||
| 1786 | size_t payload_len = WORD_ROUND(sizeof(error)) + | ||
| 1787 | sizeof(sctp_paramhdr_t); | ||
| 1788 | |||
| 1789 | |||
| 1790 | /* This is a fatal error. Any accumulated non-fatal errors are | 1808 | /* This is a fatal error. Any accumulated non-fatal errors are | 
| 1791 | * not reported. | 1809 | * not reported. | 
| 1792 | */ | 1810 | */ | 
| @@ -1794,14 +1812,7 @@ static int sctp_process_inv_paramlength(const struct sctp_association *asoc, | |||
| 1794 | sctp_chunk_free(*errp); | 1812 | sctp_chunk_free(*errp); | 
| 1795 | 1813 | ||
| 1796 | /* Create an error chunk and fill it in with our payload. */ | 1814 | /* Create an error chunk and fill it in with our payload. */ | 
| 1797 | *errp = sctp_make_op_error_space(asoc, chunk, payload_len); | 1815 | *errp = sctp_make_violation_paramlen(asoc, chunk, param); | 
| 1798 | |||
| 1799 | if (*errp) { | ||
| 1800 | sctp_init_cause(*errp, SCTP_ERROR_PROTO_VIOLATION, | ||
| 1801 | sizeof(error) + sizeof(sctp_paramhdr_t)); | ||
| 1802 | sctp_addto_chunk(*errp, sizeof(error), error); | ||
| 1803 | sctp_addto_param(*errp, sizeof(sctp_paramhdr_t), param); | ||
| 1804 | } | ||
| 1805 | 1816 | ||
| 1806 | return 0; | 1817 | return 0; | 
| 1807 | } | 1818 | } | 
| diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 8848d329aa2c..7c622af2ce55 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
| @@ -119,7 +119,7 @@ static sctp_disposition_t sctp_sf_violation_paramlen( | |||
| 119 | const struct sctp_endpoint *ep, | 119 | const struct sctp_endpoint *ep, | 
| 120 | const struct sctp_association *asoc, | 120 | const struct sctp_association *asoc, | 
| 121 | const sctp_subtype_t type, | 121 | const sctp_subtype_t type, | 
| 122 | void *arg, | 122 | void *arg, void *ext, | 
| 123 | sctp_cmd_seq_t *commands); | 123 | sctp_cmd_seq_t *commands); | 
| 124 | 124 | ||
| 125 | static sctp_disposition_t sctp_sf_violation_ctsn( | 125 | static sctp_disposition_t sctp_sf_violation_ctsn( | 
| @@ -3425,7 +3425,7 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep, | |||
| 3425 | addr_param = (union sctp_addr_param *)hdr->params; | 3425 | addr_param = (union sctp_addr_param *)hdr->params; | 
| 3426 | length = ntohs(addr_param->p.length); | 3426 | length = ntohs(addr_param->p.length); | 
| 3427 | if (length < sizeof(sctp_paramhdr_t)) | 3427 | if (length < sizeof(sctp_paramhdr_t)) | 
| 3428 | return sctp_sf_violation_paramlen(ep, asoc, type, | 3428 | return sctp_sf_violation_paramlen(ep, asoc, type, arg, | 
| 3429 | (void *)addr_param, commands); | 3429 | (void *)addr_param, commands); | 
| 3430 | 3430 | ||
| 3431 | /* Verify the ASCONF chunk before processing it. */ | 3431 | /* Verify the ASCONF chunk before processing it. */ | 
| @@ -3433,8 +3433,8 @@ sctp_disposition_t sctp_sf_do_asconf(const struct sctp_endpoint *ep, | |||
| 3433 | (sctp_paramhdr_t *)((void *)addr_param + length), | 3433 | (sctp_paramhdr_t *)((void *)addr_param + length), | 
| 3434 | (void *)chunk->chunk_end, | 3434 | (void *)chunk->chunk_end, | 
| 3435 | &err_param)) | 3435 | &err_param)) | 
| 3436 | return sctp_sf_violation_paramlen(ep, asoc, type, | 3436 | return sctp_sf_violation_paramlen(ep, asoc, type, arg, | 
| 3437 | (void *)&err_param, commands); | 3437 | (void *)err_param, commands); | 
| 3438 | 3438 | ||
| 3439 | /* ADDIP 5.2 E1) Compare the value of the serial number to the value | 3439 | /* ADDIP 5.2 E1) Compare the value of the serial number to the value | 
| 3440 | * the endpoint stored in a new association variable | 3440 | * the endpoint stored in a new association variable | 
| @@ -3542,8 +3542,8 @@ sctp_disposition_t sctp_sf_do_asconf_ack(const struct sctp_endpoint *ep, | |||
| 3542 | (sctp_paramhdr_t *)addip_hdr->params, | 3542 | (sctp_paramhdr_t *)addip_hdr->params, | 
| 3543 | (void *)asconf_ack->chunk_end, | 3543 | (void *)asconf_ack->chunk_end, | 
| 3544 | &err_param)) | 3544 | &err_param)) | 
| 3545 | return sctp_sf_violation_paramlen(ep, asoc, type, | 3545 | return sctp_sf_violation_paramlen(ep, asoc, type, arg, | 
| 3546 | (void *)&err_param, commands); | 3546 | (void *)err_param, commands); | 
| 3547 | 3547 | ||
| 3548 | if (last_asconf) { | 3548 | if (last_asconf) { | 
| 3549 | addip_hdr = (sctp_addiphdr_t *)last_asconf->subh.addip_hdr; | 3549 | addip_hdr = (sctp_addiphdr_t *)last_asconf->subh.addip_hdr; | 
| @@ -4240,12 +4240,38 @@ static sctp_disposition_t sctp_sf_violation_paramlen( | |||
| 4240 | const struct sctp_endpoint *ep, | 4240 | const struct sctp_endpoint *ep, | 
| 4241 | const struct sctp_association *asoc, | 4241 | const struct sctp_association *asoc, | 
| 4242 | const sctp_subtype_t type, | 4242 | const sctp_subtype_t type, | 
| 4243 | void *arg, | 4243 | void *arg, void *ext, | 
| 4244 | sctp_cmd_seq_t *commands) { | 4244 | sctp_cmd_seq_t *commands) | 
| 4245 | static const char err_str[] = "The following parameter had invalid length:"; | 4245 | { | 
| 4246 | struct sctp_chunk *chunk = arg; | ||
| 4247 | struct sctp_paramhdr *param = ext; | ||
| 4248 | struct sctp_chunk *abort = NULL; | ||
| 4246 | 4249 | ||
| 4247 | return sctp_sf_abort_violation(ep, asoc, arg, commands, err_str, | 4250 | if (sctp_auth_recv_cid(SCTP_CID_ABORT, asoc)) | 
| 4248 | sizeof(err_str)); | 4251 | goto discard; | 
| 4252 | |||
| 4253 | /* Make the abort chunk. */ | ||
| 4254 | abort = sctp_make_violation_paramlen(asoc, chunk, param); | ||
| 4255 | if (!abort) | ||
| 4256 | goto nomem; | ||
| 4257 | |||
| 4258 | sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort)); | ||
| 4259 | SCTP_INC_STATS(SCTP_MIB_OUTCTRLCHUNKS); | ||
| 4260 | |||
| 4261 | sctp_add_cmd_sf(commands, SCTP_CMD_SET_SK_ERR, | ||
| 4262 | SCTP_ERROR(ECONNABORTED)); | ||
| 4263 | sctp_add_cmd_sf(commands, SCTP_CMD_ASSOC_FAILED, | ||
| 4264 | SCTP_PERR(SCTP_ERROR_PROTO_VIOLATION)); | ||
| 4265 | SCTP_DEC_STATS(SCTP_MIB_CURRESTAB); | ||
| 4266 | |||
| 4267 | discard: | ||
| 4268 | sctp_sf_pdiscard(ep, asoc, SCTP_ST_CHUNK(0), arg, commands); | ||
| 4269 | |||
| 4270 | SCTP_INC_STATS(SCTP_MIB_ABORTEDS); | ||
| 4271 | |||
| 4272 | return SCTP_DISPOSITION_ABORT; | ||
| 4273 | nomem: | ||
| 4274 | return SCTP_DISPOSITION_NOMEM; | ||
| 4249 | } | 4275 | } | 
| 4250 | 4276 | ||
| 4251 | /* Handle a protocol violation when the peer trying to advance the | 4277 | /* Handle a protocol violation when the peer trying to advance the | 
| diff --git a/net/xfrm/xfrm_output.c b/net/xfrm/xfrm_output.c index ac25b4c0e982..dc50f1e71f76 100644 --- a/net/xfrm/xfrm_output.c +++ b/net/xfrm/xfrm_output.c | |||
| @@ -27,10 +27,14 @@ static int xfrm_state_check_space(struct xfrm_state *x, struct sk_buff *skb) | |||
| 27 | - skb_headroom(skb); | 27 | - skb_headroom(skb); | 
| 28 | int ntail = dst->dev->needed_tailroom - skb_tailroom(skb); | 28 | int ntail = dst->dev->needed_tailroom - skb_tailroom(skb); | 
| 29 | 29 | ||
| 30 | if (nhead > 0 || ntail > 0) | 30 | if (nhead <= 0) { | 
| 31 | return pskb_expand_head(skb, nhead, ntail, GFP_ATOMIC); | 31 | if (ntail <= 0) | 
| 32 | 32 | return 0; | |
| 33 | return 0; | 33 | nhead = 0; | 
| 34 | } else if (ntail < 0) | ||
| 35 | ntail = 0; | ||
| 36 | |||
| 37 | return pskb_expand_head(skb, nhead, ntail, GFP_ATOMIC); | ||
| 34 | } | 38 | } | 
| 35 | 39 | ||
| 36 | static int xfrm_output_one(struct sk_buff *skb, int err) | 40 | static int xfrm_output_one(struct sk_buff *skb, int err) | 
| diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c index d11a8154500f..8551952ef329 100644 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c | |||
| @@ -2737,6 +2737,7 @@ int security_netlbl_secattr_to_sid(struct netlbl_lsm_secattr *secattr, | |||
| 2737 | if (ctx == NULL) | 2737 | if (ctx == NULL) | 
| 2738 | goto netlbl_secattr_to_sid_return; | 2738 | goto netlbl_secattr_to_sid_return; | 
| 2739 | 2739 | ||
| 2740 | context_init(&ctx_new); | ||
| 2740 | ctx_new.user = ctx->user; | 2741 | ctx_new.user = ctx->user; | 
| 2741 | ctx_new.role = ctx->role; | 2742 | ctx_new.role = ctx->role; | 
| 2742 | ctx_new.type = ctx->type; | 2743 | ctx_new.type = ctx->type; | 
| @@ -2745,13 +2746,9 @@ int security_netlbl_secattr_to_sid(struct netlbl_lsm_secattr *secattr, | |||
| 2745 | if (ebitmap_netlbl_import(&ctx_new.range.level[0].cat, | 2746 | if (ebitmap_netlbl_import(&ctx_new.range.level[0].cat, | 
| 2746 | secattr->attr.mls.cat) != 0) | 2747 | secattr->attr.mls.cat) != 0) | 
| 2747 | goto netlbl_secattr_to_sid_return; | 2748 | goto netlbl_secattr_to_sid_return; | 
| 2748 | ctx_new.range.level[1].cat.highbit = | 2749 | memcpy(&ctx_new.range.level[1].cat, | 
| 2749 | ctx_new.range.level[0].cat.highbit; | 2750 | &ctx_new.range.level[0].cat, | 
| 2750 | ctx_new.range.level[1].cat.node = | 2751 | sizeof(ctx_new.range.level[0].cat)); | 
| 2751 | ctx_new.range.level[0].cat.node; | ||
| 2752 | } else { | ||
| 2753 | ebitmap_init(&ctx_new.range.level[0].cat); | ||
| 2754 | ebitmap_init(&ctx_new.range.level[1].cat); | ||
| 2755 | } | 2752 | } | 
| 2756 | if (mls_context_isvalid(&policydb, &ctx_new) != 1) | 2753 | if (mls_context_isvalid(&policydb, &ctx_new) != 1) | 
| 2757 | goto netlbl_secattr_to_sid_return_cleanup; | 2754 | goto netlbl_secattr_to_sid_return_cleanup; | 
| diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index ad994fcab725..f3da621f25c5 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -1683,8 +1683,8 @@ static struct snd_pci_quirk stac927x_cfg_tbl[] = { | |||
| 1683 | /* Dell 3 stack systems with verb table in BIOS */ | 1683 | /* Dell 3 stack systems with verb table in BIOS */ | 
| 1684 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS), | 1684 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS), | 
| 1685 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0227, "Dell Vostro 1400 ", STAC_DELL_BIOS), | 1685 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0227, "Dell Vostro 1400 ", STAC_DELL_BIOS), | 
| 1686 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022f, "Dell ", STAC_DELL_BIOS), | ||
| 1687 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022e, "Dell ", STAC_DELL_BIOS), | 1686 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022e, "Dell ", STAC_DELL_BIOS), | 
| 1687 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x022f, "Dell Inspiron 1525", STAC_DELL_3ST), | ||
| 1688 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0242, "Dell ", STAC_DELL_BIOS), | 1688 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0242, "Dell ", STAC_DELL_BIOS), | 
| 1689 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0243, "Dell ", STAC_DELL_BIOS), | 1689 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0243, "Dell ", STAC_DELL_BIOS), | 
| 1690 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ff, "Dell ", STAC_DELL_BIOS), | 1690 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02ff, "Dell ", STAC_DELL_BIOS), | 
| diff --git a/sound/ppc/awacs.c b/sound/ppc/awacs.c index 566a6d0daf4a..106c48225bba 100644 --- a/sound/ppc/awacs.c +++ b/sound/ppc/awacs.c | |||
| @@ -621,6 +621,13 @@ static struct snd_kcontrol_new snd_pmac_screamer_mixers_imac[] __initdata = { | |||
| 621 | AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0), | 621 | AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0), | 
| 622 | }; | 622 | }; | 
| 623 | 623 | ||
| 624 | static struct snd_kcontrol_new snd_pmac_screamer_mixers_g4agp[] __initdata = { | ||
| 625 | AWACS_VOLUME("Line out Playback Volume", 2, 6, 1), | ||
| 626 | AWACS_VOLUME("Master Playback Volume", 5, 6, 1), | ||
| 627 | AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0), | ||
| 628 | AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0), | ||
| 629 | }; | ||
| 630 | |||
| 624 | static struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac7500[] __initdata = { | 631 | static struct snd_kcontrol_new snd_pmac_awacs_mixers_pmac7500[] __initdata = { | 
| 625 | AWACS_VOLUME("Line out Playback Volume", 2, 6, 1), | 632 | AWACS_VOLUME("Line out Playback Volume", 2, 6, 1), | 
| 626 | AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0), | 633 | AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0), | 
| @@ -688,7 +695,10 @@ static struct snd_kcontrol_new snd_pmac_awacs_speaker_vol[] __initdata = { | |||
| 688 | static struct snd_kcontrol_new snd_pmac_awacs_speaker_sw __initdata = | 695 | static struct snd_kcontrol_new snd_pmac_awacs_speaker_sw __initdata = | 
| 689 | AWACS_SWITCH("PC Speaker Playback Switch", 1, SHIFT_SPKMUTE, 1); | 696 | AWACS_SWITCH("PC Speaker Playback Switch", 1, SHIFT_SPKMUTE, 1); | 
| 690 | 697 | ||
| 691 | static struct snd_kcontrol_new snd_pmac_awacs_speaker_sw_imac __initdata = | 698 | static struct snd_kcontrol_new snd_pmac_awacs_speaker_sw_imac1 __initdata = | 
| 699 | AWACS_SWITCH("PC Speaker Playback Switch", 1, SHIFT_PAROUT1, 1); | ||
| 700 | |||
| 701 | static struct snd_kcontrol_new snd_pmac_awacs_speaker_sw_imac2 __initdata = | ||
| 692 | AWACS_SWITCH("PC Speaker Playback Switch", 1, SHIFT_PAROUT1, 0); | 702 | AWACS_SWITCH("PC Speaker Playback Switch", 1, SHIFT_PAROUT1, 0); | 
| 693 | 703 | ||
| 694 | 704 | ||
| @@ -765,11 +775,12 @@ static void snd_pmac_awacs_resume(struct snd_pmac *chip) | |||
| 765 | 775 | ||
| 766 | #define IS_PM7500 (machine_is_compatible("AAPL,7500")) | 776 | #define IS_PM7500 (machine_is_compatible("AAPL,7500")) | 
| 767 | #define IS_BEIGE (machine_is_compatible("AAPL,Gossamer")) | 777 | #define IS_BEIGE (machine_is_compatible("AAPL,Gossamer")) | 
| 768 | #define IS_IMAC (machine_is_compatible("PowerMac2,1") \ | 778 | #define IS_IMAC1 (machine_is_compatible("PowerMac2,1")) | 
| 769 | || machine_is_compatible("PowerMac2,2") \ | 779 | #define IS_IMAC2 (machine_is_compatible("PowerMac2,2") \ | 
| 770 | || machine_is_compatible("PowerMac4,1")) | 780 | || machine_is_compatible("PowerMac4,1")) | 
| 781 | #define IS_G4AGP (machine_is_compatible("PowerMac3,1")) | ||
| 771 | 782 | ||
| 772 | static int imac; | 783 | static int imac1, imac2; | 
| 773 | 784 | ||
| 774 | #ifdef PMAC_SUPPORT_AUTOMUTE | 785 | #ifdef PMAC_SUPPORT_AUTOMUTE | 
| 775 | /* | 786 | /* | 
| @@ -815,13 +826,18 @@ static void snd_pmac_awacs_update_automute(struct snd_pmac *chip, int do_notify) | |||
| 815 | { | 826 | { | 
| 816 | int reg = chip->awacs_reg[1] | 827 | int reg = chip->awacs_reg[1] | 
| 817 | | (MASK_HDMUTE | MASK_SPKMUTE); | 828 | | (MASK_HDMUTE | MASK_SPKMUTE); | 
| 818 | if (imac) { | 829 | if (imac1) { | 
| 830 | reg &= ~MASK_SPKMUTE; | ||
| 831 | reg |= MASK_PAROUT1; | ||
| 832 | } else if (imac2) { | ||
| 819 | reg &= ~MASK_SPKMUTE; | 833 | reg &= ~MASK_SPKMUTE; | 
| 820 | reg &= ~MASK_PAROUT1; | 834 | reg &= ~MASK_PAROUT1; | 
| 821 | } | 835 | } | 
| 822 | if (snd_pmac_awacs_detect_headphone(chip)) | 836 | if (snd_pmac_awacs_detect_headphone(chip)) | 
| 823 | reg &= ~MASK_HDMUTE; | 837 | reg &= ~MASK_HDMUTE; | 
| 824 | else if (imac) | 838 | else if (imac1) | 
| 839 | reg &= ~MASK_PAROUT1; | ||
| 840 | else if (imac2) | ||
| 825 | reg |= MASK_PAROUT1; | 841 | reg |= MASK_PAROUT1; | 
| 826 | else | 842 | else | 
| 827 | reg &= ~MASK_SPKMUTE; | 843 | reg &= ~MASK_SPKMUTE; | 
| @@ -850,9 +866,13 @@ snd_pmac_awacs_init(struct snd_pmac *chip) | |||
| 850 | { | 866 | { | 
| 851 | int pm7500 = IS_PM7500; | 867 | int pm7500 = IS_PM7500; | 
| 852 | int beige = IS_BEIGE; | 868 | int beige = IS_BEIGE; | 
| 869 | int g4agp = IS_G4AGP; | ||
| 870 | int imac; | ||
| 853 | int err, vol; | 871 | int err, vol; | 
| 854 | 872 | ||
| 855 | imac = IS_IMAC; | 873 | imac1 = IS_IMAC1; | 
| 874 | imac2 = IS_IMAC2; | ||
| 875 | imac = imac1 || imac2; | ||
| 856 | /* looks like MASK_GAINLINE triggers something, so we set here | 876 | /* looks like MASK_GAINLINE triggers something, so we set here | 
| 857 | * as start-up | 877 | * as start-up | 
| 858 | */ | 878 | */ | 
| @@ -939,7 +959,7 @@ snd_pmac_awacs_init(struct snd_pmac *chip) | |||
| 939 | snd_pmac_awacs_mixers); | 959 | snd_pmac_awacs_mixers); | 
| 940 | if (err < 0) | 960 | if (err < 0) | 
| 941 | return err; | 961 | return err; | 
| 942 | if (beige) | 962 | if (beige || g4agp) | 
| 943 | ; | 963 | ; | 
| 944 | else if (chip->model == PMAC_SCREAMER) | 964 | else if (chip->model == PMAC_SCREAMER) | 
| 945 | err = build_mixers(chip, ARRAY_SIZE(snd_pmac_screamer_mixers2), | 965 | err = build_mixers(chip, ARRAY_SIZE(snd_pmac_screamer_mixers2), | 
| @@ -961,13 +981,17 @@ snd_pmac_awacs_init(struct snd_pmac *chip) | |||
| 961 | err = build_mixers(chip, | 981 | err = build_mixers(chip, | 
| 962 | ARRAY_SIZE(snd_pmac_screamer_mixers_imac), | 982 | ARRAY_SIZE(snd_pmac_screamer_mixers_imac), | 
| 963 | snd_pmac_screamer_mixers_imac); | 983 | snd_pmac_screamer_mixers_imac); | 
| 984 | else if (g4agp) | ||
| 985 | err = build_mixers(chip, | ||
| 986 | ARRAY_SIZE(snd_pmac_screamer_mixers_g4agp), | ||
| 987 | snd_pmac_screamer_mixers_g4agp); | ||
| 964 | else | 988 | else | 
| 965 | err = build_mixers(chip, | 989 | err = build_mixers(chip, | 
| 966 | ARRAY_SIZE(snd_pmac_awacs_mixers_pmac), | 990 | ARRAY_SIZE(snd_pmac_awacs_mixers_pmac), | 
| 967 | snd_pmac_awacs_mixers_pmac); | 991 | snd_pmac_awacs_mixers_pmac); | 
| 968 | if (err < 0) | 992 | if (err < 0) | 
| 969 | return err; | 993 | return err; | 
| 970 | chip->master_sw_ctl = snd_ctl_new1((pm7500 || imac) | 994 | chip->master_sw_ctl = snd_ctl_new1((pm7500 || imac || g4agp) | 
| 971 | ? &snd_pmac_awacs_master_sw_imac | 995 | ? &snd_pmac_awacs_master_sw_imac | 
| 972 | : &snd_pmac_awacs_master_sw, chip); | 996 | : &snd_pmac_awacs_master_sw, chip); | 
| 973 | err = snd_ctl_add(chip->card, chip->master_sw_ctl); | 997 | err = snd_ctl_add(chip->card, chip->master_sw_ctl); | 
| @@ -1004,15 +1028,17 @@ snd_pmac_awacs_init(struct snd_pmac *chip) | |||
| 1004 | snd_pmac_awacs_speaker_vol); | 1028 | snd_pmac_awacs_speaker_vol); | 
| 1005 | if (err < 0) | 1029 | if (err < 0) | 
| 1006 | return err; | 1030 | return err; | 
| 1007 | chip->speaker_sw_ctl = snd_ctl_new1(imac | 1031 | chip->speaker_sw_ctl = snd_ctl_new1(imac1 | 
| 1008 | ? &snd_pmac_awacs_speaker_sw_imac | 1032 | ? &snd_pmac_awacs_speaker_sw_imac1 | 
| 1033 | : imac2 | ||
| 1034 | ? &snd_pmac_awacs_speaker_sw_imac2 | ||
| 1009 | : &snd_pmac_awacs_speaker_sw, chip); | 1035 | : &snd_pmac_awacs_speaker_sw, chip); | 
| 1010 | err = snd_ctl_add(chip->card, chip->speaker_sw_ctl); | 1036 | err = snd_ctl_add(chip->card, chip->speaker_sw_ctl); | 
| 1011 | if (err < 0) | 1037 | if (err < 0) | 
| 1012 | return err; | 1038 | return err; | 
| 1013 | } | 1039 | } | 
| 1014 | 1040 | ||
| 1015 | if (beige) | 1041 | if (beige || g4agp) | 
| 1016 | err = build_mixers(chip, | 1042 | err = build_mixers(chip, | 
| 1017 | ARRAY_SIZE(snd_pmac_screamer_mic_boost_beige), | 1043 | ARRAY_SIZE(snd_pmac_screamer_mic_boost_beige), | 
| 1018 | snd_pmac_screamer_mic_boost_beige); | 1044 | snd_pmac_screamer_mic_boost_beige); | 
| diff --git a/sound/soc/codecs/cs4270.c b/sound/soc/codecs/cs4270.c index d68650de39bc..0bbd94501d7e 100644 --- a/sound/soc/codecs/cs4270.c +++ b/sound/soc/codecs/cs4270.c | |||
| @@ -681,7 +681,7 @@ static int cs4270_probe(struct platform_device *pdev) | |||
| 681 | ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); | 681 | ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1); | 
| 682 | if (ret < 0) { | 682 | if (ret < 0) { | 
| 683 | printk(KERN_ERR "cs4270: failed to create PCMs\n"); | 683 | printk(KERN_ERR "cs4270: failed to create PCMs\n"); | 
| 684 | return ret; | 684 | goto error_free_codec; | 
| 685 | } | 685 | } | 
| 686 | 686 | ||
| 687 | #ifdef USE_I2C | 687 | #ifdef USE_I2C | 
| @@ -690,8 +690,7 @@ static int cs4270_probe(struct platform_device *pdev) | |||
| 690 | ret = i2c_add_driver(&cs4270_i2c_driver); | 690 | ret = i2c_add_driver(&cs4270_i2c_driver); | 
| 691 | if (ret) { | 691 | if (ret) { | 
| 692 | printk(KERN_ERR "cs4270: failed to attach driver"); | 692 | printk(KERN_ERR "cs4270: failed to attach driver"); | 
| 693 | snd_soc_free_pcms(socdev); | 693 | goto error_free_pcms; | 
| 694 | return ret; | ||
| 695 | } | 694 | } | 
| 696 | 695 | ||
| 697 | /* Did we find a CS4270 on the I2C bus? */ | 696 | /* Did we find a CS4270 on the I2C bus? */ | 
| @@ -713,10 +712,23 @@ static int cs4270_probe(struct platform_device *pdev) | |||
| 713 | ret = snd_soc_register_card(socdev); | 712 | ret = snd_soc_register_card(socdev); | 
| 714 | if (ret < 0) { | 713 | if (ret < 0) { | 
| 715 | printk(KERN_ERR "cs4270: failed to register card\n"); | 714 | printk(KERN_ERR "cs4270: failed to register card\n"); | 
| 716 | snd_soc_free_pcms(socdev); | 715 | goto error_del_driver; | 
| 717 | return ret; | ||
| 718 | } | 716 | } | 
| 719 | 717 | ||
| 718 | return 0; | ||
| 719 | |||
| 720 | error_del_driver: | ||
| 721 | #ifdef USE_I2C | ||
| 722 | i2c_del_driver(&cs4270_i2c_driver); | ||
| 723 | |||
| 724 | error_free_pcms: | ||
| 725 | #endif | ||
| 726 | snd_soc_free_pcms(socdev); | ||
| 727 | |||
| 728 | error_free_codec: | ||
| 729 | kfree(socdev->codec); | ||
| 730 | socdev->codec = NULL; | ||
| 731 | |||
| 720 | return ret; | 732 | return ret; | 
| 721 | } | 733 | } | 
| 722 | 734 | ||
| @@ -727,8 +739,7 @@ static int cs4270_remove(struct platform_device *pdev) | |||
| 727 | snd_soc_free_pcms(socdev); | 739 | snd_soc_free_pcms(socdev); | 
| 728 | 740 | ||
| 729 | #ifdef USE_I2C | 741 | #ifdef USE_I2C | 
| 730 | if (socdev->codec->control_data) | 742 | i2c_del_driver(&cs4270_i2c_driver); | 
| 731 | i2c_del_driver(&cs4270_i2c_driver); | ||
| 732 | #endif | 743 | #endif | 
| 733 | 744 | ||
| 734 | kfree(socdev->codec); | 745 | kfree(socdev->codec); | 
| diff --git a/sound/soc/codecs/wm8753.c b/sound/soc/codecs/wm8753.c index 5761164fe16d..e873414840c8 100644 --- a/sound/soc/codecs/wm8753.c +++ b/sound/soc/codecs/wm8753.c | |||
| @@ -583,7 +583,7 @@ static const struct snd_soc_dapm_route audio_map[] = { | |||
| 583 | 583 | ||
| 584 | /* out 4 */ | 584 | /* out 4 */ | 
| 585 | {"Out4 Mux", "VREF", "VREF"}, | 585 | {"Out4 Mux", "VREF", "VREF"}, | 
| 586 | {"Out4 Mux", "Capture ST", "Capture ST Mixer"}, | 586 | {"Out4 Mux", "Capture ST", "Playback Mixer"}, | 
| 587 | {"Out4 Mux", "LOUT2", "LOUT2"}, | 587 | {"Out4 Mux", "LOUT2", "LOUT2"}, | 
| 588 | {"Out 4", NULL, "Out4 Mux"}, | 588 | {"Out 4", NULL, "Out4 Mux"}, | 
| 589 | {"OUT4", NULL, "Out 4"}, | 589 | {"OUT4", NULL, "Out 4"}, | 
| @@ -607,7 +607,7 @@ static const struct snd_soc_dapm_route audio_map[] = { | |||
| 607 | /* Capture Right Mux */ | 607 | /* Capture Right Mux */ | 
| 608 | {"Capture Right Mux", "PGA", "Right Capture Volume"}, | 608 | {"Capture Right Mux", "PGA", "Right Capture Volume"}, | 
| 609 | {"Capture Right Mux", "Line or RXP-RXN", "Line Right Mux"}, | 609 | {"Capture Right Mux", "Line or RXP-RXN", "Line Right Mux"}, | 
| 610 | {"Capture Right Mux", "Sidetone", "Capture ST Mixer"}, | 610 | {"Capture Right Mux", "Sidetone", "Playback Mixer"}, | 
| 611 | 611 | ||
| 612 | /* Mono Capture mixer-mux */ | 612 | /* Mono Capture mixer-mux */ | 
| 613 | {"Capture Right Mixer", "Stereo", "Capture Right Mux"}, | 613 | {"Capture Right Mixer", "Stereo", "Capture Right Mux"}, | 
