diff options
411 files changed, 12138 insertions, 11447 deletions
diff --git a/Documentation/cputopology.txt b/Documentation/cputopology.txt index 45932ec21cee..b41f3e58aefa 100644 --- a/Documentation/cputopology.txt +++ b/Documentation/cputopology.txt | |||
| @@ -18,11 +18,11 @@ For an architecture to support this feature, it must define some of | |||
| 18 | these macros in include/asm-XXX/topology.h: | 18 | these macros in include/asm-XXX/topology.h: |
| 19 | #define topology_physical_package_id(cpu) | 19 | #define topology_physical_package_id(cpu) |
| 20 | #define topology_core_id(cpu) | 20 | #define topology_core_id(cpu) |
| 21 | #define topology_thread_siblings(cpu) | 21 | #define topology_thread_cpumask(cpu) |
| 22 | #define topology_core_siblings(cpu) | 22 | #define topology_core_cpumask(cpu) |
| 23 | 23 | ||
| 24 | The type of **_id is int. | 24 | The type of **_id is int. |
| 25 | The type of siblings is cpumask_t. | 25 | The type of siblings is (const) struct cpumask *. |
| 26 | 26 | ||
| 27 | To be consistent on all architectures, include/linux/topology.h | 27 | To be consistent on all architectures, include/linux/topology.h |
| 28 | provides default definitions for any of the above macros that are | 28 | provides default definitions for any of the above macros that are |
diff --git a/Documentation/x86/boot.txt b/Documentation/x86/boot.txt index 7b4596ac4120..12299697b7cd 100644 --- a/Documentation/x86/boot.txt +++ b/Documentation/x86/boot.txt | |||
| @@ -158,7 +158,7 @@ Offset Proto Name Meaning | |||
| 158 | 0202/4 2.00+ header Magic signature "HdrS" | 158 | 0202/4 2.00+ header Magic signature "HdrS" |
| 159 | 0206/2 2.00+ version Boot protocol version supported | 159 | 0206/2 2.00+ version Boot protocol version supported |
| 160 | 0208/4 2.00+ realmode_swtch Boot loader hook (see below) | 160 | 0208/4 2.00+ realmode_swtch Boot loader hook (see below) |
| 161 | 020C/2 2.00+ start_sys The load-low segment (0x1000) (obsolete) | 161 | 020C/2 2.00+ start_sys_seg The load-low segment (0x1000) (obsolete) |
| 162 | 020E/2 2.00+ kernel_version Pointer to kernel version string | 162 | 020E/2 2.00+ kernel_version Pointer to kernel version string |
| 163 | 0210/1 2.00+ type_of_loader Boot loader identifier | 163 | 0210/1 2.00+ type_of_loader Boot loader identifier |
| 164 | 0211/1 2.00+ loadflags Boot protocol option flags | 164 | 0211/1 2.00+ loadflags Boot protocol option flags |
| @@ -170,10 +170,11 @@ Offset Proto Name Meaning | |||
| 170 | 0224/2 2.01+ heap_end_ptr Free memory after setup end | 170 | 0224/2 2.01+ heap_end_ptr Free memory after setup end |
| 171 | 0226/2 N/A pad1 Unused | 171 | 0226/2 N/A pad1 Unused |
| 172 | 0228/4 2.02+ cmd_line_ptr 32-bit pointer to the kernel command line | 172 | 0228/4 2.02+ cmd_line_ptr 32-bit pointer to the kernel command line |
| 173 | 022C/4 2.03+ initrd_addr_max Highest legal initrd address | 173 | 022C/4 2.03+ ramdisk_max Highest legal initrd address |
| 174 | 0230/4 2.05+ kernel_alignment Physical addr alignment required for kernel | 174 | 0230/4 2.05+ kernel_alignment Physical addr alignment required for kernel |
| 175 | 0234/1 2.05+ relocatable_kernel Whether kernel is relocatable or not | 175 | 0234/1 2.05+ relocatable_kernel Whether kernel is relocatable or not |
| 176 | 0235/3 N/A pad2 Unused | 176 | 0235/1 N/A pad2 Unused |
| 177 | 0236/2 N/A pad3 Unused | ||
| 177 | 0238/4 2.06+ cmdline_size Maximum size of the kernel command line | 178 | 0238/4 2.06+ cmdline_size Maximum size of the kernel command line |
| 178 | 023C/4 2.07+ hardware_subarch Hardware subarchitecture | 179 | 023C/4 2.07+ hardware_subarch Hardware subarchitecture |
| 179 | 0240/8 2.07+ hardware_subarch_data Subarchitecture-specific data | 180 | 0240/8 2.07+ hardware_subarch_data Subarchitecture-specific data |
| @@ -299,14 +300,14 @@ Protocol: 2.00+ | |||
| 299 | e.g. 0x0204 for version 2.04, and 0x0a11 for a hypothetical version | 300 | e.g. 0x0204 for version 2.04, and 0x0a11 for a hypothetical version |
| 300 | 10.17. | 301 | 10.17. |
| 301 | 302 | ||
| 302 | Field name: readmode_swtch | 303 | Field name: realmode_swtch |
| 303 | Type: modify (optional) | 304 | Type: modify (optional) |
| 304 | Offset/size: 0x208/4 | 305 | Offset/size: 0x208/4 |
| 305 | Protocol: 2.00+ | 306 | Protocol: 2.00+ |
| 306 | 307 | ||
| 307 | Boot loader hook (see ADVANCED BOOT LOADER HOOKS below.) | 308 | Boot loader hook (see ADVANCED BOOT LOADER HOOKS below.) |
| 308 | 309 | ||
| 309 | Field name: start_sys | 310 | Field name: start_sys_seg |
| 310 | Type: read | 311 | Type: read |
| 311 | Offset/size: 0x20c/2 | 312 | Offset/size: 0x20c/2 |
| 312 | Protocol: 2.00+ | 313 | Protocol: 2.00+ |
| @@ -468,7 +469,7 @@ Protocol: 2.02+ | |||
| 468 | zero, the kernel will assume that your boot loader does not support | 469 | zero, the kernel will assume that your boot loader does not support |
| 469 | the 2.02+ protocol. | 470 | the 2.02+ protocol. |
| 470 | 471 | ||
| 471 | Field name: initrd_addr_max | 472 | Field name: ramdisk_max |
| 472 | Type: read | 473 | Type: read |
| 473 | Offset/size: 0x22c/4 | 474 | Offset/size: 0x22c/4 |
| 474 | Protocol: 2.03+ | 475 | Protocol: 2.03+ |
| @@ -533,8 +533,9 @@ KBUILD_CFLAGS += $(call cc-option,-Wframe-larger-than=${CONFIG_FRAME_WARN}) | |||
| 533 | endif | 533 | endif |
| 534 | 534 | ||
| 535 | # Force gcc to behave correct even for buggy distributions | 535 | # Force gcc to behave correct even for buggy distributions |
| 536 | # Arch Makefiles may override this setting | 536 | ifndef CONFIG_CC_STACKPROTECTOR |
| 537 | KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector) | 537 | KBUILD_CFLAGS += $(call cc-option, -fno-stack-protector) |
| 538 | endif | ||
| 538 | 539 | ||
| 539 | ifdef CONFIG_FRAME_POINTER | 540 | ifdef CONFIG_FRAME_POINTER |
| 540 | KBUILD_CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls | 541 | KBUILD_CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls |
diff --git a/arch/alpha/include/asm/statfs.h b/arch/alpha/include/asm/statfs.h index de35cd438a10..ccd2e186bfd8 100644 --- a/arch/alpha/include/asm/statfs.h +++ b/arch/alpha/include/asm/statfs.h | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | #ifndef _ALPHA_STATFS_H | 1 | #ifndef _ALPHA_STATFS_H |
| 2 | #define _ALPHA_STATFS_H | 2 | #define _ALPHA_STATFS_H |
| 3 | 3 | ||
| 4 | #include <linux/types.h> | ||
| 5 | |||
| 4 | /* Alpha is the only 64-bit platform with 32-bit statfs. And doesn't | 6 | /* Alpha is the only 64-bit platform with 32-bit statfs. And doesn't |
| 5 | even seem to implement statfs64 */ | 7 | even seem to implement statfs64 */ |
| 6 | #define __statfs_word __u32 | 8 | #define __statfs_word __u32 |
diff --git a/arch/alpha/include/asm/swab.h b/arch/alpha/include/asm/swab.h index 68e7089e02d5..4d682b16c7c4 100644 --- a/arch/alpha/include/asm/swab.h +++ b/arch/alpha/include/asm/swab.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifndef _ALPHA_SWAB_H | 1 | #ifndef _ALPHA_SWAB_H |
| 2 | #define _ALPHA_SWAB_H | 2 | #define _ALPHA_SWAB_H |
| 3 | 3 | ||
| 4 | #include <asm/types.h> | 4 | #include <linux/types.h> |
| 5 | #include <linux/compiler.h> | 5 | #include <linux/compiler.h> |
| 6 | #include <asm/compiler.h> | 6 | #include <asm/compiler.h> |
| 7 | 7 | ||
diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c index 703731accda6..7bc7489223f3 100644 --- a/arch/alpha/kernel/irq.c +++ b/arch/alpha/kernel/irq.c | |||
| @@ -55,7 +55,7 @@ int irq_select_affinity(unsigned int irq) | |||
| 55 | cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0); | 55 | cpu = (cpu < (NR_CPUS-1) ? cpu + 1 : 0); |
| 56 | last_cpu = cpu; | 56 | last_cpu = cpu; |
| 57 | 57 | ||
| 58 | irq_desc[irq].affinity = cpumask_of_cpu(cpu); | 58 | cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu)); |
| 59 | irq_desc[irq].chip->set_affinity(irq, cpumask_of(cpu)); | 59 | irq_desc[irq].chip->set_affinity(irq, cpumask_of(cpu)); |
| 60 | return 0; | 60 | return 0; |
| 61 | } | 61 | } |
diff --git a/arch/arm/include/asm/a.out.h b/arch/arm/include/asm/a.out.h index 79489fdcc8b8..083894b2e3bc 100644 --- a/arch/arm/include/asm/a.out.h +++ b/arch/arm/include/asm/a.out.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | #define __ARM_A_OUT_H__ | 2 | #define __ARM_A_OUT_H__ |
| 3 | 3 | ||
| 4 | #include <linux/personality.h> | 4 | #include <linux/personality.h> |
| 5 | #include <asm/types.h> | 5 | #include <linux/types.h> |
| 6 | 6 | ||
| 7 | struct exec | 7 | struct exec |
| 8 | { | 8 | { |
diff --git a/arch/arm/include/asm/setup.h b/arch/arm/include/asm/setup.h index f2cd18a0932b..ee1304f22f94 100644 --- a/arch/arm/include/asm/setup.h +++ b/arch/arm/include/asm/setup.h | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | #ifndef __ASMARM_SETUP_H | 14 | #ifndef __ASMARM_SETUP_H |
| 15 | #define __ASMARM_SETUP_H | 15 | #define __ASMARM_SETUP_H |
| 16 | 16 | ||
| 17 | #include <asm/types.h> | 17 | #include <linux/types.h> |
| 18 | 18 | ||
| 19 | #define COMMAND_LINE_SIZE 1024 | 19 | #define COMMAND_LINE_SIZE 1024 |
| 20 | 20 | ||
diff --git a/arch/arm/include/asm/swab.h b/arch/arm/include/asm/swab.h index 27a689be0856..ca2bf2f6d6ea 100644 --- a/arch/arm/include/asm/swab.h +++ b/arch/arm/include/asm/swab.h | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | #define __ASM_ARM_SWAB_H | 16 | #define __ASM_ARM_SWAB_H |
| 17 | 17 | ||
| 18 | #include <linux/compiler.h> | 18 | #include <linux/compiler.h> |
| 19 | #include <asm/types.h> | 19 | #include <linux/types.h> |
| 20 | 20 | ||
| 21 | #if !defined(__STRICT_ANSI__) || defined(__KERNEL__) | 21 | #if !defined(__STRICT_ANSI__) || defined(__KERNEL__) |
| 22 | # define __SWAB_64_THRU_32__ | 22 | # define __SWAB_64_THRU_32__ |
diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 363db186cb93..45eacb5a2ecd 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c | |||
| @@ -104,6 +104,11 @@ static struct irq_desc bad_irq_desc = { | |||
| 104 | .lock = __SPIN_LOCK_UNLOCKED(bad_irq_desc.lock), | 104 | .lock = __SPIN_LOCK_UNLOCKED(bad_irq_desc.lock), |
| 105 | }; | 105 | }; |
| 106 | 106 | ||
| 107 | #ifdef CONFIG_CPUMASK_OFFSTACK | ||
| 108 | /* We are not allocating bad_irq_desc.affinity or .pending_mask */ | ||
| 109 | #error "ARM architecture does not support CONFIG_CPUMASK_OFFSTACK." | ||
| 110 | #endif | ||
| 111 | |||
| 107 | /* | 112 | /* |
| 108 | * do_IRQ handles all hardware IRQ's. Decoded IRQs should not | 113 | * do_IRQ handles all hardware IRQ's. Decoded IRQs should not |
| 109 | * come via this function. Instead, they should provide their | 114 | * come via this function. Instead, they should provide their |
| @@ -161,7 +166,7 @@ void __init init_IRQ(void) | |||
| 161 | irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_NOPROBE; | 166 | irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_NOPROBE; |
| 162 | 167 | ||
| 163 | #ifdef CONFIG_SMP | 168 | #ifdef CONFIG_SMP |
| 164 | bad_irq_desc.affinity = CPU_MASK_ALL; | 169 | cpumask_setall(bad_irq_desc.affinity); |
| 165 | bad_irq_desc.cpu = smp_processor_id(); | 170 | bad_irq_desc.cpu = smp_processor_id(); |
| 166 | #endif | 171 | #endif |
| 167 | init_arch_irq(); | 172 | init_arch_irq(); |
| @@ -191,15 +196,16 @@ void migrate_irqs(void) | |||
| 191 | struct irq_desc *desc = irq_desc + i; | 196 | struct irq_desc *desc = irq_desc + i; |
| 192 | 197 | ||
| 193 | if (desc->cpu == cpu) { | 198 | if (desc->cpu == cpu) { |
| 194 | unsigned int newcpu = any_online_cpu(desc->affinity); | 199 | unsigned int newcpu = cpumask_any_and(desc->affinity, |
| 195 | 200 | cpu_online_mask); | |
| 196 | if (newcpu == NR_CPUS) { | 201 | if (newcpu >= nr_cpu_ids) { |
| 197 | if (printk_ratelimit()) | 202 | if (printk_ratelimit()) |
| 198 | printk(KERN_INFO "IRQ%u no longer affine to CPU%u\n", | 203 | printk(KERN_INFO "IRQ%u no longer affine to CPU%u\n", |
| 199 | i, cpu); | 204 | i, cpu); |
| 200 | 205 | ||
| 201 | cpus_setall(desc->affinity); | 206 | cpumask_setall(desc->affinity); |
| 202 | newcpu = any_online_cpu(desc->affinity); | 207 | newcpu = cpumask_any_and(desc->affinity, |
| 208 | cpu_online_mask); | ||
| 203 | } | 209 | } |
| 204 | 210 | ||
| 205 | route_irq(desc, i, newcpu); | 211 | route_irq(desc, i, newcpu); |
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 00216071eaf7..85598f7da407 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
| @@ -65,6 +65,7 @@ SECTIONS | |||
| 65 | #endif | 65 | #endif |
| 66 | . = ALIGN(4096); | 66 | . = ALIGN(4096); |
| 67 | __per_cpu_start = .; | 67 | __per_cpu_start = .; |
| 68 | *(.data.percpu.page_aligned) | ||
| 68 | *(.data.percpu) | 69 | *(.data.percpu) |
| 69 | *(.data.percpu.shared_aligned) | 70 | *(.data.percpu.shared_aligned) |
| 70 | __per_cpu_end = .; | 71 | __per_cpu_end = .; |
diff --git a/arch/arm/oprofile/op_model_mpcore.c b/arch/arm/oprofile/op_model_mpcore.c index 6d6bd5899240..853d42bb8682 100644 --- a/arch/arm/oprofile/op_model_mpcore.c +++ b/arch/arm/oprofile/op_model_mpcore.c | |||
| @@ -263,7 +263,7 @@ static void em_route_irq(int irq, unsigned int cpu) | |||
| 263 | const struct cpumask *mask = cpumask_of(cpu); | 263 | const struct cpumask *mask = cpumask_of(cpu); |
| 264 | 264 | ||
| 265 | spin_lock_irq(&desc->lock); | 265 | spin_lock_irq(&desc->lock); |
| 266 | desc->affinity = *mask; | 266 | cpumask_copy(desc->affinity, mask); |
| 267 | desc->chip->set_affinity(irq, mask); | 267 | desc->chip->set_affinity(irq, mask); |
| 268 | spin_unlock_irq(&desc->lock); | 268 | spin_unlock_irq(&desc->lock); |
| 269 | } | 269 | } |
diff --git a/arch/avr32/include/asm/swab.h b/arch/avr32/include/asm/swab.h index a14aa5b46d98..14cc737bbca6 100644 --- a/arch/avr32/include/asm/swab.h +++ b/arch/avr32/include/asm/swab.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | #ifndef __ASM_AVR32_SWAB_H | 4 | #ifndef __ASM_AVR32_SWAB_H |
| 5 | #define __ASM_AVR32_SWAB_H | 5 | #define __ASM_AVR32_SWAB_H |
| 6 | 6 | ||
| 7 | #include <asm/types.h> | 7 | #include <linux/types.h> |
| 8 | #include <linux/compiler.h> | 8 | #include <linux/compiler.h> |
| 9 | 9 | ||
| 10 | #define __SWAB_64_THRU_32__ | 10 | #define __SWAB_64_THRU_32__ |
diff --git a/arch/blackfin/include/asm/swab.h b/arch/blackfin/include/asm/swab.h index 69a051b612bd..6403ad2932eb 100644 --- a/arch/blackfin/include/asm/swab.h +++ b/arch/blackfin/include/asm/swab.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifndef _BLACKFIN_SWAB_H | 1 | #ifndef _BLACKFIN_SWAB_H |
| 2 | #define _BLACKFIN_SWAB_H | 2 | #define _BLACKFIN_SWAB_H |
| 3 | 3 | ||
| 4 | #include <asm/types.h> | 4 | #include <linux/types.h> |
| 5 | #include <linux/compiler.h> | 5 | #include <linux/compiler.h> |
| 6 | 6 | ||
| 7 | #if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) | 7 | #if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) |
diff --git a/arch/blackfin/kernel/irqchip.c b/arch/blackfin/kernel/irqchip.c index 75724eee6494..23e9aa080710 100644 --- a/arch/blackfin/kernel/irqchip.c +++ b/arch/blackfin/kernel/irqchip.c | |||
| @@ -70,6 +70,11 @@ static struct irq_desc bad_irq_desc = { | |||
| 70 | #endif | 70 | #endif |
| 71 | }; | 71 | }; |
| 72 | 72 | ||
| 73 | #ifdef CONFIG_CPUMASK_OFFSTACK | ||
| 74 | /* We are not allocating a variable-sized bad_irq_desc.affinity */ | ||
| 75 | #error "Blackfin architecture does not support CONFIG_CPUMASK_OFFSTACK." | ||
| 76 | #endif | ||
| 77 | |||
| 73 | int show_interrupts(struct seq_file *p, void *v) | 78 | int show_interrupts(struct seq_file *p, void *v) |
| 74 | { | 79 | { |
| 75 | int i = *(loff_t *) v, j; | 80 | int i = *(loff_t *) v, j; |
diff --git a/arch/h8300/include/asm/swab.h b/arch/h8300/include/asm/swab.h index c108f39b8bc4..39abbf52807d 100644 --- a/arch/h8300/include/asm/swab.h +++ b/arch/h8300/include/asm/swab.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifndef _H8300_SWAB_H | 1 | #ifndef _H8300_SWAB_H |
| 2 | #define _H8300_SWAB_H | 2 | #define _H8300_SWAB_H |
| 3 | 3 | ||
| 4 | #include <asm/types.h> | 4 | #include <linux/types.h> |
| 5 | 5 | ||
| 6 | #if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) | 6 | #if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) |
| 7 | # define __SWAB_64_THRU_32__ | 7 | # define __SWAB_64_THRU_32__ |
diff --git a/arch/ia64/include/asm/fpu.h b/arch/ia64/include/asm/fpu.h index 3859558ff0a4..0c26157cffa5 100644 --- a/arch/ia64/include/asm/fpu.h +++ b/arch/ia64/include/asm/fpu.h | |||
| @@ -6,8 +6,6 @@ | |||
| 6 | * David Mosberger-Tang <davidm@hpl.hp.com> | 6 | * David Mosberger-Tang <davidm@hpl.hp.com> |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #include <asm/types.h> | ||
| 10 | |||
| 11 | /* floating point status register: */ | 9 | /* floating point status register: */ |
| 12 | #define FPSR_TRAP_VD (1 << 0) /* invalid op trap disabled */ | 10 | #define FPSR_TRAP_VD (1 << 0) /* invalid op trap disabled */ |
| 13 | #define FPSR_TRAP_DD (1 << 1) /* denormal trap disabled */ | 11 | #define FPSR_TRAP_DD (1 << 1) /* denormal trap disabled */ |
diff --git a/arch/ia64/include/asm/gcc_intrin.h b/arch/ia64/include/asm/gcc_intrin.h index 0f5b55921758..c2c5fd8fcac4 100644 --- a/arch/ia64/include/asm/gcc_intrin.h +++ b/arch/ia64/include/asm/gcc_intrin.h | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | * Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@intel.com> | 6 | * Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@intel.com> |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #include <linux/types.h> | ||
| 9 | #include <linux/compiler.h> | 10 | #include <linux/compiler.h> |
| 10 | 11 | ||
| 11 | /* define this macro to get some asm stmts included in 'c' files */ | 12 | /* define this macro to get some asm stmts included in 'c' files */ |
diff --git a/arch/ia64/include/asm/intrinsics.h b/arch/ia64/include/asm/intrinsics.h index a3e44a5ed497..c47830e26cb7 100644 --- a/arch/ia64/include/asm/intrinsics.h +++ b/arch/ia64/include/asm/intrinsics.h | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | #ifndef __ASSEMBLY__ | 11 | #ifndef __ASSEMBLY__ |
| 12 | 12 | ||
| 13 | #include <linux/types.h> | ||
| 13 | /* include compiler specific intrinsics */ | 14 | /* include compiler specific intrinsics */ |
| 14 | #include <asm/ia64regs.h> | 15 | #include <asm/ia64regs.h> |
| 15 | #ifdef __INTEL_COMPILER | 16 | #ifdef __INTEL_COMPILER |
diff --git a/arch/ia64/include/asm/kvm.h b/arch/ia64/include/asm/kvm.h index bfa86b6af7cd..2b0a38e84705 100644 --- a/arch/ia64/include/asm/kvm.h +++ b/arch/ia64/include/asm/kvm.h | |||
| @@ -21,8 +21,7 @@ | |||
| 21 | * | 21 | * |
| 22 | */ | 22 | */ |
| 23 | 23 | ||
| 24 | #include <asm/types.h> | 24 | #include <linux/types.h> |
| 25 | |||
| 26 | #include <linux/ioctl.h> | 25 | #include <linux/ioctl.h> |
| 27 | 26 | ||
| 28 | /* Select x86 specific features in <linux/kvm.h> */ | 27 | /* Select x86 specific features in <linux/kvm.h> */ |
diff --git a/arch/ia64/include/asm/percpu.h b/arch/ia64/include/asm/percpu.h index 77f30b664b4e..30cf46534dd2 100644 --- a/arch/ia64/include/asm/percpu.h +++ b/arch/ia64/include/asm/percpu.h | |||
| @@ -27,12 +27,12 @@ extern void *per_cpu_init(void); | |||
| 27 | 27 | ||
| 28 | #else /* ! SMP */ | 28 | #else /* ! SMP */ |
| 29 | 29 | ||
| 30 | #define PER_CPU_ATTRIBUTES __attribute__((__section__(".data.percpu"))) | ||
| 31 | |||
| 32 | #define per_cpu_init() (__phys_per_cpu_start) | 30 | #define per_cpu_init() (__phys_per_cpu_start) |
| 33 | 31 | ||
| 34 | #endif /* SMP */ | 32 | #endif /* SMP */ |
| 35 | 33 | ||
| 34 | #define PER_CPU_BASE_SECTION ".data.percpu" | ||
| 35 | |||
| 36 | /* | 36 | /* |
| 37 | * Be extremely careful when taking the address of this variable! Due to virtual | 37 | * Be extremely careful when taking the address of this variable! Due to virtual |
| 38 | * remapping, it is different from the canonical address returned by __get_cpu_var(var)! | 38 | * remapping, it is different from the canonical address returned by __get_cpu_var(var)! |
diff --git a/arch/ia64/include/asm/swab.h b/arch/ia64/include/asm/swab.h index 6aa58b699eea..c89a8cb5d8a5 100644 --- a/arch/ia64/include/asm/swab.h +++ b/arch/ia64/include/asm/swab.h | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co. | 6 | * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co. |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #include <asm/types.h> | 9 | #include <linux/types.h> |
| 10 | #include <asm/intrinsics.h> | 10 | #include <asm/intrinsics.h> |
| 11 | #include <linux/compiler.h> | 11 | #include <linux/compiler.h> |
| 12 | 12 | ||
diff --git a/arch/ia64/include/asm/topology.h b/arch/ia64/include/asm/topology.h index 32f3af1641c5..3193f4417e16 100644 --- a/arch/ia64/include/asm/topology.h +++ b/arch/ia64/include/asm/topology.h | |||
| @@ -84,7 +84,7 @@ void build_cpu_to_node_map(void); | |||
| 84 | .child = NULL, \ | 84 | .child = NULL, \ |
| 85 | .groups = NULL, \ | 85 | .groups = NULL, \ |
| 86 | .min_interval = 8, \ | 86 | .min_interval = 8, \ |
| 87 | .max_interval = 8*(min(num_online_cpus(), 32)), \ | 87 | .max_interval = 8*(min(num_online_cpus(), 32U)), \ |
| 88 | .busy_factor = 64, \ | 88 | .busy_factor = 64, \ |
| 89 | .imbalance_pct = 125, \ | 89 | .imbalance_pct = 125, \ |
| 90 | .cache_nice_tries = 2, \ | 90 | .cache_nice_tries = 2, \ |
diff --git a/arch/ia64/include/asm/uv/uv.h b/arch/ia64/include/asm/uv/uv.h new file mode 100644 index 000000000000..61b5bdfd980e --- /dev/null +++ b/arch/ia64/include/asm/uv/uv.h | |||
| @@ -0,0 +1,13 @@ | |||
| 1 | #ifndef _ASM_IA64_UV_UV_H | ||
| 2 | #define _ASM_IA64_UV_UV_H | ||
| 3 | |||
| 4 | #include <asm/system.h> | ||
| 5 | #include <asm/sn/simulator.h> | ||
| 6 | |||
| 7 | static inline int is_uv_system(void) | ||
| 8 | { | ||
| 9 | /* temporary support for running on hardware simulator */ | ||
| 10 | return IS_MEDUSA() || ia64_platform_is("uv"); | ||
| 11 | } | ||
| 12 | |||
| 13 | #endif /* _ASM_IA64_UV_UV_H */ | ||
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index d541671caf4a..bdef2ce38c8b 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
| @@ -199,6 +199,10 @@ char *__init __acpi_map_table(unsigned long phys_addr, unsigned long size) | |||
| 199 | return __va(phys_addr); | 199 | return __va(phys_addr); |
| 200 | } | 200 | } |
| 201 | 201 | ||
| 202 | void __init __acpi_unmap_table(char *map, unsigned long size) | ||
| 203 | { | ||
| 204 | } | ||
| 205 | |||
| 202 | /* -------------------------------------------------------------------------- | 206 | /* -------------------------------------------------------------------------- |
| 203 | Boot-time Table Parsing | 207 | Boot-time Table Parsing |
| 204 | -------------------------------------------------------------------------- */ | 208 | -------------------------------------------------------------------------- */ |
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index 5cfd3d91001a..006ad366a454 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
| @@ -880,7 +880,7 @@ iosapic_unregister_intr (unsigned int gsi) | |||
| 880 | if (iosapic_intr_info[irq].count == 0) { | 880 | if (iosapic_intr_info[irq].count == 0) { |
| 881 | #ifdef CONFIG_SMP | 881 | #ifdef CONFIG_SMP |
| 882 | /* Clear affinity */ | 882 | /* Clear affinity */ |
| 883 | cpus_setall(idesc->affinity); | 883 | cpumask_setall(idesc->affinity); |
| 884 | #endif | 884 | #endif |
| 885 | /* Clear the interrupt information */ | 885 | /* Clear the interrupt information */ |
| 886 | iosapic_intr_info[irq].dest = 0; | 886 | iosapic_intr_info[irq].dest = 0; |
diff --git a/arch/ia64/kernel/irq.c b/arch/ia64/kernel/irq.c index a58f64ca9f0e..226233a6fa19 100644 --- a/arch/ia64/kernel/irq.c +++ b/arch/ia64/kernel/irq.c | |||
| @@ -103,7 +103,7 @@ static char irq_redir [NR_IRQS]; // = { [0 ... NR_IRQS-1] = 1 }; | |||
| 103 | void set_irq_affinity_info (unsigned int irq, int hwid, int redir) | 103 | void set_irq_affinity_info (unsigned int irq, int hwid, int redir) |
| 104 | { | 104 | { |
| 105 | if (irq < NR_IRQS) { | 105 | if (irq < NR_IRQS) { |
| 106 | cpumask_copy(&irq_desc[irq].affinity, | 106 | cpumask_copy(irq_desc[irq].affinity, |
| 107 | cpumask_of(cpu_logical_id(hwid))); | 107 | cpumask_of(cpu_logical_id(hwid))); |
| 108 | irq_redir[irq] = (char) (redir & 0xff); | 108 | irq_redir[irq] = (char) (redir & 0xff); |
| 109 | } | 109 | } |
| @@ -148,7 +148,7 @@ static void migrate_irqs(void) | |||
| 148 | if (desc->status == IRQ_PER_CPU) | 148 | if (desc->status == IRQ_PER_CPU) |
| 149 | continue; | 149 | continue; |
| 150 | 150 | ||
| 151 | if (cpumask_any_and(&irq_desc[irq].affinity, cpu_online_mask) | 151 | if (cpumask_any_and(irq_desc[irq].affinity, cpu_online_mask) |
| 152 | >= nr_cpu_ids) { | 152 | >= nr_cpu_ids) { |
| 153 | /* | 153 | /* |
| 154 | * Save it for phase 2 processing | 154 | * Save it for phase 2 processing |
diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c index 28d3d483db92..927ad027820c 100644 --- a/arch/ia64/kernel/irq_ia64.c +++ b/arch/ia64/kernel/irq_ia64.c | |||
| @@ -493,11 +493,13 @@ ia64_handle_irq (ia64_vector vector, struct pt_regs *regs) | |||
| 493 | saved_tpr = ia64_getreg(_IA64_REG_CR_TPR); | 493 | saved_tpr = ia64_getreg(_IA64_REG_CR_TPR); |
| 494 | ia64_srlz_d(); | 494 | ia64_srlz_d(); |
| 495 | while (vector != IA64_SPURIOUS_INT_VECTOR) { | 495 | while (vector != IA64_SPURIOUS_INT_VECTOR) { |
| 496 | struct irq_desc *desc = irq_to_desc(vector); | ||
| 497 | |||
| 496 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { | 498 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { |
| 497 | smp_local_flush_tlb(); | 499 | smp_local_flush_tlb(); |
| 498 | kstat_this_cpu.irqs[vector]++; | 500 | kstat_incr_irqs_this_cpu(vector, desc); |
| 499 | } else if (unlikely(IS_RESCHEDULE(vector))) | 501 | } else if (unlikely(IS_RESCHEDULE(vector))) |
| 500 | kstat_this_cpu.irqs[vector]++; | 502 | kstat_incr_irqs_this_cpu(vector, desc); |
| 501 | else { | 503 | else { |
| 502 | int irq = local_vector_to_irq(vector); | 504 | int irq = local_vector_to_irq(vector); |
| 503 | 505 | ||
| @@ -551,11 +553,13 @@ void ia64_process_pending_intr(void) | |||
| 551 | * Perform normal interrupt style processing | 553 | * Perform normal interrupt style processing |
| 552 | */ | 554 | */ |
| 553 | while (vector != IA64_SPURIOUS_INT_VECTOR) { | 555 | while (vector != IA64_SPURIOUS_INT_VECTOR) { |
| 556 | struct irq_desc *desc = irq_to_desc(vector); | ||
| 557 | |||
| 554 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { | 558 | if (unlikely(IS_LOCAL_TLB_FLUSH(vector))) { |
| 555 | smp_local_flush_tlb(); | 559 | smp_local_flush_tlb(); |
| 556 | kstat_this_cpu.irqs[vector]++; | 560 | kstat_incr_irqs_this_cpu(vector, desc); |
| 557 | } else if (unlikely(IS_RESCHEDULE(vector))) | 561 | } else if (unlikely(IS_RESCHEDULE(vector))) |
| 558 | kstat_this_cpu.irqs[vector]++; | 562 | kstat_incr_irqs_this_cpu(vector, desc); |
| 559 | else { | 563 | else { |
| 560 | struct pt_regs *old_regs = set_irq_regs(NULL); | 564 | struct pt_regs *old_regs = set_irq_regs(NULL); |
| 561 | int irq = local_vector_to_irq(vector); | 565 | int irq = local_vector_to_irq(vector); |
diff --git a/arch/ia64/kernel/msi_ia64.c b/arch/ia64/kernel/msi_ia64.c index 890339339035..dcb6b7c51ea7 100644 --- a/arch/ia64/kernel/msi_ia64.c +++ b/arch/ia64/kernel/msi_ia64.c | |||
| @@ -75,7 +75,7 @@ static void ia64_set_msi_irq_affinity(unsigned int irq, | |||
| 75 | msg.data = data; | 75 | msg.data = data; |
| 76 | 76 | ||
| 77 | write_msi_msg(irq, &msg); | 77 | write_msi_msg(irq, &msg); |
| 78 | irq_desc[irq].affinity = cpumask_of_cpu(cpu); | 78 | cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu)); |
| 79 | } | 79 | } |
| 80 | #endif /* CONFIG_SMP */ | 80 | #endif /* CONFIG_SMP */ |
| 81 | 81 | ||
| @@ -187,7 +187,7 @@ static void dmar_msi_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
| 187 | msg.address_lo |= MSI_ADDR_DESTID_CPU(cpu_physical_id(cpu)); | 187 | msg.address_lo |= MSI_ADDR_DESTID_CPU(cpu_physical_id(cpu)); |
| 188 | 188 | ||
| 189 | dmar_msi_write(irq, &msg); | 189 | dmar_msi_write(irq, &msg); |
| 190 | irq_desc[irq].affinity = *mask; | 190 | cpumask_copy(irq_desc[irq].affinity, mask); |
| 191 | } | 191 | } |
| 192 | #endif /* CONFIG_SMP */ | 192 | #endif /* CONFIG_SMP */ |
| 193 | 193 | ||
diff --git a/arch/ia64/kernel/vmlinux.lds.S b/arch/ia64/kernel/vmlinux.lds.S index 10a7d47e8510..f45e4e508eca 100644 --- a/arch/ia64/kernel/vmlinux.lds.S +++ b/arch/ia64/kernel/vmlinux.lds.S | |||
| @@ -219,6 +219,7 @@ SECTIONS | |||
| 219 | .data.percpu PERCPU_ADDR : AT(__phys_per_cpu_start - LOAD_OFFSET) | 219 | .data.percpu PERCPU_ADDR : AT(__phys_per_cpu_start - LOAD_OFFSET) |
| 220 | { | 220 | { |
| 221 | __per_cpu_start = .; | 221 | __per_cpu_start = .; |
| 222 | *(.data.percpu.page_aligned) | ||
| 222 | *(.data.percpu) | 223 | *(.data.percpu) |
| 223 | *(.data.percpu.shared_aligned) | 224 | *(.data.percpu.shared_aligned) |
| 224 | __per_cpu_end = .; | 225 | __per_cpu_end = .; |
diff --git a/arch/ia64/sn/kernel/msi_sn.c b/arch/ia64/sn/kernel/msi_sn.c index ca553b0429ce..81e428943d73 100644 --- a/arch/ia64/sn/kernel/msi_sn.c +++ b/arch/ia64/sn/kernel/msi_sn.c | |||
| @@ -205,7 +205,7 @@ static void sn_set_msi_irq_affinity(unsigned int irq, | |||
| 205 | msg.address_lo = (u32)(bus_addr & 0x00000000ffffffff); | 205 | msg.address_lo = (u32)(bus_addr & 0x00000000ffffffff); |
| 206 | 206 | ||
| 207 | write_msi_msg(irq, &msg); | 207 | write_msi_msg(irq, &msg); |
| 208 | irq_desc[irq].affinity = *cpu_mask; | 208 | cpumask_copy(irq_desc[irq].affinity, cpu_mask); |
| 209 | } | 209 | } |
| 210 | #endif /* CONFIG_SMP */ | 210 | #endif /* CONFIG_SMP */ |
| 211 | 211 | ||
diff --git a/arch/mips/include/asm/irq.h b/arch/mips/include/asm/irq.h index abc62aa744ac..3214ade02d10 100644 --- a/arch/mips/include/asm/irq.h +++ b/arch/mips/include/asm/irq.h | |||
| @@ -66,7 +66,7 @@ extern void smtc_forward_irq(unsigned int irq); | |||
| 66 | */ | 66 | */ |
| 67 | #define IRQ_AFFINITY_HOOK(irq) \ | 67 | #define IRQ_AFFINITY_HOOK(irq) \ |
| 68 | do { \ | 68 | do { \ |
| 69 | if (!cpu_isset(smp_processor_id(), irq_desc[irq].affinity)) { \ | 69 | if (!cpumask_test_cpu(smp_processor_id(), irq_desc[irq].affinity)) {\ |
| 70 | smtc_forward_irq(irq); \ | 70 | smtc_forward_irq(irq); \ |
| 71 | irq_exit(); \ | 71 | irq_exit(); \ |
| 72 | return; \ | 72 | return; \ |
diff --git a/arch/mips/include/asm/sigcontext.h b/arch/mips/include/asm/sigcontext.h index 9ce0607d7a4e..9e89cf99d4e4 100644 --- a/arch/mips/include/asm/sigcontext.h +++ b/arch/mips/include/asm/sigcontext.h | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #ifndef _ASM_SIGCONTEXT_H | 9 | #ifndef _ASM_SIGCONTEXT_H |
| 10 | #define _ASM_SIGCONTEXT_H | 10 | #define _ASM_SIGCONTEXT_H |
| 11 | 11 | ||
| 12 | #include <linux/types.h> | ||
| 12 | #include <asm/sgidefs.h> | 13 | #include <asm/sgidefs.h> |
| 13 | 14 | ||
| 14 | #if _MIPS_SIM == _MIPS_SIM_ABI32 | 15 | #if _MIPS_SIM == _MIPS_SIM_ABI32 |
diff --git a/arch/mips/include/asm/swab.h b/arch/mips/include/asm/swab.h index 88f1f7d555cb..99993c0d6c12 100644 --- a/arch/mips/include/asm/swab.h +++ b/arch/mips/include/asm/swab.h | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | #define _ASM_SWAB_H | 9 | #define _ASM_SWAB_H |
| 10 | 10 | ||
| 11 | #include <linux/compiler.h> | 11 | #include <linux/compiler.h> |
| 12 | #include <asm/types.h> | 12 | #include <linux/types.h> |
| 13 | 13 | ||
| 14 | #define __SWAB_64_THRU_32__ | 14 | #define __SWAB_64_THRU_32__ |
| 15 | 15 | ||
diff --git a/arch/mips/kernel/irq-gic.c b/arch/mips/kernel/irq-gic.c index 494a49a317e9..87deb8f6c458 100644 --- a/arch/mips/kernel/irq-gic.c +++ b/arch/mips/kernel/irq-gic.c | |||
| @@ -187,7 +187,7 @@ static void gic_set_affinity(unsigned int irq, const struct cpumask *cpumask) | |||
| 187 | set_bit(irq, pcpu_masks[first_cpu(tmp)].pcpu_mask); | 187 | set_bit(irq, pcpu_masks[first_cpu(tmp)].pcpu_mask); |
| 188 | 188 | ||
| 189 | } | 189 | } |
| 190 | irq_desc[irq].affinity = *cpumask; | 190 | cpumask_copy(irq_desc[irq].affinity, cpumask); |
| 191 | spin_unlock_irqrestore(&gic_lock, flags); | 191 | spin_unlock_irqrestore(&gic_lock, flags); |
| 192 | 192 | ||
| 193 | } | 193 | } |
diff --git a/arch/mips/kernel/smtc.c b/arch/mips/kernel/smtc.c index b6cca01ff82b..5f5af7d4c890 100644 --- a/arch/mips/kernel/smtc.c +++ b/arch/mips/kernel/smtc.c | |||
| @@ -686,7 +686,7 @@ void smtc_forward_irq(unsigned int irq) | |||
| 686 | * and efficiency, we just pick the easiest one to find. | 686 | * and efficiency, we just pick the easiest one to find. |
| 687 | */ | 687 | */ |
| 688 | 688 | ||
| 689 | target = first_cpu(irq_desc[irq].affinity); | 689 | target = cpumask_first(irq_desc[irq].affinity); |
| 690 | 690 | ||
| 691 | /* | 691 | /* |
| 692 | * We depend on the platform code to have correctly processed | 692 | * We depend on the platform code to have correctly processed |
| @@ -921,11 +921,13 @@ void ipi_decode(struct smtc_ipi *pipi) | |||
| 921 | struct clock_event_device *cd; | 921 | struct clock_event_device *cd; |
| 922 | void *arg_copy = pipi->arg; | 922 | void *arg_copy = pipi->arg; |
| 923 | int type_copy = pipi->type; | 923 | int type_copy = pipi->type; |
| 924 | int irq = MIPS_CPU_IRQ_BASE + 1; | ||
| 925 | |||
| 924 | smtc_ipi_nq(&freeIPIq, pipi); | 926 | smtc_ipi_nq(&freeIPIq, pipi); |
| 925 | switch (type_copy) { | 927 | switch (type_copy) { |
| 926 | case SMTC_CLOCK_TICK: | 928 | case SMTC_CLOCK_TICK: |
| 927 | irq_enter(); | 929 | irq_enter(); |
| 928 | kstat_this_cpu.irqs[MIPS_CPU_IRQ_BASE + 1]++; | 930 | kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); |
| 929 | cd = &per_cpu(mips_clockevent_device, cpu); | 931 | cd = &per_cpu(mips_clockevent_device, cpu); |
| 930 | cd->event_handler(cd); | 932 | cd->event_handler(cd); |
| 931 | irq_exit(); | 933 | irq_exit(); |
diff --git a/arch/mips/mti-malta/malta-smtc.c b/arch/mips/mti-malta/malta-smtc.c index aabd7274507b..5ba31888fefb 100644 --- a/arch/mips/mti-malta/malta-smtc.c +++ b/arch/mips/mti-malta/malta-smtc.c | |||
| @@ -116,7 +116,7 @@ struct plat_smp_ops msmtc_smp_ops = { | |||
| 116 | 116 | ||
| 117 | void plat_set_irq_affinity(unsigned int irq, const struct cpumask *affinity) | 117 | void plat_set_irq_affinity(unsigned int irq, const struct cpumask *affinity) |
| 118 | { | 118 | { |
| 119 | cpumask_t tmask = *affinity; | 119 | cpumask_t tmask; |
| 120 | int cpu = 0; | 120 | int cpu = 0; |
| 121 | void smtc_set_irq_affinity(unsigned int irq, cpumask_t aff); | 121 | void smtc_set_irq_affinity(unsigned int irq, cpumask_t aff); |
| 122 | 122 | ||
| @@ -139,11 +139,12 @@ void plat_set_irq_affinity(unsigned int irq, const struct cpumask *affinity) | |||
| 139 | * be made to forward to an offline "CPU". | 139 | * be made to forward to an offline "CPU". |
| 140 | */ | 140 | */ |
| 141 | 141 | ||
| 142 | cpumask_copy(&tmask, affinity); | ||
| 142 | for_each_cpu(cpu, affinity) { | 143 | for_each_cpu(cpu, affinity) { |
| 143 | if ((cpu_data[cpu].vpe_id != 0) || !cpu_online(cpu)) | 144 | if ((cpu_data[cpu].vpe_id != 0) || !cpu_online(cpu)) |
| 144 | cpu_clear(cpu, tmask); | 145 | cpu_clear(cpu, tmask); |
| 145 | } | 146 | } |
| 146 | irq_desc[irq].affinity = tmask; | 147 | cpumask_copy(irq_desc[irq].affinity, &tmask); |
| 147 | 148 | ||
| 148 | if (cpus_empty(tmask)) | 149 | if (cpus_empty(tmask)) |
| 149 | /* | 150 | /* |
diff --git a/arch/mips/sgi-ip22/ip22-int.c b/arch/mips/sgi-ip22/ip22-int.c index f8b18af141a1..0ecd5fe9486e 100644 --- a/arch/mips/sgi-ip22/ip22-int.c +++ b/arch/mips/sgi-ip22/ip22-int.c | |||
| @@ -155,7 +155,7 @@ static void indy_buserror_irq(void) | |||
| 155 | int irq = SGI_BUSERR_IRQ; | 155 | int irq = SGI_BUSERR_IRQ; |
| 156 | 156 | ||
| 157 | irq_enter(); | 157 | irq_enter(); |
| 158 | kstat_this_cpu.irqs[irq]++; | 158 | kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); |
| 159 | ip22_be_interrupt(irq); | 159 | ip22_be_interrupt(irq); |
| 160 | irq_exit(); | 160 | irq_exit(); |
| 161 | } | 161 | } |
diff --git a/arch/mips/sgi-ip22/ip22-time.c b/arch/mips/sgi-ip22/ip22-time.c index 3dcb27ec0c53..c8f7d2328b24 100644 --- a/arch/mips/sgi-ip22/ip22-time.c +++ b/arch/mips/sgi-ip22/ip22-time.c | |||
| @@ -122,7 +122,7 @@ void indy_8254timer_irq(void) | |||
| 122 | char c; | 122 | char c; |
| 123 | 123 | ||
| 124 | irq_enter(); | 124 | irq_enter(); |
| 125 | kstat_this_cpu.irqs[irq]++; | 125 | kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); |
| 126 | printk(KERN_ALERT "Oops, got 8254 interrupt.\n"); | 126 | printk(KERN_ALERT "Oops, got 8254 interrupt.\n"); |
| 127 | ArcRead(0, &c, 1, &cnt); | 127 | ArcRead(0, &c, 1, &cnt); |
| 128 | ArcEnterInteractiveMode(); | 128 | ArcEnterInteractiveMode(); |
diff --git a/arch/mips/sibyte/bcm1480/smp.c b/arch/mips/sibyte/bcm1480/smp.c index dddfda8e8294..314691648c97 100644 --- a/arch/mips/sibyte/bcm1480/smp.c +++ b/arch/mips/sibyte/bcm1480/smp.c | |||
| @@ -178,9 +178,10 @@ struct plat_smp_ops bcm1480_smp_ops = { | |||
| 178 | void bcm1480_mailbox_interrupt(void) | 178 | void bcm1480_mailbox_interrupt(void) |
| 179 | { | 179 | { |
| 180 | int cpu = smp_processor_id(); | 180 | int cpu = smp_processor_id(); |
| 181 | int irq = K_BCM1480_INT_MBOX_0_0; | ||
| 181 | unsigned int action; | 182 | unsigned int action; |
| 182 | 183 | ||
| 183 | kstat_this_cpu.irqs[K_BCM1480_INT_MBOX_0_0]++; | 184 | kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); |
| 184 | /* Load the mailbox register to figure out what we're supposed to do */ | 185 | /* Load the mailbox register to figure out what we're supposed to do */ |
| 185 | action = (__raw_readq(mailbox_0_regs[cpu]) >> 48) & 0xffff; | 186 | action = (__raw_readq(mailbox_0_regs[cpu]) >> 48) & 0xffff; |
| 186 | 187 | ||
diff --git a/arch/mips/sibyte/sb1250/smp.c b/arch/mips/sibyte/sb1250/smp.c index 5950a288a7da..cad14003b84f 100644 --- a/arch/mips/sibyte/sb1250/smp.c +++ b/arch/mips/sibyte/sb1250/smp.c | |||
| @@ -166,9 +166,10 @@ struct plat_smp_ops sb_smp_ops = { | |||
| 166 | void sb1250_mailbox_interrupt(void) | 166 | void sb1250_mailbox_interrupt(void) |
| 167 | { | 167 | { |
| 168 | int cpu = smp_processor_id(); | 168 | int cpu = smp_processor_id(); |
| 169 | int irq = K_INT_MBOX_0; | ||
| 169 | unsigned int action; | 170 | unsigned int action; |
| 170 | 171 | ||
| 171 | kstat_this_cpu.irqs[K_INT_MBOX_0]++; | 172 | kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); |
| 172 | /* Load the mailbox register to figure out what we're supposed to do */ | 173 | /* Load the mailbox register to figure out what we're supposed to do */ |
| 173 | action = (____raw_readq(mailbox_regs[cpu]) >> 48) & 0xffff; | 174 | action = (____raw_readq(mailbox_regs[cpu]) >> 48) & 0xffff; |
| 174 | 175 | ||
diff --git a/arch/mn10300/kernel/mn10300-watchdog.c b/arch/mn10300/kernel/mn10300-watchdog.c index 10811e981d20..2e370d88a87a 100644 --- a/arch/mn10300/kernel/mn10300-watchdog.c +++ b/arch/mn10300/kernel/mn10300-watchdog.c | |||
| @@ -130,6 +130,7 @@ void watchdog_interrupt(struct pt_regs *regs, enum exception_code excep) | |||
| 130 | * the stack NMI-atomically, it's safe to use smp_processor_id(). | 130 | * the stack NMI-atomically, it's safe to use smp_processor_id(). |
| 131 | */ | 131 | */ |
| 132 | int sum, cpu = smp_processor_id(); | 132 | int sum, cpu = smp_processor_id(); |
| 133 | int irq = NMIIRQ; | ||
| 133 | u8 wdt, tmp; | 134 | u8 wdt, tmp; |
| 134 | 135 | ||
| 135 | wdt = WDCTR & ~WDCTR_WDCNE; | 136 | wdt = WDCTR & ~WDCTR_WDCNE; |
| @@ -138,7 +139,7 @@ void watchdog_interrupt(struct pt_regs *regs, enum exception_code excep) | |||
| 138 | NMICR = NMICR_WDIF; | 139 | NMICR = NMICR_WDIF; |
| 139 | 140 | ||
| 140 | nmi_count(cpu)++; | 141 | nmi_count(cpu)++; |
| 141 | kstat_this_cpu.irqs[NMIIRQ]++; | 142 | kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq)); |
| 142 | sum = irq_stat[cpu].__irq_count; | 143 | sum = irq_stat[cpu].__irq_count; |
| 143 | 144 | ||
| 144 | if (last_irq_sums[cpu] == sum) { | 145 | if (last_irq_sums[cpu] == sum) { |
diff --git a/arch/parisc/include/asm/pdc.h b/arch/parisc/include/asm/pdc.h index c584b00c6074..430f1aeea0b8 100644 --- a/arch/parisc/include/asm/pdc.h +++ b/arch/parisc/include/asm/pdc.h | |||
| @@ -336,10 +336,11 @@ | |||
| 336 | #define NUM_PDC_RESULT 32 | 336 | #define NUM_PDC_RESULT 32 |
| 337 | 337 | ||
| 338 | #if !defined(__ASSEMBLY__) | 338 | #if !defined(__ASSEMBLY__) |
| 339 | #ifdef __KERNEL__ | ||
| 340 | 339 | ||
| 341 | #include <linux/types.h> | 340 | #include <linux/types.h> |
| 342 | 341 | ||
| 342 | #ifdef __KERNEL__ | ||
| 343 | |||
| 343 | extern int pdc_type; | 344 | extern int pdc_type; |
| 344 | 345 | ||
| 345 | /* Values for pdc_type */ | 346 | /* Values for pdc_type */ |
diff --git a/arch/parisc/include/asm/swab.h b/arch/parisc/include/asm/swab.h index 3ff16c5a3358..e78403b129ef 100644 --- a/arch/parisc/include/asm/swab.h +++ b/arch/parisc/include/asm/swab.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifndef _PARISC_SWAB_H | 1 | #ifndef _PARISC_SWAB_H |
| 2 | #define _PARISC_SWAB_H | 2 | #define _PARISC_SWAB_H |
| 3 | 3 | ||
| 4 | #include <asm/types.h> | 4 | #include <linux/types.h> |
| 5 | #include <linux/compiler.h> | 5 | #include <linux/compiler.h> |
| 6 | 6 | ||
| 7 | #define __SWAB_64_THRU_32__ | 7 | #define __SWAB_64_THRU_32__ |
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index ac2c822928c7..49482806863f 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
| @@ -120,7 +120,7 @@ int cpu_check_affinity(unsigned int irq, cpumask_t *dest) | |||
| 120 | if (CHECK_IRQ_PER_CPU(irq)) { | 120 | if (CHECK_IRQ_PER_CPU(irq)) { |
| 121 | /* Bad linux design decision. The mask has already | 121 | /* Bad linux design decision. The mask has already |
| 122 | * been set; we must reset it */ | 122 | * been set; we must reset it */ |
| 123 | irq_desc[irq].affinity = CPU_MASK_ALL; | 123 | cpumask_setall(irq_desc[irq].affinity); |
| 124 | return -EINVAL; | 124 | return -EINVAL; |
| 125 | } | 125 | } |
| 126 | 126 | ||
| @@ -136,7 +136,7 @@ static void cpu_set_affinity_irq(unsigned int irq, const struct cpumask *dest) | |||
| 136 | if (cpu_check_affinity(irq, dest)) | 136 | if (cpu_check_affinity(irq, dest)) |
| 137 | return; | 137 | return; |
| 138 | 138 | ||
| 139 | irq_desc[irq].affinity = *dest; | 139 | cpumask_copy(irq_desc[irq].affinity, dest); |
| 140 | } | 140 | } |
| 141 | #endif | 141 | #endif |
| 142 | 142 | ||
| @@ -295,7 +295,7 @@ int txn_alloc_irq(unsigned int bits_wide) | |||
| 295 | unsigned long txn_affinity_addr(unsigned int irq, int cpu) | 295 | unsigned long txn_affinity_addr(unsigned int irq, int cpu) |
| 296 | { | 296 | { |
| 297 | #ifdef CONFIG_SMP | 297 | #ifdef CONFIG_SMP |
| 298 | irq_desc[irq].affinity = cpumask_of_cpu(cpu); | 298 | cpumask_copy(irq_desc[irq].affinity, cpumask_of(cpu)); |
| 299 | #endif | 299 | #endif |
| 300 | 300 | ||
| 301 | return per_cpu(cpu_data, cpu).txn_addr; | 301 | return per_cpu(cpu_data, cpu).txn_addr; |
| @@ -352,7 +352,7 @@ void do_cpu_irq_mask(struct pt_regs *regs) | |||
| 352 | irq = eirr_to_irq(eirr_val); | 352 | irq = eirr_to_irq(eirr_val); |
| 353 | 353 | ||
| 354 | #ifdef CONFIG_SMP | 354 | #ifdef CONFIG_SMP |
| 355 | dest = irq_desc[irq].affinity; | 355 | cpumask_copy(&dest, irq_desc[irq].affinity); |
| 356 | if (CHECK_IRQ_PER_CPU(irq_desc[irq].status) && | 356 | if (CHECK_IRQ_PER_CPU(irq_desc[irq].status) && |
| 357 | !cpu_isset(smp_processor_id(), dest)) { | 357 | !cpu_isset(smp_processor_id(), dest)) { |
| 358 | int cpu = first_cpu(dest); | 358 | int cpu = first_cpu(dest); |
diff --git a/arch/powerpc/include/asm/bootx.h b/arch/powerpc/include/asm/bootx.h index 57b82e3f89ce..60a3c9ef3017 100644 --- a/arch/powerpc/include/asm/bootx.h +++ b/arch/powerpc/include/asm/bootx.h | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | #ifndef __ASM_BOOTX_H__ | 9 | #ifndef __ASM_BOOTX_H__ |
| 10 | #define __ASM_BOOTX_H__ | 10 | #define __ASM_BOOTX_H__ |
| 11 | 11 | ||
| 12 | #include <asm/types.h> | 12 | #include <linux/types.h> |
| 13 | 13 | ||
| 14 | #ifdef macintosh | 14 | #ifdef macintosh |
| 15 | #include <Types.h> | 15 | #include <Types.h> |
diff --git a/arch/powerpc/include/asm/elf.h b/arch/powerpc/include/asm/elf.h index cd46f023ec6d..b5600ce6055e 100644 --- a/arch/powerpc/include/asm/elf.h +++ b/arch/powerpc/include/asm/elf.h | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | #include <asm/string.h> | 7 | #include <asm/string.h> |
| 8 | #endif | 8 | #endif |
| 9 | 9 | ||
| 10 | #include <asm/types.h> | 10 | #include <linux/types.h> |
| 11 | #include <asm/ptrace.h> | 11 | #include <asm/ptrace.h> |
| 12 | #include <asm/cputable.h> | 12 | #include <asm/cputable.h> |
| 13 | #include <asm/auxvec.h> | 13 | #include <asm/auxvec.h> |
diff --git a/arch/powerpc/include/asm/kvm.h b/arch/powerpc/include/asm/kvm.h index f993e4198d5c..4e0cf65f7f5a 100644 --- a/arch/powerpc/include/asm/kvm.h +++ b/arch/powerpc/include/asm/kvm.h | |||
| @@ -20,7 +20,7 @@ | |||
| 20 | #ifndef __LINUX_KVM_POWERPC_H | 20 | #ifndef __LINUX_KVM_POWERPC_H |
| 21 | #define __LINUX_KVM_POWERPC_H | 21 | #define __LINUX_KVM_POWERPC_H |
| 22 | 22 | ||
| 23 | #include <asm/types.h> | 23 | #include <linux/types.h> |
| 24 | 24 | ||
| 25 | struct kvm_regs { | 25 | struct kvm_regs { |
| 26 | __u64 pc; | 26 | __u64 pc; |
diff --git a/arch/powerpc/include/asm/ps3fb.h b/arch/powerpc/include/asm/ps3fb.h index 3f121fe4010d..e7233a849680 100644 --- a/arch/powerpc/include/asm/ps3fb.h +++ b/arch/powerpc/include/asm/ps3fb.h | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #ifndef _ASM_POWERPC_PS3FB_H_ | 19 | #ifndef _ASM_POWERPC_PS3FB_H_ |
| 20 | #define _ASM_POWERPC_PS3FB_H_ | 20 | #define _ASM_POWERPC_PS3FB_H_ |
| 21 | 21 | ||
| 22 | #include <linux/types.h> | ||
| 22 | #include <linux/ioctl.h> | 23 | #include <linux/ioctl.h> |
| 23 | 24 | ||
| 24 | /* ioctl */ | 25 | /* ioctl */ |
diff --git a/arch/powerpc/include/asm/spu_info.h b/arch/powerpc/include/asm/spu_info.h index 3545efbf9891..1286c823f0d8 100644 --- a/arch/powerpc/include/asm/spu_info.h +++ b/arch/powerpc/include/asm/spu_info.h | |||
| @@ -23,9 +23,10 @@ | |||
| 23 | #ifndef _SPU_INFO_H | 23 | #ifndef _SPU_INFO_H |
| 24 | #define _SPU_INFO_H | 24 | #define _SPU_INFO_H |
| 25 | 25 | ||
| 26 | #include <linux/types.h> | ||
| 27 | |||
| 26 | #ifdef __KERNEL__ | 28 | #ifdef __KERNEL__ |
| 27 | #include <asm/spu.h> | 29 | #include <asm/spu.h> |
| 28 | #include <linux/types.h> | ||
| 29 | #else | 30 | #else |
| 30 | struct mfc_cq_sr { | 31 | struct mfc_cq_sr { |
| 31 | __u64 mfc_cq_data0_RW; | 32 | __u64 mfc_cq_data0_RW; |
diff --git a/arch/powerpc/include/asm/swab.h b/arch/powerpc/include/asm/swab.h index ef824ae4b79c..c581e3ef73ed 100644 --- a/arch/powerpc/include/asm/swab.h +++ b/arch/powerpc/include/asm/swab.h | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | * 2 of the License, or (at your option) any later version. | 8 | * 2 of the License, or (at your option) any later version. |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | #include <asm/types.h> | 11 | #include <linux/types.h> |
| 12 | #include <linux/compiler.h> | 12 | #include <linux/compiler.h> |
| 13 | 13 | ||
| 14 | #ifdef __GNUC__ | 14 | #ifdef __GNUC__ |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 23b8b5e36f98..ad1e5ac721d8 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
| @@ -231,7 +231,7 @@ void fixup_irqs(cpumask_t map) | |||
| 231 | if (irq_desc[irq].status & IRQ_PER_CPU) | 231 | if (irq_desc[irq].status & IRQ_PER_CPU) |
| 232 | continue; | 232 | continue; |
| 233 | 233 | ||
| 234 | cpus_and(mask, irq_desc[irq].affinity, map); | 234 | cpumask_and(&mask, irq_desc[irq].affinity, &map); |
| 235 | if (any_online_cpu(mask) == NR_CPUS) { | 235 | if (any_online_cpu(mask) == NR_CPUS) { |
| 236 | printk("Breaking affinity for irq %i\n", irq); | 236 | printk("Breaking affinity for irq %i\n", irq); |
| 237 | mask = map; | 237 | mask = map; |
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S index 161b9b9691f0..295ccc5e86b1 100644 --- a/arch/powerpc/kernel/vmlinux.lds.S +++ b/arch/powerpc/kernel/vmlinux.lds.S | |||
| @@ -184,6 +184,7 @@ SECTIONS | |||
| 184 | . = ALIGN(PAGE_SIZE); | 184 | . = ALIGN(PAGE_SIZE); |
| 185 | .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { | 185 | .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { |
| 186 | __per_cpu_start = .; | 186 | __per_cpu_start = .; |
| 187 | *(.data.percpu.page_aligned) | ||
| 187 | *(.data.percpu) | 188 | *(.data.percpu) |
| 188 | *(.data.percpu.shared_aligned) | 189 | *(.data.percpu.shared_aligned) |
| 189 | __per_cpu_end = .; | 190 | __per_cpu_end = .; |
diff --git a/arch/powerpc/platforms/pseries/xics.c b/arch/powerpc/platforms/pseries/xics.c index 84e058f1e1cc..80b513449f4c 100644 --- a/arch/powerpc/platforms/pseries/xics.c +++ b/arch/powerpc/platforms/pseries/xics.c | |||
| @@ -153,9 +153,10 @@ static int get_irq_server(unsigned int virq, unsigned int strict_check) | |||
| 153 | { | 153 | { |
| 154 | int server; | 154 | int server; |
| 155 | /* For the moment only implement delivery to all cpus or one cpu */ | 155 | /* For the moment only implement delivery to all cpus or one cpu */ |
| 156 | cpumask_t cpumask = irq_desc[virq].affinity; | 156 | cpumask_t cpumask; |
| 157 | cpumask_t tmp = CPU_MASK_NONE; | 157 | cpumask_t tmp = CPU_MASK_NONE; |
| 158 | 158 | ||
| 159 | cpumask_copy(&cpumask, irq_desc[virq].affinity); | ||
| 159 | if (!distribute_irqs) | 160 | if (!distribute_irqs) |
| 160 | return default_server; | 161 | return default_server; |
| 161 | 162 | ||
| @@ -869,7 +870,7 @@ void xics_migrate_irqs_away(void) | |||
| 869 | virq, cpu); | 870 | virq, cpu); |
| 870 | 871 | ||
| 871 | /* Reset affinity to all cpus */ | 872 | /* Reset affinity to all cpus */ |
| 872 | irq_desc[virq].affinity = CPU_MASK_ALL; | 873 | cpumask_setall(irq_desc[virq].affinity); |
| 873 | desc->chip->set_affinity(virq, cpu_all_mask); | 874 | desc->chip->set_affinity(virq, cpu_all_mask); |
| 874 | unlock: | 875 | unlock: |
| 875 | spin_unlock_irqrestore(&desc->lock, flags); | 876 | spin_unlock_irqrestore(&desc->lock, flags); |
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index a35297dbac28..532e205303a2 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c | |||
| @@ -566,9 +566,10 @@ static void __init mpic_scan_ht_pics(struct mpic *mpic) | |||
| 566 | #ifdef CONFIG_SMP | 566 | #ifdef CONFIG_SMP |
| 567 | static int irq_choose_cpu(unsigned int virt_irq) | 567 | static int irq_choose_cpu(unsigned int virt_irq) |
| 568 | { | 568 | { |
| 569 | cpumask_t mask = irq_desc[virt_irq].affinity; | 569 | cpumask_t mask; |
| 570 | int cpuid; | 570 | int cpuid; |
| 571 | 571 | ||
| 572 | cpumask_copy(&mask, irq_desc[virt_irq].affinity); | ||
| 572 | if (cpus_equal(mask, CPU_MASK_ALL)) { | 573 | if (cpus_equal(mask, CPU_MASK_ALL)) { |
| 573 | static int irq_rover; | 574 | static int irq_rover; |
| 574 | static DEFINE_SPINLOCK(irq_rover_lock); | 575 | static DEFINE_SPINLOCK(irq_rover_lock); |
diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index e289376198eb..3d2c6baae96b 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c | |||
| @@ -252,9 +252,10 @@ struct irq_handler_data { | |||
| 252 | #ifdef CONFIG_SMP | 252 | #ifdef CONFIG_SMP |
| 253 | static int irq_choose_cpu(unsigned int virt_irq) | 253 | static int irq_choose_cpu(unsigned int virt_irq) |
| 254 | { | 254 | { |
| 255 | cpumask_t mask = irq_desc[virt_irq].affinity; | 255 | cpumask_t mask; |
| 256 | int cpuid; | 256 | int cpuid; |
| 257 | 257 | ||
| 258 | cpumask_copy(&mask, irq_desc[virt_irq].affinity); | ||
| 258 | if (cpus_equal(mask, CPU_MASK_ALL)) { | 259 | if (cpus_equal(mask, CPU_MASK_ALL)) { |
| 259 | static int irq_rover; | 260 | static int irq_rover; |
| 260 | static DEFINE_SPINLOCK(irq_rover_lock); | 261 | static DEFINE_SPINLOCK(irq_rover_lock); |
| @@ -796,7 +797,7 @@ void fixup_irqs(void) | |||
| 796 | !(irq_desc[irq].status & IRQ_PER_CPU)) { | 797 | !(irq_desc[irq].status & IRQ_PER_CPU)) { |
| 797 | if (irq_desc[irq].chip->set_affinity) | 798 | if (irq_desc[irq].chip->set_affinity) |
| 798 | irq_desc[irq].chip->set_affinity(irq, | 799 | irq_desc[irq].chip->set_affinity(irq, |
| 799 | &irq_desc[irq].affinity); | 800 | irq_desc[irq].affinity); |
| 800 | } | 801 | } |
| 801 | spin_unlock_irqrestore(&irq_desc[irq].lock, flags); | 802 | spin_unlock_irqrestore(&irq_desc[irq].lock, flags); |
| 802 | } | 803 | } |
diff --git a/arch/sparc/kernel/time_64.c b/arch/sparc/kernel/time_64.c index 2db3c2229b95..db310aa00183 100644 --- a/arch/sparc/kernel/time_64.c +++ b/arch/sparc/kernel/time_64.c | |||
| @@ -729,7 +729,7 @@ void timer_interrupt(int irq, struct pt_regs *regs) | |||
| 729 | 729 | ||
| 730 | irq_enter(); | 730 | irq_enter(); |
| 731 | 731 | ||
| 732 | kstat_this_cpu.irqs[0]++; | 732 | kstat_incr_irqs_this_cpu(0, irq_to_desc(0)); |
| 733 | 733 | ||
| 734 | if (unlikely(!evt->event_handler)) { | 734 | if (unlikely(!evt->event_handler)) { |
| 735 | printk(KERN_WARNING | 735 | printk(KERN_WARNING |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 9c39095b33fc..8955262caa34 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -5,7 +5,7 @@ mainmenu "Linux Kernel Configuration for x86" | |||
| 5 | config 64BIT | 5 | config 64BIT |
| 6 | bool "64-bit kernel" if ARCH = "x86" | 6 | bool "64-bit kernel" if ARCH = "x86" |
| 7 | default ARCH = "x86_64" | 7 | default ARCH = "x86_64" |
| 8 | help | 8 | ---help--- |
| 9 | Say yes to build a 64-bit kernel - formerly known as x86_64 | 9 | Say yes to build a 64-bit kernel - formerly known as x86_64 |
| 10 | Say no to build a 32-bit kernel - formerly known as i386 | 10 | Say no to build a 32-bit kernel - formerly known as i386 |
| 11 | 11 | ||
| @@ -34,8 +34,8 @@ config X86 | |||
| 34 | select HAVE_FUNCTION_TRACER | 34 | select HAVE_FUNCTION_TRACER |
| 35 | select HAVE_FUNCTION_GRAPH_TRACER | 35 | select HAVE_FUNCTION_GRAPH_TRACER |
| 36 | select HAVE_FUNCTION_TRACE_MCOUNT_TEST | 36 | select HAVE_FUNCTION_TRACE_MCOUNT_TEST |
| 37 | select HAVE_KVM if ((X86_32 && !X86_VOYAGER && !X86_VISWS && !X86_NUMAQ) || X86_64) | 37 | select HAVE_KVM |
| 38 | select HAVE_ARCH_KGDB if !X86_VOYAGER | 38 | select HAVE_ARCH_KGDB |
| 39 | select HAVE_ARCH_TRACEHOOK | 39 | select HAVE_ARCH_TRACEHOOK |
| 40 | select HAVE_GENERIC_DMA_COHERENT if X86_32 | 40 | select HAVE_GENERIC_DMA_COHERENT if X86_32 |
| 41 | select HAVE_EFFICIENT_UNALIGNED_ACCESS | 41 | select HAVE_EFFICIENT_UNALIGNED_ACCESS |
| @@ -133,18 +133,16 @@ config ARCH_HAS_CACHE_LINE_SIZE | |||
| 133 | def_bool y | 133 | def_bool y |
| 134 | 134 | ||
| 135 | config HAVE_SETUP_PER_CPU_AREA | 135 | config HAVE_SETUP_PER_CPU_AREA |
| 136 | def_bool X86_64_SMP || (X86_SMP && !X86_VOYAGER) | 136 | def_bool y |
| 137 | 137 | ||
| 138 | config HAVE_CPUMASK_OF_CPU_MAP | 138 | config HAVE_CPUMASK_OF_CPU_MAP |
| 139 | def_bool X86_64_SMP | 139 | def_bool X86_64_SMP |
| 140 | 140 | ||
| 141 | config ARCH_HIBERNATION_POSSIBLE | 141 | config ARCH_HIBERNATION_POSSIBLE |
| 142 | def_bool y | 142 | def_bool y |
| 143 | depends on !SMP || !X86_VOYAGER | ||
| 144 | 143 | ||
| 145 | config ARCH_SUSPEND_POSSIBLE | 144 | config ARCH_SUSPEND_POSSIBLE |
| 146 | def_bool y | 145 | def_bool y |
| 147 | depends on !X86_VOYAGER | ||
| 148 | 146 | ||
| 149 | config ZONE_DMA32 | 147 | config ZONE_DMA32 |
| 150 | bool | 148 | bool |
| @@ -174,11 +172,6 @@ config GENERIC_PENDING_IRQ | |||
| 174 | depends on GENERIC_HARDIRQS && SMP | 172 | depends on GENERIC_HARDIRQS && SMP |
| 175 | default y | 173 | default y |
| 176 | 174 | ||
| 177 | config X86_SMP | ||
| 178 | bool | ||
| 179 | depends on SMP && ((X86_32 && !X86_VOYAGER) || X86_64) | ||
| 180 | default y | ||
| 181 | |||
| 182 | config USE_GENERIC_SMP_HELPERS | 175 | config USE_GENERIC_SMP_HELPERS |
| 183 | def_bool y | 176 | def_bool y |
| 184 | depends on SMP | 177 | depends on SMP |
| @@ -194,19 +187,17 @@ config X86_64_SMP | |||
| 194 | config X86_HT | 187 | config X86_HT |
| 195 | bool | 188 | bool |
| 196 | depends on SMP | 189 | depends on SMP |
| 197 | depends on (X86_32 && !X86_VOYAGER) || X86_64 | ||
| 198 | default y | ||
| 199 | |||
| 200 | config X86_BIOS_REBOOT | ||
| 201 | bool | ||
| 202 | depends on !X86_VOYAGER | ||
| 203 | default y | 190 | default y |
| 204 | 191 | ||
| 205 | config X86_TRAMPOLINE | 192 | config X86_TRAMPOLINE |
| 206 | bool | 193 | bool |
| 207 | depends on X86_SMP || (X86_VOYAGER && SMP) || (64BIT && ACPI_SLEEP) | 194 | depends on SMP || (64BIT && ACPI_SLEEP) |
| 208 | default y | 195 | default y |
| 209 | 196 | ||
| 197 | config X86_32_LAZY_GS | ||
| 198 | def_bool y | ||
| 199 | depends on X86_32 && !CC_STACKPROTECTOR | ||
| 200 | |||
| 210 | config KTIME_SCALAR | 201 | config KTIME_SCALAR |
| 211 | def_bool X86_32 | 202 | def_bool X86_32 |
| 212 | source "init/Kconfig" | 203 | source "init/Kconfig" |
| @@ -244,14 +235,24 @@ config SMP | |||
| 244 | 235 | ||
| 245 | If you don't know what to do here, say N. | 236 | If you don't know what to do here, say N. |
| 246 | 237 | ||
| 247 | config X86_HAS_BOOT_CPU_ID | 238 | config X86_X2APIC |
| 248 | def_bool y | 239 | bool "Support x2apic" |
| 249 | depends on X86_VOYAGER | 240 | depends on X86_LOCAL_APIC && X86_64 |
| 241 | ---help--- | ||
| 242 | This enables x2apic support on CPUs that have this feature. | ||
| 243 | |||
| 244 | This allows 32-bit apic IDs (so it can support very large systems), | ||
| 245 | and accesses the local apic via MSRs not via mmio. | ||
| 246 | |||
| 247 | ( On certain CPU models you may need to enable INTR_REMAP too, | ||
| 248 | to get functional x2apic mode. ) | ||
| 249 | |||
| 250 | If you don't know what to do here, say N. | ||
| 250 | 251 | ||
| 251 | config SPARSE_IRQ | 252 | config SPARSE_IRQ |
| 252 | bool "Support sparse irq numbering" | 253 | bool "Support sparse irq numbering" |
| 253 | depends on PCI_MSI || HT_IRQ | 254 | depends on PCI_MSI || HT_IRQ |
| 254 | help | 255 | ---help--- |
| 255 | This enables support for sparse irqs. This is useful for distro | 256 | This enables support for sparse irqs. This is useful for distro |
| 256 | kernels that want to define a high CONFIG_NR_CPUS value but still | 257 | kernels that want to define a high CONFIG_NR_CPUS value but still |
| 257 | want to have low kernel memory footprint on smaller machines. | 258 | want to have low kernel memory footprint on smaller machines. |
| @@ -265,137 +266,155 @@ config NUMA_MIGRATE_IRQ_DESC | |||
| 265 | bool "Move irq desc when changing irq smp_affinity" | 266 | bool "Move irq desc when changing irq smp_affinity" |
| 266 | depends on SPARSE_IRQ && NUMA | 267 | depends on SPARSE_IRQ && NUMA |
| 267 | default n | 268 | default n |
| 268 | help | 269 | ---help--- |
| 269 | This enables moving irq_desc to cpu/node that irq will use handled. | 270 | This enables moving irq_desc to cpu/node that irq will use handled. |
| 270 | 271 | ||
| 271 | If you don't know what to do here, say N. | 272 | If you don't know what to do here, say N. |
| 272 | 273 | ||
| 273 | config X86_FIND_SMP_CONFIG | ||
| 274 | def_bool y | ||
| 275 | depends on X86_MPPARSE || X86_VOYAGER | ||
| 276 | |||
| 277 | config X86_MPPARSE | 274 | config X86_MPPARSE |
| 278 | bool "Enable MPS table" if ACPI | 275 | bool "Enable MPS table" if ACPI |
| 279 | default y | 276 | default y |
| 280 | depends on X86_LOCAL_APIC | 277 | depends on X86_LOCAL_APIC |
| 281 | help | 278 | ---help--- |
| 282 | For old smp systems that do not have proper acpi support. Newer systems | 279 | For old smp systems that do not have proper acpi support. Newer systems |
| 283 | (esp with 64bit cpus) with acpi support, MADT and DSDT will override it | 280 | (esp with 64bit cpus) with acpi support, MADT and DSDT will override it |
| 284 | 281 | ||
| 285 | choice | 282 | config X86_BIGSMP |
| 286 | prompt "Subarchitecture Type" | 283 | bool "Support for big SMP systems with more than 8 CPUs" |
| 287 | default X86_PC | 284 | depends on X86_32 && SMP |
| 285 | ---help--- | ||
| 286 | This option is needed for the systems that have more than 8 CPUs | ||
| 288 | 287 | ||
| 289 | config X86_PC | 288 | config X86_EXTENDED_PLATFORM |
| 290 | bool "PC-compatible" | 289 | bool "Support for extended (non-PC) x86 platforms" |
| 291 | help | 290 | default y |
| 292 | Choose this option if your computer is a standard PC or compatible. | 291 | ---help--- |
| 292 | If you disable this option then the kernel will only support | ||
| 293 | standard PC platforms. (which covers the vast majority of | ||
| 294 | systems out there.) | ||
| 295 | |||
| 296 | If you enable this option then you'll be able to select a number | ||
| 297 | of non-PC x86 platforms. | ||
| 298 | |||
| 299 | If you have one of these systems, or if you want to build a | ||
| 300 | generic distribution kernel, say Y here - otherwise say N. | ||
| 301 | |||
| 302 | # This is an alphabetically sorted list of 64 bit extended platforms | ||
| 303 | # Please maintain the alphabetic order if and when there are additions | ||
| 304 | |||
| 305 | config X86_VSMP | ||
| 306 | bool "ScaleMP vSMP" | ||
| 307 | select PARAVIRT | ||
| 308 | depends on X86_64 && PCI | ||
| 309 | depends on X86_EXTENDED_PLATFORM | ||
| 310 | ---help--- | ||
| 311 | Support for ScaleMP vSMP systems. Say 'Y' here if this kernel is | ||
| 312 | supposed to run on these EM64T-based machines. Only choose this option | ||
| 313 | if you have one of these machines. | ||
| 314 | |||
| 315 | config X86_UV | ||
| 316 | bool "SGI Ultraviolet" | ||
| 317 | depends on X86_64 | ||
| 318 | depends on X86_EXTENDED_PLATFORM | ||
| 319 | select X86_X2APIC | ||
| 320 | ---help--- | ||
| 321 | This option is needed in order to support SGI Ultraviolet systems. | ||
| 322 | If you don't have one of these, you should say N here. | ||
| 323 | |||
| 324 | # Following is an alphabetically sorted list of 32 bit extended platforms | ||
| 325 | # Please maintain the alphabetic order if and when there are additions | ||
| 293 | 326 | ||
| 294 | config X86_ELAN | 327 | config X86_ELAN |
| 295 | bool "AMD Elan" | 328 | bool "AMD Elan" |
| 296 | depends on X86_32 | 329 | depends on X86_32 |
| 297 | help | 330 | depends on X86_EXTENDED_PLATFORM |
| 331 | ---help--- | ||
| 298 | Select this for an AMD Elan processor. | 332 | Select this for an AMD Elan processor. |
| 299 | 333 | ||
| 300 | Do not use this option for K6/Athlon/Opteron processors! | 334 | Do not use this option for K6/Athlon/Opteron processors! |
| 301 | 335 | ||
| 302 | If unsure, choose "PC-compatible" instead. | 336 | If unsure, choose "PC-compatible" instead. |
| 303 | 337 | ||
| 304 | config X86_VOYAGER | 338 | config X86_RDC321X |
| 305 | bool "Voyager (NCR)" | 339 | bool "RDC R-321x SoC" |
| 306 | depends on X86_32 && (SMP || BROKEN) && !PCI | ||
| 307 | help | ||
| 308 | Voyager is an MCA-based 32-way capable SMP architecture proprietary | ||
| 309 | to NCR Corp. Machine classes 345x/35xx/4100/51xx are Voyager-based. | ||
| 310 | |||
| 311 | *** WARNING *** | ||
| 312 | |||
| 313 | If you do not specifically know you have a Voyager based machine, | ||
| 314 | say N here, otherwise the kernel you build will not be bootable. | ||
| 315 | |||
| 316 | config X86_GENERICARCH | ||
| 317 | bool "Generic architecture" | ||
| 318 | depends on X86_32 | 340 | depends on X86_32 |
| 319 | help | 341 | depends on X86_EXTENDED_PLATFORM |
| 320 | This option compiles in the NUMAQ, Summit, bigsmp, ES7000, default | 342 | select M486 |
| 343 | select X86_REBOOTFIXUPS | ||
| 344 | ---help--- | ||
| 345 | This option is needed for RDC R-321x system-on-chip, also known | ||
| 346 | as R-8610-(G). | ||
| 347 | If you don't have one of these chips, you should say N here. | ||
| 348 | |||
| 349 | config X86_32_NON_STANDARD | ||
| 350 | bool "Support non-standard 32-bit SMP architectures" | ||
| 351 | depends on X86_32 && SMP | ||
| 352 | depends on X86_EXTENDED_PLATFORM | ||
| 353 | ---help--- | ||
| 354 | This option compiles in the NUMAQ, Summit, bigsmp, ES7000, default | ||
| 321 | subarchitectures. It is intended for a generic binary kernel. | 355 | subarchitectures. It is intended for a generic binary kernel. |
| 322 | if you select them all, kernel will probe it one by one. and will | 356 | if you select them all, kernel will probe it one by one. and will |
| 323 | fallback to default. | 357 | fallback to default. |
| 324 | 358 | ||
| 325 | if X86_GENERICARCH | 359 | # Alphabetically sorted list of Non standard 32 bit platforms |
| 326 | 360 | ||
| 327 | config X86_NUMAQ | 361 | config X86_NUMAQ |
| 328 | bool "NUMAQ (IBM/Sequent)" | 362 | bool "NUMAQ (IBM/Sequent)" |
| 329 | depends on SMP && X86_32 && PCI && X86_MPPARSE | 363 | depends on X86_32_NON_STANDARD |
| 330 | select NUMA | 364 | select NUMA |
| 331 | help | 365 | select X86_MPPARSE |
| 366 | ---help--- | ||
| 332 | This option is used for getting Linux to run on a NUMAQ (IBM/Sequent) | 367 | This option is used for getting Linux to run on a NUMAQ (IBM/Sequent) |
| 333 | NUMA multiquad box. This changes the way that processors are | 368 | NUMA multiquad box. This changes the way that processors are |
| 334 | bootstrapped, and uses Clustered Logical APIC addressing mode instead | 369 | bootstrapped, and uses Clustered Logical APIC addressing mode instead |
| 335 | of Flat Logical. You will need a new lynxer.elf file to flash your | 370 | of Flat Logical. You will need a new lynxer.elf file to flash your |
| 336 | firmware with - send email to <Martin.Bligh@us.ibm.com>. | 371 | firmware with - send email to <Martin.Bligh@us.ibm.com>. |
| 337 | 372 | ||
| 373 | config X86_VISWS | ||
| 374 | bool "SGI 320/540 (Visual Workstation)" | ||
| 375 | depends on X86_32 && PCI && X86_MPPARSE && PCI_GODIRECT | ||
| 376 | depends on X86_32_NON_STANDARD | ||
| 377 | ---help--- | ||
| 378 | The SGI Visual Workstation series is an IA32-based workstation | ||
| 379 | based on SGI systems chips with some legacy PC hardware attached. | ||
| 380 | |||
| 381 | Say Y here to create a kernel to run on the SGI 320 or 540. | ||
| 382 | |||
| 383 | A kernel compiled for the Visual Workstation will run on general | ||
| 384 | PCs as well. See <file:Documentation/sgi-visws.txt> for details. | ||
| 385 | |||
| 338 | config X86_SUMMIT | 386 | config X86_SUMMIT |
| 339 | bool "Summit/EXA (IBM x440)" | 387 | bool "Summit/EXA (IBM x440)" |
| 340 | depends on X86_32 && SMP | 388 | depends on X86_32_NON_STANDARD |
| 341 | help | 389 | ---help--- |
| 342 | This option is needed for IBM systems that use the Summit/EXA chipset. | 390 | This option is needed for IBM systems that use the Summit/EXA chipset. |
| 343 | In particular, it is needed for the x440. | 391 | In particular, it is needed for the x440. |
| 344 | 392 | ||
| 345 | config X86_ES7000 | 393 | config X86_ES7000 |
| 346 | bool "Support for Unisys ES7000 IA32 series" | 394 | bool "Unisys ES7000 IA32 series" |
| 347 | depends on X86_32 && SMP | 395 | depends on X86_32_NON_STANDARD && X86_BIGSMP |
| 348 | help | 396 | ---help--- |
| 349 | Support for Unisys ES7000 systems. Say 'Y' here if this kernel is | 397 | Support for Unisys ES7000 systems. Say 'Y' here if this kernel is |
| 350 | supposed to run on an IA32-based Unisys ES7000 system. | 398 | supposed to run on an IA32-based Unisys ES7000 system. |
| 351 | 399 | ||
| 352 | config X86_BIGSMP | 400 | config X86_VOYAGER |
| 353 | bool "Support for big SMP systems with more than 8 CPUs" | 401 | bool "Voyager (NCR)" |
| 354 | depends on X86_32 && SMP | 402 | depends on SMP && !PCI && BROKEN |
| 355 | help | 403 | depends on X86_32_NON_STANDARD |
| 356 | This option is needed for the systems that have more than 8 CPUs | 404 | ---help--- |
| 357 | and if the system is not of any sub-arch type above. | 405 | Voyager is an MCA-based 32-way capable SMP architecture proprietary |
| 358 | 406 | to NCR Corp. Machine classes 345x/35xx/4100/51xx are Voyager-based. | |
| 359 | endif | ||
| 360 | |||
| 361 | config X86_VSMP | ||
| 362 | bool "Support for ScaleMP vSMP" | ||
| 363 | select PARAVIRT | ||
| 364 | depends on X86_64 && PCI | ||
| 365 | help | ||
| 366 | Support for ScaleMP vSMP systems. Say 'Y' here if this kernel is | ||
| 367 | supposed to run on these EM64T-based machines. Only choose this option | ||
| 368 | if you have one of these machines. | ||
| 369 | |||
| 370 | endchoice | ||
| 371 | |||
| 372 | config X86_VISWS | ||
| 373 | bool "SGI 320/540 (Visual Workstation)" | ||
| 374 | depends on X86_32 && PCI && !X86_VOYAGER && X86_MPPARSE && PCI_GODIRECT | ||
| 375 | help | ||
| 376 | The SGI Visual Workstation series is an IA32-based workstation | ||
| 377 | based on SGI systems chips with some legacy PC hardware attached. | ||
| 378 | |||
| 379 | Say Y here to create a kernel to run on the SGI 320 or 540. | ||
| 380 | 407 | ||
| 381 | A kernel compiled for the Visual Workstation will run on general | 408 | *** WARNING *** |
| 382 | PCs as well. See <file:Documentation/sgi-visws.txt> for details. | ||
| 383 | 409 | ||
| 384 | config X86_RDC321X | 410 | If you do not specifically know you have a Voyager based machine, |
| 385 | bool "RDC R-321x SoC" | 411 | say N here, otherwise the kernel you build will not be bootable. |
| 386 | depends on X86_32 | ||
| 387 | select M486 | ||
| 388 | select X86_REBOOTFIXUPS | ||
| 389 | help | ||
| 390 | This option is needed for RDC R-321x system-on-chip, also known | ||
| 391 | as R-8610-(G). | ||
| 392 | If you don't have one of these chips, you should say N here. | ||
| 393 | 412 | ||
| 394 | config SCHED_OMIT_FRAME_POINTER | 413 | config SCHED_OMIT_FRAME_POINTER |
| 395 | def_bool y | 414 | def_bool y |
| 396 | prompt "Single-depth WCHAN output" | 415 | prompt "Single-depth WCHAN output" |
| 397 | depends on X86 | 416 | depends on X86 |
| 398 | help | 417 | ---help--- |
| 399 | Calculate simpler /proc/<PID>/wchan values. If this option | 418 | Calculate simpler /proc/<PID>/wchan values. If this option |
| 400 | is disabled then wchan values will recurse back to the | 419 | is disabled then wchan values will recurse back to the |
| 401 | caller function. This provides more accurate wchan values, | 420 | caller function. This provides more accurate wchan values, |
| @@ -405,7 +424,7 @@ config SCHED_OMIT_FRAME_POINTER | |||
| 405 | 424 | ||
| 406 | menuconfig PARAVIRT_GUEST | 425 | menuconfig PARAVIRT_GUEST |
| 407 | bool "Paravirtualized guest support" | 426 | bool "Paravirtualized guest support" |
| 408 | help | 427 | ---help--- |
| 409 | Say Y here to get to see options related to running Linux under | 428 | Say Y here to get to see options related to running Linux under |
| 410 | various hypervisors. This option alone does not add any kernel code. | 429 | various hypervisors. This option alone does not add any kernel code. |
| 411 | 430 | ||
| @@ -419,8 +438,7 @@ config VMI | |||
| 419 | bool "VMI Guest support" | 438 | bool "VMI Guest support" |
| 420 | select PARAVIRT | 439 | select PARAVIRT |
| 421 | depends on X86_32 | 440 | depends on X86_32 |
| 422 | depends on !X86_VOYAGER | 441 | ---help--- |
| 423 | help | ||
| 424 | VMI provides a paravirtualized interface to the VMware ESX server | 442 | VMI provides a paravirtualized interface to the VMware ESX server |
| 425 | (it could be used by other hypervisors in theory too, but is not | 443 | (it could be used by other hypervisors in theory too, but is not |
| 426 | at the moment), by linking the kernel to a GPL-ed ROM module | 444 | at the moment), by linking the kernel to a GPL-ed ROM module |
| @@ -430,8 +448,7 @@ config KVM_CLOCK | |||
| 430 | bool "KVM paravirtualized clock" | 448 | bool "KVM paravirtualized clock" |
| 431 | select PARAVIRT | 449 | select PARAVIRT |
| 432 | select PARAVIRT_CLOCK | 450 | select PARAVIRT_CLOCK |
| 433 | depends on !X86_VOYAGER | 451 | ---help--- |
| 434 | help | ||
| 435 | Turning on this option will allow you to run a paravirtualized clock | 452 | Turning on this option will allow you to run a paravirtualized clock |
| 436 | when running over the KVM hypervisor. Instead of relying on a PIT | 453 | when running over the KVM hypervisor. Instead of relying on a PIT |
| 437 | (or probably other) emulation by the underlying device model, the host | 454 | (or probably other) emulation by the underlying device model, the host |
| @@ -441,17 +458,15 @@ config KVM_CLOCK | |||
| 441 | config KVM_GUEST | 458 | config KVM_GUEST |
| 442 | bool "KVM Guest support" | 459 | bool "KVM Guest support" |
| 443 | select PARAVIRT | 460 | select PARAVIRT |
| 444 | depends on !X86_VOYAGER | 461 | ---help--- |
| 445 | help | 462 | This option enables various optimizations for running under the KVM |
| 446 | This option enables various optimizations for running under the KVM | 463 | hypervisor. |
| 447 | hypervisor. | ||
| 448 | 464 | ||
| 449 | source "arch/x86/lguest/Kconfig" | 465 | source "arch/x86/lguest/Kconfig" |
| 450 | 466 | ||
| 451 | config PARAVIRT | 467 | config PARAVIRT |
| 452 | bool "Enable paravirtualization code" | 468 | bool "Enable paravirtualization code" |
| 453 | depends on !X86_VOYAGER | 469 | ---help--- |
| 454 | help | ||
| 455 | This changes the kernel so it can modify itself when it is run | 470 | This changes the kernel so it can modify itself when it is run |
| 456 | under a hypervisor, potentially improving performance significantly | 471 | under a hypervisor, potentially improving performance significantly |
| 457 | over full virtualization. However, when run without a hypervisor | 472 | over full virtualization. However, when run without a hypervisor |
| @@ -464,51 +479,51 @@ config PARAVIRT_CLOCK | |||
| 464 | endif | 479 | endif |
| 465 | 480 | ||
| 466 | config PARAVIRT_DEBUG | 481 | config PARAVIRT_DEBUG |
| 467 | bool "paravirt-ops debugging" | 482 | bool "paravirt-ops debugging" |
| 468 | depends on PARAVIRT && DEBUG_KERNEL | 483 | depends on PARAVIRT && DEBUG_KERNEL |
| 469 | help | 484 | ---help--- |
| 470 | Enable to debug paravirt_ops internals. Specifically, BUG if | 485 | Enable to debug paravirt_ops internals. Specifically, BUG if |
| 471 | a paravirt_op is missing when it is called. | 486 | a paravirt_op is missing when it is called. |
| 472 | 487 | ||
| 473 | config MEMTEST | 488 | config MEMTEST |
| 474 | bool "Memtest" | 489 | bool "Memtest" |
| 475 | help | 490 | ---help--- |
| 476 | This option adds a kernel parameter 'memtest', which allows memtest | 491 | This option adds a kernel parameter 'memtest', which allows memtest |
| 477 | to be set. | 492 | to be set. |
| 478 | memtest=0, mean disabled; -- default | 493 | memtest=0, mean disabled; -- default |
| 479 | memtest=1, mean do 1 test pattern; | 494 | memtest=1, mean do 1 test pattern; |
| 480 | ... | 495 | ... |
| 481 | memtest=4, mean do 4 test patterns. | 496 | memtest=4, mean do 4 test patterns. |
| 482 | If you are unsure how to answer this question, answer N. | 497 | If you are unsure how to answer this question, answer N. |
| 483 | 498 | ||
| 484 | config X86_SUMMIT_NUMA | 499 | config X86_SUMMIT_NUMA |
| 485 | def_bool y | 500 | def_bool y |
| 486 | depends on X86_32 && NUMA && X86_GENERICARCH | 501 | depends on X86_32 && NUMA && X86_32_NON_STANDARD |
| 487 | 502 | ||
| 488 | config X86_CYCLONE_TIMER | 503 | config X86_CYCLONE_TIMER |
| 489 | def_bool y | 504 | def_bool y |
| 490 | depends on X86_GENERICARCH | 505 | depends on X86_32_NON_STANDARD |
| 491 | 506 | ||
| 492 | source "arch/x86/Kconfig.cpu" | 507 | source "arch/x86/Kconfig.cpu" |
| 493 | 508 | ||
| 494 | config HPET_TIMER | 509 | config HPET_TIMER |
| 495 | def_bool X86_64 | 510 | def_bool X86_64 |
| 496 | prompt "HPET Timer Support" if X86_32 | 511 | prompt "HPET Timer Support" if X86_32 |
| 497 | help | 512 | ---help--- |
| 498 | Use the IA-PC HPET (High Precision Event Timer) to manage | 513 | Use the IA-PC HPET (High Precision Event Timer) to manage |
| 499 | time in preference to the PIT and RTC, if a HPET is | 514 | time in preference to the PIT and RTC, if a HPET is |
| 500 | present. | 515 | present. |
| 501 | HPET is the next generation timer replacing legacy 8254s. | 516 | HPET is the next generation timer replacing legacy 8254s. |
| 502 | The HPET provides a stable time base on SMP | 517 | The HPET provides a stable time base on SMP |
| 503 | systems, unlike the TSC, but it is more expensive to access, | 518 | systems, unlike the TSC, but it is more expensive to access, |
| 504 | as it is off-chip. You can find the HPET spec at | 519 | as it is off-chip. You can find the HPET spec at |
| 505 | <http://www.intel.com/hardwaredesign/hpetspec_1.pdf>. | 520 | <http://www.intel.com/hardwaredesign/hpetspec_1.pdf>. |
| 506 | 521 | ||
| 507 | You can safely choose Y here. However, HPET will only be | 522 | You can safely choose Y here. However, HPET will only be |
| 508 | activated if the platform and the BIOS support this feature. | 523 | activated if the platform and the BIOS support this feature. |
| 509 | Otherwise the 8254 will be used for timing services. | 524 | Otherwise the 8254 will be used for timing services. |
| 510 | 525 | ||
| 511 | Choose N to continue using the legacy 8254 timer. | 526 | Choose N to continue using the legacy 8254 timer. |
| 512 | 527 | ||
| 513 | config HPET_EMULATE_RTC | 528 | config HPET_EMULATE_RTC |
| 514 | def_bool y | 529 | def_bool y |
| @@ -519,7 +534,7 @@ config HPET_EMULATE_RTC | |||
| 519 | config DMI | 534 | config DMI |
| 520 | default y | 535 | default y |
| 521 | bool "Enable DMI scanning" if EMBEDDED | 536 | bool "Enable DMI scanning" if EMBEDDED |
| 522 | help | 537 | ---help--- |
| 523 | Enabled scanning of DMI to identify machine quirks. Say Y | 538 | Enabled scanning of DMI to identify machine quirks. Say Y |
| 524 | here unless you have verified that your setup is not | 539 | here unless you have verified that your setup is not |
| 525 | affected by entries in the DMI blacklist. Required by PNP | 540 | affected by entries in the DMI blacklist. Required by PNP |
| @@ -531,7 +546,7 @@ config GART_IOMMU | |||
| 531 | select SWIOTLB | 546 | select SWIOTLB |
| 532 | select AGP | 547 | select AGP |
| 533 | depends on X86_64 && PCI | 548 | depends on X86_64 && PCI |
| 534 | help | 549 | ---help--- |
| 535 | Support for full DMA access of devices with 32bit memory access only | 550 | Support for full DMA access of devices with 32bit memory access only |
| 536 | on systems with more than 3GB. This is usually needed for USB, | 551 | on systems with more than 3GB. This is usually needed for USB, |
| 537 | sound, many IDE/SATA chipsets and some other devices. | 552 | sound, many IDE/SATA chipsets and some other devices. |
| @@ -546,7 +561,7 @@ config CALGARY_IOMMU | |||
| 546 | bool "IBM Calgary IOMMU support" | 561 | bool "IBM Calgary IOMMU support" |
| 547 | select SWIOTLB | 562 | select SWIOTLB |
| 548 | depends on X86_64 && PCI && EXPERIMENTAL | 563 | depends on X86_64 && PCI && EXPERIMENTAL |
| 549 | help | 564 | ---help--- |
| 550 | Support for hardware IOMMUs in IBM's xSeries x366 and x460 | 565 | Support for hardware IOMMUs in IBM's xSeries x366 and x460 |
| 551 | systems. Needed to run systems with more than 3GB of memory | 566 | systems. Needed to run systems with more than 3GB of memory |
| 552 | properly with 32-bit PCI devices that do not support DAC | 567 | properly with 32-bit PCI devices that do not support DAC |
| @@ -564,7 +579,7 @@ config CALGARY_IOMMU_ENABLED_BY_DEFAULT | |||
| 564 | def_bool y | 579 | def_bool y |
| 565 | prompt "Should Calgary be enabled by default?" | 580 | prompt "Should Calgary be enabled by default?" |
| 566 | depends on CALGARY_IOMMU | 581 | depends on CALGARY_IOMMU |
| 567 | help | 582 | ---help--- |
| 568 | Should Calgary be enabled by default? if you choose 'y', Calgary | 583 | Should Calgary be enabled by default? if you choose 'y', Calgary |
| 569 | will be used (if it exists). If you choose 'n', Calgary will not be | 584 | will be used (if it exists). If you choose 'n', Calgary will not be |
| 570 | used even if it exists. If you choose 'n' and would like to use | 585 | used even if it exists. If you choose 'n' and would like to use |
| @@ -576,7 +591,7 @@ config AMD_IOMMU | |||
| 576 | select SWIOTLB | 591 | select SWIOTLB |
| 577 | select PCI_MSI | 592 | select PCI_MSI |
| 578 | depends on X86_64 && PCI && ACPI | 593 | depends on X86_64 && PCI && ACPI |
| 579 | help | 594 | ---help--- |
| 580 | With this option you can enable support for AMD IOMMU hardware in | 595 | With this option you can enable support for AMD IOMMU hardware in |
| 581 | your system. An IOMMU is a hardware component which provides | 596 | your system. An IOMMU is a hardware component which provides |
| 582 | remapping of DMA memory accesses from devices. With an AMD IOMMU you | 597 | remapping of DMA memory accesses from devices. With an AMD IOMMU you |
| @@ -591,7 +606,7 @@ config AMD_IOMMU_STATS | |||
| 591 | bool "Export AMD IOMMU statistics to debugfs" | 606 | bool "Export AMD IOMMU statistics to debugfs" |
| 592 | depends on AMD_IOMMU | 607 | depends on AMD_IOMMU |
| 593 | select DEBUG_FS | 608 | select DEBUG_FS |
| 594 | help | 609 | ---help--- |
| 595 | This option enables code in the AMD IOMMU driver to collect various | 610 | This option enables code in the AMD IOMMU driver to collect various |
| 596 | statistics about whats happening in the driver and exports that | 611 | statistics about whats happening in the driver and exports that |
| 597 | information to userspace via debugfs. | 612 | information to userspace via debugfs. |
| @@ -600,7 +615,7 @@ config AMD_IOMMU_STATS | |||
| 600 | # need this always selected by IOMMU for the VIA workaround | 615 | # need this always selected by IOMMU for the VIA workaround |
| 601 | config SWIOTLB | 616 | config SWIOTLB |
| 602 | def_bool y if X86_64 | 617 | def_bool y if X86_64 |
| 603 | help | 618 | ---help--- |
| 604 | Support for software bounce buffers used on x86-64 systems | 619 | Support for software bounce buffers used on x86-64 systems |
| 605 | which don't have a hardware IOMMU (e.g. the current generation | 620 | which don't have a hardware IOMMU (e.g. the current generation |
| 606 | of Intel's x86-64 CPUs). Using this PCI devices which can only | 621 | of Intel's x86-64 CPUs). Using this PCI devices which can only |
| @@ -618,7 +633,7 @@ config MAXSMP | |||
| 618 | depends on X86_64 && SMP && DEBUG_KERNEL && EXPERIMENTAL | 633 | depends on X86_64 && SMP && DEBUG_KERNEL && EXPERIMENTAL |
| 619 | select CPUMASK_OFFSTACK | 634 | select CPUMASK_OFFSTACK |
| 620 | default n | 635 | default n |
| 621 | help | 636 | ---help--- |
| 622 | Configure maximum number of CPUS and NUMA Nodes for this architecture. | 637 | Configure maximum number of CPUS and NUMA Nodes for this architecture. |
| 623 | If unsure, say N. | 638 | If unsure, say N. |
| 624 | 639 | ||
| @@ -629,7 +644,7 @@ config NR_CPUS | |||
| 629 | default "4096" if MAXSMP | 644 | default "4096" if MAXSMP |
| 630 | default "32" if SMP && (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP || X86_ES7000) | 645 | default "32" if SMP && (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP || X86_ES7000) |
| 631 | default "8" if SMP | 646 | default "8" if SMP |
| 632 | help | 647 | ---help--- |
| 633 | This allows you to specify the maximum number of CPUs which this | 648 | This allows you to specify the maximum number of CPUs which this |
| 634 | kernel will support. The maximum supported value is 512 and the | 649 | kernel will support. The maximum supported value is 512 and the |
| 635 | minimum value which makes sense is 2. | 650 | minimum value which makes sense is 2. |
| @@ -640,7 +655,7 @@ config NR_CPUS | |||
| 640 | config SCHED_SMT | 655 | config SCHED_SMT |
| 641 | bool "SMT (Hyperthreading) scheduler support" | 656 | bool "SMT (Hyperthreading) scheduler support" |
| 642 | depends on X86_HT | 657 | depends on X86_HT |
| 643 | help | 658 | ---help--- |
| 644 | SMT scheduler support improves the CPU scheduler's decision making | 659 | SMT scheduler support improves the CPU scheduler's decision making |
| 645 | when dealing with Intel Pentium 4 chips with HyperThreading at a | 660 | when dealing with Intel Pentium 4 chips with HyperThreading at a |
| 646 | cost of slightly increased overhead in some places. If unsure say | 661 | cost of slightly increased overhead in some places. If unsure say |
| @@ -650,7 +665,7 @@ config SCHED_MC | |||
| 650 | def_bool y | 665 | def_bool y |
| 651 | prompt "Multi-core scheduler support" | 666 | prompt "Multi-core scheduler support" |
| 652 | depends on X86_HT | 667 | depends on X86_HT |
| 653 | help | 668 | ---help--- |
| 654 | Multi-core scheduler support improves the CPU scheduler's decision | 669 | Multi-core scheduler support improves the CPU scheduler's decision |
| 655 | making when dealing with multi-core CPU chips at a cost of slightly | 670 | making when dealing with multi-core CPU chips at a cost of slightly |
| 656 | increased overhead in some places. If unsure say N here. | 671 | increased overhead in some places. If unsure say N here. |
| @@ -659,8 +674,8 @@ source "kernel/Kconfig.preempt" | |||
| 659 | 674 | ||
| 660 | config X86_UP_APIC | 675 | config X86_UP_APIC |
| 661 | bool "Local APIC support on uniprocessors" | 676 | bool "Local APIC support on uniprocessors" |
| 662 | depends on X86_32 && !SMP && !(X86_VOYAGER || X86_GENERICARCH) | 677 | depends on X86_32 && !SMP && !X86_32_NON_STANDARD |
| 663 | help | 678 | ---help--- |
| 664 | A local APIC (Advanced Programmable Interrupt Controller) is an | 679 | A local APIC (Advanced Programmable Interrupt Controller) is an |
| 665 | integrated interrupt controller in the CPU. If you have a single-CPU | 680 | integrated interrupt controller in the CPU. If you have a single-CPU |
| 666 | system which has a processor with a local APIC, you can say Y here to | 681 | system which has a processor with a local APIC, you can say Y here to |
| @@ -673,7 +688,7 @@ config X86_UP_APIC | |||
| 673 | config X86_UP_IOAPIC | 688 | config X86_UP_IOAPIC |
| 674 | bool "IO-APIC support on uniprocessors" | 689 | bool "IO-APIC support on uniprocessors" |
| 675 | depends on X86_UP_APIC | 690 | depends on X86_UP_APIC |
| 676 | help | 691 | ---help--- |
| 677 | An IO-APIC (I/O Advanced Programmable Interrupt Controller) is an | 692 | An IO-APIC (I/O Advanced Programmable Interrupt Controller) is an |
| 678 | SMP-capable replacement for PC-style interrupt controllers. Most | 693 | SMP-capable replacement for PC-style interrupt controllers. Most |
| 679 | SMP systems and many recent uniprocessor systems have one. | 694 | SMP systems and many recent uniprocessor systems have one. |
| @@ -684,11 +699,11 @@ config X86_UP_IOAPIC | |||
| 684 | 699 | ||
| 685 | config X86_LOCAL_APIC | 700 | config X86_LOCAL_APIC |
| 686 | def_bool y | 701 | def_bool y |
| 687 | depends on X86_64 || (X86_32 && (X86_UP_APIC || (SMP && !X86_VOYAGER) || X86_GENERICARCH)) | 702 | depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_APIC |
| 688 | 703 | ||
| 689 | config X86_IO_APIC | 704 | config X86_IO_APIC |
| 690 | def_bool y | 705 | def_bool y |
| 691 | depends on X86_64 || (X86_32 && (X86_UP_IOAPIC || (SMP && !X86_VOYAGER) || X86_GENERICARCH)) | 706 | depends on X86_64 || SMP || X86_32_NON_STANDARD || X86_UP_APIC |
| 692 | 707 | ||
| 693 | config X86_VISWS_APIC | 708 | config X86_VISWS_APIC |
| 694 | def_bool y | 709 | def_bool y |
| @@ -698,7 +713,7 @@ config X86_REROUTE_FOR_BROKEN_BOOT_IRQS | |||
| 698 | bool "Reroute for broken boot IRQs" | 713 | bool "Reroute for broken boot IRQs" |
| 699 | default n | 714 | default n |
| 700 | depends on X86_IO_APIC | 715 | depends on X86_IO_APIC |
| 701 | help | 716 | ---help--- |
| 702 | This option enables a workaround that fixes a source of | 717 | This option enables a workaround that fixes a source of |
| 703 | spurious interrupts. This is recommended when threaded | 718 | spurious interrupts. This is recommended when threaded |
| 704 | interrupt handling is used on systems where the generation of | 719 | interrupt handling is used on systems where the generation of |
| @@ -720,7 +735,6 @@ config X86_REROUTE_FOR_BROKEN_BOOT_IRQS | |||
| 720 | 735 | ||
| 721 | config X86_MCE | 736 | config X86_MCE |
| 722 | bool "Machine Check Exception" | 737 | bool "Machine Check Exception" |
| 723 | depends on !X86_VOYAGER | ||
| 724 | ---help--- | 738 | ---help--- |
| 725 | Machine Check Exception support allows the processor to notify the | 739 | Machine Check Exception support allows the processor to notify the |
| 726 | kernel if it detects a problem (e.g. overheating, component failure). | 740 | kernel if it detects a problem (e.g. overheating, component failure). |
| @@ -739,7 +753,7 @@ config X86_MCE_INTEL | |||
| 739 | def_bool y | 753 | def_bool y |
| 740 | prompt "Intel MCE features" | 754 | prompt "Intel MCE features" |
| 741 | depends on X86_64 && X86_MCE && X86_LOCAL_APIC | 755 | depends on X86_64 && X86_MCE && X86_LOCAL_APIC |
| 742 | help | 756 | ---help--- |
| 743 | Additional support for intel specific MCE features such as | 757 | Additional support for intel specific MCE features such as |
| 744 | the thermal monitor. | 758 | the thermal monitor. |
| 745 | 759 | ||
| @@ -747,14 +761,14 @@ config X86_MCE_AMD | |||
| 747 | def_bool y | 761 | def_bool y |
| 748 | prompt "AMD MCE features" | 762 | prompt "AMD MCE features" |
| 749 | depends on X86_64 && X86_MCE && X86_LOCAL_APIC | 763 | depends on X86_64 && X86_MCE && X86_LOCAL_APIC |
| 750 | help | 764 | ---help--- |
| 751 | Additional support for AMD specific MCE features such as | 765 | Additional support for AMD specific MCE features such as |
| 752 | the DRAM Error Threshold. | 766 | the DRAM Error Threshold. |
| 753 | 767 | ||
| 754 | config X86_MCE_NONFATAL | 768 | config X86_MCE_NONFATAL |
| 755 | tristate "Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4" | 769 | tristate "Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4" |
| 756 | depends on X86_32 && X86_MCE | 770 | depends on X86_32 && X86_MCE |
| 757 | help | 771 | ---help--- |
| 758 | Enabling this feature starts a timer that triggers every 5 seconds which | 772 | Enabling this feature starts a timer that triggers every 5 seconds which |
| 759 | will look at the machine check registers to see if anything happened. | 773 | will look at the machine check registers to see if anything happened. |
| 760 | Non-fatal problems automatically get corrected (but still logged). | 774 | Non-fatal problems automatically get corrected (but still logged). |
| @@ -767,7 +781,7 @@ config X86_MCE_NONFATAL | |||
| 767 | config X86_MCE_P4THERMAL | 781 | config X86_MCE_P4THERMAL |
| 768 | bool "check for P4 thermal throttling interrupt." | 782 | bool "check for P4 thermal throttling interrupt." |
| 769 | depends on X86_32 && X86_MCE && (X86_UP_APIC || SMP) | 783 | depends on X86_32 && X86_MCE && (X86_UP_APIC || SMP) |
| 770 | help | 784 | ---help--- |
| 771 | Enabling this feature will cause a message to be printed when the P4 | 785 | Enabling this feature will cause a message to be printed when the P4 |
| 772 | enters thermal throttling. | 786 | enters thermal throttling. |
| 773 | 787 | ||
| @@ -775,11 +789,11 @@ config VM86 | |||
| 775 | bool "Enable VM86 support" if EMBEDDED | 789 | bool "Enable VM86 support" if EMBEDDED |
| 776 | default y | 790 | default y |
| 777 | depends on X86_32 | 791 | depends on X86_32 |
| 778 | help | 792 | ---help--- |
| 779 | This option is required by programs like DOSEMU to run 16-bit legacy | 793 | This option is required by programs like DOSEMU to run 16-bit legacy |
| 780 | code on X86 processors. It also may be needed by software like | 794 | code on X86 processors. It also may be needed by software like |
| 781 | XFree86 to initialize some video cards via BIOS. Disabling this | 795 | XFree86 to initialize some video cards via BIOS. Disabling this |
| 782 | option saves about 6k. | 796 | option saves about 6k. |
| 783 | 797 | ||
| 784 | config TOSHIBA | 798 | config TOSHIBA |
| 785 | tristate "Toshiba Laptop support" | 799 | tristate "Toshiba Laptop support" |
| @@ -853,33 +867,33 @@ config MICROCODE | |||
| 853 | module will be called microcode. | 867 | module will be called microcode. |
| 854 | 868 | ||
| 855 | config MICROCODE_INTEL | 869 | config MICROCODE_INTEL |
| 856 | bool "Intel microcode patch loading support" | 870 | bool "Intel microcode patch loading support" |
| 857 | depends on MICROCODE | 871 | depends on MICROCODE |
| 858 | default MICROCODE | 872 | default MICROCODE |
| 859 | select FW_LOADER | 873 | select FW_LOADER |
| 860 | --help--- | 874 | ---help--- |
| 861 | This options enables microcode patch loading support for Intel | 875 | This options enables microcode patch loading support for Intel |
| 862 | processors. | 876 | processors. |
| 863 | 877 | ||
| 864 | For latest news and information on obtaining all the required | 878 | For latest news and information on obtaining all the required |
| 865 | Intel ingredients for this driver, check: | 879 | Intel ingredients for this driver, check: |
| 866 | <http://www.urbanmyth.org/microcode/>. | 880 | <http://www.urbanmyth.org/microcode/>. |
| 867 | 881 | ||
| 868 | config MICROCODE_AMD | 882 | config MICROCODE_AMD |
| 869 | bool "AMD microcode patch loading support" | 883 | bool "AMD microcode patch loading support" |
| 870 | depends on MICROCODE | 884 | depends on MICROCODE |
| 871 | select FW_LOADER | 885 | select FW_LOADER |
| 872 | --help--- | 886 | ---help--- |
| 873 | If you select this option, microcode patch loading support for AMD | 887 | If you select this option, microcode patch loading support for AMD |
| 874 | processors will be enabled. | 888 | processors will be enabled. |
| 875 | 889 | ||
| 876 | config MICROCODE_OLD_INTERFACE | 890 | config MICROCODE_OLD_INTERFACE |
| 877 | def_bool y | 891 | def_bool y |
| 878 | depends on MICROCODE | 892 | depends on MICROCODE |
| 879 | 893 | ||
| 880 | config X86_MSR | 894 | config X86_MSR |
| 881 | tristate "/dev/cpu/*/msr - Model-specific register support" | 895 | tristate "/dev/cpu/*/msr - Model-specific register support" |
| 882 | help | 896 | ---help--- |
| 883 | This device gives privileged processes access to the x86 | 897 | This device gives privileged processes access to the x86 |
| 884 | Model-Specific Registers (MSRs). It is a character device with | 898 | Model-Specific Registers (MSRs). It is a character device with |
| 885 | major 202 and minors 0 to 31 for /dev/cpu/0/msr to /dev/cpu/31/msr. | 899 | major 202 and minors 0 to 31 for /dev/cpu/0/msr to /dev/cpu/31/msr. |
| @@ -888,7 +902,7 @@ config X86_MSR | |||
| 888 | 902 | ||
| 889 | config X86_CPUID | 903 | config X86_CPUID |
| 890 | tristate "/dev/cpu/*/cpuid - CPU information support" | 904 | tristate "/dev/cpu/*/cpuid - CPU information support" |
| 891 | help | 905 | ---help--- |
| 892 | This device gives processes access to the x86 CPUID instruction to | 906 | This device gives processes access to the x86 CPUID instruction to |
| 893 | be executed on a specific processor. It is a character device | 907 | be executed on a specific processor. It is a character device |
| 894 | with major 203 and minors 0 to 31 for /dev/cpu/0/cpuid to | 908 | with major 203 and minors 0 to 31 for /dev/cpu/0/cpuid to |
| @@ -940,7 +954,7 @@ config NOHIGHMEM | |||
| 940 | config HIGHMEM4G | 954 | config HIGHMEM4G |
| 941 | bool "4GB" | 955 | bool "4GB" |
| 942 | depends on !X86_NUMAQ | 956 | depends on !X86_NUMAQ |
| 943 | help | 957 | ---help--- |
| 944 | Select this if you have a 32-bit processor and between 1 and 4 | 958 | Select this if you have a 32-bit processor and between 1 and 4 |
| 945 | gigabytes of physical RAM. | 959 | gigabytes of physical RAM. |
| 946 | 960 | ||
| @@ -948,7 +962,7 @@ config HIGHMEM64G | |||
| 948 | bool "64GB" | 962 | bool "64GB" |
| 949 | depends on !M386 && !M486 | 963 | depends on !M386 && !M486 |
| 950 | select X86_PAE | 964 | select X86_PAE |
| 951 | help | 965 | ---help--- |
| 952 | Select this if you have a 32-bit processor and more than 4 | 966 | Select this if you have a 32-bit processor and more than 4 |
| 953 | gigabytes of physical RAM. | 967 | gigabytes of physical RAM. |
| 954 | 968 | ||
| @@ -959,7 +973,7 @@ choice | |||
| 959 | prompt "Memory split" if EMBEDDED | 973 | prompt "Memory split" if EMBEDDED |
| 960 | default VMSPLIT_3G | 974 | default VMSPLIT_3G |
| 961 | depends on X86_32 | 975 | depends on X86_32 |
| 962 | help | 976 | ---help--- |
| 963 | Select the desired split between kernel and user memory. | 977 | Select the desired split between kernel and user memory. |
| 964 | 978 | ||
| 965 | If the address range available to the kernel is less than the | 979 | If the address range available to the kernel is less than the |
| @@ -1005,20 +1019,20 @@ config HIGHMEM | |||
| 1005 | config X86_PAE | 1019 | config X86_PAE |
| 1006 | bool "PAE (Physical Address Extension) Support" | 1020 | bool "PAE (Physical Address Extension) Support" |
| 1007 | depends on X86_32 && !HIGHMEM4G | 1021 | depends on X86_32 && !HIGHMEM4G |
| 1008 | help | 1022 | ---help--- |
| 1009 | PAE is required for NX support, and furthermore enables | 1023 | PAE is required for NX support, and furthermore enables |
| 1010 | larger swapspace support for non-overcommit purposes. It | 1024 | larger swapspace support for non-overcommit purposes. It |
| 1011 | has the cost of more pagetable lookup overhead, and also | 1025 | has the cost of more pagetable lookup overhead, and also |
| 1012 | consumes more pagetable space per process. | 1026 | consumes more pagetable space per process. |
| 1013 | 1027 | ||
| 1014 | config ARCH_PHYS_ADDR_T_64BIT | 1028 | config ARCH_PHYS_ADDR_T_64BIT |
| 1015 | def_bool X86_64 || X86_PAE | 1029 | def_bool X86_64 || X86_PAE |
| 1016 | 1030 | ||
| 1017 | config DIRECT_GBPAGES | 1031 | config DIRECT_GBPAGES |
| 1018 | bool "Enable 1GB pages for kernel pagetables" if EMBEDDED | 1032 | bool "Enable 1GB pages for kernel pagetables" if EMBEDDED |
| 1019 | default y | 1033 | default y |
| 1020 | depends on X86_64 | 1034 | depends on X86_64 |
| 1021 | help | 1035 | ---help--- |
| 1022 | Allow the kernel linear mapping to use 1GB pages on CPUs that | 1036 | Allow the kernel linear mapping to use 1GB pages on CPUs that |
| 1023 | support it. This can improve the kernel's performance a tiny bit by | 1037 | support it. This can improve the kernel's performance a tiny bit by |
| 1024 | reducing TLB pressure. If in doubt, say "Y". | 1038 | reducing TLB pressure. If in doubt, say "Y". |
| @@ -1028,9 +1042,8 @@ config NUMA | |||
| 1028 | bool "Numa Memory Allocation and Scheduler Support" | 1042 | bool "Numa Memory Allocation and Scheduler Support" |
| 1029 | depends on SMP | 1043 | depends on SMP |
| 1030 | depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && EXPERIMENTAL) | 1044 | depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && EXPERIMENTAL) |
| 1031 | default n if X86_PC | ||
| 1032 | default y if (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP) | 1045 | default y if (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP) |
| 1033 | help | 1046 | ---help--- |
| 1034 | Enable NUMA (Non Uniform Memory Access) support. | 1047 | Enable NUMA (Non Uniform Memory Access) support. |
| 1035 | 1048 | ||
| 1036 | The kernel will try to allocate memory used by a CPU on the | 1049 | The kernel will try to allocate memory used by a CPU on the |
| @@ -1053,19 +1066,19 @@ config K8_NUMA | |||
| 1053 | def_bool y | 1066 | def_bool y |
| 1054 | prompt "Old style AMD Opteron NUMA detection" | 1067 | prompt "Old style AMD Opteron NUMA detection" |
| 1055 | depends on X86_64 && NUMA && PCI | 1068 | depends on X86_64 && NUMA && PCI |
| 1056 | help | 1069 | ---help--- |
| 1057 | Enable K8 NUMA node topology detection. You should say Y here if | 1070 | Enable K8 NUMA node topology detection. You should say Y here if |
| 1058 | you have a multi processor AMD K8 system. This uses an old | 1071 | you have a multi processor AMD K8 system. This uses an old |
| 1059 | method to read the NUMA configuration directly from the builtin | 1072 | method to read the NUMA configuration directly from the builtin |
| 1060 | Northbridge of Opteron. It is recommended to use X86_64_ACPI_NUMA | 1073 | Northbridge of Opteron. It is recommended to use X86_64_ACPI_NUMA |
| 1061 | instead, which also takes priority if both are compiled in. | 1074 | instead, which also takes priority if both are compiled in. |
| 1062 | 1075 | ||
| 1063 | config X86_64_ACPI_NUMA | 1076 | config X86_64_ACPI_NUMA |
| 1064 | def_bool y | 1077 | def_bool y |
| 1065 | prompt "ACPI NUMA detection" | 1078 | prompt "ACPI NUMA detection" |
| 1066 | depends on X86_64 && NUMA && ACPI && PCI | 1079 | depends on X86_64 && NUMA && ACPI && PCI |
| 1067 | select ACPI_NUMA | 1080 | select ACPI_NUMA |
| 1068 | help | 1081 | ---help--- |
| 1069 | Enable ACPI SRAT based node topology detection. | 1082 | Enable ACPI SRAT based node topology detection. |
| 1070 | 1083 | ||
| 1071 | # Some NUMA nodes have memory ranges that span | 1084 | # Some NUMA nodes have memory ranges that span |
| @@ -1080,7 +1093,7 @@ config NODES_SPAN_OTHER_NODES | |||
| 1080 | config NUMA_EMU | 1093 | config NUMA_EMU |
| 1081 | bool "NUMA emulation" | 1094 | bool "NUMA emulation" |
| 1082 | depends on X86_64 && NUMA | 1095 | depends on X86_64 && NUMA |
| 1083 | help | 1096 | ---help--- |
| 1084 | Enable NUMA emulation. A flat machine will be split | 1097 | Enable NUMA emulation. A flat machine will be split |
| 1085 | into virtual nodes when booted with "numa=fake=N", where N is the | 1098 | into virtual nodes when booted with "numa=fake=N", where N is the |
| 1086 | number of nodes. This is only useful for debugging. | 1099 | number of nodes. This is only useful for debugging. |
| @@ -1093,7 +1106,7 @@ config NODES_SHIFT | |||
| 1093 | default "4" if X86_NUMAQ | 1106 | default "4" if X86_NUMAQ |
| 1094 | default "3" | 1107 | default "3" |
| 1095 | depends on NEED_MULTIPLE_NODES | 1108 | depends on NEED_MULTIPLE_NODES |
| 1096 | help | 1109 | ---help--- |
| 1097 | Specify the maximum number of NUMA Nodes available on the target | 1110 | Specify the maximum number of NUMA Nodes available on the target |
| 1098 | system. Increases memory reserved to accomodate various tables. | 1111 | system. Increases memory reserved to accomodate various tables. |
| 1099 | 1112 | ||
| @@ -1131,7 +1144,7 @@ config ARCH_SPARSEMEM_DEFAULT | |||
| 1131 | 1144 | ||
| 1132 | config ARCH_SPARSEMEM_ENABLE | 1145 | config ARCH_SPARSEMEM_ENABLE |
| 1133 | def_bool y | 1146 | def_bool y |
| 1134 | depends on X86_64 || NUMA || (EXPERIMENTAL && X86_PC) || X86_GENERICARCH | 1147 | depends on X86_64 || NUMA || (EXPERIMENTAL && X86_32) || X86_32_NON_STANDARD |
| 1135 | select SPARSEMEM_STATIC if X86_32 | 1148 | select SPARSEMEM_STATIC if X86_32 |
| 1136 | select SPARSEMEM_VMEMMAP_ENABLE if X86_64 | 1149 | select SPARSEMEM_VMEMMAP_ENABLE if X86_64 |
| 1137 | 1150 | ||
| @@ -1148,61 +1161,61 @@ source "mm/Kconfig" | |||
| 1148 | config HIGHPTE | 1161 | config HIGHPTE |
| 1149 | bool "Allocate 3rd-level pagetables from highmem" | 1162 | bool "Allocate 3rd-level pagetables from highmem" |
| 1150 | depends on X86_32 && (HIGHMEM4G || HIGHMEM64G) | 1163 | depends on X86_32 && (HIGHMEM4G || HIGHMEM64G) |
| 1151 | help | 1164 | ---help--- |
| 1152 | The VM uses one page table entry for each page of physical memory. | 1165 | The VM uses one page table entry for each page of physical memory. |
| 1153 | For systems with a lot of RAM, this can be wasteful of precious | 1166 | For systems with a lot of RAM, this can be wasteful of precious |
| 1154 | low memory. Setting this option will put user-space page table | 1167 | low memory. Setting this option will put user-space page table |
| 1155 | entries in high memory. | 1168 | entries in high memory. |
| 1156 | 1169 | ||
| 1157 | config X86_CHECK_BIOS_CORRUPTION | 1170 | config X86_CHECK_BIOS_CORRUPTION |
| 1158 | bool "Check for low memory corruption" | 1171 | bool "Check for low memory corruption" |
| 1159 | help | 1172 | ---help--- |
| 1160 | Periodically check for memory corruption in low memory, which | 1173 | Periodically check for memory corruption in low memory, which |
| 1161 | is suspected to be caused by BIOS. Even when enabled in the | 1174 | is suspected to be caused by BIOS. Even when enabled in the |
| 1162 | configuration, it is disabled at runtime. Enable it by | 1175 | configuration, it is disabled at runtime. Enable it by |
| 1163 | setting "memory_corruption_check=1" on the kernel command | 1176 | setting "memory_corruption_check=1" on the kernel command |
| 1164 | line. By default it scans the low 64k of memory every 60 | 1177 | line. By default it scans the low 64k of memory every 60 |
| 1165 | seconds; see the memory_corruption_check_size and | 1178 | seconds; see the memory_corruption_check_size and |
| 1166 | memory_corruption_check_period parameters in | 1179 | memory_corruption_check_period parameters in |
| 1167 | Documentation/kernel-parameters.txt to adjust this. | 1180 | Documentation/kernel-parameters.txt to adjust this. |
| 1168 | 1181 | ||
| 1169 | When enabled with the default parameters, this option has | 1182 | When enabled with the default parameters, this option has |
| 1170 | almost no overhead, as it reserves a relatively small amount | 1183 | almost no overhead, as it reserves a relatively small amount |
| 1171 | of memory and scans it infrequently. It both detects corruption | 1184 | of memory and scans it infrequently. It both detects corruption |
| 1172 | and prevents it from affecting the running system. | 1185 | and prevents it from affecting the running system. |
| 1173 | 1186 | ||
| 1174 | It is, however, intended as a diagnostic tool; if repeatable | 1187 | It is, however, intended as a diagnostic tool; if repeatable |
| 1175 | BIOS-originated corruption always affects the same memory, | 1188 | BIOS-originated corruption always affects the same memory, |
| 1176 | you can use memmap= to prevent the kernel from using that | 1189 | you can use memmap= to prevent the kernel from using that |
| 1177 | memory. | 1190 | memory. |
| 1178 | 1191 | ||
| 1179 | config X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK | 1192 | config X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK |
| 1180 | bool "Set the default setting of memory_corruption_check" | 1193 | bool "Set the default setting of memory_corruption_check" |
| 1181 | depends on X86_CHECK_BIOS_CORRUPTION | 1194 | depends on X86_CHECK_BIOS_CORRUPTION |
| 1182 | default y | 1195 | default y |
| 1183 | help | 1196 | ---help--- |
| 1184 | Set whether the default state of memory_corruption_check is | 1197 | Set whether the default state of memory_corruption_check is |
| 1185 | on or off. | 1198 | on or off. |
| 1186 | 1199 | ||
| 1187 | config X86_RESERVE_LOW_64K | 1200 | config X86_RESERVE_LOW_64K |
| 1188 | bool "Reserve low 64K of RAM on AMI/Phoenix BIOSen" | 1201 | bool "Reserve low 64K of RAM on AMI/Phoenix BIOSen" |
| 1189 | default y | 1202 | default y |
| 1190 | help | 1203 | ---help--- |
| 1191 | Reserve the first 64K of physical RAM on BIOSes that are known | 1204 | Reserve the first 64K of physical RAM on BIOSes that are known |
| 1192 | to potentially corrupt that memory range. A numbers of BIOSes are | 1205 | to potentially corrupt that memory range. A numbers of BIOSes are |
| 1193 | known to utilize this area during suspend/resume, so it must not | 1206 | known to utilize this area during suspend/resume, so it must not |
| 1194 | be used by the kernel. | 1207 | be used by the kernel. |
| 1195 | 1208 | ||
| 1196 | Set this to N if you are absolutely sure that you trust the BIOS | 1209 | Set this to N if you are absolutely sure that you trust the BIOS |
| 1197 | to get all its memory reservations and usages right. | 1210 | to get all its memory reservations and usages right. |
| 1198 | 1211 | ||
| 1199 | If you have doubts about the BIOS (e.g. suspend/resume does not | 1212 | If you have doubts about the BIOS (e.g. suspend/resume does not |
| 1200 | work or there's kernel crashes after certain hardware hotplug | 1213 | work or there's kernel crashes after certain hardware hotplug |
| 1201 | events) and it's not AMI or Phoenix, then you might want to enable | 1214 | events) and it's not AMI or Phoenix, then you might want to enable |
| 1202 | X86_CHECK_BIOS_CORRUPTION=y to allow the kernel to check typical | 1215 | X86_CHECK_BIOS_CORRUPTION=y to allow the kernel to check typical |
| 1203 | corruption patterns. | 1216 | corruption patterns. |
| 1204 | 1217 | ||
| 1205 | Say Y if unsure. | 1218 | Say Y if unsure. |
| 1206 | 1219 | ||
| 1207 | config MATH_EMULATION | 1220 | config MATH_EMULATION |
| 1208 | bool | 1221 | bool |
| @@ -1268,7 +1281,7 @@ config MTRR_SANITIZER | |||
| 1268 | def_bool y | 1281 | def_bool y |
| 1269 | prompt "MTRR cleanup support" | 1282 | prompt "MTRR cleanup support" |
| 1270 | depends on MTRR | 1283 | depends on MTRR |
| 1271 | help | 1284 | ---help--- |
| 1272 | Convert MTRR layout from continuous to discrete, so X drivers can | 1285 | Convert MTRR layout from continuous to discrete, so X drivers can |
| 1273 | add writeback entries. | 1286 | add writeback entries. |
| 1274 | 1287 | ||
| @@ -1283,7 +1296,7 @@ config MTRR_SANITIZER_ENABLE_DEFAULT | |||
| 1283 | range 0 1 | 1296 | range 0 1 |
| 1284 | default "0" | 1297 | default "0" |
| 1285 | depends on MTRR_SANITIZER | 1298 | depends on MTRR_SANITIZER |
| 1286 | help | 1299 | ---help--- |
| 1287 | Enable mtrr cleanup default value | 1300 | Enable mtrr cleanup default value |
| 1288 | 1301 | ||
| 1289 | config MTRR_SANITIZER_SPARE_REG_NR_DEFAULT | 1302 | config MTRR_SANITIZER_SPARE_REG_NR_DEFAULT |
| @@ -1291,7 +1304,7 @@ config MTRR_SANITIZER_SPARE_REG_NR_DEFAULT | |||
| 1291 | range 0 7 | 1304 | range 0 7 |
| 1292 | default "1" | 1305 | default "1" |
| 1293 | depends on MTRR_SANITIZER | 1306 | depends on MTRR_SANITIZER |
| 1294 | help | 1307 | ---help--- |
| 1295 | mtrr cleanup spare entries default, it can be changed via | 1308 | mtrr cleanup spare entries default, it can be changed via |
| 1296 | mtrr_spare_reg_nr=N on the kernel command line. | 1309 | mtrr_spare_reg_nr=N on the kernel command line. |
| 1297 | 1310 | ||
| @@ -1299,7 +1312,7 @@ config X86_PAT | |||
| 1299 | bool | 1312 | bool |
| 1300 | prompt "x86 PAT support" | 1313 | prompt "x86 PAT support" |
| 1301 | depends on MTRR | 1314 | depends on MTRR |
| 1302 | help | 1315 | ---help--- |
| 1303 | Use PAT attributes to setup page level cache control. | 1316 | Use PAT attributes to setup page level cache control. |
| 1304 | 1317 | ||
| 1305 | PATs are the modern equivalents of MTRRs and are much more | 1318 | PATs are the modern equivalents of MTRRs and are much more |
| @@ -1314,20 +1327,20 @@ config EFI | |||
| 1314 | bool "EFI runtime service support" | 1327 | bool "EFI runtime service support" |
| 1315 | depends on ACPI | 1328 | depends on ACPI |
| 1316 | ---help--- | 1329 | ---help--- |
| 1317 | This enables the kernel to use EFI runtime services that are | 1330 | This enables the kernel to use EFI runtime services that are |
| 1318 | available (such as the EFI variable services). | 1331 | available (such as the EFI variable services). |
| 1319 | 1332 | ||
| 1320 | This option is only useful on systems that have EFI firmware. | 1333 | This option is only useful on systems that have EFI firmware. |
| 1321 | In addition, you should use the latest ELILO loader available | 1334 | In addition, you should use the latest ELILO loader available |
| 1322 | at <http://elilo.sourceforge.net> in order to take advantage | 1335 | at <http://elilo.sourceforge.net> in order to take advantage |
| 1323 | of EFI runtime services. However, even with this option, the | 1336 | of EFI runtime services. However, even with this option, the |
| 1324 | resultant kernel should continue to boot on existing non-EFI | 1337 | resultant kernel should continue to boot on existing non-EFI |
| 1325 | platforms. | 1338 | platforms. |
| 1326 | 1339 | ||
| 1327 | config SECCOMP | 1340 | config SECCOMP |
| 1328 | def_bool y | 1341 | def_bool y |
| 1329 | prompt "Enable seccomp to safely compute untrusted bytecode" | 1342 | prompt "Enable seccomp to safely compute untrusted bytecode" |
| 1330 | help | 1343 | ---help--- |
| 1331 | This kernel feature is useful for number crunching applications | 1344 | This kernel feature is useful for number crunching applications |
| 1332 | that may need to compute untrusted bytecode during their | 1345 | that may need to compute untrusted bytecode during their |
| 1333 | execution. By using pipes or other transports made available to | 1346 | execution. By using pipes or other transports made available to |
| @@ -1340,13 +1353,16 @@ config SECCOMP | |||
| 1340 | 1353 | ||
| 1341 | If unsure, say Y. Only embedded should say N here. | 1354 | If unsure, say Y. Only embedded should say N here. |
| 1342 | 1355 | ||
| 1356 | config CC_STACKPROTECTOR_ALL | ||
| 1357 | bool | ||
| 1358 | |||
| 1343 | config CC_STACKPROTECTOR | 1359 | config CC_STACKPROTECTOR |
| 1344 | bool "Enable -fstack-protector buffer overflow detection (EXPERIMENTAL)" | 1360 | bool "Enable -fstack-protector buffer overflow detection (EXPERIMENTAL)" |
| 1345 | depends on X86_64 && EXPERIMENTAL && BROKEN | 1361 | select CC_STACKPROTECTOR_ALL |
| 1346 | help | 1362 | ---help--- |
| 1347 | This option turns on the -fstack-protector GCC feature. This | 1363 | This option turns on the -fstack-protector GCC feature. This |
| 1348 | feature puts, at the beginning of critical functions, a canary | 1364 | feature puts, at the beginning of functions, a canary value on |
| 1349 | value on the stack just before the return address, and validates | 1365 | the stack just before the return address, and validates |
| 1350 | the value just before actually returning. Stack based buffer | 1366 | the value just before actually returning. Stack based buffer |
| 1351 | overflows (that need to overwrite this return address) now also | 1367 | overflows (that need to overwrite this return address) now also |
| 1352 | overwrite the canary, which gets detected and the attack is then | 1368 | overwrite the canary, which gets detected and the attack is then |
| @@ -1354,22 +1370,14 @@ config CC_STACKPROTECTOR | |||
| 1354 | 1370 | ||
| 1355 | This feature requires gcc version 4.2 or above, or a distribution | 1371 | This feature requires gcc version 4.2 or above, or a distribution |
| 1356 | gcc with the feature backported. Older versions are automatically | 1372 | gcc with the feature backported. Older versions are automatically |
| 1357 | detected and for those versions, this configuration option is ignored. | 1373 | detected and for those versions, this configuration option is |
| 1358 | 1374 | ignored. (and a warning is printed during bootup) | |
| 1359 | config CC_STACKPROTECTOR_ALL | ||
| 1360 | bool "Use stack-protector for all functions" | ||
| 1361 | depends on CC_STACKPROTECTOR | ||
| 1362 | help | ||
| 1363 | Normally, GCC only inserts the canary value protection for | ||
| 1364 | functions that use large-ish on-stack buffers. By enabling | ||
| 1365 | this option, GCC will be asked to do this for ALL functions. | ||
| 1366 | 1375 | ||
| 1367 | source kernel/Kconfig.hz | 1376 | source kernel/Kconfig.hz |
| 1368 | 1377 | ||
| 1369 | config KEXEC | 1378 | config KEXEC |
| 1370 | bool "kexec system call" | 1379 | bool "kexec system call" |
| 1371 | depends on X86_BIOS_REBOOT | 1380 | ---help--- |
| 1372 | help | ||
| 1373 | kexec is a system call that implements the ability to shutdown your | 1381 | kexec is a system call that implements the ability to shutdown your |
| 1374 | current kernel, and to start another kernel. It is like a reboot | 1382 | current kernel, and to start another kernel. It is like a reboot |
| 1375 | but it is independent of the system firmware. And like a reboot | 1383 | but it is independent of the system firmware. And like a reboot |
| @@ -1386,7 +1394,7 @@ config KEXEC | |||
| 1386 | config CRASH_DUMP | 1394 | config CRASH_DUMP |
| 1387 | bool "kernel crash dumps" | 1395 | bool "kernel crash dumps" |
| 1388 | depends on X86_64 || (X86_32 && HIGHMEM) | 1396 | depends on X86_64 || (X86_32 && HIGHMEM) |
| 1389 | help | 1397 | ---help--- |
| 1390 | Generate crash dump after being started by kexec. | 1398 | Generate crash dump after being started by kexec. |
| 1391 | This should be normally only set in special crash dump kernels | 1399 | This should be normally only set in special crash dump kernels |
| 1392 | which are loaded in the main kernel with kexec-tools into | 1400 | which are loaded in the main kernel with kexec-tools into |
| @@ -1401,7 +1409,7 @@ config KEXEC_JUMP | |||
| 1401 | bool "kexec jump (EXPERIMENTAL)" | 1409 | bool "kexec jump (EXPERIMENTAL)" |
| 1402 | depends on EXPERIMENTAL | 1410 | depends on EXPERIMENTAL |
| 1403 | depends on KEXEC && HIBERNATION && X86_32 | 1411 | depends on KEXEC && HIBERNATION && X86_32 |
| 1404 | help | 1412 | ---help--- |
| 1405 | Jump between original kernel and kexeced kernel and invoke | 1413 | Jump between original kernel and kexeced kernel and invoke |
| 1406 | code in physical address mode via KEXEC | 1414 | code in physical address mode via KEXEC |
| 1407 | 1415 | ||
| @@ -1410,7 +1418,7 @@ config PHYSICAL_START | |||
| 1410 | default "0x1000000" if X86_NUMAQ | 1418 | default "0x1000000" if X86_NUMAQ |
| 1411 | default "0x200000" if X86_64 | 1419 | default "0x200000" if X86_64 |
| 1412 | default "0x100000" | 1420 | default "0x100000" |
| 1413 | help | 1421 | ---help--- |
| 1414 | This gives the physical address where the kernel is loaded. | 1422 | This gives the physical address where the kernel is loaded. |
| 1415 | 1423 | ||
| 1416 | If kernel is a not relocatable (CONFIG_RELOCATABLE=n) then | 1424 | If kernel is a not relocatable (CONFIG_RELOCATABLE=n) then |
| @@ -1451,7 +1459,7 @@ config PHYSICAL_START | |||
| 1451 | config RELOCATABLE | 1459 | config RELOCATABLE |
| 1452 | bool "Build a relocatable kernel (EXPERIMENTAL)" | 1460 | bool "Build a relocatable kernel (EXPERIMENTAL)" |
| 1453 | depends on EXPERIMENTAL | 1461 | depends on EXPERIMENTAL |
| 1454 | help | 1462 | ---help--- |
| 1455 | This builds a kernel image that retains relocation information | 1463 | This builds a kernel image that retains relocation information |
| 1456 | so it can be loaded someplace besides the default 1MB. | 1464 | so it can be loaded someplace besides the default 1MB. |
| 1457 | The relocations tend to make the kernel binary about 10% larger, | 1465 | The relocations tend to make the kernel binary about 10% larger, |
| @@ -1471,7 +1479,7 @@ config PHYSICAL_ALIGN | |||
| 1471 | default "0x100000" if X86_32 | 1479 | default "0x100000" if X86_32 |
| 1472 | default "0x200000" if X86_64 | 1480 | default "0x200000" if X86_64 |
| 1473 | range 0x2000 0x400000 | 1481 | range 0x2000 0x400000 |
| 1474 | help | 1482 | ---help--- |
| 1475 | This value puts the alignment restrictions on physical address | 1483 | This value puts the alignment restrictions on physical address |
| 1476 | where kernel is loaded and run from. Kernel is compiled for an | 1484 | where kernel is loaded and run from. Kernel is compiled for an |
| 1477 | address which meets above alignment restriction. | 1485 | address which meets above alignment restriction. |
| @@ -1492,7 +1500,7 @@ config PHYSICAL_ALIGN | |||
| 1492 | 1500 | ||
| 1493 | config HOTPLUG_CPU | 1501 | config HOTPLUG_CPU |
| 1494 | bool "Support for hot-pluggable CPUs" | 1502 | bool "Support for hot-pluggable CPUs" |
| 1495 | depends on SMP && HOTPLUG && !X86_VOYAGER | 1503 | depends on SMP && HOTPLUG |
| 1496 | ---help--- | 1504 | ---help--- |
| 1497 | Say Y here to allow turning CPUs off and on. CPUs can be | 1505 | Say Y here to allow turning CPUs off and on. CPUs can be |
| 1498 | controlled through /sys/devices/system/cpu. | 1506 | controlled through /sys/devices/system/cpu. |
| @@ -1504,7 +1512,7 @@ config COMPAT_VDSO | |||
| 1504 | def_bool y | 1512 | def_bool y |
| 1505 | prompt "Compat VDSO support" | 1513 | prompt "Compat VDSO support" |
| 1506 | depends on X86_32 || IA32_EMULATION | 1514 | depends on X86_32 || IA32_EMULATION |
| 1507 | help | 1515 | ---help--- |
| 1508 | Map the 32-bit VDSO to the predictable old-style address too. | 1516 | Map the 32-bit VDSO to the predictable old-style address too. |
| 1509 | ---help--- | 1517 | ---help--- |
| 1510 | Say N here if you are running a sufficiently recent glibc | 1518 | Say N here if you are running a sufficiently recent glibc |
| @@ -1516,7 +1524,7 @@ config COMPAT_VDSO | |||
| 1516 | config CMDLINE_BOOL | 1524 | config CMDLINE_BOOL |
| 1517 | bool "Built-in kernel command line" | 1525 | bool "Built-in kernel command line" |
| 1518 | default n | 1526 | default n |
| 1519 | help | 1527 | ---help--- |
| 1520 | Allow for specifying boot arguments to the kernel at | 1528 | Allow for specifying boot arguments to the kernel at |
| 1521 | build time. On some systems (e.g. embedded ones), it is | 1529 | build time. On some systems (e.g. embedded ones), it is |
| 1522 | necessary or convenient to provide some or all of the | 1530 | necessary or convenient to provide some or all of the |
| @@ -1534,7 +1542,7 @@ config CMDLINE | |||
| 1534 | string "Built-in kernel command string" | 1542 | string "Built-in kernel command string" |
| 1535 | depends on CMDLINE_BOOL | 1543 | depends on CMDLINE_BOOL |
| 1536 | default "" | 1544 | default "" |
| 1537 | help | 1545 | ---help--- |
| 1538 | Enter arguments here that should be compiled into the kernel | 1546 | Enter arguments here that should be compiled into the kernel |
| 1539 | image and used at boot time. If the boot loader provides a | 1547 | image and used at boot time. If the boot loader provides a |
| 1540 | command line at boot time, it is appended to this string to | 1548 | command line at boot time, it is appended to this string to |
| @@ -1551,7 +1559,7 @@ config CMDLINE_OVERRIDE | |||
| 1551 | bool "Built-in command line overrides boot loader arguments" | 1559 | bool "Built-in command line overrides boot loader arguments" |
| 1552 | default n | 1560 | default n |
| 1553 | depends on CMDLINE_BOOL | 1561 | depends on CMDLINE_BOOL |
| 1554 | help | 1562 | ---help--- |
| 1555 | Set this option to 'Y' to have the kernel ignore the boot loader | 1563 | Set this option to 'Y' to have the kernel ignore the boot loader |
| 1556 | command line, and use ONLY the built-in command line. | 1564 | command line, and use ONLY the built-in command line. |
| 1557 | 1565 | ||
| @@ -1573,7 +1581,6 @@ config HAVE_ARCH_EARLY_PFN_TO_NID | |||
| 1573 | depends on NUMA | 1581 | depends on NUMA |
| 1574 | 1582 | ||
| 1575 | menu "Power management and ACPI options" | 1583 | menu "Power management and ACPI options" |
| 1576 | depends on !X86_VOYAGER | ||
| 1577 | 1584 | ||
| 1578 | config ARCH_HIBERNATION_HEADER | 1585 | config ARCH_HIBERNATION_HEADER |
| 1579 | def_bool y | 1586 | def_bool y |
| @@ -1651,7 +1658,7 @@ if APM | |||
| 1651 | 1658 | ||
| 1652 | config APM_IGNORE_USER_SUSPEND | 1659 | config APM_IGNORE_USER_SUSPEND |
| 1653 | bool "Ignore USER SUSPEND" | 1660 | bool "Ignore USER SUSPEND" |
| 1654 | help | 1661 | ---help--- |
| 1655 | This option will ignore USER SUSPEND requests. On machines with a | 1662 | This option will ignore USER SUSPEND requests. On machines with a |
| 1656 | compliant APM BIOS, you want to say N. However, on the NEC Versa M | 1663 | compliant APM BIOS, you want to say N. However, on the NEC Versa M |
| 1657 | series notebooks, it is necessary to say Y because of a BIOS bug. | 1664 | series notebooks, it is necessary to say Y because of a BIOS bug. |
| @@ -1675,7 +1682,7 @@ config APM_DO_ENABLE | |||
| 1675 | 1682 | ||
| 1676 | config APM_CPU_IDLE | 1683 | config APM_CPU_IDLE |
| 1677 | bool "Make CPU Idle calls when idle" | 1684 | bool "Make CPU Idle calls when idle" |
| 1678 | help | 1685 | ---help--- |
| 1679 | Enable calls to APM CPU Idle/CPU Busy inside the kernel's idle loop. | 1686 | Enable calls to APM CPU Idle/CPU Busy inside the kernel's idle loop. |
| 1680 | On some machines, this can activate improved power savings, such as | 1687 | On some machines, this can activate improved power savings, such as |
| 1681 | a slowed CPU clock rate, when the machine is idle. These idle calls | 1688 | a slowed CPU clock rate, when the machine is idle. These idle calls |
| @@ -1686,7 +1693,7 @@ config APM_CPU_IDLE | |||
| 1686 | 1693 | ||
| 1687 | config APM_DISPLAY_BLANK | 1694 | config APM_DISPLAY_BLANK |
| 1688 | bool "Enable console blanking using APM" | 1695 | bool "Enable console blanking using APM" |
| 1689 | help | 1696 | ---help--- |
| 1690 | Enable console blanking using the APM. Some laptops can use this to | 1697 | Enable console blanking using the APM. Some laptops can use this to |
| 1691 | turn off the LCD backlight when the screen blanker of the Linux | 1698 | turn off the LCD backlight when the screen blanker of the Linux |
| 1692 | virtual console blanks the screen. Note that this is only used by | 1699 | virtual console blanks the screen. Note that this is only used by |
| @@ -1699,7 +1706,7 @@ config APM_DISPLAY_BLANK | |||
| 1699 | 1706 | ||
| 1700 | config APM_ALLOW_INTS | 1707 | config APM_ALLOW_INTS |
| 1701 | bool "Allow interrupts during APM BIOS calls" | 1708 | bool "Allow interrupts during APM BIOS calls" |
| 1702 | help | 1709 | ---help--- |
| 1703 | Normally we disable external interrupts while we are making calls to | 1710 | Normally we disable external interrupts while we are making calls to |
| 1704 | the APM BIOS as a measure to lessen the effects of a badly behaving | 1711 | the APM BIOS as a measure to lessen the effects of a badly behaving |
| 1705 | BIOS implementation. The BIOS should reenable interrupts if it | 1712 | BIOS implementation. The BIOS should reenable interrupts if it |
| @@ -1724,7 +1731,7 @@ config PCI | |||
| 1724 | bool "PCI support" | 1731 | bool "PCI support" |
| 1725 | default y | 1732 | default y |
| 1726 | select ARCH_SUPPORTS_MSI if (X86_LOCAL_APIC && X86_IO_APIC) | 1733 | select ARCH_SUPPORTS_MSI if (X86_LOCAL_APIC && X86_IO_APIC) |
| 1727 | help | 1734 | ---help--- |
| 1728 | Find out whether you have a PCI motherboard. PCI is the name of a | 1735 | Find out whether you have a PCI motherboard. PCI is the name of a |
| 1729 | bus system, i.e. the way the CPU talks to the other stuff inside | 1736 | bus system, i.e. the way the CPU talks to the other stuff inside |
| 1730 | your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or | 1737 | your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or |
| @@ -1795,7 +1802,7 @@ config PCI_MMCONFIG | |||
| 1795 | config DMAR | 1802 | config DMAR |
| 1796 | bool "Support for DMA Remapping Devices (EXPERIMENTAL)" | 1803 | bool "Support for DMA Remapping Devices (EXPERIMENTAL)" |
| 1797 | depends on X86_64 && PCI_MSI && ACPI && EXPERIMENTAL | 1804 | depends on X86_64 && PCI_MSI && ACPI && EXPERIMENTAL |
| 1798 | help | 1805 | ---help--- |
| 1799 | DMA remapping (DMAR) devices support enables independent address | 1806 | DMA remapping (DMAR) devices support enables independent address |
| 1800 | translations for Direct Memory Access (DMA) from devices. | 1807 | translations for Direct Memory Access (DMA) from devices. |
| 1801 | These DMA remapping devices are reported via ACPI tables | 1808 | These DMA remapping devices are reported via ACPI tables |
| @@ -1817,29 +1824,30 @@ config DMAR_GFX_WA | |||
| 1817 | def_bool y | 1824 | def_bool y |
| 1818 | prompt "Support for Graphics workaround" | 1825 | prompt "Support for Graphics workaround" |
| 1819 | depends on DMAR | 1826 | depends on DMAR |
| 1820 | help | 1827 | ---help--- |
| 1821 | Current Graphics drivers tend to use physical address | 1828 | Current Graphics drivers tend to use physical address |
| 1822 | for DMA and avoid using DMA APIs. Setting this config | 1829 | for DMA and avoid using DMA APIs. Setting this config |
| 1823 | option permits the IOMMU driver to set a unity map for | 1830 | option permits the IOMMU driver to set a unity map for |
| 1824 | all the OS-visible memory. Hence the driver can continue | 1831 | all the OS-visible memory. Hence the driver can continue |
| 1825 | to use physical addresses for DMA. | 1832 | to use physical addresses for DMA. |
| 1826 | 1833 | ||
| 1827 | config DMAR_FLOPPY_WA | 1834 | config DMAR_FLOPPY_WA |
| 1828 | def_bool y | 1835 | def_bool y |
| 1829 | depends on DMAR | 1836 | depends on DMAR |
| 1830 | help | 1837 | ---help--- |
| 1831 | Floppy disk drivers are know to bypass DMA API calls | 1838 | Floppy disk drivers are know to bypass DMA API calls |
| 1832 | thereby failing to work when IOMMU is enabled. This | 1839 | thereby failing to work when IOMMU is enabled. This |
| 1833 | workaround will setup a 1:1 mapping for the first | 1840 | workaround will setup a 1:1 mapping for the first |
| 1834 | 16M to make floppy (an ISA device) work. | 1841 | 16M to make floppy (an ISA device) work. |
| 1835 | 1842 | ||
| 1836 | config INTR_REMAP | 1843 | config INTR_REMAP |
| 1837 | bool "Support for Interrupt Remapping (EXPERIMENTAL)" | 1844 | bool "Support for Interrupt Remapping (EXPERIMENTAL)" |
| 1838 | depends on X86_64 && X86_IO_APIC && PCI_MSI && ACPI && EXPERIMENTAL | 1845 | depends on X86_64 && X86_IO_APIC && PCI_MSI && ACPI && EXPERIMENTAL |
| 1839 | help | 1846 | select X86_X2APIC |
| 1840 | Supports Interrupt remapping for IO-APIC and MSI devices. | 1847 | ---help--- |
| 1841 | To use x2apic mode in the CPU's which support x2APIC enhancements or | 1848 | Supports Interrupt remapping for IO-APIC and MSI devices. |
| 1842 | to support platforms with CPU's having > 8 bit APIC ID, say Y. | 1849 | To use x2apic mode in the CPU's which support x2APIC enhancements or |
| 1850 | to support platforms with CPU's having > 8 bit APIC ID, say Y. | ||
| 1843 | 1851 | ||
| 1844 | source "drivers/pci/pcie/Kconfig" | 1852 | source "drivers/pci/pcie/Kconfig" |
| 1845 | 1853 | ||
| @@ -1853,8 +1861,7 @@ if X86_32 | |||
| 1853 | 1861 | ||
| 1854 | config ISA | 1862 | config ISA |
| 1855 | bool "ISA support" | 1863 | bool "ISA support" |
| 1856 | depends on !X86_VOYAGER | 1864 | ---help--- |
| 1857 | help | ||
| 1858 | Find out whether you have ISA slots on your motherboard. ISA is the | 1865 | Find out whether you have ISA slots on your motherboard. ISA is the |
| 1859 | name of a bus system, i.e. the way the CPU talks to the other stuff | 1866 | name of a bus system, i.e. the way the CPU talks to the other stuff |
| 1860 | inside your box. Other bus systems are PCI, EISA, MicroChannel | 1867 | inside your box. Other bus systems are PCI, EISA, MicroChannel |
| @@ -1880,9 +1887,8 @@ config EISA | |||
| 1880 | source "drivers/eisa/Kconfig" | 1887 | source "drivers/eisa/Kconfig" |
| 1881 | 1888 | ||
| 1882 | config MCA | 1889 | config MCA |
| 1883 | bool "MCA support" if !X86_VOYAGER | 1890 | bool "MCA support" |
| 1884 | default y if X86_VOYAGER | 1891 | ---help--- |
| 1885 | help | ||
| 1886 | MicroChannel Architecture is found in some IBM PS/2 machines and | 1892 | MicroChannel Architecture is found in some IBM PS/2 machines and |
| 1887 | laptops. It is a bus system similar to PCI or ISA. See | 1893 | laptops. It is a bus system similar to PCI or ISA. See |
| 1888 | <file:Documentation/mca.txt> (and especially the web page given | 1894 | <file:Documentation/mca.txt> (and especially the web page given |
| @@ -1892,8 +1898,7 @@ source "drivers/mca/Kconfig" | |||
| 1892 | 1898 | ||
| 1893 | config SCx200 | 1899 | config SCx200 |
| 1894 | tristate "NatSemi SCx200 support" | 1900 | tristate "NatSemi SCx200 support" |
| 1895 | depends on !X86_VOYAGER | 1901 | ---help--- |
| 1896 | help | ||
| 1897 | This provides basic support for National Semiconductor's | 1902 | This provides basic support for National Semiconductor's |
| 1898 | (now AMD's) Geode processors. The driver probes for the | 1903 | (now AMD's) Geode processors. The driver probes for the |
| 1899 | PCI-IDs of several on-chip devices, so its a good dependency | 1904 | PCI-IDs of several on-chip devices, so its a good dependency |
| @@ -1905,7 +1910,7 @@ config SCx200HR_TIMER | |||
| 1905 | tristate "NatSemi SCx200 27MHz High-Resolution Timer Support" | 1910 | tristate "NatSemi SCx200 27MHz High-Resolution Timer Support" |
| 1906 | depends on SCx200 && GENERIC_TIME | 1911 | depends on SCx200 && GENERIC_TIME |
| 1907 | default y | 1912 | default y |
| 1908 | help | 1913 | ---help--- |
| 1909 | This driver provides a clocksource built upon the on-chip | 1914 | This driver provides a clocksource built upon the on-chip |
| 1910 | 27MHz high-resolution timer. Its also a workaround for | 1915 | 27MHz high-resolution timer. Its also a workaround for |
| 1911 | NSC Geode SC-1100's buggy TSC, which loses time when the | 1916 | NSC Geode SC-1100's buggy TSC, which loses time when the |
| @@ -1916,7 +1921,7 @@ config GEODE_MFGPT_TIMER | |||
| 1916 | def_bool y | 1921 | def_bool y |
| 1917 | prompt "Geode Multi-Function General Purpose Timer (MFGPT) events" | 1922 | prompt "Geode Multi-Function General Purpose Timer (MFGPT) events" |
| 1918 | depends on MGEODE_LX && GENERIC_TIME && GENERIC_CLOCKEVENTS | 1923 | depends on MGEODE_LX && GENERIC_TIME && GENERIC_CLOCKEVENTS |
| 1919 | help | 1924 | ---help--- |
| 1920 | This driver provides a clock event source based on the MFGPT | 1925 | This driver provides a clock event source based on the MFGPT |
| 1921 | timer(s) in the CS5535 and CS5536 companion chip for the geode. | 1926 | timer(s) in the CS5535 and CS5536 companion chip for the geode. |
| 1922 | MFGPTs have a better resolution and max interval than the | 1927 | MFGPTs have a better resolution and max interval than the |
| @@ -1925,7 +1930,7 @@ config GEODE_MFGPT_TIMER | |||
| 1925 | config OLPC | 1930 | config OLPC |
| 1926 | bool "One Laptop Per Child support" | 1931 | bool "One Laptop Per Child support" |
| 1927 | default n | 1932 | default n |
| 1928 | help | 1933 | ---help--- |
| 1929 | Add support for detecting the unique features of the OLPC | 1934 | Add support for detecting the unique features of the OLPC |
| 1930 | XO hardware. | 1935 | XO hardware. |
| 1931 | 1936 | ||
| @@ -1950,16 +1955,16 @@ config IA32_EMULATION | |||
| 1950 | bool "IA32 Emulation" | 1955 | bool "IA32 Emulation" |
| 1951 | depends on X86_64 | 1956 | depends on X86_64 |
| 1952 | select COMPAT_BINFMT_ELF | 1957 | select COMPAT_BINFMT_ELF |
| 1953 | help | 1958 | ---help--- |
| 1954 | Include code to run 32-bit programs under a 64-bit kernel. You should | 1959 | Include code to run 32-bit programs under a 64-bit kernel. You should |
| 1955 | likely turn this on, unless you're 100% sure that you don't have any | 1960 | likely turn this on, unless you're 100% sure that you don't have any |
| 1956 | 32-bit programs left. | 1961 | 32-bit programs left. |
| 1957 | 1962 | ||
| 1958 | config IA32_AOUT | 1963 | config IA32_AOUT |
| 1959 | tristate "IA32 a.out support" | 1964 | tristate "IA32 a.out support" |
| 1960 | depends on IA32_EMULATION | 1965 | depends on IA32_EMULATION |
| 1961 | help | 1966 | ---help--- |
| 1962 | Support old a.out binaries in the 32bit emulation. | 1967 | Support old a.out binaries in the 32bit emulation. |
| 1963 | 1968 | ||
| 1964 | config COMPAT | 1969 | config COMPAT |
| 1965 | def_bool y | 1970 | def_bool y |
diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu index c98d52e82966..a95eaf0e582a 100644 --- a/arch/x86/Kconfig.cpu +++ b/arch/x86/Kconfig.cpu | |||
| @@ -50,7 +50,7 @@ config M386 | |||
| 50 | config M486 | 50 | config M486 |
| 51 | bool "486" | 51 | bool "486" |
| 52 | depends on X86_32 | 52 | depends on X86_32 |
| 53 | help | 53 | ---help--- |
| 54 | Select this for a 486 series processor, either Intel or one of the | 54 | Select this for a 486 series processor, either Intel or one of the |
| 55 | compatible processors from AMD, Cyrix, IBM, or Intel. Includes DX, | 55 | compatible processors from AMD, Cyrix, IBM, or Intel. Includes DX, |
| 56 | DX2, and DX4 variants; also SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or | 56 | DX2, and DX4 variants; also SL/SLC/SLC2/SLC3/SX/SX2 and UMC U5D or |
| @@ -59,7 +59,7 @@ config M486 | |||
| 59 | config M586 | 59 | config M586 |
| 60 | bool "586/K5/5x86/6x86/6x86MX" | 60 | bool "586/K5/5x86/6x86/6x86MX" |
| 61 | depends on X86_32 | 61 | depends on X86_32 |
| 62 | help | 62 | ---help--- |
| 63 | Select this for an 586 or 686 series processor such as the AMD K5, | 63 | Select this for an 586 or 686 series processor such as the AMD K5, |
| 64 | the Cyrix 5x86, 6x86 and 6x86MX. This choice does not | 64 | the Cyrix 5x86, 6x86 and 6x86MX. This choice does not |
| 65 | assume the RDTSC (Read Time Stamp Counter) instruction. | 65 | assume the RDTSC (Read Time Stamp Counter) instruction. |
| @@ -67,21 +67,21 @@ config M586 | |||
| 67 | config M586TSC | 67 | config M586TSC |
| 68 | bool "Pentium-Classic" | 68 | bool "Pentium-Classic" |
| 69 | depends on X86_32 | 69 | depends on X86_32 |
| 70 | help | 70 | ---help--- |
| 71 | Select this for a Pentium Classic processor with the RDTSC (Read | 71 | Select this for a Pentium Classic processor with the RDTSC (Read |
| 72 | Time Stamp Counter) instruction for benchmarking. | 72 | Time Stamp Counter) instruction for benchmarking. |
| 73 | 73 | ||
| 74 | config M586MMX | 74 | config M586MMX |
| 75 | bool "Pentium-MMX" | 75 | bool "Pentium-MMX" |
| 76 | depends on X86_32 | 76 | depends on X86_32 |
| 77 | help | 77 | ---help--- |
| 78 | Select this for a Pentium with the MMX graphics/multimedia | 78 | Select this for a Pentium with the MMX graphics/multimedia |
| 79 | extended instructions. | 79 | extended instructions. |
| 80 | 80 | ||
| 81 | config M686 | 81 | config M686 |
| 82 | bool "Pentium-Pro" | 82 | bool "Pentium-Pro" |
| 83 | depends on X86_32 | 83 | depends on X86_32 |
| 84 | help | 84 | ---help--- |
| 85 | Select this for Intel Pentium Pro chips. This enables the use of | 85 | Select this for Intel Pentium Pro chips. This enables the use of |
| 86 | Pentium Pro extended instructions, and disables the init-time guard | 86 | Pentium Pro extended instructions, and disables the init-time guard |
| 87 | against the f00f bug found in earlier Pentiums. | 87 | against the f00f bug found in earlier Pentiums. |
| @@ -89,7 +89,7 @@ config M686 | |||
| 89 | config MPENTIUMII | 89 | config MPENTIUMII |
| 90 | bool "Pentium-II/Celeron(pre-Coppermine)" | 90 | bool "Pentium-II/Celeron(pre-Coppermine)" |
| 91 | depends on X86_32 | 91 | depends on X86_32 |
| 92 | help | 92 | ---help--- |
| 93 | Select this for Intel chips based on the Pentium-II and | 93 | Select this for Intel chips based on the Pentium-II and |
| 94 | pre-Coppermine Celeron core. This option enables an unaligned | 94 | pre-Coppermine Celeron core. This option enables an unaligned |
| 95 | copy optimization, compiles the kernel with optimization flags | 95 | copy optimization, compiles the kernel with optimization flags |
| @@ -99,7 +99,7 @@ config MPENTIUMII | |||
| 99 | config MPENTIUMIII | 99 | config MPENTIUMIII |
| 100 | bool "Pentium-III/Celeron(Coppermine)/Pentium-III Xeon" | 100 | bool "Pentium-III/Celeron(Coppermine)/Pentium-III Xeon" |
| 101 | depends on X86_32 | 101 | depends on X86_32 |
| 102 | help | 102 | ---help--- |
| 103 | Select this for Intel chips based on the Pentium-III and | 103 | Select this for Intel chips based on the Pentium-III and |
| 104 | Celeron-Coppermine core. This option enables use of some | 104 | Celeron-Coppermine core. This option enables use of some |
| 105 | extended prefetch instructions in addition to the Pentium II | 105 | extended prefetch instructions in addition to the Pentium II |
| @@ -108,14 +108,14 @@ config MPENTIUMIII | |||
| 108 | config MPENTIUMM | 108 | config MPENTIUMM |
| 109 | bool "Pentium M" | 109 | bool "Pentium M" |
| 110 | depends on X86_32 | 110 | depends on X86_32 |
| 111 | help | 111 | ---help--- |
| 112 | Select this for Intel Pentium M (not Pentium-4 M) | 112 | Select this for Intel Pentium M (not Pentium-4 M) |
| 113 | notebook chips. | 113 | notebook chips. |
| 114 | 114 | ||
| 115 | config MPENTIUM4 | 115 | config MPENTIUM4 |
| 116 | bool "Pentium-4/Celeron(P4-based)/Pentium-4 M/older Xeon" | 116 | bool "Pentium-4/Celeron(P4-based)/Pentium-4 M/older Xeon" |
| 117 | depends on X86_32 | 117 | depends on X86_32 |
| 118 | help | 118 | ---help--- |
| 119 | Select this for Intel Pentium 4 chips. This includes the | 119 | Select this for Intel Pentium 4 chips. This includes the |
| 120 | Pentium 4, Pentium D, P4-based Celeron and Xeon, and | 120 | Pentium 4, Pentium D, P4-based Celeron and Xeon, and |
| 121 | Pentium-4 M (not Pentium M) chips. This option enables compile | 121 | Pentium-4 M (not Pentium M) chips. This option enables compile |
| @@ -151,7 +151,7 @@ config MPENTIUM4 | |||
| 151 | config MK6 | 151 | config MK6 |
| 152 | bool "K6/K6-II/K6-III" | 152 | bool "K6/K6-II/K6-III" |
| 153 | depends on X86_32 | 153 | depends on X86_32 |
| 154 | help | 154 | ---help--- |
| 155 | Select this for an AMD K6-family processor. Enables use of | 155 | Select this for an AMD K6-family processor. Enables use of |
| 156 | some extended instructions, and passes appropriate optimization | 156 | some extended instructions, and passes appropriate optimization |
| 157 | flags to GCC. | 157 | flags to GCC. |
| @@ -159,14 +159,14 @@ config MK6 | |||
| 159 | config MK7 | 159 | config MK7 |
| 160 | bool "Athlon/Duron/K7" | 160 | bool "Athlon/Duron/K7" |
| 161 | depends on X86_32 | 161 | depends on X86_32 |
| 162 | help | 162 | ---help--- |
| 163 | Select this for an AMD Athlon K7-family processor. Enables use of | 163 | Select this for an AMD Athlon K7-family processor. Enables use of |
| 164 | some extended instructions, and passes appropriate optimization | 164 | some extended instructions, and passes appropriate optimization |
| 165 | flags to GCC. | 165 | flags to GCC. |
| 166 | 166 | ||
| 167 | config MK8 | 167 | config MK8 |
| 168 | bool "Opteron/Athlon64/Hammer/K8" | 168 | bool "Opteron/Athlon64/Hammer/K8" |
| 169 | help | 169 | ---help--- |
| 170 | Select this for an AMD Opteron or Athlon64 Hammer-family processor. | 170 | Select this for an AMD Opteron or Athlon64 Hammer-family processor. |
| 171 | Enables use of some extended instructions, and passes appropriate | 171 | Enables use of some extended instructions, and passes appropriate |
| 172 | optimization flags to GCC. | 172 | optimization flags to GCC. |
| @@ -174,7 +174,7 @@ config MK8 | |||
| 174 | config MCRUSOE | 174 | config MCRUSOE |
| 175 | bool "Crusoe" | 175 | bool "Crusoe" |
| 176 | depends on X86_32 | 176 | depends on X86_32 |
| 177 | help | 177 | ---help--- |
| 178 | Select this for a Transmeta Crusoe processor. Treats the processor | 178 | Select this for a Transmeta Crusoe processor. Treats the processor |
| 179 | like a 586 with TSC, and sets some GCC optimization flags (like a | 179 | like a 586 with TSC, and sets some GCC optimization flags (like a |
| 180 | Pentium Pro with no alignment requirements). | 180 | Pentium Pro with no alignment requirements). |
| @@ -182,13 +182,13 @@ config MCRUSOE | |||
| 182 | config MEFFICEON | 182 | config MEFFICEON |
| 183 | bool "Efficeon" | 183 | bool "Efficeon" |
| 184 | depends on X86_32 | 184 | depends on X86_32 |
| 185 | help | 185 | ---help--- |
| 186 | Select this for a Transmeta Efficeon processor. | 186 | Select this for a Transmeta Efficeon processor. |
| 187 | 187 | ||
| 188 | config MWINCHIPC6 | 188 | config MWINCHIPC6 |
| 189 | bool "Winchip-C6" | 189 | bool "Winchip-C6" |
| 190 | depends on X86_32 | 190 | depends on X86_32 |
| 191 | help | 191 | ---help--- |
| 192 | Select this for an IDT Winchip C6 chip. Linux and GCC | 192 | Select this for an IDT Winchip C6 chip. Linux and GCC |
| 193 | treat this chip as a 586TSC with some extended instructions | 193 | treat this chip as a 586TSC with some extended instructions |
| 194 | and alignment requirements. | 194 | and alignment requirements. |
| @@ -196,7 +196,7 @@ config MWINCHIPC6 | |||
| 196 | config MWINCHIP3D | 196 | config MWINCHIP3D |
| 197 | bool "Winchip-2/Winchip-2A/Winchip-3" | 197 | bool "Winchip-2/Winchip-2A/Winchip-3" |
| 198 | depends on X86_32 | 198 | depends on X86_32 |
| 199 | help | 199 | ---help--- |
| 200 | Select this for an IDT Winchip-2, 2A or 3. Linux and GCC | 200 | Select this for an IDT Winchip-2, 2A or 3. Linux and GCC |
| 201 | treat this chip as a 586TSC with some extended instructions | 201 | treat this chip as a 586TSC with some extended instructions |
| 202 | and alignment requirements. Also enable out of order memory | 202 | and alignment requirements. Also enable out of order memory |
| @@ -206,19 +206,19 @@ config MWINCHIP3D | |||
| 206 | config MGEODEGX1 | 206 | config MGEODEGX1 |
| 207 | bool "GeodeGX1" | 207 | bool "GeodeGX1" |
| 208 | depends on X86_32 | 208 | depends on X86_32 |
| 209 | help | 209 | ---help--- |
| 210 | Select this for a Geode GX1 (Cyrix MediaGX) chip. | 210 | Select this for a Geode GX1 (Cyrix MediaGX) chip. |
| 211 | 211 | ||
| 212 | config MGEODE_LX | 212 | config MGEODE_LX |
| 213 | bool "Geode GX/LX" | 213 | bool "Geode GX/LX" |
| 214 | depends on X86_32 | 214 | depends on X86_32 |
| 215 | help | 215 | ---help--- |
| 216 | Select this for AMD Geode GX and LX processors. | 216 | Select this for AMD Geode GX and LX processors. |
| 217 | 217 | ||
| 218 | config MCYRIXIII | 218 | config MCYRIXIII |
| 219 | bool "CyrixIII/VIA-C3" | 219 | bool "CyrixIII/VIA-C3" |
| 220 | depends on X86_32 | 220 | depends on X86_32 |
| 221 | help | 221 | ---help--- |
| 222 | Select this for a Cyrix III or C3 chip. Presently Linux and GCC | 222 | Select this for a Cyrix III or C3 chip. Presently Linux and GCC |
| 223 | treat this chip as a generic 586. Whilst the CPU is 686 class, | 223 | treat this chip as a generic 586. Whilst the CPU is 686 class, |
| 224 | it lacks the cmov extension which gcc assumes is present when | 224 | it lacks the cmov extension which gcc assumes is present when |
| @@ -230,7 +230,7 @@ config MCYRIXIII | |||
| 230 | config MVIAC3_2 | 230 | config MVIAC3_2 |
| 231 | bool "VIA C3-2 (Nehemiah)" | 231 | bool "VIA C3-2 (Nehemiah)" |
| 232 | depends on X86_32 | 232 | depends on X86_32 |
| 233 | help | 233 | ---help--- |
| 234 | Select this for a VIA C3 "Nehemiah". Selecting this enables usage | 234 | Select this for a VIA C3 "Nehemiah". Selecting this enables usage |
| 235 | of SSE and tells gcc to treat the CPU as a 686. | 235 | of SSE and tells gcc to treat the CPU as a 686. |
| 236 | Note, this kernel will not boot on older (pre model 9) C3s. | 236 | Note, this kernel will not boot on older (pre model 9) C3s. |
| @@ -238,14 +238,14 @@ config MVIAC3_2 | |||
| 238 | config MVIAC7 | 238 | config MVIAC7 |
| 239 | bool "VIA C7" | 239 | bool "VIA C7" |
| 240 | depends on X86_32 | 240 | depends on X86_32 |
| 241 | help | 241 | ---help--- |
| 242 | Select this for a VIA C7. Selecting this uses the correct cache | 242 | Select this for a VIA C7. Selecting this uses the correct cache |
| 243 | shift and tells gcc to treat the CPU as a 686. | 243 | shift and tells gcc to treat the CPU as a 686. |
| 244 | 244 | ||
| 245 | config MPSC | 245 | config MPSC |
| 246 | bool "Intel P4 / older Netburst based Xeon" | 246 | bool "Intel P4 / older Netburst based Xeon" |
| 247 | depends on X86_64 | 247 | depends on X86_64 |
| 248 | help | 248 | ---help--- |
| 249 | Optimize for Intel Pentium 4, Pentium D and older Nocona/Dempsey | 249 | Optimize for Intel Pentium 4, Pentium D and older Nocona/Dempsey |
| 250 | Xeon CPUs with Intel 64bit which is compatible with x86-64. | 250 | Xeon CPUs with Intel 64bit which is compatible with x86-64. |
| 251 | Note that the latest Xeons (Xeon 51xx and 53xx) are not based on the | 251 | Note that the latest Xeons (Xeon 51xx and 53xx) are not based on the |
| @@ -255,7 +255,7 @@ config MPSC | |||
| 255 | 255 | ||
| 256 | config MCORE2 | 256 | config MCORE2 |
| 257 | bool "Core 2/newer Xeon" | 257 | bool "Core 2/newer Xeon" |
| 258 | help | 258 | ---help--- |
| 259 | 259 | ||
| 260 | Select this for Intel Core 2 and newer Core 2 Xeons (Xeon 51xx and | 260 | Select this for Intel Core 2 and newer Core 2 Xeons (Xeon 51xx and |
| 261 | 53xx) CPUs. You can distinguish newer from older Xeons by the CPU | 261 | 53xx) CPUs. You can distinguish newer from older Xeons by the CPU |
| @@ -265,7 +265,7 @@ config MCORE2 | |||
| 265 | config GENERIC_CPU | 265 | config GENERIC_CPU |
| 266 | bool "Generic-x86-64" | 266 | bool "Generic-x86-64" |
| 267 | depends on X86_64 | 267 | depends on X86_64 |
| 268 | help | 268 | ---help--- |
| 269 | Generic x86-64 CPU. | 269 | Generic x86-64 CPU. |
| 270 | Run equally well on all x86-64 CPUs. | 270 | Run equally well on all x86-64 CPUs. |
| 271 | 271 | ||
| @@ -274,7 +274,7 @@ endchoice | |||
| 274 | config X86_GENERIC | 274 | config X86_GENERIC |
| 275 | bool "Generic x86 support" | 275 | bool "Generic x86 support" |
| 276 | depends on X86_32 | 276 | depends on X86_32 |
| 277 | help | 277 | ---help--- |
| 278 | Instead of just including optimizations for the selected | 278 | Instead of just including optimizations for the selected |
| 279 | x86 variant (e.g. PII, Crusoe or Athlon), include some more | 279 | x86 variant (e.g. PII, Crusoe or Athlon), include some more |
| 280 | generic optimizations as well. This will make the kernel | 280 | generic optimizations as well. This will make the kernel |
| @@ -294,25 +294,23 @@ config X86_CPU | |||
| 294 | # Define implied options from the CPU selection here | 294 | # Define implied options from the CPU selection here |
| 295 | config X86_L1_CACHE_BYTES | 295 | config X86_L1_CACHE_BYTES |
| 296 | int | 296 | int |
| 297 | default "128" if GENERIC_CPU || MPSC | 297 | default "128" if MPSC |
| 298 | default "64" if MK8 || MCORE2 | 298 | default "64" if GENERIC_CPU || MK8 || MCORE2 || X86_32 |
| 299 | depends on X86_64 | ||
| 300 | 299 | ||
| 301 | config X86_INTERNODE_CACHE_BYTES | 300 | config X86_INTERNODE_CACHE_BYTES |
| 302 | int | 301 | int |
| 303 | default "4096" if X86_VSMP | 302 | default "4096" if X86_VSMP |
| 304 | default X86_L1_CACHE_BYTES if !X86_VSMP | 303 | default X86_L1_CACHE_BYTES if !X86_VSMP |
| 305 | depends on X86_64 | ||
| 306 | 304 | ||
| 307 | config X86_CMPXCHG | 305 | config X86_CMPXCHG |
| 308 | def_bool X86_64 || (X86_32 && !M386) | 306 | def_bool X86_64 || (X86_32 && !M386) |
| 309 | 307 | ||
| 310 | config X86_L1_CACHE_SHIFT | 308 | config X86_L1_CACHE_SHIFT |
| 311 | int | 309 | int |
| 312 | default "7" if MPENTIUM4 || X86_GENERIC || GENERIC_CPU || MPSC | 310 | default "7" if MPENTIUM4 || MPSC |
| 313 | default "4" if X86_ELAN || M486 || M386 || MGEODEGX1 | 311 | default "4" if X86_ELAN || M486 || M386 || MGEODEGX1 |
| 314 | default "5" if MWINCHIP3D || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODE_LX | 312 | default "5" if MWINCHIP3D || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODE_LX |
| 315 | default "6" if MK7 || MK8 || MPENTIUMM || MCORE2 || MVIAC7 | 313 | default "6" if MK7 || MK8 || MPENTIUMM || MCORE2 || MVIAC7 || X86_GENERIC || GENERIC_CPU |
| 316 | 314 | ||
| 317 | config X86_XADD | 315 | config X86_XADD |
| 318 | def_bool y | 316 | def_bool y |
| @@ -321,7 +319,7 @@ config X86_XADD | |||
| 321 | config X86_PPRO_FENCE | 319 | config X86_PPRO_FENCE |
| 322 | bool "PentiumPro memory ordering errata workaround" | 320 | bool "PentiumPro memory ordering errata workaround" |
| 323 | depends on M686 || M586MMX || M586TSC || M586 || M486 || M386 || MGEODEGX1 | 321 | depends on M686 || M586MMX || M586TSC || M586 || M486 || M386 || MGEODEGX1 |
| 324 | help | 322 | ---help--- |
| 325 | Old PentiumPro multiprocessor systems had errata that could cause | 323 | Old PentiumPro multiprocessor systems had errata that could cause |
| 326 | memory operations to violate the x86 ordering standard in rare cases. | 324 | memory operations to violate the x86 ordering standard in rare cases. |
| 327 | Enabling this option will attempt to work around some (but not all) | 325 | Enabling this option will attempt to work around some (but not all) |
| @@ -414,14 +412,14 @@ config X86_DEBUGCTLMSR | |||
| 414 | 412 | ||
| 415 | menuconfig PROCESSOR_SELECT | 413 | menuconfig PROCESSOR_SELECT |
| 416 | bool "Supported processor vendors" if EMBEDDED | 414 | bool "Supported processor vendors" if EMBEDDED |
| 417 | help | 415 | ---help--- |
| 418 | This lets you choose what x86 vendor support code your kernel | 416 | This lets you choose what x86 vendor support code your kernel |
| 419 | will include. | 417 | will include. |
| 420 | 418 | ||
| 421 | config CPU_SUP_INTEL | 419 | config CPU_SUP_INTEL |
| 422 | default y | 420 | default y |
| 423 | bool "Support Intel processors" if PROCESSOR_SELECT | 421 | bool "Support Intel processors" if PROCESSOR_SELECT |
| 424 | help | 422 | ---help--- |
| 425 | This enables detection, tunings and quirks for Intel processors | 423 | This enables detection, tunings and quirks for Intel processors |
| 426 | 424 | ||
| 427 | You need this enabled if you want your kernel to run on an | 425 | You need this enabled if you want your kernel to run on an |
| @@ -435,7 +433,7 @@ config CPU_SUP_CYRIX_32 | |||
| 435 | default y | 433 | default y |
| 436 | bool "Support Cyrix processors" if PROCESSOR_SELECT | 434 | bool "Support Cyrix processors" if PROCESSOR_SELECT |
| 437 | depends on !64BIT | 435 | depends on !64BIT |
| 438 | help | 436 | ---help--- |
| 439 | This enables detection, tunings and quirks for Cyrix processors | 437 | This enables detection, tunings and quirks for Cyrix processors |
| 440 | 438 | ||
| 441 | You need this enabled if you want your kernel to run on a | 439 | You need this enabled if you want your kernel to run on a |
| @@ -448,7 +446,7 @@ config CPU_SUP_CYRIX_32 | |||
| 448 | config CPU_SUP_AMD | 446 | config CPU_SUP_AMD |
| 449 | default y | 447 | default y |
| 450 | bool "Support AMD processors" if PROCESSOR_SELECT | 448 | bool "Support AMD processors" if PROCESSOR_SELECT |
| 451 | help | 449 | ---help--- |
| 452 | This enables detection, tunings and quirks for AMD processors | 450 | This enables detection, tunings and quirks for AMD processors |
| 453 | 451 | ||
| 454 | You need this enabled if you want your kernel to run on an | 452 | You need this enabled if you want your kernel to run on an |
| @@ -462,7 +460,7 @@ config CPU_SUP_CENTAUR_32 | |||
| 462 | default y | 460 | default y |
| 463 | bool "Support Centaur processors" if PROCESSOR_SELECT | 461 | bool "Support Centaur processors" if PROCESSOR_SELECT |
| 464 | depends on !64BIT | 462 | depends on !64BIT |
| 465 | help | 463 | ---help--- |
| 466 | This enables detection, tunings and quirks for Centaur processors | 464 | This enables detection, tunings and quirks for Centaur processors |
| 467 | 465 | ||
| 468 | You need this enabled if you want your kernel to run on a | 466 | You need this enabled if you want your kernel to run on a |
| @@ -476,7 +474,7 @@ config CPU_SUP_CENTAUR_64 | |||
| 476 | default y | 474 | default y |
| 477 | bool "Support Centaur processors" if PROCESSOR_SELECT | 475 | bool "Support Centaur processors" if PROCESSOR_SELECT |
| 478 | depends on 64BIT | 476 | depends on 64BIT |
| 479 | help | 477 | ---help--- |
| 480 | This enables detection, tunings and quirks for Centaur processors | 478 | This enables detection, tunings and quirks for Centaur processors |
| 481 | 479 | ||
| 482 | You need this enabled if you want your kernel to run on a | 480 | You need this enabled if you want your kernel to run on a |
| @@ -490,7 +488,7 @@ config CPU_SUP_TRANSMETA_32 | |||
| 490 | default y | 488 | default y |
| 491 | bool "Support Transmeta processors" if PROCESSOR_SELECT | 489 | bool "Support Transmeta processors" if PROCESSOR_SELECT |
| 492 | depends on !64BIT | 490 | depends on !64BIT |
| 493 | help | 491 | ---help--- |
| 494 | This enables detection, tunings and quirks for Transmeta processors | 492 | This enables detection, tunings and quirks for Transmeta processors |
| 495 | 493 | ||
| 496 | You need this enabled if you want your kernel to run on a | 494 | You need this enabled if you want your kernel to run on a |
| @@ -504,7 +502,7 @@ config CPU_SUP_UMC_32 | |||
| 504 | default y | 502 | default y |
| 505 | bool "Support UMC processors" if PROCESSOR_SELECT | 503 | bool "Support UMC processors" if PROCESSOR_SELECT |
| 506 | depends on !64BIT | 504 | depends on !64BIT |
| 507 | help | 505 | ---help--- |
| 508 | This enables detection, tunings and quirks for UMC processors | 506 | This enables detection, tunings and quirks for UMC processors |
| 509 | 507 | ||
| 510 | You need this enabled if you want your kernel to run on a | 508 | You need this enabled if you want your kernel to run on a |
| @@ -523,7 +521,7 @@ config X86_PTRACE_BTS | |||
| 523 | bool "Branch Trace Store" | 521 | bool "Branch Trace Store" |
| 524 | default y | 522 | default y |
| 525 | depends on X86_DEBUGCTLMSR | 523 | depends on X86_DEBUGCTLMSR |
| 526 | help | 524 | ---help--- |
| 527 | This adds a ptrace interface to the hardware's branch trace store. | 525 | This adds a ptrace interface to the hardware's branch trace store. |
| 528 | 526 | ||
| 529 | Debuggers may use it to collect an execution trace of the debugged | 527 | Debuggers may use it to collect an execution trace of the debugged |
diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug index e1983fa025d2..fdb45df608b6 100644 --- a/arch/x86/Kconfig.debug +++ b/arch/x86/Kconfig.debug | |||
| @@ -7,7 +7,7 @@ source "lib/Kconfig.debug" | |||
| 7 | 7 | ||
| 8 | config STRICT_DEVMEM | 8 | config STRICT_DEVMEM |
| 9 | bool "Filter access to /dev/mem" | 9 | bool "Filter access to /dev/mem" |
| 10 | help | 10 | ---help--- |
| 11 | If this option is disabled, you allow userspace (root) access to all | 11 | If this option is disabled, you allow userspace (root) access to all |
| 12 | of memory, including kernel and userspace memory. Accidental | 12 | of memory, including kernel and userspace memory. Accidental |
| 13 | access to this is obviously disastrous, but specific access can | 13 | access to this is obviously disastrous, but specific access can |
| @@ -25,7 +25,7 @@ config STRICT_DEVMEM | |||
| 25 | config X86_VERBOSE_BOOTUP | 25 | config X86_VERBOSE_BOOTUP |
| 26 | bool "Enable verbose x86 bootup info messages" | 26 | bool "Enable verbose x86 bootup info messages" |
| 27 | default y | 27 | default y |
| 28 | help | 28 | ---help--- |
| 29 | Enables the informational output from the decompression stage | 29 | Enables the informational output from the decompression stage |
| 30 | (e.g. bzImage) of the boot. If you disable this you will still | 30 | (e.g. bzImage) of the boot. If you disable this you will still |
| 31 | see errors. Disable this if you want silent bootup. | 31 | see errors. Disable this if you want silent bootup. |
| @@ -33,7 +33,7 @@ config X86_VERBOSE_BOOTUP | |||
| 33 | config EARLY_PRINTK | 33 | config EARLY_PRINTK |
| 34 | bool "Early printk" if EMBEDDED | 34 | bool "Early printk" if EMBEDDED |
| 35 | default y | 35 | default y |
| 36 | help | 36 | ---help--- |
| 37 | Write kernel log output directly into the VGA buffer or to a serial | 37 | Write kernel log output directly into the VGA buffer or to a serial |
| 38 | port. | 38 | port. |
| 39 | 39 | ||
| @@ -47,7 +47,7 @@ config EARLY_PRINTK_DBGP | |||
| 47 | bool "Early printk via EHCI debug port" | 47 | bool "Early printk via EHCI debug port" |
| 48 | default n | 48 | default n |
| 49 | depends on EARLY_PRINTK && PCI | 49 | depends on EARLY_PRINTK && PCI |
| 50 | help | 50 | ---help--- |
| 51 | Write kernel log output directly into the EHCI debug port. | 51 | Write kernel log output directly into the EHCI debug port. |
| 52 | 52 | ||
| 53 | This is useful for kernel debugging when your machine crashes very | 53 | This is useful for kernel debugging when your machine crashes very |
| @@ -59,14 +59,14 @@ config EARLY_PRINTK_DBGP | |||
| 59 | config DEBUG_STACKOVERFLOW | 59 | config DEBUG_STACKOVERFLOW |
| 60 | bool "Check for stack overflows" | 60 | bool "Check for stack overflows" |
| 61 | depends on DEBUG_KERNEL | 61 | depends on DEBUG_KERNEL |
| 62 | help | 62 | ---help--- |
| 63 | This option will cause messages to be printed if free stack space | 63 | This option will cause messages to be printed if free stack space |
| 64 | drops below a certain limit. | 64 | drops below a certain limit. |
| 65 | 65 | ||
| 66 | config DEBUG_STACK_USAGE | 66 | config DEBUG_STACK_USAGE |
| 67 | bool "Stack utilization instrumentation" | 67 | bool "Stack utilization instrumentation" |
| 68 | depends on DEBUG_KERNEL | 68 | depends on DEBUG_KERNEL |
| 69 | help | 69 | ---help--- |
| 70 | Enables the display of the minimum amount of free stack which each | 70 | Enables the display of the minimum amount of free stack which each |
| 71 | task has ever had available in the sysrq-T and sysrq-P debug output. | 71 | task has ever had available in the sysrq-T and sysrq-P debug output. |
| 72 | 72 | ||
| @@ -75,7 +75,7 @@ config DEBUG_STACK_USAGE | |||
| 75 | config DEBUG_PAGEALLOC | 75 | config DEBUG_PAGEALLOC |
| 76 | bool "Debug page memory allocations" | 76 | bool "Debug page memory allocations" |
| 77 | depends on DEBUG_KERNEL | 77 | depends on DEBUG_KERNEL |
| 78 | help | 78 | ---help--- |
| 79 | Unmap pages from the kernel linear mapping after free_pages(). | 79 | Unmap pages from the kernel linear mapping after free_pages(). |
| 80 | This results in a large slowdown, but helps to find certain types | 80 | This results in a large slowdown, but helps to find certain types |
| 81 | of memory corruptions. | 81 | of memory corruptions. |
| @@ -83,9 +83,9 @@ config DEBUG_PAGEALLOC | |||
| 83 | config DEBUG_PER_CPU_MAPS | 83 | config DEBUG_PER_CPU_MAPS |
| 84 | bool "Debug access to per_cpu maps" | 84 | bool "Debug access to per_cpu maps" |
| 85 | depends on DEBUG_KERNEL | 85 | depends on DEBUG_KERNEL |
| 86 | depends on X86_SMP | 86 | depends on SMP |
| 87 | default n | 87 | default n |
| 88 | help | 88 | ---help--- |
| 89 | Say Y to verify that the per_cpu map being accessed has | 89 | Say Y to verify that the per_cpu map being accessed has |
| 90 | been setup. Adds a fair amount of code to kernel memory | 90 | been setup. Adds a fair amount of code to kernel memory |
| 91 | and decreases performance. | 91 | and decreases performance. |
| @@ -96,7 +96,7 @@ config X86_PTDUMP | |||
| 96 | bool "Export kernel pagetable layout to userspace via debugfs" | 96 | bool "Export kernel pagetable layout to userspace via debugfs" |
| 97 | depends on DEBUG_KERNEL | 97 | depends on DEBUG_KERNEL |
| 98 | select DEBUG_FS | 98 | select DEBUG_FS |
| 99 | help | 99 | ---help--- |
| 100 | Say Y here if you want to show the kernel pagetable layout in a | 100 | Say Y here if you want to show the kernel pagetable layout in a |
| 101 | debugfs file. This information is only useful for kernel developers | 101 | debugfs file. This information is only useful for kernel developers |
| 102 | who are working in architecture specific areas of the kernel. | 102 | who are working in architecture specific areas of the kernel. |
| @@ -108,7 +108,7 @@ config DEBUG_RODATA | |||
| 108 | bool "Write protect kernel read-only data structures" | 108 | bool "Write protect kernel read-only data structures" |
| 109 | default y | 109 | default y |
| 110 | depends on DEBUG_KERNEL | 110 | depends on DEBUG_KERNEL |
| 111 | help | 111 | ---help--- |
| 112 | Mark the kernel read-only data as write-protected in the pagetables, | 112 | Mark the kernel read-only data as write-protected in the pagetables, |
| 113 | in order to catch accidental (and incorrect) writes to such const | 113 | in order to catch accidental (and incorrect) writes to such const |
| 114 | data. This is recommended so that we can catch kernel bugs sooner. | 114 | data. This is recommended so that we can catch kernel bugs sooner. |
| @@ -117,7 +117,8 @@ config DEBUG_RODATA | |||
| 117 | config DEBUG_RODATA_TEST | 117 | config DEBUG_RODATA_TEST |
| 118 | bool "Testcase for the DEBUG_RODATA feature" | 118 | bool "Testcase for the DEBUG_RODATA feature" |
| 119 | depends on DEBUG_RODATA | 119 | depends on DEBUG_RODATA |
| 120 | help | 120 | default y |
| 121 | ---help--- | ||
| 121 | This option enables a testcase for the DEBUG_RODATA | 122 | This option enables a testcase for the DEBUG_RODATA |
| 122 | feature as well as for the change_page_attr() infrastructure. | 123 | feature as well as for the change_page_attr() infrastructure. |
| 123 | If in doubt, say "N" | 124 | If in doubt, say "N" |
| @@ -125,7 +126,7 @@ config DEBUG_RODATA_TEST | |||
| 125 | config DEBUG_NX_TEST | 126 | config DEBUG_NX_TEST |
| 126 | tristate "Testcase for the NX non-executable stack feature" | 127 | tristate "Testcase for the NX non-executable stack feature" |
| 127 | depends on DEBUG_KERNEL && m | 128 | depends on DEBUG_KERNEL && m |
| 128 | help | 129 | ---help--- |
| 129 | This option enables a testcase for the CPU NX capability | 130 | This option enables a testcase for the CPU NX capability |
| 130 | and the software setup of this feature. | 131 | and the software setup of this feature. |
| 131 | If in doubt, say "N" | 132 | If in doubt, say "N" |
| @@ -133,7 +134,7 @@ config DEBUG_NX_TEST | |||
| 133 | config 4KSTACKS | 134 | config 4KSTACKS |
| 134 | bool "Use 4Kb for kernel stacks instead of 8Kb" | 135 | bool "Use 4Kb for kernel stacks instead of 8Kb" |
| 135 | depends on X86_32 | 136 | depends on X86_32 |
| 136 | help | 137 | ---help--- |
| 137 | If you say Y here the kernel will use a 4Kb stacksize for the | 138 | If you say Y here the kernel will use a 4Kb stacksize for the |
| 138 | kernel stack attached to each process/thread. This facilitates | 139 | kernel stack attached to each process/thread. This facilitates |
| 139 | running more threads on a system and also reduces the pressure | 140 | running more threads on a system and also reduces the pressure |
| @@ -144,7 +145,7 @@ config DOUBLEFAULT | |||
| 144 | default y | 145 | default y |
| 145 | bool "Enable doublefault exception handler" if EMBEDDED | 146 | bool "Enable doublefault exception handler" if EMBEDDED |
| 146 | depends on X86_32 | 147 | depends on X86_32 |
| 147 | help | 148 | ---help--- |
| 148 | This option allows trapping of rare doublefault exceptions that | 149 | This option allows trapping of rare doublefault exceptions that |
| 149 | would otherwise cause a system to silently reboot. Disabling this | 150 | would otherwise cause a system to silently reboot. Disabling this |
| 150 | option saves about 4k and might cause you much additional grey | 151 | option saves about 4k and might cause you much additional grey |
| @@ -154,7 +155,7 @@ config IOMMU_DEBUG | |||
| 154 | bool "Enable IOMMU debugging" | 155 | bool "Enable IOMMU debugging" |
| 155 | depends on GART_IOMMU && DEBUG_KERNEL | 156 | depends on GART_IOMMU && DEBUG_KERNEL |
| 156 | depends on X86_64 | 157 | depends on X86_64 |
| 157 | help | 158 | ---help--- |
| 158 | Force the IOMMU to on even when you have less than 4GB of | 159 | Force the IOMMU to on even when you have less than 4GB of |
| 159 | memory and add debugging code. On overflow always panic. And | 160 | memory and add debugging code. On overflow always panic. And |
| 160 | allow to enable IOMMU leak tracing. Can be disabled at boot | 161 | allow to enable IOMMU leak tracing. Can be disabled at boot |
| @@ -170,7 +171,7 @@ config IOMMU_LEAK | |||
| 170 | bool "IOMMU leak tracing" | 171 | bool "IOMMU leak tracing" |
| 171 | depends on DEBUG_KERNEL | 172 | depends on DEBUG_KERNEL |
| 172 | depends on IOMMU_DEBUG | 173 | depends on IOMMU_DEBUG |
| 173 | help | 174 | ---help--- |
| 174 | Add a simple leak tracer to the IOMMU code. This is useful when you | 175 | Add a simple leak tracer to the IOMMU code. This is useful when you |
| 175 | are debugging a buggy device driver that leaks IOMMU mappings. | 176 | are debugging a buggy device driver that leaks IOMMU mappings. |
| 176 | 177 | ||
| @@ -203,25 +204,25 @@ choice | |||
| 203 | 204 | ||
| 204 | config IO_DELAY_0X80 | 205 | config IO_DELAY_0X80 |
| 205 | bool "port 0x80 based port-IO delay [recommended]" | 206 | bool "port 0x80 based port-IO delay [recommended]" |
| 206 | help | 207 | ---help--- |
| 207 | This is the traditional Linux IO delay used for in/out_p. | 208 | This is the traditional Linux IO delay used for in/out_p. |
| 208 | It is the most tested hence safest selection here. | 209 | It is the most tested hence safest selection here. |
| 209 | 210 | ||
| 210 | config IO_DELAY_0XED | 211 | config IO_DELAY_0XED |
| 211 | bool "port 0xed based port-IO delay" | 212 | bool "port 0xed based port-IO delay" |
| 212 | help | 213 | ---help--- |
| 213 | Use port 0xed as the IO delay. This frees up port 0x80 which is | 214 | Use port 0xed as the IO delay. This frees up port 0x80 which is |
| 214 | often used as a hardware-debug port. | 215 | often used as a hardware-debug port. |
| 215 | 216 | ||
| 216 | config IO_DELAY_UDELAY | 217 | config IO_DELAY_UDELAY |
| 217 | bool "udelay based port-IO delay" | 218 | bool "udelay based port-IO delay" |
| 218 | help | 219 | ---help--- |
| 219 | Use udelay(2) as the IO delay method. This provides the delay | 220 | Use udelay(2) as the IO delay method. This provides the delay |
| 220 | while not having any side-effect on the IO port space. | 221 | while not having any side-effect on the IO port space. |
| 221 | 222 | ||
| 222 | config IO_DELAY_NONE | 223 | config IO_DELAY_NONE |
| 223 | bool "no port-IO delay" | 224 | bool "no port-IO delay" |
| 224 | help | 225 | ---help--- |
| 225 | No port-IO delay. Will break on old boxes that require port-IO | 226 | No port-IO delay. Will break on old boxes that require port-IO |
| 226 | delay for certain operations. Should work on most new machines. | 227 | delay for certain operations. Should work on most new machines. |
| 227 | 228 | ||
| @@ -255,18 +256,18 @@ config DEBUG_BOOT_PARAMS | |||
| 255 | bool "Debug boot parameters" | 256 | bool "Debug boot parameters" |
| 256 | depends on DEBUG_KERNEL | 257 | depends on DEBUG_KERNEL |
| 257 | depends on DEBUG_FS | 258 | depends on DEBUG_FS |
| 258 | help | 259 | ---help--- |
| 259 | This option will cause struct boot_params to be exported via debugfs. | 260 | This option will cause struct boot_params to be exported via debugfs. |
| 260 | 261 | ||
| 261 | config CPA_DEBUG | 262 | config CPA_DEBUG |
| 262 | bool "CPA self-test code" | 263 | bool "CPA self-test code" |
| 263 | depends on DEBUG_KERNEL | 264 | depends on DEBUG_KERNEL |
| 264 | help | 265 | ---help--- |
| 265 | Do change_page_attr() self-tests every 30 seconds. | 266 | Do change_page_attr() self-tests every 30 seconds. |
| 266 | 267 | ||
| 267 | config OPTIMIZE_INLINING | 268 | config OPTIMIZE_INLINING |
| 268 | bool "Allow gcc to uninline functions marked 'inline'" | 269 | bool "Allow gcc to uninline functions marked 'inline'" |
| 269 | help | 270 | ---help--- |
| 270 | This option determines if the kernel forces gcc to inline the functions | 271 | This option determines if the kernel forces gcc to inline the functions |
| 271 | developers have marked 'inline'. Doing so takes away freedom from gcc to | 272 | developers have marked 'inline'. Doing so takes away freedom from gcc to |
| 272 | do what it thinks is best, which is desirable for the gcc 3.x series of | 273 | do what it thinks is best, which is desirable for the gcc 3.x series of |
| @@ -279,4 +280,3 @@ config OPTIMIZE_INLINING | |||
| 279 | If unsure, say N. | 280 | If unsure, say N. |
| 280 | 281 | ||
| 281 | endmenu | 282 | endmenu |
| 282 | |||
diff --git a/arch/x86/Makefile b/arch/x86/Makefile index d1a47adb5aec..1836191839ee 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile | |||
| @@ -70,14 +70,17 @@ else | |||
| 70 | # this works around some issues with generating unwind tables in older gccs | 70 | # this works around some issues with generating unwind tables in older gccs |
| 71 | # newer gccs do it by default | 71 | # newer gccs do it by default |
| 72 | KBUILD_CFLAGS += -maccumulate-outgoing-args | 72 | KBUILD_CFLAGS += -maccumulate-outgoing-args |
| 73 | endif | ||
| 73 | 74 | ||
| 74 | stackp := $(CONFIG_SHELL) $(srctree)/scripts/gcc-x86_64-has-stack-protector.sh | 75 | ifdef CONFIG_CC_STACKPROTECTOR |
| 75 | stackp-$(CONFIG_CC_STACKPROTECTOR) := $(shell $(stackp) \ | 76 | cc_has_sp := $(srctree)/scripts/gcc-x86_$(BITS)-has-stack-protector.sh |
| 76 | "$(CC)" -fstack-protector ) | 77 | ifeq ($(shell $(CONFIG_SHELL) $(cc_has_sp) $(CC)),y) |
| 77 | stackp-$(CONFIG_CC_STACKPROTECTOR_ALL) += $(shell $(stackp) \ | 78 | stackp-y := -fstack-protector |
| 78 | "$(CC)" -fstack-protector-all ) | 79 | stackp-$(CONFIG_CC_STACKPROTECTOR_ALL) += -fstack-protector-all |
| 79 | 80 | KBUILD_CFLAGS += $(stackp-y) | |
| 80 | KBUILD_CFLAGS += $(stackp-y) | 81 | else |
| 82 | $(warning stack protector enabled but no compiler support) | ||
| 83 | endif | ||
| 81 | endif | 84 | endif |
| 82 | 85 | ||
| 83 | # Stackpointer is addressed different for 32 bit and 64 bit x86 | 86 | # Stackpointer is addressed different for 32 bit and 64 bit x86 |
| @@ -102,29 +105,6 @@ KBUILD_CFLAGS += -fno-asynchronous-unwind-tables | |||
| 102 | # prevent gcc from generating any FP code by mistake | 105 | # prevent gcc from generating any FP code by mistake |
| 103 | KBUILD_CFLAGS += $(call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-3dnow,) | 106 | KBUILD_CFLAGS += $(call cc-option,-mno-sse -mno-mmx -mno-sse2 -mno-3dnow,) |
| 104 | 107 | ||
| 105 | ### | ||
| 106 | # Sub architecture support | ||
| 107 | # fcore-y is linked before mcore-y files. | ||
| 108 | |||
| 109 | # Default subarch .c files | ||
| 110 | mcore-y := arch/x86/mach-default/ | ||
| 111 | |||
| 112 | # Voyager subarch support | ||
| 113 | mflags-$(CONFIG_X86_VOYAGER) := -Iarch/x86/include/asm/mach-voyager | ||
| 114 | mcore-$(CONFIG_X86_VOYAGER) := arch/x86/mach-voyager/ | ||
| 115 | |||
| 116 | # generic subarchitecture | ||
| 117 | mflags-$(CONFIG_X86_GENERICARCH):= -Iarch/x86/include/asm/mach-generic | ||
| 118 | fcore-$(CONFIG_X86_GENERICARCH) += arch/x86/mach-generic/ | ||
| 119 | mcore-$(CONFIG_X86_GENERICARCH) := arch/x86/mach-default/ | ||
| 120 | |||
| 121 | # default subarch .h files | ||
| 122 | mflags-y += -Iarch/x86/include/asm/mach-default | ||
| 123 | |||
| 124 | # 64 bit does not support subarch support - clear sub arch variables | ||
| 125 | fcore-$(CONFIG_X86_64) := | ||
| 126 | mcore-$(CONFIG_X86_64) := | ||
| 127 | |||
| 128 | KBUILD_CFLAGS += $(mflags-y) | 108 | KBUILD_CFLAGS += $(mflags-y) |
| 129 | KBUILD_AFLAGS += $(mflags-y) | 109 | KBUILD_AFLAGS += $(mflags-y) |
| 130 | 110 | ||
| @@ -150,9 +130,6 @@ core-$(CONFIG_LGUEST_GUEST) += arch/x86/lguest/ | |||
| 150 | core-y += arch/x86/kernel/ | 130 | core-y += arch/x86/kernel/ |
| 151 | core-y += arch/x86/mm/ | 131 | core-y += arch/x86/mm/ |
| 152 | 132 | ||
| 153 | # Remaining sub architecture files | ||
| 154 | core-y += $(mcore-y) | ||
| 155 | |||
| 156 | core-y += arch/x86/crypto/ | 133 | core-y += arch/x86/crypto/ |
| 157 | core-y += arch/x86/vdso/ | 134 | core-y += arch/x86/vdso/ |
| 158 | core-$(CONFIG_IA32_EMULATION) += arch/x86/ia32/ | 135 | core-$(CONFIG_IA32_EMULATION) += arch/x86/ia32/ |
diff --git a/arch/x86/boot/a20.c b/arch/x86/boot/a20.c index 4063d630deff..fba8e9c6a504 100644 --- a/arch/x86/boot/a20.c +++ b/arch/x86/boot/a20.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * | 2 | * |
| 3 | * Copyright (C) 1991, 1992 Linus Torvalds | 3 | * Copyright (C) 1991, 1992 Linus Torvalds |
| 4 | * Copyright 2007-2008 rPath, Inc. - All Rights Reserved | 4 | * Copyright 2007-2008 rPath, Inc. - All Rights Reserved |
| 5 | * Copyright 2009 Intel Corporation | ||
| 5 | * | 6 | * |
| 6 | * This file is part of the Linux kernel, and is made available under | 7 | * This file is part of the Linux kernel, and is made available under |
| 7 | * the terms of the GNU General Public License version 2. | 8 | * the terms of the GNU General Public License version 2. |
| @@ -15,16 +16,23 @@ | |||
| 15 | #include "boot.h" | 16 | #include "boot.h" |
| 16 | 17 | ||
| 17 | #define MAX_8042_LOOPS 100000 | 18 | #define MAX_8042_LOOPS 100000 |
| 19 | #define MAX_8042_FF 32 | ||
| 18 | 20 | ||
| 19 | static int empty_8042(void) | 21 | static int empty_8042(void) |
| 20 | { | 22 | { |
| 21 | u8 status; | 23 | u8 status; |
| 22 | int loops = MAX_8042_LOOPS; | 24 | int loops = MAX_8042_LOOPS; |
| 25 | int ffs = MAX_8042_FF; | ||
| 23 | 26 | ||
| 24 | while (loops--) { | 27 | while (loops--) { |
| 25 | io_delay(); | 28 | io_delay(); |
| 26 | 29 | ||
| 27 | status = inb(0x64); | 30 | status = inb(0x64); |
| 31 | if (status == 0xff) { | ||
| 32 | /* FF is a plausible, but very unlikely status */ | ||
| 33 | if (!--ffs) | ||
| 34 | return -1; /* Assume no KBC present */ | ||
| 35 | } | ||
| 28 | if (status & 1) { | 36 | if (status & 1) { |
| 29 | /* Read and discard input data */ | 37 | /* Read and discard input data */ |
| 30 | io_delay(); | 38 | io_delay(); |
| @@ -118,44 +126,43 @@ static void enable_a20_fast(void) | |||
| 118 | 126 | ||
| 119 | int enable_a20(void) | 127 | int enable_a20(void) |
| 120 | { | 128 | { |
| 121 | #if defined(CONFIG_X86_ELAN) | 129 | #ifdef CONFIG_X86_VOYAGER |
| 122 | /* Elan croaks if we try to touch the KBC */ | ||
| 123 | enable_a20_fast(); | ||
| 124 | while (!a20_test_long()) | ||
| 125 | ; | ||
| 126 | return 0; | ||
| 127 | #elif defined(CONFIG_X86_VOYAGER) | ||
| 128 | /* On Voyager, a20_test() is unsafe? */ | 130 | /* On Voyager, a20_test() is unsafe? */ |
| 129 | enable_a20_kbc(); | 131 | enable_a20_kbc(); |
| 130 | return 0; | 132 | return 0; |
| 131 | #else | 133 | #else |
| 132 | int loops = A20_ENABLE_LOOPS; | 134 | int loops = A20_ENABLE_LOOPS; |
| 133 | while (loops--) { | 135 | int kbc_err; |
| 134 | /* First, check to see if A20 is already enabled | 136 | |
| 135 | (legacy free, etc.) */ | 137 | while (loops--) { |
| 136 | if (a20_test_short()) | 138 | /* First, check to see if A20 is already enabled |
| 137 | return 0; | 139 | (legacy free, etc.) */ |
| 138 | 140 | if (a20_test_short()) | |
| 139 | /* Next, try the BIOS (INT 0x15, AX=0x2401) */ | 141 | return 0; |
| 140 | enable_a20_bios(); | 142 | |
| 141 | if (a20_test_short()) | 143 | /* Next, try the BIOS (INT 0x15, AX=0x2401) */ |
| 142 | return 0; | 144 | enable_a20_bios(); |
| 143 | 145 | if (a20_test_short()) | |
| 144 | /* Try enabling A20 through the keyboard controller */ | 146 | return 0; |
| 145 | empty_8042(); | 147 | |
| 146 | if (a20_test_short()) | 148 | /* Try enabling A20 through the keyboard controller */ |
| 147 | return 0; /* BIOS worked, but with delayed reaction */ | 149 | kbc_err = empty_8042(); |
| 148 | 150 | ||
| 149 | enable_a20_kbc(); | 151 | if (a20_test_short()) |
| 150 | if (a20_test_long()) | 152 | return 0; /* BIOS worked, but with delayed reaction */ |
| 151 | return 0; | 153 | |
| 152 | 154 | if (!kbc_err) { | |
| 153 | /* Finally, try enabling the "fast A20 gate" */ | 155 | enable_a20_kbc(); |
| 154 | enable_a20_fast(); | 156 | if (a20_test_long()) |
| 155 | if (a20_test_long()) | 157 | return 0; |
| 156 | return 0; | 158 | } |
| 157 | } | 159 | |
| 158 | 160 | /* Finally, try enabling the "fast A20 gate" */ | |
| 159 | return -1; | 161 | enable_a20_fast(); |
| 162 | if (a20_test_long()) | ||
| 163 | return 0; | ||
| 164 | } | ||
| 165 | |||
| 166 | return -1; | ||
| 160 | #endif | 167 | #endif |
| 161 | } | 168 | } |
diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S index 29c5fbf08392..3a8a866fb2e2 100644 --- a/arch/x86/boot/compressed/head_32.S +++ b/arch/x86/boot/compressed/head_32.S | |||
| @@ -25,14 +25,12 @@ | |||
| 25 | 25 | ||
| 26 | #include <linux/linkage.h> | 26 | #include <linux/linkage.h> |
| 27 | #include <asm/segment.h> | 27 | #include <asm/segment.h> |
| 28 | #include <asm/page.h> | 28 | #include <asm/page_types.h> |
| 29 | #include <asm/boot.h> | 29 | #include <asm/boot.h> |
| 30 | #include <asm/asm-offsets.h> | 30 | #include <asm/asm-offsets.h> |
| 31 | 31 | ||
| 32 | .section ".text.head","ax",@progbits | 32 | .section ".text.head","ax",@progbits |
| 33 | .globl startup_32 | 33 | ENTRY(startup_32) |
| 34 | |||
| 35 | startup_32: | ||
| 36 | cld | 34 | cld |
| 37 | /* test KEEP_SEGMENTS flag to see if the bootloader is asking | 35 | /* test KEEP_SEGMENTS flag to see if the bootloader is asking |
| 38 | * us to not reload segments */ | 36 | * us to not reload segments */ |
| @@ -113,6 +111,8 @@ startup_32: | |||
| 113 | */ | 111 | */ |
| 114 | leal relocated(%ebx), %eax | 112 | leal relocated(%ebx), %eax |
| 115 | jmp *%eax | 113 | jmp *%eax |
| 114 | ENDPROC(startup_32) | ||
| 115 | |||
| 116 | .section ".text" | 116 | .section ".text" |
| 117 | relocated: | 117 | relocated: |
| 118 | 118 | ||
diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index 1d5dff4123e1..ed4a82948002 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S | |||
| @@ -26,8 +26,8 @@ | |||
| 26 | 26 | ||
| 27 | #include <linux/linkage.h> | 27 | #include <linux/linkage.h> |
| 28 | #include <asm/segment.h> | 28 | #include <asm/segment.h> |
| 29 | #include <asm/pgtable.h> | 29 | #include <asm/pgtable_types.h> |
| 30 | #include <asm/page.h> | 30 | #include <asm/page_types.h> |
| 31 | #include <asm/boot.h> | 31 | #include <asm/boot.h> |
| 32 | #include <asm/msr.h> | 32 | #include <asm/msr.h> |
| 33 | #include <asm/processor-flags.h> | 33 | #include <asm/processor-flags.h> |
| @@ -35,9 +35,7 @@ | |||
| 35 | 35 | ||
| 36 | .section ".text.head" | 36 | .section ".text.head" |
| 37 | .code32 | 37 | .code32 |
| 38 | .globl startup_32 | 38 | ENTRY(startup_32) |
| 39 | |||
| 40 | startup_32: | ||
| 41 | cld | 39 | cld |
| 42 | /* test KEEP_SEGMENTS flag to see if the bootloader is asking | 40 | /* test KEEP_SEGMENTS flag to see if the bootloader is asking |
| 43 | * us to not reload segments */ | 41 | * us to not reload segments */ |
| @@ -176,6 +174,7 @@ startup_32: | |||
| 176 | 174 | ||
| 177 | /* Jump from 32bit compatibility mode into 64bit mode. */ | 175 | /* Jump from 32bit compatibility mode into 64bit mode. */ |
| 178 | lret | 176 | lret |
| 177 | ENDPROC(startup_32) | ||
| 179 | 178 | ||
| 180 | no_longmode: | 179 | no_longmode: |
| 181 | /* This isn't an x86-64 CPU so hang */ | 180 | /* This isn't an x86-64 CPU so hang */ |
| @@ -295,7 +294,6 @@ relocated: | |||
| 295 | call decompress_kernel | 294 | call decompress_kernel |
| 296 | popq %rsi | 295 | popq %rsi |
| 297 | 296 | ||
| 298 | |||
| 299 | /* | 297 | /* |
| 300 | * Jump to the decompressed kernel. | 298 | * Jump to the decompressed kernel. |
| 301 | */ | 299 | */ |
diff --git a/arch/x86/boot/copy.S b/arch/x86/boot/copy.S index ef50c84e8b4b..11f272c6f5e9 100644 --- a/arch/x86/boot/copy.S +++ b/arch/x86/boot/copy.S | |||
| @@ -8,6 +8,8 @@ | |||
| 8 | * | 8 | * |
| 9 | * ----------------------------------------------------------------------- */ | 9 | * ----------------------------------------------------------------------- */ |
| 10 | 10 | ||
| 11 | #include <linux/linkage.h> | ||
| 12 | |||
| 11 | /* | 13 | /* |
| 12 | * Memory copy routines | 14 | * Memory copy routines |
| 13 | */ | 15 | */ |
| @@ -15,9 +17,7 @@ | |||
| 15 | .code16gcc | 17 | .code16gcc |
| 16 | .text | 18 | .text |
| 17 | 19 | ||
| 18 | .globl memcpy | 20 | GLOBAL(memcpy) |
| 19 | .type memcpy, @function | ||
| 20 | memcpy: | ||
| 21 | pushw %si | 21 | pushw %si |
| 22 | pushw %di | 22 | pushw %di |
| 23 | movw %ax, %di | 23 | movw %ax, %di |
| @@ -31,11 +31,9 @@ memcpy: | |||
| 31 | popw %di | 31 | popw %di |
| 32 | popw %si | 32 | popw %si |
| 33 | ret | 33 | ret |
| 34 | .size memcpy, .-memcpy | 34 | ENDPROC(memcpy) |
| 35 | 35 | ||
| 36 | .globl memset | 36 | GLOBAL(memset) |
| 37 | .type memset, @function | ||
| 38 | memset: | ||
| 39 | pushw %di | 37 | pushw %di |
| 40 | movw %ax, %di | 38 | movw %ax, %di |
| 41 | movzbl %dl, %eax | 39 | movzbl %dl, %eax |
| @@ -48,52 +46,42 @@ memset: | |||
| 48 | rep; stosb | 46 | rep; stosb |
| 49 | popw %di | 47 | popw %di |
| 50 | ret | 48 | ret |
| 51 | .size memset, .-memset | 49 | ENDPROC(memset) |
| 52 | 50 | ||
| 53 | .globl copy_from_fs | 51 | GLOBAL(copy_from_fs) |
| 54 | .type copy_from_fs, @function | ||
| 55 | copy_from_fs: | ||
| 56 | pushw %ds | 52 | pushw %ds |
| 57 | pushw %fs | 53 | pushw %fs |
| 58 | popw %ds | 54 | popw %ds |
| 59 | call memcpy | 55 | call memcpy |
| 60 | popw %ds | 56 | popw %ds |
| 61 | ret | 57 | ret |
| 62 | .size copy_from_fs, .-copy_from_fs | 58 | ENDPROC(copy_from_fs) |
| 63 | 59 | ||
| 64 | .globl copy_to_fs | 60 | GLOBAL(copy_to_fs) |
| 65 | .type copy_to_fs, @function | ||
| 66 | copy_to_fs: | ||
| 67 | pushw %es | 61 | pushw %es |
| 68 | pushw %fs | 62 | pushw %fs |
| 69 | popw %es | 63 | popw %es |
| 70 | call memcpy | 64 | call memcpy |
| 71 | popw %es | 65 | popw %es |
| 72 | ret | 66 | ret |
| 73 | .size copy_to_fs, .-copy_to_fs | 67 | ENDPROC(copy_to_fs) |
| 74 | 68 | ||
| 75 | #if 0 /* Not currently used, but can be enabled as needed */ | 69 | #if 0 /* Not currently used, but can be enabled as needed */ |
| 76 | 70 | GLOBAL(copy_from_gs) | |
| 77 | .globl copy_from_gs | ||
| 78 | .type copy_from_gs, @function | ||
| 79 | copy_from_gs: | ||
| 80 | pushw %ds | 71 | pushw %ds |
| 81 | pushw %gs | 72 | pushw %gs |
| 82 | popw %ds | 73 | popw %ds |
| 83 | call memcpy | 74 | call memcpy |
| 84 | popw %ds | 75 | popw %ds |
| 85 | ret | 76 | ret |
| 86 | .size copy_from_gs, .-copy_from_gs | 77 | ENDPROC(copy_from_gs) |
| 87 | .globl copy_to_gs | ||
| 88 | 78 | ||
| 89 | .type copy_to_gs, @function | 79 | GLOBAL(copy_to_gs) |
| 90 | copy_to_gs: | ||
| 91 | pushw %es | 80 | pushw %es |
| 92 | pushw %gs | 81 | pushw %gs |
| 93 | popw %es | 82 | popw %es |
| 94 | call memcpy | 83 | call memcpy |
| 95 | popw %es | 84 | popw %es |
| 96 | ret | 85 | ret |
| 97 | .size copy_to_gs, .-copy_to_gs | 86 | ENDPROC(copy_to_gs) |
| 98 | |||
| 99 | #endif | 87 | #endif |
diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S index b993062e9a5f..7ccff4884a23 100644 --- a/arch/x86/boot/header.S +++ b/arch/x86/boot/header.S | |||
| @@ -19,7 +19,7 @@ | |||
| 19 | #include <linux/utsrelease.h> | 19 | #include <linux/utsrelease.h> |
| 20 | #include <asm/boot.h> | 20 | #include <asm/boot.h> |
| 21 | #include <asm/e820.h> | 21 | #include <asm/e820.h> |
| 22 | #include <asm/page.h> | 22 | #include <asm/page_types.h> |
| 23 | #include <asm/setup.h> | 23 | #include <asm/setup.h> |
| 24 | #include "boot.h" | 24 | #include "boot.h" |
| 25 | #include "offsets.h" | 25 | #include "offsets.h" |
diff --git a/arch/x86/boot/pmjump.S b/arch/x86/boot/pmjump.S index 141b6e20ed31..019c17a75851 100644 --- a/arch/x86/boot/pmjump.S +++ b/arch/x86/boot/pmjump.S | |||
| @@ -15,18 +15,15 @@ | |||
| 15 | #include <asm/boot.h> | 15 | #include <asm/boot.h> |
| 16 | #include <asm/processor-flags.h> | 16 | #include <asm/processor-flags.h> |
| 17 | #include <asm/segment.h> | 17 | #include <asm/segment.h> |
| 18 | #include <linux/linkage.h> | ||
| 18 | 19 | ||
| 19 | .text | 20 | .text |
| 20 | |||
| 21 | .globl protected_mode_jump | ||
| 22 | .type protected_mode_jump, @function | ||
| 23 | |||
| 24 | .code16 | 21 | .code16 |
| 25 | 22 | ||
| 26 | /* | 23 | /* |
| 27 | * void protected_mode_jump(u32 entrypoint, u32 bootparams); | 24 | * void protected_mode_jump(u32 entrypoint, u32 bootparams); |
| 28 | */ | 25 | */ |
| 29 | protected_mode_jump: | 26 | GLOBAL(protected_mode_jump) |
| 30 | movl %edx, %esi # Pointer to boot_params table | 27 | movl %edx, %esi # Pointer to boot_params table |
| 31 | 28 | ||
| 32 | xorl %ebx, %ebx | 29 | xorl %ebx, %ebx |
| @@ -47,12 +44,10 @@ protected_mode_jump: | |||
| 47 | .byte 0x66, 0xea # ljmpl opcode | 44 | .byte 0x66, 0xea # ljmpl opcode |
| 48 | 2: .long in_pm32 # offset | 45 | 2: .long in_pm32 # offset |
| 49 | .word __BOOT_CS # segment | 46 | .word __BOOT_CS # segment |
| 50 | 47 | ENDPROC(protected_mode_jump) | |
| 51 | .size protected_mode_jump, .-protected_mode_jump | ||
| 52 | 48 | ||
| 53 | .code32 | 49 | .code32 |
| 54 | .type in_pm32, @function | 50 | GLOBAL(in_pm32) |
| 55 | in_pm32: | ||
| 56 | # Set up data segments for flat 32-bit mode | 51 | # Set up data segments for flat 32-bit mode |
| 57 | movl %ecx, %ds | 52 | movl %ecx, %ds |
| 58 | movl %ecx, %es | 53 | movl %ecx, %es |
| @@ -78,5 +73,4 @@ in_pm32: | |||
| 78 | lldt %cx | 73 | lldt %cx |
| 79 | 74 | ||
| 80 | jmpl *%eax # Jump to the 32-bit entrypoint | 75 | jmpl *%eax # Jump to the 32-bit entrypoint |
| 81 | 76 | ENDPROC(in_pm32) | |
| 82 | .size in_pm32, .-in_pm32 | ||
diff --git a/arch/x86/configs/i386_defconfig b/arch/x86/configs/i386_defconfig index edba00d98ac3..096dd5359cd9 100644 --- a/arch/x86/configs/i386_defconfig +++ b/arch/x86/configs/i386_defconfig | |||
| @@ -1,14 +1,13 @@ | |||
| 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-rc5 | 3 | # Linux kernel version: 2.6.29-rc4 |
| 4 | # Wed Sep 3 17:23:09 2008 | 4 | # Thu Feb 12 12:57:57 2009 |
| 5 | # | 5 | # |
| 6 | # CONFIG_64BIT is not set | 6 | # CONFIG_64BIT is not set |
| 7 | CONFIG_X86_32=y | 7 | CONFIG_X86_32=y |
| 8 | # CONFIG_X86_64 is not set | 8 | # CONFIG_X86_64 is not set |
| 9 | CONFIG_X86=y | 9 | CONFIG_X86=y |
| 10 | CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig" | 10 | CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig" |
| 11 | # CONFIG_GENERIC_LOCKBREAK is not set | ||
| 12 | CONFIG_GENERIC_TIME=y | 11 | CONFIG_GENERIC_TIME=y |
| 13 | CONFIG_GENERIC_CMOS_UPDATE=y | 12 | CONFIG_GENERIC_CMOS_UPDATE=y |
| 14 | CONFIG_CLOCKSOURCE_WATCHDOG=y | 13 | CONFIG_CLOCKSOURCE_WATCHDOG=y |
| @@ -24,16 +23,14 @@ CONFIG_GENERIC_ISA_DMA=y | |||
| 24 | CONFIG_GENERIC_IOMAP=y | 23 | CONFIG_GENERIC_IOMAP=y |
| 25 | CONFIG_GENERIC_BUG=y | 24 | CONFIG_GENERIC_BUG=y |
| 26 | CONFIG_GENERIC_HWEIGHT=y | 25 | CONFIG_GENERIC_HWEIGHT=y |
| 27 | # CONFIG_GENERIC_GPIO is not set | ||
| 28 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y | 26 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y |
| 29 | # CONFIG_RWSEM_GENERIC_SPINLOCK is not set | 27 | # CONFIG_RWSEM_GENERIC_SPINLOCK is not set |
| 30 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | 28 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y |
| 31 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 32 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 33 | CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y | 29 | CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y |
| 34 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 30 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
| 35 | # CONFIG_GENERIC_TIME_VSYSCALL is not set | 31 | # CONFIG_GENERIC_TIME_VSYSCALL is not set |
| 36 | CONFIG_ARCH_HAS_CPU_RELAX=y | 32 | CONFIG_ARCH_HAS_CPU_RELAX=y |
| 33 | CONFIG_ARCH_HAS_DEFAULT_IDLE=y | ||
| 37 | CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y | 34 | CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y |
| 38 | CONFIG_HAVE_SETUP_PER_CPU_AREA=y | 35 | CONFIG_HAVE_SETUP_PER_CPU_AREA=y |
| 39 | # CONFIG_HAVE_CPUMASK_OF_CPU_MAP is not set | 36 | # CONFIG_HAVE_CPUMASK_OF_CPU_MAP is not set |
| @@ -42,12 +39,12 @@ CONFIG_ARCH_SUSPEND_POSSIBLE=y | |||
| 42 | # CONFIG_ZONE_DMA32 is not set | 39 | # CONFIG_ZONE_DMA32 is not set |
| 43 | CONFIG_ARCH_POPULATES_NODE_MAP=y | 40 | CONFIG_ARCH_POPULATES_NODE_MAP=y |
| 44 | # CONFIG_AUDIT_ARCH is not set | 41 | # CONFIG_AUDIT_ARCH is not set |
| 45 | CONFIG_ARCH_SUPPORTS_AOUT=y | ||
| 46 | CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y | 42 | CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y |
| 47 | CONFIG_GENERIC_HARDIRQS=y | 43 | CONFIG_GENERIC_HARDIRQS=y |
| 48 | CONFIG_GENERIC_IRQ_PROBE=y | 44 | CONFIG_GENERIC_IRQ_PROBE=y |
| 49 | CONFIG_GENERIC_PENDING_IRQ=y | 45 | CONFIG_GENERIC_PENDING_IRQ=y |
| 50 | CONFIG_X86_SMP=y | 46 | CONFIG_X86_SMP=y |
| 47 | CONFIG_USE_GENERIC_SMP_HELPERS=y | ||
| 51 | CONFIG_X86_32_SMP=y | 48 | CONFIG_X86_32_SMP=y |
| 52 | CONFIG_X86_HT=y | 49 | CONFIG_X86_HT=y |
| 53 | CONFIG_X86_BIOS_REBOOT=y | 50 | CONFIG_X86_BIOS_REBOOT=y |
| @@ -76,30 +73,44 @@ CONFIG_TASK_IO_ACCOUNTING=y | |||
| 76 | CONFIG_AUDIT=y | 73 | CONFIG_AUDIT=y |
| 77 | CONFIG_AUDITSYSCALL=y | 74 | CONFIG_AUDITSYSCALL=y |
| 78 | CONFIG_AUDIT_TREE=y | 75 | CONFIG_AUDIT_TREE=y |
| 76 | |||
| 77 | # | ||
| 78 | # RCU Subsystem | ||
| 79 | # | ||
| 80 | # CONFIG_CLASSIC_RCU is not set | ||
| 81 | CONFIG_TREE_RCU=y | ||
| 82 | # CONFIG_PREEMPT_RCU is not set | ||
| 83 | # CONFIG_RCU_TRACE is not set | ||
| 84 | CONFIG_RCU_FANOUT=32 | ||
| 85 | # CONFIG_RCU_FANOUT_EXACT is not set | ||
| 86 | # CONFIG_TREE_RCU_TRACE is not set | ||
| 87 | # CONFIG_PREEMPT_RCU_TRACE is not set | ||
| 79 | # CONFIG_IKCONFIG is not set | 88 | # CONFIG_IKCONFIG is not set |
| 80 | CONFIG_LOG_BUF_SHIFT=18 | 89 | CONFIG_LOG_BUF_SHIFT=18 |
| 81 | CONFIG_CGROUPS=y | ||
| 82 | # CONFIG_CGROUP_DEBUG is not set | ||
| 83 | CONFIG_CGROUP_NS=y | ||
| 84 | # CONFIG_CGROUP_DEVICE is not set | ||
| 85 | CONFIG_CPUSETS=y | ||
| 86 | CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y | 90 | CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y |
| 87 | CONFIG_GROUP_SCHED=y | 91 | CONFIG_GROUP_SCHED=y |
| 88 | CONFIG_FAIR_GROUP_SCHED=y | 92 | CONFIG_FAIR_GROUP_SCHED=y |
| 89 | # CONFIG_RT_GROUP_SCHED is not set | 93 | # CONFIG_RT_GROUP_SCHED is not set |
| 90 | # CONFIG_USER_SCHED is not set | 94 | # CONFIG_USER_SCHED is not set |
| 91 | CONFIG_CGROUP_SCHED=y | 95 | CONFIG_CGROUP_SCHED=y |
| 96 | CONFIG_CGROUPS=y | ||
| 97 | # CONFIG_CGROUP_DEBUG is not set | ||
| 98 | CONFIG_CGROUP_NS=y | ||
| 99 | CONFIG_CGROUP_FREEZER=y | ||
| 100 | # CONFIG_CGROUP_DEVICE is not set | ||
| 101 | CONFIG_CPUSETS=y | ||
| 102 | CONFIG_PROC_PID_CPUSET=y | ||
| 92 | CONFIG_CGROUP_CPUACCT=y | 103 | CONFIG_CGROUP_CPUACCT=y |
| 93 | CONFIG_RESOURCE_COUNTERS=y | 104 | CONFIG_RESOURCE_COUNTERS=y |
| 94 | # CONFIG_CGROUP_MEM_RES_CTLR is not set | 105 | # CONFIG_CGROUP_MEM_RES_CTLR is not set |
| 95 | # CONFIG_SYSFS_DEPRECATED_V2 is not set | 106 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 96 | CONFIG_PROC_PID_CPUSET=y | ||
| 97 | CONFIG_RELAY=y | 107 | CONFIG_RELAY=y |
| 98 | CONFIG_NAMESPACES=y | 108 | CONFIG_NAMESPACES=y |
| 99 | CONFIG_UTS_NS=y | 109 | CONFIG_UTS_NS=y |
| 100 | CONFIG_IPC_NS=y | 110 | CONFIG_IPC_NS=y |
| 101 | CONFIG_USER_NS=y | 111 | CONFIG_USER_NS=y |
| 102 | CONFIG_PID_NS=y | 112 | CONFIG_PID_NS=y |
| 113 | CONFIG_NET_NS=y | ||
| 103 | CONFIG_BLK_DEV_INITRD=y | 114 | CONFIG_BLK_DEV_INITRD=y |
| 104 | CONFIG_INITRAMFS_SOURCE="" | 115 | CONFIG_INITRAMFS_SOURCE="" |
| 105 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 116 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
| @@ -124,12 +135,15 @@ CONFIG_SIGNALFD=y | |||
| 124 | CONFIG_TIMERFD=y | 135 | CONFIG_TIMERFD=y |
| 125 | CONFIG_EVENTFD=y | 136 | CONFIG_EVENTFD=y |
| 126 | CONFIG_SHMEM=y | 137 | CONFIG_SHMEM=y |
| 138 | CONFIG_AIO=y | ||
| 127 | CONFIG_VM_EVENT_COUNTERS=y | 139 | CONFIG_VM_EVENT_COUNTERS=y |
| 140 | CONFIG_PCI_QUIRKS=y | ||
| 128 | CONFIG_SLUB_DEBUG=y | 141 | CONFIG_SLUB_DEBUG=y |
| 129 | # CONFIG_SLAB is not set | 142 | # CONFIG_SLAB is not set |
| 130 | CONFIG_SLUB=y | 143 | CONFIG_SLUB=y |
| 131 | # CONFIG_SLOB is not set | 144 | # CONFIG_SLOB is not set |
| 132 | CONFIG_PROFILING=y | 145 | CONFIG_PROFILING=y |
| 146 | CONFIG_TRACEPOINTS=y | ||
| 133 | CONFIG_MARKERS=y | 147 | CONFIG_MARKERS=y |
| 134 | # CONFIG_OPROFILE is not set | 148 | # CONFIG_OPROFILE is not set |
| 135 | CONFIG_HAVE_OPROFILE=y | 149 | CONFIG_HAVE_OPROFILE=y |
| @@ -139,15 +153,10 @@ CONFIG_KRETPROBES=y | |||
| 139 | CONFIG_HAVE_IOREMAP_PROT=y | 153 | CONFIG_HAVE_IOREMAP_PROT=y |
| 140 | CONFIG_HAVE_KPROBES=y | 154 | CONFIG_HAVE_KPROBES=y |
| 141 | CONFIG_HAVE_KRETPROBES=y | 155 | CONFIG_HAVE_KRETPROBES=y |
| 142 | # CONFIG_HAVE_ARCH_TRACEHOOK is not set | 156 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
| 143 | # CONFIG_HAVE_DMA_ATTRS is not set | ||
| 144 | CONFIG_USE_GENERIC_SMP_HELPERS=y | ||
| 145 | # CONFIG_HAVE_CLK is not set | ||
| 146 | CONFIG_PROC_PAGE_MONITOR=y | ||
| 147 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | 157 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y |
| 148 | CONFIG_SLABINFO=y | 158 | CONFIG_SLABINFO=y |
| 149 | CONFIG_RT_MUTEXES=y | 159 | CONFIG_RT_MUTEXES=y |
| 150 | # CONFIG_TINY_SHMEM is not set | ||
| 151 | CONFIG_BASE_SMALL=0 | 160 | CONFIG_BASE_SMALL=0 |
| 152 | CONFIG_MODULES=y | 161 | CONFIG_MODULES=y |
| 153 | # CONFIG_MODULE_FORCE_LOAD is not set | 162 | # CONFIG_MODULE_FORCE_LOAD is not set |
| @@ -155,12 +164,10 @@ CONFIG_MODULE_UNLOAD=y | |||
| 155 | CONFIG_MODULE_FORCE_UNLOAD=y | 164 | CONFIG_MODULE_FORCE_UNLOAD=y |
| 156 | # CONFIG_MODVERSIONS is not set | 165 | # CONFIG_MODVERSIONS is not set |
| 157 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 166 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
| 158 | CONFIG_KMOD=y | ||
| 159 | CONFIG_STOP_MACHINE=y | 167 | CONFIG_STOP_MACHINE=y |
| 160 | CONFIG_BLOCK=y | 168 | CONFIG_BLOCK=y |
| 161 | # CONFIG_LBD is not set | 169 | # CONFIG_LBD is not set |
| 162 | CONFIG_BLK_DEV_IO_TRACE=y | 170 | CONFIG_BLK_DEV_IO_TRACE=y |
| 163 | # CONFIG_LSF is not set | ||
| 164 | CONFIG_BLK_DEV_BSG=y | 171 | CONFIG_BLK_DEV_BSG=y |
| 165 | # CONFIG_BLK_DEV_INTEGRITY is not set | 172 | # CONFIG_BLK_DEV_INTEGRITY is not set |
| 166 | 173 | ||
| @@ -176,7 +183,7 @@ CONFIG_IOSCHED_CFQ=y | |||
| 176 | CONFIG_DEFAULT_CFQ=y | 183 | CONFIG_DEFAULT_CFQ=y |
| 177 | # CONFIG_DEFAULT_NOOP is not set | 184 | # CONFIG_DEFAULT_NOOP is not set |
| 178 | CONFIG_DEFAULT_IOSCHED="cfq" | 185 | CONFIG_DEFAULT_IOSCHED="cfq" |
| 179 | CONFIG_CLASSIC_RCU=y | 186 | CONFIG_FREEZER=y |
| 180 | 187 | ||
| 181 | # | 188 | # |
| 182 | # Processor type and features | 189 | # Processor type and features |
| @@ -186,15 +193,15 @@ CONFIG_NO_HZ=y | |||
| 186 | CONFIG_HIGH_RES_TIMERS=y | 193 | CONFIG_HIGH_RES_TIMERS=y |
| 187 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | 194 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y |
| 188 | CONFIG_SMP=y | 195 | CONFIG_SMP=y |
| 196 | CONFIG_SPARSE_IRQ=y | ||
| 189 | CONFIG_X86_FIND_SMP_CONFIG=y | 197 | CONFIG_X86_FIND_SMP_CONFIG=y |
| 190 | CONFIG_X86_MPPARSE=y | 198 | CONFIG_X86_MPPARSE=y |
| 191 | CONFIG_X86_PC=y | ||
| 192 | # CONFIG_X86_ELAN is not set | 199 | # CONFIG_X86_ELAN is not set |
| 193 | # CONFIG_X86_VOYAGER is not set | 200 | # CONFIG_X86_VOYAGER is not set |
| 194 | # CONFIG_X86_GENERICARCH is not set | 201 | # CONFIG_X86_GENERICARCH is not set |
| 195 | # CONFIG_X86_VSMP is not set | 202 | # CONFIG_X86_VSMP is not set |
| 196 | # CONFIG_X86_RDC321X is not set | 203 | # CONFIG_X86_RDC321X is not set |
| 197 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | 204 | CONFIG_SCHED_OMIT_FRAME_POINTER=y |
| 198 | # CONFIG_PARAVIRT_GUEST is not set | 205 | # CONFIG_PARAVIRT_GUEST is not set |
| 199 | # CONFIG_MEMTEST is not set | 206 | # CONFIG_MEMTEST is not set |
| 200 | # CONFIG_M386 is not set | 207 | # CONFIG_M386 is not set |
| @@ -238,10 +245,19 @@ CONFIG_X86_TSC=y | |||
| 238 | CONFIG_X86_CMOV=y | 245 | CONFIG_X86_CMOV=y |
| 239 | CONFIG_X86_MINIMUM_CPU_FAMILY=4 | 246 | CONFIG_X86_MINIMUM_CPU_FAMILY=4 |
| 240 | CONFIG_X86_DEBUGCTLMSR=y | 247 | CONFIG_X86_DEBUGCTLMSR=y |
| 248 | CONFIG_CPU_SUP_INTEL=y | ||
| 249 | CONFIG_CPU_SUP_CYRIX_32=y | ||
| 250 | CONFIG_CPU_SUP_AMD=y | ||
| 251 | CONFIG_CPU_SUP_CENTAUR_32=y | ||
| 252 | CONFIG_CPU_SUP_TRANSMETA_32=y | ||
| 253 | CONFIG_CPU_SUP_UMC_32=y | ||
| 254 | CONFIG_X86_DS=y | ||
| 255 | CONFIG_X86_PTRACE_BTS=y | ||
| 241 | CONFIG_HPET_TIMER=y | 256 | CONFIG_HPET_TIMER=y |
| 242 | CONFIG_HPET_EMULATE_RTC=y | 257 | CONFIG_HPET_EMULATE_RTC=y |
| 243 | CONFIG_DMI=y | 258 | CONFIG_DMI=y |
| 244 | # CONFIG_IOMMU_HELPER is not set | 259 | # CONFIG_IOMMU_HELPER is not set |
| 260 | # CONFIG_IOMMU_API is not set | ||
| 245 | CONFIG_NR_CPUS=64 | 261 | CONFIG_NR_CPUS=64 |
| 246 | CONFIG_SCHED_SMT=y | 262 | CONFIG_SCHED_SMT=y |
| 247 | CONFIG_SCHED_MC=y | 263 | CONFIG_SCHED_MC=y |
| @@ -250,12 +266,15 @@ CONFIG_PREEMPT_VOLUNTARY=y | |||
| 250 | # CONFIG_PREEMPT is not set | 266 | # CONFIG_PREEMPT is not set |
| 251 | CONFIG_X86_LOCAL_APIC=y | 267 | CONFIG_X86_LOCAL_APIC=y |
| 252 | CONFIG_X86_IO_APIC=y | 268 | CONFIG_X86_IO_APIC=y |
| 269 | CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y | ||
| 253 | # CONFIG_X86_MCE is not set | 270 | # CONFIG_X86_MCE is not set |
| 254 | CONFIG_VM86=y | 271 | CONFIG_VM86=y |
| 255 | # CONFIG_TOSHIBA is not set | 272 | # CONFIG_TOSHIBA is not set |
| 256 | # CONFIG_I8K is not set | 273 | # CONFIG_I8K is not set |
| 257 | CONFIG_X86_REBOOTFIXUPS=y | 274 | CONFIG_X86_REBOOTFIXUPS=y |
| 258 | CONFIG_MICROCODE=y | 275 | CONFIG_MICROCODE=y |
| 276 | CONFIG_MICROCODE_INTEL=y | ||
| 277 | CONFIG_MICROCODE_AMD=y | ||
| 259 | CONFIG_MICROCODE_OLD_INTERFACE=y | 278 | CONFIG_MICROCODE_OLD_INTERFACE=y |
| 260 | CONFIG_X86_MSR=y | 279 | CONFIG_X86_MSR=y |
| 261 | CONFIG_X86_CPUID=y | 280 | CONFIG_X86_CPUID=y |
| @@ -264,6 +283,7 @@ CONFIG_HIGHMEM4G=y | |||
| 264 | # CONFIG_HIGHMEM64G is not set | 283 | # CONFIG_HIGHMEM64G is not set |
| 265 | CONFIG_PAGE_OFFSET=0xC0000000 | 284 | CONFIG_PAGE_OFFSET=0xC0000000 |
| 266 | CONFIG_HIGHMEM=y | 285 | CONFIG_HIGHMEM=y |
| 286 | # CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set | ||
| 267 | CONFIG_ARCH_FLATMEM_ENABLE=y | 287 | CONFIG_ARCH_FLATMEM_ENABLE=y |
| 268 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | 288 | CONFIG_ARCH_SPARSEMEM_ENABLE=y |
| 269 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | 289 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y |
| @@ -274,14 +294,17 @@ CONFIG_FLATMEM_MANUAL=y | |||
| 274 | CONFIG_FLATMEM=y | 294 | CONFIG_FLATMEM=y |
| 275 | CONFIG_FLAT_NODE_MEM_MAP=y | 295 | CONFIG_FLAT_NODE_MEM_MAP=y |
| 276 | CONFIG_SPARSEMEM_STATIC=y | 296 | CONFIG_SPARSEMEM_STATIC=y |
| 277 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
| 278 | CONFIG_PAGEFLAGS_EXTENDED=y | 297 | CONFIG_PAGEFLAGS_EXTENDED=y |
| 279 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 298 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
| 280 | CONFIG_RESOURCES_64BIT=y | 299 | # CONFIG_PHYS_ADDR_T_64BIT is not set |
| 281 | CONFIG_ZONE_DMA_FLAG=1 | 300 | CONFIG_ZONE_DMA_FLAG=1 |
| 282 | CONFIG_BOUNCE=y | 301 | CONFIG_BOUNCE=y |
| 283 | CONFIG_VIRT_TO_BUS=y | 302 | CONFIG_VIRT_TO_BUS=y |
| 303 | CONFIG_UNEVICTABLE_LRU=y | ||
| 284 | CONFIG_HIGHPTE=y | 304 | CONFIG_HIGHPTE=y |
| 305 | CONFIG_X86_CHECK_BIOS_CORRUPTION=y | ||
| 306 | CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y | ||
| 307 | CONFIG_X86_RESERVE_LOW_64K=y | ||
| 285 | # CONFIG_MATH_EMULATION is not set | 308 | # CONFIG_MATH_EMULATION is not set |
| 286 | CONFIG_MTRR=y | 309 | CONFIG_MTRR=y |
| 287 | # CONFIG_MTRR_SANITIZER is not set | 310 | # CONFIG_MTRR_SANITIZER is not set |
| @@ -302,10 +325,11 @@ CONFIG_PHYSICAL_START=0x1000000 | |||
| 302 | CONFIG_PHYSICAL_ALIGN=0x200000 | 325 | CONFIG_PHYSICAL_ALIGN=0x200000 |
| 303 | CONFIG_HOTPLUG_CPU=y | 326 | CONFIG_HOTPLUG_CPU=y |
| 304 | # CONFIG_COMPAT_VDSO is not set | 327 | # CONFIG_COMPAT_VDSO is not set |
| 328 | # CONFIG_CMDLINE_BOOL is not set | ||
| 305 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | 329 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y |
| 306 | 330 | ||
| 307 | # | 331 | # |
| 308 | # Power management options | 332 | # Power management and ACPI options |
| 309 | # | 333 | # |
| 310 | CONFIG_PM=y | 334 | CONFIG_PM=y |
| 311 | CONFIG_PM_DEBUG=y | 335 | CONFIG_PM_DEBUG=y |
| @@ -331,19 +355,13 @@ CONFIG_ACPI_BATTERY=y | |||
| 331 | CONFIG_ACPI_BUTTON=y | 355 | CONFIG_ACPI_BUTTON=y |
| 332 | CONFIG_ACPI_FAN=y | 356 | CONFIG_ACPI_FAN=y |
| 333 | CONFIG_ACPI_DOCK=y | 357 | CONFIG_ACPI_DOCK=y |
| 334 | # CONFIG_ACPI_BAY is not set | ||
| 335 | CONFIG_ACPI_PROCESSOR=y | 358 | CONFIG_ACPI_PROCESSOR=y |
| 336 | CONFIG_ACPI_HOTPLUG_CPU=y | 359 | CONFIG_ACPI_HOTPLUG_CPU=y |
| 337 | CONFIG_ACPI_THERMAL=y | 360 | CONFIG_ACPI_THERMAL=y |
| 338 | # CONFIG_ACPI_WMI is not set | ||
| 339 | # CONFIG_ACPI_ASUS is not set | ||
| 340 | # CONFIG_ACPI_TOSHIBA is not set | ||
| 341 | # CONFIG_ACPI_CUSTOM_DSDT is not set | 361 | # CONFIG_ACPI_CUSTOM_DSDT is not set |
| 342 | CONFIG_ACPI_BLACKLIST_YEAR=0 | 362 | CONFIG_ACPI_BLACKLIST_YEAR=0 |
| 343 | # CONFIG_ACPI_DEBUG is not set | 363 | # CONFIG_ACPI_DEBUG is not set |
| 344 | CONFIG_ACPI_EC=y | ||
| 345 | # CONFIG_ACPI_PCI_SLOT is not set | 364 | # CONFIG_ACPI_PCI_SLOT is not set |
| 346 | CONFIG_ACPI_POWER=y | ||
| 347 | CONFIG_ACPI_SYSTEM=y | 365 | CONFIG_ACPI_SYSTEM=y |
| 348 | CONFIG_X86_PM_TIMER=y | 366 | CONFIG_X86_PM_TIMER=y |
| 349 | CONFIG_ACPI_CONTAINER=y | 367 | CONFIG_ACPI_CONTAINER=y |
| @@ -388,7 +406,6 @@ CONFIG_X86_ACPI_CPUFREQ=y | |||
| 388 | # | 406 | # |
| 389 | # shared options | 407 | # shared options |
| 390 | # | 408 | # |
| 391 | # CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set | ||
| 392 | # CONFIG_X86_SPEEDSTEP_LIB is not set | 409 | # CONFIG_X86_SPEEDSTEP_LIB is not set |
| 393 | CONFIG_CPU_IDLE=y | 410 | CONFIG_CPU_IDLE=y |
| 394 | CONFIG_CPU_IDLE_GOV_LADDER=y | 411 | CONFIG_CPU_IDLE_GOV_LADDER=y |
| @@ -415,6 +432,7 @@ CONFIG_ARCH_SUPPORTS_MSI=y | |||
| 415 | CONFIG_PCI_MSI=y | 432 | CONFIG_PCI_MSI=y |
| 416 | # CONFIG_PCI_LEGACY is not set | 433 | # CONFIG_PCI_LEGACY is not set |
| 417 | # CONFIG_PCI_DEBUG is not set | 434 | # CONFIG_PCI_DEBUG is not set |
| 435 | # CONFIG_PCI_STUB is not set | ||
| 418 | CONFIG_HT_IRQ=y | 436 | CONFIG_HT_IRQ=y |
| 419 | CONFIG_ISA_DMA_API=y | 437 | CONFIG_ISA_DMA_API=y |
| 420 | # CONFIG_ISA is not set | 438 | # CONFIG_ISA is not set |
| @@ -452,13 +470,17 @@ CONFIG_HOTPLUG_PCI=y | |||
| 452 | # Executable file formats / Emulations | 470 | # Executable file formats / Emulations |
| 453 | # | 471 | # |
| 454 | CONFIG_BINFMT_ELF=y | 472 | CONFIG_BINFMT_ELF=y |
| 473 | CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y | ||
| 474 | CONFIG_HAVE_AOUT=y | ||
| 455 | # CONFIG_BINFMT_AOUT is not set | 475 | # CONFIG_BINFMT_AOUT is not set |
| 456 | CONFIG_BINFMT_MISC=y | 476 | CONFIG_BINFMT_MISC=y |
| 477 | CONFIG_HAVE_ATOMIC_IOMAP=y | ||
| 457 | CONFIG_NET=y | 478 | CONFIG_NET=y |
| 458 | 479 | ||
| 459 | # | 480 | # |
| 460 | # Networking options | 481 | # Networking options |
| 461 | # | 482 | # |
| 483 | CONFIG_COMPAT_NET_DEV_OPS=y | ||
| 462 | CONFIG_PACKET=y | 484 | CONFIG_PACKET=y |
| 463 | CONFIG_PACKET_MMAP=y | 485 | CONFIG_PACKET_MMAP=y |
| 464 | CONFIG_UNIX=y | 486 | CONFIG_UNIX=y |
| @@ -519,7 +541,6 @@ CONFIG_DEFAULT_CUBIC=y | |||
| 519 | # CONFIG_DEFAULT_RENO is not set | 541 | # CONFIG_DEFAULT_RENO is not set |
| 520 | CONFIG_DEFAULT_TCP_CONG="cubic" | 542 | CONFIG_DEFAULT_TCP_CONG="cubic" |
| 521 | CONFIG_TCP_MD5SIG=y | 543 | CONFIG_TCP_MD5SIG=y |
| 522 | # CONFIG_IP_VS is not set | ||
| 523 | CONFIG_IPV6=y | 544 | CONFIG_IPV6=y |
| 524 | # CONFIG_IPV6_PRIVACY is not set | 545 | # CONFIG_IPV6_PRIVACY is not set |
| 525 | # CONFIG_IPV6_ROUTER_PREF is not set | 546 | # CONFIG_IPV6_ROUTER_PREF is not set |
| @@ -557,19 +578,21 @@ CONFIG_NF_CONNTRACK_IRC=y | |||
| 557 | CONFIG_NF_CONNTRACK_SIP=y | 578 | CONFIG_NF_CONNTRACK_SIP=y |
| 558 | CONFIG_NF_CT_NETLINK=y | 579 | CONFIG_NF_CT_NETLINK=y |
| 559 | CONFIG_NETFILTER_XTABLES=y | 580 | CONFIG_NETFILTER_XTABLES=y |
| 581 | CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y | ||
| 560 | CONFIG_NETFILTER_XT_TARGET_MARK=y | 582 | CONFIG_NETFILTER_XT_TARGET_MARK=y |
| 561 | CONFIG_NETFILTER_XT_TARGET_NFLOG=y | 583 | CONFIG_NETFILTER_XT_TARGET_NFLOG=y |
| 562 | CONFIG_NETFILTER_XT_TARGET_SECMARK=y | 584 | CONFIG_NETFILTER_XT_TARGET_SECMARK=y |
| 563 | CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y | ||
| 564 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=y | 585 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=y |
| 565 | CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y | 586 | CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y |
| 566 | CONFIG_NETFILTER_XT_MATCH_MARK=y | 587 | CONFIG_NETFILTER_XT_MATCH_MARK=y |
| 567 | CONFIG_NETFILTER_XT_MATCH_POLICY=y | 588 | CONFIG_NETFILTER_XT_MATCH_POLICY=y |
| 568 | CONFIG_NETFILTER_XT_MATCH_STATE=y | 589 | CONFIG_NETFILTER_XT_MATCH_STATE=y |
| 590 | # CONFIG_IP_VS is not set | ||
| 569 | 591 | ||
| 570 | # | 592 | # |
| 571 | # IP: Netfilter Configuration | 593 | # IP: Netfilter Configuration |
| 572 | # | 594 | # |
| 595 | CONFIG_NF_DEFRAG_IPV4=y | ||
| 573 | CONFIG_NF_CONNTRACK_IPV4=y | 596 | CONFIG_NF_CONNTRACK_IPV4=y |
| 574 | CONFIG_NF_CONNTRACK_PROC_COMPAT=y | 597 | CONFIG_NF_CONNTRACK_PROC_COMPAT=y |
| 575 | CONFIG_IP_NF_IPTABLES=y | 598 | CONFIG_IP_NF_IPTABLES=y |
| @@ -595,8 +618,8 @@ CONFIG_IP_NF_MANGLE=y | |||
| 595 | CONFIG_NF_CONNTRACK_IPV6=y | 618 | CONFIG_NF_CONNTRACK_IPV6=y |
| 596 | CONFIG_IP6_NF_IPTABLES=y | 619 | CONFIG_IP6_NF_IPTABLES=y |
| 597 | CONFIG_IP6_NF_MATCH_IPV6HEADER=y | 620 | CONFIG_IP6_NF_MATCH_IPV6HEADER=y |
| 598 | CONFIG_IP6_NF_FILTER=y | ||
| 599 | CONFIG_IP6_NF_TARGET_LOG=y | 621 | CONFIG_IP6_NF_TARGET_LOG=y |
| 622 | CONFIG_IP6_NF_FILTER=y | ||
| 600 | CONFIG_IP6_NF_TARGET_REJECT=y | 623 | CONFIG_IP6_NF_TARGET_REJECT=y |
| 601 | CONFIG_IP6_NF_MANGLE=y | 624 | CONFIG_IP6_NF_MANGLE=y |
| 602 | # CONFIG_IP_DCCP is not set | 625 | # CONFIG_IP_DCCP is not set |
| @@ -604,6 +627,7 @@ CONFIG_IP6_NF_MANGLE=y | |||
| 604 | # CONFIG_TIPC is not set | 627 | # CONFIG_TIPC is not set |
| 605 | # CONFIG_ATM is not set | 628 | # CONFIG_ATM is not set |
| 606 | # CONFIG_BRIDGE is not set | 629 | # CONFIG_BRIDGE is not set |
| 630 | # CONFIG_NET_DSA is not set | ||
| 607 | # CONFIG_VLAN_8021Q is not set | 631 | # CONFIG_VLAN_8021Q is not set |
| 608 | # CONFIG_DECNET is not set | 632 | # CONFIG_DECNET is not set |
| 609 | CONFIG_LLC=y | 633 | CONFIG_LLC=y |
| @@ -623,6 +647,7 @@ CONFIG_NET_SCHED=y | |||
| 623 | # CONFIG_NET_SCH_HTB is not set | 647 | # CONFIG_NET_SCH_HTB is not set |
| 624 | # CONFIG_NET_SCH_HFSC is not set | 648 | # CONFIG_NET_SCH_HFSC is not set |
| 625 | # CONFIG_NET_SCH_PRIO is not set | 649 | # CONFIG_NET_SCH_PRIO is not set |
| 650 | # CONFIG_NET_SCH_MULTIQ is not set | ||
| 626 | # CONFIG_NET_SCH_RED is not set | 651 | # CONFIG_NET_SCH_RED is not set |
| 627 | # CONFIG_NET_SCH_SFQ is not set | 652 | # CONFIG_NET_SCH_SFQ is not set |
| 628 | # CONFIG_NET_SCH_TEQL is not set | 653 | # CONFIG_NET_SCH_TEQL is not set |
| @@ -630,6 +655,7 @@ CONFIG_NET_SCHED=y | |||
| 630 | # CONFIG_NET_SCH_GRED is not set | 655 | # CONFIG_NET_SCH_GRED is not set |
| 631 | # CONFIG_NET_SCH_DSMARK is not set | 656 | # CONFIG_NET_SCH_DSMARK is not set |
| 632 | # CONFIG_NET_SCH_NETEM is not set | 657 | # CONFIG_NET_SCH_NETEM is not set |
| 658 | # CONFIG_NET_SCH_DRR is not set | ||
| 633 | # CONFIG_NET_SCH_INGRESS is not set | 659 | # CONFIG_NET_SCH_INGRESS is not set |
| 634 | 660 | ||
| 635 | # | 661 | # |
| @@ -644,6 +670,7 @@ CONFIG_NET_CLS=y | |||
| 644 | # CONFIG_NET_CLS_RSVP is not set | 670 | # CONFIG_NET_CLS_RSVP is not set |
| 645 | # CONFIG_NET_CLS_RSVP6 is not set | 671 | # CONFIG_NET_CLS_RSVP6 is not set |
| 646 | # CONFIG_NET_CLS_FLOW is not set | 672 | # CONFIG_NET_CLS_FLOW is not set |
| 673 | # CONFIG_NET_CLS_CGROUP is not set | ||
| 647 | CONFIG_NET_EMATCH=y | 674 | CONFIG_NET_EMATCH=y |
| 648 | CONFIG_NET_EMATCH_STACK=32 | 675 | CONFIG_NET_EMATCH_STACK=32 |
| 649 | # CONFIG_NET_EMATCH_CMP is not set | 676 | # CONFIG_NET_EMATCH_CMP is not set |
| @@ -659,7 +686,9 @@ CONFIG_NET_CLS_ACT=y | |||
| 659 | # CONFIG_NET_ACT_NAT is not set | 686 | # CONFIG_NET_ACT_NAT is not set |
| 660 | # CONFIG_NET_ACT_PEDIT is not set | 687 | # CONFIG_NET_ACT_PEDIT is not set |
| 661 | # CONFIG_NET_ACT_SIMP is not set | 688 | # CONFIG_NET_ACT_SIMP is not set |
| 689 | # CONFIG_NET_ACT_SKBEDIT is not set | ||
| 662 | CONFIG_NET_SCH_FIFO=y | 690 | CONFIG_NET_SCH_FIFO=y |
| 691 | # CONFIG_DCB is not set | ||
| 663 | 692 | ||
| 664 | # | 693 | # |
| 665 | # Network testing | 694 | # Network testing |
| @@ -676,29 +705,33 @@ CONFIG_HAMRADIO=y | |||
| 676 | # CONFIG_IRDA is not set | 705 | # CONFIG_IRDA is not set |
| 677 | # CONFIG_BT is not set | 706 | # CONFIG_BT is not set |
| 678 | # CONFIG_AF_RXRPC is not set | 707 | # CONFIG_AF_RXRPC is not set |
| 708 | # CONFIG_PHONET is not set | ||
| 679 | CONFIG_FIB_RULES=y | 709 | CONFIG_FIB_RULES=y |
| 680 | 710 | CONFIG_WIRELESS=y | |
| 681 | # | ||
| 682 | # Wireless | ||
| 683 | # | ||
| 684 | CONFIG_CFG80211=y | 711 | CONFIG_CFG80211=y |
| 712 | # CONFIG_CFG80211_REG_DEBUG is not set | ||
| 685 | CONFIG_NL80211=y | 713 | CONFIG_NL80211=y |
| 714 | CONFIG_WIRELESS_OLD_REGULATORY=y | ||
| 686 | CONFIG_WIRELESS_EXT=y | 715 | CONFIG_WIRELESS_EXT=y |
| 687 | CONFIG_WIRELESS_EXT_SYSFS=y | 716 | CONFIG_WIRELESS_EXT_SYSFS=y |
| 717 | # CONFIG_LIB80211 is not set | ||
| 688 | CONFIG_MAC80211=y | 718 | CONFIG_MAC80211=y |
| 689 | 719 | ||
| 690 | # | 720 | # |
| 691 | # Rate control algorithm selection | 721 | # Rate control algorithm selection |
| 692 | # | 722 | # |
| 693 | CONFIG_MAC80211_RC_PID=y | 723 | CONFIG_MAC80211_RC_MINSTREL=y |
| 694 | CONFIG_MAC80211_RC_DEFAULT_PID=y | 724 | # CONFIG_MAC80211_RC_DEFAULT_PID is not set |
| 695 | CONFIG_MAC80211_RC_DEFAULT="pid" | 725 | CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y |
| 726 | CONFIG_MAC80211_RC_DEFAULT="minstrel" | ||
| 696 | # CONFIG_MAC80211_MESH is not set | 727 | # CONFIG_MAC80211_MESH is not set |
| 697 | CONFIG_MAC80211_LEDS=y | 728 | CONFIG_MAC80211_LEDS=y |
| 698 | # CONFIG_MAC80211_DEBUGFS is not set | 729 | # CONFIG_MAC80211_DEBUGFS is not set |
| 699 | # CONFIG_MAC80211_DEBUG_MENU is not set | 730 | # CONFIG_MAC80211_DEBUG_MENU is not set |
| 700 | # CONFIG_IEEE80211 is not set | 731 | # CONFIG_WIMAX is not set |
| 701 | # CONFIG_RFKILL is not set | 732 | CONFIG_RFKILL=y |
| 733 | # CONFIG_RFKILL_INPUT is not set | ||
| 734 | CONFIG_RFKILL_LEDS=y | ||
| 702 | # CONFIG_NET_9P is not set | 735 | # CONFIG_NET_9P is not set |
| 703 | 736 | ||
| 704 | # | 737 | # |
| @@ -722,7 +755,7 @@ CONFIG_PROC_EVENTS=y | |||
| 722 | # CONFIG_MTD is not set | 755 | # CONFIG_MTD is not set |
| 723 | # CONFIG_PARPORT is not set | 756 | # CONFIG_PARPORT is not set |
| 724 | CONFIG_PNP=y | 757 | CONFIG_PNP=y |
| 725 | # CONFIG_PNP_DEBUG is not set | 758 | CONFIG_PNP_DEBUG_MESSAGES=y |
| 726 | 759 | ||
| 727 | # | 760 | # |
| 728 | # Protocols | 761 | # Protocols |
| @@ -750,20 +783,19 @@ CONFIG_BLK_DEV_RAM_SIZE=16384 | |||
| 750 | CONFIG_MISC_DEVICES=y | 783 | CONFIG_MISC_DEVICES=y |
| 751 | # CONFIG_IBM_ASM is not set | 784 | # CONFIG_IBM_ASM is not set |
| 752 | # CONFIG_PHANTOM is not set | 785 | # CONFIG_PHANTOM is not set |
| 753 | # CONFIG_EEPROM_93CX6 is not set | ||
| 754 | # CONFIG_SGI_IOC4 is not set | 786 | # CONFIG_SGI_IOC4 is not set |
| 755 | # CONFIG_TIFM_CORE is not set | 787 | # CONFIG_TIFM_CORE is not set |
| 756 | # CONFIG_ACER_WMI is not set | 788 | # CONFIG_ICS932S401 is not set |
| 757 | # CONFIG_ASUS_LAPTOP is not set | ||
| 758 | # CONFIG_FUJITSU_LAPTOP is not set | ||
| 759 | # CONFIG_TC1100_WMI is not set | ||
| 760 | # CONFIG_MSI_LAPTOP is not set | ||
| 761 | # CONFIG_COMPAL_LAPTOP is not set | ||
| 762 | # CONFIG_SONY_LAPTOP is not set | ||
| 763 | # CONFIG_THINKPAD_ACPI is not set | ||
| 764 | # CONFIG_INTEL_MENLOW is not set | ||
| 765 | # CONFIG_ENCLOSURE_SERVICES is not set | 789 | # CONFIG_ENCLOSURE_SERVICES is not set |
| 766 | # CONFIG_HP_ILO is not set | 790 | # CONFIG_HP_ILO is not set |
| 791 | # CONFIG_C2PORT is not set | ||
| 792 | |||
| 793 | # | ||
| 794 | # EEPROM support | ||
| 795 | # | ||
| 796 | # CONFIG_EEPROM_AT24 is not set | ||
| 797 | # CONFIG_EEPROM_LEGACY is not set | ||
| 798 | # CONFIG_EEPROM_93CX6 is not set | ||
| 767 | CONFIG_HAVE_IDE=y | 799 | CONFIG_HAVE_IDE=y |
| 768 | # CONFIG_IDE is not set | 800 | # CONFIG_IDE is not set |
| 769 | 801 | ||
| @@ -802,7 +834,7 @@ CONFIG_SCSI_WAIT_SCAN=m | |||
| 802 | # | 834 | # |
| 803 | CONFIG_SCSI_SPI_ATTRS=y | 835 | CONFIG_SCSI_SPI_ATTRS=y |
| 804 | # CONFIG_SCSI_FC_ATTRS is not set | 836 | # CONFIG_SCSI_FC_ATTRS is not set |
| 805 | CONFIG_SCSI_ISCSI_ATTRS=y | 837 | # CONFIG_SCSI_ISCSI_ATTRS is not set |
| 806 | # CONFIG_SCSI_SAS_ATTRS is not set | 838 | # CONFIG_SCSI_SAS_ATTRS is not set |
| 807 | # CONFIG_SCSI_SAS_LIBSAS is not set | 839 | # CONFIG_SCSI_SAS_LIBSAS is not set |
| 808 | # CONFIG_SCSI_SRP_ATTRS is not set | 840 | # CONFIG_SCSI_SRP_ATTRS is not set |
| @@ -875,6 +907,7 @@ CONFIG_PATA_OLDPIIX=y | |||
| 875 | CONFIG_PATA_SCH=y | 907 | CONFIG_PATA_SCH=y |
| 876 | CONFIG_MD=y | 908 | CONFIG_MD=y |
| 877 | CONFIG_BLK_DEV_MD=y | 909 | CONFIG_BLK_DEV_MD=y |
| 910 | CONFIG_MD_AUTODETECT=y | ||
| 878 | # CONFIG_MD_LINEAR is not set | 911 | # CONFIG_MD_LINEAR is not set |
| 879 | # CONFIG_MD_RAID0 is not set | 912 | # CONFIG_MD_RAID0 is not set |
| 880 | # CONFIG_MD_RAID1 is not set | 913 | # CONFIG_MD_RAID1 is not set |
| @@ -930,6 +963,9 @@ CONFIG_PHYLIB=y | |||
| 930 | # CONFIG_BROADCOM_PHY is not set | 963 | # CONFIG_BROADCOM_PHY is not set |
| 931 | # CONFIG_ICPLUS_PHY is not set | 964 | # CONFIG_ICPLUS_PHY is not set |
| 932 | # CONFIG_REALTEK_PHY is not set | 965 | # CONFIG_REALTEK_PHY is not set |
| 966 | # CONFIG_NATIONAL_PHY is not set | ||
| 967 | # CONFIG_STE10XP is not set | ||
| 968 | # CONFIG_LSI_ET1011C_PHY is not set | ||
| 933 | # CONFIG_FIXED_PHY is not set | 969 | # CONFIG_FIXED_PHY is not set |
| 934 | # CONFIG_MDIO_BITBANG is not set | 970 | # CONFIG_MDIO_BITBANG is not set |
| 935 | CONFIG_NET_ETHERNET=y | 971 | CONFIG_NET_ETHERNET=y |
| @@ -953,6 +989,9 @@ CONFIG_NET_TULIP=y | |||
| 953 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | 989 | # CONFIG_IBM_NEW_EMAC_RGMII is not set |
| 954 | # CONFIG_IBM_NEW_EMAC_TAH is not set | 990 | # CONFIG_IBM_NEW_EMAC_TAH is not set |
| 955 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | 991 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set |
| 992 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
| 993 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
| 994 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
| 956 | CONFIG_NET_PCI=y | 995 | CONFIG_NET_PCI=y |
| 957 | # CONFIG_PCNET32 is not set | 996 | # CONFIG_PCNET32 is not set |
| 958 | # CONFIG_AMD8111_ETH is not set | 997 | # CONFIG_AMD8111_ETH is not set |
| @@ -960,7 +999,6 @@ CONFIG_NET_PCI=y | |||
| 960 | # CONFIG_B44 is not set | 999 | # CONFIG_B44 is not set |
| 961 | CONFIG_FORCEDETH=y | 1000 | CONFIG_FORCEDETH=y |
| 962 | # CONFIG_FORCEDETH_NAPI is not set | 1001 | # CONFIG_FORCEDETH_NAPI is not set |
| 963 | # CONFIG_EEPRO100 is not set | ||
| 964 | CONFIG_E100=y | 1002 | CONFIG_E100=y |
| 965 | # CONFIG_FEALNX is not set | 1003 | # CONFIG_FEALNX is not set |
| 966 | # CONFIG_NATSEMI is not set | 1004 | # CONFIG_NATSEMI is not set |
| @@ -974,15 +1012,16 @@ CONFIG_8139TOO=y | |||
| 974 | # CONFIG_R6040 is not set | 1012 | # CONFIG_R6040 is not set |
| 975 | # CONFIG_SIS900 is not set | 1013 | # CONFIG_SIS900 is not set |
| 976 | # CONFIG_EPIC100 is not set | 1014 | # CONFIG_EPIC100 is not set |
| 1015 | # CONFIG_SMSC9420 is not set | ||
| 977 | # CONFIG_SUNDANCE is not set | 1016 | # CONFIG_SUNDANCE is not set |
| 978 | # CONFIG_TLAN is not set | 1017 | # CONFIG_TLAN is not set |
| 979 | # CONFIG_VIA_RHINE is not set | 1018 | # CONFIG_VIA_RHINE is not set |
| 980 | # CONFIG_SC92031 is not set | 1019 | # CONFIG_SC92031 is not set |
| 1020 | # CONFIG_ATL2 is not set | ||
| 981 | CONFIG_NETDEV_1000=y | 1021 | CONFIG_NETDEV_1000=y |
| 982 | # CONFIG_ACENIC is not set | 1022 | # CONFIG_ACENIC is not set |
| 983 | # CONFIG_DL2K is not set | 1023 | # CONFIG_DL2K is not set |
| 984 | CONFIG_E1000=y | 1024 | CONFIG_E1000=y |
| 985 | # CONFIG_E1000_DISABLE_PACKET_SPLIT is not set | ||
| 986 | CONFIG_E1000E=y | 1025 | CONFIG_E1000E=y |
| 987 | # CONFIG_IP1000 is not set | 1026 | # CONFIG_IP1000 is not set |
| 988 | # CONFIG_IGB is not set | 1027 | # CONFIG_IGB is not set |
| @@ -1000,18 +1039,23 @@ CONFIG_BNX2=y | |||
| 1000 | # CONFIG_QLA3XXX is not set | 1039 | # CONFIG_QLA3XXX is not set |
| 1001 | # CONFIG_ATL1 is not set | 1040 | # CONFIG_ATL1 is not set |
| 1002 | # CONFIG_ATL1E is not set | 1041 | # CONFIG_ATL1E is not set |
| 1042 | # CONFIG_JME is not set | ||
| 1003 | CONFIG_NETDEV_10000=y | 1043 | CONFIG_NETDEV_10000=y |
| 1004 | # CONFIG_CHELSIO_T1 is not set | 1044 | # CONFIG_CHELSIO_T1 is not set |
| 1045 | CONFIG_CHELSIO_T3_DEPENDS=y | ||
| 1005 | # CONFIG_CHELSIO_T3 is not set | 1046 | # CONFIG_CHELSIO_T3 is not set |
| 1047 | # CONFIG_ENIC is not set | ||
| 1006 | # CONFIG_IXGBE is not set | 1048 | # CONFIG_IXGBE is not set |
| 1007 | # CONFIG_IXGB is not set | 1049 | # CONFIG_IXGB is not set |
| 1008 | # CONFIG_S2IO is not set | 1050 | # CONFIG_S2IO is not set |
| 1009 | # CONFIG_MYRI10GE is not set | 1051 | # CONFIG_MYRI10GE is not set |
| 1010 | # CONFIG_NETXEN_NIC is not set | 1052 | # CONFIG_NETXEN_NIC is not set |
| 1011 | # CONFIG_NIU is not set | 1053 | # CONFIG_NIU is not set |
| 1054 | # CONFIG_MLX4_EN is not set | ||
| 1012 | # CONFIG_MLX4_CORE is not set | 1055 | # CONFIG_MLX4_CORE is not set |
| 1013 | # CONFIG_TEHUTI is not set | 1056 | # CONFIG_TEHUTI is not set |
| 1014 | # CONFIG_BNX2X is not set | 1057 | # CONFIG_BNX2X is not set |
| 1058 | # CONFIG_QLGE is not set | ||
| 1015 | # CONFIG_SFC is not set | 1059 | # CONFIG_SFC is not set |
| 1016 | CONFIG_TR=y | 1060 | CONFIG_TR=y |
| 1017 | # CONFIG_IBMOL is not set | 1061 | # CONFIG_IBMOL is not set |
| @@ -1025,9 +1069,8 @@ CONFIG_TR=y | |||
| 1025 | # CONFIG_WLAN_PRE80211 is not set | 1069 | # CONFIG_WLAN_PRE80211 is not set |
| 1026 | CONFIG_WLAN_80211=y | 1070 | CONFIG_WLAN_80211=y |
| 1027 | # CONFIG_PCMCIA_RAYCS is not set | 1071 | # CONFIG_PCMCIA_RAYCS is not set |
| 1028 | # CONFIG_IPW2100 is not set | ||
| 1029 | # CONFIG_IPW2200 is not set | ||
| 1030 | # CONFIG_LIBERTAS is not set | 1072 | # CONFIG_LIBERTAS is not set |
| 1073 | # CONFIG_LIBERTAS_THINFIRM is not set | ||
| 1031 | # CONFIG_AIRO is not set | 1074 | # CONFIG_AIRO is not set |
| 1032 | # CONFIG_HERMES is not set | 1075 | # CONFIG_HERMES is not set |
| 1033 | # CONFIG_ATMEL is not set | 1076 | # CONFIG_ATMEL is not set |
| @@ -1044,6 +1087,8 @@ CONFIG_WLAN_80211=y | |||
| 1044 | CONFIG_ATH5K=y | 1087 | CONFIG_ATH5K=y |
| 1045 | # CONFIG_ATH5K_DEBUG is not set | 1088 | # CONFIG_ATH5K_DEBUG is not set |
| 1046 | # CONFIG_ATH9K is not set | 1089 | # CONFIG_ATH9K is not set |
| 1090 | # CONFIG_IPW2100 is not set | ||
| 1091 | # CONFIG_IPW2200 is not set | ||
| 1047 | # CONFIG_IWLCORE is not set | 1092 | # CONFIG_IWLCORE is not set |
| 1048 | # CONFIG_IWLWIFI_LEDS is not set | 1093 | # CONFIG_IWLWIFI_LEDS is not set |
| 1049 | # CONFIG_IWLAGN is not set | 1094 | # CONFIG_IWLAGN is not set |
| @@ -1055,6 +1100,10 @@ CONFIG_ATH5K=y | |||
| 1055 | # CONFIG_RT2X00 is not set | 1100 | # CONFIG_RT2X00 is not set |
| 1056 | 1101 | ||
| 1057 | # | 1102 | # |
| 1103 | # Enable WiMAX (Networking options) to see the WiMAX drivers | ||
| 1104 | # | ||
| 1105 | |||
| 1106 | # | ||
| 1058 | # USB Network Adapters | 1107 | # USB Network Adapters |
| 1059 | # | 1108 | # |
| 1060 | # CONFIG_USB_CATC is not set | 1109 | # CONFIG_USB_CATC is not set |
| @@ -1062,6 +1111,7 @@ CONFIG_ATH5K=y | |||
| 1062 | # CONFIG_USB_PEGASUS is not set | 1111 | # CONFIG_USB_PEGASUS is not set |
| 1063 | # CONFIG_USB_RTL8150 is not set | 1112 | # CONFIG_USB_RTL8150 is not set |
| 1064 | # CONFIG_USB_USBNET is not set | 1113 | # CONFIG_USB_USBNET is not set |
| 1114 | # CONFIG_USB_HSO is not set | ||
| 1065 | CONFIG_NET_PCMCIA=y | 1115 | CONFIG_NET_PCMCIA=y |
| 1066 | # CONFIG_PCMCIA_3C589 is not set | 1116 | # CONFIG_PCMCIA_3C589 is not set |
| 1067 | # CONFIG_PCMCIA_3C574 is not set | 1117 | # CONFIG_PCMCIA_3C574 is not set |
| @@ -1123,6 +1173,7 @@ CONFIG_MOUSE_PS2_LOGIPS2PP=y | |||
| 1123 | CONFIG_MOUSE_PS2_SYNAPTICS=y | 1173 | CONFIG_MOUSE_PS2_SYNAPTICS=y |
| 1124 | CONFIG_MOUSE_PS2_LIFEBOOK=y | 1174 | CONFIG_MOUSE_PS2_LIFEBOOK=y |
| 1125 | CONFIG_MOUSE_PS2_TRACKPOINT=y | 1175 | CONFIG_MOUSE_PS2_TRACKPOINT=y |
| 1176 | # CONFIG_MOUSE_PS2_ELANTECH is not set | ||
| 1126 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set | 1177 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set |
| 1127 | # CONFIG_MOUSE_SERIAL is not set | 1178 | # CONFIG_MOUSE_SERIAL is not set |
| 1128 | # CONFIG_MOUSE_APPLETOUCH is not set | 1179 | # CONFIG_MOUSE_APPLETOUCH is not set |
| @@ -1160,15 +1211,16 @@ CONFIG_INPUT_TOUCHSCREEN=y | |||
| 1160 | # CONFIG_TOUCHSCREEN_FUJITSU is not set | 1211 | # CONFIG_TOUCHSCREEN_FUJITSU is not set |
| 1161 | # CONFIG_TOUCHSCREEN_GUNZE is not set | 1212 | # CONFIG_TOUCHSCREEN_GUNZE is not set |
| 1162 | # CONFIG_TOUCHSCREEN_ELO is not set | 1213 | # CONFIG_TOUCHSCREEN_ELO is not set |
| 1214 | # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set | ||
| 1163 | # CONFIG_TOUCHSCREEN_MTOUCH is not set | 1215 | # CONFIG_TOUCHSCREEN_MTOUCH is not set |
| 1164 | # CONFIG_TOUCHSCREEN_INEXIO is not set | 1216 | # CONFIG_TOUCHSCREEN_INEXIO is not set |
| 1165 | # CONFIG_TOUCHSCREEN_MK712 is not set | 1217 | # CONFIG_TOUCHSCREEN_MK712 is not set |
| 1166 | # CONFIG_TOUCHSCREEN_PENMOUNT is not set | 1218 | # CONFIG_TOUCHSCREEN_PENMOUNT is not set |
| 1167 | # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set | 1219 | # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set |
| 1168 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set | 1220 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set |
| 1169 | # CONFIG_TOUCHSCREEN_UCB1400 is not set | ||
| 1170 | # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set | 1221 | # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set |
| 1171 | # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set | 1222 | # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set |
| 1223 | # CONFIG_TOUCHSCREEN_TSC2007 is not set | ||
| 1172 | CONFIG_INPUT_MISC=y | 1224 | CONFIG_INPUT_MISC=y |
| 1173 | # CONFIG_INPUT_PCSPKR is not set | 1225 | # CONFIG_INPUT_PCSPKR is not set |
| 1174 | # CONFIG_INPUT_APANEL is not set | 1226 | # CONFIG_INPUT_APANEL is not set |
| @@ -1179,6 +1231,7 @@ CONFIG_INPUT_MISC=y | |||
| 1179 | # CONFIG_INPUT_KEYSPAN_REMOTE is not set | 1231 | # CONFIG_INPUT_KEYSPAN_REMOTE is not set |
| 1180 | # CONFIG_INPUT_POWERMATE is not set | 1232 | # CONFIG_INPUT_POWERMATE is not set |
| 1181 | # CONFIG_INPUT_YEALINK is not set | 1233 | # CONFIG_INPUT_YEALINK is not set |
| 1234 | # CONFIG_INPUT_CM109 is not set | ||
| 1182 | # CONFIG_INPUT_UINPUT is not set | 1235 | # CONFIG_INPUT_UINPUT is not set |
| 1183 | 1236 | ||
| 1184 | # | 1237 | # |
| @@ -1245,6 +1298,7 @@ CONFIG_SERIAL_CORE=y | |||
| 1245 | CONFIG_SERIAL_CORE_CONSOLE=y | 1298 | CONFIG_SERIAL_CORE_CONSOLE=y |
| 1246 | # CONFIG_SERIAL_JSM is not set | 1299 | # CONFIG_SERIAL_JSM is not set |
| 1247 | CONFIG_UNIX98_PTYS=y | 1300 | CONFIG_UNIX98_PTYS=y |
| 1301 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set | ||
| 1248 | # CONFIG_LEGACY_PTYS is not set | 1302 | # CONFIG_LEGACY_PTYS is not set |
| 1249 | # CONFIG_IPMI_HANDLER is not set | 1303 | # CONFIG_IPMI_HANDLER is not set |
| 1250 | CONFIG_HW_RANDOM=y | 1304 | CONFIG_HW_RANDOM=y |
| @@ -1279,6 +1333,7 @@ CONFIG_I2C=y | |||
| 1279 | CONFIG_I2C_BOARDINFO=y | 1333 | CONFIG_I2C_BOARDINFO=y |
| 1280 | # CONFIG_I2C_CHARDEV is not set | 1334 | # CONFIG_I2C_CHARDEV is not set |
| 1281 | CONFIG_I2C_HELPER_AUTO=y | 1335 | CONFIG_I2C_HELPER_AUTO=y |
| 1336 | CONFIG_I2C_ALGOBIT=y | ||
| 1282 | 1337 | ||
| 1283 | # | 1338 | # |
| 1284 | # I2C Hardware Bus support | 1339 | # I2C Hardware Bus support |
| @@ -1331,8 +1386,6 @@ CONFIG_I2C_I801=y | |||
| 1331 | # Miscellaneous I2C Chip support | 1386 | # Miscellaneous I2C Chip support |
| 1332 | # | 1387 | # |
| 1333 | # CONFIG_DS1682 is not set | 1388 | # CONFIG_DS1682 is not set |
| 1334 | # CONFIG_EEPROM_AT24 is not set | ||
| 1335 | # CONFIG_EEPROM_LEGACY is not set | ||
| 1336 | # CONFIG_SENSORS_PCF8574 is not set | 1389 | # CONFIG_SENSORS_PCF8574 is not set |
| 1337 | # CONFIG_PCF8575 is not set | 1390 | # CONFIG_PCF8575 is not set |
| 1338 | # CONFIG_SENSORS_PCA9539 is not set | 1391 | # CONFIG_SENSORS_PCA9539 is not set |
| @@ -1351,8 +1404,78 @@ CONFIG_POWER_SUPPLY=y | |||
| 1351 | # CONFIG_POWER_SUPPLY_DEBUG is not set | 1404 | # CONFIG_POWER_SUPPLY_DEBUG is not set |
| 1352 | # CONFIG_PDA_POWER is not set | 1405 | # CONFIG_PDA_POWER is not set |
| 1353 | # CONFIG_BATTERY_DS2760 is not set | 1406 | # CONFIG_BATTERY_DS2760 is not set |
| 1354 | # CONFIG_HWMON is not set | 1407 | # CONFIG_BATTERY_BQ27x00 is not set |
| 1408 | CONFIG_HWMON=y | ||
| 1409 | # CONFIG_HWMON_VID is not set | ||
| 1410 | # CONFIG_SENSORS_ABITUGURU is not set | ||
| 1411 | # CONFIG_SENSORS_ABITUGURU3 is not set | ||
| 1412 | # CONFIG_SENSORS_AD7414 is not set | ||
| 1413 | # CONFIG_SENSORS_AD7418 is not set | ||
| 1414 | # CONFIG_SENSORS_ADM1021 is not set | ||
| 1415 | # CONFIG_SENSORS_ADM1025 is not set | ||
| 1416 | # CONFIG_SENSORS_ADM1026 is not set | ||
| 1417 | # CONFIG_SENSORS_ADM1029 is not set | ||
| 1418 | # CONFIG_SENSORS_ADM1031 is not set | ||
| 1419 | # CONFIG_SENSORS_ADM9240 is not set | ||
| 1420 | # CONFIG_SENSORS_ADT7462 is not set | ||
| 1421 | # CONFIG_SENSORS_ADT7470 is not set | ||
| 1422 | # CONFIG_SENSORS_ADT7473 is not set | ||
| 1423 | # CONFIG_SENSORS_ADT7475 is not set | ||
| 1424 | # CONFIG_SENSORS_K8TEMP is not set | ||
| 1425 | # CONFIG_SENSORS_ASB100 is not set | ||
| 1426 | # CONFIG_SENSORS_ATXP1 is not set | ||
| 1427 | # CONFIG_SENSORS_DS1621 is not set | ||
| 1428 | # CONFIG_SENSORS_I5K_AMB is not set | ||
| 1429 | # CONFIG_SENSORS_F71805F is not set | ||
| 1430 | # CONFIG_SENSORS_F71882FG is not set | ||
| 1431 | # CONFIG_SENSORS_F75375S is not set | ||
| 1432 | # CONFIG_SENSORS_FSCHER is not set | ||
| 1433 | # CONFIG_SENSORS_FSCPOS is not set | ||
| 1434 | # CONFIG_SENSORS_FSCHMD is not set | ||
| 1435 | # CONFIG_SENSORS_GL518SM is not set | ||
| 1436 | # CONFIG_SENSORS_GL520SM is not set | ||
| 1437 | # CONFIG_SENSORS_CORETEMP is not set | ||
| 1438 | # CONFIG_SENSORS_IT87 is not set | ||
| 1439 | # CONFIG_SENSORS_LM63 is not set | ||
| 1440 | # CONFIG_SENSORS_LM75 is not set | ||
| 1441 | # CONFIG_SENSORS_LM77 is not set | ||
| 1442 | # CONFIG_SENSORS_LM78 is not set | ||
| 1443 | # CONFIG_SENSORS_LM80 is not set | ||
| 1444 | # CONFIG_SENSORS_LM83 is not set | ||
| 1445 | # CONFIG_SENSORS_LM85 is not set | ||
| 1446 | # CONFIG_SENSORS_LM87 is not set | ||
| 1447 | # CONFIG_SENSORS_LM90 is not set | ||
| 1448 | # CONFIG_SENSORS_LM92 is not set | ||
| 1449 | # CONFIG_SENSORS_LM93 is not set | ||
| 1450 | # CONFIG_SENSORS_LTC4245 is not set | ||
| 1451 | # CONFIG_SENSORS_MAX1619 is not set | ||
| 1452 | # CONFIG_SENSORS_MAX6650 is not set | ||
| 1453 | # CONFIG_SENSORS_PC87360 is not set | ||
| 1454 | # CONFIG_SENSORS_PC87427 is not set | ||
| 1455 | # CONFIG_SENSORS_SIS5595 is not set | ||
| 1456 | # CONFIG_SENSORS_DME1737 is not set | ||
| 1457 | # CONFIG_SENSORS_SMSC47M1 is not set | ||
| 1458 | # CONFIG_SENSORS_SMSC47M192 is not set | ||
| 1459 | # CONFIG_SENSORS_SMSC47B397 is not set | ||
| 1460 | # CONFIG_SENSORS_ADS7828 is not set | ||
| 1461 | # CONFIG_SENSORS_THMC50 is not set | ||
| 1462 | # CONFIG_SENSORS_VIA686A is not set | ||
| 1463 | # CONFIG_SENSORS_VT1211 is not set | ||
| 1464 | # CONFIG_SENSORS_VT8231 is not set | ||
| 1465 | # CONFIG_SENSORS_W83781D is not set | ||
| 1466 | # CONFIG_SENSORS_W83791D is not set | ||
| 1467 | # CONFIG_SENSORS_W83792D is not set | ||
| 1468 | # CONFIG_SENSORS_W83793 is not set | ||
| 1469 | # CONFIG_SENSORS_W83L785TS is not set | ||
| 1470 | # CONFIG_SENSORS_W83L786NG is not set | ||
| 1471 | # CONFIG_SENSORS_W83627HF is not set | ||
| 1472 | # CONFIG_SENSORS_W83627EHF is not set | ||
| 1473 | # CONFIG_SENSORS_HDAPS is not set | ||
| 1474 | # CONFIG_SENSORS_LIS3LV02D is not set | ||
| 1475 | # CONFIG_SENSORS_APPLESMC is not set | ||
| 1476 | # CONFIG_HWMON_DEBUG_CHIP is not set | ||
| 1355 | CONFIG_THERMAL=y | 1477 | CONFIG_THERMAL=y |
| 1478 | # CONFIG_THERMAL_HWMON is not set | ||
| 1356 | CONFIG_WATCHDOG=y | 1479 | CONFIG_WATCHDOG=y |
| 1357 | # CONFIG_WATCHDOG_NOWAYOUT is not set | 1480 | # CONFIG_WATCHDOG_NOWAYOUT is not set |
| 1358 | 1481 | ||
| @@ -1372,6 +1495,7 @@ CONFIG_WATCHDOG=y | |||
| 1372 | # CONFIG_I6300ESB_WDT is not set | 1495 | # CONFIG_I6300ESB_WDT is not set |
| 1373 | # CONFIG_ITCO_WDT is not set | 1496 | # CONFIG_ITCO_WDT is not set |
| 1374 | # CONFIG_IT8712F_WDT is not set | 1497 | # CONFIG_IT8712F_WDT is not set |
| 1498 | # CONFIG_IT87_WDT is not set | ||
| 1375 | # CONFIG_HP_WATCHDOG is not set | 1499 | # CONFIG_HP_WATCHDOG is not set |
| 1376 | # CONFIG_SC1200_WDT is not set | 1500 | # CONFIG_SC1200_WDT is not set |
| 1377 | # CONFIG_PC87413_WDT is not set | 1501 | # CONFIG_PC87413_WDT is not set |
| @@ -1379,9 +1503,11 @@ CONFIG_WATCHDOG=y | |||
| 1379 | # CONFIG_SBC8360_WDT is not set | 1503 | # CONFIG_SBC8360_WDT is not set |
| 1380 | # CONFIG_SBC7240_WDT is not set | 1504 | # CONFIG_SBC7240_WDT is not set |
| 1381 | # CONFIG_CPU5_WDT is not set | 1505 | # CONFIG_CPU5_WDT is not set |
| 1506 | # CONFIG_SMSC_SCH311X_WDT is not set | ||
| 1382 | # CONFIG_SMSC37B787_WDT is not set | 1507 | # CONFIG_SMSC37B787_WDT is not set |
| 1383 | # CONFIG_W83627HF_WDT is not set | 1508 | # CONFIG_W83627HF_WDT is not set |
| 1384 | # CONFIG_W83697HF_WDT is not set | 1509 | # CONFIG_W83697HF_WDT is not set |
| 1510 | # CONFIG_W83697UG_WDT is not set | ||
| 1385 | # CONFIG_W83877F_WDT is not set | 1511 | # CONFIG_W83877F_WDT is not set |
| 1386 | # CONFIG_W83977F_WDT is not set | 1512 | # CONFIG_W83977F_WDT is not set |
| 1387 | # CONFIG_MACHZ_WDT is not set | 1513 | # CONFIG_MACHZ_WDT is not set |
| @@ -1397,11 +1523,11 @@ CONFIG_WATCHDOG=y | |||
| 1397 | # USB-based Watchdog Cards | 1523 | # USB-based Watchdog Cards |
| 1398 | # | 1524 | # |
| 1399 | # CONFIG_USBPCWATCHDOG is not set | 1525 | # CONFIG_USBPCWATCHDOG is not set |
| 1526 | CONFIG_SSB_POSSIBLE=y | ||
| 1400 | 1527 | ||
| 1401 | # | 1528 | # |
| 1402 | # Sonics Silicon Backplane | 1529 | # Sonics Silicon Backplane |
| 1403 | # | 1530 | # |
| 1404 | CONFIG_SSB_POSSIBLE=y | ||
| 1405 | # CONFIG_SSB is not set | 1531 | # CONFIG_SSB is not set |
| 1406 | 1532 | ||
| 1407 | # | 1533 | # |
| @@ -1410,7 +1536,13 @@ CONFIG_SSB_POSSIBLE=y | |||
| 1410 | # CONFIG_MFD_CORE is not set | 1536 | # CONFIG_MFD_CORE is not set |
| 1411 | # CONFIG_MFD_SM501 is not set | 1537 | # CONFIG_MFD_SM501 is not set |
| 1412 | # CONFIG_HTC_PASIC3 is not set | 1538 | # CONFIG_HTC_PASIC3 is not set |
| 1539 | # CONFIG_TWL4030_CORE is not set | ||
| 1413 | # CONFIG_MFD_TMIO is not set | 1540 | # CONFIG_MFD_TMIO is not set |
| 1541 | # CONFIG_PMIC_DA903X is not set | ||
| 1542 | # CONFIG_MFD_WM8400 is not set | ||
| 1543 | # CONFIG_MFD_WM8350_I2C is not set | ||
| 1544 | # CONFIG_MFD_PCF50633 is not set | ||
| 1545 | # CONFIG_REGULATOR is not set | ||
| 1414 | 1546 | ||
| 1415 | # | 1547 | # |
| 1416 | # Multimedia devices | 1548 | # Multimedia devices |
| @@ -1450,6 +1582,7 @@ CONFIG_DRM=y | |||
| 1450 | # CONFIG_DRM_I810 is not set | 1582 | # CONFIG_DRM_I810 is not set |
| 1451 | # CONFIG_DRM_I830 is not set | 1583 | # CONFIG_DRM_I830 is not set |
| 1452 | CONFIG_DRM_I915=y | 1584 | CONFIG_DRM_I915=y |
| 1585 | # CONFIG_DRM_I915_KMS is not set | ||
| 1453 | # CONFIG_DRM_MGA is not set | 1586 | # CONFIG_DRM_MGA is not set |
| 1454 | # CONFIG_DRM_SIS is not set | 1587 | # CONFIG_DRM_SIS is not set |
| 1455 | # CONFIG_DRM_VIA is not set | 1588 | # CONFIG_DRM_VIA is not set |
| @@ -1459,6 +1592,7 @@ CONFIG_DRM_I915=y | |||
| 1459 | CONFIG_FB=y | 1592 | CONFIG_FB=y |
| 1460 | # CONFIG_FIRMWARE_EDID is not set | 1593 | # CONFIG_FIRMWARE_EDID is not set |
| 1461 | # CONFIG_FB_DDC is not set | 1594 | # CONFIG_FB_DDC is not set |
| 1595 | # CONFIG_FB_BOOT_VESA_SUPPORT is not set | ||
| 1462 | CONFIG_FB_CFB_FILLRECT=y | 1596 | CONFIG_FB_CFB_FILLRECT=y |
| 1463 | CONFIG_FB_CFB_COPYAREA=y | 1597 | CONFIG_FB_CFB_COPYAREA=y |
| 1464 | CONFIG_FB_CFB_IMAGEBLIT=y | 1598 | CONFIG_FB_CFB_IMAGEBLIT=y |
| @@ -1487,7 +1621,6 @@ CONFIG_FB_TILEBLITTING=y | |||
| 1487 | # CONFIG_FB_UVESA is not set | 1621 | # CONFIG_FB_UVESA is not set |
| 1488 | # CONFIG_FB_VESA is not set | 1622 | # CONFIG_FB_VESA is not set |
| 1489 | CONFIG_FB_EFI=y | 1623 | CONFIG_FB_EFI=y |
| 1490 | # CONFIG_FB_IMAC is not set | ||
| 1491 | # CONFIG_FB_N411 is not set | 1624 | # CONFIG_FB_N411 is not set |
| 1492 | # CONFIG_FB_HGA is not set | 1625 | # CONFIG_FB_HGA is not set |
| 1493 | # CONFIG_FB_S1D13XXX is not set | 1626 | # CONFIG_FB_S1D13XXX is not set |
| @@ -1503,6 +1636,7 @@ CONFIG_FB_EFI=y | |||
| 1503 | # CONFIG_FB_S3 is not set | 1636 | # CONFIG_FB_S3 is not set |
| 1504 | # CONFIG_FB_SAVAGE is not set | 1637 | # CONFIG_FB_SAVAGE is not set |
| 1505 | # CONFIG_FB_SIS is not set | 1638 | # CONFIG_FB_SIS is not set |
| 1639 | # CONFIG_FB_VIA is not set | ||
| 1506 | # CONFIG_FB_NEOMAGIC is not set | 1640 | # CONFIG_FB_NEOMAGIC is not set |
| 1507 | # CONFIG_FB_KYRO is not set | 1641 | # CONFIG_FB_KYRO is not set |
| 1508 | # CONFIG_FB_3DFX is not set | 1642 | # CONFIG_FB_3DFX is not set |
| @@ -1515,12 +1649,15 @@ CONFIG_FB_EFI=y | |||
| 1515 | # CONFIG_FB_CARMINE is not set | 1649 | # CONFIG_FB_CARMINE is not set |
| 1516 | # CONFIG_FB_GEODE is not set | 1650 | # CONFIG_FB_GEODE is not set |
| 1517 | # CONFIG_FB_VIRTUAL is not set | 1651 | # CONFIG_FB_VIRTUAL is not set |
| 1652 | # CONFIG_FB_METRONOME is not set | ||
| 1653 | # CONFIG_FB_MB862XX is not set | ||
| 1518 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | 1654 | CONFIG_BACKLIGHT_LCD_SUPPORT=y |
| 1519 | # CONFIG_LCD_CLASS_DEVICE is not set | 1655 | # CONFIG_LCD_CLASS_DEVICE is not set |
| 1520 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | 1656 | CONFIG_BACKLIGHT_CLASS_DEVICE=y |
| 1521 | # CONFIG_BACKLIGHT_CORGI is not set | 1657 | CONFIG_BACKLIGHT_GENERIC=y |
| 1522 | # CONFIG_BACKLIGHT_PROGEAR is not set | 1658 | # CONFIG_BACKLIGHT_PROGEAR is not set |
| 1523 | # CONFIG_BACKLIGHT_MBP_NVIDIA is not set | 1659 | # CONFIG_BACKLIGHT_MBP_NVIDIA is not set |
| 1660 | # CONFIG_BACKLIGHT_SAHARA is not set | ||
| 1524 | 1661 | ||
| 1525 | # | 1662 | # |
| 1526 | # Display device support | 1663 | # Display device support |
| @@ -1540,10 +1677,12 @@ CONFIG_LOGO=y | |||
| 1540 | # CONFIG_LOGO_LINUX_VGA16 is not set | 1677 | # CONFIG_LOGO_LINUX_VGA16 is not set |
| 1541 | CONFIG_LOGO_LINUX_CLUT224=y | 1678 | CONFIG_LOGO_LINUX_CLUT224=y |
| 1542 | CONFIG_SOUND=y | 1679 | CONFIG_SOUND=y |
| 1680 | CONFIG_SOUND_OSS_CORE=y | ||
| 1543 | CONFIG_SND=y | 1681 | CONFIG_SND=y |
| 1544 | CONFIG_SND_TIMER=y | 1682 | CONFIG_SND_TIMER=y |
| 1545 | CONFIG_SND_PCM=y | 1683 | CONFIG_SND_PCM=y |
| 1546 | CONFIG_SND_HWDEP=y | 1684 | CONFIG_SND_HWDEP=y |
| 1685 | CONFIG_SND_JACK=y | ||
| 1547 | CONFIG_SND_SEQUENCER=y | 1686 | CONFIG_SND_SEQUENCER=y |
| 1548 | CONFIG_SND_SEQ_DUMMY=y | 1687 | CONFIG_SND_SEQ_DUMMY=y |
| 1549 | CONFIG_SND_OSSEMUL=y | 1688 | CONFIG_SND_OSSEMUL=y |
| @@ -1551,6 +1690,8 @@ CONFIG_SND_MIXER_OSS=y | |||
| 1551 | CONFIG_SND_PCM_OSS=y | 1690 | CONFIG_SND_PCM_OSS=y |
| 1552 | CONFIG_SND_PCM_OSS_PLUGINS=y | 1691 | CONFIG_SND_PCM_OSS_PLUGINS=y |
| 1553 | CONFIG_SND_SEQUENCER_OSS=y | 1692 | CONFIG_SND_SEQUENCER_OSS=y |
| 1693 | CONFIG_SND_HRTIMER=y | ||
| 1694 | CONFIG_SND_SEQ_HRTIMER_DEFAULT=y | ||
| 1554 | CONFIG_SND_DYNAMIC_MINORS=y | 1695 | CONFIG_SND_DYNAMIC_MINORS=y |
| 1555 | CONFIG_SND_SUPPORT_OLD_API=y | 1696 | CONFIG_SND_SUPPORT_OLD_API=y |
| 1556 | CONFIG_SND_VERBOSE_PROCFS=y | 1697 | CONFIG_SND_VERBOSE_PROCFS=y |
| @@ -1605,11 +1746,16 @@ CONFIG_SND_PCI=y | |||
| 1605 | # CONFIG_SND_FM801 is not set | 1746 | # CONFIG_SND_FM801 is not set |
| 1606 | CONFIG_SND_HDA_INTEL=y | 1747 | CONFIG_SND_HDA_INTEL=y |
| 1607 | CONFIG_SND_HDA_HWDEP=y | 1748 | CONFIG_SND_HDA_HWDEP=y |
| 1749 | # CONFIG_SND_HDA_RECONFIG is not set | ||
| 1750 | # CONFIG_SND_HDA_INPUT_BEEP is not set | ||
| 1608 | CONFIG_SND_HDA_CODEC_REALTEK=y | 1751 | CONFIG_SND_HDA_CODEC_REALTEK=y |
| 1609 | CONFIG_SND_HDA_CODEC_ANALOG=y | 1752 | CONFIG_SND_HDA_CODEC_ANALOG=y |
| 1610 | CONFIG_SND_HDA_CODEC_SIGMATEL=y | 1753 | CONFIG_SND_HDA_CODEC_SIGMATEL=y |
| 1611 | CONFIG_SND_HDA_CODEC_VIA=y | 1754 | CONFIG_SND_HDA_CODEC_VIA=y |
| 1612 | CONFIG_SND_HDA_CODEC_ATIHDMI=y | 1755 | CONFIG_SND_HDA_CODEC_ATIHDMI=y |
| 1756 | CONFIG_SND_HDA_CODEC_NVHDMI=y | ||
| 1757 | CONFIG_SND_HDA_CODEC_INTELHDMI=y | ||
| 1758 | CONFIG_SND_HDA_ELD=y | ||
| 1613 | CONFIG_SND_HDA_CODEC_CONEXANT=y | 1759 | CONFIG_SND_HDA_CODEC_CONEXANT=y |
| 1614 | CONFIG_SND_HDA_CODEC_CMEDIA=y | 1760 | CONFIG_SND_HDA_CODEC_CMEDIA=y |
| 1615 | CONFIG_SND_HDA_CODEC_SI3054=y | 1761 | CONFIG_SND_HDA_CODEC_SI3054=y |
| @@ -1643,6 +1789,7 @@ CONFIG_SND_USB=y | |||
| 1643 | # CONFIG_SND_USB_AUDIO is not set | 1789 | # CONFIG_SND_USB_AUDIO is not set |
| 1644 | # CONFIG_SND_USB_USX2Y is not set | 1790 | # CONFIG_SND_USB_USX2Y is not set |
| 1645 | # CONFIG_SND_USB_CAIAQ is not set | 1791 | # CONFIG_SND_USB_CAIAQ is not set |
| 1792 | # CONFIG_SND_USB_US122L is not set | ||
| 1646 | CONFIG_SND_PCMCIA=y | 1793 | CONFIG_SND_PCMCIA=y |
| 1647 | # CONFIG_SND_VXPOCKET is not set | 1794 | # CONFIG_SND_VXPOCKET is not set |
| 1648 | # CONFIG_SND_PDAUDIOCF is not set | 1795 | # CONFIG_SND_PDAUDIOCF is not set |
| @@ -1657,15 +1804,37 @@ CONFIG_HIDRAW=y | |||
| 1657 | # USB Input Devices | 1804 | # USB Input Devices |
| 1658 | # | 1805 | # |
| 1659 | CONFIG_USB_HID=y | 1806 | CONFIG_USB_HID=y |
| 1660 | CONFIG_USB_HIDINPUT_POWERBOOK=y | ||
| 1661 | CONFIG_HID_FF=y | ||
| 1662 | CONFIG_HID_PID=y | 1807 | CONFIG_HID_PID=y |
| 1808 | CONFIG_USB_HIDDEV=y | ||
| 1809 | |||
| 1810 | # | ||
| 1811 | # Special HID drivers | ||
| 1812 | # | ||
| 1813 | CONFIG_HID_COMPAT=y | ||
| 1814 | CONFIG_HID_A4TECH=y | ||
| 1815 | CONFIG_HID_APPLE=y | ||
| 1816 | CONFIG_HID_BELKIN=y | ||
| 1817 | CONFIG_HID_CHERRY=y | ||
| 1818 | CONFIG_HID_CHICONY=y | ||
| 1819 | CONFIG_HID_CYPRESS=y | ||
| 1820 | CONFIG_HID_EZKEY=y | ||
| 1821 | CONFIG_HID_GYRATION=y | ||
| 1822 | CONFIG_HID_LOGITECH=y | ||
| 1663 | CONFIG_LOGITECH_FF=y | 1823 | CONFIG_LOGITECH_FF=y |
| 1664 | # CONFIG_LOGIRUMBLEPAD2_FF is not set | 1824 | # CONFIG_LOGIRUMBLEPAD2_FF is not set |
| 1825 | CONFIG_HID_MICROSOFT=y | ||
| 1826 | CONFIG_HID_MONTEREY=y | ||
| 1827 | CONFIG_HID_NTRIG=y | ||
| 1828 | CONFIG_HID_PANTHERLORD=y | ||
| 1665 | CONFIG_PANTHERLORD_FF=y | 1829 | CONFIG_PANTHERLORD_FF=y |
| 1830 | CONFIG_HID_PETALYNX=y | ||
| 1831 | CONFIG_HID_SAMSUNG=y | ||
| 1832 | CONFIG_HID_SONY=y | ||
| 1833 | CONFIG_HID_SUNPLUS=y | ||
| 1834 | # CONFIG_GREENASIA_FF is not set | ||
| 1835 | CONFIG_HID_TOPSEED=y | ||
| 1666 | CONFIG_THRUSTMASTER_FF=y | 1836 | CONFIG_THRUSTMASTER_FF=y |
| 1667 | CONFIG_ZEROPLUS_FF=y | 1837 | CONFIG_ZEROPLUS_FF=y |
| 1668 | CONFIG_USB_HIDDEV=y | ||
| 1669 | CONFIG_USB_SUPPORT=y | 1838 | CONFIG_USB_SUPPORT=y |
| 1670 | CONFIG_USB_ARCH_HAS_HCD=y | 1839 | CONFIG_USB_ARCH_HAS_HCD=y |
| 1671 | CONFIG_USB_ARCH_HAS_OHCI=y | 1840 | CONFIG_USB_ARCH_HAS_OHCI=y |
| @@ -1683,6 +1852,8 @@ CONFIG_USB_DEVICEFS=y | |||
| 1683 | CONFIG_USB_SUSPEND=y | 1852 | CONFIG_USB_SUSPEND=y |
| 1684 | # CONFIG_USB_OTG is not set | 1853 | # CONFIG_USB_OTG is not set |
| 1685 | CONFIG_USB_MON=y | 1854 | CONFIG_USB_MON=y |
| 1855 | # CONFIG_USB_WUSB is not set | ||
| 1856 | # CONFIG_USB_WUSB_CBAF is not set | ||
| 1686 | 1857 | ||
| 1687 | # | 1858 | # |
| 1688 | # USB Host Controller Drivers | 1859 | # USB Host Controller Drivers |
| @@ -1691,6 +1862,7 @@ CONFIG_USB_MON=y | |||
| 1691 | CONFIG_USB_EHCI_HCD=y | 1862 | CONFIG_USB_EHCI_HCD=y |
| 1692 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | 1863 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set |
| 1693 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | 1864 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set |
| 1865 | # CONFIG_USB_OXU210HP_HCD is not set | ||
| 1694 | # CONFIG_USB_ISP116X_HCD is not set | 1866 | # CONFIG_USB_ISP116X_HCD is not set |
| 1695 | # CONFIG_USB_ISP1760_HCD is not set | 1867 | # CONFIG_USB_ISP1760_HCD is not set |
| 1696 | CONFIG_USB_OHCI_HCD=y | 1868 | CONFIG_USB_OHCI_HCD=y |
| @@ -1700,6 +1872,8 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y | |||
| 1700 | CONFIG_USB_UHCI_HCD=y | 1872 | CONFIG_USB_UHCI_HCD=y |
| 1701 | # CONFIG_USB_SL811_HCD is not set | 1873 | # CONFIG_USB_SL811_HCD is not set |
| 1702 | # CONFIG_USB_R8A66597_HCD is not set | 1874 | # CONFIG_USB_R8A66597_HCD is not set |
| 1875 | # CONFIG_USB_WHCI_HCD is not set | ||
| 1876 | # CONFIG_USB_HWA_HCD is not set | ||
| 1703 | 1877 | ||
| 1704 | # | 1878 | # |
| 1705 | # USB Device Class drivers | 1879 | # USB Device Class drivers |
| @@ -1707,20 +1881,20 @@ CONFIG_USB_UHCI_HCD=y | |||
| 1707 | # CONFIG_USB_ACM is not set | 1881 | # CONFIG_USB_ACM is not set |
| 1708 | CONFIG_USB_PRINTER=y | 1882 | CONFIG_USB_PRINTER=y |
| 1709 | # CONFIG_USB_WDM is not set | 1883 | # CONFIG_USB_WDM is not set |
| 1884 | # CONFIG_USB_TMC is not set | ||
| 1710 | 1885 | ||
| 1711 | # | 1886 | # |
| 1712 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | 1887 | # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; |
| 1713 | # | 1888 | # |
| 1714 | 1889 | ||
| 1715 | # | 1890 | # |
| 1716 | # may also be needed; see USB_STORAGE Help for more information | 1891 | # see USB_STORAGE Help for more information |
| 1717 | # | 1892 | # |
| 1718 | CONFIG_USB_STORAGE=y | 1893 | CONFIG_USB_STORAGE=y |
| 1719 | # CONFIG_USB_STORAGE_DEBUG is not set | 1894 | # CONFIG_USB_STORAGE_DEBUG is not set |
| 1720 | # CONFIG_USB_STORAGE_DATAFAB is not set | 1895 | # CONFIG_USB_STORAGE_DATAFAB is not set |
| 1721 | # CONFIG_USB_STORAGE_FREECOM is not set | 1896 | # CONFIG_USB_STORAGE_FREECOM is not set |
| 1722 | # CONFIG_USB_STORAGE_ISD200 is not set | 1897 | # CONFIG_USB_STORAGE_ISD200 is not set |
| 1723 | # CONFIG_USB_STORAGE_DPCM is not set | ||
| 1724 | # CONFIG_USB_STORAGE_USBAT is not set | 1898 | # CONFIG_USB_STORAGE_USBAT is not set |
| 1725 | # CONFIG_USB_STORAGE_SDDR09 is not set | 1899 | # CONFIG_USB_STORAGE_SDDR09 is not set |
| 1726 | # CONFIG_USB_STORAGE_SDDR55 is not set | 1900 | # CONFIG_USB_STORAGE_SDDR55 is not set |
| @@ -1728,7 +1902,6 @@ CONFIG_USB_STORAGE=y | |||
| 1728 | # CONFIG_USB_STORAGE_ALAUDA is not set | 1902 | # CONFIG_USB_STORAGE_ALAUDA is not set |
| 1729 | # CONFIG_USB_STORAGE_ONETOUCH is not set | 1903 | # CONFIG_USB_STORAGE_ONETOUCH is not set |
| 1730 | # CONFIG_USB_STORAGE_KARMA is not set | 1904 | # CONFIG_USB_STORAGE_KARMA is not set |
| 1731 | # CONFIG_USB_STORAGE_SIERRA is not set | ||
| 1732 | # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set | 1905 | # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set |
| 1733 | CONFIG_USB_LIBUSUAL=y | 1906 | CONFIG_USB_LIBUSUAL=y |
| 1734 | 1907 | ||
| @@ -1749,6 +1922,7 @@ CONFIG_USB_LIBUSUAL=y | |||
| 1749 | # CONFIG_USB_EMI62 is not set | 1922 | # CONFIG_USB_EMI62 is not set |
| 1750 | # CONFIG_USB_EMI26 is not set | 1923 | # CONFIG_USB_EMI26 is not set |
| 1751 | # CONFIG_USB_ADUTUX is not set | 1924 | # CONFIG_USB_ADUTUX is not set |
| 1925 | # CONFIG_USB_SEVSEG is not set | ||
| 1752 | # CONFIG_USB_RIO500 is not set | 1926 | # CONFIG_USB_RIO500 is not set |
| 1753 | # CONFIG_USB_LEGOTOWER is not set | 1927 | # CONFIG_USB_LEGOTOWER is not set |
| 1754 | # CONFIG_USB_LCD is not set | 1928 | # CONFIG_USB_LCD is not set |
| @@ -1766,7 +1940,13 @@ CONFIG_USB_LIBUSUAL=y | |||
| 1766 | # CONFIG_USB_IOWARRIOR is not set | 1940 | # CONFIG_USB_IOWARRIOR is not set |
| 1767 | # CONFIG_USB_TEST is not set | 1941 | # CONFIG_USB_TEST is not set |
| 1768 | # CONFIG_USB_ISIGHTFW is not set | 1942 | # CONFIG_USB_ISIGHTFW is not set |
| 1943 | # CONFIG_USB_VST is not set | ||
| 1769 | # CONFIG_USB_GADGET is not set | 1944 | # CONFIG_USB_GADGET is not set |
| 1945 | |||
| 1946 | # | ||
| 1947 | # OTG and related infrastructure | ||
| 1948 | # | ||
| 1949 | # CONFIG_UWB is not set | ||
| 1770 | # CONFIG_MMC is not set | 1950 | # CONFIG_MMC is not set |
| 1771 | # CONFIG_MEMSTICK is not set | 1951 | # CONFIG_MEMSTICK is not set |
| 1772 | CONFIG_NEW_LEDS=y | 1952 | CONFIG_NEW_LEDS=y |
| @@ -1775,6 +1955,7 @@ CONFIG_LEDS_CLASS=y | |||
| 1775 | # | 1955 | # |
| 1776 | # LED drivers | 1956 | # LED drivers |
| 1777 | # | 1957 | # |
| 1958 | # CONFIG_LEDS_ALIX2 is not set | ||
| 1778 | # CONFIG_LEDS_PCA9532 is not set | 1959 | # CONFIG_LEDS_PCA9532 is not set |
| 1779 | # CONFIG_LEDS_CLEVO_MAIL is not set | 1960 | # CONFIG_LEDS_CLEVO_MAIL is not set |
| 1780 | # CONFIG_LEDS_PCA955X is not set | 1961 | # CONFIG_LEDS_PCA955X is not set |
| @@ -1785,6 +1966,7 @@ CONFIG_LEDS_CLASS=y | |||
| 1785 | CONFIG_LEDS_TRIGGERS=y | 1966 | CONFIG_LEDS_TRIGGERS=y |
| 1786 | # CONFIG_LEDS_TRIGGER_TIMER is not set | 1967 | # CONFIG_LEDS_TRIGGER_TIMER is not set |
| 1787 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set | 1968 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set |
| 1969 | # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set | ||
| 1788 | # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set | 1970 | # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set |
| 1789 | # CONFIG_ACCESSIBILITY is not set | 1971 | # CONFIG_ACCESSIBILITY is not set |
| 1790 | # CONFIG_INFINIBAND is not set | 1972 | # CONFIG_INFINIBAND is not set |
| @@ -1824,6 +2006,7 @@ CONFIG_RTC_INTF_DEV=y | |||
| 1824 | # CONFIG_RTC_DRV_M41T80 is not set | 2006 | # CONFIG_RTC_DRV_M41T80 is not set |
| 1825 | # CONFIG_RTC_DRV_S35390A is not set | 2007 | # CONFIG_RTC_DRV_S35390A is not set |
| 1826 | # CONFIG_RTC_DRV_FM3130 is not set | 2008 | # CONFIG_RTC_DRV_FM3130 is not set |
| 2009 | # CONFIG_RTC_DRV_RX8581 is not set | ||
| 1827 | 2010 | ||
| 1828 | # | 2011 | # |
| 1829 | # SPI RTC drivers | 2012 | # SPI RTC drivers |
| @@ -1833,12 +2016,15 @@ CONFIG_RTC_INTF_DEV=y | |||
| 1833 | # Platform RTC drivers | 2016 | # Platform RTC drivers |
| 1834 | # | 2017 | # |
| 1835 | CONFIG_RTC_DRV_CMOS=y | 2018 | CONFIG_RTC_DRV_CMOS=y |
| 2019 | # CONFIG_RTC_DRV_DS1286 is not set | ||
| 1836 | # CONFIG_RTC_DRV_DS1511 is not set | 2020 | # CONFIG_RTC_DRV_DS1511 is not set |
| 1837 | # CONFIG_RTC_DRV_DS1553 is not set | 2021 | # CONFIG_RTC_DRV_DS1553 is not set |
| 1838 | # CONFIG_RTC_DRV_DS1742 is not set | 2022 | # CONFIG_RTC_DRV_DS1742 is not set |
| 1839 | # CONFIG_RTC_DRV_STK17TA8 is not set | 2023 | # CONFIG_RTC_DRV_STK17TA8 is not set |
| 1840 | # CONFIG_RTC_DRV_M48T86 is not set | 2024 | # CONFIG_RTC_DRV_M48T86 is not set |
| 2025 | # CONFIG_RTC_DRV_M48T35 is not set | ||
| 1841 | # CONFIG_RTC_DRV_M48T59 is not set | 2026 | # CONFIG_RTC_DRV_M48T59 is not set |
| 2027 | # CONFIG_RTC_DRV_BQ4802 is not set | ||
| 1842 | # CONFIG_RTC_DRV_V3020 is not set | 2028 | # CONFIG_RTC_DRV_V3020 is not set |
| 1843 | 2029 | ||
| 1844 | # | 2030 | # |
| @@ -1851,6 +2037,22 @@ CONFIG_DMADEVICES=y | |||
| 1851 | # | 2037 | # |
| 1852 | # CONFIG_INTEL_IOATDMA is not set | 2038 | # CONFIG_INTEL_IOATDMA is not set |
| 1853 | # CONFIG_UIO is not set | 2039 | # CONFIG_UIO is not set |
| 2040 | # CONFIG_STAGING is not set | ||
| 2041 | CONFIG_X86_PLATFORM_DEVICES=y | ||
| 2042 | # CONFIG_ACER_WMI is not set | ||
| 2043 | # CONFIG_ASUS_LAPTOP is not set | ||
| 2044 | # CONFIG_FUJITSU_LAPTOP is not set | ||
| 2045 | # CONFIG_TC1100_WMI is not set | ||
| 2046 | # CONFIG_MSI_LAPTOP is not set | ||
| 2047 | # CONFIG_PANASONIC_LAPTOP is not set | ||
| 2048 | # CONFIG_COMPAL_LAPTOP is not set | ||
| 2049 | # CONFIG_SONY_LAPTOP is not set | ||
| 2050 | # CONFIG_THINKPAD_ACPI is not set | ||
| 2051 | # CONFIG_INTEL_MENLOW is not set | ||
| 2052 | CONFIG_EEEPC_LAPTOP=y | ||
| 2053 | # CONFIG_ACPI_WMI is not set | ||
| 2054 | # CONFIG_ACPI_ASUS is not set | ||
| 2055 | # CONFIG_ACPI_TOSHIBA is not set | ||
| 1854 | 2056 | ||
| 1855 | # | 2057 | # |
| 1856 | # Firmware Drivers | 2058 | # Firmware Drivers |
| @@ -1861,8 +2063,7 @@ CONFIG_EFI_VARS=y | |||
| 1861 | # CONFIG_DELL_RBU is not set | 2063 | # CONFIG_DELL_RBU is not set |
| 1862 | # CONFIG_DCDBAS is not set | 2064 | # CONFIG_DCDBAS is not set |
| 1863 | CONFIG_DMIID=y | 2065 | CONFIG_DMIID=y |
| 1864 | CONFIG_ISCSI_IBFT_FIND=y | 2066 | # CONFIG_ISCSI_IBFT_FIND is not set |
| 1865 | CONFIG_ISCSI_IBFT=y | ||
| 1866 | 2067 | ||
| 1867 | # | 2068 | # |
| 1868 | # File systems | 2069 | # File systems |
| @@ -1872,21 +2073,24 @@ CONFIG_EXT3_FS=y | |||
| 1872 | CONFIG_EXT3_FS_XATTR=y | 2073 | CONFIG_EXT3_FS_XATTR=y |
| 1873 | CONFIG_EXT3_FS_POSIX_ACL=y | 2074 | CONFIG_EXT3_FS_POSIX_ACL=y |
| 1874 | CONFIG_EXT3_FS_SECURITY=y | 2075 | CONFIG_EXT3_FS_SECURITY=y |
| 1875 | # CONFIG_EXT4DEV_FS is not set | 2076 | # CONFIG_EXT4_FS is not set |
| 1876 | CONFIG_JBD=y | 2077 | CONFIG_JBD=y |
| 1877 | # CONFIG_JBD_DEBUG is not set | 2078 | # CONFIG_JBD_DEBUG is not set |
| 1878 | CONFIG_FS_MBCACHE=y | 2079 | CONFIG_FS_MBCACHE=y |
| 1879 | # CONFIG_REISERFS_FS is not set | 2080 | # CONFIG_REISERFS_FS is not set |
| 1880 | # CONFIG_JFS_FS is not set | 2081 | # CONFIG_JFS_FS is not set |
| 1881 | CONFIG_FS_POSIX_ACL=y | 2082 | CONFIG_FS_POSIX_ACL=y |
| 2083 | CONFIG_FILE_LOCKING=y | ||
| 1882 | # CONFIG_XFS_FS is not set | 2084 | # CONFIG_XFS_FS is not set |
| 1883 | # CONFIG_OCFS2_FS is not set | 2085 | # CONFIG_OCFS2_FS is not set |
| 2086 | # CONFIG_BTRFS_FS is not set | ||
| 1884 | CONFIG_DNOTIFY=y | 2087 | CONFIG_DNOTIFY=y |
| 1885 | CONFIG_INOTIFY=y | 2088 | CONFIG_INOTIFY=y |
| 1886 | CONFIG_INOTIFY_USER=y | 2089 | CONFIG_INOTIFY_USER=y |
| 1887 | CONFIG_QUOTA=y | 2090 | CONFIG_QUOTA=y |
| 1888 | CONFIG_QUOTA_NETLINK_INTERFACE=y | 2091 | CONFIG_QUOTA_NETLINK_INTERFACE=y |
| 1889 | # CONFIG_PRINT_QUOTA_WARNING is not set | 2092 | # CONFIG_PRINT_QUOTA_WARNING is not set |
| 2093 | CONFIG_QUOTA_TREE=y | ||
| 1890 | # CONFIG_QFMT_V1 is not set | 2094 | # CONFIG_QFMT_V1 is not set |
| 1891 | CONFIG_QFMT_V2=y | 2095 | CONFIG_QFMT_V2=y |
| 1892 | CONFIG_QUOTACTL=y | 2096 | CONFIG_QUOTACTL=y |
| @@ -1920,16 +2124,14 @@ CONFIG_PROC_FS=y | |||
| 1920 | CONFIG_PROC_KCORE=y | 2124 | CONFIG_PROC_KCORE=y |
| 1921 | CONFIG_PROC_VMCORE=y | 2125 | CONFIG_PROC_VMCORE=y |
| 1922 | CONFIG_PROC_SYSCTL=y | 2126 | CONFIG_PROC_SYSCTL=y |
| 2127 | CONFIG_PROC_PAGE_MONITOR=y | ||
| 1923 | CONFIG_SYSFS=y | 2128 | CONFIG_SYSFS=y |
| 1924 | CONFIG_TMPFS=y | 2129 | CONFIG_TMPFS=y |
| 1925 | CONFIG_TMPFS_POSIX_ACL=y | 2130 | CONFIG_TMPFS_POSIX_ACL=y |
| 1926 | CONFIG_HUGETLBFS=y | 2131 | CONFIG_HUGETLBFS=y |
| 1927 | CONFIG_HUGETLB_PAGE=y | 2132 | CONFIG_HUGETLB_PAGE=y |
| 1928 | # CONFIG_CONFIGFS_FS is not set | 2133 | # CONFIG_CONFIGFS_FS is not set |
| 1929 | 2134 | CONFIG_MISC_FILESYSTEMS=y | |
| 1930 | # | ||
| 1931 | # Miscellaneous filesystems | ||
| 1932 | # | ||
| 1933 | # CONFIG_ADFS_FS is not set | 2135 | # CONFIG_ADFS_FS is not set |
| 1934 | # CONFIG_AFFS_FS is not set | 2136 | # CONFIG_AFFS_FS is not set |
| 1935 | # CONFIG_ECRYPT_FS is not set | 2137 | # CONFIG_ECRYPT_FS is not set |
| @@ -1939,6 +2141,7 @@ CONFIG_HUGETLB_PAGE=y | |||
| 1939 | # CONFIG_BFS_FS is not set | 2141 | # CONFIG_BFS_FS is not set |
| 1940 | # CONFIG_EFS_FS is not set | 2142 | # CONFIG_EFS_FS is not set |
| 1941 | # CONFIG_CRAMFS is not set | 2143 | # CONFIG_CRAMFS is not set |
| 2144 | # CONFIG_SQUASHFS is not set | ||
| 1942 | # CONFIG_VXFS_FS is not set | 2145 | # CONFIG_VXFS_FS is not set |
| 1943 | # CONFIG_MINIX_FS is not set | 2146 | # CONFIG_MINIX_FS is not set |
| 1944 | # CONFIG_OMFS_FS is not set | 2147 | # CONFIG_OMFS_FS is not set |
| @@ -1960,6 +2163,7 @@ CONFIG_NFS_ACL_SUPPORT=y | |||
| 1960 | CONFIG_NFS_COMMON=y | 2163 | CONFIG_NFS_COMMON=y |
| 1961 | CONFIG_SUNRPC=y | 2164 | CONFIG_SUNRPC=y |
| 1962 | CONFIG_SUNRPC_GSS=y | 2165 | CONFIG_SUNRPC_GSS=y |
| 2166 | # CONFIG_SUNRPC_REGISTER_V4 is not set | ||
| 1963 | CONFIG_RPCSEC_GSS_KRB5=y | 2167 | CONFIG_RPCSEC_GSS_KRB5=y |
| 1964 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 2168 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
| 1965 | # CONFIG_SMB_FS is not set | 2169 | # CONFIG_SMB_FS is not set |
| @@ -2036,7 +2240,7 @@ CONFIG_NLS_UTF8=y | |||
| 2036 | # | 2240 | # |
| 2037 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | 2241 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y |
| 2038 | CONFIG_PRINTK_TIME=y | 2242 | CONFIG_PRINTK_TIME=y |
| 2039 | CONFIG_ENABLE_WARN_DEPRECATED=y | 2243 | # CONFIG_ENABLE_WARN_DEPRECATED is not set |
| 2040 | CONFIG_ENABLE_MUST_CHECK=y | 2244 | CONFIG_ENABLE_MUST_CHECK=y |
| 2041 | CONFIG_FRAME_WARN=2048 | 2245 | CONFIG_FRAME_WARN=2048 |
| 2042 | CONFIG_MAGIC_SYSRQ=y | 2246 | CONFIG_MAGIC_SYSRQ=y |
| @@ -2066,33 +2270,54 @@ CONFIG_TIMER_STATS=y | |||
| 2066 | CONFIG_DEBUG_BUGVERBOSE=y | 2270 | CONFIG_DEBUG_BUGVERBOSE=y |
| 2067 | # CONFIG_DEBUG_INFO is not set | 2271 | # CONFIG_DEBUG_INFO is not set |
| 2068 | # CONFIG_DEBUG_VM is not set | 2272 | # CONFIG_DEBUG_VM is not set |
| 2273 | # CONFIG_DEBUG_VIRTUAL is not set | ||
| 2069 | # CONFIG_DEBUG_WRITECOUNT is not set | 2274 | # CONFIG_DEBUG_WRITECOUNT is not set |
| 2070 | CONFIG_DEBUG_MEMORY_INIT=y | 2275 | CONFIG_DEBUG_MEMORY_INIT=y |
| 2071 | # CONFIG_DEBUG_LIST is not set | 2276 | # CONFIG_DEBUG_LIST is not set |
| 2072 | # CONFIG_DEBUG_SG is not set | 2277 | # CONFIG_DEBUG_SG is not set |
| 2278 | # CONFIG_DEBUG_NOTIFIERS is not set | ||
| 2279 | CONFIG_ARCH_WANT_FRAME_POINTERS=y | ||
| 2073 | CONFIG_FRAME_POINTER=y | 2280 | CONFIG_FRAME_POINTER=y |
| 2074 | # CONFIG_BOOT_PRINTK_DELAY is not set | 2281 | # CONFIG_BOOT_PRINTK_DELAY is not set |
| 2075 | # CONFIG_RCU_TORTURE_TEST is not set | 2282 | # CONFIG_RCU_TORTURE_TEST is not set |
| 2283 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
| 2076 | # CONFIG_KPROBES_SANITY_TEST is not set | 2284 | # CONFIG_KPROBES_SANITY_TEST is not set |
| 2077 | # CONFIG_BACKTRACE_SELF_TEST is not set | 2285 | # CONFIG_BACKTRACE_SELF_TEST is not set |
| 2286 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | ||
| 2078 | # CONFIG_LKDTM is not set | 2287 | # CONFIG_LKDTM is not set |
| 2079 | # CONFIG_FAULT_INJECTION is not set | 2288 | # CONFIG_FAULT_INJECTION is not set |
| 2080 | # CONFIG_LATENCYTOP is not set | 2289 | # CONFIG_LATENCYTOP is not set |
| 2081 | CONFIG_SYSCTL_SYSCALL_CHECK=y | 2290 | CONFIG_SYSCTL_SYSCALL_CHECK=y |
| 2082 | CONFIG_HAVE_FTRACE=y | 2291 | CONFIG_USER_STACKTRACE_SUPPORT=y |
| 2292 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
| 2293 | CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y | ||
| 2294 | CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y | ||
| 2083 | CONFIG_HAVE_DYNAMIC_FTRACE=y | 2295 | CONFIG_HAVE_DYNAMIC_FTRACE=y |
| 2084 | # CONFIG_FTRACE is not set | 2296 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y |
| 2297 | CONFIG_HAVE_HW_BRANCH_TRACER=y | ||
| 2298 | |||
| 2299 | # | ||
| 2300 | # Tracers | ||
| 2301 | # | ||
| 2302 | # CONFIG_FUNCTION_TRACER is not set | ||
| 2085 | # CONFIG_IRQSOFF_TRACER is not set | 2303 | # CONFIG_IRQSOFF_TRACER is not set |
| 2086 | # CONFIG_SYSPROF_TRACER is not set | 2304 | # CONFIG_SYSPROF_TRACER is not set |
| 2087 | # CONFIG_SCHED_TRACER is not set | 2305 | # CONFIG_SCHED_TRACER is not set |
| 2088 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | 2306 | # CONFIG_CONTEXT_SWITCH_TRACER is not set |
| 2307 | # CONFIG_BOOT_TRACER is not set | ||
| 2308 | # CONFIG_TRACE_BRANCH_PROFILING is not set | ||
| 2309 | # CONFIG_POWER_TRACER is not set | ||
| 2310 | # CONFIG_STACK_TRACER is not set | ||
| 2311 | # CONFIG_HW_BRANCH_TRACER is not set | ||
| 2089 | CONFIG_PROVIDE_OHCI1394_DMA_INIT=y | 2312 | CONFIG_PROVIDE_OHCI1394_DMA_INIT=y |
| 2313 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
| 2090 | # CONFIG_SAMPLES is not set | 2314 | # CONFIG_SAMPLES is not set |
| 2091 | CONFIG_HAVE_ARCH_KGDB=y | 2315 | CONFIG_HAVE_ARCH_KGDB=y |
| 2092 | # CONFIG_KGDB is not set | 2316 | # CONFIG_KGDB is not set |
| 2093 | # CONFIG_STRICT_DEVMEM is not set | 2317 | # CONFIG_STRICT_DEVMEM is not set |
| 2094 | CONFIG_X86_VERBOSE_BOOTUP=y | 2318 | CONFIG_X86_VERBOSE_BOOTUP=y |
| 2095 | CONFIG_EARLY_PRINTK=y | 2319 | CONFIG_EARLY_PRINTK=y |
| 2320 | CONFIG_EARLY_PRINTK_DBGP=y | ||
| 2096 | CONFIG_DEBUG_STACKOVERFLOW=y | 2321 | CONFIG_DEBUG_STACKOVERFLOW=y |
| 2097 | CONFIG_DEBUG_STACK_USAGE=y | 2322 | CONFIG_DEBUG_STACK_USAGE=y |
| 2098 | # CONFIG_DEBUG_PAGEALLOC is not set | 2323 | # CONFIG_DEBUG_PAGEALLOC is not set |
| @@ -2123,8 +2348,10 @@ CONFIG_OPTIMIZE_INLINING=y | |||
| 2123 | CONFIG_KEYS=y | 2348 | CONFIG_KEYS=y |
| 2124 | CONFIG_KEYS_DEBUG_PROC_KEYS=y | 2349 | CONFIG_KEYS_DEBUG_PROC_KEYS=y |
| 2125 | CONFIG_SECURITY=y | 2350 | CONFIG_SECURITY=y |
| 2351 | # CONFIG_SECURITYFS is not set | ||
| 2126 | CONFIG_SECURITY_NETWORK=y | 2352 | CONFIG_SECURITY_NETWORK=y |
| 2127 | # CONFIG_SECURITY_NETWORK_XFRM is not set | 2353 | # CONFIG_SECURITY_NETWORK_XFRM is not set |
| 2354 | # CONFIG_SECURITY_PATH is not set | ||
| 2128 | CONFIG_SECURITY_FILE_CAPABILITIES=y | 2355 | CONFIG_SECURITY_FILE_CAPABILITIES=y |
| 2129 | # CONFIG_SECURITY_ROOTPLUG is not set | 2356 | # CONFIG_SECURITY_ROOTPLUG is not set |
| 2130 | CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=65536 | 2357 | CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=65536 |
| @@ -2135,7 +2362,6 @@ CONFIG_SECURITY_SELINUX_DISABLE=y | |||
| 2135 | CONFIG_SECURITY_SELINUX_DEVELOP=y | 2362 | CONFIG_SECURITY_SELINUX_DEVELOP=y |
| 2136 | CONFIG_SECURITY_SELINUX_AVC_STATS=y | 2363 | CONFIG_SECURITY_SELINUX_AVC_STATS=y |
| 2137 | CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1 | 2364 | CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1 |
| 2138 | # CONFIG_SECURITY_SELINUX_ENABLE_SECMARK_DEFAULT is not set | ||
| 2139 | # CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set | 2365 | # CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set |
| 2140 | # CONFIG_SECURITY_SMACK is not set | 2366 | # CONFIG_SECURITY_SMACK is not set |
| 2141 | CONFIG_CRYPTO=y | 2367 | CONFIG_CRYPTO=y |
| @@ -2143,11 +2369,18 @@ CONFIG_CRYPTO=y | |||
| 2143 | # | 2369 | # |
| 2144 | # Crypto core or helper | 2370 | # Crypto core or helper |
| 2145 | # | 2371 | # |
| 2372 | # CONFIG_CRYPTO_FIPS is not set | ||
| 2146 | CONFIG_CRYPTO_ALGAPI=y | 2373 | CONFIG_CRYPTO_ALGAPI=y |
| 2374 | CONFIG_CRYPTO_ALGAPI2=y | ||
| 2147 | CONFIG_CRYPTO_AEAD=y | 2375 | CONFIG_CRYPTO_AEAD=y |
| 2376 | CONFIG_CRYPTO_AEAD2=y | ||
| 2148 | CONFIG_CRYPTO_BLKCIPHER=y | 2377 | CONFIG_CRYPTO_BLKCIPHER=y |
| 2378 | CONFIG_CRYPTO_BLKCIPHER2=y | ||
| 2149 | CONFIG_CRYPTO_HASH=y | 2379 | CONFIG_CRYPTO_HASH=y |
| 2380 | CONFIG_CRYPTO_HASH2=y | ||
| 2381 | CONFIG_CRYPTO_RNG2=y | ||
| 2150 | CONFIG_CRYPTO_MANAGER=y | 2382 | CONFIG_CRYPTO_MANAGER=y |
| 2383 | CONFIG_CRYPTO_MANAGER2=y | ||
| 2151 | # CONFIG_CRYPTO_GF128MUL is not set | 2384 | # CONFIG_CRYPTO_GF128MUL is not set |
| 2152 | # CONFIG_CRYPTO_NULL is not set | 2385 | # CONFIG_CRYPTO_NULL is not set |
| 2153 | # CONFIG_CRYPTO_CRYPTD is not set | 2386 | # CONFIG_CRYPTO_CRYPTD is not set |
| @@ -2182,6 +2415,7 @@ CONFIG_CRYPTO_HMAC=y | |||
| 2182 | # Digest | 2415 | # Digest |
| 2183 | # | 2416 | # |
| 2184 | # CONFIG_CRYPTO_CRC32C is not set | 2417 | # CONFIG_CRYPTO_CRC32C is not set |
| 2418 | # CONFIG_CRYPTO_CRC32C_INTEL is not set | ||
| 2185 | # CONFIG_CRYPTO_MD4 is not set | 2419 | # CONFIG_CRYPTO_MD4 is not set |
| 2186 | CONFIG_CRYPTO_MD5=y | 2420 | CONFIG_CRYPTO_MD5=y |
| 2187 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | 2421 | # CONFIG_CRYPTO_MICHAEL_MIC is not set |
| @@ -2222,6 +2456,11 @@ CONFIG_CRYPTO_DES=y | |||
| 2222 | # | 2456 | # |
| 2223 | # CONFIG_CRYPTO_DEFLATE is not set | 2457 | # CONFIG_CRYPTO_DEFLATE is not set |
| 2224 | # CONFIG_CRYPTO_LZO is not set | 2458 | # CONFIG_CRYPTO_LZO is not set |
| 2459 | |||
| 2460 | # | ||
| 2461 | # Random Number Generation | ||
| 2462 | # | ||
| 2463 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
| 2225 | CONFIG_CRYPTO_HW=y | 2464 | CONFIG_CRYPTO_HW=y |
| 2226 | # CONFIG_CRYPTO_DEV_PADLOCK is not set | 2465 | # CONFIG_CRYPTO_DEV_PADLOCK is not set |
| 2227 | # CONFIG_CRYPTO_DEV_GEODE is not set | 2466 | # CONFIG_CRYPTO_DEV_GEODE is not set |
| @@ -2239,6 +2478,7 @@ CONFIG_VIRTUALIZATION=y | |||
| 2239 | CONFIG_BITREVERSE=y | 2478 | CONFIG_BITREVERSE=y |
| 2240 | CONFIG_GENERIC_FIND_FIRST_BIT=y | 2479 | CONFIG_GENERIC_FIND_FIRST_BIT=y |
| 2241 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 2480 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
| 2481 | CONFIG_GENERIC_FIND_LAST_BIT=y | ||
| 2242 | # CONFIG_CRC_CCITT is not set | 2482 | # CONFIG_CRC_CCITT is not set |
| 2243 | # CONFIG_CRC16 is not set | 2483 | # CONFIG_CRC16 is not set |
| 2244 | CONFIG_CRC_T10DIF=y | 2484 | CONFIG_CRC_T10DIF=y |
diff --git a/arch/x86/configs/x86_64_defconfig b/arch/x86/configs/x86_64_defconfig index 322dd2748fc9..2efb5d5063ff 100644 --- a/arch/x86/configs/x86_64_defconfig +++ b/arch/x86/configs/x86_64_defconfig | |||
| @@ -1,14 +1,13 @@ | |||
| 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-rc5 | 3 | # Linux kernel version: 2.6.29-rc4 |
| 4 | # Wed Sep 3 17:13:39 2008 | 4 | # Thu Feb 12 12:57:29 2009 |
| 5 | # | 5 | # |
| 6 | CONFIG_64BIT=y | 6 | CONFIG_64BIT=y |
| 7 | # CONFIG_X86_32 is not set | 7 | # CONFIG_X86_32 is not set |
| 8 | CONFIG_X86_64=y | 8 | CONFIG_X86_64=y |
| 9 | CONFIG_X86=y | 9 | CONFIG_X86=y |
| 10 | CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig" | 10 | CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig" |
| 11 | # CONFIG_GENERIC_LOCKBREAK is not set | ||
| 12 | CONFIG_GENERIC_TIME=y | 11 | CONFIG_GENERIC_TIME=y |
| 13 | CONFIG_GENERIC_CMOS_UPDATE=y | 12 | CONFIG_GENERIC_CMOS_UPDATE=y |
| 14 | CONFIG_CLOCKSOURCE_WATCHDOG=y | 13 | CONFIG_CLOCKSOURCE_WATCHDOG=y |
| @@ -23,17 +22,16 @@ CONFIG_ZONE_DMA=y | |||
| 23 | CONFIG_GENERIC_ISA_DMA=y | 22 | CONFIG_GENERIC_ISA_DMA=y |
| 24 | CONFIG_GENERIC_IOMAP=y | 23 | CONFIG_GENERIC_IOMAP=y |
| 25 | CONFIG_GENERIC_BUG=y | 24 | CONFIG_GENERIC_BUG=y |
| 25 | CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y | ||
| 26 | CONFIG_GENERIC_HWEIGHT=y | 26 | CONFIG_GENERIC_HWEIGHT=y |
| 27 | # CONFIG_GENERIC_GPIO is not set | ||
| 28 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y | 27 | CONFIG_ARCH_MAY_HAVE_PC_FDC=y |
| 29 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | 28 | CONFIG_RWSEM_GENERIC_SPINLOCK=y |
| 30 | # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set | 29 | # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set |
| 31 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
| 32 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
| 33 | CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y | 30 | CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y |
| 34 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 31 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
| 35 | CONFIG_GENERIC_TIME_VSYSCALL=y | 32 | CONFIG_GENERIC_TIME_VSYSCALL=y |
| 36 | CONFIG_ARCH_HAS_CPU_RELAX=y | 33 | CONFIG_ARCH_HAS_CPU_RELAX=y |
| 34 | CONFIG_ARCH_HAS_DEFAULT_IDLE=y | ||
| 37 | CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y | 35 | CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y |
| 38 | CONFIG_HAVE_SETUP_PER_CPU_AREA=y | 36 | CONFIG_HAVE_SETUP_PER_CPU_AREA=y |
| 39 | CONFIG_HAVE_CPUMASK_OF_CPU_MAP=y | 37 | CONFIG_HAVE_CPUMASK_OF_CPU_MAP=y |
| @@ -42,12 +40,12 @@ CONFIG_ARCH_SUSPEND_POSSIBLE=y | |||
| 42 | CONFIG_ZONE_DMA32=y | 40 | CONFIG_ZONE_DMA32=y |
| 43 | CONFIG_ARCH_POPULATES_NODE_MAP=y | 41 | CONFIG_ARCH_POPULATES_NODE_MAP=y |
| 44 | CONFIG_AUDIT_ARCH=y | 42 | CONFIG_AUDIT_ARCH=y |
| 45 | CONFIG_ARCH_SUPPORTS_AOUT=y | ||
| 46 | CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y | 43 | CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y |
| 47 | CONFIG_GENERIC_HARDIRQS=y | 44 | CONFIG_GENERIC_HARDIRQS=y |
| 48 | CONFIG_GENERIC_IRQ_PROBE=y | 45 | CONFIG_GENERIC_IRQ_PROBE=y |
| 49 | CONFIG_GENERIC_PENDING_IRQ=y | 46 | CONFIG_GENERIC_PENDING_IRQ=y |
| 50 | CONFIG_X86_SMP=y | 47 | CONFIG_X86_SMP=y |
| 48 | CONFIG_USE_GENERIC_SMP_HELPERS=y | ||
| 51 | CONFIG_X86_64_SMP=y | 49 | CONFIG_X86_64_SMP=y |
| 52 | CONFIG_X86_HT=y | 50 | CONFIG_X86_HT=y |
| 53 | CONFIG_X86_BIOS_REBOOT=y | 51 | CONFIG_X86_BIOS_REBOOT=y |
| @@ -76,30 +74,44 @@ CONFIG_TASK_IO_ACCOUNTING=y | |||
| 76 | CONFIG_AUDIT=y | 74 | CONFIG_AUDIT=y |
| 77 | CONFIG_AUDITSYSCALL=y | 75 | CONFIG_AUDITSYSCALL=y |
| 78 | CONFIG_AUDIT_TREE=y | 76 | CONFIG_AUDIT_TREE=y |
| 77 | |||
| 78 | # | ||
| 79 | # RCU Subsystem | ||
| 80 | # | ||
| 81 | # CONFIG_CLASSIC_RCU is not set | ||
| 82 | CONFIG_TREE_RCU=y | ||
| 83 | # CONFIG_PREEMPT_RCU is not set | ||
| 84 | # CONFIG_RCU_TRACE is not set | ||
| 85 | CONFIG_RCU_FANOUT=64 | ||
| 86 | # CONFIG_RCU_FANOUT_EXACT is not set | ||
| 87 | # CONFIG_TREE_RCU_TRACE is not set | ||
| 88 | # CONFIG_PREEMPT_RCU_TRACE is not set | ||
| 79 | # CONFIG_IKCONFIG is not set | 89 | # CONFIG_IKCONFIG is not set |
| 80 | CONFIG_LOG_BUF_SHIFT=18 | 90 | CONFIG_LOG_BUF_SHIFT=18 |
| 81 | CONFIG_CGROUPS=y | ||
| 82 | # CONFIG_CGROUP_DEBUG is not set | ||
| 83 | CONFIG_CGROUP_NS=y | ||
| 84 | # CONFIG_CGROUP_DEVICE is not set | ||
| 85 | CONFIG_CPUSETS=y | ||
| 86 | CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y | 91 | CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y |
| 87 | CONFIG_GROUP_SCHED=y | 92 | CONFIG_GROUP_SCHED=y |
| 88 | CONFIG_FAIR_GROUP_SCHED=y | 93 | CONFIG_FAIR_GROUP_SCHED=y |
| 89 | # CONFIG_RT_GROUP_SCHED is not set | 94 | # CONFIG_RT_GROUP_SCHED is not set |
| 90 | # CONFIG_USER_SCHED is not set | 95 | # CONFIG_USER_SCHED is not set |
| 91 | CONFIG_CGROUP_SCHED=y | 96 | CONFIG_CGROUP_SCHED=y |
| 97 | CONFIG_CGROUPS=y | ||
| 98 | # CONFIG_CGROUP_DEBUG is not set | ||
| 99 | CONFIG_CGROUP_NS=y | ||
| 100 | CONFIG_CGROUP_FREEZER=y | ||
| 101 | # CONFIG_CGROUP_DEVICE is not set | ||
| 102 | CONFIG_CPUSETS=y | ||
| 103 | CONFIG_PROC_PID_CPUSET=y | ||
| 92 | CONFIG_CGROUP_CPUACCT=y | 104 | CONFIG_CGROUP_CPUACCT=y |
| 93 | CONFIG_RESOURCE_COUNTERS=y | 105 | CONFIG_RESOURCE_COUNTERS=y |
| 94 | # CONFIG_CGROUP_MEM_RES_CTLR is not set | 106 | # CONFIG_CGROUP_MEM_RES_CTLR is not set |
| 95 | # CONFIG_SYSFS_DEPRECATED_V2 is not set | 107 | # CONFIG_SYSFS_DEPRECATED_V2 is not set |
| 96 | CONFIG_PROC_PID_CPUSET=y | ||
| 97 | CONFIG_RELAY=y | 108 | CONFIG_RELAY=y |
| 98 | CONFIG_NAMESPACES=y | 109 | CONFIG_NAMESPACES=y |
| 99 | CONFIG_UTS_NS=y | 110 | CONFIG_UTS_NS=y |
| 100 | CONFIG_IPC_NS=y | 111 | CONFIG_IPC_NS=y |
| 101 | CONFIG_USER_NS=y | 112 | CONFIG_USER_NS=y |
| 102 | CONFIG_PID_NS=y | 113 | CONFIG_PID_NS=y |
| 114 | CONFIG_NET_NS=y | ||
| 103 | CONFIG_BLK_DEV_INITRD=y | 115 | CONFIG_BLK_DEV_INITRD=y |
| 104 | CONFIG_INITRAMFS_SOURCE="" | 116 | CONFIG_INITRAMFS_SOURCE="" |
| 105 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | 117 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y |
| @@ -124,12 +136,15 @@ CONFIG_SIGNALFD=y | |||
| 124 | CONFIG_TIMERFD=y | 136 | CONFIG_TIMERFD=y |
| 125 | CONFIG_EVENTFD=y | 137 | CONFIG_EVENTFD=y |
| 126 | CONFIG_SHMEM=y | 138 | CONFIG_SHMEM=y |
| 139 | CONFIG_AIO=y | ||
| 127 | CONFIG_VM_EVENT_COUNTERS=y | 140 | CONFIG_VM_EVENT_COUNTERS=y |
| 141 | CONFIG_PCI_QUIRKS=y | ||
| 128 | CONFIG_SLUB_DEBUG=y | 142 | CONFIG_SLUB_DEBUG=y |
| 129 | # CONFIG_SLAB is not set | 143 | # CONFIG_SLAB is not set |
| 130 | CONFIG_SLUB=y | 144 | CONFIG_SLUB=y |
| 131 | # CONFIG_SLOB is not set | 145 | # CONFIG_SLOB is not set |
| 132 | CONFIG_PROFILING=y | 146 | CONFIG_PROFILING=y |
| 147 | CONFIG_TRACEPOINTS=y | ||
| 133 | CONFIG_MARKERS=y | 148 | CONFIG_MARKERS=y |
| 134 | # CONFIG_OPROFILE is not set | 149 | # CONFIG_OPROFILE is not set |
| 135 | CONFIG_HAVE_OPROFILE=y | 150 | CONFIG_HAVE_OPROFILE=y |
| @@ -139,15 +154,10 @@ CONFIG_KRETPROBES=y | |||
| 139 | CONFIG_HAVE_IOREMAP_PROT=y | 154 | CONFIG_HAVE_IOREMAP_PROT=y |
| 140 | CONFIG_HAVE_KPROBES=y | 155 | CONFIG_HAVE_KPROBES=y |
| 141 | CONFIG_HAVE_KRETPROBES=y | 156 | CONFIG_HAVE_KRETPROBES=y |
| 142 | # CONFIG_HAVE_ARCH_TRACEHOOK is not set | 157 | CONFIG_HAVE_ARCH_TRACEHOOK=y |
| 143 | # CONFIG_HAVE_DMA_ATTRS is not set | ||
| 144 | CONFIG_USE_GENERIC_SMP_HELPERS=y | ||
| 145 | # CONFIG_HAVE_CLK is not set | ||
| 146 | CONFIG_PROC_PAGE_MONITOR=y | ||
| 147 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | 158 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set |
| 148 | CONFIG_SLABINFO=y | 159 | CONFIG_SLABINFO=y |
| 149 | CONFIG_RT_MUTEXES=y | 160 | CONFIG_RT_MUTEXES=y |
| 150 | # CONFIG_TINY_SHMEM is not set | ||
| 151 | CONFIG_BASE_SMALL=0 | 161 | CONFIG_BASE_SMALL=0 |
| 152 | CONFIG_MODULES=y | 162 | CONFIG_MODULES=y |
| 153 | # CONFIG_MODULE_FORCE_LOAD is not set | 163 | # CONFIG_MODULE_FORCE_LOAD is not set |
| @@ -155,7 +165,6 @@ CONFIG_MODULE_UNLOAD=y | |||
| 155 | CONFIG_MODULE_FORCE_UNLOAD=y | 165 | CONFIG_MODULE_FORCE_UNLOAD=y |
| 156 | # CONFIG_MODVERSIONS is not set | 166 | # CONFIG_MODVERSIONS is not set |
| 157 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 167 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
| 158 | CONFIG_KMOD=y | ||
| 159 | CONFIG_STOP_MACHINE=y | 168 | CONFIG_STOP_MACHINE=y |
| 160 | CONFIG_BLOCK=y | 169 | CONFIG_BLOCK=y |
| 161 | CONFIG_BLK_DEV_IO_TRACE=y | 170 | CONFIG_BLK_DEV_IO_TRACE=y |
| @@ -175,7 +184,7 @@ CONFIG_IOSCHED_CFQ=y | |||
| 175 | CONFIG_DEFAULT_CFQ=y | 184 | CONFIG_DEFAULT_CFQ=y |
| 176 | # CONFIG_DEFAULT_NOOP is not set | 185 | # CONFIG_DEFAULT_NOOP is not set |
| 177 | CONFIG_DEFAULT_IOSCHED="cfq" | 186 | CONFIG_DEFAULT_IOSCHED="cfq" |
| 178 | CONFIG_CLASSIC_RCU=y | 187 | CONFIG_FREEZER=y |
| 179 | 188 | ||
| 180 | # | 189 | # |
| 181 | # Processor type and features | 190 | # Processor type and features |
| @@ -185,13 +194,15 @@ CONFIG_NO_HZ=y | |||
| 185 | CONFIG_HIGH_RES_TIMERS=y | 194 | CONFIG_HIGH_RES_TIMERS=y |
| 186 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | 195 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y |
| 187 | CONFIG_SMP=y | 196 | CONFIG_SMP=y |
| 197 | CONFIG_SPARSE_IRQ=y | ||
| 198 | # CONFIG_NUMA_MIGRATE_IRQ_DESC is not set | ||
| 188 | CONFIG_X86_FIND_SMP_CONFIG=y | 199 | CONFIG_X86_FIND_SMP_CONFIG=y |
| 189 | CONFIG_X86_MPPARSE=y | 200 | CONFIG_X86_MPPARSE=y |
| 190 | CONFIG_X86_PC=y | ||
| 191 | # CONFIG_X86_ELAN is not set | 201 | # CONFIG_X86_ELAN is not set |
| 192 | # CONFIG_X86_VOYAGER is not set | 202 | # CONFIG_X86_VOYAGER is not set |
| 193 | # CONFIG_X86_GENERICARCH is not set | 203 | # CONFIG_X86_GENERICARCH is not set |
| 194 | # CONFIG_X86_VSMP is not set | 204 | # CONFIG_X86_VSMP is not set |
| 205 | CONFIG_SCHED_OMIT_FRAME_POINTER=y | ||
| 195 | # CONFIG_PARAVIRT_GUEST is not set | 206 | # CONFIG_PARAVIRT_GUEST is not set |
| 196 | # CONFIG_MEMTEST is not set | 207 | # CONFIG_MEMTEST is not set |
| 197 | # CONFIG_M386 is not set | 208 | # CONFIG_M386 is not set |
| @@ -230,6 +241,11 @@ CONFIG_X86_CMPXCHG64=y | |||
| 230 | CONFIG_X86_CMOV=y | 241 | CONFIG_X86_CMOV=y |
| 231 | CONFIG_X86_MINIMUM_CPU_FAMILY=64 | 242 | CONFIG_X86_MINIMUM_CPU_FAMILY=64 |
| 232 | CONFIG_X86_DEBUGCTLMSR=y | 243 | CONFIG_X86_DEBUGCTLMSR=y |
| 244 | CONFIG_CPU_SUP_INTEL=y | ||
| 245 | CONFIG_CPU_SUP_AMD=y | ||
| 246 | CONFIG_CPU_SUP_CENTAUR_64=y | ||
| 247 | CONFIG_X86_DS=y | ||
| 248 | CONFIG_X86_PTRACE_BTS=y | ||
| 233 | CONFIG_HPET_TIMER=y | 249 | CONFIG_HPET_TIMER=y |
| 234 | CONFIG_HPET_EMULATE_RTC=y | 250 | CONFIG_HPET_EMULATE_RTC=y |
| 235 | CONFIG_DMI=y | 251 | CONFIG_DMI=y |
| @@ -237,8 +253,11 @@ CONFIG_GART_IOMMU=y | |||
| 237 | CONFIG_CALGARY_IOMMU=y | 253 | CONFIG_CALGARY_IOMMU=y |
| 238 | CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT=y | 254 | CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT=y |
| 239 | CONFIG_AMD_IOMMU=y | 255 | CONFIG_AMD_IOMMU=y |
| 256 | CONFIG_AMD_IOMMU_STATS=y | ||
| 240 | CONFIG_SWIOTLB=y | 257 | CONFIG_SWIOTLB=y |
| 241 | CONFIG_IOMMU_HELPER=y | 258 | CONFIG_IOMMU_HELPER=y |
| 259 | CONFIG_IOMMU_API=y | ||
| 260 | # CONFIG_MAXSMP is not set | ||
| 242 | CONFIG_NR_CPUS=64 | 261 | CONFIG_NR_CPUS=64 |
| 243 | CONFIG_SCHED_SMT=y | 262 | CONFIG_SCHED_SMT=y |
| 244 | CONFIG_SCHED_MC=y | 263 | CONFIG_SCHED_MC=y |
| @@ -247,12 +266,17 @@ CONFIG_PREEMPT_VOLUNTARY=y | |||
| 247 | # CONFIG_PREEMPT is not set | 266 | # CONFIG_PREEMPT is not set |
| 248 | CONFIG_X86_LOCAL_APIC=y | 267 | CONFIG_X86_LOCAL_APIC=y |
| 249 | CONFIG_X86_IO_APIC=y | 268 | CONFIG_X86_IO_APIC=y |
| 269 | CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y | ||
| 250 | # CONFIG_X86_MCE is not set | 270 | # CONFIG_X86_MCE is not set |
| 251 | # CONFIG_I8K is not set | 271 | # CONFIG_I8K is not set |
| 252 | CONFIG_MICROCODE=y | 272 | CONFIG_MICROCODE=y |
| 273 | CONFIG_MICROCODE_INTEL=y | ||
| 274 | CONFIG_MICROCODE_AMD=y | ||
| 253 | CONFIG_MICROCODE_OLD_INTERFACE=y | 275 | CONFIG_MICROCODE_OLD_INTERFACE=y |
| 254 | CONFIG_X86_MSR=y | 276 | CONFIG_X86_MSR=y |
| 255 | CONFIG_X86_CPUID=y | 277 | CONFIG_X86_CPUID=y |
| 278 | CONFIG_ARCH_PHYS_ADDR_T_64BIT=y | ||
| 279 | CONFIG_DIRECT_GBPAGES=y | ||
| 256 | CONFIG_NUMA=y | 280 | CONFIG_NUMA=y |
| 257 | CONFIG_K8_NUMA=y | 281 | CONFIG_K8_NUMA=y |
| 258 | CONFIG_X86_64_ACPI_NUMA=y | 282 | CONFIG_X86_64_ACPI_NUMA=y |
| @@ -269,7 +293,6 @@ CONFIG_SPARSEMEM_MANUAL=y | |||
| 269 | CONFIG_SPARSEMEM=y | 293 | CONFIG_SPARSEMEM=y |
| 270 | CONFIG_NEED_MULTIPLE_NODES=y | 294 | CONFIG_NEED_MULTIPLE_NODES=y |
| 271 | CONFIG_HAVE_MEMORY_PRESENT=y | 295 | CONFIG_HAVE_MEMORY_PRESENT=y |
| 272 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 273 | CONFIG_SPARSEMEM_EXTREME=y | 296 | CONFIG_SPARSEMEM_EXTREME=y |
| 274 | CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y | 297 | CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y |
| 275 | CONFIG_SPARSEMEM_VMEMMAP=y | 298 | CONFIG_SPARSEMEM_VMEMMAP=y |
| @@ -280,10 +303,14 @@ CONFIG_SPARSEMEM_VMEMMAP=y | |||
| 280 | CONFIG_PAGEFLAGS_EXTENDED=y | 303 | CONFIG_PAGEFLAGS_EXTENDED=y |
| 281 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 304 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
| 282 | CONFIG_MIGRATION=y | 305 | CONFIG_MIGRATION=y |
| 283 | CONFIG_RESOURCES_64BIT=y | 306 | CONFIG_PHYS_ADDR_T_64BIT=y |
| 284 | CONFIG_ZONE_DMA_FLAG=1 | 307 | CONFIG_ZONE_DMA_FLAG=1 |
| 285 | CONFIG_BOUNCE=y | 308 | CONFIG_BOUNCE=y |
| 286 | CONFIG_VIRT_TO_BUS=y | 309 | CONFIG_VIRT_TO_BUS=y |
| 310 | CONFIG_UNEVICTABLE_LRU=y | ||
| 311 | CONFIG_X86_CHECK_BIOS_CORRUPTION=y | ||
| 312 | CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y | ||
| 313 | CONFIG_X86_RESERVE_LOW_64K=y | ||
| 287 | CONFIG_MTRR=y | 314 | CONFIG_MTRR=y |
| 288 | # CONFIG_MTRR_SANITIZER is not set | 315 | # CONFIG_MTRR_SANITIZER is not set |
| 289 | CONFIG_X86_PAT=y | 316 | CONFIG_X86_PAT=y |
| @@ -302,11 +329,12 @@ CONFIG_PHYSICAL_START=0x1000000 | |||
| 302 | CONFIG_PHYSICAL_ALIGN=0x200000 | 329 | CONFIG_PHYSICAL_ALIGN=0x200000 |
| 303 | CONFIG_HOTPLUG_CPU=y | 330 | CONFIG_HOTPLUG_CPU=y |
| 304 | # CONFIG_COMPAT_VDSO is not set | 331 | # CONFIG_COMPAT_VDSO is not set |
| 332 | # CONFIG_CMDLINE_BOOL is not set | ||
| 305 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | 333 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y |
| 306 | CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y | 334 | CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y |
| 307 | 335 | ||
| 308 | # | 336 | # |
| 309 | # Power management options | 337 | # Power management and ACPI options |
| 310 | # | 338 | # |
| 311 | CONFIG_ARCH_HIBERNATION_HEADER=y | 339 | CONFIG_ARCH_HIBERNATION_HEADER=y |
| 312 | CONFIG_PM=y | 340 | CONFIG_PM=y |
| @@ -333,20 +361,14 @@ CONFIG_ACPI_BATTERY=y | |||
| 333 | CONFIG_ACPI_BUTTON=y | 361 | CONFIG_ACPI_BUTTON=y |
| 334 | CONFIG_ACPI_FAN=y | 362 | CONFIG_ACPI_FAN=y |
| 335 | CONFIG_ACPI_DOCK=y | 363 | CONFIG_ACPI_DOCK=y |
| 336 | # CONFIG_ACPI_BAY is not set | ||
| 337 | CONFIG_ACPI_PROCESSOR=y | 364 | CONFIG_ACPI_PROCESSOR=y |
| 338 | CONFIG_ACPI_HOTPLUG_CPU=y | 365 | CONFIG_ACPI_HOTPLUG_CPU=y |
| 339 | CONFIG_ACPI_THERMAL=y | 366 | CONFIG_ACPI_THERMAL=y |
| 340 | CONFIG_ACPI_NUMA=y | 367 | CONFIG_ACPI_NUMA=y |
| 341 | # CONFIG_ACPI_WMI is not set | ||
| 342 | # CONFIG_ACPI_ASUS is not set | ||
| 343 | # CONFIG_ACPI_TOSHIBA is not set | ||
| 344 | # CONFIG_ACPI_CUSTOM_DSDT is not set | 368 | # CONFIG_ACPI_CUSTOM_DSDT is not set |
| 345 | CONFIG_ACPI_BLACKLIST_YEAR=0 | 369 | CONFIG_ACPI_BLACKLIST_YEAR=0 |
| 346 | # CONFIG_ACPI_DEBUG is not set | 370 | # CONFIG_ACPI_DEBUG is not set |
| 347 | CONFIG_ACPI_EC=y | ||
| 348 | # CONFIG_ACPI_PCI_SLOT is not set | 371 | # CONFIG_ACPI_PCI_SLOT is not set |
| 349 | CONFIG_ACPI_POWER=y | ||
| 350 | CONFIG_ACPI_SYSTEM=y | 372 | CONFIG_ACPI_SYSTEM=y |
| 351 | CONFIG_X86_PM_TIMER=y | 373 | CONFIG_X86_PM_TIMER=y |
| 352 | CONFIG_ACPI_CONTAINER=y | 374 | CONFIG_ACPI_CONTAINER=y |
| @@ -381,13 +403,17 @@ CONFIG_X86_ACPI_CPUFREQ=y | |||
| 381 | # | 403 | # |
| 382 | # shared options | 404 | # shared options |
| 383 | # | 405 | # |
| 384 | # CONFIG_X86_ACPI_CPUFREQ_PROC_INTF is not set | ||
| 385 | # CONFIG_X86_SPEEDSTEP_LIB is not set | 406 | # CONFIG_X86_SPEEDSTEP_LIB is not set |
| 386 | CONFIG_CPU_IDLE=y | 407 | CONFIG_CPU_IDLE=y |
| 387 | CONFIG_CPU_IDLE_GOV_LADDER=y | 408 | CONFIG_CPU_IDLE_GOV_LADDER=y |
| 388 | CONFIG_CPU_IDLE_GOV_MENU=y | 409 | CONFIG_CPU_IDLE_GOV_MENU=y |
| 389 | 410 | ||
| 390 | # | 411 | # |
| 412 | # Memory power savings | ||
| 413 | # | ||
| 414 | # CONFIG_I7300_IDLE is not set | ||
| 415 | |||
| 416 | # | ||
| 391 | # Bus options (PCI etc.) | 417 | # Bus options (PCI etc.) |
| 392 | # | 418 | # |
| 393 | CONFIG_PCI=y | 419 | CONFIG_PCI=y |
| @@ -395,8 +421,10 @@ CONFIG_PCI_DIRECT=y | |||
| 395 | CONFIG_PCI_MMCONFIG=y | 421 | CONFIG_PCI_MMCONFIG=y |
| 396 | CONFIG_PCI_DOMAINS=y | 422 | CONFIG_PCI_DOMAINS=y |
| 397 | CONFIG_DMAR=y | 423 | CONFIG_DMAR=y |
| 424 | # CONFIG_DMAR_DEFAULT_ON is not set | ||
| 398 | CONFIG_DMAR_GFX_WA=y | 425 | CONFIG_DMAR_GFX_WA=y |
| 399 | CONFIG_DMAR_FLOPPY_WA=y | 426 | CONFIG_DMAR_FLOPPY_WA=y |
| 427 | # CONFIG_INTR_REMAP is not set | ||
| 400 | CONFIG_PCIEPORTBUS=y | 428 | CONFIG_PCIEPORTBUS=y |
| 401 | # CONFIG_HOTPLUG_PCI_PCIE is not set | 429 | # CONFIG_HOTPLUG_PCI_PCIE is not set |
| 402 | CONFIG_PCIEAER=y | 430 | CONFIG_PCIEAER=y |
| @@ -405,6 +433,7 @@ CONFIG_ARCH_SUPPORTS_MSI=y | |||
| 405 | CONFIG_PCI_MSI=y | 433 | CONFIG_PCI_MSI=y |
| 406 | # CONFIG_PCI_LEGACY is not set | 434 | # CONFIG_PCI_LEGACY is not set |
| 407 | # CONFIG_PCI_DEBUG is not set | 435 | # CONFIG_PCI_DEBUG is not set |
| 436 | # CONFIG_PCI_STUB is not set | ||
| 408 | CONFIG_HT_IRQ=y | 437 | CONFIG_HT_IRQ=y |
| 409 | CONFIG_ISA_DMA_API=y | 438 | CONFIG_ISA_DMA_API=y |
| 410 | CONFIG_K8_NB=y | 439 | CONFIG_K8_NB=y |
| @@ -438,6 +467,8 @@ CONFIG_HOTPLUG_PCI=y | |||
| 438 | # | 467 | # |
| 439 | CONFIG_BINFMT_ELF=y | 468 | CONFIG_BINFMT_ELF=y |
| 440 | CONFIG_COMPAT_BINFMT_ELF=y | 469 | CONFIG_COMPAT_BINFMT_ELF=y |
| 470 | CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y | ||
| 471 | # CONFIG_HAVE_AOUT is not set | ||
| 441 | CONFIG_BINFMT_MISC=y | 472 | CONFIG_BINFMT_MISC=y |
| 442 | CONFIG_IA32_EMULATION=y | 473 | CONFIG_IA32_EMULATION=y |
| 443 | # CONFIG_IA32_AOUT is not set | 474 | # CONFIG_IA32_AOUT is not set |
| @@ -449,6 +480,7 @@ CONFIG_NET=y | |||
| 449 | # | 480 | # |
| 450 | # Networking options | 481 | # Networking options |
| 451 | # | 482 | # |
| 483 | CONFIG_COMPAT_NET_DEV_OPS=y | ||
| 452 | CONFIG_PACKET=y | 484 | CONFIG_PACKET=y |
| 453 | CONFIG_PACKET_MMAP=y | 485 | CONFIG_PACKET_MMAP=y |
| 454 | CONFIG_UNIX=y | 486 | CONFIG_UNIX=y |
| @@ -509,7 +541,6 @@ CONFIG_DEFAULT_CUBIC=y | |||
| 509 | # CONFIG_DEFAULT_RENO is not set | 541 | # CONFIG_DEFAULT_RENO is not set |
| 510 | CONFIG_DEFAULT_TCP_CONG="cubic" | 542 | CONFIG_DEFAULT_TCP_CONG="cubic" |
| 511 | CONFIG_TCP_MD5SIG=y | 543 | CONFIG_TCP_MD5SIG=y |
| 512 | # CONFIG_IP_VS is not set | ||
| 513 | CONFIG_IPV6=y | 544 | CONFIG_IPV6=y |
| 514 | # CONFIG_IPV6_PRIVACY is not set | 545 | # CONFIG_IPV6_PRIVACY is not set |
| 515 | # CONFIG_IPV6_ROUTER_PREF is not set | 546 | # CONFIG_IPV6_ROUTER_PREF is not set |
| @@ -547,19 +578,21 @@ CONFIG_NF_CONNTRACK_IRC=y | |||
| 547 | CONFIG_NF_CONNTRACK_SIP=y | 578 | CONFIG_NF_CONNTRACK_SIP=y |
| 548 | CONFIG_NF_CT_NETLINK=y | 579 | CONFIG_NF_CT_NETLINK=y |
| 549 | CONFIG_NETFILTER_XTABLES=y | 580 | CONFIG_NETFILTER_XTABLES=y |
| 581 | CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y | ||
| 550 | CONFIG_NETFILTER_XT_TARGET_MARK=y | 582 | CONFIG_NETFILTER_XT_TARGET_MARK=y |
| 551 | CONFIG_NETFILTER_XT_TARGET_NFLOG=y | 583 | CONFIG_NETFILTER_XT_TARGET_NFLOG=y |
| 552 | CONFIG_NETFILTER_XT_TARGET_SECMARK=y | 584 | CONFIG_NETFILTER_XT_TARGET_SECMARK=y |
| 553 | CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y | ||
| 554 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=y | 585 | CONFIG_NETFILTER_XT_TARGET_TCPMSS=y |
| 555 | CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y | 586 | CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y |
| 556 | CONFIG_NETFILTER_XT_MATCH_MARK=y | 587 | CONFIG_NETFILTER_XT_MATCH_MARK=y |
| 557 | CONFIG_NETFILTER_XT_MATCH_POLICY=y | 588 | CONFIG_NETFILTER_XT_MATCH_POLICY=y |
| 558 | CONFIG_NETFILTER_XT_MATCH_STATE=y | 589 | CONFIG_NETFILTER_XT_MATCH_STATE=y |
| 590 | # CONFIG_IP_VS is not set | ||
| 559 | 591 | ||
| 560 | # | 592 | # |
| 561 | # IP: Netfilter Configuration | 593 | # IP: Netfilter Configuration |
| 562 | # | 594 | # |
| 595 | CONFIG_NF_DEFRAG_IPV4=y | ||
| 563 | CONFIG_NF_CONNTRACK_IPV4=y | 596 | CONFIG_NF_CONNTRACK_IPV4=y |
| 564 | CONFIG_NF_CONNTRACK_PROC_COMPAT=y | 597 | CONFIG_NF_CONNTRACK_PROC_COMPAT=y |
| 565 | CONFIG_IP_NF_IPTABLES=y | 598 | CONFIG_IP_NF_IPTABLES=y |
| @@ -585,8 +618,8 @@ CONFIG_IP_NF_MANGLE=y | |||
| 585 | CONFIG_NF_CONNTRACK_IPV6=y | 618 | CONFIG_NF_CONNTRACK_IPV6=y |
| 586 | CONFIG_IP6_NF_IPTABLES=y | 619 | CONFIG_IP6_NF_IPTABLES=y |
| 587 | CONFIG_IP6_NF_MATCH_IPV6HEADER=y | 620 | CONFIG_IP6_NF_MATCH_IPV6HEADER=y |
| 588 | CONFIG_IP6_NF_FILTER=y | ||
| 589 | CONFIG_IP6_NF_TARGET_LOG=y | 621 | CONFIG_IP6_NF_TARGET_LOG=y |
| 622 | CONFIG_IP6_NF_FILTER=y | ||
| 590 | CONFIG_IP6_NF_TARGET_REJECT=y | 623 | CONFIG_IP6_NF_TARGET_REJECT=y |
| 591 | CONFIG_IP6_NF_MANGLE=y | 624 | CONFIG_IP6_NF_MANGLE=y |
| 592 | # CONFIG_IP_DCCP is not set | 625 | # CONFIG_IP_DCCP is not set |
| @@ -594,6 +627,7 @@ CONFIG_IP6_NF_MANGLE=y | |||
| 594 | # CONFIG_TIPC is not set | 627 | # CONFIG_TIPC is not set |
| 595 | # CONFIG_ATM is not set | 628 | # CONFIG_ATM is not set |
| 596 | # CONFIG_BRIDGE is not set | 629 | # CONFIG_BRIDGE is not set |
| 630 | # CONFIG_NET_DSA is not set | ||
| 597 | # CONFIG_VLAN_8021Q is not set | 631 | # CONFIG_VLAN_8021Q is not set |
| 598 | # CONFIG_DECNET is not set | 632 | # CONFIG_DECNET is not set |
| 599 | CONFIG_LLC=y | 633 | CONFIG_LLC=y |
| @@ -613,6 +647,7 @@ CONFIG_NET_SCHED=y | |||
| 613 | # CONFIG_NET_SCH_HTB is not set | 647 | # CONFIG_NET_SCH_HTB is not set |
| 614 | # CONFIG_NET_SCH_HFSC is not set | 648 | # CONFIG_NET_SCH_HFSC is not set |
| 615 | # CONFIG_NET_SCH_PRIO is not set | 649 | # CONFIG_NET_SCH_PRIO is not set |
| 650 | # CONFIG_NET_SCH_MULTIQ is not set | ||
| 616 | # CONFIG_NET_SCH_RED is not set | 651 | # CONFIG_NET_SCH_RED is not set |
| 617 | # CONFIG_NET_SCH_SFQ is not set | 652 | # CONFIG_NET_SCH_SFQ is not set |
| 618 | # CONFIG_NET_SCH_TEQL is not set | 653 | # CONFIG_NET_SCH_TEQL is not set |
| @@ -620,6 +655,7 @@ CONFIG_NET_SCHED=y | |||
| 620 | # CONFIG_NET_SCH_GRED is not set | 655 | # CONFIG_NET_SCH_GRED is not set |
| 621 | # CONFIG_NET_SCH_DSMARK is not set | 656 | # CONFIG_NET_SCH_DSMARK is not set |
| 622 | # CONFIG_NET_SCH_NETEM is not set | 657 | # CONFIG_NET_SCH_NETEM is not set |
| 658 | # CONFIG_NET_SCH_DRR is not set | ||
| 623 | # CONFIG_NET_SCH_INGRESS is not set | 659 | # CONFIG_NET_SCH_INGRESS is not set |
| 624 | 660 | ||
| 625 | # | 661 | # |
| @@ -634,6 +670,7 @@ CONFIG_NET_CLS=y | |||
| 634 | # CONFIG_NET_CLS_RSVP is not set | 670 | # CONFIG_NET_CLS_RSVP is not set |
| 635 | # CONFIG_NET_CLS_RSVP6 is not set | 671 | # CONFIG_NET_CLS_RSVP6 is not set |
| 636 | # CONFIG_NET_CLS_FLOW is not set | 672 | # CONFIG_NET_CLS_FLOW is not set |
| 673 | # CONFIG_NET_CLS_CGROUP is not set | ||
| 637 | CONFIG_NET_EMATCH=y | 674 | CONFIG_NET_EMATCH=y |
| 638 | CONFIG_NET_EMATCH_STACK=32 | 675 | CONFIG_NET_EMATCH_STACK=32 |
| 639 | # CONFIG_NET_EMATCH_CMP is not set | 676 | # CONFIG_NET_EMATCH_CMP is not set |
| @@ -649,7 +686,9 @@ CONFIG_NET_CLS_ACT=y | |||
| 649 | # CONFIG_NET_ACT_NAT is not set | 686 | # CONFIG_NET_ACT_NAT is not set |
| 650 | # CONFIG_NET_ACT_PEDIT is not set | 687 | # CONFIG_NET_ACT_PEDIT is not set |
| 651 | # CONFIG_NET_ACT_SIMP is not set | 688 | # CONFIG_NET_ACT_SIMP is not set |
| 689 | # CONFIG_NET_ACT_SKBEDIT is not set | ||
| 652 | CONFIG_NET_SCH_FIFO=y | 690 | CONFIG_NET_SCH_FIFO=y |
| 691 | # CONFIG_DCB is not set | ||
| 653 | 692 | ||
| 654 | # | 693 | # |
| 655 | # Network testing | 694 | # Network testing |
| @@ -666,29 +705,33 @@ CONFIG_HAMRADIO=y | |||
| 666 | # CONFIG_IRDA is not set | 705 | # CONFIG_IRDA is not set |
| 667 | # CONFIG_BT is not set | 706 | # CONFIG_BT is not set |
| 668 | # CONFIG_AF_RXRPC is not set | 707 | # CONFIG_AF_RXRPC is not set |
| 708 | # CONFIG_PHONET is not set | ||
| 669 | CONFIG_FIB_RULES=y | 709 | CONFIG_FIB_RULES=y |
| 670 | 710 | CONFIG_WIRELESS=y | |
| 671 | # | ||
| 672 | # Wireless | ||
| 673 | # | ||
| 674 | CONFIG_CFG80211=y | 711 | CONFIG_CFG80211=y |
| 712 | # CONFIG_CFG80211_REG_DEBUG is not set | ||
| 675 | CONFIG_NL80211=y | 713 | CONFIG_NL80211=y |
| 714 | CONFIG_WIRELESS_OLD_REGULATORY=y | ||
| 676 | CONFIG_WIRELESS_EXT=y | 715 | CONFIG_WIRELESS_EXT=y |
| 677 | CONFIG_WIRELESS_EXT_SYSFS=y | 716 | CONFIG_WIRELESS_EXT_SYSFS=y |
| 717 | # CONFIG_LIB80211 is not set | ||
| 678 | CONFIG_MAC80211=y | 718 | CONFIG_MAC80211=y |
| 679 | 719 | ||
| 680 | # | 720 | # |
| 681 | # Rate control algorithm selection | 721 | # Rate control algorithm selection |
| 682 | # | 722 | # |
| 683 | CONFIG_MAC80211_RC_PID=y | 723 | CONFIG_MAC80211_RC_MINSTREL=y |
| 684 | CONFIG_MAC80211_RC_DEFAULT_PID=y | 724 | # CONFIG_MAC80211_RC_DEFAULT_PID is not set |
| 685 | CONFIG_MAC80211_RC_DEFAULT="pid" | 725 | CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y |
| 726 | CONFIG_MAC80211_RC_DEFAULT="minstrel" | ||
| 686 | # CONFIG_MAC80211_MESH is not set | 727 | # CONFIG_MAC80211_MESH is not set |
| 687 | CONFIG_MAC80211_LEDS=y | 728 | CONFIG_MAC80211_LEDS=y |
| 688 | # CONFIG_MAC80211_DEBUGFS is not set | 729 | # CONFIG_MAC80211_DEBUGFS is not set |
| 689 | # CONFIG_MAC80211_DEBUG_MENU is not set | 730 | # CONFIG_MAC80211_DEBUG_MENU is not set |
| 690 | # CONFIG_IEEE80211 is not set | 731 | # CONFIG_WIMAX is not set |
| 691 | # CONFIG_RFKILL is not set | 732 | CONFIG_RFKILL=y |
| 733 | # CONFIG_RFKILL_INPUT is not set | ||
| 734 | CONFIG_RFKILL_LEDS=y | ||
| 692 | # CONFIG_NET_9P is not set | 735 | # CONFIG_NET_9P is not set |
| 693 | 736 | ||
| 694 | # | 737 | # |
| @@ -712,7 +755,7 @@ CONFIG_PROC_EVENTS=y | |||
| 712 | # CONFIG_MTD is not set | 755 | # CONFIG_MTD is not set |
| 713 | # CONFIG_PARPORT is not set | 756 | # CONFIG_PARPORT is not set |
| 714 | CONFIG_PNP=y | 757 | CONFIG_PNP=y |
| 715 | # CONFIG_PNP_DEBUG is not set | 758 | CONFIG_PNP_DEBUG_MESSAGES=y |
| 716 | 759 | ||
| 717 | # | 760 | # |
| 718 | # Protocols | 761 | # Protocols |
| @@ -740,21 +783,21 @@ CONFIG_BLK_DEV_RAM_SIZE=16384 | |||
| 740 | CONFIG_MISC_DEVICES=y | 783 | CONFIG_MISC_DEVICES=y |
| 741 | # CONFIG_IBM_ASM is not set | 784 | # CONFIG_IBM_ASM is not set |
| 742 | # CONFIG_PHANTOM is not set | 785 | # CONFIG_PHANTOM is not set |
| 743 | # CONFIG_EEPROM_93CX6 is not set | ||
| 744 | # CONFIG_SGI_IOC4 is not set | 786 | # CONFIG_SGI_IOC4 is not set |
| 745 | # CONFIG_TIFM_CORE is not set | 787 | # CONFIG_TIFM_CORE is not set |
| 746 | # CONFIG_ACER_WMI is not set | 788 | # CONFIG_ICS932S401 is not set |
| 747 | # CONFIG_ASUS_LAPTOP is not set | ||
| 748 | # CONFIG_FUJITSU_LAPTOP is not set | ||
| 749 | # CONFIG_MSI_LAPTOP is not set | ||
| 750 | # CONFIG_COMPAL_LAPTOP is not set | ||
| 751 | # CONFIG_SONY_LAPTOP is not set | ||
| 752 | # CONFIG_THINKPAD_ACPI is not set | ||
| 753 | # CONFIG_INTEL_MENLOW is not set | ||
| 754 | # CONFIG_ENCLOSURE_SERVICES is not set | 789 | # CONFIG_ENCLOSURE_SERVICES is not set |
| 755 | # CONFIG_SGI_XP is not set | 790 | # CONFIG_SGI_XP is not set |
| 756 | # CONFIG_HP_ILO is not set | 791 | # CONFIG_HP_ILO is not set |
| 757 | # CONFIG_SGI_GRU is not set | 792 | # CONFIG_SGI_GRU is not set |
| 793 | # CONFIG_C2PORT is not set | ||
| 794 | |||
| 795 | # | ||
| 796 | # EEPROM support | ||
| 797 | # | ||
| 798 | # CONFIG_EEPROM_AT24 is not set | ||
| 799 | # CONFIG_EEPROM_LEGACY is not set | ||
| 800 | # CONFIG_EEPROM_93CX6 is not set | ||
| 758 | CONFIG_HAVE_IDE=y | 801 | CONFIG_HAVE_IDE=y |
| 759 | # CONFIG_IDE is not set | 802 | # CONFIG_IDE is not set |
| 760 | 803 | ||
| @@ -793,7 +836,7 @@ CONFIG_SCSI_WAIT_SCAN=m | |||
| 793 | # | 836 | # |
| 794 | CONFIG_SCSI_SPI_ATTRS=y | 837 | CONFIG_SCSI_SPI_ATTRS=y |
| 795 | # CONFIG_SCSI_FC_ATTRS is not set | 838 | # CONFIG_SCSI_FC_ATTRS is not set |
| 796 | CONFIG_SCSI_ISCSI_ATTRS=y | 839 | # CONFIG_SCSI_ISCSI_ATTRS is not set |
| 797 | # CONFIG_SCSI_SAS_ATTRS is not set | 840 | # CONFIG_SCSI_SAS_ATTRS is not set |
| 798 | # CONFIG_SCSI_SAS_LIBSAS is not set | 841 | # CONFIG_SCSI_SAS_LIBSAS is not set |
| 799 | # CONFIG_SCSI_SRP_ATTRS is not set | 842 | # CONFIG_SCSI_SRP_ATTRS is not set |
| @@ -864,6 +907,7 @@ CONFIG_PATA_OLDPIIX=y | |||
| 864 | CONFIG_PATA_SCH=y | 907 | CONFIG_PATA_SCH=y |
| 865 | CONFIG_MD=y | 908 | CONFIG_MD=y |
| 866 | CONFIG_BLK_DEV_MD=y | 909 | CONFIG_BLK_DEV_MD=y |
| 910 | CONFIG_MD_AUTODETECT=y | ||
| 867 | # CONFIG_MD_LINEAR is not set | 911 | # CONFIG_MD_LINEAR is not set |
| 868 | # CONFIG_MD_RAID0 is not set | 912 | # CONFIG_MD_RAID0 is not set |
| 869 | # CONFIG_MD_RAID1 is not set | 913 | # CONFIG_MD_RAID1 is not set |
| @@ -919,6 +963,9 @@ CONFIG_PHYLIB=y | |||
| 919 | # CONFIG_BROADCOM_PHY is not set | 963 | # CONFIG_BROADCOM_PHY is not set |
| 920 | # CONFIG_ICPLUS_PHY is not set | 964 | # CONFIG_ICPLUS_PHY is not set |
| 921 | # CONFIG_REALTEK_PHY is not set | 965 | # CONFIG_REALTEK_PHY is not set |
| 966 | # CONFIG_NATIONAL_PHY is not set | ||
| 967 | # CONFIG_STE10XP is not set | ||
| 968 | # CONFIG_LSI_ET1011C_PHY is not set | ||
| 922 | # CONFIG_FIXED_PHY is not set | 969 | # CONFIG_FIXED_PHY is not set |
| 923 | # CONFIG_MDIO_BITBANG is not set | 970 | # CONFIG_MDIO_BITBANG is not set |
| 924 | CONFIG_NET_ETHERNET=y | 971 | CONFIG_NET_ETHERNET=y |
| @@ -942,6 +989,9 @@ CONFIG_NET_TULIP=y | |||
| 942 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | 989 | # CONFIG_IBM_NEW_EMAC_RGMII is not set |
| 943 | # CONFIG_IBM_NEW_EMAC_TAH is not set | 990 | # CONFIG_IBM_NEW_EMAC_TAH is not set |
| 944 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | 991 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set |
| 992 | # CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set | ||
| 993 | # CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set | ||
| 994 | # CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set | ||
| 945 | CONFIG_NET_PCI=y | 995 | CONFIG_NET_PCI=y |
| 946 | # CONFIG_PCNET32 is not set | 996 | # CONFIG_PCNET32 is not set |
| 947 | # CONFIG_AMD8111_ETH is not set | 997 | # CONFIG_AMD8111_ETH is not set |
| @@ -949,7 +999,6 @@ CONFIG_NET_PCI=y | |||
| 949 | # CONFIG_B44 is not set | 999 | # CONFIG_B44 is not set |
| 950 | CONFIG_FORCEDETH=y | 1000 | CONFIG_FORCEDETH=y |
| 951 | # CONFIG_FORCEDETH_NAPI is not set | 1001 | # CONFIG_FORCEDETH_NAPI is not set |
| 952 | # CONFIG_EEPRO100 is not set | ||
| 953 | CONFIG_E100=y | 1002 | CONFIG_E100=y |
| 954 | # CONFIG_FEALNX is not set | 1003 | # CONFIG_FEALNX is not set |
| 955 | # CONFIG_NATSEMI is not set | 1004 | # CONFIG_NATSEMI is not set |
| @@ -963,15 +1012,16 @@ CONFIG_8139TOO_PIO=y | |||
| 963 | # CONFIG_R6040 is not set | 1012 | # CONFIG_R6040 is not set |
| 964 | # CONFIG_SIS900 is not set | 1013 | # CONFIG_SIS900 is not set |
| 965 | # CONFIG_EPIC100 is not set | 1014 | # CONFIG_EPIC100 is not set |
| 1015 | # CONFIG_SMSC9420 is not set | ||
| 966 | # CONFIG_SUNDANCE is not set | 1016 | # CONFIG_SUNDANCE is not set |
| 967 | # CONFIG_TLAN is not set | 1017 | # CONFIG_TLAN is not set |
| 968 | # CONFIG_VIA_RHINE is not set | 1018 | # CONFIG_VIA_RHINE is not set |
| 969 | # CONFIG_SC92031 is not set | 1019 | # CONFIG_SC92031 is not set |
| 1020 | # CONFIG_ATL2 is not set | ||
| 970 | CONFIG_NETDEV_1000=y | 1021 | CONFIG_NETDEV_1000=y |
| 971 | # CONFIG_ACENIC is not set | 1022 | # CONFIG_ACENIC is not set |
| 972 | # CONFIG_DL2K is not set | 1023 | # CONFIG_DL2K is not set |
| 973 | CONFIG_E1000=y | 1024 | CONFIG_E1000=y |
| 974 | # CONFIG_E1000_DISABLE_PACKET_SPLIT is not set | ||
| 975 | # CONFIG_E1000E is not set | 1025 | # CONFIG_E1000E is not set |
| 976 | # CONFIG_IP1000 is not set | 1026 | # CONFIG_IP1000 is not set |
| 977 | # CONFIG_IGB is not set | 1027 | # CONFIG_IGB is not set |
| @@ -989,18 +1039,23 @@ CONFIG_TIGON3=y | |||
| 989 | # CONFIG_QLA3XXX is not set | 1039 | # CONFIG_QLA3XXX is not set |
| 990 | # CONFIG_ATL1 is not set | 1040 | # CONFIG_ATL1 is not set |
| 991 | # CONFIG_ATL1E is not set | 1041 | # CONFIG_ATL1E is not set |
| 1042 | # CONFIG_JME is not set | ||
| 992 | CONFIG_NETDEV_10000=y | 1043 | CONFIG_NETDEV_10000=y |
| 993 | # CONFIG_CHELSIO_T1 is not set | 1044 | # CONFIG_CHELSIO_T1 is not set |
| 1045 | CONFIG_CHELSIO_T3_DEPENDS=y | ||
| 994 | # CONFIG_CHELSIO_T3 is not set | 1046 | # CONFIG_CHELSIO_T3 is not set |
| 1047 | # CONFIG_ENIC is not set | ||
| 995 | # CONFIG_IXGBE is not set | 1048 | # CONFIG_IXGBE is not set |
| 996 | # CONFIG_IXGB is not set | 1049 | # CONFIG_IXGB is not set |
| 997 | # CONFIG_S2IO is not set | 1050 | # CONFIG_S2IO is not set |
| 998 | # CONFIG_MYRI10GE is not set | 1051 | # CONFIG_MYRI10GE is not set |
| 999 | # CONFIG_NETXEN_NIC is not set | 1052 | # CONFIG_NETXEN_NIC is not set |
| 1000 | # CONFIG_NIU is not set | 1053 | # CONFIG_NIU is not set |
| 1054 | # CONFIG_MLX4_EN is not set | ||
| 1001 | # CONFIG_MLX4_CORE is not set | 1055 | # CONFIG_MLX4_CORE is not set |
| 1002 | # CONFIG_TEHUTI is not set | 1056 | # CONFIG_TEHUTI is not set |
| 1003 | # CONFIG_BNX2X is not set | 1057 | # CONFIG_BNX2X is not set |
| 1058 | # CONFIG_QLGE is not set | ||
| 1004 | # CONFIG_SFC is not set | 1059 | # CONFIG_SFC is not set |
| 1005 | CONFIG_TR=y | 1060 | CONFIG_TR=y |
| 1006 | # CONFIG_IBMOL is not set | 1061 | # CONFIG_IBMOL is not set |
| @@ -1013,9 +1068,8 @@ CONFIG_TR=y | |||
| 1013 | # CONFIG_WLAN_PRE80211 is not set | 1068 | # CONFIG_WLAN_PRE80211 is not set |
| 1014 | CONFIG_WLAN_80211=y | 1069 | CONFIG_WLAN_80211=y |
| 1015 | # CONFIG_PCMCIA_RAYCS is not set | 1070 | # CONFIG_PCMCIA_RAYCS is not set |
| 1016 | # CONFIG_IPW2100 is not set | ||
| 1017 | # CONFIG_IPW2200 is not set | ||
| 1018 | # CONFIG_LIBERTAS is not set | 1071 | # CONFIG_LIBERTAS is not set |
| 1072 | # CONFIG_LIBERTAS_THINFIRM is not set | ||
| 1019 | # CONFIG_AIRO is not set | 1073 | # CONFIG_AIRO is not set |
| 1020 | # CONFIG_HERMES is not set | 1074 | # CONFIG_HERMES is not set |
| 1021 | # CONFIG_ATMEL is not set | 1075 | # CONFIG_ATMEL is not set |
| @@ -1032,6 +1086,8 @@ CONFIG_WLAN_80211=y | |||
| 1032 | CONFIG_ATH5K=y | 1086 | CONFIG_ATH5K=y |
| 1033 | # CONFIG_ATH5K_DEBUG is not set | 1087 | # CONFIG_ATH5K_DEBUG is not set |
| 1034 | # CONFIG_ATH9K is not set | 1088 | # CONFIG_ATH9K is not set |
| 1089 | # CONFIG_IPW2100 is not set | ||
| 1090 | # CONFIG_IPW2200 is not set | ||
| 1035 | # CONFIG_IWLCORE is not set | 1091 | # CONFIG_IWLCORE is not set |
| 1036 | # CONFIG_IWLWIFI_LEDS is not set | 1092 | # CONFIG_IWLWIFI_LEDS is not set |
| 1037 | # CONFIG_IWLAGN is not set | 1093 | # CONFIG_IWLAGN is not set |
| @@ -1043,6 +1099,10 @@ CONFIG_ATH5K=y | |||
| 1043 | # CONFIG_RT2X00 is not set | 1099 | # CONFIG_RT2X00 is not set |
| 1044 | 1100 | ||
| 1045 | # | 1101 | # |
| 1102 | # Enable WiMAX (Networking options) to see the WiMAX drivers | ||
| 1103 | # | ||
| 1104 | |||
| 1105 | # | ||
| 1046 | # USB Network Adapters | 1106 | # USB Network Adapters |
| 1047 | # | 1107 | # |
| 1048 | # CONFIG_USB_CATC is not set | 1108 | # CONFIG_USB_CATC is not set |
| @@ -1050,6 +1110,7 @@ CONFIG_ATH5K=y | |||
| 1050 | # CONFIG_USB_PEGASUS is not set | 1110 | # CONFIG_USB_PEGASUS is not set |
| 1051 | # CONFIG_USB_RTL8150 is not set | 1111 | # CONFIG_USB_RTL8150 is not set |
| 1052 | # CONFIG_USB_USBNET is not set | 1112 | # CONFIG_USB_USBNET is not set |
| 1113 | # CONFIG_USB_HSO is not set | ||
| 1053 | CONFIG_NET_PCMCIA=y | 1114 | CONFIG_NET_PCMCIA=y |
| 1054 | # CONFIG_PCMCIA_3C589 is not set | 1115 | # CONFIG_PCMCIA_3C589 is not set |
| 1055 | # CONFIG_PCMCIA_3C574 is not set | 1116 | # CONFIG_PCMCIA_3C574 is not set |
| @@ -1059,6 +1120,7 @@ CONFIG_NET_PCMCIA=y | |||
| 1059 | # CONFIG_PCMCIA_SMC91C92 is not set | 1120 | # CONFIG_PCMCIA_SMC91C92 is not set |
| 1060 | # CONFIG_PCMCIA_XIRC2PS is not set | 1121 | # CONFIG_PCMCIA_XIRC2PS is not set |
| 1061 | # CONFIG_PCMCIA_AXNET is not set | 1122 | # CONFIG_PCMCIA_AXNET is not set |
| 1123 | # CONFIG_PCMCIA_IBMTR is not set | ||
| 1062 | # CONFIG_WAN is not set | 1124 | # CONFIG_WAN is not set |
| 1063 | CONFIG_FDDI=y | 1125 | CONFIG_FDDI=y |
| 1064 | # CONFIG_DEFXX is not set | 1126 | # CONFIG_DEFXX is not set |
| @@ -1110,6 +1172,7 @@ CONFIG_MOUSE_PS2_LOGIPS2PP=y | |||
| 1110 | CONFIG_MOUSE_PS2_SYNAPTICS=y | 1172 | CONFIG_MOUSE_PS2_SYNAPTICS=y |
| 1111 | CONFIG_MOUSE_PS2_LIFEBOOK=y | 1173 | CONFIG_MOUSE_PS2_LIFEBOOK=y |
| 1112 | CONFIG_MOUSE_PS2_TRACKPOINT=y | 1174 | CONFIG_MOUSE_PS2_TRACKPOINT=y |
| 1175 | # CONFIG_MOUSE_PS2_ELANTECH is not set | ||
| 1113 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set | 1176 | # CONFIG_MOUSE_PS2_TOUCHKIT is not set |
| 1114 | # CONFIG_MOUSE_SERIAL is not set | 1177 | # CONFIG_MOUSE_SERIAL is not set |
| 1115 | # CONFIG_MOUSE_APPLETOUCH is not set | 1178 | # CONFIG_MOUSE_APPLETOUCH is not set |
| @@ -1147,15 +1210,16 @@ CONFIG_INPUT_TOUCHSCREEN=y | |||
| 1147 | # CONFIG_TOUCHSCREEN_FUJITSU is not set | 1210 | # CONFIG_TOUCHSCREEN_FUJITSU is not set |
| 1148 | # CONFIG_TOUCHSCREEN_GUNZE is not set | 1211 | # CONFIG_TOUCHSCREEN_GUNZE is not set |
| 1149 | # CONFIG_TOUCHSCREEN_ELO is not set | 1212 | # CONFIG_TOUCHSCREEN_ELO is not set |
| 1213 | # CONFIG_TOUCHSCREEN_WACOM_W8001 is not set | ||
| 1150 | # CONFIG_TOUCHSCREEN_MTOUCH is not set | 1214 | # CONFIG_TOUCHSCREEN_MTOUCH is not set |
| 1151 | # CONFIG_TOUCHSCREEN_INEXIO is not set | 1215 | # CONFIG_TOUCHSCREEN_INEXIO is not set |
| 1152 | # CONFIG_TOUCHSCREEN_MK712 is not set | 1216 | # CONFIG_TOUCHSCREEN_MK712 is not set |
| 1153 | # CONFIG_TOUCHSCREEN_PENMOUNT is not set | 1217 | # CONFIG_TOUCHSCREEN_PENMOUNT is not set |
| 1154 | # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set | 1218 | # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set |
| 1155 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set | 1219 | # CONFIG_TOUCHSCREEN_TOUCHWIN is not set |
| 1156 | # CONFIG_TOUCHSCREEN_UCB1400 is not set | ||
| 1157 | # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set | 1220 | # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set |
| 1158 | # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set | 1221 | # CONFIG_TOUCHSCREEN_TOUCHIT213 is not set |
| 1222 | # CONFIG_TOUCHSCREEN_TSC2007 is not set | ||
| 1159 | CONFIG_INPUT_MISC=y | 1223 | CONFIG_INPUT_MISC=y |
| 1160 | # CONFIG_INPUT_PCSPKR is not set | 1224 | # CONFIG_INPUT_PCSPKR is not set |
| 1161 | # CONFIG_INPUT_APANEL is not set | 1225 | # CONFIG_INPUT_APANEL is not set |
| @@ -1165,6 +1229,7 @@ CONFIG_INPUT_MISC=y | |||
| 1165 | # CONFIG_INPUT_KEYSPAN_REMOTE is not set | 1229 | # CONFIG_INPUT_KEYSPAN_REMOTE is not set |
| 1166 | # CONFIG_INPUT_POWERMATE is not set | 1230 | # CONFIG_INPUT_POWERMATE is not set |
| 1167 | # CONFIG_INPUT_YEALINK is not set | 1231 | # CONFIG_INPUT_YEALINK is not set |
| 1232 | # CONFIG_INPUT_CM109 is not set | ||
| 1168 | # CONFIG_INPUT_UINPUT is not set | 1233 | # CONFIG_INPUT_UINPUT is not set |
| 1169 | 1234 | ||
| 1170 | # | 1235 | # |
| @@ -1231,6 +1296,7 @@ CONFIG_SERIAL_CORE=y | |||
| 1231 | CONFIG_SERIAL_CORE_CONSOLE=y | 1296 | CONFIG_SERIAL_CORE_CONSOLE=y |
| 1232 | # CONFIG_SERIAL_JSM is not set | 1297 | # CONFIG_SERIAL_JSM is not set |
| 1233 | CONFIG_UNIX98_PTYS=y | 1298 | CONFIG_UNIX98_PTYS=y |
| 1299 | # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set | ||
| 1234 | # CONFIG_LEGACY_PTYS is not set | 1300 | # CONFIG_LEGACY_PTYS is not set |
| 1235 | # CONFIG_IPMI_HANDLER is not set | 1301 | # CONFIG_IPMI_HANDLER is not set |
| 1236 | CONFIG_HW_RANDOM=y | 1302 | CONFIG_HW_RANDOM=y |
| @@ -1260,6 +1326,7 @@ CONFIG_I2C=y | |||
| 1260 | CONFIG_I2C_BOARDINFO=y | 1326 | CONFIG_I2C_BOARDINFO=y |
| 1261 | # CONFIG_I2C_CHARDEV is not set | 1327 | # CONFIG_I2C_CHARDEV is not set |
| 1262 | CONFIG_I2C_HELPER_AUTO=y | 1328 | CONFIG_I2C_HELPER_AUTO=y |
| 1329 | CONFIG_I2C_ALGOBIT=y | ||
| 1263 | 1330 | ||
| 1264 | # | 1331 | # |
| 1265 | # I2C Hardware Bus support | 1332 | # I2C Hardware Bus support |
| @@ -1311,8 +1378,6 @@ CONFIG_I2C_I801=y | |||
| 1311 | # Miscellaneous I2C Chip support | 1378 | # Miscellaneous I2C Chip support |
| 1312 | # | 1379 | # |
| 1313 | # CONFIG_DS1682 is not set | 1380 | # CONFIG_DS1682 is not set |
| 1314 | # CONFIG_EEPROM_AT24 is not set | ||
| 1315 | # CONFIG_EEPROM_LEGACY is not set | ||
| 1316 | # CONFIG_SENSORS_PCF8574 is not set | 1381 | # CONFIG_SENSORS_PCF8574 is not set |
| 1317 | # CONFIG_PCF8575 is not set | 1382 | # CONFIG_PCF8575 is not set |
| 1318 | # CONFIG_SENSORS_PCA9539 is not set | 1383 | # CONFIG_SENSORS_PCA9539 is not set |
| @@ -1331,8 +1396,78 @@ CONFIG_POWER_SUPPLY=y | |||
| 1331 | # CONFIG_POWER_SUPPLY_DEBUG is not set | 1396 | # CONFIG_POWER_SUPPLY_DEBUG is not set |
| 1332 | # CONFIG_PDA_POWER is not set | 1397 | # CONFIG_PDA_POWER is not set |
| 1333 | # CONFIG_BATTERY_DS2760 is not set | 1398 | # CONFIG_BATTERY_DS2760 is not set |
| 1334 | # CONFIG_HWMON is not set | 1399 | # CONFIG_BATTERY_BQ27x00 is not set |
| 1400 | CONFIG_HWMON=y | ||
| 1401 | # CONFIG_HWMON_VID is not set | ||
| 1402 | # CONFIG_SENSORS_ABITUGURU is not set | ||
| 1403 | # CONFIG_SENSORS_ABITUGURU3 is not set | ||
| 1404 | # CONFIG_SENSORS_AD7414 is not set | ||
| 1405 | # CONFIG_SENSORS_AD7418 is not set | ||
| 1406 | # CONFIG_SENSORS_ADM1021 is not set | ||
| 1407 | # CONFIG_SENSORS_ADM1025 is not set | ||
| 1408 | # CONFIG_SENSORS_ADM1026 is not set | ||
| 1409 | # CONFIG_SENSORS_ADM1029 is not set | ||
| 1410 | # CONFIG_SENSORS_ADM1031 is not set | ||
| 1411 | # CONFIG_SENSORS_ADM9240 is not set | ||
| 1412 | # CONFIG_SENSORS_ADT7462 is not set | ||
| 1413 | # CONFIG_SENSORS_ADT7470 is not set | ||
| 1414 | # CONFIG_SENSORS_ADT7473 is not set | ||
| 1415 | # CONFIG_SENSORS_ADT7475 is not set | ||
| 1416 | # CONFIG_SENSORS_K8TEMP is not set | ||
| 1417 | # CONFIG_SENSORS_ASB100 is not set | ||
| 1418 | # CONFIG_SENSORS_ATXP1 is not set | ||
| 1419 | # CONFIG_SENSORS_DS1621 is not set | ||
| 1420 | # CONFIG_SENSORS_I5K_AMB is not set | ||
| 1421 | # CONFIG_SENSORS_F71805F is not set | ||
| 1422 | # CONFIG_SENSORS_F71882FG is not set | ||
| 1423 | # CONFIG_SENSORS_F75375S is not set | ||
| 1424 | # CONFIG_SENSORS_FSCHER is not set | ||
| 1425 | # CONFIG_SENSORS_FSCPOS is not set | ||
| 1426 | # CONFIG_SENSORS_FSCHMD is not set | ||
| 1427 | # CONFIG_SENSORS_GL518SM is not set | ||
| 1428 | # CONFIG_SENSORS_GL520SM is not set | ||
| 1429 | # CONFIG_SENSORS_CORETEMP is not set | ||
| 1430 | # CONFIG_SENSORS_IT87 is not set | ||
| 1431 | # CONFIG_SENSORS_LM63 is not set | ||
| 1432 | # CONFIG_SENSORS_LM75 is not set | ||
| 1433 | # CONFIG_SENSORS_LM77 is not set | ||
| 1434 | # CONFIG_SENSORS_LM78 is not set | ||
| 1435 | # CONFIG_SENSORS_LM80 is not set | ||
| 1436 | # CONFIG_SENSORS_LM83 is not set | ||
| 1437 | # CONFIG_SENSORS_LM85 is not set | ||
| 1438 | # CONFIG_SENSORS_LM87 is not set | ||
| 1439 | # CONFIG_SENSORS_LM90 is not set | ||
| 1440 | # CONFIG_SENSORS_LM92 is not set | ||
| 1441 | # CONFIG_SENSORS_LM93 is not set | ||
| 1442 | # CONFIG_SENSORS_LTC4245 is not set | ||
| 1443 | # CONFIG_SENSORS_MAX1619 is not set | ||
| 1444 | # CONFIG_SENSORS_MAX6650 is not set | ||
| 1445 | # CONFIG_SENSORS_PC87360 is not set | ||
| 1446 | # CONFIG_SENSORS_PC87427 is not set | ||
| 1447 | # CONFIG_SENSORS_SIS5595 is not set | ||
| 1448 | # CONFIG_SENSORS_DME1737 is not set | ||
| 1449 | # CONFIG_SENSORS_SMSC47M1 is not set | ||
| 1450 | # CONFIG_SENSORS_SMSC47M192 is not set | ||
| 1451 | # CONFIG_SENSORS_SMSC47B397 is not set | ||
| 1452 | # CONFIG_SENSORS_ADS7828 is not set | ||
| 1453 | # CONFIG_SENSORS_THMC50 is not set | ||
| 1454 | # CONFIG_SENSORS_VIA686A is not set | ||
| 1455 | # CONFIG_SENSORS_VT1211 is not set | ||
| 1456 | # CONFIG_SENSORS_VT8231 is not set | ||
| 1457 | # CONFIG_SENSORS_W83781D is not set | ||
| 1458 | # CONFIG_SENSORS_W83791D is not set | ||
| 1459 | # CONFIG_SENSORS_W83792D is not set | ||
| 1460 | # CONFIG_SENSORS_W83793 is not set | ||
| 1461 | # CONFIG_SENSORS_W83L785TS is not set | ||
| 1462 | # CONFIG_SENSORS_W83L786NG is not set | ||
| 1463 | # CONFIG_SENSORS_W83627HF is not set | ||
| 1464 | # CONFIG_SENSORS_W83627EHF is not set | ||
| 1465 | # CONFIG_SENSORS_HDAPS is not set | ||
| 1466 | # CONFIG_SENSORS_LIS3LV02D is not set | ||
| 1467 | # CONFIG_SENSORS_APPLESMC is not set | ||
| 1468 | # CONFIG_HWMON_DEBUG_CHIP is not set | ||
| 1335 | CONFIG_THERMAL=y | 1469 | CONFIG_THERMAL=y |
| 1470 | # CONFIG_THERMAL_HWMON is not set | ||
| 1336 | CONFIG_WATCHDOG=y | 1471 | CONFIG_WATCHDOG=y |
| 1337 | # CONFIG_WATCHDOG_NOWAYOUT is not set | 1472 | # CONFIG_WATCHDOG_NOWAYOUT is not set |
| 1338 | 1473 | ||
| @@ -1352,15 +1487,18 @@ CONFIG_WATCHDOG=y | |||
| 1352 | # CONFIG_I6300ESB_WDT is not set | 1487 | # CONFIG_I6300ESB_WDT is not set |
| 1353 | # CONFIG_ITCO_WDT is not set | 1488 | # CONFIG_ITCO_WDT is not set |
| 1354 | # CONFIG_IT8712F_WDT is not set | 1489 | # CONFIG_IT8712F_WDT is not set |
| 1490 | # CONFIG_IT87_WDT is not set | ||
| 1355 | # CONFIG_HP_WATCHDOG is not set | 1491 | # CONFIG_HP_WATCHDOG is not set |
| 1356 | # CONFIG_SC1200_WDT is not set | 1492 | # CONFIG_SC1200_WDT is not set |
| 1357 | # CONFIG_PC87413_WDT is not set | 1493 | # CONFIG_PC87413_WDT is not set |
| 1358 | # CONFIG_60XX_WDT is not set | 1494 | # CONFIG_60XX_WDT is not set |
| 1359 | # CONFIG_SBC8360_WDT is not set | 1495 | # CONFIG_SBC8360_WDT is not set |
| 1360 | # CONFIG_CPU5_WDT is not set | 1496 | # CONFIG_CPU5_WDT is not set |
| 1497 | # CONFIG_SMSC_SCH311X_WDT is not set | ||
| 1361 | # CONFIG_SMSC37B787_WDT is not set | 1498 | # CONFIG_SMSC37B787_WDT is not set |
| 1362 | # CONFIG_W83627HF_WDT is not set | 1499 | # CONFIG_W83627HF_WDT is not set |
| 1363 | # CONFIG_W83697HF_WDT is not set | 1500 | # CONFIG_W83697HF_WDT is not set |
| 1501 | # CONFIG_W83697UG_WDT is not set | ||
| 1364 | # CONFIG_W83877F_WDT is not set | 1502 | # CONFIG_W83877F_WDT is not set |
| 1365 | # CONFIG_W83977F_WDT is not set | 1503 | # CONFIG_W83977F_WDT is not set |
| 1366 | # CONFIG_MACHZ_WDT is not set | 1504 | # CONFIG_MACHZ_WDT is not set |
| @@ -1376,11 +1514,11 @@ CONFIG_WATCHDOG=y | |||
| 1376 | # USB-based Watchdog Cards | 1514 | # USB-based Watchdog Cards |
| 1377 | # | 1515 | # |
| 1378 | # CONFIG_USBPCWATCHDOG is not set | 1516 | # CONFIG_USBPCWATCHDOG is not set |
| 1517 | CONFIG_SSB_POSSIBLE=y | ||
| 1379 | 1518 | ||
| 1380 | # | 1519 | # |
| 1381 | # Sonics Silicon Backplane | 1520 | # Sonics Silicon Backplane |
| 1382 | # | 1521 | # |
| 1383 | CONFIG_SSB_POSSIBLE=y | ||
| 1384 | # CONFIG_SSB is not set | 1522 | # CONFIG_SSB is not set |
| 1385 | 1523 | ||
| 1386 | # | 1524 | # |
| @@ -1389,7 +1527,13 @@ CONFIG_SSB_POSSIBLE=y | |||
| 1389 | # CONFIG_MFD_CORE is not set | 1527 | # CONFIG_MFD_CORE is not set |
| 1390 | # CONFIG_MFD_SM501 is not set | 1528 | # CONFIG_MFD_SM501 is not set |
| 1391 | # CONFIG_HTC_PASIC3 is not set | 1529 | # CONFIG_HTC_PASIC3 is not set |
| 1530 | # CONFIG_TWL4030_CORE is not set | ||
| 1392 | # CONFIG_MFD_TMIO is not set | 1531 | # CONFIG_MFD_TMIO is not set |
| 1532 | # CONFIG_PMIC_DA903X is not set | ||
| 1533 | # CONFIG_MFD_WM8400 is not set | ||
| 1534 | # CONFIG_MFD_WM8350_I2C is not set | ||
| 1535 | # CONFIG_MFD_PCF50633 is not set | ||
| 1536 | # CONFIG_REGULATOR is not set | ||
| 1393 | 1537 | ||
| 1394 | # | 1538 | # |
| 1395 | # Multimedia devices | 1539 | # Multimedia devices |
| @@ -1423,6 +1567,7 @@ CONFIG_DRM=y | |||
| 1423 | # CONFIG_DRM_I810 is not set | 1567 | # CONFIG_DRM_I810 is not set |
| 1424 | # CONFIG_DRM_I830 is not set | 1568 | # CONFIG_DRM_I830 is not set |
| 1425 | CONFIG_DRM_I915=y | 1569 | CONFIG_DRM_I915=y |
| 1570 | CONFIG_DRM_I915_KMS=y | ||
| 1426 | # CONFIG_DRM_MGA is not set | 1571 | # CONFIG_DRM_MGA is not set |
| 1427 | # CONFIG_DRM_SIS is not set | 1572 | # CONFIG_DRM_SIS is not set |
| 1428 | # CONFIG_DRM_VIA is not set | 1573 | # CONFIG_DRM_VIA is not set |
| @@ -1432,6 +1577,7 @@ CONFIG_DRM_I915=y | |||
| 1432 | CONFIG_FB=y | 1577 | CONFIG_FB=y |
| 1433 | # CONFIG_FIRMWARE_EDID is not set | 1578 | # CONFIG_FIRMWARE_EDID is not set |
| 1434 | # CONFIG_FB_DDC is not set | 1579 | # CONFIG_FB_DDC is not set |
| 1580 | # CONFIG_FB_BOOT_VESA_SUPPORT is not set | ||
| 1435 | CONFIG_FB_CFB_FILLRECT=y | 1581 | CONFIG_FB_CFB_FILLRECT=y |
| 1436 | CONFIG_FB_CFB_COPYAREA=y | 1582 | CONFIG_FB_CFB_COPYAREA=y |
| 1437 | CONFIG_FB_CFB_IMAGEBLIT=y | 1583 | CONFIG_FB_CFB_IMAGEBLIT=y |
| @@ -1460,7 +1606,6 @@ CONFIG_FB_TILEBLITTING=y | |||
| 1460 | # CONFIG_FB_UVESA is not set | 1606 | # CONFIG_FB_UVESA is not set |
| 1461 | # CONFIG_FB_VESA is not set | 1607 | # CONFIG_FB_VESA is not set |
| 1462 | CONFIG_FB_EFI=y | 1608 | CONFIG_FB_EFI=y |
| 1463 | # CONFIG_FB_IMAC is not set | ||
| 1464 | # CONFIG_FB_N411 is not set | 1609 | # CONFIG_FB_N411 is not set |
| 1465 | # CONFIG_FB_HGA is not set | 1610 | # CONFIG_FB_HGA is not set |
| 1466 | # CONFIG_FB_S1D13XXX is not set | 1611 | # CONFIG_FB_S1D13XXX is not set |
| @@ -1475,6 +1620,7 @@ CONFIG_FB_EFI=y | |||
| 1475 | # CONFIG_FB_S3 is not set | 1620 | # CONFIG_FB_S3 is not set |
| 1476 | # CONFIG_FB_SAVAGE is not set | 1621 | # CONFIG_FB_SAVAGE is not set |
| 1477 | # CONFIG_FB_SIS is not set | 1622 | # CONFIG_FB_SIS is not set |
| 1623 | # CONFIG_FB_VIA is not set | ||
| 1478 | # CONFIG_FB_NEOMAGIC is not set | 1624 | # CONFIG_FB_NEOMAGIC is not set |
| 1479 | # CONFIG_FB_KYRO is not set | 1625 | # CONFIG_FB_KYRO is not set |
| 1480 | # CONFIG_FB_3DFX is not set | 1626 | # CONFIG_FB_3DFX is not set |
| @@ -1486,12 +1632,15 @@ CONFIG_FB_EFI=y | |||
| 1486 | # CONFIG_FB_CARMINE is not set | 1632 | # CONFIG_FB_CARMINE is not set |
| 1487 | # CONFIG_FB_GEODE is not set | 1633 | # CONFIG_FB_GEODE is not set |
| 1488 | # CONFIG_FB_VIRTUAL is not set | 1634 | # CONFIG_FB_VIRTUAL is not set |
| 1635 | # CONFIG_FB_METRONOME is not set | ||
| 1636 | # CONFIG_FB_MB862XX is not set | ||
| 1489 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | 1637 | CONFIG_BACKLIGHT_LCD_SUPPORT=y |
| 1490 | # CONFIG_LCD_CLASS_DEVICE is not set | 1638 | # CONFIG_LCD_CLASS_DEVICE is not set |
| 1491 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | 1639 | CONFIG_BACKLIGHT_CLASS_DEVICE=y |
| 1492 | # CONFIG_BACKLIGHT_CORGI is not set | 1640 | CONFIG_BACKLIGHT_GENERIC=y |
| 1493 | # CONFIG_BACKLIGHT_PROGEAR is not set | 1641 | # CONFIG_BACKLIGHT_PROGEAR is not set |
| 1494 | # CONFIG_BACKLIGHT_MBP_NVIDIA is not set | 1642 | # CONFIG_BACKLIGHT_MBP_NVIDIA is not set |
| 1643 | # CONFIG_BACKLIGHT_SAHARA is not set | ||
| 1495 | 1644 | ||
| 1496 | # | 1645 | # |
| 1497 | # Display device support | 1646 | # Display device support |
| @@ -1511,10 +1660,12 @@ CONFIG_LOGO=y | |||
| 1511 | # CONFIG_LOGO_LINUX_VGA16 is not set | 1660 | # CONFIG_LOGO_LINUX_VGA16 is not set |
| 1512 | CONFIG_LOGO_LINUX_CLUT224=y | 1661 | CONFIG_LOGO_LINUX_CLUT224=y |
| 1513 | CONFIG_SOUND=y | 1662 | CONFIG_SOUND=y |
| 1663 | CONFIG_SOUND_OSS_CORE=y | ||
| 1514 | CONFIG_SND=y | 1664 | CONFIG_SND=y |
| 1515 | CONFIG_SND_TIMER=y | 1665 | CONFIG_SND_TIMER=y |
| 1516 | CONFIG_SND_PCM=y | 1666 | CONFIG_SND_PCM=y |
| 1517 | CONFIG_SND_HWDEP=y | 1667 | CONFIG_SND_HWDEP=y |
| 1668 | CONFIG_SND_JACK=y | ||
| 1518 | CONFIG_SND_SEQUENCER=y | 1669 | CONFIG_SND_SEQUENCER=y |
| 1519 | CONFIG_SND_SEQ_DUMMY=y | 1670 | CONFIG_SND_SEQ_DUMMY=y |
| 1520 | CONFIG_SND_OSSEMUL=y | 1671 | CONFIG_SND_OSSEMUL=y |
| @@ -1522,6 +1673,8 @@ CONFIG_SND_MIXER_OSS=y | |||
| 1522 | CONFIG_SND_PCM_OSS=y | 1673 | CONFIG_SND_PCM_OSS=y |
| 1523 | CONFIG_SND_PCM_OSS_PLUGINS=y | 1674 | CONFIG_SND_PCM_OSS_PLUGINS=y |
| 1524 | CONFIG_SND_SEQUENCER_OSS=y | 1675 | CONFIG_SND_SEQUENCER_OSS=y |
| 1676 | CONFIG_SND_HRTIMER=y | ||
| 1677 | CONFIG_SND_SEQ_HRTIMER_DEFAULT=y | ||
| 1525 | CONFIG_SND_DYNAMIC_MINORS=y | 1678 | CONFIG_SND_DYNAMIC_MINORS=y |
| 1526 | CONFIG_SND_SUPPORT_OLD_API=y | 1679 | CONFIG_SND_SUPPORT_OLD_API=y |
| 1527 | CONFIG_SND_VERBOSE_PROCFS=y | 1680 | CONFIG_SND_VERBOSE_PROCFS=y |
| @@ -1575,11 +1728,16 @@ CONFIG_SND_PCI=y | |||
| 1575 | # CONFIG_SND_FM801 is not set | 1728 | # CONFIG_SND_FM801 is not set |
| 1576 | CONFIG_SND_HDA_INTEL=y | 1729 | CONFIG_SND_HDA_INTEL=y |
| 1577 | CONFIG_SND_HDA_HWDEP=y | 1730 | CONFIG_SND_HDA_HWDEP=y |
| 1731 | # CONFIG_SND_HDA_RECONFIG is not set | ||
| 1732 | # CONFIG_SND_HDA_INPUT_BEEP is not set | ||
| 1578 | CONFIG_SND_HDA_CODEC_REALTEK=y | 1733 | CONFIG_SND_HDA_CODEC_REALTEK=y |
| 1579 | CONFIG_SND_HDA_CODEC_ANALOG=y | 1734 | CONFIG_SND_HDA_CODEC_ANALOG=y |
| 1580 | CONFIG_SND_HDA_CODEC_SIGMATEL=y | 1735 | CONFIG_SND_HDA_CODEC_SIGMATEL=y |
| 1581 | CONFIG_SND_HDA_CODEC_VIA=y | 1736 | CONFIG_SND_HDA_CODEC_VIA=y |
| 1582 | CONFIG_SND_HDA_CODEC_ATIHDMI=y | 1737 | CONFIG_SND_HDA_CODEC_ATIHDMI=y |
| 1738 | CONFIG_SND_HDA_CODEC_NVHDMI=y | ||
| 1739 | CONFIG_SND_HDA_CODEC_INTELHDMI=y | ||
| 1740 | CONFIG_SND_HDA_ELD=y | ||
| 1583 | CONFIG_SND_HDA_CODEC_CONEXANT=y | 1741 | CONFIG_SND_HDA_CODEC_CONEXANT=y |
| 1584 | CONFIG_SND_HDA_CODEC_CMEDIA=y | 1742 | CONFIG_SND_HDA_CODEC_CMEDIA=y |
| 1585 | CONFIG_SND_HDA_CODEC_SI3054=y | 1743 | CONFIG_SND_HDA_CODEC_SI3054=y |
| @@ -1612,6 +1770,7 @@ CONFIG_SND_USB=y | |||
| 1612 | # CONFIG_SND_USB_AUDIO is not set | 1770 | # CONFIG_SND_USB_AUDIO is not set |
| 1613 | # CONFIG_SND_USB_USX2Y is not set | 1771 | # CONFIG_SND_USB_USX2Y is not set |
| 1614 | # CONFIG_SND_USB_CAIAQ is not set | 1772 | # CONFIG_SND_USB_CAIAQ is not set |
| 1773 | # CONFIG_SND_USB_US122L is not set | ||
| 1615 | CONFIG_SND_PCMCIA=y | 1774 | CONFIG_SND_PCMCIA=y |
| 1616 | # CONFIG_SND_VXPOCKET is not set | 1775 | # CONFIG_SND_VXPOCKET is not set |
| 1617 | # CONFIG_SND_PDAUDIOCF is not set | 1776 | # CONFIG_SND_PDAUDIOCF is not set |
| @@ -1626,15 +1785,37 @@ CONFIG_HIDRAW=y | |||
| 1626 | # USB Input Devices | 1785 | # USB Input Devices |
| 1627 | # | 1786 | # |
| 1628 | CONFIG_USB_HID=y | 1787 | CONFIG_USB_HID=y |
| 1629 | CONFIG_USB_HIDINPUT_POWERBOOK=y | ||
| 1630 | CONFIG_HID_FF=y | ||
| 1631 | CONFIG_HID_PID=y | 1788 | CONFIG_HID_PID=y |
| 1789 | CONFIG_USB_HIDDEV=y | ||
| 1790 | |||
| 1791 | # | ||
| 1792 | # Special HID drivers | ||
| 1793 | # | ||
| 1794 | CONFIG_HID_COMPAT=y | ||
| 1795 | CONFIG_HID_A4TECH=y | ||
| 1796 | CONFIG_HID_APPLE=y | ||
| 1797 | CONFIG_HID_BELKIN=y | ||
| 1798 | CONFIG_HID_CHERRY=y | ||
| 1799 | CONFIG_HID_CHICONY=y | ||
| 1800 | CONFIG_HID_CYPRESS=y | ||
| 1801 | CONFIG_HID_EZKEY=y | ||
| 1802 | CONFIG_HID_GYRATION=y | ||
| 1803 | CONFIG_HID_LOGITECH=y | ||
| 1632 | CONFIG_LOGITECH_FF=y | 1804 | CONFIG_LOGITECH_FF=y |
| 1633 | # CONFIG_LOGIRUMBLEPAD2_FF is not set | 1805 | # CONFIG_LOGIRUMBLEPAD2_FF is not set |
| 1806 | CONFIG_HID_MICROSOFT=y | ||
| 1807 | CONFIG_HID_MONTEREY=y | ||
| 1808 | CONFIG_HID_NTRIG=y | ||
| 1809 | CONFIG_HID_PANTHERLORD=y | ||
| 1634 | CONFIG_PANTHERLORD_FF=y | 1810 | CONFIG_PANTHERLORD_FF=y |
| 1811 | CONFIG_HID_PETALYNX=y | ||
| 1812 | CONFIG_HID_SAMSUNG=y | ||
| 1813 | CONFIG_HID_SONY=y | ||
| 1814 | CONFIG_HID_SUNPLUS=y | ||
| 1815 | # CONFIG_GREENASIA_FF is not set | ||
| 1816 | CONFIG_HID_TOPSEED=y | ||
| 1635 | CONFIG_THRUSTMASTER_FF=y | 1817 | CONFIG_THRUSTMASTER_FF=y |
| 1636 | CONFIG_ZEROPLUS_FF=y | 1818 | CONFIG_ZEROPLUS_FF=y |
| 1637 | CONFIG_USB_HIDDEV=y | ||
| 1638 | CONFIG_USB_SUPPORT=y | 1819 | CONFIG_USB_SUPPORT=y |
| 1639 | CONFIG_USB_ARCH_HAS_HCD=y | 1820 | CONFIG_USB_ARCH_HAS_HCD=y |
| 1640 | CONFIG_USB_ARCH_HAS_OHCI=y | 1821 | CONFIG_USB_ARCH_HAS_OHCI=y |
| @@ -1652,6 +1833,8 @@ CONFIG_USB_DEVICEFS=y | |||
| 1652 | CONFIG_USB_SUSPEND=y | 1833 | CONFIG_USB_SUSPEND=y |
| 1653 | # CONFIG_USB_OTG is not set | 1834 | # CONFIG_USB_OTG is not set |
| 1654 | CONFIG_USB_MON=y | 1835 | CONFIG_USB_MON=y |
| 1836 | # CONFIG_USB_WUSB is not set | ||
| 1837 | # CONFIG_USB_WUSB_CBAF is not set | ||
| 1655 | 1838 | ||
| 1656 | # | 1839 | # |
| 1657 | # USB Host Controller Drivers | 1840 | # USB Host Controller Drivers |
| @@ -1660,6 +1843,7 @@ CONFIG_USB_MON=y | |||
| 1660 | CONFIG_USB_EHCI_HCD=y | 1843 | CONFIG_USB_EHCI_HCD=y |
| 1661 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | 1844 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set |
| 1662 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | 1845 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set |
| 1846 | # CONFIG_USB_OXU210HP_HCD is not set | ||
| 1663 | # CONFIG_USB_ISP116X_HCD is not set | 1847 | # CONFIG_USB_ISP116X_HCD is not set |
| 1664 | # CONFIG_USB_ISP1760_HCD is not set | 1848 | # CONFIG_USB_ISP1760_HCD is not set |
| 1665 | CONFIG_USB_OHCI_HCD=y | 1849 | CONFIG_USB_OHCI_HCD=y |
| @@ -1669,6 +1853,8 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y | |||
| 1669 | CONFIG_USB_UHCI_HCD=y | 1853 | CONFIG_USB_UHCI_HCD=y |
| 1670 | # CONFIG_USB_SL811_HCD is not set | 1854 | # CONFIG_USB_SL811_HCD is not set |
| 1671 | # CONFIG_USB_R8A66597_HCD is not set | 1855 | # CONFIG_USB_R8A66597_HCD is not set |
| 1856 | # CONFIG_USB_WHCI_HCD is not set | ||
| 1857 | # CONFIG_USB_HWA_HCD is not set | ||
| 1672 | 1858 | ||
| 1673 | # | 1859 | # |
| 1674 | # USB Device Class drivers | 1860 | # USB Device Class drivers |
| @@ -1676,20 +1862,20 @@ CONFIG_USB_UHCI_HCD=y | |||
| 1676 | # CONFIG_USB_ACM is not set | 1862 | # CONFIG_USB_ACM is not set |
| 1677 | CONFIG_USB_PRINTER=y | 1863 | CONFIG_USB_PRINTER=y |
| 1678 | # CONFIG_USB_WDM is not set | 1864 | # CONFIG_USB_WDM is not set |
| 1865 | # CONFIG_USB_TMC is not set | ||
| 1679 | 1866 | ||
| 1680 | # | 1867 | # |
| 1681 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | 1868 | # NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may also be needed; |
| 1682 | # | 1869 | # |
| 1683 | 1870 | ||
| 1684 | # | 1871 | # |
| 1685 | # may also be needed; see USB_STORAGE Help for more information | 1872 | # see USB_STORAGE Help for more information |
| 1686 | # | 1873 | # |
| 1687 | CONFIG_USB_STORAGE=y | 1874 | CONFIG_USB_STORAGE=y |
| 1688 | # CONFIG_USB_STORAGE_DEBUG is not set | 1875 | # CONFIG_USB_STORAGE_DEBUG is not set |
| 1689 | # CONFIG_USB_STORAGE_DATAFAB is not set | 1876 | # CONFIG_USB_STORAGE_DATAFAB is not set |
| 1690 | # CONFIG_USB_STORAGE_FREECOM is not set | 1877 | # CONFIG_USB_STORAGE_FREECOM is not set |
| 1691 | # CONFIG_USB_STORAGE_ISD200 is not set | 1878 | # CONFIG_USB_STORAGE_ISD200 is not set |
| 1692 | # CONFIG_USB_STORAGE_DPCM is not set | ||
| 1693 | # CONFIG_USB_STORAGE_USBAT is not set | 1879 | # CONFIG_USB_STORAGE_USBAT is not set |
| 1694 | # CONFIG_USB_STORAGE_SDDR09 is not set | 1880 | # CONFIG_USB_STORAGE_SDDR09 is not set |
| 1695 | # CONFIG_USB_STORAGE_SDDR55 is not set | 1881 | # CONFIG_USB_STORAGE_SDDR55 is not set |
| @@ -1697,7 +1883,6 @@ CONFIG_USB_STORAGE=y | |||
| 1697 | # CONFIG_USB_STORAGE_ALAUDA is not set | 1883 | # CONFIG_USB_STORAGE_ALAUDA is not set |
| 1698 | # CONFIG_USB_STORAGE_ONETOUCH is not set | 1884 | # CONFIG_USB_STORAGE_ONETOUCH is not set |
| 1699 | # CONFIG_USB_STORAGE_KARMA is not set | 1885 | # CONFIG_USB_STORAGE_KARMA is not set |
| 1700 | # CONFIG_USB_STORAGE_SIERRA is not set | ||
| 1701 | # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set | 1886 | # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set |
| 1702 | CONFIG_USB_LIBUSUAL=y | 1887 | CONFIG_USB_LIBUSUAL=y |
| 1703 | 1888 | ||
| @@ -1718,6 +1903,7 @@ CONFIG_USB_LIBUSUAL=y | |||
| 1718 | # CONFIG_USB_EMI62 is not set | 1903 | # CONFIG_USB_EMI62 is not set |
| 1719 | # CONFIG_USB_EMI26 is not set | 1904 | # CONFIG_USB_EMI26 is not set |
| 1720 | # CONFIG_USB_ADUTUX is not set | 1905 | # CONFIG_USB_ADUTUX is not set |
| 1906 | # CONFIG_USB_SEVSEG is not set | ||
| 1721 | # CONFIG_USB_RIO500 is not set | 1907 | # CONFIG_USB_RIO500 is not set |
| 1722 | # CONFIG_USB_LEGOTOWER is not set | 1908 | # CONFIG_USB_LEGOTOWER is not set |
| 1723 | # CONFIG_USB_LCD is not set | 1909 | # CONFIG_USB_LCD is not set |
| @@ -1735,7 +1921,13 @@ CONFIG_USB_LIBUSUAL=y | |||
| 1735 | # CONFIG_USB_IOWARRIOR is not set | 1921 | # CONFIG_USB_IOWARRIOR is not set |
| 1736 | # CONFIG_USB_TEST is not set | 1922 | # CONFIG_USB_TEST is not set |
| 1737 | # CONFIG_USB_ISIGHTFW is not set | 1923 | # CONFIG_USB_ISIGHTFW is not set |
| 1924 | # CONFIG_USB_VST is not set | ||
| 1738 | # CONFIG_USB_GADGET is not set | 1925 | # CONFIG_USB_GADGET is not set |
| 1926 | |||
| 1927 | # | ||
| 1928 | # OTG and related infrastructure | ||
| 1929 | # | ||
| 1930 | # CONFIG_UWB is not set | ||
| 1739 | # CONFIG_MMC is not set | 1931 | # CONFIG_MMC is not set |
| 1740 | # CONFIG_MEMSTICK is not set | 1932 | # CONFIG_MEMSTICK is not set |
| 1741 | CONFIG_NEW_LEDS=y | 1933 | CONFIG_NEW_LEDS=y |
| @@ -1744,6 +1936,7 @@ CONFIG_LEDS_CLASS=y | |||
| 1744 | # | 1936 | # |
| 1745 | # LED drivers | 1937 | # LED drivers |
| 1746 | # | 1938 | # |
| 1939 | # CONFIG_LEDS_ALIX2 is not set | ||
| 1747 | # CONFIG_LEDS_PCA9532 is not set | 1940 | # CONFIG_LEDS_PCA9532 is not set |
| 1748 | # CONFIG_LEDS_CLEVO_MAIL is not set | 1941 | # CONFIG_LEDS_CLEVO_MAIL is not set |
| 1749 | # CONFIG_LEDS_PCA955X is not set | 1942 | # CONFIG_LEDS_PCA955X is not set |
| @@ -1754,6 +1947,7 @@ CONFIG_LEDS_CLASS=y | |||
| 1754 | CONFIG_LEDS_TRIGGERS=y | 1947 | CONFIG_LEDS_TRIGGERS=y |
| 1755 | # CONFIG_LEDS_TRIGGER_TIMER is not set | 1948 | # CONFIG_LEDS_TRIGGER_TIMER is not set |
| 1756 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set | 1949 | # CONFIG_LEDS_TRIGGER_HEARTBEAT is not set |
| 1950 | # CONFIG_LEDS_TRIGGER_BACKLIGHT is not set | ||
| 1757 | # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set | 1951 | # CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set |
| 1758 | # CONFIG_ACCESSIBILITY is not set | 1952 | # CONFIG_ACCESSIBILITY is not set |
| 1759 | # CONFIG_INFINIBAND is not set | 1953 | # CONFIG_INFINIBAND is not set |
| @@ -1793,6 +1987,7 @@ CONFIG_RTC_INTF_DEV=y | |||
| 1793 | # CONFIG_RTC_DRV_M41T80 is not set | 1987 | # CONFIG_RTC_DRV_M41T80 is not set |
| 1794 | # CONFIG_RTC_DRV_S35390A is not set | 1988 | # CONFIG_RTC_DRV_S35390A is not set |
| 1795 | # CONFIG_RTC_DRV_FM3130 is not set | 1989 | # CONFIG_RTC_DRV_FM3130 is not set |
| 1990 | # CONFIG_RTC_DRV_RX8581 is not set | ||
| 1796 | 1991 | ||
| 1797 | # | 1992 | # |
| 1798 | # SPI RTC drivers | 1993 | # SPI RTC drivers |
| @@ -1802,12 +1997,15 @@ CONFIG_RTC_INTF_DEV=y | |||
| 1802 | # Platform RTC drivers | 1997 | # Platform RTC drivers |
| 1803 | # | 1998 | # |
| 1804 | CONFIG_RTC_DRV_CMOS=y | 1999 | CONFIG_RTC_DRV_CMOS=y |
| 2000 | # CONFIG_RTC_DRV_DS1286 is not set | ||
| 1805 | # CONFIG_RTC_DRV_DS1511 is not set | 2001 | # CONFIG_RTC_DRV_DS1511 is not set |
| 1806 | # CONFIG_RTC_DRV_DS1553 is not set | 2002 | # CONFIG_RTC_DRV_DS1553 is not set |
| 1807 | # CONFIG_RTC_DRV_DS1742 is not set | 2003 | # CONFIG_RTC_DRV_DS1742 is not set |
| 1808 | # CONFIG_RTC_DRV_STK17TA8 is not set | 2004 | # CONFIG_RTC_DRV_STK17TA8 is not set |
| 1809 | # CONFIG_RTC_DRV_M48T86 is not set | 2005 | # CONFIG_RTC_DRV_M48T86 is not set |
| 2006 | # CONFIG_RTC_DRV_M48T35 is not set | ||
| 1810 | # CONFIG_RTC_DRV_M48T59 is not set | 2007 | # CONFIG_RTC_DRV_M48T59 is not set |
| 2008 | # CONFIG_RTC_DRV_BQ4802 is not set | ||
| 1811 | # CONFIG_RTC_DRV_V3020 is not set | 2009 | # CONFIG_RTC_DRV_V3020 is not set |
| 1812 | 2010 | ||
| 1813 | # | 2011 | # |
| @@ -1820,6 +2018,21 @@ CONFIG_DMADEVICES=y | |||
| 1820 | # | 2018 | # |
| 1821 | # CONFIG_INTEL_IOATDMA is not set | 2019 | # CONFIG_INTEL_IOATDMA is not set |
| 1822 | # CONFIG_UIO is not set | 2020 | # CONFIG_UIO is not set |
| 2021 | # CONFIG_STAGING is not set | ||
| 2022 | CONFIG_X86_PLATFORM_DEVICES=y | ||
| 2023 | # CONFIG_ACER_WMI is not set | ||
| 2024 | # CONFIG_ASUS_LAPTOP is not set | ||
| 2025 | # CONFIG_FUJITSU_LAPTOP is not set | ||
| 2026 | # CONFIG_MSI_LAPTOP is not set | ||
| 2027 | # CONFIG_PANASONIC_LAPTOP is not set | ||
| 2028 | # CONFIG_COMPAL_LAPTOP is not set | ||
| 2029 | # CONFIG_SONY_LAPTOP is not set | ||
| 2030 | # CONFIG_THINKPAD_ACPI is not set | ||
| 2031 | # CONFIG_INTEL_MENLOW is not set | ||
| 2032 | CONFIG_EEEPC_LAPTOP=y | ||
| 2033 | # CONFIG_ACPI_WMI is not set | ||
| 2034 | # CONFIG_ACPI_ASUS is not set | ||
| 2035 | # CONFIG_ACPI_TOSHIBA is not set | ||
| 1823 | 2036 | ||
| 1824 | # | 2037 | # |
| 1825 | # Firmware Drivers | 2038 | # Firmware Drivers |
| @@ -1830,8 +2043,7 @@ CONFIG_EFI_VARS=y | |||
| 1830 | # CONFIG_DELL_RBU is not set | 2043 | # CONFIG_DELL_RBU is not set |
| 1831 | # CONFIG_DCDBAS is not set | 2044 | # CONFIG_DCDBAS is not set |
| 1832 | CONFIG_DMIID=y | 2045 | CONFIG_DMIID=y |
| 1833 | CONFIG_ISCSI_IBFT_FIND=y | 2046 | # CONFIG_ISCSI_IBFT_FIND is not set |
| 1834 | CONFIG_ISCSI_IBFT=y | ||
| 1835 | 2047 | ||
| 1836 | # | 2048 | # |
| 1837 | # File systems | 2049 | # File systems |
| @@ -1841,22 +2053,25 @@ CONFIG_EXT3_FS=y | |||
| 1841 | CONFIG_EXT3_FS_XATTR=y | 2053 | CONFIG_EXT3_FS_XATTR=y |
| 1842 | CONFIG_EXT3_FS_POSIX_ACL=y | 2054 | CONFIG_EXT3_FS_POSIX_ACL=y |
| 1843 | CONFIG_EXT3_FS_SECURITY=y | 2055 | CONFIG_EXT3_FS_SECURITY=y |
| 1844 | # CONFIG_EXT4DEV_FS is not set | 2056 | # CONFIG_EXT4_FS is not set |
| 1845 | CONFIG_JBD=y | 2057 | CONFIG_JBD=y |
| 1846 | # CONFIG_JBD_DEBUG is not set | 2058 | # CONFIG_JBD_DEBUG is not set |
| 1847 | CONFIG_FS_MBCACHE=y | 2059 | CONFIG_FS_MBCACHE=y |
| 1848 | # CONFIG_REISERFS_FS is not set | 2060 | # CONFIG_REISERFS_FS is not set |
| 1849 | # CONFIG_JFS_FS is not set | 2061 | # CONFIG_JFS_FS is not set |
| 1850 | CONFIG_FS_POSIX_ACL=y | 2062 | CONFIG_FS_POSIX_ACL=y |
| 2063 | CONFIG_FILE_LOCKING=y | ||
| 1851 | # CONFIG_XFS_FS is not set | 2064 | # CONFIG_XFS_FS is not set |
| 1852 | # CONFIG_GFS2_FS is not set | 2065 | # CONFIG_GFS2_FS is not set |
| 1853 | # CONFIG_OCFS2_FS is not set | 2066 | # CONFIG_OCFS2_FS is not set |
| 2067 | # CONFIG_BTRFS_FS is not set | ||
| 1854 | CONFIG_DNOTIFY=y | 2068 | CONFIG_DNOTIFY=y |
| 1855 | CONFIG_INOTIFY=y | 2069 | CONFIG_INOTIFY=y |
| 1856 | CONFIG_INOTIFY_USER=y | 2070 | CONFIG_INOTIFY_USER=y |
| 1857 | CONFIG_QUOTA=y | 2071 | CONFIG_QUOTA=y |
| 1858 | CONFIG_QUOTA_NETLINK_INTERFACE=y | 2072 | CONFIG_QUOTA_NETLINK_INTERFACE=y |
| 1859 | # CONFIG_PRINT_QUOTA_WARNING is not set | 2073 | # CONFIG_PRINT_QUOTA_WARNING is not set |
| 2074 | CONFIG_QUOTA_TREE=y | ||
| 1860 | # CONFIG_QFMT_V1 is not set | 2075 | # CONFIG_QFMT_V1 is not set |
| 1861 | CONFIG_QFMT_V2=y | 2076 | CONFIG_QFMT_V2=y |
| 1862 | CONFIG_QUOTACTL=y | 2077 | CONFIG_QUOTACTL=y |
| @@ -1890,16 +2105,14 @@ CONFIG_PROC_FS=y | |||
| 1890 | CONFIG_PROC_KCORE=y | 2105 | CONFIG_PROC_KCORE=y |
| 1891 | CONFIG_PROC_VMCORE=y | 2106 | CONFIG_PROC_VMCORE=y |
| 1892 | CONFIG_PROC_SYSCTL=y | 2107 | CONFIG_PROC_SYSCTL=y |
| 2108 | CONFIG_PROC_PAGE_MONITOR=y | ||
| 1893 | CONFIG_SYSFS=y | 2109 | CONFIG_SYSFS=y |
| 1894 | CONFIG_TMPFS=y | 2110 | CONFIG_TMPFS=y |
| 1895 | CONFIG_TMPFS_POSIX_ACL=y | 2111 | CONFIG_TMPFS_POSIX_ACL=y |
| 1896 | CONFIG_HUGETLBFS=y | 2112 | CONFIG_HUGETLBFS=y |
| 1897 | CONFIG_HUGETLB_PAGE=y | 2113 | CONFIG_HUGETLB_PAGE=y |
| 1898 | # CONFIG_CONFIGFS_FS is not set | 2114 | # CONFIG_CONFIGFS_FS is not set |
| 1899 | 2115 | CONFIG_MISC_FILESYSTEMS=y | |
| 1900 | # | ||
| 1901 | # Miscellaneous filesystems | ||
| 1902 | # | ||
| 1903 | # CONFIG_ADFS_FS is not set | 2116 | # CONFIG_ADFS_FS is not set |
| 1904 | # CONFIG_AFFS_FS is not set | 2117 | # CONFIG_AFFS_FS is not set |
| 1905 | # CONFIG_ECRYPT_FS is not set | 2118 | # CONFIG_ECRYPT_FS is not set |
| @@ -1909,6 +2122,7 @@ CONFIG_HUGETLB_PAGE=y | |||
| 1909 | # CONFIG_BFS_FS is not set | 2122 | # CONFIG_BFS_FS is not set |
| 1910 | # CONFIG_EFS_FS is not set | 2123 | # CONFIG_EFS_FS is not set |
| 1911 | # CONFIG_CRAMFS is not set | 2124 | # CONFIG_CRAMFS is not set |
| 2125 | # CONFIG_SQUASHFS is not set | ||
| 1912 | # CONFIG_VXFS_FS is not set | 2126 | # CONFIG_VXFS_FS is not set |
| 1913 | # CONFIG_MINIX_FS is not set | 2127 | # CONFIG_MINIX_FS is not set |
| 1914 | # CONFIG_OMFS_FS is not set | 2128 | # CONFIG_OMFS_FS is not set |
| @@ -1930,6 +2144,7 @@ CONFIG_NFS_ACL_SUPPORT=y | |||
| 1930 | CONFIG_NFS_COMMON=y | 2144 | CONFIG_NFS_COMMON=y |
| 1931 | CONFIG_SUNRPC=y | 2145 | CONFIG_SUNRPC=y |
| 1932 | CONFIG_SUNRPC_GSS=y | 2146 | CONFIG_SUNRPC_GSS=y |
| 2147 | # CONFIG_SUNRPC_REGISTER_V4 is not set | ||
| 1933 | CONFIG_RPCSEC_GSS_KRB5=y | 2148 | CONFIG_RPCSEC_GSS_KRB5=y |
| 1934 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 2149 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
| 1935 | # CONFIG_SMB_FS is not set | 2150 | # CONFIG_SMB_FS is not set |
| @@ -2006,7 +2221,7 @@ CONFIG_NLS_UTF8=y | |||
| 2006 | # | 2221 | # |
| 2007 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y | 2222 | CONFIG_TRACE_IRQFLAGS_SUPPORT=y |
| 2008 | CONFIG_PRINTK_TIME=y | 2223 | CONFIG_PRINTK_TIME=y |
| 2009 | CONFIG_ENABLE_WARN_DEPRECATED=y | 2224 | # CONFIG_ENABLE_WARN_DEPRECATED is not set |
| 2010 | CONFIG_ENABLE_MUST_CHECK=y | 2225 | CONFIG_ENABLE_MUST_CHECK=y |
| 2011 | CONFIG_FRAME_WARN=2048 | 2226 | CONFIG_FRAME_WARN=2048 |
| 2012 | CONFIG_MAGIC_SYSRQ=y | 2227 | CONFIG_MAGIC_SYSRQ=y |
| @@ -2035,40 +2250,60 @@ CONFIG_TIMER_STATS=y | |||
| 2035 | CONFIG_DEBUG_BUGVERBOSE=y | 2250 | CONFIG_DEBUG_BUGVERBOSE=y |
| 2036 | # CONFIG_DEBUG_INFO is not set | 2251 | # CONFIG_DEBUG_INFO is not set |
| 2037 | # CONFIG_DEBUG_VM is not set | 2252 | # CONFIG_DEBUG_VM is not set |
| 2253 | # CONFIG_DEBUG_VIRTUAL is not set | ||
| 2038 | # CONFIG_DEBUG_WRITECOUNT is not set | 2254 | # CONFIG_DEBUG_WRITECOUNT is not set |
| 2039 | CONFIG_DEBUG_MEMORY_INIT=y | 2255 | CONFIG_DEBUG_MEMORY_INIT=y |
| 2040 | # CONFIG_DEBUG_LIST is not set | 2256 | # CONFIG_DEBUG_LIST is not set |
| 2041 | # CONFIG_DEBUG_SG is not set | 2257 | # CONFIG_DEBUG_SG is not set |
| 2258 | # CONFIG_DEBUG_NOTIFIERS is not set | ||
| 2259 | CONFIG_ARCH_WANT_FRAME_POINTERS=y | ||
| 2042 | CONFIG_FRAME_POINTER=y | 2260 | CONFIG_FRAME_POINTER=y |
| 2043 | # CONFIG_BOOT_PRINTK_DELAY is not set | 2261 | # CONFIG_BOOT_PRINTK_DELAY is not set |
| 2044 | # CONFIG_RCU_TORTURE_TEST is not set | 2262 | # CONFIG_RCU_TORTURE_TEST is not set |
| 2263 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
| 2045 | # CONFIG_KPROBES_SANITY_TEST is not set | 2264 | # CONFIG_KPROBES_SANITY_TEST is not set |
| 2046 | # CONFIG_BACKTRACE_SELF_TEST is not set | 2265 | # CONFIG_BACKTRACE_SELF_TEST is not set |
| 2266 | # CONFIG_DEBUG_BLOCK_EXT_DEVT is not set | ||
| 2047 | # CONFIG_LKDTM is not set | 2267 | # CONFIG_LKDTM is not set |
| 2048 | # CONFIG_FAULT_INJECTION is not set | 2268 | # CONFIG_FAULT_INJECTION is not set |
| 2049 | # CONFIG_LATENCYTOP is not set | 2269 | # CONFIG_LATENCYTOP is not set |
| 2050 | CONFIG_SYSCTL_SYSCALL_CHECK=y | 2270 | CONFIG_SYSCTL_SYSCALL_CHECK=y |
| 2051 | CONFIG_HAVE_FTRACE=y | 2271 | CONFIG_USER_STACKTRACE_SUPPORT=y |
| 2272 | CONFIG_HAVE_FUNCTION_TRACER=y | ||
| 2273 | CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y | ||
| 2274 | CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y | ||
| 2052 | CONFIG_HAVE_DYNAMIC_FTRACE=y | 2275 | CONFIG_HAVE_DYNAMIC_FTRACE=y |
| 2053 | # CONFIG_FTRACE is not set | 2276 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y |
| 2277 | CONFIG_HAVE_HW_BRANCH_TRACER=y | ||
| 2278 | |||
| 2279 | # | ||
| 2280 | # Tracers | ||
| 2281 | # | ||
| 2282 | # CONFIG_FUNCTION_TRACER is not set | ||
| 2054 | # CONFIG_IRQSOFF_TRACER is not set | 2283 | # CONFIG_IRQSOFF_TRACER is not set |
| 2055 | # CONFIG_SYSPROF_TRACER is not set | 2284 | # CONFIG_SYSPROF_TRACER is not set |
| 2056 | # CONFIG_SCHED_TRACER is not set | 2285 | # CONFIG_SCHED_TRACER is not set |
| 2057 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | 2286 | # CONFIG_CONTEXT_SWITCH_TRACER is not set |
| 2287 | # CONFIG_BOOT_TRACER is not set | ||
| 2288 | # CONFIG_TRACE_BRANCH_PROFILING is not set | ||
| 2289 | # CONFIG_POWER_TRACER is not set | ||
| 2290 | # CONFIG_STACK_TRACER is not set | ||
| 2291 | # CONFIG_HW_BRANCH_TRACER is not set | ||
| 2058 | CONFIG_PROVIDE_OHCI1394_DMA_INIT=y | 2292 | CONFIG_PROVIDE_OHCI1394_DMA_INIT=y |
| 2293 | # CONFIG_DYNAMIC_PRINTK_DEBUG is not set | ||
| 2059 | # CONFIG_SAMPLES is not set | 2294 | # CONFIG_SAMPLES is not set |
| 2060 | CONFIG_HAVE_ARCH_KGDB=y | 2295 | CONFIG_HAVE_ARCH_KGDB=y |
| 2061 | # CONFIG_KGDB is not set | 2296 | # CONFIG_KGDB is not set |
| 2062 | # CONFIG_STRICT_DEVMEM is not set | 2297 | # CONFIG_STRICT_DEVMEM is not set |
| 2063 | CONFIG_X86_VERBOSE_BOOTUP=y | 2298 | CONFIG_X86_VERBOSE_BOOTUP=y |
| 2064 | CONFIG_EARLY_PRINTK=y | 2299 | CONFIG_EARLY_PRINTK=y |
| 2300 | CONFIG_EARLY_PRINTK_DBGP=y | ||
| 2065 | CONFIG_DEBUG_STACKOVERFLOW=y | 2301 | CONFIG_DEBUG_STACKOVERFLOW=y |
| 2066 | CONFIG_DEBUG_STACK_USAGE=y | 2302 | CONFIG_DEBUG_STACK_USAGE=y |
| 2067 | # CONFIG_DEBUG_PAGEALLOC is not set | 2303 | # CONFIG_DEBUG_PAGEALLOC is not set |
| 2068 | # CONFIG_DEBUG_PER_CPU_MAPS is not set | 2304 | # CONFIG_DEBUG_PER_CPU_MAPS is not set |
| 2069 | # CONFIG_X86_PTDUMP is not set | 2305 | # CONFIG_X86_PTDUMP is not set |
| 2070 | CONFIG_DEBUG_RODATA=y | 2306 | CONFIG_DEBUG_RODATA=y |
| 2071 | # CONFIG_DIRECT_GBPAGES is not set | ||
| 2072 | # CONFIG_DEBUG_RODATA_TEST is not set | 2307 | # CONFIG_DEBUG_RODATA_TEST is not set |
| 2073 | CONFIG_DEBUG_NX_TEST=m | 2308 | CONFIG_DEBUG_NX_TEST=m |
| 2074 | # CONFIG_IOMMU_DEBUG is not set | 2309 | # CONFIG_IOMMU_DEBUG is not set |
| @@ -2092,8 +2327,10 @@ CONFIG_OPTIMIZE_INLINING=y | |||
| 2092 | CONFIG_KEYS=y | 2327 | CONFIG_KEYS=y |
| 2093 | CONFIG_KEYS_DEBUG_PROC_KEYS=y | 2328 | CONFIG_KEYS_DEBUG_PROC_KEYS=y |
| 2094 | CONFIG_SECURITY=y | 2329 | CONFIG_SECURITY=y |
| 2330 | # CONFIG_SECURITYFS is not set | ||
| 2095 | CONFIG_SECURITY_NETWORK=y | 2331 | CONFIG_SECURITY_NETWORK=y |
| 2096 | # CONFIG_SECURITY_NETWORK_XFRM is not set | 2332 | # CONFIG_SECURITY_NETWORK_XFRM is not set |
| 2333 | # CONFIG_SECURITY_PATH is not set | ||
| 2097 | CONFIG_SECURITY_FILE_CAPABILITIES=y | 2334 | CONFIG_SECURITY_FILE_CAPABILITIES=y |
| 2098 | # CONFIG_SECURITY_ROOTPLUG is not set | 2335 | # CONFIG_SECURITY_ROOTPLUG is not set |
| 2099 | CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=65536 | 2336 | CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=65536 |
| @@ -2104,7 +2341,6 @@ CONFIG_SECURITY_SELINUX_DISABLE=y | |||
| 2104 | CONFIG_SECURITY_SELINUX_DEVELOP=y | 2341 | CONFIG_SECURITY_SELINUX_DEVELOP=y |
| 2105 | CONFIG_SECURITY_SELINUX_AVC_STATS=y | 2342 | CONFIG_SECURITY_SELINUX_AVC_STATS=y |
| 2106 | CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1 | 2343 | CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1 |
| 2107 | # CONFIG_SECURITY_SELINUX_ENABLE_SECMARK_DEFAULT is not set | ||
| 2108 | # CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set | 2344 | # CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set |
| 2109 | # CONFIG_SECURITY_SMACK is not set | 2345 | # CONFIG_SECURITY_SMACK is not set |
| 2110 | CONFIG_CRYPTO=y | 2346 | CONFIG_CRYPTO=y |
| @@ -2112,11 +2348,18 @@ CONFIG_CRYPTO=y | |||
| 2112 | # | 2348 | # |
| 2113 | # Crypto core or helper | 2349 | # Crypto core or helper |
| 2114 | # | 2350 | # |
| 2351 | # CONFIG_CRYPTO_FIPS is not set | ||
| 2115 | CONFIG_CRYPTO_ALGAPI=y | 2352 | CONFIG_CRYPTO_ALGAPI=y |
| 2353 | CONFIG_CRYPTO_ALGAPI2=y | ||
| 2116 | CONFIG_CRYPTO_AEAD=y | 2354 | CONFIG_CRYPTO_AEAD=y |
| 2355 | CONFIG_CRYPTO_AEAD2=y | ||
| 2117 | CONFIG_CRYPTO_BLKCIPHER=y | 2356 | CONFIG_CRYPTO_BLKCIPHER=y |
| 2357 | CONFIG_CRYPTO_BLKCIPHER2=y | ||
| 2118 | CONFIG_CRYPTO_HASH=y | 2358 | CONFIG_CRYPTO_HASH=y |
| 2359 | CONFIG_CRYPTO_HASH2=y | ||
| 2360 | CONFIG_CRYPTO_RNG2=y | ||
| 2119 | CONFIG_CRYPTO_MANAGER=y | 2361 | CONFIG_CRYPTO_MANAGER=y |
| 2362 | CONFIG_CRYPTO_MANAGER2=y | ||
| 2120 | # CONFIG_CRYPTO_GF128MUL is not set | 2363 | # CONFIG_CRYPTO_GF128MUL is not set |
| 2121 | # CONFIG_CRYPTO_NULL is not set | 2364 | # CONFIG_CRYPTO_NULL is not set |
| 2122 | # CONFIG_CRYPTO_CRYPTD is not set | 2365 | # CONFIG_CRYPTO_CRYPTD is not set |
| @@ -2151,6 +2394,7 @@ CONFIG_CRYPTO_HMAC=y | |||
| 2151 | # Digest | 2394 | # Digest |
| 2152 | # | 2395 | # |
| 2153 | # CONFIG_CRYPTO_CRC32C is not set | 2396 | # CONFIG_CRYPTO_CRC32C is not set |
| 2397 | # CONFIG_CRYPTO_CRC32C_INTEL is not set | ||
| 2154 | # CONFIG_CRYPTO_MD4 is not set | 2398 | # CONFIG_CRYPTO_MD4 is not set |
| 2155 | CONFIG_CRYPTO_MD5=y | 2399 | CONFIG_CRYPTO_MD5=y |
| 2156 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | 2400 | # CONFIG_CRYPTO_MICHAEL_MIC is not set |
| @@ -2191,6 +2435,11 @@ CONFIG_CRYPTO_DES=y | |||
| 2191 | # | 2435 | # |
| 2192 | # CONFIG_CRYPTO_DEFLATE is not set | 2436 | # CONFIG_CRYPTO_DEFLATE is not set |
| 2193 | # CONFIG_CRYPTO_LZO is not set | 2437 | # CONFIG_CRYPTO_LZO is not set |
| 2438 | |||
| 2439 | # | ||
| 2440 | # Random Number Generation | ||
| 2441 | # | ||
| 2442 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
| 2194 | CONFIG_CRYPTO_HW=y | 2443 | CONFIG_CRYPTO_HW=y |
| 2195 | # CONFIG_CRYPTO_DEV_HIFN_795X is not set | 2444 | # CONFIG_CRYPTO_DEV_HIFN_795X is not set |
| 2196 | CONFIG_HAVE_KVM=y | 2445 | CONFIG_HAVE_KVM=y |
| @@ -2205,6 +2454,7 @@ CONFIG_VIRTUALIZATION=y | |||
| 2205 | CONFIG_BITREVERSE=y | 2454 | CONFIG_BITREVERSE=y |
| 2206 | CONFIG_GENERIC_FIND_FIRST_BIT=y | 2455 | CONFIG_GENERIC_FIND_FIRST_BIT=y |
| 2207 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 2456 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
| 2457 | CONFIG_GENERIC_FIND_LAST_BIT=y | ||
| 2208 | # CONFIG_CRC_CCITT is not set | 2458 | # CONFIG_CRC_CCITT is not set |
| 2209 | # CONFIG_CRC16 is not set | 2459 | # CONFIG_CRC16 is not set |
| 2210 | CONFIG_CRC_T10DIF=y | 2460 | CONFIG_CRC_T10DIF=y |
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c index 9dabd00e9805..dd77ac0cac46 100644 --- a/arch/x86/ia32/ia32_signal.c +++ b/arch/x86/ia32/ia32_signal.c | |||
| @@ -46,78 +46,83 @@ void signal_fault(struct pt_regs *regs, void __user *frame, char *where); | |||
| 46 | 46 | ||
| 47 | int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) | 47 | int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) |
| 48 | { | 48 | { |
| 49 | int err; | 49 | int err = 0; |
| 50 | 50 | ||
| 51 | if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t))) | 51 | if (!access_ok(VERIFY_WRITE, to, sizeof(compat_siginfo_t))) |
| 52 | return -EFAULT; | 52 | return -EFAULT; |
| 53 | 53 | ||
| 54 | /* If you change siginfo_t structure, please make sure that | 54 | put_user_try { |
| 55 | this code is fixed accordingly. | 55 | /* If you change siginfo_t structure, please make sure that |
| 56 | It should never copy any pad contained in the structure | 56 | this code is fixed accordingly. |
| 57 | to avoid security leaks, but must copy the generic | 57 | It should never copy any pad contained in the structure |
| 58 | 3 ints plus the relevant union member. */ | 58 | to avoid security leaks, but must copy the generic |
| 59 | err = __put_user(from->si_signo, &to->si_signo); | 59 | 3 ints plus the relevant union member. */ |
| 60 | err |= __put_user(from->si_errno, &to->si_errno); | 60 | put_user_ex(from->si_signo, &to->si_signo); |
| 61 | err |= __put_user((short)from->si_code, &to->si_code); | 61 | put_user_ex(from->si_errno, &to->si_errno); |
| 62 | 62 | put_user_ex((short)from->si_code, &to->si_code); | |
| 63 | if (from->si_code < 0) { | 63 | |
| 64 | err |= __put_user(from->si_pid, &to->si_pid); | 64 | if (from->si_code < 0) { |
| 65 | err |= __put_user(from->si_uid, &to->si_uid); | 65 | put_user_ex(from->si_pid, &to->si_pid); |
| 66 | err |= __put_user(ptr_to_compat(from->si_ptr), &to->si_ptr); | 66 | put_user_ex(from->si_uid, &to->si_uid); |
| 67 | } else { | 67 | put_user_ex(ptr_to_compat(from->si_ptr), &to->si_ptr); |
| 68 | /* | 68 | } else { |
| 69 | * First 32bits of unions are always present: | 69 | /* |
| 70 | * si_pid === si_band === si_tid === si_addr(LS half) | 70 | * First 32bits of unions are always present: |
| 71 | */ | 71 | * si_pid === si_band === si_tid === si_addr(LS half) |
| 72 | err |= __put_user(from->_sifields._pad[0], | 72 | */ |
| 73 | &to->_sifields._pad[0]); | 73 | put_user_ex(from->_sifields._pad[0], |
| 74 | switch (from->si_code >> 16) { | 74 | &to->_sifields._pad[0]); |
| 75 | case __SI_FAULT >> 16: | 75 | switch (from->si_code >> 16) { |
| 76 | break; | 76 | case __SI_FAULT >> 16: |
| 77 | case __SI_CHLD >> 16: | 77 | break; |
| 78 | err |= __put_user(from->si_utime, &to->si_utime); | 78 | case __SI_CHLD >> 16: |
| 79 | err |= __put_user(from->si_stime, &to->si_stime); | 79 | put_user_ex(from->si_utime, &to->si_utime); |
| 80 | err |= __put_user(from->si_status, &to->si_status); | 80 | put_user_ex(from->si_stime, &to->si_stime); |
| 81 | /* FALL THROUGH */ | 81 | put_user_ex(from->si_status, &to->si_status); |
| 82 | default: | 82 | /* FALL THROUGH */ |
| 83 | case __SI_KILL >> 16: | 83 | default: |
| 84 | err |= __put_user(from->si_uid, &to->si_uid); | 84 | case __SI_KILL >> 16: |
| 85 | break; | 85 | put_user_ex(from->si_uid, &to->si_uid); |
| 86 | case __SI_POLL >> 16: | 86 | break; |
| 87 | err |= __put_user(from->si_fd, &to->si_fd); | 87 | case __SI_POLL >> 16: |
| 88 | break; | 88 | put_user_ex(from->si_fd, &to->si_fd); |
| 89 | case __SI_TIMER >> 16: | 89 | break; |
| 90 | err |= __put_user(from->si_overrun, &to->si_overrun); | 90 | case __SI_TIMER >> 16: |
| 91 | err |= __put_user(ptr_to_compat(from->si_ptr), | 91 | put_user_ex(from->si_overrun, &to->si_overrun); |
| 92 | &to->si_ptr); | 92 | put_user_ex(ptr_to_compat(from->si_ptr), |
| 93 | break; | 93 | &to->si_ptr); |
| 94 | /* This is not generated by the kernel as of now. */ | 94 | break; |
| 95 | case __SI_RT >> 16: | 95 | /* This is not generated by the kernel as of now. */ |
| 96 | case __SI_MESGQ >> 16: | 96 | case __SI_RT >> 16: |
| 97 | err |= __put_user(from->si_uid, &to->si_uid); | 97 | case __SI_MESGQ >> 16: |
| 98 | err |= __put_user(from->si_int, &to->si_int); | 98 | put_user_ex(from->si_uid, &to->si_uid); |
| 99 | break; | 99 | put_user_ex(from->si_int, &to->si_int); |
| 100 | break; | ||
| 101 | } | ||
| 100 | } | 102 | } |
| 101 | } | 103 | } put_user_catch(err); |
| 104 | |||
| 102 | return err; | 105 | return err; |
| 103 | } | 106 | } |
| 104 | 107 | ||
| 105 | int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) | 108 | int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from) |
| 106 | { | 109 | { |
| 107 | int err; | 110 | int err = 0; |
| 108 | u32 ptr32; | 111 | u32 ptr32; |
| 109 | 112 | ||
| 110 | if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t))) | 113 | if (!access_ok(VERIFY_READ, from, sizeof(compat_siginfo_t))) |
| 111 | return -EFAULT; | 114 | return -EFAULT; |
| 112 | 115 | ||
| 113 | err = __get_user(to->si_signo, &from->si_signo); | 116 | get_user_try { |
| 114 | err |= __get_user(to->si_errno, &from->si_errno); | 117 | get_user_ex(to->si_signo, &from->si_signo); |
| 115 | err |= __get_user(to->si_code, &from->si_code); | 118 | get_user_ex(to->si_errno, &from->si_errno); |
| 119 | get_user_ex(to->si_code, &from->si_code); | ||
| 116 | 120 | ||
| 117 | err |= __get_user(to->si_pid, &from->si_pid); | 121 | get_user_ex(to->si_pid, &from->si_pid); |
| 118 | err |= __get_user(to->si_uid, &from->si_uid); | 122 | get_user_ex(to->si_uid, &from->si_uid); |
| 119 | err |= __get_user(ptr32, &from->si_ptr); | 123 | get_user_ex(ptr32, &from->si_ptr); |
| 120 | to->si_ptr = compat_ptr(ptr32); | 124 | to->si_ptr = compat_ptr(ptr32); |
| 125 | } get_user_catch(err); | ||
| 121 | 126 | ||
| 122 | return err; | 127 | return err; |
| 123 | } | 128 | } |
| @@ -142,17 +147,23 @@ asmlinkage long sys32_sigaltstack(const stack_ia32_t __user *uss_ptr, | |||
| 142 | struct pt_regs *regs) | 147 | struct pt_regs *regs) |
| 143 | { | 148 | { |
| 144 | stack_t uss, uoss; | 149 | stack_t uss, uoss; |
| 145 | int ret; | 150 | int ret, err = 0; |
| 146 | mm_segment_t seg; | 151 | mm_segment_t seg; |
| 147 | 152 | ||
| 148 | if (uss_ptr) { | 153 | if (uss_ptr) { |
| 149 | u32 ptr; | 154 | u32 ptr; |
| 150 | 155 | ||
| 151 | memset(&uss, 0, sizeof(stack_t)); | 156 | memset(&uss, 0, sizeof(stack_t)); |
| 152 | if (!access_ok(VERIFY_READ, uss_ptr, sizeof(stack_ia32_t)) || | 157 | if (!access_ok(VERIFY_READ, uss_ptr, sizeof(stack_ia32_t))) |
| 153 | __get_user(ptr, &uss_ptr->ss_sp) || | 158 | return -EFAULT; |
| 154 | __get_user(uss.ss_flags, &uss_ptr->ss_flags) || | 159 | |
| 155 | __get_user(uss.ss_size, &uss_ptr->ss_size)) | 160 | get_user_try { |
| 161 | get_user_ex(ptr, &uss_ptr->ss_sp); | ||
| 162 | get_user_ex(uss.ss_flags, &uss_ptr->ss_flags); | ||
| 163 | get_user_ex(uss.ss_size, &uss_ptr->ss_size); | ||
| 164 | } get_user_catch(err); | ||
| 165 | |||
| 166 | if (err) | ||
| 156 | return -EFAULT; | 167 | return -EFAULT; |
| 157 | uss.ss_sp = compat_ptr(ptr); | 168 | uss.ss_sp = compat_ptr(ptr); |
| 158 | } | 169 | } |
| @@ -161,10 +172,16 @@ asmlinkage long sys32_sigaltstack(const stack_ia32_t __user *uss_ptr, | |||
| 161 | ret = do_sigaltstack(uss_ptr ? &uss : NULL, &uoss, regs->sp); | 172 | ret = do_sigaltstack(uss_ptr ? &uss : NULL, &uoss, regs->sp); |
| 162 | set_fs(seg); | 173 | set_fs(seg); |
| 163 | if (ret >= 0 && uoss_ptr) { | 174 | if (ret >= 0 && uoss_ptr) { |
| 164 | if (!access_ok(VERIFY_WRITE, uoss_ptr, sizeof(stack_ia32_t)) || | 175 | if (!access_ok(VERIFY_WRITE, uoss_ptr, sizeof(stack_ia32_t))) |
| 165 | __put_user(ptr_to_compat(uoss.ss_sp), &uoss_ptr->ss_sp) || | 176 | return -EFAULT; |
| 166 | __put_user(uoss.ss_flags, &uoss_ptr->ss_flags) || | 177 | |
| 167 | __put_user(uoss.ss_size, &uoss_ptr->ss_size)) | 178 | put_user_try { |
| 179 | put_user_ex(ptr_to_compat(uoss.ss_sp), &uoss_ptr->ss_sp); | ||
| 180 | put_user_ex(uoss.ss_flags, &uoss_ptr->ss_flags); | ||
| 181 | put_user_ex(uoss.ss_size, &uoss_ptr->ss_size); | ||
| 182 | } put_user_catch(err); | ||
| 183 | |||
| 184 | if (err) | ||
| 168 | ret = -EFAULT; | 185 | ret = -EFAULT; |
| 169 | } | 186 | } |
| 170 | return ret; | 187 | return ret; |
| @@ -174,18 +191,18 @@ asmlinkage long sys32_sigaltstack(const stack_ia32_t __user *uss_ptr, | |||
| 174 | * Do a signal return; undo the signal stack. | 191 | * Do a signal return; undo the signal stack. |
| 175 | */ | 192 | */ |
| 176 | #define COPY(x) { \ | 193 | #define COPY(x) { \ |
| 177 | err |= __get_user(regs->x, &sc->x); \ | 194 | get_user_ex(regs->x, &sc->x); \ |
| 178 | } | 195 | } |
| 179 | 196 | ||
| 180 | #define COPY_SEG_CPL3(seg) { \ | 197 | #define COPY_SEG_CPL3(seg) { \ |
| 181 | unsigned short tmp; \ | 198 | unsigned short tmp; \ |
| 182 | err |= __get_user(tmp, &sc->seg); \ | 199 | get_user_ex(tmp, &sc->seg); \ |
| 183 | regs->seg = tmp | 3; \ | 200 | regs->seg = tmp | 3; \ |
| 184 | } | 201 | } |
| 185 | 202 | ||
| 186 | #define RELOAD_SEG(seg) { \ | 203 | #define RELOAD_SEG(seg) { \ |
| 187 | unsigned int cur, pre; \ | 204 | unsigned int cur, pre; \ |
| 188 | err |= __get_user(pre, &sc->seg); \ | 205 | get_user_ex(pre, &sc->seg); \ |
| 189 | savesegment(seg, cur); \ | 206 | savesegment(seg, cur); \ |
| 190 | pre |= 3; \ | 207 | pre |= 3; \ |
| 191 | if (pre != cur) \ | 208 | if (pre != cur) \ |
| @@ -209,39 +226,42 @@ static int ia32_restore_sigcontext(struct pt_regs *regs, | |||
| 209 | sc, sc->err, sc->ip, sc->cs, sc->flags); | 226 | sc, sc->err, sc->ip, sc->cs, sc->flags); |
| 210 | #endif | 227 | #endif |
| 211 | 228 | ||
| 212 | /* | 229 | get_user_try { |
| 213 | * Reload fs and gs if they have changed in the signal | 230 | /* |
| 214 | * handler. This does not handle long fs/gs base changes in | 231 | * Reload fs and gs if they have changed in the signal |
| 215 | * the handler, but does not clobber them at least in the | 232 | * handler. This does not handle long fs/gs base changes in |
| 216 | * normal case. | 233 | * the handler, but does not clobber them at least in the |
| 217 | */ | 234 | * normal case. |
| 218 | err |= __get_user(gs, &sc->gs); | 235 | */ |
| 219 | gs |= 3; | 236 | get_user_ex(gs, &sc->gs); |
| 220 | savesegment(gs, oldgs); | 237 | gs |= 3; |
| 221 | if (gs != oldgs) | 238 | savesegment(gs, oldgs); |
| 222 | load_gs_index(gs); | 239 | if (gs != oldgs) |
| 223 | 240 | load_gs_index(gs); | |
| 224 | RELOAD_SEG(fs); | 241 | |
| 225 | RELOAD_SEG(ds); | 242 | RELOAD_SEG(fs); |
| 226 | RELOAD_SEG(es); | 243 | RELOAD_SEG(ds); |
| 227 | 244 | RELOAD_SEG(es); | |
| 228 | COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx); | 245 | |
| 229 | COPY(dx); COPY(cx); COPY(ip); | 246 | COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx); |
| 230 | /* Don't touch extended registers */ | 247 | COPY(dx); COPY(cx); COPY(ip); |
| 231 | 248 | /* Don't touch extended registers */ | |
| 232 | COPY_SEG_CPL3(cs); | 249 | |
| 233 | COPY_SEG_CPL3(ss); | 250 | COPY_SEG_CPL3(cs); |
| 234 | 251 | COPY_SEG_CPL3(ss); | |
| 235 | err |= __get_user(tmpflags, &sc->flags); | 252 | |
| 236 | regs->flags = (regs->flags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS); | 253 | get_user_ex(tmpflags, &sc->flags); |
| 237 | /* disable syscall checks */ | 254 | regs->flags = (regs->flags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS); |
| 238 | regs->orig_ax = -1; | 255 | /* disable syscall checks */ |
| 239 | 256 | regs->orig_ax = -1; | |
| 240 | err |= __get_user(tmp, &sc->fpstate); | 257 | |
| 241 | buf = compat_ptr(tmp); | 258 | get_user_ex(tmp, &sc->fpstate); |
| 242 | err |= restore_i387_xstate_ia32(buf); | 259 | buf = compat_ptr(tmp); |
| 243 | 260 | err |= restore_i387_xstate_ia32(buf); | |
| 244 | err |= __get_user(*pax, &sc->ax); | 261 | |
| 262 | get_user_ex(*pax, &sc->ax); | ||
| 263 | } get_user_catch(err); | ||
| 264 | |||
| 245 | return err; | 265 | return err; |
| 246 | } | 266 | } |
| 247 | 267 | ||
| @@ -319,36 +339,38 @@ static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc, | |||
| 319 | { | 339 | { |
| 320 | int tmp, err = 0; | 340 | int tmp, err = 0; |
| 321 | 341 | ||
| 322 | savesegment(gs, tmp); | 342 | put_user_try { |
| 323 | err |= __put_user(tmp, (unsigned int __user *)&sc->gs); | 343 | savesegment(gs, tmp); |
| 324 | savesegment(fs, tmp); | 344 | put_user_ex(tmp, (unsigned int __user *)&sc->gs); |
| 325 | err |= __put_user(tmp, (unsigned int __user *)&sc->fs); | 345 | savesegment(fs, tmp); |
| 326 | savesegment(ds, tmp); | 346 | put_user_ex(tmp, (unsigned int __user *)&sc->fs); |
| 327 | err |= __put_user(tmp, (unsigned int __user *)&sc->ds); | 347 | savesegment(ds, tmp); |
| 328 | savesegment(es, tmp); | 348 | put_user_ex(tmp, (unsigned int __user *)&sc->ds); |
| 329 | err |= __put_user(tmp, (unsigned int __user *)&sc->es); | 349 | savesegment(es, tmp); |
| 330 | 350 | put_user_ex(tmp, (unsigned int __user *)&sc->es); | |
| 331 | err |= __put_user(regs->di, &sc->di); | 351 | |
| 332 | err |= __put_user(regs->si, &sc->si); | 352 | put_user_ex(regs->di, &sc->di); |
| 333 | err |= __put_user(regs->bp, &sc->bp); | 353 | put_user_ex(regs->si, &sc->si); |
| 334 | err |= __put_user(regs->sp, &sc->sp); | 354 | put_user_ex(regs->bp, &sc->bp); |
| 335 | err |= __put_user(regs->bx, &sc->bx); | 355 | put_user_ex(regs->sp, &sc->sp); |
| 336 | err |= __put_user(regs->dx, &sc->dx); | 356 | put_user_ex(regs->bx, &sc->bx); |
| 337 | err |= __put_user(regs->cx, &sc->cx); | 357 | put_user_ex(regs->dx, &sc->dx); |
| 338 | err |= __put_user(regs->ax, &sc->ax); | 358 | put_user_ex(regs->cx, &sc->cx); |
| 339 | err |= __put_user(current->thread.trap_no, &sc->trapno); | 359 | put_user_ex(regs->ax, &sc->ax); |
| 340 | err |= __put_user(current->thread.error_code, &sc->err); | 360 | put_user_ex(current->thread.trap_no, &sc->trapno); |
| 341 | err |= __put_user(regs->ip, &sc->ip); | 361 | put_user_ex(current->thread.error_code, &sc->err); |
| 342 | err |= __put_user(regs->cs, (unsigned int __user *)&sc->cs); | 362 | put_user_ex(regs->ip, &sc->ip); |
| 343 | err |= __put_user(regs->flags, &sc->flags); | 363 | put_user_ex(regs->cs, (unsigned int __user *)&sc->cs); |
| 344 | err |= __put_user(regs->sp, &sc->sp_at_signal); | 364 | put_user_ex(regs->flags, &sc->flags); |
| 345 | err |= __put_user(regs->ss, (unsigned int __user *)&sc->ss); | 365 | put_user_ex(regs->sp, &sc->sp_at_signal); |
| 346 | 366 | put_user_ex(regs->ss, (unsigned int __user *)&sc->ss); | |
| 347 | err |= __put_user(ptr_to_compat(fpstate), &sc->fpstate); | 367 | |
| 348 | 368 | put_user_ex(ptr_to_compat(fpstate), &sc->fpstate); | |
| 349 | /* non-iBCS2 extensions.. */ | 369 | |
| 350 | err |= __put_user(mask, &sc->oldmask); | 370 | /* non-iBCS2 extensions.. */ |
| 351 | err |= __put_user(current->thread.cr2, &sc->cr2); | 371 | put_user_ex(mask, &sc->oldmask); |
| 372 | put_user_ex(current->thread.cr2, &sc->cr2); | ||
| 373 | } put_user_catch(err); | ||
| 352 | 374 | ||
| 353 | return err; | 375 | return err; |
| 354 | } | 376 | } |
| @@ -437,13 +459,17 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka, | |||
| 437 | else | 459 | else |
| 438 | restorer = &frame->retcode; | 460 | restorer = &frame->retcode; |
| 439 | } | 461 | } |
| 440 | err |= __put_user(ptr_to_compat(restorer), &frame->pretcode); | ||
| 441 | 462 | ||
| 442 | /* | 463 | put_user_try { |
| 443 | * These are actually not used anymore, but left because some | 464 | put_user_ex(ptr_to_compat(restorer), &frame->pretcode); |
| 444 | * gdb versions depend on them as a marker. | 465 | |
| 445 | */ | 466 | /* |
| 446 | err |= __put_user(*((u64 *)&code), (u64 *)frame->retcode); | 467 | * These are actually not used anymore, but left because some |
| 468 | * gdb versions depend on them as a marker. | ||
| 469 | */ | ||
| 470 | put_user_ex(*((u64 *)&code), (u64 *)frame->retcode); | ||
| 471 | } put_user_catch(err); | ||
| 472 | |||
| 447 | if (err) | 473 | if (err) |
| 448 | return -EFAULT; | 474 | return -EFAULT; |
| 449 | 475 | ||
| @@ -496,41 +522,40 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 496 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 522 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
| 497 | return -EFAULT; | 523 | return -EFAULT; |
| 498 | 524 | ||
| 499 | err |= __put_user(sig, &frame->sig); | 525 | put_user_try { |
| 500 | err |= __put_user(ptr_to_compat(&frame->info), &frame->pinfo); | 526 | put_user_ex(sig, &frame->sig); |
| 501 | err |= __put_user(ptr_to_compat(&frame->uc), &frame->puc); | 527 | put_user_ex(ptr_to_compat(&frame->info), &frame->pinfo); |
| 502 | err |= copy_siginfo_to_user32(&frame->info, info); | 528 | put_user_ex(ptr_to_compat(&frame->uc), &frame->puc); |
| 503 | if (err) | 529 | err |= copy_siginfo_to_user32(&frame->info, info); |
| 504 | return -EFAULT; | ||
| 505 | 530 | ||
| 506 | /* Create the ucontext. */ | 531 | /* Create the ucontext. */ |
| 507 | if (cpu_has_xsave) | 532 | if (cpu_has_xsave) |
| 508 | err |= __put_user(UC_FP_XSTATE, &frame->uc.uc_flags); | 533 | put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags); |
| 509 | else | 534 | else |
| 510 | err |= __put_user(0, &frame->uc.uc_flags); | 535 | put_user_ex(0, &frame->uc.uc_flags); |
| 511 | err |= __put_user(0, &frame->uc.uc_link); | 536 | put_user_ex(0, &frame->uc.uc_link); |
| 512 | err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | 537 | put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); |
| 513 | err |= __put_user(sas_ss_flags(regs->sp), | 538 | put_user_ex(sas_ss_flags(regs->sp), |
| 514 | &frame->uc.uc_stack.ss_flags); | 539 | &frame->uc.uc_stack.ss_flags); |
| 515 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | 540 | put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size); |
| 516 | err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, fpstate, | 541 | err |= ia32_setup_sigcontext(&frame->uc.uc_mcontext, fpstate, |
| 517 | regs, set->sig[0]); | 542 | regs, set->sig[0]); |
| 518 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 543 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); |
| 519 | if (err) | 544 | |
| 520 | return -EFAULT; | 545 | if (ka->sa.sa_flags & SA_RESTORER) |
| 546 | restorer = ka->sa.sa_restorer; | ||
| 547 | else | ||
| 548 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, | ||
| 549 | rt_sigreturn); | ||
| 550 | put_user_ex(ptr_to_compat(restorer), &frame->pretcode); | ||
| 551 | |||
| 552 | /* | ||
| 553 | * Not actually used anymore, but left because some gdb | ||
| 554 | * versions need it. | ||
| 555 | */ | ||
| 556 | put_user_ex(*((u64 *)&code), (u64 *)frame->retcode); | ||
| 557 | } put_user_catch(err); | ||
| 521 | 558 | ||
| 522 | if (ka->sa.sa_flags & SA_RESTORER) | ||
| 523 | restorer = ka->sa.sa_restorer; | ||
| 524 | else | ||
| 525 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, | ||
| 526 | rt_sigreturn); | ||
| 527 | err |= __put_user(ptr_to_compat(restorer), &frame->pretcode); | ||
| 528 | |||
| 529 | /* | ||
| 530 | * Not actually used anymore, but left because some gdb | ||
| 531 | * versions need it. | ||
| 532 | */ | ||
| 533 | err |= __put_user(*((u64 *)&code), (u64 *)frame->retcode); | ||
| 534 | if (err) | 559 | if (err) |
| 535 | return -EFAULT; | 560 | return -EFAULT; |
| 536 | 561 | ||
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index 5a0d76dc56a4..097a6b64c24d 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S | |||
| @@ -112,8 +112,8 @@ ENTRY(ia32_sysenter_target) | |||
| 112 | CFI_DEF_CFA rsp,0 | 112 | CFI_DEF_CFA rsp,0 |
| 113 | CFI_REGISTER rsp,rbp | 113 | CFI_REGISTER rsp,rbp |
| 114 | SWAPGS_UNSAFE_STACK | 114 | SWAPGS_UNSAFE_STACK |
| 115 | movq %gs:pda_kernelstack, %rsp | 115 | movq PER_CPU_VAR(kernel_stack), %rsp |
| 116 | addq $(PDA_STACKOFFSET),%rsp | 116 | addq $(KERNEL_STACK_OFFSET),%rsp |
| 117 | /* | 117 | /* |
| 118 | * No need to follow this irqs on/off section: the syscall | 118 | * No need to follow this irqs on/off section: the syscall |
| 119 | * disabled irqs, here we enable it straight after entry: | 119 | * disabled irqs, here we enable it straight after entry: |
| @@ -273,13 +273,13 @@ ENDPROC(ia32_sysenter_target) | |||
| 273 | ENTRY(ia32_cstar_target) | 273 | ENTRY(ia32_cstar_target) |
| 274 | CFI_STARTPROC32 simple | 274 | CFI_STARTPROC32 simple |
| 275 | CFI_SIGNAL_FRAME | 275 | CFI_SIGNAL_FRAME |
| 276 | CFI_DEF_CFA rsp,PDA_STACKOFFSET | 276 | CFI_DEF_CFA rsp,KERNEL_STACK_OFFSET |
| 277 | CFI_REGISTER rip,rcx | 277 | CFI_REGISTER rip,rcx |
| 278 | /*CFI_REGISTER rflags,r11*/ | 278 | /*CFI_REGISTER rflags,r11*/ |
| 279 | SWAPGS_UNSAFE_STACK | 279 | SWAPGS_UNSAFE_STACK |
| 280 | movl %esp,%r8d | 280 | movl %esp,%r8d |
| 281 | CFI_REGISTER rsp,r8 | 281 | CFI_REGISTER rsp,r8 |
| 282 | movq %gs:pda_kernelstack,%rsp | 282 | movq PER_CPU_VAR(kernel_stack),%rsp |
| 283 | /* | 283 | /* |
| 284 | * No need to follow this irqs on/off section: the syscall | 284 | * No need to follow this irqs on/off section: the syscall |
| 285 | * disabled irqs and here we enable it straight after entry: | 285 | * disabled irqs and here we enable it straight after entry: |
diff --git a/arch/x86/include/asm/a.out-core.h b/arch/x86/include/asm/a.out-core.h index 3c601f8224be..bb70e397aa84 100644 --- a/arch/x86/include/asm/a.out-core.h +++ b/arch/x86/include/asm/a.out-core.h | |||
| @@ -55,7 +55,7 @@ static inline void aout_dump_thread(struct pt_regs *regs, struct user *dump) | |||
| 55 | dump->regs.ds = (u16)regs->ds; | 55 | dump->regs.ds = (u16)regs->ds; |
| 56 | dump->regs.es = (u16)regs->es; | 56 | dump->regs.es = (u16)regs->es; |
| 57 | dump->regs.fs = (u16)regs->fs; | 57 | dump->regs.fs = (u16)regs->fs; |
| 58 | savesegment(gs, dump->regs.gs); | 58 | dump->regs.gs = get_user_gs(regs); |
| 59 | dump->regs.orig_ax = regs->orig_ax; | 59 | dump->regs.orig_ax = regs->orig_ax; |
| 60 | dump->regs.ip = regs->ip; | 60 | dump->regs.ip = regs->ip; |
| 61 | dump->regs.cs = (u16)regs->cs; | 61 | dump->regs.cs = (u16)regs->cs; |
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h index 9830681446ad..4518dc500903 100644 --- a/arch/x86/include/asm/acpi.h +++ b/arch/x86/include/asm/acpi.h | |||
| @@ -102,9 +102,6 @@ static inline void disable_acpi(void) | |||
| 102 | acpi_noirq = 1; | 102 | acpi_noirq = 1; |
| 103 | } | 103 | } |
| 104 | 104 | ||
| 105 | /* Fixmap pages to reserve for ACPI boot-time tables (see fixmap.h) */ | ||
| 106 | #define FIX_ACPI_PAGES 4 | ||
| 107 | |||
| 108 | extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq); | 105 | extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq); |
| 109 | 106 | ||
| 110 | static inline void acpi_noirq_set(void) { acpi_noirq = 1; } | 107 | static inline void acpi_noirq_set(void) { acpi_noirq = 1; } |
diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index ab1d51a8855e..dce1bf696cca 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h | |||
| @@ -1,15 +1,18 @@ | |||
| 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/cpumask.h> |
| 5 | #include <linux/delay.h> | 5 | #include <linux/delay.h> |
| 6 | #include <linux/pm.h> | ||
| 6 | 7 | ||
| 7 | #include <asm/alternative.h> | 8 | #include <asm/alternative.h> |
| 8 | #include <asm/fixmap.h> | 9 | #include <asm/cpufeature.h> |
| 9 | #include <asm/apicdef.h> | ||
| 10 | #include <asm/processor.h> | 10 | #include <asm/processor.h> |
| 11 | #include <asm/apicdef.h> | ||
| 12 | #include <asm/atomic.h> | ||
| 13 | #include <asm/fixmap.h> | ||
| 14 | #include <asm/mpspec.h> | ||
| 11 | #include <asm/system.h> | 15 | #include <asm/system.h> |
| 12 | #include <asm/cpufeature.h> | ||
| 13 | #include <asm/msr.h> | 16 | #include <asm/msr.h> |
| 14 | 17 | ||
| 15 | #define ARCH_APICTIMER_STOPS_ON_C3 1 | 18 | #define ARCH_APICTIMER_STOPS_ON_C3 1 |
| @@ -33,7 +36,13 @@ | |||
| 33 | } while (0) | 36 | } while (0) |
| 34 | 37 | ||
| 35 | 38 | ||
| 39 | #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_32) | ||
| 36 | extern void generic_apic_probe(void); | 40 | extern void generic_apic_probe(void); |
| 41 | #else | ||
| 42 | static inline void generic_apic_probe(void) | ||
| 43 | { | ||
| 44 | } | ||
| 45 | #endif | ||
| 37 | 46 | ||
| 38 | #ifdef CONFIG_X86_LOCAL_APIC | 47 | #ifdef CONFIG_X86_LOCAL_APIC |
| 39 | 48 | ||
| @@ -41,6 +50,21 @@ extern unsigned int apic_verbosity; | |||
| 41 | extern int local_apic_timer_c2_ok; | 50 | extern int local_apic_timer_c2_ok; |
| 42 | 51 | ||
| 43 | extern int disable_apic; | 52 | extern int disable_apic; |
| 53 | |||
| 54 | #ifdef CONFIG_SMP | ||
| 55 | extern void __inquire_remote_apic(int apicid); | ||
| 56 | #else /* CONFIG_SMP */ | ||
| 57 | static inline void __inquire_remote_apic(int apicid) | ||
| 58 | { | ||
| 59 | } | ||
| 60 | #endif /* CONFIG_SMP */ | ||
| 61 | |||
| 62 | static inline void default_inquire_remote_apic(int apicid) | ||
| 63 | { | ||
| 64 | if (apic_verbosity >= APIC_DEBUG) | ||
| 65 | __inquire_remote_apic(apicid); | ||
| 66 | } | ||
| 67 | |||
| 44 | /* | 68 | /* |
| 45 | * Basic functions accessing APICs. | 69 | * Basic functions accessing APICs. |
| 46 | */ | 70 | */ |
| @@ -71,6 +95,12 @@ static inline u32 native_apic_mem_read(u32 reg) | |||
| 71 | return *((volatile u32 *)(APIC_BASE + reg)); | 95 | return *((volatile u32 *)(APIC_BASE + reg)); |
| 72 | } | 96 | } |
| 73 | 97 | ||
| 98 | extern void native_apic_wait_icr_idle(void); | ||
| 99 | extern u32 native_safe_apic_wait_icr_idle(void); | ||
| 100 | extern void native_apic_icr_write(u32 low, u32 id); | ||
| 101 | extern u64 native_apic_icr_read(void); | ||
| 102 | |||
| 103 | #ifdef CONFIG_X86_X2APIC | ||
| 74 | static inline void native_apic_msr_write(u32 reg, u32 v) | 104 | static inline void native_apic_msr_write(u32 reg, u32 v) |
| 75 | { | 105 | { |
| 76 | if (reg == APIC_DFR || reg == APIC_ID || reg == APIC_LDR || | 106 | if (reg == APIC_DFR || reg == APIC_ID || reg == APIC_LDR || |
| @@ -91,7 +121,31 @@ static inline u32 native_apic_msr_read(u32 reg) | |||
| 91 | return low; | 121 | return low; |
| 92 | } | 122 | } |
| 93 | 123 | ||
| 94 | #ifndef CONFIG_X86_32 | 124 | static inline void native_x2apic_wait_icr_idle(void) |
| 125 | { | ||
| 126 | /* no need to wait for icr idle in x2apic */ | ||
| 127 | return; | ||
| 128 | } | ||
| 129 | |||
| 130 | static inline u32 native_safe_x2apic_wait_icr_idle(void) | ||
| 131 | { | ||
| 132 | /* no need to wait for icr idle in x2apic */ | ||
| 133 | return 0; | ||
| 134 | } | ||
| 135 | |||
| 136 | static inline void native_x2apic_icr_write(u32 low, u32 id) | ||
| 137 | { | ||
| 138 | wrmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), ((__u64) id) << 32 | low); | ||
| 139 | } | ||
| 140 | |||
| 141 | static inline u64 native_x2apic_icr_read(void) | ||
| 142 | { | ||
| 143 | unsigned long val; | ||
| 144 | |||
| 145 | rdmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), val); | ||
| 146 | return val; | ||
| 147 | } | ||
| 148 | |||
| 95 | extern int x2apic; | 149 | extern int x2apic; |
| 96 | extern void check_x2apic(void); | 150 | extern void check_x2apic(void); |
| 97 | extern void enable_x2apic(void); | 151 | extern void enable_x2apic(void); |
| @@ -110,30 +164,24 @@ static inline int x2apic_enabled(void) | |||
| 110 | return 0; | 164 | return 0; |
| 111 | } | 165 | } |
| 112 | #else | 166 | #else |
| 113 | #define x2apic_enabled() 0 | 167 | static inline void check_x2apic(void) |
| 168 | { | ||
| 169 | } | ||
| 170 | static inline void enable_x2apic(void) | ||
| 171 | { | ||
| 172 | } | ||
| 173 | static inline void enable_IR_x2apic(void) | ||
| 174 | { | ||
| 175 | } | ||
| 176 | static inline int x2apic_enabled(void) | ||
| 177 | { | ||
| 178 | return 0; | ||
| 179 | } | ||
| 114 | #endif | 180 | #endif |
| 115 | 181 | ||
| 116 | struct apic_ops { | ||
| 117 | u32 (*read)(u32 reg); | ||
| 118 | void (*write)(u32 reg, u32 v); | ||
| 119 | u64 (*icr_read)(void); | ||
| 120 | void (*icr_write)(u32 low, u32 high); | ||
| 121 | void (*wait_icr_idle)(void); | ||
| 122 | u32 (*safe_wait_icr_idle)(void); | ||
| 123 | }; | ||
| 124 | |||
| 125 | extern struct apic_ops *apic_ops; | ||
| 126 | |||
| 127 | #define apic_read (apic_ops->read) | ||
| 128 | #define apic_write (apic_ops->write) | ||
| 129 | #define apic_icr_read (apic_ops->icr_read) | ||
| 130 | #define apic_icr_write (apic_ops->icr_write) | ||
| 131 | #define apic_wait_icr_idle (apic_ops->wait_icr_idle) | ||
| 132 | #define safe_apic_wait_icr_idle (apic_ops->safe_wait_icr_idle) | ||
| 133 | |||
| 134 | extern int get_physical_broadcast(void); | 182 | extern int get_physical_broadcast(void); |
| 135 | 183 | ||
| 136 | #ifdef CONFIG_X86_64 | 184 | #ifdef CONFIG_X86_X2APIC |
| 137 | static inline void ack_x2APIC_irq(void) | 185 | static inline void ack_x2APIC_irq(void) |
| 138 | { | 186 | { |
| 139 | /* Docs say use 0 for future compatibility */ | 187 | /* Docs say use 0 for future compatibility */ |
| @@ -141,18 +189,6 @@ static inline void ack_x2APIC_irq(void) | |||
| 141 | } | 189 | } |
| 142 | #endif | 190 | #endif |
| 143 | 191 | ||
| 144 | |||
| 145 | static inline void ack_APIC_irq(void) | ||
| 146 | { | ||
| 147 | /* | ||
| 148 | * ack_APIC_irq() actually gets compiled as a single instruction | ||
| 149 | * ... yummie. | ||
| 150 | */ | ||
| 151 | |||
| 152 | /* Docs say use 0 for future compatibility */ | ||
| 153 | apic_write(APIC_EOI, 0); | ||
| 154 | } | ||
| 155 | |||
| 156 | extern int lapic_get_maxlvt(void); | 192 | extern int lapic_get_maxlvt(void); |
| 157 | extern void clear_local_APIC(void); | 193 | extern void clear_local_APIC(void); |
| 158 | extern void connect_bsp_APIC(void); | 194 | extern void connect_bsp_APIC(void); |
| @@ -196,4 +232,316 @@ static inline void disable_local_APIC(void) { } | |||
| 196 | 232 | ||
| 197 | #endif /* !CONFIG_X86_LOCAL_APIC */ | 233 | #endif /* !CONFIG_X86_LOCAL_APIC */ |
| 198 | 234 | ||
| 235 | #ifdef CONFIG_X86_64 | ||
| 236 | #define SET_APIC_ID(x) (apic->set_apic_id(x)) | ||
| 237 | #else | ||
| 238 | |||
| 239 | #endif | ||
| 240 | |||
| 241 | /* | ||
| 242 | * Copyright 2004 James Cleverdon, IBM. | ||
| 243 | * Subject to the GNU Public License, v.2 | ||
| 244 | * | ||
| 245 | * Generic APIC sub-arch data struct. | ||
| 246 | * | ||
| 247 | * Hacked for x86-64 by James Cleverdon from i386 architecture code by | ||
| 248 | * Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and | ||
| 249 | * James Cleverdon. | ||
| 250 | */ | ||
| 251 | struct apic { | ||
| 252 | char *name; | ||
| 253 | |||
| 254 | int (*probe)(void); | ||
| 255 | int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id); | ||
| 256 | int (*apic_id_registered)(void); | ||
| 257 | |||
| 258 | u32 irq_delivery_mode; | ||
| 259 | u32 irq_dest_mode; | ||
| 260 | |||
| 261 | const struct cpumask *(*target_cpus)(void); | ||
| 262 | |||
| 263 | int disable_esr; | ||
| 264 | |||
| 265 | int dest_logical; | ||
| 266 | unsigned long (*check_apicid_used)(physid_mask_t bitmap, int apicid); | ||
| 267 | unsigned long (*check_apicid_present)(int apicid); | ||
| 268 | |||
| 269 | void (*vector_allocation_domain)(int cpu, struct cpumask *retmask); | ||
| 270 | void (*init_apic_ldr)(void); | ||
| 271 | |||
| 272 | physid_mask_t (*ioapic_phys_id_map)(physid_mask_t map); | ||
| 273 | |||
| 274 | void (*setup_apic_routing)(void); | ||
| 275 | int (*multi_timer_check)(int apic, int irq); | ||
| 276 | int (*apicid_to_node)(int logical_apicid); | ||
| 277 | int (*cpu_to_logical_apicid)(int cpu); | ||
| 278 | int (*cpu_present_to_apicid)(int mps_cpu); | ||
| 279 | physid_mask_t (*apicid_to_cpu_present)(int phys_apicid); | ||
| 280 | void (*setup_portio_remap)(void); | ||
| 281 | int (*check_phys_apicid_present)(int boot_cpu_physical_apicid); | ||
| 282 | void (*enable_apic_mode)(void); | ||
| 283 | int (*phys_pkg_id)(int cpuid_apic, int index_msb); | ||
| 284 | |||
| 285 | /* | ||
| 286 | * When one of the next two hooks returns 1 the apic | ||
| 287 | * is switched to this. Essentially they are additional | ||
| 288 | * probe functions: | ||
| 289 | */ | ||
| 290 | int (*mps_oem_check)(struct mpc_table *mpc, char *oem, char *productid); | ||
| 291 | |||
| 292 | unsigned int (*get_apic_id)(unsigned long x); | ||
| 293 | unsigned long (*set_apic_id)(unsigned int id); | ||
| 294 | unsigned long apic_id_mask; | ||
| 295 | |||
| 296 | unsigned int (*cpu_mask_to_apicid)(const struct cpumask *cpumask); | ||
| 297 | unsigned int (*cpu_mask_to_apicid_and)(const struct cpumask *cpumask, | ||
| 298 | const struct cpumask *andmask); | ||
| 299 | |||
| 300 | /* ipi */ | ||
| 301 | void (*send_IPI_mask)(const struct cpumask *mask, int vector); | ||
| 302 | void (*send_IPI_mask_allbutself)(const struct cpumask *mask, | ||
| 303 | int vector); | ||
| 304 | void (*send_IPI_allbutself)(int vector); | ||
| 305 | void (*send_IPI_all)(int vector); | ||
| 306 | void (*send_IPI_self)(int vector); | ||
| 307 | |||
| 308 | /* wakeup_secondary_cpu */ | ||
| 309 | int (*wakeup_cpu)(int apicid, unsigned long start_eip); | ||
| 310 | |||
| 311 | int trampoline_phys_low; | ||
| 312 | int trampoline_phys_high; | ||
| 313 | |||
| 314 | void (*wait_for_init_deassert)(atomic_t *deassert); | ||
| 315 | void (*smp_callin_clear_local_apic)(void); | ||
| 316 | void (*inquire_remote_apic)(int apicid); | ||
| 317 | |||
| 318 | /* apic ops */ | ||
| 319 | u32 (*read)(u32 reg); | ||
| 320 | void (*write)(u32 reg, u32 v); | ||
| 321 | u64 (*icr_read)(void); | ||
| 322 | void (*icr_write)(u32 low, u32 high); | ||
| 323 | void (*wait_icr_idle)(void); | ||
| 324 | u32 (*safe_wait_icr_idle)(void); | ||
| 325 | }; | ||
| 326 | |||
| 327 | extern struct apic *apic; | ||
| 328 | |||
| 329 | static inline u32 apic_read(u32 reg) | ||
| 330 | { | ||
| 331 | return apic->read(reg); | ||
| 332 | } | ||
| 333 | |||
| 334 | static inline void apic_write(u32 reg, u32 val) | ||
| 335 | { | ||
| 336 | apic->write(reg, val); | ||
| 337 | } | ||
| 338 | |||
| 339 | static inline u64 apic_icr_read(void) | ||
| 340 | { | ||
| 341 | return apic->icr_read(); | ||
| 342 | } | ||
| 343 | |||
| 344 | static inline void apic_icr_write(u32 low, u32 high) | ||
| 345 | { | ||
| 346 | apic->icr_write(low, high); | ||
| 347 | } | ||
| 348 | |||
| 349 | static inline void apic_wait_icr_idle(void) | ||
| 350 | { | ||
| 351 | apic->wait_icr_idle(); | ||
| 352 | } | ||
| 353 | |||
| 354 | static inline u32 safe_apic_wait_icr_idle(void) | ||
| 355 | { | ||
| 356 | return apic->safe_wait_icr_idle(); | ||
| 357 | } | ||
| 358 | |||
| 359 | |||
| 360 | static inline void ack_APIC_irq(void) | ||
| 361 | { | ||
| 362 | /* | ||
| 363 | * ack_APIC_irq() actually gets compiled as a single instruction | ||
| 364 | * ... yummie. | ||
| 365 | */ | ||
| 366 | |||
| 367 | /* Docs say use 0 for future compatibility */ | ||
| 368 | apic_write(APIC_EOI, 0); | ||
| 369 | } | ||
| 370 | |||
| 371 | static inline unsigned default_get_apic_id(unsigned long x) | ||
| 372 | { | ||
| 373 | unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR)); | ||
| 374 | |||
| 375 | if (APIC_XAPIC(ver)) | ||
| 376 | return (x >> 24) & 0xFF; | ||
| 377 | else | ||
| 378 | return (x >> 24) & 0x0F; | ||
| 379 | } | ||
| 380 | |||
| 381 | /* | ||
| 382 | * Warm reset vector default position: | ||
| 383 | */ | ||
| 384 | #define DEFAULT_TRAMPOLINE_PHYS_LOW 0x467 | ||
| 385 | #define DEFAULT_TRAMPOLINE_PHYS_HIGH 0x469 | ||
| 386 | |||
| 387 | #ifdef CONFIG_X86_32 | ||
| 388 | extern void es7000_update_apic_to_cluster(void); | ||
| 389 | #else | ||
| 390 | extern struct apic apic_flat; | ||
| 391 | extern struct apic apic_physflat; | ||
| 392 | extern struct apic apic_x2apic_cluster; | ||
| 393 | extern struct apic apic_x2apic_phys; | ||
| 394 | extern int default_acpi_madt_oem_check(char *, char *); | ||
| 395 | |||
| 396 | extern void apic_send_IPI_self(int vector); | ||
| 397 | |||
| 398 | extern struct apic apic_x2apic_uv_x; | ||
| 399 | DECLARE_PER_CPU(int, x2apic_extra_bits); | ||
| 400 | |||
| 401 | extern int default_cpu_present_to_apicid(int mps_cpu); | ||
| 402 | extern int default_check_phys_apicid_present(int boot_cpu_physical_apicid); | ||
| 403 | #endif | ||
| 404 | |||
| 405 | static inline void default_wait_for_init_deassert(atomic_t *deassert) | ||
| 406 | { | ||
| 407 | while (!atomic_read(deassert)) | ||
| 408 | cpu_relax(); | ||
| 409 | return; | ||
| 410 | } | ||
| 411 | |||
| 412 | extern void generic_bigsmp_probe(void); | ||
| 413 | |||
| 414 | |||
| 415 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 416 | |||
| 417 | #include <asm/smp.h> | ||
| 418 | |||
| 419 | #define APIC_DFR_VALUE (APIC_DFR_FLAT) | ||
| 420 | |||
| 421 | static inline const struct cpumask *default_target_cpus(void) | ||
| 422 | { | ||
| 423 | #ifdef CONFIG_SMP | ||
| 424 | return cpu_online_mask; | ||
| 425 | #else | ||
| 426 | return cpumask_of(0); | ||
| 427 | #endif | ||
| 428 | } | ||
| 429 | |||
| 430 | DECLARE_EARLY_PER_CPU(u16, x86_bios_cpu_apicid); | ||
| 431 | |||
| 432 | |||
| 433 | static inline unsigned int read_apic_id(void) | ||
| 434 | { | ||
| 435 | unsigned int reg; | ||
| 436 | |||
| 437 | reg = apic_read(APIC_ID); | ||
| 438 | |||
| 439 | return apic->get_apic_id(reg); | ||
| 440 | } | ||
| 441 | |||
| 442 | extern void default_setup_apic_routing(void); | ||
| 443 | |||
| 444 | #ifdef CONFIG_X86_32 | ||
| 445 | /* | ||
| 446 | * Set up the logical destination ID. | ||
| 447 | * | ||
| 448 | * Intel recommends to set DFR, LDR and TPR before enabling | ||
| 449 | * an APIC. See e.g. "AP-388 82489DX User's Manual" (Intel | ||
| 450 | * document number 292116). So here it goes... | ||
| 451 | */ | ||
| 452 | extern void default_init_apic_ldr(void); | ||
| 453 | |||
| 454 | static inline int default_apic_id_registered(void) | ||
| 455 | { | ||
| 456 | return physid_isset(read_apic_id(), phys_cpu_present_map); | ||
| 457 | } | ||
| 458 | |||
| 459 | static inline unsigned int | ||
| 460 | default_cpu_mask_to_apicid(const struct cpumask *cpumask) | ||
| 461 | { | ||
| 462 | return cpumask_bits(cpumask)[0]; | ||
| 463 | } | ||
| 464 | |||
| 465 | static inline unsigned int | ||
| 466 | default_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | ||
| 467 | const struct cpumask *andmask) | ||
| 468 | { | ||
| 469 | unsigned long mask1 = cpumask_bits(cpumask)[0]; | ||
| 470 | unsigned long mask2 = cpumask_bits(andmask)[0]; | ||
| 471 | unsigned long mask3 = cpumask_bits(cpu_online_mask)[0]; | ||
| 472 | |||
| 473 | return (unsigned int)(mask1 & mask2 & mask3); | ||
| 474 | } | ||
| 475 | |||
| 476 | static inline int default_phys_pkg_id(int cpuid_apic, int index_msb) | ||
| 477 | { | ||
| 478 | return cpuid_apic >> index_msb; | ||
| 479 | } | ||
| 480 | |||
| 481 | extern int default_apicid_to_node(int logical_apicid); | ||
| 482 | |||
| 483 | #endif | ||
| 484 | |||
| 485 | static inline unsigned long default_check_apicid_used(physid_mask_t bitmap, int apicid) | ||
| 486 | { | ||
| 487 | return physid_isset(apicid, bitmap); | ||
| 488 | } | ||
| 489 | |||
| 490 | static inline unsigned long default_check_apicid_present(int bit) | ||
| 491 | { | ||
| 492 | return physid_isset(bit, phys_cpu_present_map); | ||
| 493 | } | ||
| 494 | |||
| 495 | static inline physid_mask_t default_ioapic_phys_id_map(physid_mask_t phys_map) | ||
| 496 | { | ||
| 497 | return phys_map; | ||
| 498 | } | ||
| 499 | |||
| 500 | /* Mapping from cpu number to logical apicid */ | ||
| 501 | static inline int default_cpu_to_logical_apicid(int cpu) | ||
| 502 | { | ||
| 503 | return 1 << cpu; | ||
| 504 | } | ||
| 505 | |||
| 506 | static inline int __default_cpu_present_to_apicid(int mps_cpu) | ||
| 507 | { | ||
| 508 | if (mps_cpu < nr_cpu_ids && cpu_present(mps_cpu)) | ||
| 509 | return (int)per_cpu(x86_bios_cpu_apicid, mps_cpu); | ||
| 510 | else | ||
| 511 | return BAD_APICID; | ||
| 512 | } | ||
| 513 | |||
| 514 | static inline int | ||
| 515 | __default_check_phys_apicid_present(int boot_cpu_physical_apicid) | ||
| 516 | { | ||
| 517 | return physid_isset(boot_cpu_physical_apicid, phys_cpu_present_map); | ||
| 518 | } | ||
| 519 | |||
| 520 | #ifdef CONFIG_X86_32 | ||
| 521 | static inline int default_cpu_present_to_apicid(int mps_cpu) | ||
| 522 | { | ||
| 523 | return __default_cpu_present_to_apicid(mps_cpu); | ||
| 524 | } | ||
| 525 | |||
| 526 | static inline int | ||
| 527 | default_check_phys_apicid_present(int boot_cpu_physical_apicid) | ||
| 528 | { | ||
| 529 | return __default_check_phys_apicid_present(boot_cpu_physical_apicid); | ||
| 530 | } | ||
| 531 | #else | ||
| 532 | extern int default_cpu_present_to_apicid(int mps_cpu); | ||
| 533 | extern int default_check_phys_apicid_present(int boot_cpu_physical_apicid); | ||
| 534 | #endif | ||
| 535 | |||
| 536 | static inline physid_mask_t default_apicid_to_cpu_present(int phys_apicid) | ||
| 537 | { | ||
| 538 | return physid_mask_of_physid(phys_apicid); | ||
| 539 | } | ||
| 540 | |||
| 541 | #endif /* CONFIG_X86_LOCAL_APIC */ | ||
| 542 | |||
| 543 | #ifdef CONFIG_X86_32 | ||
| 544 | extern u8 cpu_2_logical_apicid[NR_CPUS]; | ||
| 545 | #endif | ||
| 546 | |||
| 199 | #endif /* _ASM_X86_APIC_H */ | 547 | #endif /* _ASM_X86_APIC_H */ |
diff --git a/arch/x86/include/asm/apicnum.h b/arch/x86/include/asm/apicnum.h new file mode 100644 index 000000000000..82f613c607ce --- /dev/null +++ b/arch/x86/include/asm/apicnum.h | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | #ifndef _ASM_X86_APICNUM_H | ||
| 2 | #define _ASM_X86_APICNUM_H | ||
| 3 | |||
| 4 | /* define MAX_IO_APICS */ | ||
| 5 | #ifdef CONFIG_X86_32 | ||
| 6 | # define MAX_IO_APICS 64 | ||
| 7 | #else | ||
| 8 | # define MAX_IO_APICS 128 | ||
| 9 | # define MAX_LOCAL_APIC 32768 | ||
| 10 | #endif | ||
| 11 | |||
| 12 | #endif /* _ASM_X86_APICNUM_H */ | ||
diff --git a/arch/x86/include/asm/mach-default/apm.h b/arch/x86/include/asm/apm.h index 20370c6db74b..20370c6db74b 100644 --- a/arch/x86/include/asm/mach-default/apm.h +++ b/arch/x86/include/asm/apm.h | |||
diff --git a/arch/x86/include/asm/bigsmp/apic.h b/arch/x86/include/asm/bigsmp/apic.h deleted file mode 100644 index d8dd9f537911..000000000000 --- a/arch/x86/include/asm/bigsmp/apic.h +++ /dev/null | |||
| @@ -1,155 +0,0 @@ | |||
| 1 | #ifndef __ASM_MACH_APIC_H | ||
| 2 | #define __ASM_MACH_APIC_H | ||
| 3 | |||
| 4 | #define xapic_phys_to_log_apicid(cpu) (per_cpu(x86_bios_cpu_apicid, cpu)) | ||
| 5 | #define esr_disable (1) | ||
| 6 | |||
| 7 | static inline int apic_id_registered(void) | ||
| 8 | { | ||
| 9 | return (1); | ||
| 10 | } | ||
| 11 | |||
| 12 | static inline const cpumask_t *target_cpus(void) | ||
| 13 | { | ||
| 14 | #ifdef CONFIG_SMP | ||
| 15 | return &cpu_online_map; | ||
| 16 | #else | ||
| 17 | return &cpumask_of_cpu(0); | ||
| 18 | #endif | ||
| 19 | } | ||
| 20 | |||
| 21 | #undef APIC_DEST_LOGICAL | ||
| 22 | #define APIC_DEST_LOGICAL 0 | ||
| 23 | #define APIC_DFR_VALUE (APIC_DFR_FLAT) | ||
| 24 | #define INT_DELIVERY_MODE (dest_Fixed) | ||
| 25 | #define INT_DEST_MODE (0) /* phys delivery to target proc */ | ||
| 26 | #define NO_BALANCE_IRQ (0) | ||
| 27 | |||
| 28 | static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid) | ||
| 29 | { | ||
| 30 | return (0); | ||
| 31 | } | ||
| 32 | |||
| 33 | static inline unsigned long check_apicid_present(int bit) | ||
| 34 | { | ||
| 35 | return (1); | ||
| 36 | } | ||
| 37 | |||
| 38 | static inline unsigned long calculate_ldr(int cpu) | ||
| 39 | { | ||
| 40 | unsigned long val, id; | ||
| 41 | val = apic_read(APIC_LDR) & ~APIC_LDR_MASK; | ||
| 42 | id = xapic_phys_to_log_apicid(cpu); | ||
| 43 | val |= SET_APIC_LOGICAL_ID(id); | ||
| 44 | return val; | ||
| 45 | } | ||
| 46 | |||
| 47 | /* | ||
| 48 | * Set up the logical destination ID. | ||
| 49 | * | ||
| 50 | * Intel recommends to set DFR, LDR and TPR before enabling | ||
| 51 | * an APIC. See e.g. "AP-388 82489DX User's Manual" (Intel | ||
| 52 | * document number 292116). So here it goes... | ||
| 53 | */ | ||
| 54 | static inline void init_apic_ldr(void) | ||
| 55 | { | ||
| 56 | unsigned long val; | ||
| 57 | int cpu = smp_processor_id(); | ||
| 58 | |||
| 59 | apic_write(APIC_DFR, APIC_DFR_VALUE); | ||
| 60 | val = calculate_ldr(cpu); | ||
| 61 | apic_write(APIC_LDR, val); | ||
| 62 | } | ||
| 63 | |||
| 64 | static inline void setup_apic_routing(void) | ||
| 65 | { | ||
| 66 | printk("Enabling APIC mode: %s. Using %d I/O APICs\n", | ||
| 67 | "Physflat", nr_ioapics); | ||
| 68 | } | ||
| 69 | |||
| 70 | static inline int multi_timer_check(int apic, int irq) | ||
| 71 | { | ||
| 72 | return (0); | ||
| 73 | } | ||
| 74 | |||
| 75 | static inline int apicid_to_node(int logical_apicid) | ||
| 76 | { | ||
| 77 | return apicid_2_node[hard_smp_processor_id()]; | ||
| 78 | } | ||
| 79 | |||
| 80 | static inline int cpu_present_to_apicid(int mps_cpu) | ||
| 81 | { | ||
| 82 | if (mps_cpu < nr_cpu_ids) | ||
| 83 | return (int) per_cpu(x86_bios_cpu_apicid, mps_cpu); | ||
| 84 | |||
| 85 | return BAD_APICID; | ||
| 86 | } | ||
| 87 | |||
| 88 | static inline physid_mask_t apicid_to_cpu_present(int phys_apicid) | ||
| 89 | { | ||
| 90 | return physid_mask_of_physid(phys_apicid); | ||
| 91 | } | ||
| 92 | |||
| 93 | extern u8 cpu_2_logical_apicid[]; | ||
| 94 | /* Mapping from cpu number to logical apicid */ | ||
| 95 | static inline int cpu_to_logical_apicid(int cpu) | ||
| 96 | { | ||
| 97 | if (cpu >= nr_cpu_ids) | ||
| 98 | return BAD_APICID; | ||
| 99 | return cpu_physical_id(cpu); | ||
| 100 | } | ||
| 101 | |||
| 102 | static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map) | ||
| 103 | { | ||
| 104 | /* For clustered we don't have a good way to do this yet - hack */ | ||
| 105 | return physids_promote(0xFFL); | ||
| 106 | } | ||
| 107 | |||
| 108 | static inline void setup_portio_remap(void) | ||
| 109 | { | ||
| 110 | } | ||
| 111 | |||
| 112 | static inline void enable_apic_mode(void) | ||
| 113 | { | ||
| 114 | } | ||
| 115 | |||
| 116 | static inline int check_phys_apicid_present(int boot_cpu_physical_apicid) | ||
| 117 | { | ||
| 118 | return (1); | ||
| 119 | } | ||
| 120 | |||
| 121 | /* As we are using single CPU as destination, pick only one CPU here */ | ||
| 122 | static inline unsigned int cpu_mask_to_apicid(const cpumask_t *cpumask) | ||
| 123 | { | ||
| 124 | int cpu; | ||
| 125 | int apicid; | ||
| 126 | |||
| 127 | cpu = first_cpu(*cpumask); | ||
| 128 | apicid = cpu_to_logical_apicid(cpu); | ||
| 129 | return apicid; | ||
| 130 | } | ||
| 131 | |||
| 132 | static inline unsigned int cpu_mask_to_apicid_and(const struct cpumask *cpumask, | ||
| 133 | const struct cpumask *andmask) | ||
| 134 | { | ||
| 135 | int cpu; | ||
| 136 | |||
| 137 | /* | ||
| 138 | * We're using fixed IRQ delivery, can only return one phys APIC ID. | ||
| 139 | * May as well be the first. | ||
| 140 | */ | ||
| 141 | for_each_cpu_and(cpu, cpumask, andmask) | ||
| 142 | if (cpumask_test_cpu(cpu, cpu_online_mask)) | ||
| 143 | break; | ||
| 144 | if (cpu < nr_cpu_ids) | ||
| 145 | return cpu_to_logical_apicid(cpu); | ||
| 146 | |||
| 147 | return BAD_APICID; | ||
| 148 | } | ||
| 149 | |||
| 150 | static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb) | ||
| 151 | { | ||
| 152 | return cpuid_apic >> index_msb; | ||
| 153 | } | ||
| 154 | |||
| 155 | #endif /* __ASM_MACH_APIC_H */ | ||
diff --git a/arch/x86/include/asm/bigsmp/apicdef.h b/arch/x86/include/asm/bigsmp/apicdef.h deleted file mode 100644 index 392c3f5ef2fe..000000000000 --- a/arch/x86/include/asm/bigsmp/apicdef.h +++ /dev/null | |||
| @@ -1,13 +0,0 @@ | |||
| 1 | #ifndef __ASM_MACH_APICDEF_H | ||
| 2 | #define __ASM_MACH_APICDEF_H | ||
| 3 | |||
| 4 | #define APIC_ID_MASK (0xFF<<24) | ||
| 5 | |||
| 6 | static inline unsigned get_apic_id(unsigned long x) | ||
| 7 | { | ||
| 8 | return (((x)>>24)&0xFF); | ||
| 9 | } | ||
| 10 | |||
| 11 | #define GET_APIC_ID(x) get_apic_id(x) | ||
| 12 | |||
| 13 | #endif | ||
diff --git a/arch/x86/include/asm/bigsmp/ipi.h b/arch/x86/include/asm/bigsmp/ipi.h deleted file mode 100644 index 27fcd01b3ae6..000000000000 --- a/arch/x86/include/asm/bigsmp/ipi.h +++ /dev/null | |||
| @@ -1,22 +0,0 @@ | |||
| 1 | #ifndef __ASM_MACH_IPI_H | ||
| 2 | #define __ASM_MACH_IPI_H | ||
| 3 | |||
| 4 | void send_IPI_mask_sequence(const struct cpumask *mask, int vector); | ||
| 5 | void send_IPI_mask_allbutself(const struct cpumask *mask, int vector); | ||
| 6 | |||
| 7 | static inline void send_IPI_mask(const struct cpumask *mask, int vector) | ||
| 8 | { | ||
| 9 | send_IPI_mask_sequence(mask, vector); | ||
| 10 | } | ||
| 11 | |||
| 12 | static inline void send_IPI_allbutself(int vector) | ||
| 13 | { | ||
| 14 | send_IPI_mask_allbutself(cpu_online_mask, vector); | ||
| 15 | } | ||
| 16 | |||
| 17 | static inline void send_IPI_all(int vector) | ||
| 18 | { | ||
| 19 | send_IPI_mask(cpu_online_mask, vector); | ||
| 20 | } | ||
| 21 | |||
| 22 | #endif /* __ASM_MACH_IPI_H */ | ||
diff --git a/arch/x86/include/asm/calling.h b/arch/x86/include/asm/calling.h index 2bc162e0ec6e..0e63c9a2a8d0 100644 --- a/arch/x86/include/asm/calling.h +++ b/arch/x86/include/asm/calling.h | |||
| @@ -1,5 +1,55 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Some macros to handle stack frames in assembly. | 2 | |
| 3 | x86 function call convention, 64-bit: | ||
| 4 | ------------------------------------- | ||
| 5 | arguments | callee-saved | extra caller-saved | return | ||
| 6 | [callee-clobbered] | | [callee-clobbered] | | ||
| 7 | --------------------------------------------------------------------------- | ||
| 8 | rdi rsi rdx rcx r8-9 | rbx rbp [*] r12-15 | r10-11 | rax, rdx [**] | ||
| 9 | |||
| 10 | ( rsp is obviously invariant across normal function calls. (gcc can 'merge' | ||
| 11 | functions when it sees tail-call optimization possibilities) rflags is | ||
| 12 | clobbered. Leftover arguments are passed over the stack frame.) | ||
| 13 | |||
| 14 | [*] In the frame-pointers case rbp is fixed to the stack frame. | ||
| 15 | |||
| 16 | [**] for struct return values wider than 64 bits the return convention is a | ||
| 17 | bit more complex: up to 128 bits width we return small structures | ||
| 18 | straight in rax, rdx. For structures larger than that (3 words or | ||
| 19 | larger) the caller puts a pointer to an on-stack return struct | ||
| 20 | [allocated in the caller's stack frame] into the first argument - i.e. | ||
| 21 | into rdi. All other arguments shift up by one in this case. | ||
| 22 | Fortunately this case is rare in the kernel. | ||
| 23 | |||
| 24 | For 32-bit we have the following conventions - kernel is built with | ||
| 25 | -mregparm=3 and -freg-struct-return: | ||
| 26 | |||
| 27 | x86 function calling convention, 32-bit: | ||
| 28 | ---------------------------------------- | ||
| 29 | arguments | callee-saved | extra caller-saved | return | ||
| 30 | [callee-clobbered] | | [callee-clobbered] | | ||
| 31 | ------------------------------------------------------------------------- | ||
| 32 | eax edx ecx | ebx edi esi ebp [*] | <none> | eax, edx [**] | ||
| 33 | |||
| 34 | ( here too esp is obviously invariant across normal function calls. eflags | ||
| 35 | is clobbered. Leftover arguments are passed over the stack frame. ) | ||
| 36 | |||
| 37 | [*] In the frame-pointers case ebp is fixed to the stack frame. | ||
| 38 | |||
| 39 | [**] We build with -freg-struct-return, which on 32-bit means similar | ||
| 40 | semantics as on 64-bit: edx can be used for a second return value | ||
| 41 | (i.e. covering integer and structure sizes up to 64 bits) - after that | ||
| 42 | it gets more complex and more expensive: 3-word or larger struct returns | ||
| 43 | get done in the caller's frame and the pointer to the return struct goes | ||
| 44 | into regparm0, i.e. eax - the other arguments shift up and the | ||
| 45 | function's register parameters degenerate to regparm=2 in essence. | ||
| 46 | |||
| 47 | */ | ||
| 48 | |||
| 49 | |||
| 50 | /* | ||
| 51 | * 64-bit system call stack frame layout defines and helpers, | ||
| 52 | * for assembly code: | ||
| 3 | */ | 53 | */ |
| 4 | 54 | ||
| 5 | #define R15 0 | 55 | #define R15 0 |
| @@ -9,7 +59,7 @@ | |||
| 9 | #define RBP 32 | 59 | #define RBP 32 |
| 10 | #define RBX 40 | 60 | #define RBX 40 |
| 11 | 61 | ||
| 12 | /* arguments: interrupts/non tracing syscalls only save upto here*/ | 62 | /* arguments: interrupts/non tracing syscalls only save up to here: */ |
| 13 | #define R11 48 | 63 | #define R11 48 |
| 14 | #define R10 56 | 64 | #define R10 56 |
| 15 | #define R9 64 | 65 | #define R9 64 |
| @@ -22,7 +72,7 @@ | |||
| 22 | #define ORIG_RAX 120 /* + error_code */ | 72 | #define ORIG_RAX 120 /* + error_code */ |
| 23 | /* end of arguments */ | 73 | /* end of arguments */ |
| 24 | 74 | ||
| 25 | /* cpu exception frame or undefined in case of fast syscall. */ | 75 | /* cpu exception frame or undefined in case of fast syscall: */ |
| 26 | #define RIP 128 | 76 | #define RIP 128 |
| 27 | #define CS 136 | 77 | #define CS 136 |
| 28 | #define EFLAGS 144 | 78 | #define EFLAGS 144 |
diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h index bae482df6039..b185091bf19c 100644 --- a/arch/x86/include/asm/cpu.h +++ b/arch/x86/include/asm/cpu.h | |||
| @@ -7,6 +7,20 @@ | |||
| 7 | #include <linux/nodemask.h> | 7 | #include <linux/nodemask.h> |
| 8 | #include <linux/percpu.h> | 8 | #include <linux/percpu.h> |
| 9 | 9 | ||
| 10 | #ifdef CONFIG_SMP | ||
| 11 | |||
| 12 | extern void prefill_possible_map(void); | ||
| 13 | |||
| 14 | #else /* CONFIG_SMP */ | ||
| 15 | |||
| 16 | static inline void prefill_possible_map(void) {} | ||
| 17 | |||
| 18 | #define cpu_physical_id(cpu) boot_cpu_physical_apicid | ||
| 19 | #define safe_smp_processor_id() 0 | ||
| 20 | #define stack_smp_processor_id() 0 | ||
| 21 | |||
| 22 | #endif /* CONFIG_SMP */ | ||
| 23 | |||
| 10 | struct x86_cpu { | 24 | struct x86_cpu { |
| 11 | struct cpu cpu; | 25 | struct cpu cpu; |
| 12 | }; | 26 | }; |
| @@ -17,4 +31,7 @@ extern void arch_unregister_cpu(int); | |||
| 17 | #endif | 31 | #endif |
| 18 | 32 | ||
| 19 | DECLARE_PER_CPU(int, cpu_state); | 33 | DECLARE_PER_CPU(int, cpu_state); |
| 34 | |||
| 35 | extern unsigned int boot_cpu_id; | ||
| 36 | |||
| 20 | #endif /* _ASM_X86_CPU_H */ | 37 | #endif /* _ASM_X86_CPU_H */ |
diff --git a/arch/x86/include/asm/cpumask.h b/arch/x86/include/asm/cpumask.h new file mode 100644 index 000000000000..a7f3c75f8ad7 --- /dev/null +++ b/arch/x86/include/asm/cpumask.h | |||
| @@ -0,0 +1,32 @@ | |||
| 1 | #ifndef _ASM_X86_CPUMASK_H | ||
| 2 | #define _ASM_X86_CPUMASK_H | ||
| 3 | #ifndef __ASSEMBLY__ | ||
| 4 | #include <linux/cpumask.h> | ||
| 5 | |||
| 6 | #ifdef CONFIG_X86_64 | ||
| 7 | |||
| 8 | extern cpumask_var_t cpu_callin_mask; | ||
| 9 | extern cpumask_var_t cpu_callout_mask; | ||
| 10 | extern cpumask_var_t cpu_initialized_mask; | ||
| 11 | extern cpumask_var_t cpu_sibling_setup_mask; | ||
| 12 | |||
| 13 | extern void setup_cpu_local_masks(void); | ||
| 14 | |||
| 15 | #else /* CONFIG_X86_32 */ | ||
| 16 | |||
| 17 | extern cpumask_t cpu_callin_map; | ||
| 18 | extern cpumask_t cpu_callout_map; | ||
| 19 | extern cpumask_t cpu_initialized; | ||
| 20 | extern cpumask_t cpu_sibling_setup_map; | ||
| 21 | |||
| 22 | #define cpu_callin_mask ((struct cpumask *)&cpu_callin_map) | ||
| 23 | #define cpu_callout_mask ((struct cpumask *)&cpu_callout_map) | ||
| 24 | #define cpu_initialized_mask ((struct cpumask *)&cpu_initialized) | ||
| 25 | #define cpu_sibling_setup_mask ((struct cpumask *)&cpu_sibling_setup_map) | ||
| 26 | |||
| 27 | static inline void setup_cpu_local_masks(void) { } | ||
| 28 | |||
| 29 | #endif /* CONFIG_X86_32 */ | ||
| 30 | |||
| 31 | #endif /* __ASSEMBLY__ */ | ||
| 32 | #endif /* _ASM_X86_CPUMASK_H */ | ||
diff --git a/arch/x86/include/asm/current.h b/arch/x86/include/asm/current.h index 0930b4f8d672..c68c361697e1 100644 --- a/arch/x86/include/asm/current.h +++ b/arch/x86/include/asm/current.h | |||
| @@ -1,39 +1,21 @@ | |||
| 1 | #ifndef _ASM_X86_CURRENT_H | 1 | #ifndef _ASM_X86_CURRENT_H |
| 2 | #define _ASM_X86_CURRENT_H | 2 | #define _ASM_X86_CURRENT_H |
| 3 | 3 | ||
| 4 | #ifdef CONFIG_X86_32 | ||
| 5 | #include <linux/compiler.h> | 4 | #include <linux/compiler.h> |
| 6 | #include <asm/percpu.h> | 5 | #include <asm/percpu.h> |
| 7 | 6 | ||
| 7 | #ifndef __ASSEMBLY__ | ||
| 8 | struct task_struct; | 8 | struct task_struct; |
| 9 | 9 | ||
| 10 | DECLARE_PER_CPU(struct task_struct *, current_task); | 10 | DECLARE_PER_CPU(struct task_struct *, current_task); |
| 11 | static __always_inline struct task_struct *get_current(void) | ||
| 12 | { | ||
| 13 | return x86_read_percpu(current_task); | ||
| 14 | } | ||
| 15 | |||
| 16 | #else /* X86_32 */ | ||
| 17 | |||
| 18 | #ifndef __ASSEMBLY__ | ||
| 19 | #include <asm/pda.h> | ||
| 20 | |||
| 21 | struct task_struct; | ||
| 22 | 11 | ||
| 23 | static __always_inline struct task_struct *get_current(void) | 12 | static __always_inline struct task_struct *get_current(void) |
| 24 | { | 13 | { |
| 25 | return read_pda(pcurrent); | 14 | return percpu_read(current_task); |
| 26 | } | 15 | } |
| 27 | 16 | ||
| 28 | #else /* __ASSEMBLY__ */ | 17 | #define current get_current() |
| 29 | |||
| 30 | #include <asm/asm-offsets.h> | ||
| 31 | #define GET_CURRENT(reg) movq %gs:(pda_pcurrent),reg | ||
| 32 | 18 | ||
| 33 | #endif /* __ASSEMBLY__ */ | 19 | #endif /* __ASSEMBLY__ */ |
| 34 | 20 | ||
| 35 | #endif /* X86_32 */ | ||
| 36 | |||
| 37 | #define current get_current() | ||
| 38 | |||
| 39 | #endif /* _ASM_X86_CURRENT_H */ | 21 | #endif /* _ASM_X86_CURRENT_H */ |
diff --git a/arch/x86/include/asm/mach-default/do_timer.h b/arch/x86/include/asm/do_timer.h index 23ecda0b28a0..23ecda0b28a0 100644 --- a/arch/x86/include/asm/mach-default/do_timer.h +++ b/arch/x86/include/asm/do_timer.h | |||
diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h index f51a3ddde01a..83c1bc8d2e8a 100644 --- a/arch/x86/include/asm/elf.h +++ b/arch/x86/include/asm/elf.h | |||
| @@ -112,7 +112,7 @@ extern unsigned int vdso_enabled; | |||
| 112 | * now struct_user_regs, they are different) | 112 | * now struct_user_regs, they are different) |
| 113 | */ | 113 | */ |
| 114 | 114 | ||
| 115 | #define ELF_CORE_COPY_REGS(pr_reg, regs) \ | 115 | #define ELF_CORE_COPY_REGS_COMMON(pr_reg, regs) \ |
| 116 | do { \ | 116 | do { \ |
| 117 | pr_reg[0] = regs->bx; \ | 117 | pr_reg[0] = regs->bx; \ |
| 118 | pr_reg[1] = regs->cx; \ | 118 | pr_reg[1] = regs->cx; \ |
| @@ -124,7 +124,6 @@ do { \ | |||
| 124 | pr_reg[7] = regs->ds & 0xffff; \ | 124 | pr_reg[7] = regs->ds & 0xffff; \ |
| 125 | pr_reg[8] = regs->es & 0xffff; \ | 125 | pr_reg[8] = regs->es & 0xffff; \ |
| 126 | pr_reg[9] = regs->fs & 0xffff; \ | 126 | pr_reg[9] = regs->fs & 0xffff; \ |
| 127 | savesegment(gs, pr_reg[10]); \ | ||
| 128 | pr_reg[11] = regs->orig_ax; \ | 127 | pr_reg[11] = regs->orig_ax; \ |
| 129 | pr_reg[12] = regs->ip; \ | 128 | pr_reg[12] = regs->ip; \ |
| 130 | pr_reg[13] = regs->cs & 0xffff; \ | 129 | pr_reg[13] = regs->cs & 0xffff; \ |
| @@ -133,6 +132,18 @@ do { \ | |||
| 133 | pr_reg[16] = regs->ss & 0xffff; \ | 132 | pr_reg[16] = regs->ss & 0xffff; \ |
| 134 | } while (0); | 133 | } while (0); |
| 135 | 134 | ||
| 135 | #define ELF_CORE_COPY_REGS(pr_reg, regs) \ | ||
| 136 | do { \ | ||
| 137 | ELF_CORE_COPY_REGS_COMMON(pr_reg, regs);\ | ||
| 138 | pr_reg[10] = get_user_gs(regs); \ | ||
| 139 | } while (0); | ||
| 140 | |||
| 141 | #define ELF_CORE_COPY_KERNEL_REGS(pr_reg, regs) \ | ||
| 142 | do { \ | ||
| 143 | ELF_CORE_COPY_REGS_COMMON(pr_reg, regs);\ | ||
| 144 | savesegment(gs, pr_reg[10]); \ | ||
| 145 | } while (0); | ||
| 146 | |||
| 136 | #define ELF_PLATFORM (utsname()->machine) | 147 | #define ELF_PLATFORM (utsname()->machine) |
| 137 | #define set_personality_64bit() do { } while (0) | 148 | #define set_personality_64bit() do { } while (0) |
| 138 | 149 | ||
diff --git a/arch/x86/include/asm/mach-default/entry_arch.h b/arch/x86/include/asm/entry_arch.h index 6b1add8e31dd..854d538ae857 100644 --- a/arch/x86/include/asm/mach-default/entry_arch.h +++ b/arch/x86/include/asm/entry_arch.h | |||
| @@ -9,12 +9,28 @@ | |||
| 9 | * is no hardware IRQ pin equivalent for them, they are triggered | 9 | * is no hardware IRQ pin equivalent for them, they are triggered |
| 10 | * through the ICC by us (IPIs) | 10 | * through the ICC by us (IPIs) |
| 11 | */ | 11 | */ |
| 12 | #ifdef CONFIG_X86_SMP | 12 | #ifdef CONFIG_SMP |
| 13 | BUILD_INTERRUPT(reschedule_interrupt,RESCHEDULE_VECTOR) | 13 | BUILD_INTERRUPT(reschedule_interrupt,RESCHEDULE_VECTOR) |
| 14 | BUILD_INTERRUPT(invalidate_interrupt,INVALIDATE_TLB_VECTOR) | ||
| 15 | BUILD_INTERRUPT(call_function_interrupt,CALL_FUNCTION_VECTOR) | 14 | BUILD_INTERRUPT(call_function_interrupt,CALL_FUNCTION_VECTOR) |
| 16 | BUILD_INTERRUPT(call_function_single_interrupt,CALL_FUNCTION_SINGLE_VECTOR) | 15 | BUILD_INTERRUPT(call_function_single_interrupt,CALL_FUNCTION_SINGLE_VECTOR) |
| 17 | BUILD_INTERRUPT(irq_move_cleanup_interrupt,IRQ_MOVE_CLEANUP_VECTOR) | 16 | BUILD_INTERRUPT(irq_move_cleanup_interrupt,IRQ_MOVE_CLEANUP_VECTOR) |
| 17 | |||
| 18 | BUILD_INTERRUPT3(invalidate_interrupt0,INVALIDATE_TLB_VECTOR_START+0, | ||
| 19 | smp_invalidate_interrupt) | ||
| 20 | BUILD_INTERRUPT3(invalidate_interrupt1,INVALIDATE_TLB_VECTOR_START+1, | ||
| 21 | smp_invalidate_interrupt) | ||
| 22 | BUILD_INTERRUPT3(invalidate_interrupt2,INVALIDATE_TLB_VECTOR_START+2, | ||
| 23 | smp_invalidate_interrupt) | ||
| 24 | BUILD_INTERRUPT3(invalidate_interrupt3,INVALIDATE_TLB_VECTOR_START+3, | ||
| 25 | smp_invalidate_interrupt) | ||
| 26 | BUILD_INTERRUPT3(invalidate_interrupt4,INVALIDATE_TLB_VECTOR_START+4, | ||
| 27 | smp_invalidate_interrupt) | ||
| 28 | BUILD_INTERRUPT3(invalidate_interrupt5,INVALIDATE_TLB_VECTOR_START+5, | ||
| 29 | smp_invalidate_interrupt) | ||
| 30 | BUILD_INTERRUPT3(invalidate_interrupt6,INVALIDATE_TLB_VECTOR_START+6, | ||
| 31 | smp_invalidate_interrupt) | ||
| 32 | BUILD_INTERRUPT3(invalidate_interrupt7,INVALIDATE_TLB_VECTOR_START+7, | ||
| 33 | smp_invalidate_interrupt) | ||
| 18 | #endif | 34 | #endif |
| 19 | 35 | ||
| 20 | /* | 36 | /* |
| @@ -25,10 +41,15 @@ BUILD_INTERRUPT(irq_move_cleanup_interrupt,IRQ_MOVE_CLEANUP_VECTOR) | |||
| 25 | * a much simpler SMP time architecture: | 41 | * a much simpler SMP time architecture: |
| 26 | */ | 42 | */ |
| 27 | #ifdef CONFIG_X86_LOCAL_APIC | 43 | #ifdef CONFIG_X86_LOCAL_APIC |
| 44 | |||
| 28 | BUILD_INTERRUPT(apic_timer_interrupt,LOCAL_TIMER_VECTOR) | 45 | BUILD_INTERRUPT(apic_timer_interrupt,LOCAL_TIMER_VECTOR) |
| 29 | BUILD_INTERRUPT(error_interrupt,ERROR_APIC_VECTOR) | 46 | BUILD_INTERRUPT(error_interrupt,ERROR_APIC_VECTOR) |
| 30 | BUILD_INTERRUPT(spurious_interrupt,SPURIOUS_APIC_VECTOR) | 47 | BUILD_INTERRUPT(spurious_interrupt,SPURIOUS_APIC_VECTOR) |
| 31 | 48 | ||
| 49 | #ifdef CONFIG_PERF_COUNTERS | ||
| 50 | BUILD_INTERRUPT(perf_counter_interrupt, LOCAL_PERF_VECTOR) | ||
| 51 | #endif | ||
| 52 | |||
| 32 | #ifdef CONFIG_X86_MCE_P4THERMAL | 53 | #ifdef CONFIG_X86_MCE_P4THERMAL |
| 33 | BUILD_INTERRUPT(thermal_interrupt,THERMAL_APIC_VECTOR) | 54 | BUILD_INTERRUPT(thermal_interrupt,THERMAL_APIC_VECTOR) |
| 34 | #endif | 55 | #endif |
diff --git a/arch/x86/include/asm/es7000/apic.h b/arch/x86/include/asm/es7000/apic.h deleted file mode 100644 index c58b9cc74465..000000000000 --- a/arch/x86/include/asm/es7000/apic.h +++ /dev/null | |||
| @@ -1,242 +0,0 @@ | |||
| 1 | #ifndef __ASM_ES7000_APIC_H | ||
| 2 | #define __ASM_ES7000_APIC_H | ||
| 3 | |||
| 4 | #include <linux/gfp.h> | ||
| 5 | |||
| 6 | #define xapic_phys_to_log_apicid(cpu) per_cpu(x86_bios_cpu_apicid, cpu) | ||
| 7 | #define esr_disable (1) | ||
| 8 | |||
| 9 | static inline int apic_id_registered(void) | ||
| 10 | { | ||
| 11 | return (1); | ||
| 12 | } | ||
| 13 | |||
| 14 | static inline const cpumask_t *target_cpus_cluster(void) | ||
| 15 | { | ||
| 16 | return &CPU_MASK_ALL; | ||
| 17 | } | ||
| 18 | |||
| 19 | static inline const cpumask_t *target_cpus(void) | ||
| 20 | { | ||
| 21 | return &cpumask_of_cpu(smp_processor_id()); | ||
| 22 | } | ||
| 23 | |||
| 24 | #define APIC_DFR_VALUE_CLUSTER (APIC_DFR_CLUSTER) | ||
| 25 | #define INT_DELIVERY_MODE_CLUSTER (dest_LowestPrio) | ||
| 26 | #define INT_DEST_MODE_CLUSTER (1) /* logical delivery broadcast to all procs */ | ||
| 27 | #define NO_BALANCE_IRQ_CLUSTER (1) | ||
| 28 | |||
| 29 | #define APIC_DFR_VALUE (APIC_DFR_FLAT) | ||
| 30 | #define INT_DELIVERY_MODE (dest_Fixed) | ||
| 31 | #define INT_DEST_MODE (0) /* phys delivery to target procs */ | ||
| 32 | #define NO_BALANCE_IRQ (0) | ||
| 33 | #undef APIC_DEST_LOGICAL | ||
| 34 | #define APIC_DEST_LOGICAL 0x0 | ||
| 35 | |||
| 36 | static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid) | ||
| 37 | { | ||
| 38 | return 0; | ||
| 39 | } | ||
| 40 | static inline unsigned long check_apicid_present(int bit) | ||
| 41 | { | ||
| 42 | return physid_isset(bit, phys_cpu_present_map); | ||
| 43 | } | ||
| 44 | |||
| 45 | #define apicid_cluster(apicid) (apicid & 0xF0) | ||
| 46 | |||
| 47 | static inline unsigned long calculate_ldr(int cpu) | ||
| 48 | { | ||
| 49 | unsigned long id; | ||
| 50 | id = xapic_phys_to_log_apicid(cpu); | ||
| 51 | return (SET_APIC_LOGICAL_ID(id)); | ||
| 52 | } | ||
| 53 | |||
| 54 | /* | ||
| 55 | * Set up the logical destination ID. | ||
| 56 | * | ||
| 57 | * Intel recommends to set DFR, LdR and TPR before enabling | ||
| 58 | * an APIC. See e.g. "AP-388 82489DX User's Manual" (Intel | ||
| 59 | * document number 292116). So here it goes... | ||
| 60 | */ | ||
| 61 | static inline void init_apic_ldr_cluster(void) | ||
| 62 | { | ||
| 63 | unsigned long val; | ||
| 64 | int cpu = smp_processor_id(); | ||
| 65 | |||
| 66 | apic_write(APIC_DFR, APIC_DFR_VALUE_CLUSTER); | ||
| 67 | val = calculate_ldr(cpu); | ||
| 68 | apic_write(APIC_LDR, val); | ||
| 69 | } | ||
| 70 | |||
| 71 | static inline void init_apic_ldr(void) | ||
| 72 | { | ||
| 73 | unsigned long val; | ||
| 74 | int cpu = smp_processor_id(); | ||
| 75 | |||
| 76 | apic_write(APIC_DFR, APIC_DFR_VALUE); | ||
| 77 | val = calculate_ldr(cpu); | ||
| 78 | apic_write(APIC_LDR, val); | ||
| 79 | } | ||
| 80 | |||
| 81 | extern int apic_version [MAX_APICS]; | ||
| 82 | static inline void setup_apic_routing(void) | ||
| 83 | { | ||
| 84 | int apic = per_cpu(x86_bios_cpu_apicid, smp_processor_id()); | ||
| 85 | printk("Enabling APIC mode: %s. Using %d I/O APICs, target cpus %lx\n", | ||
| 86 | (apic_version[apic] == 0x14) ? | ||
| 87 | "Physical Cluster" : "Logical Cluster", | ||
| 88 | nr_ioapics, cpus_addr(*target_cpus())[0]); | ||
| 89 | } | ||
| 90 | |||
| 91 | static inline int multi_timer_check(int apic, int irq) | ||
| 92 | { | ||
| 93 | return 0; | ||
| 94 | } | ||
| 95 | |||
| 96 | static inline int apicid_to_node(int logical_apicid) | ||
| 97 | { | ||
| 98 | return 0; | ||
| 99 | } | ||
| 100 | |||
| 101 | |||
| 102 | static inline int cpu_present_to_apicid(int mps_cpu) | ||
| 103 | { | ||
| 104 | if (!mps_cpu) | ||
| 105 | return boot_cpu_physical_apicid; | ||
| 106 | else if (mps_cpu < nr_cpu_ids) | ||
| 107 | return (int) per_cpu(x86_bios_cpu_apicid, mps_cpu); | ||
| 108 | else | ||
| 109 | return BAD_APICID; | ||
| 110 | } | ||
| 111 | |||
| 112 | static inline physid_mask_t apicid_to_cpu_present(int phys_apicid) | ||
| 113 | { | ||
| 114 | static int id = 0; | ||
| 115 | physid_mask_t mask; | ||
| 116 | mask = physid_mask_of_physid(id); | ||
| 117 | ++id; | ||
| 118 | return mask; | ||
| 119 | } | ||
| 120 | |||
| 121 | extern u8 cpu_2_logical_apicid[]; | ||
| 122 | /* Mapping from cpu number to logical apicid */ | ||
| 123 | static inline int cpu_to_logical_apicid(int cpu) | ||
| 124 | { | ||
| 125 | #ifdef CONFIG_SMP | ||
| 126 | if (cpu >= nr_cpu_ids) | ||
| 127 | return BAD_APICID; | ||
| 128 | return (int)cpu_2_logical_apicid[cpu]; | ||
| 129 | #else | ||
| 130 | return logical_smp_processor_id(); | ||
| 131 | #endif | ||
| 132 | } | ||
| 133 | |||
| 134 | static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map) | ||
| 135 | { | ||
| 136 | /* For clustered we don't have a good way to do this yet - hack */ | ||
| 137 | return physids_promote(0xff); | ||
| 138 | } | ||
| 139 | |||
| 140 | |||
| 141 | static inline void setup_portio_remap(void) | ||
| 142 | { | ||
| 143 | } | ||
| 144 | |||
| 145 | extern unsigned int boot_cpu_physical_apicid; | ||
| 146 | static inline int check_phys_apicid_present(int cpu_physical_apicid) | ||
| 147 | { | ||
| 148 | boot_cpu_physical_apicid = read_apic_id(); | ||
| 149 | return (1); | ||
| 150 | } | ||
| 151 | |||
| 152 | static inline unsigned int | ||
| 153 | cpu_mask_to_apicid_cluster(const struct cpumask *cpumask) | ||
| 154 | { | ||
| 155 | int num_bits_set; | ||
| 156 | int cpus_found = 0; | ||
| 157 | int cpu; | ||
| 158 | int apicid; | ||
| 159 | |||
| 160 | num_bits_set = cpumask_weight(cpumask); | ||
| 161 | /* Return id to all */ | ||
| 162 | if (num_bits_set == nr_cpu_ids) | ||
| 163 | return 0xFF; | ||
| 164 | /* | ||
| 165 | * The cpus in the mask must all be on the apic cluster. If are not | ||
| 166 | * on the same apicid cluster return default value of TARGET_CPUS. | ||
| 167 | */ | ||
| 168 | cpu = cpumask_first(cpumask); | ||
| 169 | apicid = cpu_to_logical_apicid(cpu); | ||
| 170 | while (cpus_found < num_bits_set) { | ||
| 171 | if (cpumask_test_cpu(cpu, cpumask)) { | ||
| 172 | int new_apicid = cpu_to_logical_apicid(cpu); | ||
| 173 | if (apicid_cluster(apicid) != | ||
| 174 | apicid_cluster(new_apicid)){ | ||
| 175 | printk ("%s: Not a valid mask!\n", __func__); | ||
| 176 | return 0xFF; | ||
| 177 | } | ||
| 178 | apicid = new_apicid; | ||
| 179 | cpus_found++; | ||
| 180 | } | ||
| 181 | cpu++; | ||
| 182 | } | ||
| 183 | return apicid; | ||
| 184 | } | ||
| 185 | |||
| 186 | static inline unsigned int cpu_mask_to_apicid(const cpumask_t *cpumask) | ||
| 187 | { | ||
| 188 | int num_bits_set; | ||
| 189 | int cpus_found = 0; | ||
| 190 | int cpu; | ||
| 191 | int apicid; | ||
| 192 | |||
| 193 | num_bits_set = cpus_weight(*cpumask); | ||
| 194 | /* Return id to all */ | ||
| 195 | if (num_bits_set == nr_cpu_ids) | ||
| 196 | return cpu_to_logical_apicid(0); | ||
| 197 | /* | ||
| 198 | * The cpus in the mask must all be on the apic cluster. If are not | ||
| 199 | * on the same apicid cluster return default value of TARGET_CPUS. | ||
| 200 | */ | ||
| 201 | cpu = first_cpu(*cpumask); | ||
| 202 | apicid = cpu_to_logical_apicid(cpu); | ||
| 203 | while (cpus_found < num_bits_set) { | ||
| 204 | if (cpu_isset(cpu, *cpumask)) { | ||
| 205 | int new_apicid = cpu_to_logical_apicid(cpu); | ||
| 206 | if (apicid_cluster(apicid) != | ||
| 207 | apicid_cluster(new_apicid)){ | ||
| 208 | printk ("%s: Not a valid mask!\n", __func__); | ||
| 209 | return cpu_to_logical_apicid(0); | ||
| 210 | } | ||
| 211 | apicid = new_apicid; | ||
| 212 | cpus_found++; | ||
| 213 | } | ||
| 214 | cpu++; | ||
| 215 | } | ||
| 216 | return apicid; | ||
| 217 | } | ||
| 218 | |||
| 219 | |||
| 220 | static inline unsigned int cpu_mask_to_apicid_and(const struct cpumask *inmask, | ||
| 221 | const struct cpumask *andmask) | ||
| 222 | { | ||
| 223 | int apicid = cpu_to_logical_apicid(0); | ||
| 224 | cpumask_var_t cpumask; | ||
| 225 | |||
| 226 | if (!alloc_cpumask_var(&cpumask, GFP_ATOMIC)) | ||
| 227 | return apicid; | ||
| 228 | |||
| 229 | cpumask_and(cpumask, inmask, andmask); | ||
| 230 | cpumask_and(cpumask, cpumask, cpu_online_mask); | ||
| 231 | apicid = cpu_mask_to_apicid(cpumask); | ||
| 232 | |||
| 233 | free_cpumask_var(cpumask); | ||
| 234 | return apicid; | ||
| 235 | } | ||
| 236 | |||
| 237 | static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb) | ||
| 238 | { | ||
| 239 | return cpuid_apic >> index_msb; | ||
| 240 | } | ||
| 241 | |||
| 242 | #endif /* __ASM_ES7000_APIC_H */ | ||
diff --git a/arch/x86/include/asm/es7000/apicdef.h b/arch/x86/include/asm/es7000/apicdef.h deleted file mode 100644 index 8b234a3cb851..000000000000 --- a/arch/x86/include/asm/es7000/apicdef.h +++ /dev/null | |||
| @@ -1,13 +0,0 @@ | |||
| 1 | #ifndef __ASM_ES7000_APICDEF_H | ||
| 2 | #define __ASM_ES7000_APICDEF_H | ||
| 3 | |||
| 4 | #define APIC_ID_MASK (0xFF<<24) | ||
| 5 | |||
| 6 | static inline unsigned get_apic_id(unsigned long x) | ||
| 7 | { | ||
| 8 | return (((x)>>24)&0xFF); | ||
| 9 | } | ||
| 10 | |||
| 11 | #define GET_APIC_ID(x) get_apic_id(x) | ||
| 12 | |||
| 13 | #endif | ||
diff --git a/arch/x86/include/asm/es7000/ipi.h b/arch/x86/include/asm/es7000/ipi.h deleted file mode 100644 index 7e8ed24d4b8a..000000000000 --- a/arch/x86/include/asm/es7000/ipi.h +++ /dev/null | |||
| @@ -1,22 +0,0 @@ | |||
| 1 | #ifndef __ASM_ES7000_IPI_H | ||
| 2 | #define __ASM_ES7000_IPI_H | ||
| 3 | |||
| 4 | void send_IPI_mask_sequence(const struct cpumask *mask, int vector); | ||
| 5 | void send_IPI_mask_allbutself(const struct cpumask *mask, int vector); | ||
| 6 | |||
| 7 | static inline void send_IPI_mask(const struct cpumask *mask, int vector) | ||
| 8 | { | ||
| 9 | send_IPI_mask_sequence(mask, vector); | ||
| 10 | } | ||
| 11 | |||
| 12 | static inline void send_IPI_allbutself(int vector) | ||
| 13 | { | ||
| 14 | send_IPI_mask_allbutself(cpu_online_mask, vector); | ||
| 15 | } | ||
| 16 | |||
| 17 | static inline void send_IPI_all(int vector) | ||
| 18 | { | ||
| 19 | send_IPI_mask(cpu_online_mask, vector); | ||
| 20 | } | ||
| 21 | |||
| 22 | #endif /* __ASM_ES7000_IPI_H */ | ||
diff --git a/arch/x86/include/asm/es7000/mpparse.h b/arch/x86/include/asm/es7000/mpparse.h deleted file mode 100644 index c1629b090ec2..000000000000 --- a/arch/x86/include/asm/es7000/mpparse.h +++ /dev/null | |||
| @@ -1,29 +0,0 @@ | |||
| 1 | #ifndef __ASM_ES7000_MPPARSE_H | ||
| 2 | #define __ASM_ES7000_MPPARSE_H | ||
| 3 | |||
| 4 | #include <linux/acpi.h> | ||
| 5 | |||
| 6 | extern int parse_unisys_oem (char *oemptr); | ||
| 7 | extern int find_unisys_acpi_oem_table(unsigned long *oem_addr); | ||
| 8 | extern void unmap_unisys_acpi_oem_table(unsigned long oem_addr); | ||
| 9 | extern void setup_unisys(void); | ||
| 10 | |||
| 11 | #ifndef CONFIG_X86_GENERICARCH | ||
| 12 | extern int acpi_madt_oem_check(char *oem_id, char *oem_table_id); | ||
| 13 | extern int mps_oem_check(struct mpc_table *mpc, char *oem, char *productid); | ||
| 14 | #endif | ||
| 15 | |||
| 16 | #ifdef CONFIG_ACPI | ||
| 17 | |||
| 18 | static inline int es7000_check_dsdt(void) | ||
| 19 | { | ||
| 20 | struct acpi_table_header header; | ||
| 21 | |||
| 22 | if (ACPI_SUCCESS(acpi_get_table_header(ACPI_SIG_DSDT, 0, &header)) && | ||
| 23 | !strncmp(header.oem_id, "UNISYS", 6)) | ||
| 24 | return 1; | ||
| 25 | return 0; | ||
| 26 | } | ||
| 27 | #endif | ||
| 28 | |||
| 29 | #endif /* __ASM_MACH_MPPARSE_H */ | ||
diff --git a/arch/x86/include/asm/es7000/wakecpu.h b/arch/x86/include/asm/es7000/wakecpu.h deleted file mode 100644 index 78f0daaee436..000000000000 --- a/arch/x86/include/asm/es7000/wakecpu.h +++ /dev/null | |||
| @@ -1,37 +0,0 @@ | |||
| 1 | #ifndef __ASM_ES7000_WAKECPU_H | ||
| 2 | #define __ASM_ES7000_WAKECPU_H | ||
| 3 | |||
| 4 | #define TRAMPOLINE_PHYS_LOW 0x467 | ||
| 5 | #define TRAMPOLINE_PHYS_HIGH 0x469 | ||
| 6 | |||
| 7 | static inline void wait_for_init_deassert(atomic_t *deassert) | ||
| 8 | { | ||
| 9 | #ifndef CONFIG_ES7000_CLUSTERED_APIC | ||
| 10 | while (!atomic_read(deassert)) | ||
| 11 | cpu_relax(); | ||
| 12 | #endif | ||
| 13 | return; | ||
| 14 | } | ||
| 15 | |||
| 16 | /* Nothing to do for most platforms, since cleared by the INIT cycle */ | ||
| 17 | static inline void smp_callin_clear_local_apic(void) | ||
| 18 | { | ||
| 19 | } | ||
| 20 | |||
| 21 | static inline void store_NMI_vector(unsigned short *high, unsigned short *low) | ||
| 22 | { | ||
| 23 | } | ||
| 24 | |||
| 25 | static inline void restore_NMI_vector(unsigned short *high, unsigned short *low) | ||
| 26 | { | ||
| 27 | } | ||
| 28 | |||
| 29 | extern void __inquire_remote_apic(int apicid); | ||
| 30 | |||
| 31 | static inline void inquire_remote_apic(int apicid) | ||
| 32 | { | ||
| 33 | if (apic_verbosity >= APIC_DEBUG) | ||
| 34 | __inquire_remote_apic(apicid); | ||
| 35 | } | ||
| 36 | |||
| 37 | #endif /* __ASM_MACH_WAKECPU_H */ | ||
diff --git a/arch/x86/include/asm/fixmap_32.h b/arch/x86/include/asm/fixmap_32.h index c7115c1d7217..047d9bab2b31 100644 --- a/arch/x86/include/asm/fixmap_32.h +++ b/arch/x86/include/asm/fixmap_32.h | |||
| @@ -95,10 +95,6 @@ enum fixed_addresses { | |||
| 95 | (__end_of_permanent_fixed_addresses & 255), | 95 | (__end_of_permanent_fixed_addresses & 255), |
| 96 | FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_SLOTS - 1, | 96 | FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_SLOTS - 1, |
| 97 | FIX_WP_TEST, | 97 | FIX_WP_TEST, |
| 98 | #ifdef CONFIG_ACPI | ||
| 99 | FIX_ACPI_BEGIN, | ||
| 100 | FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1, | ||
| 101 | #endif | ||
| 102 | #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT | 98 | #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT |
| 103 | FIX_OHCI1394_BASE, | 99 | FIX_OHCI1394_BASE, |
| 104 | #endif | 100 | #endif |
diff --git a/arch/x86/include/asm/fixmap_64.h b/arch/x86/include/asm/fixmap_64.h index 00a30ab9b1a5..298d9ba3faeb 100644 --- a/arch/x86/include/asm/fixmap_64.h +++ b/arch/x86/include/asm/fixmap_64.h | |||
| @@ -50,10 +50,6 @@ enum fixed_addresses { | |||
| 50 | FIX_PARAVIRT_BOOTMAP, | 50 | FIX_PARAVIRT_BOOTMAP, |
| 51 | #endif | 51 | #endif |
| 52 | __end_of_permanent_fixed_addresses, | 52 | __end_of_permanent_fixed_addresses, |
| 53 | #ifdef CONFIG_ACPI | ||
| 54 | FIX_ACPI_BEGIN, | ||
| 55 | FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1, | ||
| 56 | #endif | ||
| 57 | #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT | 53 | #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT |
| 58 | FIX_OHCI1394_BASE, | 54 | FIX_OHCI1394_BASE, |
| 59 | #endif | 55 | #endif |
diff --git a/arch/x86/include/asm/genapic.h b/arch/x86/include/asm/genapic.h index d48bee663a6f..4b8b98fa7f25 100644 --- a/arch/x86/include/asm/genapic.h +++ b/arch/x86/include/asm/genapic.h | |||
| @@ -1,5 +1 @@ | |||
| 1 | #ifdef CONFIG_X86_32 | #include <asm/apic.h> | |
| 2 | # include "genapic_32.h" | ||
| 3 | #else | ||
| 4 | # include "genapic_64.h" | ||
| 5 | #endif | ||
diff --git a/arch/x86/include/asm/genapic_32.h b/arch/x86/include/asm/genapic_32.h deleted file mode 100644 index 2c05b737ee22..000000000000 --- a/arch/x86/include/asm/genapic_32.h +++ /dev/null | |||
| @@ -1,148 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_GENAPIC_32_H | ||
| 2 | #define _ASM_X86_GENAPIC_32_H | ||
| 3 | |||
| 4 | #include <asm/mpspec.h> | ||
| 5 | #include <asm/atomic.h> | ||
| 6 | |||
| 7 | /* | ||
| 8 | * Generic APIC driver interface. | ||
| 9 | * | ||
| 10 | * An straight forward mapping of the APIC related parts of the | ||
| 11 | * x86 subarchitecture interface to a dynamic object. | ||
| 12 | * | ||
| 13 | * This is used by the "generic" x86 subarchitecture. | ||
| 14 | * | ||
| 15 | * Copyright 2003 Andi Kleen, SuSE Labs. | ||
| 16 | */ | ||
| 17 | |||
| 18 | struct mpc_bus; | ||
| 19 | struct mpc_table; | ||
| 20 | struct mpc_cpu; | ||
| 21 | |||
| 22 | struct genapic { | ||
| 23 | char *name; | ||
| 24 | int (*probe)(void); | ||
| 25 | |||
| 26 | int (*apic_id_registered)(void); | ||
| 27 | const struct cpumask *(*target_cpus)(void); | ||
| 28 | int int_delivery_mode; | ||
| 29 | int int_dest_mode; | ||
| 30 | int ESR_DISABLE; | ||
| 31 | int apic_destination_logical; | ||
| 32 | unsigned long (*check_apicid_used)(physid_mask_t bitmap, int apicid); | ||
| 33 | unsigned long (*check_apicid_present)(int apicid); | ||
| 34 | int no_balance_irq; | ||
| 35 | int no_ioapic_check; | ||
| 36 | void (*init_apic_ldr)(void); | ||
| 37 | physid_mask_t (*ioapic_phys_id_map)(physid_mask_t map); | ||
| 38 | |||
| 39 | void (*setup_apic_routing)(void); | ||
| 40 | int (*multi_timer_check)(int apic, int irq); | ||
| 41 | int (*apicid_to_node)(int logical_apicid); | ||
| 42 | int (*cpu_to_logical_apicid)(int cpu); | ||
| 43 | int (*cpu_present_to_apicid)(int mps_cpu); | ||
| 44 | physid_mask_t (*apicid_to_cpu_present)(int phys_apicid); | ||
| 45 | void (*setup_portio_remap)(void); | ||
| 46 | int (*check_phys_apicid_present)(int boot_cpu_physical_apicid); | ||
| 47 | void (*enable_apic_mode)(void); | ||
| 48 | u32 (*phys_pkg_id)(u32 cpuid_apic, int index_msb); | ||
| 49 | |||
| 50 | /* mpparse */ | ||
| 51 | /* When one of the next two hooks returns 1 the genapic | ||
| 52 | is switched to this. Essentially they are additional probe | ||
| 53 | functions. */ | ||
| 54 | int (*mps_oem_check)(struct mpc_table *mpc, char *oem, | ||
| 55 | char *productid); | ||
| 56 | int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id); | ||
| 57 | |||
| 58 | unsigned (*get_apic_id)(unsigned long x); | ||
| 59 | unsigned long apic_id_mask; | ||
| 60 | unsigned int (*cpu_mask_to_apicid)(const struct cpumask *cpumask); | ||
| 61 | unsigned int (*cpu_mask_to_apicid_and)(const struct cpumask *cpumask, | ||
| 62 | const struct cpumask *andmask); | ||
| 63 | void (*vector_allocation_domain)(int cpu, struct cpumask *retmask); | ||
| 64 | |||
| 65 | #ifdef CONFIG_SMP | ||
| 66 | /* ipi */ | ||
| 67 | void (*send_IPI_mask)(const struct cpumask *mask, int vector); | ||
| 68 | void (*send_IPI_mask_allbutself)(const struct cpumask *mask, | ||
| 69 | int vector); | ||
| 70 | void (*send_IPI_allbutself)(int vector); | ||
| 71 | void (*send_IPI_all)(int vector); | ||
| 72 | #endif | ||
| 73 | int (*wakeup_cpu)(int apicid, unsigned long start_eip); | ||
| 74 | int trampoline_phys_low; | ||
| 75 | int trampoline_phys_high; | ||
| 76 | void (*wait_for_init_deassert)(atomic_t *deassert); | ||
| 77 | void (*smp_callin_clear_local_apic)(void); | ||
| 78 | void (*store_NMI_vector)(unsigned short *high, unsigned short *low); | ||
| 79 | void (*restore_NMI_vector)(unsigned short *high, unsigned short *low); | ||
| 80 | void (*inquire_remote_apic)(int apicid); | ||
| 81 | }; | ||
| 82 | |||
| 83 | #define APICFUNC(x) .x = x, | ||
| 84 | |||
| 85 | /* More functions could be probably marked IPIFUNC and save some space | ||
| 86 | in UP GENERICARCH kernels, but I don't have the nerve right now | ||
| 87 | to untangle this mess. -AK */ | ||
| 88 | #ifdef CONFIG_SMP | ||
| 89 | #define IPIFUNC(x) APICFUNC(x) | ||
| 90 | #else | ||
| 91 | #define IPIFUNC(x) | ||
| 92 | #endif | ||
| 93 | |||
| 94 | #define APIC_INIT(aname, aprobe) \ | ||
| 95 | { \ | ||
| 96 | .name = aname, \ | ||
| 97 | .probe = aprobe, \ | ||
| 98 | .int_delivery_mode = INT_DELIVERY_MODE, \ | ||
| 99 | .int_dest_mode = INT_DEST_MODE, \ | ||
| 100 | .no_balance_irq = NO_BALANCE_IRQ, \ | ||
| 101 | .ESR_DISABLE = esr_disable, \ | ||
| 102 | .apic_destination_logical = APIC_DEST_LOGICAL, \ | ||
| 103 | APICFUNC(apic_id_registered) \ | ||
| 104 | APICFUNC(target_cpus) \ | ||
| 105 | APICFUNC(check_apicid_used) \ | ||
| 106 | APICFUNC(check_apicid_present) \ | ||
| 107 | APICFUNC(init_apic_ldr) \ | ||
| 108 | APICFUNC(ioapic_phys_id_map) \ | ||
| 109 | APICFUNC(setup_apic_routing) \ | ||
| 110 | APICFUNC(multi_timer_check) \ | ||
| 111 | APICFUNC(apicid_to_node) \ | ||
| 112 | APICFUNC(cpu_to_logical_apicid) \ | ||
| 113 | APICFUNC(cpu_present_to_apicid) \ | ||
| 114 | APICFUNC(apicid_to_cpu_present) \ | ||
| 115 | APICFUNC(setup_portio_remap) \ | ||
| 116 | APICFUNC(check_phys_apicid_present) \ | ||
| 117 | APICFUNC(mps_oem_check) \ | ||
| 118 | APICFUNC(get_apic_id) \ | ||
| 119 | .apic_id_mask = APIC_ID_MASK, \ | ||
| 120 | APICFUNC(cpu_mask_to_apicid) \ | ||
| 121 | APICFUNC(cpu_mask_to_apicid_and) \ | ||
| 122 | APICFUNC(vector_allocation_domain) \ | ||
| 123 | APICFUNC(acpi_madt_oem_check) \ | ||
| 124 | IPIFUNC(send_IPI_mask) \ | ||
| 125 | IPIFUNC(send_IPI_allbutself) \ | ||
| 126 | IPIFUNC(send_IPI_all) \ | ||
| 127 | APICFUNC(enable_apic_mode) \ | ||
| 128 | APICFUNC(phys_pkg_id) \ | ||
| 129 | .trampoline_phys_low = TRAMPOLINE_PHYS_LOW, \ | ||
| 130 | .trampoline_phys_high = TRAMPOLINE_PHYS_HIGH, \ | ||
| 131 | APICFUNC(wait_for_init_deassert) \ | ||
| 132 | APICFUNC(smp_callin_clear_local_apic) \ | ||
| 133 | APICFUNC(store_NMI_vector) \ | ||
| 134 | APICFUNC(restore_NMI_vector) \ | ||
| 135 | APICFUNC(inquire_remote_apic) \ | ||
| 136 | } | ||
| 137 | |||
| 138 | extern struct genapic *genapic; | ||
| 139 | extern void es7000_update_genapic_to_cluster(void); | ||
| 140 | |||
| 141 | enum uv_system_type {UV_NONE, UV_LEGACY_APIC, UV_X2APIC, UV_NON_UNIQUE_APIC}; | ||
| 142 | #define get_uv_system_type() UV_NONE | ||
| 143 | #define is_uv_system() 0 | ||
| 144 | #define uv_wakeup_secondary(a, b) 1 | ||
| 145 | #define uv_system_init() do {} while (0) | ||
| 146 | |||
| 147 | |||
| 148 | #endif /* _ASM_X86_GENAPIC_32_H */ | ||
diff --git a/arch/x86/include/asm/genapic_64.h b/arch/x86/include/asm/genapic_64.h deleted file mode 100644 index adf32fb56aa6..000000000000 --- a/arch/x86/include/asm/genapic_64.h +++ /dev/null | |||
| @@ -1,66 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_GENAPIC_64_H | ||
| 2 | #define _ASM_X86_GENAPIC_64_H | ||
| 3 | |||
| 4 | #include <linux/cpumask.h> | ||
| 5 | |||
| 6 | /* | ||
| 7 | * Copyright 2004 James Cleverdon, IBM. | ||
| 8 | * Subject to the GNU Public License, v.2 | ||
| 9 | * | ||
| 10 | * Generic APIC sub-arch data struct. | ||
| 11 | * | ||
| 12 | * Hacked for x86-64 by James Cleverdon from i386 architecture code by | ||
| 13 | * Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and | ||
| 14 | * James Cleverdon. | ||
| 15 | */ | ||
| 16 | |||
| 17 | struct genapic { | ||
| 18 | char *name; | ||
| 19 | int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id); | ||
| 20 | u32 int_delivery_mode; | ||
| 21 | u32 int_dest_mode; | ||
| 22 | int (*apic_id_registered)(void); | ||
| 23 | const struct cpumask *(*target_cpus)(void); | ||
| 24 | void (*vector_allocation_domain)(int cpu, struct cpumask *retmask); | ||
| 25 | void (*init_apic_ldr)(void); | ||
| 26 | /* ipi */ | ||
| 27 | void (*send_IPI_mask)(const struct cpumask *mask, int vector); | ||
| 28 | void (*send_IPI_mask_allbutself)(const struct cpumask *mask, | ||
| 29 | int vector); | ||
| 30 | void (*send_IPI_allbutself)(int vector); | ||
| 31 | void (*send_IPI_all)(int vector); | ||
| 32 | void (*send_IPI_self)(int vector); | ||
| 33 | /* */ | ||
| 34 | unsigned int (*cpu_mask_to_apicid)(const struct cpumask *cpumask); | ||
| 35 | unsigned int (*cpu_mask_to_apicid_and)(const struct cpumask *cpumask, | ||
| 36 | const struct cpumask *andmask); | ||
| 37 | unsigned int (*phys_pkg_id)(int index_msb); | ||
| 38 | unsigned int (*get_apic_id)(unsigned long x); | ||
| 39 | unsigned long (*set_apic_id)(unsigned int id); | ||
| 40 | unsigned long apic_id_mask; | ||
| 41 | /* wakeup_secondary_cpu */ | ||
| 42 | int (*wakeup_cpu)(int apicid, unsigned long start_eip); | ||
| 43 | }; | ||
| 44 | |||
| 45 | extern struct genapic *genapic; | ||
| 46 | |||
| 47 | extern struct genapic apic_flat; | ||
| 48 | extern struct genapic apic_physflat; | ||
| 49 | extern struct genapic apic_x2apic_cluster; | ||
| 50 | extern struct genapic apic_x2apic_phys; | ||
| 51 | extern int acpi_madt_oem_check(char *, char *); | ||
| 52 | |||
| 53 | extern void apic_send_IPI_self(int vector); | ||
| 54 | enum uv_system_type {UV_NONE, UV_LEGACY_APIC, UV_X2APIC, UV_NON_UNIQUE_APIC}; | ||
| 55 | extern enum uv_system_type get_uv_system_type(void); | ||
| 56 | extern int is_uv_system(void); | ||
| 57 | |||
| 58 | extern struct genapic apic_x2apic_uv_x; | ||
| 59 | DECLARE_PER_CPU(int, x2apic_extra_bits); | ||
| 60 | extern void uv_cpu_init(void); | ||
| 61 | extern void uv_system_init(void); | ||
| 62 | extern int uv_wakeup_secondary(int phys_apicid, unsigned int start_rip); | ||
| 63 | |||
| 64 | extern void setup_apic_routing(void); | ||
| 65 | |||
| 66 | #endif /* _ASM_X86_GENAPIC_64_H */ | ||
diff --git a/arch/x86/include/asm/hardirq.h b/arch/x86/include/asm/hardirq.h index 000787df66e6..176f058e7159 100644 --- a/arch/x86/include/asm/hardirq.h +++ b/arch/x86/include/asm/hardirq.h | |||
| @@ -1,11 +1,52 @@ | |||
| 1 | #ifdef CONFIG_X86_32 | 1 | #ifndef _ASM_X86_HARDIRQ_H |
| 2 | # include "hardirq_32.h" | 2 | #define _ASM_X86_HARDIRQ_H |
| 3 | #else | 3 | |
| 4 | # include "hardirq_64.h" | 4 | #include <linux/threads.h> |
| 5 | #include <linux/irq.h> | ||
| 6 | |||
| 7 | typedef struct { | ||
| 8 | unsigned int __softirq_pending; | ||
| 9 | unsigned int __nmi_count; /* arch dependent */ | ||
| 10 | unsigned int irq0_irqs; | ||
| 11 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 12 | unsigned int apic_timer_irqs; /* arch dependent */ | ||
| 13 | unsigned int irq_spurious_count; | ||
| 14 | #endif | ||
| 15 | #ifdef CONFIG_SMP | ||
| 16 | unsigned int irq_resched_count; | ||
| 17 | unsigned int irq_call_count; | ||
| 18 | unsigned int irq_tlb_count; | ||
| 19 | #endif | ||
| 20 | #ifdef CONFIG_X86_MCE | ||
| 21 | unsigned int irq_thermal_count; | ||
| 22 | # ifdef CONFIG_X86_64 | ||
| 23 | unsigned int irq_threshold_count; | ||
| 24 | # endif | ||
| 5 | #endif | 25 | #endif |
| 26 | } ____cacheline_aligned irq_cpustat_t; | ||
| 27 | |||
| 28 | DECLARE_PER_CPU(irq_cpustat_t, irq_stat); | ||
| 29 | |||
| 30 | /* We can have at most NR_VECTORS irqs routed to a cpu at a time */ | ||
| 31 | #define MAX_HARDIRQS_PER_CPU NR_VECTORS | ||
| 32 | |||
| 33 | #define __ARCH_IRQ_STAT | ||
| 34 | |||
| 35 | #define inc_irq_stat(member) percpu_add(irq_stat.member, 1) | ||
| 36 | |||
| 37 | #define local_softirq_pending() percpu_read(irq_stat.__softirq_pending) | ||
| 38 | |||
| 39 | #define __ARCH_SET_SOFTIRQ_PENDING | ||
| 40 | |||
| 41 | #define set_softirq_pending(x) percpu_write(irq_stat.__softirq_pending, (x)) | ||
| 42 | #define or_softirq_pending(x) percpu_or(irq_stat.__softirq_pending, (x)) | ||
| 43 | |||
| 44 | extern void ack_bad_irq(unsigned int irq); | ||
| 6 | 45 | ||
| 7 | extern u64 arch_irq_stat_cpu(unsigned int cpu); | 46 | extern u64 arch_irq_stat_cpu(unsigned int cpu); |
| 8 | #define arch_irq_stat_cpu arch_irq_stat_cpu | 47 | #define arch_irq_stat_cpu arch_irq_stat_cpu |
| 9 | 48 | ||
| 10 | extern u64 arch_irq_stat(void); | 49 | extern u64 arch_irq_stat(void); |
| 11 | #define arch_irq_stat arch_irq_stat | 50 | #define arch_irq_stat arch_irq_stat |
| 51 | |||
| 52 | #endif /* _ASM_X86_HARDIRQ_H */ | ||
diff --git a/arch/x86/include/asm/hardirq_32.h b/arch/x86/include/asm/hardirq_32.h deleted file mode 100644 index cf7954d1405f..000000000000 --- a/arch/x86/include/asm/hardirq_32.h +++ /dev/null | |||
| @@ -1,30 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_HARDIRQ_32_H | ||
| 2 | #define _ASM_X86_HARDIRQ_32_H | ||
| 3 | |||
| 4 | #include <linux/threads.h> | ||
| 5 | #include <linux/irq.h> | ||
| 6 | |||
| 7 | typedef struct { | ||
| 8 | unsigned int __softirq_pending; | ||
| 9 | unsigned long idle_timestamp; | ||
| 10 | unsigned int __nmi_count; /* arch dependent */ | ||
| 11 | unsigned int apic_timer_irqs; /* arch dependent */ | ||
| 12 | unsigned int irq0_irqs; | ||
| 13 | unsigned int irq_resched_count; | ||
| 14 | unsigned int irq_call_count; | ||
| 15 | unsigned int irq_tlb_count; | ||
| 16 | unsigned int irq_thermal_count; | ||
| 17 | unsigned int irq_spurious_count; | ||
| 18 | } ____cacheline_aligned irq_cpustat_t; | ||
| 19 | |||
| 20 | DECLARE_PER_CPU(irq_cpustat_t, irq_stat); | ||
| 21 | |||
| 22 | #define __ARCH_IRQ_STAT | ||
| 23 | #define __IRQ_STAT(cpu, member) (per_cpu(irq_stat, cpu).member) | ||
| 24 | |||
| 25 | #define inc_irq_stat(member) (__get_cpu_var(irq_stat).member++) | ||
| 26 | |||
| 27 | void ack_bad_irq(unsigned int irq); | ||
| 28 | #include <linux/irq_cpustat.h> | ||
| 29 | |||
| 30 | #endif /* _ASM_X86_HARDIRQ_32_H */ | ||
diff --git a/arch/x86/include/asm/hardirq_64.h b/arch/x86/include/asm/hardirq_64.h deleted file mode 100644 index b5a6b5d56704..000000000000 --- a/arch/x86/include/asm/hardirq_64.h +++ /dev/null | |||
| @@ -1,25 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_HARDIRQ_64_H | ||
| 2 | #define _ASM_X86_HARDIRQ_64_H | ||
| 3 | |||
| 4 | #include <linux/threads.h> | ||
| 5 | #include <linux/irq.h> | ||
| 6 | #include <asm/pda.h> | ||
| 7 | #include <asm/apic.h> | ||
| 8 | |||
| 9 | /* We can have at most NR_VECTORS irqs routed to a cpu at a time */ | ||
| 10 | #define MAX_HARDIRQS_PER_CPU NR_VECTORS | ||
| 11 | |||
| 12 | #define __ARCH_IRQ_STAT 1 | ||
| 13 | |||
| 14 | #define inc_irq_stat(member) add_pda(member, 1) | ||
| 15 | |||
| 16 | #define local_softirq_pending() read_pda(__softirq_pending) | ||
| 17 | |||
| 18 | #define __ARCH_SET_SOFTIRQ_PENDING 1 | ||
| 19 | |||
| 20 | #define set_softirq_pending(x) write_pda(__softirq_pending, (x)) | ||
| 21 | #define or_softirq_pending(x) or_pda(__softirq_pending, (x)) | ||
| 22 | |||
| 23 | extern void ack_bad_irq(unsigned int irq); | ||
| 24 | |||
| 25 | #endif /* _ASM_X86_HARDIRQ_64_H */ | ||
diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h index 8de644b6b959..370e1c83bb49 100644 --- a/arch/x86/include/asm/hw_irq.h +++ b/arch/x86/include/asm/hw_irq.h | |||
| @@ -25,8 +25,6 @@ | |||
| 25 | #include <asm/irq.h> | 25 | #include <asm/irq.h> |
| 26 | #include <asm/sections.h> | 26 | #include <asm/sections.h> |
| 27 | 27 | ||
| 28 | #define platform_legacy_irq(irq) ((irq) < 16) | ||
| 29 | |||
| 30 | /* Interrupt handlers registered during init_IRQ */ | 28 | /* Interrupt handlers registered during init_IRQ */ |
| 31 | extern void apic_timer_interrupt(void); | 29 | extern void apic_timer_interrupt(void); |
| 32 | extern void error_interrupt(void); | 30 | extern void error_interrupt(void); |
| @@ -58,7 +56,7 @@ extern void make_8259A_irq(unsigned int irq); | |||
| 58 | extern void init_8259A(int aeoi); | 56 | extern void init_8259A(int aeoi); |
| 59 | 57 | ||
| 60 | /* IOAPIC */ | 58 | /* IOAPIC */ |
| 61 | #define IO_APIC_IRQ(x) (((x) >= 16) || ((1<<(x)) & io_apic_irqs)) | 59 | #define IO_APIC_IRQ(x) (((x) >= NR_IRQS_LEGACY) || ((1<<(x)) & io_apic_irqs)) |
| 62 | extern unsigned long io_apic_irqs; | 60 | extern unsigned long io_apic_irqs; |
| 63 | 61 | ||
| 64 | extern void init_VISWS_APIC_irqs(void); | 62 | extern void init_VISWS_APIC_irqs(void); |
| @@ -67,15 +65,7 @@ extern void disable_IO_APIC(void); | |||
| 67 | extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn); | 65 | extern int IO_APIC_get_PCI_irq_vector(int bus, int slot, int fn); |
| 68 | extern void setup_ioapic_dest(void); | 66 | extern void setup_ioapic_dest(void); |
| 69 | 67 | ||
| 70 | #ifdef CONFIG_X86_64 | ||
| 71 | extern void enable_IO_APIC(void); | 68 | extern void enable_IO_APIC(void); |
| 72 | #endif | ||
| 73 | |||
| 74 | /* IPI functions */ | ||
| 75 | #ifdef CONFIG_X86_32 | ||
| 76 | extern void send_IPI_self(int vector); | ||
| 77 | #endif | ||
| 78 | extern void send_IPI(int dest, int vector); | ||
| 79 | 69 | ||
| 80 | /* Statistics */ | 70 | /* Statistics */ |
| 81 | extern atomic_t irq_err_count; | 71 | extern atomic_t irq_err_count; |
| @@ -84,21 +74,11 @@ extern atomic_t irq_mis_count; | |||
| 84 | /* EISA */ | 74 | /* EISA */ |
| 85 | extern void eisa_set_level_irq(unsigned int irq); | 75 | extern void eisa_set_level_irq(unsigned int irq); |
| 86 | 76 | ||
| 87 | /* Voyager functions */ | ||
| 88 | extern asmlinkage void vic_cpi_interrupt(void); | ||
| 89 | extern asmlinkage void vic_sys_interrupt(void); | ||
| 90 | extern asmlinkage void vic_cmn_interrupt(void); | ||
| 91 | extern asmlinkage void qic_timer_interrupt(void); | ||
| 92 | extern asmlinkage void qic_invalidate_interrupt(void); | ||
| 93 | extern asmlinkage void qic_reschedule_interrupt(void); | ||
| 94 | extern asmlinkage void qic_enable_irq_interrupt(void); | ||
| 95 | extern asmlinkage void qic_call_function_interrupt(void); | ||
| 96 | |||
| 97 | /* SMP */ | 77 | /* SMP */ |
| 98 | extern void smp_apic_timer_interrupt(struct pt_regs *); | 78 | extern void smp_apic_timer_interrupt(struct pt_regs *); |
| 99 | extern void smp_spurious_interrupt(struct pt_regs *); | 79 | extern void smp_spurious_interrupt(struct pt_regs *); |
| 100 | extern void smp_error_interrupt(struct pt_regs *); | 80 | extern void smp_error_interrupt(struct pt_regs *); |
| 101 | #ifdef CONFIG_X86_SMP | 81 | #ifdef CONFIG_SMP |
| 102 | extern void smp_reschedule_interrupt(struct pt_regs *); | 82 | extern void smp_reschedule_interrupt(struct pt_regs *); |
| 103 | extern void smp_call_function_interrupt(struct pt_regs *); | 83 | extern void smp_call_function_interrupt(struct pt_regs *); |
| 104 | extern void smp_call_function_single_interrupt(struct pt_regs *); | 84 | extern void smp_call_function_single_interrupt(struct pt_regs *); |
diff --git a/arch/x86/include/asm/io.h b/arch/x86/include/asm/io.h index 1dbbdf4be9b4..683d0b4c00fc 100644 --- a/arch/x86/include/asm/io.h +++ b/arch/x86/include/asm/io.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | #include <linux/compiler.h> | 6 | #include <linux/compiler.h> |
| 7 | #include <asm-generic/int-ll64.h> | 7 | #include <asm-generic/int-ll64.h> |
| 8 | #include <asm/page.h> | ||
| 8 | 9 | ||
| 9 | #define build_mmio_read(name, size, type, reg, barrier) \ | 10 | #define build_mmio_read(name, size, type, reg, barrier) \ |
| 10 | static inline type name(const volatile void __iomem *addr) \ | 11 | static inline type name(const volatile void __iomem *addr) \ |
| @@ -80,6 +81,100 @@ static inline void writeq(__u64 val, volatile void __iomem *addr) | |||
| 80 | #define readq readq | 81 | #define readq readq |
| 81 | #define writeq writeq | 82 | #define writeq writeq |
| 82 | 83 | ||
| 84 | /** | ||
| 85 | * virt_to_phys - map virtual addresses to physical | ||
| 86 | * @address: address to remap | ||
| 87 | * | ||
| 88 | * The returned physical address is the physical (CPU) mapping for | ||
| 89 | * the memory address given. It is only valid to use this function on | ||
| 90 | * addresses directly mapped or allocated via kmalloc. | ||
| 91 | * | ||
| 92 | * This function does not give bus mappings for DMA transfers. In | ||
| 93 | * almost all conceivable cases a device driver should not be using | ||
| 94 | * this function | ||
| 95 | */ | ||
| 96 | |||
| 97 | static inline phys_addr_t virt_to_phys(volatile void *address) | ||
| 98 | { | ||
| 99 | return __pa(address); | ||
| 100 | } | ||
| 101 | |||
| 102 | /** | ||
| 103 | * phys_to_virt - map physical address to virtual | ||
| 104 | * @address: address to remap | ||
| 105 | * | ||
| 106 | * The returned virtual address is a current CPU mapping for | ||
| 107 | * the memory address given. It is only valid to use this function on | ||
| 108 | * addresses that have a kernel mapping | ||
| 109 | * | ||
| 110 | * This function does not handle bus mappings for DMA transfers. In | ||
| 111 | * almost all conceivable cases a device driver should not be using | ||
| 112 | * this function | ||
| 113 | */ | ||
| 114 | |||
| 115 | static inline void *phys_to_virt(phys_addr_t address) | ||
| 116 | { | ||
| 117 | return __va(address); | ||
| 118 | } | ||
| 119 | |||
| 120 | /* | ||
| 121 | * Change "struct page" to physical address. | ||
| 122 | */ | ||
| 123 | #define page_to_phys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT) | ||
| 124 | |||
| 125 | /* | ||
| 126 | * ISA I/O bus memory addresses are 1:1 with the physical address. | ||
| 127 | * However, we truncate the address to unsigned int to avoid undesirable | ||
| 128 | * promitions in legacy drivers. | ||
| 129 | */ | ||
| 130 | static inline unsigned int isa_virt_to_bus(volatile void *address) | ||
| 131 | { | ||
| 132 | return (unsigned int)virt_to_phys(address); | ||
| 133 | } | ||
| 134 | #define isa_page_to_bus(page) ((unsigned int)page_to_phys(page)) | ||
| 135 | #define isa_bus_to_virt phys_to_virt | ||
| 136 | |||
| 137 | /* | ||
| 138 | * However PCI ones are not necessarily 1:1 and therefore these interfaces | ||
| 139 | * are forbidden in portable PCI drivers. | ||
| 140 | * | ||
| 141 | * Allow them on x86 for legacy drivers, though. | ||
| 142 | */ | ||
| 143 | #define virt_to_bus virt_to_phys | ||
| 144 | #define bus_to_virt phys_to_virt | ||
| 145 | |||
| 146 | /** | ||
| 147 | * ioremap - map bus memory into CPU space | ||
| 148 | * @offset: bus address of the memory | ||
| 149 | * @size: size of the resource to map | ||
| 150 | * | ||
| 151 | * ioremap performs a platform specific sequence of operations to | ||
| 152 | * make bus memory CPU accessible via the readb/readw/readl/writeb/ | ||
| 153 | * writew/writel functions and the other mmio helpers. The returned | ||
| 154 | * address is not guaranteed to be usable directly as a virtual | ||
| 155 | * address. | ||
| 156 | * | ||
| 157 | * If the area you are trying to map is a PCI BAR you should have a | ||
| 158 | * look at pci_iomap(). | ||
| 159 | */ | ||
| 160 | extern void __iomem *ioremap_nocache(resource_size_t offset, unsigned long size); | ||
| 161 | extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size); | ||
| 162 | extern void __iomem *ioremap_prot(resource_size_t offset, unsigned long size, | ||
| 163 | unsigned long prot_val); | ||
| 164 | |||
| 165 | /* | ||
| 166 | * The default ioremap() behavior is non-cached: | ||
| 167 | */ | ||
| 168 | static inline void __iomem *ioremap(resource_size_t offset, unsigned long size) | ||
| 169 | { | ||
| 170 | return ioremap_nocache(offset, size); | ||
| 171 | } | ||
| 172 | |||
| 173 | extern void iounmap(volatile void __iomem *addr); | ||
| 174 | |||
| 175 | extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys); | ||
| 176 | |||
| 177 | |||
| 83 | #ifdef CONFIG_X86_32 | 178 | #ifdef CONFIG_X86_32 |
| 84 | # include "io_32.h" | 179 | # include "io_32.h" |
| 85 | #else | 180 | #else |
| @@ -91,7 +186,7 @@ extern void unxlate_dev_mem_ptr(unsigned long phys, void *addr); | |||
| 91 | 186 | ||
| 92 | extern int ioremap_change_attr(unsigned long vaddr, unsigned long size, | 187 | extern int ioremap_change_attr(unsigned long vaddr, unsigned long size, |
| 93 | unsigned long prot_val); | 188 | unsigned long prot_val); |
| 94 | extern void __iomem *ioremap_wc(unsigned long offset, unsigned long size); | 189 | extern void __iomem *ioremap_wc(resource_size_t offset, unsigned long size); |
| 95 | 190 | ||
| 96 | /* | 191 | /* |
| 97 | * early_ioremap() and early_iounmap() are for temporary early boot-time | 192 | * early_ioremap() and early_iounmap() are for temporary early boot-time |
| @@ -105,5 +200,6 @@ extern void __iomem *early_memremap(unsigned long offset, unsigned long size); | |||
| 105 | extern void early_iounmap(void __iomem *addr, unsigned long size); | 200 | extern void early_iounmap(void __iomem *addr, unsigned long size); |
| 106 | extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys); | 201 | extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys); |
| 107 | 202 | ||
| 203 | #define IO_SPACE_LIMIT 0xffff | ||
| 108 | 204 | ||
| 109 | #endif /* _ASM_X86_IO_H */ | 205 | #endif /* _ASM_X86_IO_H */ |
diff --git a/arch/x86/include/asm/io_32.h b/arch/x86/include/asm/io_32.h index d8e242e1b396..a299900f5920 100644 --- a/arch/x86/include/asm/io_32.h +++ b/arch/x86/include/asm/io_32.h | |||
| @@ -37,8 +37,6 @@ | |||
| 37 | * - Arnaldo Carvalho de Melo <acme@conectiva.com.br> | 37 | * - Arnaldo Carvalho de Melo <acme@conectiva.com.br> |
| 38 | */ | 38 | */ |
| 39 | 39 | ||
| 40 | #define IO_SPACE_LIMIT 0xffff | ||
| 41 | |||
| 42 | #define XQUAD_PORTIO_BASE 0xfe400000 | 40 | #define XQUAD_PORTIO_BASE 0xfe400000 |
| 43 | #define XQUAD_PORTIO_QUAD 0x40000 /* 256k per quad. */ | 41 | #define XQUAD_PORTIO_QUAD 0x40000 /* 256k per quad. */ |
| 44 | 42 | ||
| @@ -53,92 +51,6 @@ | |||
| 53 | */ | 51 | */ |
| 54 | #define xlate_dev_kmem_ptr(p) p | 52 | #define xlate_dev_kmem_ptr(p) p |
| 55 | 53 | ||
| 56 | /** | ||
| 57 | * virt_to_phys - map virtual addresses to physical | ||
| 58 | * @address: address to remap | ||
| 59 | * | ||
| 60 | * The returned physical address is the physical (CPU) mapping for | ||
| 61 | * the memory address given. It is only valid to use this function on | ||
| 62 | * addresses directly mapped or allocated via kmalloc. | ||
| 63 | * | ||
| 64 | * This function does not give bus mappings for DMA transfers. In | ||
| 65 | * almost all conceivable cases a device driver should not be using | ||
| 66 | * this function | ||
| 67 | */ | ||
| 68 | |||
| 69 | static inline unsigned long virt_to_phys(volatile void *address) | ||
| 70 | { | ||
| 71 | return __pa(address); | ||
| 72 | } | ||
| 73 | |||
| 74 | /** | ||
| 75 | * phys_to_virt - map physical address to virtual | ||
| 76 | * @address: address to remap | ||
| 77 | * | ||
| 78 | * The returned virtual address is a current CPU mapping for | ||
| 79 | * the memory address given. It is only valid to use this function on | ||
| 80 | * addresses that have a kernel mapping | ||
| 81 | * | ||
| 82 | * This function does not handle bus mappings for DMA transfers. In | ||
| 83 | * almost all conceivable cases a device driver should not be using | ||
| 84 | * this function | ||
| 85 | */ | ||
| 86 | |||
| 87 | static inline void *phys_to_virt(unsigned long address) | ||
| 88 | { | ||
| 89 | return __va(address); | ||
| 90 | } | ||
| 91 | |||
| 92 | /* | ||
| 93 | * Change "struct page" to physical address. | ||
| 94 | */ | ||
| 95 | #define page_to_phys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT) | ||
| 96 | |||
| 97 | /** | ||
| 98 | * ioremap - map bus memory into CPU space | ||
| 99 | * @offset: bus address of the memory | ||
| 100 | * @size: size of the resource to map | ||
| 101 | * | ||
| 102 | * ioremap performs a platform specific sequence of operations to | ||
| 103 | * make bus memory CPU accessible via the readb/readw/readl/writeb/ | ||
| 104 | * writew/writel functions and the other mmio helpers. The returned | ||
| 105 | * address is not guaranteed to be usable directly as a virtual | ||
| 106 | * address. | ||
| 107 | * | ||
| 108 | * If the area you are trying to map is a PCI BAR you should have a | ||
| 109 | * look at pci_iomap(). | ||
| 110 | */ | ||
| 111 | extern void __iomem *ioremap_nocache(resource_size_t offset, unsigned long size); | ||
| 112 | extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size); | ||
| 113 | extern void __iomem *ioremap_prot(resource_size_t offset, unsigned long size, | ||
| 114 | unsigned long prot_val); | ||
| 115 | |||
| 116 | /* | ||
| 117 | * The default ioremap() behavior is non-cached: | ||
| 118 | */ | ||
| 119 | static inline void __iomem *ioremap(resource_size_t offset, unsigned long size) | ||
| 120 | { | ||
| 121 | return ioremap_nocache(offset, size); | ||
| 122 | } | ||
| 123 | |||
| 124 | extern void iounmap(volatile void __iomem *addr); | ||
| 125 | |||
| 126 | /* | ||
| 127 | * ISA I/O bus memory addresses are 1:1 with the physical address. | ||
| 128 | */ | ||
| 129 | #define isa_virt_to_bus virt_to_phys | ||
| 130 | #define isa_page_to_bus page_to_phys | ||
| 131 | #define isa_bus_to_virt phys_to_virt | ||
| 132 | |||
| 133 | /* | ||
| 134 | * However PCI ones are not necessarily 1:1 and therefore these interfaces | ||
| 135 | * are forbidden in portable PCI drivers. | ||
| 136 | * | ||
| 137 | * Allow them on x86 for legacy drivers, though. | ||
| 138 | */ | ||
| 139 | #define virt_to_bus virt_to_phys | ||
| 140 | #define bus_to_virt phys_to_virt | ||
| 141 | |||
| 142 | static inline void | 54 | static inline void |
| 143 | memset_io(volatile void __iomem *addr, unsigned char val, int count) | 55 | memset_io(volatile void __iomem *addr, unsigned char val, int count) |
| 144 | { | 56 | { |
diff --git a/arch/x86/include/asm/io_64.h b/arch/x86/include/asm/io_64.h index 563c16270ba6..244067893af4 100644 --- a/arch/x86/include/asm/io_64.h +++ b/arch/x86/include/asm/io_64.h | |||
| @@ -136,73 +136,12 @@ __OUTS(b) | |||
| 136 | __OUTS(w) | 136 | __OUTS(w) |
| 137 | __OUTS(l) | 137 | __OUTS(l) |
| 138 | 138 | ||
| 139 | #define IO_SPACE_LIMIT 0xffff | ||
| 140 | |||
| 141 | #if defined(__KERNEL__) && defined(__x86_64__) | 139 | #if defined(__KERNEL__) && defined(__x86_64__) |
| 142 | 140 | ||
| 143 | #include <linux/vmalloc.h> | 141 | #include <linux/vmalloc.h> |
| 144 | 142 | ||
| 145 | #ifndef __i386__ | ||
| 146 | /* | ||
| 147 | * Change virtual addresses to physical addresses and vv. | ||
| 148 | * These are pretty trivial | ||
| 149 | */ | ||
| 150 | static inline unsigned long virt_to_phys(volatile void *address) | ||
| 151 | { | ||
| 152 | return __pa(address); | ||
| 153 | } | ||
| 154 | |||
| 155 | static inline void *phys_to_virt(unsigned long address) | ||
| 156 | { | ||
| 157 | return __va(address); | ||
| 158 | } | ||
| 159 | #endif | ||
| 160 | |||
| 161 | /* | ||
| 162 | * Change "struct page" to physical address. | ||
| 163 | */ | ||
| 164 | #define page_to_phys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT) | ||
| 165 | |||
| 166 | #include <asm-generic/iomap.h> | 143 | #include <asm-generic/iomap.h> |
| 167 | 144 | ||
| 168 | /* | ||
| 169 | * This one maps high address device memory and turns off caching for that area. | ||
| 170 | * it's useful if some control registers are in such an area and write combining | ||
| 171 | * or read caching is not desirable: | ||
| 172 | */ | ||
| 173 | extern void __iomem *ioremap_nocache(resource_size_t offset, unsigned long size); | ||
| 174 | extern void __iomem *ioremap_cache(resource_size_t offset, unsigned long size); | ||
| 175 | extern void __iomem *ioremap_prot(resource_size_t offset, unsigned long size, | ||
| 176 | unsigned long prot_val); | ||
| 177 | |||
| 178 | /* | ||
| 179 | * The default ioremap() behavior is non-cached: | ||
| 180 | */ | ||
| 181 | static inline void __iomem *ioremap(resource_size_t offset, unsigned long size) | ||
| 182 | { | ||
| 183 | return ioremap_nocache(offset, size); | ||
| 184 | } | ||
| 185 | |||
| 186 | extern void iounmap(volatile void __iomem *addr); | ||
| 187 | |||
| 188 | extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys); | ||
| 189 | |||
| 190 | /* | ||
| 191 | * ISA I/O bus memory addresses are 1:1 with the physical address. | ||
| 192 | */ | ||
| 193 | #define isa_virt_to_bus virt_to_phys | ||
| 194 | #define isa_page_to_bus page_to_phys | ||
| 195 | #define isa_bus_to_virt phys_to_virt | ||
| 196 | |||
| 197 | /* | ||
| 198 | * However PCI ones are not necessarily 1:1 and therefore these interfaces | ||
| 199 | * are forbidden in portable PCI drivers. | ||
| 200 | * | ||
| 201 | * Allow them on x86 for legacy drivers, though. | ||
| 202 | */ | ||
| 203 | #define virt_to_bus virt_to_phys | ||
| 204 | #define bus_to_virt phys_to_virt | ||
| 205 | |||
| 206 | void __memcpy_fromio(void *, unsigned long, unsigned); | 145 | void __memcpy_fromio(void *, unsigned long, unsigned); |
| 207 | void __memcpy_toio(unsigned long, const void *, unsigned); | 146 | void __memcpy_toio(unsigned long, const void *, unsigned); |
| 208 | 147 | ||
diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h index 7a1f44ac1f17..59cb4a1317b7 100644 --- a/arch/x86/include/asm/io_apic.h +++ b/arch/x86/include/asm/io_apic.h | |||
| @@ -114,38 +114,16 @@ struct IR_IO_APIC_route_entry { | |||
| 114 | extern int nr_ioapics; | 114 | extern int nr_ioapics; |
| 115 | extern int nr_ioapic_registers[MAX_IO_APICS]; | 115 | extern int nr_ioapic_registers[MAX_IO_APICS]; |
| 116 | 116 | ||
| 117 | /* | ||
| 118 | * MP-BIOS irq configuration table structures: | ||
| 119 | */ | ||
| 120 | |||
| 121 | #define MP_MAX_IOAPIC_PIN 127 | 117 | #define MP_MAX_IOAPIC_PIN 127 |
| 122 | 118 | ||
| 123 | struct mp_config_ioapic { | ||
| 124 | unsigned long mp_apicaddr; | ||
| 125 | unsigned int mp_apicid; | ||
| 126 | unsigned char mp_type; | ||
| 127 | unsigned char mp_apicver; | ||
| 128 | unsigned char mp_flags; | ||
| 129 | }; | ||
| 130 | |||
| 131 | struct mp_config_intsrc { | ||
| 132 | unsigned int mp_dstapic; | ||
| 133 | unsigned char mp_type; | ||
| 134 | unsigned char mp_irqtype; | ||
| 135 | unsigned short mp_irqflag; | ||
| 136 | unsigned char mp_srcbus; | ||
| 137 | unsigned char mp_srcbusirq; | ||
| 138 | unsigned char mp_dstirq; | ||
| 139 | }; | ||
| 140 | |||
| 141 | /* I/O APIC entries */ | 119 | /* I/O APIC entries */ |
| 142 | extern struct mp_config_ioapic mp_ioapics[MAX_IO_APICS]; | 120 | extern struct mpc_ioapic mp_ioapics[MAX_IO_APICS]; |
| 143 | 121 | ||
| 144 | /* # of MP IRQ source entries */ | 122 | /* # of MP IRQ source entries */ |
| 145 | extern int mp_irq_entries; | 123 | extern int mp_irq_entries; |
| 146 | 124 | ||
| 147 | /* MP IRQ source entries */ | 125 | /* MP IRQ source entries */ |
| 148 | extern struct mp_config_intsrc mp_irqs[MAX_IRQ_SOURCES]; | 126 | extern struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES]; |
| 149 | 127 | ||
| 150 | /* non-0 if default (table-less) MP configuration */ | 128 | /* non-0 if default (table-less) MP configuration */ |
| 151 | extern int mpc_default_type; | 129 | extern int mpc_default_type; |
| @@ -165,15 +143,6 @@ extern int noioapicreroute; | |||
| 165 | /* 1 if the timer IRQ uses the '8259A Virtual Wire' mode */ | 143 | /* 1 if the timer IRQ uses the '8259A Virtual Wire' mode */ |
| 166 | extern int timer_through_8259; | 144 | extern int timer_through_8259; |
| 167 | 145 | ||
| 168 | static inline void disable_ioapic_setup(void) | ||
| 169 | { | ||
| 170 | #ifdef CONFIG_PCI | ||
| 171 | noioapicquirk = 1; | ||
| 172 | noioapicreroute = -1; | ||
| 173 | #endif | ||
| 174 | skip_ioapic_setup = 1; | ||
| 175 | } | ||
| 176 | |||
| 177 | /* | 146 | /* |
| 178 | * If we use the IO-APIC for IRQ routing, disable automatic | 147 | * If we use the IO-APIC for IRQ routing, disable automatic |
| 179 | * assignment of PCI IRQ's. | 148 | * assignment of PCI IRQ's. |
| @@ -200,6 +169,12 @@ extern void reinit_intr_remapped_IO_APIC(int); | |||
| 200 | 169 | ||
| 201 | extern void probe_nr_irqs_gsi(void); | 170 | extern void probe_nr_irqs_gsi(void); |
| 202 | 171 | ||
| 172 | extern int setup_ioapic_entry(int apic, int irq, | ||
| 173 | struct IO_APIC_route_entry *entry, | ||
| 174 | unsigned int destination, int trigger, | ||
| 175 | int polarity, int vector); | ||
| 176 | extern void ioapic_write_entry(int apic, int pin, | ||
| 177 | struct IO_APIC_route_entry e); | ||
| 203 | #else /* !CONFIG_X86_IO_APIC */ | 178 | #else /* !CONFIG_X86_IO_APIC */ |
| 204 | #define io_apic_assign_pci_irqs 0 | 179 | #define io_apic_assign_pci_irqs 0 |
| 205 | static const int timer_through_8259 = 0; | 180 | static const int timer_through_8259 = 0; |
diff --git a/arch/x86/include/asm/ipi.h b/arch/x86/include/asm/ipi.h index c745a306f7d3..0b7228268a63 100644 --- a/arch/x86/include/asm/ipi.h +++ b/arch/x86/include/asm/ipi.h | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | #ifndef _ASM_X86_IPI_H | 1 | #ifndef _ASM_X86_IPI_H |
| 2 | #define _ASM_X86_IPI_H | 2 | #define _ASM_X86_IPI_H |
| 3 | 3 | ||
| 4 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 5 | |||
| 4 | /* | 6 | /* |
| 5 | * Copyright 2004 James Cleverdon, IBM. | 7 | * Copyright 2004 James Cleverdon, IBM. |
| 6 | * Subject to the GNU Public License, v.2 | 8 | * Subject to the GNU Public License, v.2 |
| @@ -55,8 +57,8 @@ static inline void __xapic_wait_icr_idle(void) | |||
| 55 | cpu_relax(); | 57 | cpu_relax(); |
| 56 | } | 58 | } |
| 57 | 59 | ||
| 58 | static inline void __send_IPI_shortcut(unsigned int shortcut, int vector, | 60 | static inline void |
| 59 | unsigned int dest) | 61 | __default_send_IPI_shortcut(unsigned int shortcut, int vector, unsigned int dest) |
| 60 | { | 62 | { |
| 61 | /* | 63 | /* |
| 62 | * Subtle. In the case of the 'never do double writes' workaround | 64 | * Subtle. In the case of the 'never do double writes' workaround |
| @@ -87,8 +89,8 @@ static inline void __send_IPI_shortcut(unsigned int shortcut, int vector, | |||
| 87 | * This is used to send an IPI with no shorthand notation (the destination is | 89 | * This is used to send an IPI with no shorthand notation (the destination is |
| 88 | * specified in bits 56 to 63 of the ICR). | 90 | * specified in bits 56 to 63 of the ICR). |
| 89 | */ | 91 | */ |
| 90 | static inline void __send_IPI_dest_field(unsigned int mask, int vector, | 92 | static inline void |
| 91 | unsigned int dest) | 93 | __default_send_IPI_dest_field(unsigned int mask, int vector, unsigned int dest) |
| 92 | { | 94 | { |
| 93 | unsigned long cfg; | 95 | unsigned long cfg; |
| 94 | 96 | ||
| @@ -117,41 +119,44 @@ static inline void __send_IPI_dest_field(unsigned int mask, int vector, | |||
| 117 | native_apic_mem_write(APIC_ICR, cfg); | 119 | native_apic_mem_write(APIC_ICR, cfg); |
| 118 | } | 120 | } |
| 119 | 121 | ||
| 120 | static inline void send_IPI_mask_sequence(const struct cpumask *mask, | 122 | extern void default_send_IPI_mask_sequence_phys(const struct cpumask *mask, |
| 121 | int vector) | 123 | int vector); |
| 122 | { | 124 | extern void default_send_IPI_mask_allbutself_phys(const struct cpumask *mask, |
| 123 | unsigned long flags; | 125 | int vector); |
| 124 | unsigned long query_cpu; | 126 | extern void default_send_IPI_mask_sequence_logical(const struct cpumask *mask, |
| 127 | int vector); | ||
| 128 | extern void default_send_IPI_mask_allbutself_logical(const struct cpumask *mask, | ||
| 129 | int vector); | ||
| 125 | 130 | ||
| 126 | /* | 131 | /* Avoid include hell */ |
| 127 | * Hack. The clustered APIC addressing mode doesn't allow us to send | 132 | #define NMI_VECTOR 0x02 |
| 128 | * to an arbitrary mask, so I do a unicast to each CPU instead. | 133 | |
| 129 | * - mbligh | 134 | extern int no_broadcast; |
| 130 | */ | 135 | |
| 131 | local_irq_save(flags); | 136 | static inline void __default_local_send_IPI_allbutself(int vector) |
| 132 | for_each_cpu(query_cpu, mask) { | 137 | { |
| 133 | __send_IPI_dest_field(per_cpu(x86_cpu_to_apicid, query_cpu), | 138 | if (no_broadcast || vector == NMI_VECTOR) |
| 134 | vector, APIC_DEST_PHYSICAL); | 139 | apic->send_IPI_mask_allbutself(cpu_online_mask, vector); |
| 135 | } | 140 | else |
| 136 | local_irq_restore(flags); | 141 | __default_send_IPI_shortcut(APIC_DEST_ALLBUT, vector, apic->dest_logical); |
| 137 | } | 142 | } |
| 138 | 143 | ||
| 139 | static inline void send_IPI_mask_allbutself(const struct cpumask *mask, | 144 | static inline void __default_local_send_IPI_all(int vector) |
| 140 | int vector) | ||
| 141 | { | 145 | { |
| 142 | unsigned long flags; | 146 | if (no_broadcast || vector == NMI_VECTOR) |
| 143 | unsigned int query_cpu; | 147 | apic->send_IPI_mask(cpu_online_mask, vector); |
| 144 | unsigned int this_cpu = smp_processor_id(); | 148 | else |
| 145 | 149 | __default_send_IPI_shortcut(APIC_DEST_ALLINC, vector, apic->dest_logical); | |
| 146 | /* See Hack comment above */ | ||
| 147 | |||
| 148 | local_irq_save(flags); | ||
| 149 | for_each_cpu(query_cpu, mask) | ||
| 150 | if (query_cpu != this_cpu) | ||
| 151 | __send_IPI_dest_field( | ||
| 152 | per_cpu(x86_cpu_to_apicid, query_cpu), | ||
| 153 | vector, APIC_DEST_PHYSICAL); | ||
| 154 | local_irq_restore(flags); | ||
| 155 | } | 150 | } |
| 156 | 151 | ||
| 152 | #ifdef CONFIG_X86_32 | ||
| 153 | extern void default_send_IPI_mask_logical(const struct cpumask *mask, | ||
| 154 | int vector); | ||
| 155 | extern void default_send_IPI_allbutself(int vector); | ||
| 156 | extern void default_send_IPI_all(int vector); | ||
| 157 | extern void default_send_IPI_self(int vector); | ||
| 158 | #endif | ||
| 159 | |||
| 160 | #endif | ||
| 161 | |||
| 157 | #endif /* _ASM_X86_IPI_H */ | 162 | #endif /* _ASM_X86_IPI_H */ |
diff --git a/arch/x86/include/asm/irq.h b/arch/x86/include/asm/irq.h index 592688ed04d3..107eb2196691 100644 --- a/arch/x86/include/asm/irq.h +++ b/arch/x86/include/asm/irq.h | |||
| @@ -36,9 +36,11 @@ static inline int irq_canonicalize(int irq) | |||
| 36 | extern void fixup_irqs(void); | 36 | extern void fixup_irqs(void); |
| 37 | #endif | 37 | #endif |
| 38 | 38 | ||
| 39 | extern unsigned int do_IRQ(struct pt_regs *regs); | ||
| 40 | extern void init_IRQ(void); | 39 | extern void init_IRQ(void); |
| 41 | extern void native_init_IRQ(void); | 40 | extern void native_init_IRQ(void); |
| 41 | extern bool handle_irq(unsigned irq, struct pt_regs *regs); | ||
| 42 | |||
| 43 | extern unsigned int do_IRQ(struct pt_regs *regs); | ||
| 42 | 44 | ||
| 43 | /* Interrupt vector management */ | 45 | /* Interrupt vector management */ |
| 44 | extern DECLARE_BITMAP(used_vectors, NR_VECTORS); | 46 | extern DECLARE_BITMAP(used_vectors, NR_VECTORS); |
diff --git a/arch/x86/include/asm/irq_regs.h b/arch/x86/include/asm/irq_regs.h index 89c898ab298b..77843225b7ea 100644 --- a/arch/x86/include/asm/irq_regs.h +++ b/arch/x86/include/asm/irq_regs.h | |||
| @@ -1,5 +1,31 @@ | |||
| 1 | #ifdef CONFIG_X86_32 | 1 | /* |
| 2 | # include "irq_regs_32.h" | 2 | * Per-cpu current frame pointer - the location of the last exception frame on |
| 3 | #else | 3 | * the stack, stored in the per-cpu area. |
| 4 | # include "irq_regs_64.h" | 4 | * |
| 5 | #endif | 5 | * Jeremy Fitzhardinge <jeremy@goop.org> |
| 6 | */ | ||
| 7 | #ifndef _ASM_X86_IRQ_REGS_H | ||
| 8 | #define _ASM_X86_IRQ_REGS_H | ||
| 9 | |||
| 10 | #include <asm/percpu.h> | ||
| 11 | |||
| 12 | #define ARCH_HAS_OWN_IRQ_REGS | ||
| 13 | |||
| 14 | DECLARE_PER_CPU(struct pt_regs *, irq_regs); | ||
| 15 | |||
| 16 | static inline struct pt_regs *get_irq_regs(void) | ||
| 17 | { | ||
| 18 | return percpu_read(irq_regs); | ||
| 19 | } | ||
| 20 | |||
| 21 | static inline struct pt_regs *set_irq_regs(struct pt_regs *new_regs) | ||
| 22 | { | ||
| 23 | struct pt_regs *old_regs; | ||
| 24 | |||
| 25 | old_regs = get_irq_regs(); | ||
| 26 | percpu_write(irq_regs, new_regs); | ||
| 27 | |||
| 28 | return old_regs; | ||
| 29 | } | ||
| 30 | |||
| 31 | #endif /* _ASM_X86_IRQ_REGS_32_H */ | ||
diff --git a/arch/x86/include/asm/irq_regs_32.h b/arch/x86/include/asm/irq_regs_32.h deleted file mode 100644 index 86afd7473457..000000000000 --- a/arch/x86/include/asm/irq_regs_32.h +++ /dev/null | |||
| @@ -1,31 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Per-cpu current frame pointer - the location of the last exception frame on | ||
| 3 | * the stack, stored in the per-cpu area. | ||
| 4 | * | ||
| 5 | * Jeremy Fitzhardinge <jeremy@goop.org> | ||
| 6 | */ | ||
| 7 | #ifndef _ASM_X86_IRQ_REGS_32_H | ||
| 8 | #define _ASM_X86_IRQ_REGS_32_H | ||
| 9 | |||
| 10 | #include <asm/percpu.h> | ||
| 11 | |||
| 12 | #define ARCH_HAS_OWN_IRQ_REGS | ||
| 13 | |||
| 14 | DECLARE_PER_CPU(struct pt_regs *, irq_regs); | ||
| 15 | |||
| 16 | static inline struct pt_regs *get_irq_regs(void) | ||
| 17 | { | ||
| 18 | return x86_read_percpu(irq_regs); | ||
| 19 | } | ||
| 20 | |||
| 21 | static inline struct pt_regs *set_irq_regs(struct pt_regs *new_regs) | ||
| 22 | { | ||
| 23 | struct pt_regs *old_regs; | ||
| 24 | |||
| 25 | old_regs = get_irq_regs(); | ||
| 26 | x86_write_percpu(irq_regs, new_regs); | ||
| 27 | |||
| 28 | return old_regs; | ||
| 29 | } | ||
| 30 | |||
| 31 | #endif /* _ASM_X86_IRQ_REGS_32_H */ | ||
diff --git a/arch/x86/include/asm/irq_regs_64.h b/arch/x86/include/asm/irq_regs_64.h deleted file mode 100644 index 3dd9c0b70270..000000000000 --- a/arch/x86/include/asm/irq_regs_64.h +++ /dev/null | |||
| @@ -1 +0,0 @@ | |||
| 1 | #include <asm-generic/irq_regs.h> | ||
diff --git a/arch/x86/include/asm/irq_vectors.h b/arch/x86/include/asm/irq_vectors.h index f7ff65032b9d..b07278c55e9e 100644 --- a/arch/x86/include/asm/irq_vectors.h +++ b/arch/x86/include/asm/irq_vectors.h | |||
| @@ -1,47 +1,69 @@ | |||
| 1 | #ifndef _ASM_X86_IRQ_VECTORS_H | 1 | #ifndef _ASM_X86_IRQ_VECTORS_H |
| 2 | #define _ASM_X86_IRQ_VECTORS_H | 2 | #define _ASM_X86_IRQ_VECTORS_H |
| 3 | 3 | ||
| 4 | #include <linux/threads.h> | 4 | /* |
| 5 | * Linux IRQ vector layout. | ||
| 6 | * | ||
| 7 | * There are 256 IDT entries (per CPU - each entry is 8 bytes) which can | ||
| 8 | * be defined by Linux. They are used as a jump table by the CPU when a | ||
| 9 | * given vector is triggered - by a CPU-external, CPU-internal or | ||
| 10 | * software-triggered event. | ||
| 11 | * | ||
| 12 | * Linux sets the kernel code address each entry jumps to early during | ||
| 13 | * bootup, and never changes them. This is the general layout of the | ||
| 14 | * IDT entries: | ||
| 15 | * | ||
| 16 | * Vectors 0 ... 31 : system traps and exceptions - hardcoded events | ||
| 17 | * Vectors 32 ... 127 : device interrupts | ||
| 18 | * Vector 128 : legacy int80 syscall interface | ||
| 19 | * Vectors 129 ... 237 : device interrupts | ||
| 20 | * Vectors 238 ... 255 : special interrupts | ||
| 21 | * | ||
| 22 | * 64-bit x86 has per CPU IDT tables, 32-bit has one shared IDT table. | ||
| 23 | * | ||
| 24 | * This file enumerates the exact layout of them: | ||
| 25 | */ | ||
| 5 | 26 | ||
| 6 | #define NMI_VECTOR 0x02 | 27 | #define NMI_VECTOR 0x02 |
| 7 | 28 | ||
| 8 | /* | 29 | /* |
| 9 | * IDT vectors usable for external interrupt sources start | 30 | * IDT vectors usable for external interrupt sources start |
| 10 | * at 0x20: | 31 | * at 0x20: |
| 11 | */ | 32 | */ |
| 12 | #define FIRST_EXTERNAL_VECTOR 0x20 | 33 | #define FIRST_EXTERNAL_VECTOR 0x20 |
| 13 | 34 | ||
| 14 | #ifdef CONFIG_X86_32 | 35 | #ifdef CONFIG_X86_32 |
| 15 | # define SYSCALL_VECTOR 0x80 | 36 | # define SYSCALL_VECTOR 0x80 |
| 16 | #else | 37 | #else |
| 17 | # define IA32_SYSCALL_VECTOR 0x80 | 38 | # define IA32_SYSCALL_VECTOR 0x80 |
| 18 | #endif | 39 | #endif |
| 19 | 40 | ||
| 20 | /* | 41 | /* |
| 21 | * Reserve the lowest usable priority level 0x20 - 0x2f for triggering | 42 | * Reserve the lowest usable priority level 0x20 - 0x2f for triggering |
| 22 | * cleanup after irq migration. | 43 | * cleanup after irq migration. |
| 23 | */ | 44 | */ |
| 24 | #define IRQ_MOVE_CLEANUP_VECTOR FIRST_EXTERNAL_VECTOR | 45 | #define IRQ_MOVE_CLEANUP_VECTOR FIRST_EXTERNAL_VECTOR |
| 25 | 46 | ||
| 26 | /* | 47 | /* |
| 27 | * Vectors 0x30-0x3f are used for ISA interrupts. | 48 | * Vectors 0x30-0x3f are used for ISA interrupts. |
| 28 | */ | 49 | */ |
| 29 | #define IRQ0_VECTOR (FIRST_EXTERNAL_VECTOR + 0x10) | 50 | #define IRQ0_VECTOR (FIRST_EXTERNAL_VECTOR + 0x10) |
| 30 | #define IRQ1_VECTOR (IRQ0_VECTOR + 1) | 51 | |
| 31 | #define IRQ2_VECTOR (IRQ0_VECTOR + 2) | 52 | #define IRQ1_VECTOR (IRQ0_VECTOR + 1) |
| 32 | #define IRQ3_VECTOR (IRQ0_VECTOR + 3) | 53 | #define IRQ2_VECTOR (IRQ0_VECTOR + 2) |
| 33 | #define IRQ4_VECTOR (IRQ0_VECTOR + 4) | 54 | #define IRQ3_VECTOR (IRQ0_VECTOR + 3) |
| 34 | #define IRQ5_VECTOR (IRQ0_VECTOR + 5) | 55 | #define IRQ4_VECTOR (IRQ0_VECTOR + 4) |
| 35 | #define IRQ6_VECTOR (IRQ0_VECTOR + 6) | 56 | #define IRQ5_VECTOR (IRQ0_VECTOR + 5) |
| 36 | #define IRQ7_VECTOR (IRQ0_VECTOR + 7) | 57 | #define IRQ6_VECTOR (IRQ0_VECTOR + 6) |
| 37 | #define IRQ8_VECTOR (IRQ0_VECTOR + 8) | 58 | #define IRQ7_VECTOR (IRQ0_VECTOR + 7) |
| 38 | #define IRQ9_VECTOR (IRQ0_VECTOR + 9) | 59 | #define IRQ8_VECTOR (IRQ0_VECTOR + 8) |
| 39 | #define IRQ10_VECTOR (IRQ0_VECTOR + 10) | 60 | #define IRQ9_VECTOR (IRQ0_VECTOR + 9) |
| 40 | #define IRQ11_VECTOR (IRQ0_VECTOR + 11) | 61 | #define IRQ10_VECTOR (IRQ0_VECTOR + 10) |
| 41 | #define IRQ12_VECTOR (IRQ0_VECTOR + 12) | 62 | #define IRQ11_VECTOR (IRQ0_VECTOR + 11) |
| 42 | #define IRQ13_VECTOR (IRQ0_VECTOR + 13) | 63 | #define IRQ12_VECTOR (IRQ0_VECTOR + 12) |
| 43 | #define IRQ14_VECTOR (IRQ0_VECTOR + 14) | 64 | #define IRQ13_VECTOR (IRQ0_VECTOR + 13) |
| 44 | #define IRQ15_VECTOR (IRQ0_VECTOR + 15) | 65 | #define IRQ14_VECTOR (IRQ0_VECTOR + 14) |
| 66 | #define IRQ15_VECTOR (IRQ0_VECTOR + 15) | ||
| 45 | 67 | ||
| 46 | /* | 68 | /* |
| 47 | * Special IRQ vectors used by the SMP architecture, 0xf0-0xff | 69 | * Special IRQ vectors used by the SMP architecture, 0xf0-0xff |
| @@ -49,119 +71,98 @@ | |||
| 49 | * some of the following vectors are 'rare', they are merged | 71 | * some of the following vectors are 'rare', they are merged |
| 50 | * into a single vector (CALL_FUNCTION_VECTOR) to save vector space. | 72 | * into a single vector (CALL_FUNCTION_VECTOR) to save vector space. |
| 51 | * TLB, reschedule and local APIC vectors are performance-critical. | 73 | * TLB, reschedule and local APIC vectors are performance-critical. |
| 52 | * | ||
| 53 | * Vectors 0xf0-0xfa are free (reserved for future Linux use). | ||
| 54 | */ | 74 | */ |
| 55 | #ifdef CONFIG_X86_32 | ||
| 56 | |||
| 57 | # define SPURIOUS_APIC_VECTOR 0xff | ||
| 58 | # define ERROR_APIC_VECTOR 0xfe | ||
| 59 | # define INVALIDATE_TLB_VECTOR 0xfd | ||
| 60 | # define RESCHEDULE_VECTOR 0xfc | ||
| 61 | # define CALL_FUNCTION_VECTOR 0xfb | ||
| 62 | # define CALL_FUNCTION_SINGLE_VECTOR 0xfa | ||
| 63 | # define THERMAL_APIC_VECTOR 0xf0 | ||
| 64 | |||
| 65 | #else | ||
| 66 | 75 | ||
| 67 | #define SPURIOUS_APIC_VECTOR 0xff | 76 | #define SPURIOUS_APIC_VECTOR 0xff |
| 77 | /* | ||
| 78 | * Sanity check | ||
| 79 | */ | ||
| 80 | #if ((SPURIOUS_APIC_VECTOR & 0x0F) != 0x0F) | ||
| 81 | # error SPURIOUS_APIC_VECTOR definition error | ||
| 82 | #endif | ||
| 83 | |||
| 68 | #define ERROR_APIC_VECTOR 0xfe | 84 | #define ERROR_APIC_VECTOR 0xfe |
| 69 | #define RESCHEDULE_VECTOR 0xfd | 85 | #define RESCHEDULE_VECTOR 0xfd |
| 70 | #define CALL_FUNCTION_VECTOR 0xfc | 86 | #define CALL_FUNCTION_VECTOR 0xfc |
| 71 | #define CALL_FUNCTION_SINGLE_VECTOR 0xfb | 87 | #define CALL_FUNCTION_SINGLE_VECTOR 0xfb |
| 72 | #define THERMAL_APIC_VECTOR 0xfa | 88 | #define THERMAL_APIC_VECTOR 0xfa |
| 73 | #define THRESHOLD_APIC_VECTOR 0xf9 | ||
| 74 | #define UV_BAU_MESSAGE 0xf8 | ||
| 75 | #define INVALIDATE_TLB_VECTOR_END 0xf7 | ||
| 76 | #define INVALIDATE_TLB_VECTOR_START 0xf0 /* f0-f7 used for TLB flush */ | ||
| 77 | |||
| 78 | #define NUM_INVALIDATE_TLB_VECTORS 8 | ||
| 79 | 89 | ||
| 90 | #ifdef CONFIG_X86_32 | ||
| 91 | /* 0xf8 - 0xf9 : free */ | ||
| 92 | #else | ||
| 93 | # define THRESHOLD_APIC_VECTOR 0xf9 | ||
| 94 | # define UV_BAU_MESSAGE 0xf8 | ||
| 80 | #endif | 95 | #endif |
| 81 | 96 | ||
| 97 | /* f0-f7 used for spreading out TLB flushes: */ | ||
| 98 | #define INVALIDATE_TLB_VECTOR_END 0xf7 | ||
| 99 | #define INVALIDATE_TLB_VECTOR_START 0xf0 | ||
| 100 | #define NUM_INVALIDATE_TLB_VECTORS 8 | ||
| 101 | |||
| 82 | /* | 102 | /* |
| 83 | * Local APIC timer IRQ vector is on a different priority level, | 103 | * Local APIC timer IRQ vector is on a different priority level, |
| 84 | * to work around the 'lost local interrupt if more than 2 IRQ | 104 | * to work around the 'lost local interrupt if more than 2 IRQ |
| 85 | * sources per level' errata. | 105 | * sources per level' errata. |
| 86 | */ | 106 | */ |
| 87 | #define LOCAL_TIMER_VECTOR 0xef | 107 | #define LOCAL_TIMER_VECTOR 0xef |
| 108 | |||
| 109 | /* | ||
| 110 | * Performance monitoring interrupt vector: | ||
| 111 | */ | ||
| 112 | #define LOCAL_PERF_VECTOR 0xee | ||
| 88 | 113 | ||
| 89 | /* | 114 | /* |
| 90 | * First APIC vector available to drivers: (vectors 0x30-0xee) we | 115 | * First APIC vector available to drivers: (vectors 0x30-0xee) we |
| 91 | * start at 0x31(0x41) to spread out vectors evenly between priority | 116 | * start at 0x31(0x41) to spread out vectors evenly between priority |
| 92 | * levels. (0x80 is the syscall vector) | 117 | * levels. (0x80 is the syscall vector) |
| 93 | */ | 118 | */ |
| 94 | #define FIRST_DEVICE_VECTOR (IRQ15_VECTOR + 2) | 119 | #define FIRST_DEVICE_VECTOR (IRQ15_VECTOR + 2) |
| 95 | |||
| 96 | #define NR_VECTORS 256 | ||
| 97 | 120 | ||
| 98 | #define FPU_IRQ 13 | 121 | #define NR_VECTORS 256 |
| 99 | 122 | ||
| 100 | #define FIRST_VM86_IRQ 3 | 123 | #define FPU_IRQ 13 |
| 101 | #define LAST_VM86_IRQ 15 | ||
| 102 | #define invalid_vm86_irq(irq) ((irq) < 3 || (irq) > 15) | ||
| 103 | 124 | ||
| 104 | #define NR_IRQS_LEGACY 16 | 125 | #define FIRST_VM86_IRQ 3 |
| 126 | #define LAST_VM86_IRQ 15 | ||
| 105 | 127 | ||
| 106 | #if defined(CONFIG_X86_IO_APIC) && !defined(CONFIG_X86_VOYAGER) | 128 | #ifndef __ASSEMBLY__ |
| 107 | 129 | static inline int invalid_vm86_irq(int irq) | |
| 108 | #ifndef CONFIG_SPARSE_IRQ | 130 | { |
| 109 | # if NR_CPUS < MAX_IO_APICS | 131 | return irq < 3 || irq > 15; |
| 110 | # define NR_IRQS (NR_VECTORS + (32 * NR_CPUS)) | 132 | } |
| 111 | # else | ||
| 112 | # define NR_IRQS (NR_VECTORS + (32 * MAX_IO_APICS)) | ||
| 113 | # endif | ||
| 114 | #else | ||
| 115 | # if (8 * NR_CPUS) > (32 * MAX_IO_APICS) | ||
| 116 | # define NR_IRQS (NR_VECTORS + (8 * NR_CPUS)) | ||
| 117 | # else | ||
| 118 | # define NR_IRQS (NR_VECTORS + (32 * MAX_IO_APICS)) | ||
| 119 | # endif | ||
| 120 | #endif | 133 | #endif |
| 121 | 134 | ||
| 122 | #elif defined(CONFIG_X86_VOYAGER) | 135 | /* |
| 123 | 136 | * Size the maximum number of interrupts. | |
| 124 | # define NR_IRQS 224 | 137 | * |
| 138 | * If the irq_desc[] array has a sparse layout, we can size things | ||
| 139 | * generously - it scales up linearly with the maximum number of CPUs, | ||
| 140 | * and the maximum number of IO-APICs, whichever is higher. | ||
| 141 | * | ||
| 142 | * In other cases we size more conservatively, to not create too large | ||
| 143 | * static arrays. | ||
| 144 | */ | ||
| 125 | 145 | ||
| 126 | #else /* IO_APIC || VOYAGER */ | 146 | #define NR_IRQS_LEGACY 16 |
| 127 | 147 | ||
| 128 | # define NR_IRQS 16 | 148 | #define CPU_VECTOR_LIMIT ( 8 * NR_CPUS ) |
| 149 | #define IO_APIC_VECTOR_LIMIT ( 32 * MAX_IO_APICS ) | ||
| 129 | 150 | ||
| 151 | #ifdef CONFIG_X86_IO_APIC | ||
| 152 | # ifdef CONFIG_SPARSE_IRQ | ||
| 153 | # define NR_IRQS \ | ||
| 154 | (CPU_VECTOR_LIMIT > IO_APIC_VECTOR_LIMIT ? \ | ||
| 155 | (NR_VECTORS + CPU_VECTOR_LIMIT) : \ | ||
| 156 | (NR_VECTORS + IO_APIC_VECTOR_LIMIT)) | ||
| 157 | # else | ||
| 158 | # if NR_CPUS < MAX_IO_APICS | ||
| 159 | # define NR_IRQS (NR_VECTORS + 4*CPU_VECTOR_LIMIT) | ||
| 160 | # else | ||
| 161 | # define NR_IRQS (NR_VECTORS + IO_APIC_VECTOR_LIMIT) | ||
| 162 | # endif | ||
| 163 | # endif | ||
| 164 | #else /* !CONFIG_X86_IO_APIC: */ | ||
| 165 | # define NR_IRQS NR_IRQS_LEGACY | ||
| 130 | #endif | 166 | #endif |
| 131 | 167 | ||
| 132 | /* Voyager specific defines */ | ||
| 133 | /* These define the CPIs we use in linux */ | ||
| 134 | #define VIC_CPI_LEVEL0 0 | ||
| 135 | #define VIC_CPI_LEVEL1 1 | ||
| 136 | /* now the fake CPIs */ | ||
| 137 | #define VIC_TIMER_CPI 2 | ||
| 138 | #define VIC_INVALIDATE_CPI 3 | ||
| 139 | #define VIC_RESCHEDULE_CPI 4 | ||
| 140 | #define VIC_ENABLE_IRQ_CPI 5 | ||
| 141 | #define VIC_CALL_FUNCTION_CPI 6 | ||
| 142 | #define VIC_CALL_FUNCTION_SINGLE_CPI 7 | ||
| 143 | |||
| 144 | /* Now the QIC CPIs: Since we don't need the two initial levels, | ||
| 145 | * these are 2 less than the VIC CPIs */ | ||
| 146 | #define QIC_CPI_OFFSET 1 | ||
| 147 | #define QIC_TIMER_CPI (VIC_TIMER_CPI - QIC_CPI_OFFSET) | ||
| 148 | #define QIC_INVALIDATE_CPI (VIC_INVALIDATE_CPI - QIC_CPI_OFFSET) | ||
| 149 | #define QIC_RESCHEDULE_CPI (VIC_RESCHEDULE_CPI - QIC_CPI_OFFSET) | ||
| 150 | #define QIC_ENABLE_IRQ_CPI (VIC_ENABLE_IRQ_CPI - QIC_CPI_OFFSET) | ||
| 151 | #define QIC_CALL_FUNCTION_CPI (VIC_CALL_FUNCTION_CPI - QIC_CPI_OFFSET) | ||
| 152 | #define QIC_CALL_FUNCTION_SINGLE_CPI (VIC_CALL_FUNCTION_SINGLE_CPI - QIC_CPI_OFFSET) | ||
| 153 | |||
| 154 | #define VIC_START_FAKE_CPI VIC_TIMER_CPI | ||
| 155 | #define VIC_END_FAKE_CPI VIC_CALL_FUNCTION_SINGLE_CPI | ||
| 156 | |||
| 157 | /* this is the SYS_INT CPI. */ | ||
| 158 | #define VIC_SYS_INT 8 | ||
| 159 | #define VIC_CMN_INT 15 | ||
| 160 | |||
| 161 | /* This is the boot CPI for alternate processors. It gets overwritten | ||
| 162 | * by the above once the system has activated all available processors */ | ||
| 163 | #define VIC_CPU_BOOT_CPI VIC_CPI_LEVEL0 | ||
| 164 | #define VIC_CPU_BOOT_ERRATA_CPI (VIC_CPI_LEVEL0 + 8) | ||
| 165 | |||
| 166 | |||
| 167 | #endif /* _ASM_X86_IRQ_VECTORS_H */ | 168 | #endif /* _ASM_X86_IRQ_VECTORS_H */ |
diff --git a/arch/x86/include/asm/kexec.h b/arch/x86/include/asm/kexec.h index c61d8b2ab8b9..0ceb6d19ed30 100644 --- a/arch/x86/include/asm/kexec.h +++ b/arch/x86/include/asm/kexec.h | |||
| @@ -9,23 +9,8 @@ | |||
| 9 | # define PAGES_NR 4 | 9 | # define PAGES_NR 4 |
| 10 | #else | 10 | #else |
| 11 | # define PA_CONTROL_PAGE 0 | 11 | # define PA_CONTROL_PAGE 0 |
| 12 | # define VA_CONTROL_PAGE 1 | 12 | # define PA_TABLE_PAGE 1 |
| 13 | # define PA_PGD 2 | 13 | # define PAGES_NR 2 |
| 14 | # define VA_PGD 3 | ||
| 15 | # define PA_PUD_0 4 | ||
| 16 | # define VA_PUD_0 5 | ||
| 17 | # define PA_PMD_0 6 | ||
| 18 | # define VA_PMD_0 7 | ||
| 19 | # define PA_PTE_0 8 | ||
| 20 | # define VA_PTE_0 9 | ||
| 21 | # define PA_PUD_1 10 | ||
| 22 | # define VA_PUD_1 11 | ||
| 23 | # define PA_PMD_1 12 | ||
| 24 | # define VA_PMD_1 13 | ||
| 25 | # define PA_PTE_1 14 | ||
| 26 | # define VA_PTE_1 15 | ||
| 27 | # define PA_TABLE_PAGE 16 | ||
| 28 | # define PAGES_NR 17 | ||
| 29 | #endif | 14 | #endif |
| 30 | 15 | ||
| 31 | #ifdef CONFIG_X86_32 | 16 | #ifdef CONFIG_X86_32 |
| @@ -157,9 +142,9 @@ relocate_kernel(unsigned long indirection_page, | |||
| 157 | unsigned long start_address) ATTRIB_NORET; | 142 | unsigned long start_address) ATTRIB_NORET; |
| 158 | #endif | 143 | #endif |
| 159 | 144 | ||
| 160 | #ifdef CONFIG_X86_32 | ||
| 161 | #define ARCH_HAS_KIMAGE_ARCH | 145 | #define ARCH_HAS_KIMAGE_ARCH |
| 162 | 146 | ||
| 147 | #ifdef CONFIG_X86_32 | ||
| 163 | struct kimage_arch { | 148 | struct kimage_arch { |
| 164 | pgd_t *pgd; | 149 | pgd_t *pgd; |
| 165 | #ifdef CONFIG_X86_PAE | 150 | #ifdef CONFIG_X86_PAE |
| @@ -169,6 +154,12 @@ struct kimage_arch { | |||
| 169 | pte_t *pte0; | 154 | pte_t *pte0; |
| 170 | pte_t *pte1; | 155 | pte_t *pte1; |
| 171 | }; | 156 | }; |
| 157 | #else | ||
| 158 | struct kimage_arch { | ||
| 159 | pud_t *pud; | ||
| 160 | pmd_t *pmd; | ||
| 161 | pte_t *pte; | ||
| 162 | }; | ||
| 172 | #endif | 163 | #endif |
| 173 | 164 | ||
| 174 | #endif /* __ASSEMBLY__ */ | 165 | #endif /* __ASSEMBLY__ */ |
diff --git a/arch/x86/include/asm/linkage.h b/arch/x86/include/asm/linkage.h index 5d98d0b68ffc..9320e2a8a26a 100644 --- a/arch/x86/include/asm/linkage.h +++ b/arch/x86/include/asm/linkage.h | |||
| @@ -52,70 +52,14 @@ | |||
| 52 | 52 | ||
| 53 | #endif | 53 | #endif |
| 54 | 54 | ||
| 55 | #define GLOBAL(name) \ | ||
| 56 | .globl name; \ | ||
| 57 | name: | ||
| 58 | |||
| 55 | #ifdef CONFIG_X86_ALIGNMENT_16 | 59 | #ifdef CONFIG_X86_ALIGNMENT_16 |
| 56 | #define __ALIGN .align 16,0x90 | 60 | #define __ALIGN .align 16,0x90 |
| 57 | #define __ALIGN_STR ".align 16,0x90" | 61 | #define __ALIGN_STR ".align 16,0x90" |
| 58 | #endif | 62 | #endif |
| 59 | 63 | ||
| 60 | /* | ||
| 61 | * to check ENTRY_X86/END_X86 and | ||
| 62 | * KPROBE_ENTRY_X86/KPROBE_END_X86 | ||
| 63 | * unbalanced-missed-mixed appearance | ||
| 64 | */ | ||
| 65 | #define __set_entry_x86 .set ENTRY_X86_IN, 0 | ||
| 66 | #define __unset_entry_x86 .set ENTRY_X86_IN, 1 | ||
| 67 | #define __set_kprobe_x86 .set KPROBE_X86_IN, 0 | ||
| 68 | #define __unset_kprobe_x86 .set KPROBE_X86_IN, 1 | ||
| 69 | |||
| 70 | #define __macro_err_x86 .error "ENTRY_X86/KPROBE_X86 unbalanced,missed,mixed" | ||
| 71 | |||
| 72 | #define __check_entry_x86 \ | ||
| 73 | .ifdef ENTRY_X86_IN; \ | ||
| 74 | .ifeq ENTRY_X86_IN; \ | ||
| 75 | __macro_err_x86; \ | ||
| 76 | .abort; \ | ||
| 77 | .endif; \ | ||
| 78 | .endif | ||
| 79 | |||
| 80 | #define __check_kprobe_x86 \ | ||
| 81 | .ifdef KPROBE_X86_IN; \ | ||
| 82 | .ifeq KPROBE_X86_IN; \ | ||
| 83 | __macro_err_x86; \ | ||
| 84 | .abort; \ | ||
| 85 | .endif; \ | ||
| 86 | .endif | ||
| 87 | |||
| 88 | #define __check_entry_kprobe_x86 \ | ||
| 89 | __check_entry_x86; \ | ||
| 90 | __check_kprobe_x86 | ||
| 91 | |||
| 92 | #define ENTRY_KPROBE_FINAL_X86 __check_entry_kprobe_x86 | ||
| 93 | |||
| 94 | #define ENTRY_X86(name) \ | ||
| 95 | __check_entry_kprobe_x86; \ | ||
| 96 | __set_entry_x86; \ | ||
| 97 | .globl name; \ | ||
| 98 | __ALIGN; \ | ||
| 99 | name: | ||
| 100 | |||
| 101 | #define END_X86(name) \ | ||
| 102 | __unset_entry_x86; \ | ||
| 103 | __check_entry_kprobe_x86; \ | ||
| 104 | .size name, .-name | ||
| 105 | |||
| 106 | #define KPROBE_ENTRY_X86(name) \ | ||
| 107 | __check_entry_kprobe_x86; \ | ||
| 108 | __set_kprobe_x86; \ | ||
| 109 | .pushsection .kprobes.text, "ax"; \ | ||
| 110 | .globl name; \ | ||
| 111 | __ALIGN; \ | ||
| 112 | name: | ||
| 113 | |||
| 114 | #define KPROBE_END_X86(name) \ | ||
| 115 | __unset_kprobe_x86; \ | ||
| 116 | __check_entry_kprobe_x86; \ | ||
| 117 | .size name, .-name; \ | ||
| 118 | .popsection | ||
| 119 | |||
| 120 | #endif /* _ASM_X86_LINKAGE_H */ | 64 | #endif /* _ASM_X86_LINKAGE_H */ |
| 121 | 65 | ||
diff --git a/arch/x86/include/asm/mach-default/mach_apic.h b/arch/x86/include/asm/mach-default/mach_apic.h deleted file mode 100644 index cc09cbbee27e..000000000000 --- a/arch/x86/include/asm/mach-default/mach_apic.h +++ /dev/null | |||
| @@ -1,168 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MACH_DEFAULT_MACH_APIC_H | ||
| 2 | #define _ASM_X86_MACH_DEFAULT_MACH_APIC_H | ||
| 3 | |||
| 4 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 5 | |||
| 6 | #include <mach_apicdef.h> | ||
| 7 | #include <asm/smp.h> | ||
| 8 | |||
| 9 | #define APIC_DFR_VALUE (APIC_DFR_FLAT) | ||
| 10 | |||
| 11 | static inline const struct cpumask *target_cpus(void) | ||
| 12 | { | ||
| 13 | #ifdef CONFIG_SMP | ||
| 14 | return cpu_online_mask; | ||
| 15 | #else | ||
| 16 | return cpumask_of(0); | ||
| 17 | #endif | ||
| 18 | } | ||
| 19 | |||
| 20 | #define NO_BALANCE_IRQ (0) | ||
| 21 | #define esr_disable (0) | ||
| 22 | |||
| 23 | #ifdef CONFIG_X86_64 | ||
| 24 | #include <asm/genapic.h> | ||
| 25 | #define INT_DELIVERY_MODE (genapic->int_delivery_mode) | ||
| 26 | #define INT_DEST_MODE (genapic->int_dest_mode) | ||
| 27 | #define TARGET_CPUS (genapic->target_cpus()) | ||
| 28 | #define apic_id_registered (genapic->apic_id_registered) | ||
| 29 | #define init_apic_ldr (genapic->init_apic_ldr) | ||
| 30 | #define cpu_mask_to_apicid (genapic->cpu_mask_to_apicid) | ||
| 31 | #define cpu_mask_to_apicid_and (genapic->cpu_mask_to_apicid_and) | ||
| 32 | #define phys_pkg_id (genapic->phys_pkg_id) | ||
| 33 | #define vector_allocation_domain (genapic->vector_allocation_domain) | ||
| 34 | #define read_apic_id() (GET_APIC_ID(apic_read(APIC_ID))) | ||
| 35 | #define send_IPI_self (genapic->send_IPI_self) | ||
| 36 | #define wakeup_secondary_cpu (genapic->wakeup_cpu) | ||
| 37 | extern void setup_apic_routing(void); | ||
| 38 | #else | ||
| 39 | #define INT_DELIVERY_MODE dest_LowestPrio | ||
| 40 | #define INT_DEST_MODE 1 /* logical delivery broadcast to all procs */ | ||
| 41 | #define TARGET_CPUS (target_cpus()) | ||
| 42 | #define wakeup_secondary_cpu wakeup_secondary_cpu_via_init | ||
| 43 | /* | ||
| 44 | * Set up the logical destination ID. | ||
| 45 | * | ||
| 46 | * Intel recommends to set DFR, LDR and TPR before enabling | ||
| 47 | * an APIC. See e.g. "AP-388 82489DX User's Manual" (Intel | ||
| 48 | * document number 292116). So here it goes... | ||
| 49 | */ | ||
| 50 | static inline void init_apic_ldr(void) | ||
| 51 | { | ||
| 52 | unsigned long val; | ||
| 53 | |||
| 54 | apic_write(APIC_DFR, APIC_DFR_VALUE); | ||
| 55 | val = apic_read(APIC_LDR) & ~APIC_LDR_MASK; | ||
| 56 | val |= SET_APIC_LOGICAL_ID(1UL << smp_processor_id()); | ||
| 57 | apic_write(APIC_LDR, val); | ||
| 58 | } | ||
| 59 | |||
| 60 | static inline int apic_id_registered(void) | ||
| 61 | { | ||
| 62 | return physid_isset(read_apic_id(), phys_cpu_present_map); | ||
| 63 | } | ||
| 64 | |||
| 65 | static inline unsigned int cpu_mask_to_apicid(const struct cpumask *cpumask) | ||
| 66 | { | ||
| 67 | return cpumask_bits(cpumask)[0]; | ||
| 68 | } | ||
| 69 | |||
| 70 | static inline unsigned int cpu_mask_to_apicid_and(const struct cpumask *cpumask, | ||
| 71 | const struct cpumask *andmask) | ||
| 72 | { | ||
| 73 | unsigned long mask1 = cpumask_bits(cpumask)[0]; | ||
| 74 | unsigned long mask2 = cpumask_bits(andmask)[0]; | ||
| 75 | unsigned long mask3 = cpumask_bits(cpu_online_mask)[0]; | ||
| 76 | |||
| 77 | return (unsigned int)(mask1 & mask2 & mask3); | ||
| 78 | } | ||
| 79 | |||
| 80 | static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb) | ||
| 81 | { | ||
| 82 | return cpuid_apic >> index_msb; | ||
| 83 | } | ||
| 84 | |||
| 85 | static inline void setup_apic_routing(void) | ||
| 86 | { | ||
| 87 | #ifdef CONFIG_X86_IO_APIC | ||
| 88 | printk("Enabling APIC mode: %s. Using %d I/O APICs\n", | ||
| 89 | "Flat", nr_ioapics); | ||
| 90 | #endif | ||
| 91 | } | ||
| 92 | |||
| 93 | static inline int apicid_to_node(int logical_apicid) | ||
| 94 | { | ||
| 95 | #ifdef CONFIG_SMP | ||
| 96 | return apicid_2_node[hard_smp_processor_id()]; | ||
| 97 | #else | ||
| 98 | return 0; | ||
| 99 | #endif | ||
| 100 | } | ||
| 101 | |||
| 102 | static inline void vector_allocation_domain(int cpu, struct cpumask *retmask) | ||
| 103 | { | ||
| 104 | /* Careful. Some cpus do not strictly honor the set of cpus | ||
| 105 | * specified in the interrupt destination when using lowest | ||
| 106 | * priority interrupt delivery mode. | ||
| 107 | * | ||
| 108 | * In particular there was a hyperthreading cpu observed to | ||
| 109 | * deliver interrupts to the wrong hyperthread when only one | ||
| 110 | * hyperthread was specified in the interrupt desitination. | ||
| 111 | */ | ||
| 112 | *retmask = (cpumask_t) { { [0] = APIC_ALL_CPUS } }; | ||
| 113 | } | ||
| 114 | #endif | ||
| 115 | |||
| 116 | static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid) | ||
| 117 | { | ||
| 118 | return physid_isset(apicid, bitmap); | ||
| 119 | } | ||
| 120 | |||
| 121 | static inline unsigned long check_apicid_present(int bit) | ||
| 122 | { | ||
| 123 | return physid_isset(bit, phys_cpu_present_map); | ||
| 124 | } | ||
| 125 | |||
| 126 | static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map) | ||
| 127 | { | ||
| 128 | return phys_map; | ||
| 129 | } | ||
| 130 | |||
| 131 | static inline int multi_timer_check(int apic, int irq) | ||
| 132 | { | ||
| 133 | return 0; | ||
| 134 | } | ||
| 135 | |||
| 136 | /* Mapping from cpu number to logical apicid */ | ||
| 137 | static inline int cpu_to_logical_apicid(int cpu) | ||
| 138 | { | ||
| 139 | return 1 << cpu; | ||
| 140 | } | ||
| 141 | |||
| 142 | static inline int cpu_present_to_apicid(int mps_cpu) | ||
| 143 | { | ||
| 144 | if (mps_cpu < nr_cpu_ids && cpu_present(mps_cpu)) | ||
| 145 | return (int)per_cpu(x86_bios_cpu_apicid, mps_cpu); | ||
| 146 | else | ||
| 147 | return BAD_APICID; | ||
| 148 | } | ||
| 149 | |||
| 150 | static inline physid_mask_t apicid_to_cpu_present(int phys_apicid) | ||
| 151 | { | ||
| 152 | return physid_mask_of_physid(phys_apicid); | ||
| 153 | } | ||
| 154 | |||
| 155 | static inline void setup_portio_remap(void) | ||
| 156 | { | ||
| 157 | } | ||
| 158 | |||
| 159 | static inline int check_phys_apicid_present(int boot_cpu_physical_apicid) | ||
| 160 | { | ||
| 161 | return physid_isset(boot_cpu_physical_apicid, phys_cpu_present_map); | ||
| 162 | } | ||
| 163 | |||
| 164 | static inline void enable_apic_mode(void) | ||
| 165 | { | ||
| 166 | } | ||
| 167 | #endif /* CONFIG_X86_LOCAL_APIC */ | ||
| 168 | #endif /* _ASM_X86_MACH_DEFAULT_MACH_APIC_H */ | ||
diff --git a/arch/x86/include/asm/mach-default/mach_apicdef.h b/arch/x86/include/asm/mach-default/mach_apicdef.h deleted file mode 100644 index 53179936d6c6..000000000000 --- a/arch/x86/include/asm/mach-default/mach_apicdef.h +++ /dev/null | |||
| @@ -1,24 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MACH_DEFAULT_MACH_APICDEF_H | ||
| 2 | #define _ASM_X86_MACH_DEFAULT_MACH_APICDEF_H | ||
| 3 | |||
| 4 | #include <asm/apic.h> | ||
| 5 | |||
| 6 | #ifdef CONFIG_X86_64 | ||
| 7 | #define APIC_ID_MASK (genapic->apic_id_mask) | ||
| 8 | #define GET_APIC_ID(x) (genapic->get_apic_id(x)) | ||
| 9 | #define SET_APIC_ID(x) (genapic->set_apic_id(x)) | ||
| 10 | #else | ||
| 11 | #define APIC_ID_MASK (0xF<<24) | ||
| 12 | static inline unsigned get_apic_id(unsigned long x) | ||
| 13 | { | ||
| 14 | unsigned int ver = GET_APIC_VERSION(apic_read(APIC_LVR)); | ||
| 15 | if (APIC_XAPIC(ver)) | ||
| 16 | return (((x)>>24)&0xFF); | ||
| 17 | else | ||
| 18 | return (((x)>>24)&0xF); | ||
| 19 | } | ||
| 20 | |||
| 21 | #define GET_APIC_ID(x) get_apic_id(x) | ||
| 22 | #endif | ||
| 23 | |||
| 24 | #endif /* _ASM_X86_MACH_DEFAULT_MACH_APICDEF_H */ | ||
diff --git a/arch/x86/include/asm/mach-default/mach_ipi.h b/arch/x86/include/asm/mach-default/mach_ipi.h deleted file mode 100644 index 191312d155da..000000000000 --- a/arch/x86/include/asm/mach-default/mach_ipi.h +++ /dev/null | |||
| @@ -1,64 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MACH_DEFAULT_MACH_IPI_H | ||
| 2 | #define _ASM_X86_MACH_DEFAULT_MACH_IPI_H | ||
| 3 | |||
| 4 | /* Avoid include hell */ | ||
| 5 | #define NMI_VECTOR 0x02 | ||
| 6 | |||
| 7 | void send_IPI_mask_bitmask(const struct cpumask *mask, int vector); | ||
| 8 | void send_IPI_mask_allbutself(const struct cpumask *mask, int vector); | ||
| 9 | void __send_IPI_shortcut(unsigned int shortcut, int vector); | ||
| 10 | |||
| 11 | extern int no_broadcast; | ||
| 12 | |||
| 13 | #ifdef CONFIG_X86_64 | ||
| 14 | #include <asm/genapic.h> | ||
| 15 | #define send_IPI_mask (genapic->send_IPI_mask) | ||
| 16 | #define send_IPI_mask_allbutself (genapic->send_IPI_mask_allbutself) | ||
| 17 | #else | ||
| 18 | static inline void send_IPI_mask(const struct cpumask *mask, int vector) | ||
| 19 | { | ||
| 20 | send_IPI_mask_bitmask(mask, vector); | ||
| 21 | } | ||
| 22 | void send_IPI_mask_allbutself(const struct cpumask *mask, int vector); | ||
| 23 | #endif | ||
| 24 | |||
| 25 | static inline void __local_send_IPI_allbutself(int vector) | ||
| 26 | { | ||
| 27 | if (no_broadcast || vector == NMI_VECTOR) | ||
| 28 | send_IPI_mask_allbutself(cpu_online_mask, vector); | ||
| 29 | else | ||
| 30 | __send_IPI_shortcut(APIC_DEST_ALLBUT, vector); | ||
| 31 | } | ||
| 32 | |||
| 33 | static inline void __local_send_IPI_all(int vector) | ||
| 34 | { | ||
| 35 | if (no_broadcast || vector == NMI_VECTOR) | ||
| 36 | send_IPI_mask(cpu_online_mask, vector); | ||
| 37 | else | ||
| 38 | __send_IPI_shortcut(APIC_DEST_ALLINC, vector); | ||
| 39 | } | ||
| 40 | |||
| 41 | #ifdef CONFIG_X86_64 | ||
| 42 | #define send_IPI_allbutself (genapic->send_IPI_allbutself) | ||
| 43 | #define send_IPI_all (genapic->send_IPI_all) | ||
| 44 | #else | ||
| 45 | static inline void send_IPI_allbutself(int vector) | ||
| 46 | { | ||
| 47 | /* | ||
| 48 | * if there are no other CPUs in the system then we get an APIC send | ||
| 49 | * error if we try to broadcast, thus avoid sending IPIs in this case. | ||
| 50 | */ | ||
| 51 | if (!(num_online_cpus() > 1)) | ||
| 52 | return; | ||
| 53 | |||
| 54 | __local_send_IPI_allbutself(vector); | ||
| 55 | return; | ||
| 56 | } | ||
| 57 | |||
| 58 | static inline void send_IPI_all(int vector) | ||
| 59 | { | ||
| 60 | __local_send_IPI_all(vector); | ||
| 61 | } | ||
| 62 | #endif | ||
| 63 | |||
| 64 | #endif /* _ASM_X86_MACH_DEFAULT_MACH_IPI_H */ | ||
diff --git a/arch/x86/include/asm/mach-default/mach_mpparse.h b/arch/x86/include/asm/mach-default/mach_mpparse.h deleted file mode 100644 index c70a263d68cd..000000000000 --- a/arch/x86/include/asm/mach-default/mach_mpparse.h +++ /dev/null | |||
| @@ -1,17 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MACH_DEFAULT_MACH_MPPARSE_H | ||
| 2 | #define _ASM_X86_MACH_DEFAULT_MACH_MPPARSE_H | ||
| 3 | |||
| 4 | static inline int | ||
| 5 | mps_oem_check(struct mpc_table *mpc, char *oem, char *productid) | ||
| 6 | { | ||
| 7 | return 0; | ||
| 8 | } | ||
| 9 | |||
| 10 | /* Hook from generic ACPI tables.c */ | ||
| 11 | static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) | ||
| 12 | { | ||
| 13 | return 0; | ||
| 14 | } | ||
| 15 | |||
| 16 | |||
| 17 | #endif /* _ASM_X86_MACH_DEFAULT_MACH_MPPARSE_H */ | ||
diff --git a/arch/x86/include/asm/mach-default/mach_mpspec.h b/arch/x86/include/asm/mach-default/mach_mpspec.h deleted file mode 100644 index e85ede686be8..000000000000 --- a/arch/x86/include/asm/mach-default/mach_mpspec.h +++ /dev/null | |||
| @@ -1,12 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MACH_DEFAULT_MACH_MPSPEC_H | ||
| 2 | #define _ASM_X86_MACH_DEFAULT_MACH_MPSPEC_H | ||
| 3 | |||
| 4 | #define MAX_IRQ_SOURCES 256 | ||
| 5 | |||
| 6 | #if CONFIG_BASE_SMALL == 0 | ||
| 7 | #define MAX_MP_BUSSES 256 | ||
| 8 | #else | ||
| 9 | #define MAX_MP_BUSSES 32 | ||
| 10 | #endif | ||
| 11 | |||
| 12 | #endif /* _ASM_X86_MACH_DEFAULT_MACH_MPSPEC_H */ | ||
diff --git a/arch/x86/include/asm/mach-default/mach_wakecpu.h b/arch/x86/include/asm/mach-default/mach_wakecpu.h deleted file mode 100644 index 89897a6a65b9..000000000000 --- a/arch/x86/include/asm/mach-default/mach_wakecpu.h +++ /dev/null | |||
| @@ -1,41 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MACH_DEFAULT_MACH_WAKECPU_H | ||
| 2 | #define _ASM_X86_MACH_DEFAULT_MACH_WAKECPU_H | ||
| 3 | |||
| 4 | #define TRAMPOLINE_PHYS_LOW (0x467) | ||
| 5 | #define TRAMPOLINE_PHYS_HIGH (0x469) | ||
| 6 | |||
| 7 | static inline void wait_for_init_deassert(atomic_t *deassert) | ||
| 8 | { | ||
| 9 | while (!atomic_read(deassert)) | ||
| 10 | cpu_relax(); | ||
| 11 | return; | ||
| 12 | } | ||
| 13 | |||
| 14 | /* Nothing to do for most platforms, since cleared by the INIT cycle */ | ||
| 15 | static inline void smp_callin_clear_local_apic(void) | ||
| 16 | { | ||
| 17 | } | ||
| 18 | |||
| 19 | static inline void store_NMI_vector(unsigned short *high, unsigned short *low) | ||
| 20 | { | ||
| 21 | } | ||
| 22 | |||
| 23 | static inline void restore_NMI_vector(unsigned short *high, unsigned short *low) | ||
| 24 | { | ||
| 25 | } | ||
| 26 | |||
| 27 | #ifdef CONFIG_SMP | ||
| 28 | extern void __inquire_remote_apic(int apicid); | ||
| 29 | #else /* CONFIG_SMP */ | ||
| 30 | static inline void __inquire_remote_apic(int apicid) | ||
| 31 | { | ||
| 32 | } | ||
| 33 | #endif /* CONFIG_SMP */ | ||
| 34 | |||
| 35 | static inline void inquire_remote_apic(int apicid) | ||
| 36 | { | ||
| 37 | if (apic_verbosity >= APIC_DEBUG) | ||
| 38 | __inquire_remote_apic(apicid); | ||
| 39 | } | ||
| 40 | |||
| 41 | #endif /* _ASM_X86_MACH_DEFAULT_MACH_WAKECPU_H */ | ||
diff --git a/arch/x86/include/asm/mach-generic/gpio.h b/arch/x86/include/asm/mach-generic/gpio.h deleted file mode 100644 index 995c45efdb33..000000000000 --- a/arch/x86/include/asm/mach-generic/gpio.h +++ /dev/null | |||
| @@ -1,15 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MACH_GENERIC_GPIO_H | ||
| 2 | #define _ASM_X86_MACH_GENERIC_GPIO_H | ||
| 3 | |||
| 4 | int gpio_request(unsigned gpio, const char *label); | ||
| 5 | void gpio_free(unsigned gpio); | ||
| 6 | int gpio_direction_input(unsigned gpio); | ||
| 7 | int gpio_direction_output(unsigned gpio, int value); | ||
| 8 | int gpio_get_value(unsigned gpio); | ||
| 9 | void gpio_set_value(unsigned gpio, int value); | ||
| 10 | int gpio_to_irq(unsigned gpio); | ||
| 11 | int irq_to_gpio(unsigned irq); | ||
| 12 | |||
| 13 | #include <asm-generic/gpio.h> /* cansleep wrappers */ | ||
| 14 | |||
| 15 | #endif /* _ASM_X86_MACH_GENERIC_GPIO_H */ | ||
diff --git a/arch/x86/include/asm/mach-generic/mach_apic.h b/arch/x86/include/asm/mach-generic/mach_apic.h deleted file mode 100644 index 48553e958ad5..000000000000 --- a/arch/x86/include/asm/mach-generic/mach_apic.h +++ /dev/null | |||
| @@ -1,35 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MACH_GENERIC_MACH_APIC_H | ||
| 2 | #define _ASM_X86_MACH_GENERIC_MACH_APIC_H | ||
| 3 | |||
| 4 | #include <asm/genapic.h> | ||
| 5 | |||
| 6 | #define esr_disable (genapic->ESR_DISABLE) | ||
| 7 | #define NO_BALANCE_IRQ (genapic->no_balance_irq) | ||
| 8 | #define INT_DELIVERY_MODE (genapic->int_delivery_mode) | ||
| 9 | #define INT_DEST_MODE (genapic->int_dest_mode) | ||
| 10 | #undef APIC_DEST_LOGICAL | ||
| 11 | #define APIC_DEST_LOGICAL (genapic->apic_destination_logical) | ||
| 12 | #define TARGET_CPUS (genapic->target_cpus()) | ||
| 13 | #define apic_id_registered (genapic->apic_id_registered) | ||
| 14 | #define init_apic_ldr (genapic->init_apic_ldr) | ||
| 15 | #define ioapic_phys_id_map (genapic->ioapic_phys_id_map) | ||
| 16 | #define setup_apic_routing (genapic->setup_apic_routing) | ||
| 17 | #define multi_timer_check (genapic->multi_timer_check) | ||
| 18 | #define apicid_to_node (genapic->apicid_to_node) | ||
| 19 | #define cpu_to_logical_apicid (genapic->cpu_to_logical_apicid) | ||
| 20 | #define cpu_present_to_apicid (genapic->cpu_present_to_apicid) | ||
| 21 | #define apicid_to_cpu_present (genapic->apicid_to_cpu_present) | ||
| 22 | #define setup_portio_remap (genapic->setup_portio_remap) | ||
| 23 | #define check_apicid_present (genapic->check_apicid_present) | ||
| 24 | #define check_phys_apicid_present (genapic->check_phys_apicid_present) | ||
| 25 | #define check_apicid_used (genapic->check_apicid_used) | ||
| 26 | #define cpu_mask_to_apicid (genapic->cpu_mask_to_apicid) | ||
| 27 | #define cpu_mask_to_apicid_and (genapic->cpu_mask_to_apicid_and) | ||
| 28 | #define vector_allocation_domain (genapic->vector_allocation_domain) | ||
| 29 | #define enable_apic_mode (genapic->enable_apic_mode) | ||
| 30 | #define phys_pkg_id (genapic->phys_pkg_id) | ||
| 31 | #define wakeup_secondary_cpu (genapic->wakeup_cpu) | ||
| 32 | |||
| 33 | extern void generic_bigsmp_probe(void); | ||
| 34 | |||
| 35 | #endif /* _ASM_X86_MACH_GENERIC_MACH_APIC_H */ | ||
diff --git a/arch/x86/include/asm/mach-generic/mach_apicdef.h b/arch/x86/include/asm/mach-generic/mach_apicdef.h deleted file mode 100644 index 68041f3802f4..000000000000 --- a/arch/x86/include/asm/mach-generic/mach_apicdef.h +++ /dev/null | |||
| @@ -1,11 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MACH_GENERIC_MACH_APICDEF_H | ||
| 2 | #define _ASM_X86_MACH_GENERIC_MACH_APICDEF_H | ||
| 3 | |||
| 4 | #ifndef APIC_DEFINITION | ||
| 5 | #include <asm/genapic.h> | ||
| 6 | |||
| 7 | #define GET_APIC_ID (genapic->get_apic_id) | ||
| 8 | #define APIC_ID_MASK (genapic->apic_id_mask) | ||
| 9 | #endif | ||
| 10 | |||
| 11 | #endif /* _ASM_X86_MACH_GENERIC_MACH_APICDEF_H */ | ||
diff --git a/arch/x86/include/asm/mach-generic/mach_ipi.h b/arch/x86/include/asm/mach-generic/mach_ipi.h deleted file mode 100644 index ffd637e3c3d9..000000000000 --- a/arch/x86/include/asm/mach-generic/mach_ipi.h +++ /dev/null | |||
| @@ -1,10 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MACH_GENERIC_MACH_IPI_H | ||
| 2 | #define _ASM_X86_MACH_GENERIC_MACH_IPI_H | ||
| 3 | |||
| 4 | #include <asm/genapic.h> | ||
| 5 | |||
| 6 | #define send_IPI_mask (genapic->send_IPI_mask) | ||
| 7 | #define send_IPI_allbutself (genapic->send_IPI_allbutself) | ||
| 8 | #define send_IPI_all (genapic->send_IPI_all) | ||
| 9 | |||
| 10 | #endif /* _ASM_X86_MACH_GENERIC_MACH_IPI_H */ | ||
diff --git a/arch/x86/include/asm/mach-generic/mach_mpparse.h b/arch/x86/include/asm/mach-generic/mach_mpparse.h deleted file mode 100644 index 9444ab8dca94..000000000000 --- a/arch/x86/include/asm/mach-generic/mach_mpparse.h +++ /dev/null | |||
| @@ -1,9 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MACH_GENERIC_MACH_MPPARSE_H | ||
| 2 | #define _ASM_X86_MACH_GENERIC_MACH_MPPARSE_H | ||
| 3 | |||
| 4 | |||
| 5 | extern int mps_oem_check(struct mpc_table *, char *, char *); | ||
| 6 | |||
| 7 | extern int acpi_madt_oem_check(char *, char *); | ||
| 8 | |||
| 9 | #endif /* _ASM_X86_MACH_GENERIC_MACH_MPPARSE_H */ | ||
diff --git a/arch/x86/include/asm/mach-generic/mach_mpspec.h b/arch/x86/include/asm/mach-generic/mach_mpspec.h deleted file mode 100644 index 3bc407226578..000000000000 --- a/arch/x86/include/asm/mach-generic/mach_mpspec.h +++ /dev/null | |||
| @@ -1,12 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MACH_GENERIC_MACH_MPSPEC_H | ||
| 2 | #define _ASM_X86_MACH_GENERIC_MACH_MPSPEC_H | ||
| 3 | |||
| 4 | #define MAX_IRQ_SOURCES 256 | ||
| 5 | |||
| 6 | /* Summit or generic (i.e. installer) kernels need lots of bus entries. */ | ||
| 7 | /* Maximum 256 PCI busses, plus 1 ISA bus in each of 4 cabinets. */ | ||
| 8 | #define MAX_MP_BUSSES 260 | ||
| 9 | |||
| 10 | extern void numaq_mps_oem_check(struct mpc_table *, char *, char *); | ||
| 11 | |||
| 12 | #endif /* _ASM_X86_MACH_GENERIC_MACH_MPSPEC_H */ | ||
diff --git a/arch/x86/include/asm/mach-generic/mach_wakecpu.h b/arch/x86/include/asm/mach-generic/mach_wakecpu.h deleted file mode 100644 index 1ab16b168c8a..000000000000 --- a/arch/x86/include/asm/mach-generic/mach_wakecpu.h +++ /dev/null | |||
| @@ -1,12 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MACH_GENERIC_MACH_WAKECPU_H | ||
| 2 | #define _ASM_X86_MACH_GENERIC_MACH_WAKECPU_H | ||
| 3 | |||
| 4 | #define TRAMPOLINE_PHYS_LOW (genapic->trampoline_phys_low) | ||
| 5 | #define TRAMPOLINE_PHYS_HIGH (genapic->trampoline_phys_high) | ||
| 6 | #define wait_for_init_deassert (genapic->wait_for_init_deassert) | ||
| 7 | #define smp_callin_clear_local_apic (genapic->smp_callin_clear_local_apic) | ||
| 8 | #define store_NMI_vector (genapic->store_NMI_vector) | ||
| 9 | #define restore_NMI_vector (genapic->restore_NMI_vector) | ||
| 10 | #define inquire_remote_apic (genapic->inquire_remote_apic) | ||
| 11 | |||
| 12 | #endif /* _ASM_X86_MACH_GENERIC_MACH_APIC_H */ | ||
diff --git a/arch/x86/include/asm/mach-rdc321x/gpio.h b/arch/x86/include/asm/mach-rdc321x/gpio.h deleted file mode 100644 index c210ab5788b0..000000000000 --- a/arch/x86/include/asm/mach-rdc321x/gpio.h +++ /dev/null | |||
| @@ -1,60 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MACH_RDC321X_GPIO_H | ||
| 2 | #define _ASM_X86_MACH_RDC321X_GPIO_H | ||
| 3 | |||
| 4 | #include <linux/kernel.h> | ||
| 5 | |||
| 6 | extern int rdc_gpio_get_value(unsigned gpio); | ||
| 7 | extern void rdc_gpio_set_value(unsigned gpio, int value); | ||
| 8 | extern int rdc_gpio_direction_input(unsigned gpio); | ||
| 9 | extern int rdc_gpio_direction_output(unsigned gpio, int value); | ||
| 10 | extern int rdc_gpio_request(unsigned gpio, const char *label); | ||
| 11 | extern void rdc_gpio_free(unsigned gpio); | ||
| 12 | extern void __init rdc321x_gpio_setup(void); | ||
| 13 | |||
| 14 | /* Wrappers for the arch-neutral GPIO API */ | ||
| 15 | |||
| 16 | static inline int gpio_request(unsigned gpio, const char *label) | ||
| 17 | { | ||
| 18 | return rdc_gpio_request(gpio, label); | ||
| 19 | } | ||
| 20 | |||
| 21 | static inline void gpio_free(unsigned gpio) | ||
| 22 | { | ||
| 23 | might_sleep(); | ||
| 24 | rdc_gpio_free(gpio); | ||
| 25 | } | ||
| 26 | |||
| 27 | static inline int gpio_direction_input(unsigned gpio) | ||
| 28 | { | ||
| 29 | return rdc_gpio_direction_input(gpio); | ||
| 30 | } | ||
| 31 | |||
| 32 | static inline int gpio_direction_output(unsigned gpio, int value) | ||
| 33 | { | ||
| 34 | return rdc_gpio_direction_output(gpio, value); | ||
| 35 | } | ||
| 36 | |||
| 37 | static inline int gpio_get_value(unsigned gpio) | ||
| 38 | { | ||
| 39 | return rdc_gpio_get_value(gpio); | ||
| 40 | } | ||
| 41 | |||
| 42 | static inline void gpio_set_value(unsigned gpio, int value) | ||
| 43 | { | ||
| 44 | rdc_gpio_set_value(gpio, value); | ||
| 45 | } | ||
| 46 | |||
| 47 | static inline int gpio_to_irq(unsigned gpio) | ||
| 48 | { | ||
| 49 | return gpio; | ||
| 50 | } | ||
| 51 | |||
| 52 | static inline int irq_to_gpio(unsigned irq) | ||
| 53 | { | ||
| 54 | return irq; | ||
| 55 | } | ||
| 56 | |||
| 57 | /* For cansleep */ | ||
| 58 | #include <asm-generic/gpio.h> | ||
| 59 | |||
| 60 | #endif /* _ASM_X86_MACH_RDC321X_GPIO_H */ | ||
diff --git a/arch/x86/include/asm/mach-default/mach_timer.h b/arch/x86/include/asm/mach_timer.h index 853728519ae9..853728519ae9 100644 --- a/arch/x86/include/asm/mach-default/mach_timer.h +++ b/arch/x86/include/asm/mach_timer.h | |||
diff --git a/arch/x86/include/asm/mach-default/mach_traps.h b/arch/x86/include/asm/mach_traps.h index f7920601e472..f7920601e472 100644 --- a/arch/x86/include/asm/mach-default/mach_traps.h +++ b/arch/x86/include/asm/mach_traps.h | |||
diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h index 8aeeb3fd73db..f923203dc39a 100644 --- a/arch/x86/include/asm/mmu_context.h +++ b/arch/x86/include/asm/mmu_context.h | |||
| @@ -21,11 +21,54 @@ static inline void paravirt_activate_mm(struct mm_struct *prev, | |||
| 21 | int init_new_context(struct task_struct *tsk, struct mm_struct *mm); | 21 | int init_new_context(struct task_struct *tsk, struct mm_struct *mm); |
| 22 | void destroy_context(struct mm_struct *mm); | 22 | void destroy_context(struct mm_struct *mm); |
| 23 | 23 | ||
| 24 | #ifdef CONFIG_X86_32 | 24 | |
| 25 | # include "mmu_context_32.h" | 25 | static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) |
| 26 | #else | 26 | { |
| 27 | # include "mmu_context_64.h" | 27 | #ifdef CONFIG_SMP |
| 28 | if (percpu_read(cpu_tlbstate.state) == TLBSTATE_OK) | ||
| 29 | percpu_write(cpu_tlbstate.state, TLBSTATE_LAZY); | ||
| 30 | #endif | ||
| 31 | } | ||
| 32 | |||
| 33 | static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, | ||
| 34 | struct task_struct *tsk) | ||
| 35 | { | ||
| 36 | unsigned cpu = smp_processor_id(); | ||
| 37 | |||
| 38 | if (likely(prev != next)) { | ||
| 39 | /* stop flush ipis for the previous mm */ | ||
| 40 | cpu_clear(cpu, prev->cpu_vm_mask); | ||
| 41 | #ifdef CONFIG_SMP | ||
| 42 | percpu_write(cpu_tlbstate.state, TLBSTATE_OK); | ||
| 43 | percpu_write(cpu_tlbstate.active_mm, next); | ||
| 28 | #endif | 44 | #endif |
| 45 | cpu_set(cpu, next->cpu_vm_mask); | ||
| 46 | |||
| 47 | /* Re-load page tables */ | ||
| 48 | load_cr3(next->pgd); | ||
| 49 | |||
| 50 | /* | ||
| 51 | * load the LDT, if the LDT is different: | ||
| 52 | */ | ||
| 53 | if (unlikely(prev->context.ldt != next->context.ldt)) | ||
| 54 | load_LDT_nolock(&next->context); | ||
| 55 | } | ||
| 56 | #ifdef CONFIG_SMP | ||
| 57 | else { | ||
| 58 | percpu_write(cpu_tlbstate.state, TLBSTATE_OK); | ||
| 59 | BUG_ON(percpu_read(cpu_tlbstate.active_mm) != next); | ||
| 60 | |||
| 61 | if (!cpu_test_and_set(cpu, next->cpu_vm_mask)) { | ||
| 62 | /* We were in lazy tlb mode and leave_mm disabled | ||
| 63 | * tlb flush IPI delivery. We must reload CR3 | ||
| 64 | * to make sure to use no freed page tables. | ||
| 65 | */ | ||
| 66 | load_cr3(next->pgd); | ||
| 67 | load_LDT_nolock(&next->context); | ||
| 68 | } | ||
| 69 | } | ||
| 70 | #endif | ||
| 71 | } | ||
| 29 | 72 | ||
| 30 | #define activate_mm(prev, next) \ | 73 | #define activate_mm(prev, next) \ |
| 31 | do { \ | 74 | do { \ |
| @@ -33,5 +76,17 @@ do { \ | |||
| 33 | switch_mm((prev), (next), NULL); \ | 76 | switch_mm((prev), (next), NULL); \ |
| 34 | } while (0); | 77 | } while (0); |
| 35 | 78 | ||
| 79 | #ifdef CONFIG_X86_32 | ||
| 80 | #define deactivate_mm(tsk, mm) \ | ||
| 81 | do { \ | ||
| 82 | lazy_load_gs(0); \ | ||
| 83 | } while (0) | ||
| 84 | #else | ||
| 85 | #define deactivate_mm(tsk, mm) \ | ||
| 86 | do { \ | ||
| 87 | load_gs_index(0); \ | ||
| 88 | loadsegment(fs, 0); \ | ||
| 89 | } while (0) | ||
| 90 | #endif | ||
| 36 | 91 | ||
| 37 | #endif /* _ASM_X86_MMU_CONTEXT_H */ | 92 | #endif /* _ASM_X86_MMU_CONTEXT_H */ |
diff --git a/arch/x86/include/asm/mmu_context_32.h b/arch/x86/include/asm/mmu_context_32.h deleted file mode 100644 index 7e98ce1d2c0e..000000000000 --- a/arch/x86/include/asm/mmu_context_32.h +++ /dev/null | |||
| @@ -1,55 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MMU_CONTEXT_32_H | ||
| 2 | #define _ASM_X86_MMU_CONTEXT_32_H | ||
| 3 | |||
| 4 | static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) | ||
| 5 | { | ||
| 6 | #ifdef CONFIG_SMP | ||
| 7 | if (x86_read_percpu(cpu_tlbstate.state) == TLBSTATE_OK) | ||
| 8 | x86_write_percpu(cpu_tlbstate.state, TLBSTATE_LAZY); | ||
| 9 | #endif | ||
| 10 | } | ||
| 11 | |||
| 12 | static inline void switch_mm(struct mm_struct *prev, | ||
| 13 | struct mm_struct *next, | ||
| 14 | struct task_struct *tsk) | ||
| 15 | { | ||
| 16 | int cpu = smp_processor_id(); | ||
| 17 | |||
| 18 | if (likely(prev != next)) { | ||
| 19 | /* stop flush ipis for the previous mm */ | ||
| 20 | cpu_clear(cpu, prev->cpu_vm_mask); | ||
| 21 | #ifdef CONFIG_SMP | ||
| 22 | x86_write_percpu(cpu_tlbstate.state, TLBSTATE_OK); | ||
| 23 | x86_write_percpu(cpu_tlbstate.active_mm, next); | ||
| 24 | #endif | ||
| 25 | cpu_set(cpu, next->cpu_vm_mask); | ||
| 26 | |||
| 27 | /* Re-load page tables */ | ||
| 28 | load_cr3(next->pgd); | ||
| 29 | |||
| 30 | /* | ||
| 31 | * load the LDT, if the LDT is different: | ||
| 32 | */ | ||
| 33 | if (unlikely(prev->context.ldt != next->context.ldt)) | ||
| 34 | load_LDT_nolock(&next->context); | ||
| 35 | } | ||
| 36 | #ifdef CONFIG_SMP | ||
| 37 | else { | ||
| 38 | x86_write_percpu(cpu_tlbstate.state, TLBSTATE_OK); | ||
| 39 | BUG_ON(x86_read_percpu(cpu_tlbstate.active_mm) != next); | ||
| 40 | |||
| 41 | if (!cpu_test_and_set(cpu, next->cpu_vm_mask)) { | ||
| 42 | /* We were in lazy tlb mode and leave_mm disabled | ||
| 43 | * tlb flush IPI delivery. We must reload %cr3. | ||
| 44 | */ | ||
| 45 | load_cr3(next->pgd); | ||
| 46 | load_LDT_nolock(&next->context); | ||
| 47 | } | ||
| 48 | } | ||
| 49 | #endif | ||
| 50 | } | ||
| 51 | |||
| 52 | #define deactivate_mm(tsk, mm) \ | ||
| 53 | asm("movl %0,%%gs": :"r" (0)); | ||
| 54 | |||
| 55 | #endif /* _ASM_X86_MMU_CONTEXT_32_H */ | ||
diff --git a/arch/x86/include/asm/mmu_context_64.h b/arch/x86/include/asm/mmu_context_64.h deleted file mode 100644 index 677d36e9540a..000000000000 --- a/arch/x86/include/asm/mmu_context_64.h +++ /dev/null | |||
| @@ -1,54 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_MMU_CONTEXT_64_H | ||
| 2 | #define _ASM_X86_MMU_CONTEXT_64_H | ||
| 3 | |||
| 4 | #include <asm/pda.h> | ||
| 5 | |||
| 6 | static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) | ||
| 7 | { | ||
| 8 | #ifdef CONFIG_SMP | ||
| 9 | if (read_pda(mmu_state) == TLBSTATE_OK) | ||
| 10 | write_pda(mmu_state, TLBSTATE_LAZY); | ||
| 11 | #endif | ||
| 12 | } | ||
| 13 | |||
| 14 | static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, | ||
| 15 | struct task_struct *tsk) | ||
| 16 | { | ||
| 17 | unsigned cpu = smp_processor_id(); | ||
| 18 | if (likely(prev != next)) { | ||
| 19 | /* stop flush ipis for the previous mm */ | ||
| 20 | cpu_clear(cpu, prev->cpu_vm_mask); | ||
| 21 | #ifdef CONFIG_SMP | ||
| 22 | write_pda(mmu_state, TLBSTATE_OK); | ||
| 23 | write_pda(active_mm, next); | ||
| 24 | #endif | ||
| 25 | cpu_set(cpu, next->cpu_vm_mask); | ||
| 26 | load_cr3(next->pgd); | ||
| 27 | |||
| 28 | if (unlikely(next->context.ldt != prev->context.ldt)) | ||
| 29 | load_LDT_nolock(&next->context); | ||
| 30 | } | ||
| 31 | #ifdef CONFIG_SMP | ||
| 32 | else { | ||
| 33 | write_pda(mmu_state, TLBSTATE_OK); | ||
| 34 | if (read_pda(active_mm) != next) | ||
| 35 | BUG(); | ||
| 36 | if (!cpu_test_and_set(cpu, next->cpu_vm_mask)) { | ||
| 37 | /* We were in lazy tlb mode and leave_mm disabled | ||
| 38 | * tlb flush IPI delivery. We must reload CR3 | ||
| 39 | * to make sure to use no freed page tables. | ||
| 40 | */ | ||
| 41 | load_cr3(next->pgd); | ||
| 42 | load_LDT_nolock(&next->context); | ||
| 43 | } | ||
| 44 | } | ||
| 45 | #endif | ||
| 46 | } | ||
| 47 | |||
| 48 | #define deactivate_mm(tsk, mm) \ | ||
| 49 | do { \ | ||
| 50 | load_gs_index(0); \ | ||
| 51 | asm volatile("movl %0,%%fs"::"r"(0)); \ | ||
| 52 | } while (0) | ||
| 53 | |||
| 54 | #endif /* _ASM_X86_MMU_CONTEXT_64_H */ | ||
diff --git a/arch/x86/include/asm/mpspec.h b/arch/x86/include/asm/mpspec.h index bd22f2a3713f..642fc7fc8cdc 100644 --- a/arch/x86/include/asm/mpspec.h +++ b/arch/x86/include/asm/mpspec.h | |||
| @@ -9,7 +9,18 @@ extern int apic_version[MAX_APICS]; | |||
| 9 | extern int pic_mode; | 9 | extern int pic_mode; |
| 10 | 10 | ||
| 11 | #ifdef CONFIG_X86_32 | 11 | #ifdef CONFIG_X86_32 |
| 12 | #include <mach_mpspec.h> | 12 | |
| 13 | /* | ||
| 14 | * Summit or generic (i.e. installer) kernels need lots of bus entries. | ||
| 15 | * Maximum 256 PCI busses, plus 1 ISA bus in each of 4 cabinets. | ||
| 16 | */ | ||
| 17 | #if CONFIG_BASE_SMALL == 0 | ||
| 18 | # define MAX_MP_BUSSES 260 | ||
| 19 | #else | ||
| 20 | # define MAX_MP_BUSSES 32 | ||
| 21 | #endif | ||
| 22 | |||
| 23 | #define MAX_IRQ_SOURCES 256 | ||
| 13 | 24 | ||
| 14 | extern unsigned int def_to_bigsmp; | 25 | extern unsigned int def_to_bigsmp; |
| 15 | extern u8 apicid_2_node[]; | 26 | extern u8 apicid_2_node[]; |
| @@ -20,15 +31,15 @@ extern int mp_bus_id_to_local[MAX_MP_BUSSES]; | |||
| 20 | extern int quad_local_to_mp_bus_id [NR_CPUS/4][4]; | 31 | extern int quad_local_to_mp_bus_id [NR_CPUS/4][4]; |
| 21 | #endif | 32 | #endif |
| 22 | 33 | ||
| 23 | #define MAX_APICID 256 | 34 | #define MAX_APICID 256 |
| 24 | 35 | ||
| 25 | #else | 36 | #else /* CONFIG_X86_64: */ |
| 26 | 37 | ||
| 27 | #define MAX_MP_BUSSES 256 | 38 | #define MAX_MP_BUSSES 256 |
| 28 | /* Each PCI slot may be a combo card with its own bus. 4 IRQ pins per slot. */ | 39 | /* Each PCI slot may be a combo card with its own bus. 4 IRQ pins per slot. */ |
| 29 | #define MAX_IRQ_SOURCES (MAX_MP_BUSSES * 4) | 40 | #define MAX_IRQ_SOURCES (MAX_MP_BUSSES * 4) |
| 30 | 41 | ||
| 31 | #endif | 42 | #endif /* CONFIG_X86_64 */ |
| 32 | 43 | ||
| 33 | extern void early_find_smp_config(void); | 44 | extern void early_find_smp_config(void); |
| 34 | extern void early_get_smp_config(void); | 45 | extern void early_get_smp_config(void); |
| @@ -45,11 +56,13 @@ extern int smp_found_config; | |||
| 45 | extern int mpc_default_type; | 56 | extern int mpc_default_type; |
| 46 | extern unsigned long mp_lapic_addr; | 57 | extern unsigned long mp_lapic_addr; |
| 47 | 58 | ||
| 48 | extern void find_smp_config(void); | ||
| 49 | extern void get_smp_config(void); | 59 | extern void get_smp_config(void); |
| 60 | |||
| 50 | #ifdef CONFIG_X86_MPPARSE | 61 | #ifdef CONFIG_X86_MPPARSE |
| 62 | extern void find_smp_config(void); | ||
| 51 | extern void early_reserve_e820_mpc_new(void); | 63 | extern void early_reserve_e820_mpc_new(void); |
| 52 | #else | 64 | #else |
| 65 | static inline void find_smp_config(void) { } | ||
| 53 | static inline void early_reserve_e820_mpc_new(void) { } | 66 | static inline void early_reserve_e820_mpc_new(void) { } |
| 54 | #endif | 67 | #endif |
| 55 | 68 | ||
| @@ -64,6 +77,8 @@ extern int acpi_probe_gsi(void); | |||
| 64 | #ifdef CONFIG_X86_IO_APIC | 77 | #ifdef CONFIG_X86_IO_APIC |
| 65 | extern int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin, | 78 | extern int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin, |
| 66 | u32 gsi, int triggering, int polarity); | 79 | u32 gsi, int triggering, int polarity); |
| 80 | extern int mp_find_ioapic(int gsi); | ||
| 81 | extern int mp_find_ioapic_pin(int ioapic, int gsi); | ||
| 67 | #else | 82 | #else |
| 68 | static inline int | 83 | static inline int |
| 69 | mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin, | 84 | mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin, |
| @@ -148,4 +163,8 @@ static inline void physid_set_mask_of_physid(int physid, physid_mask_t *map) | |||
| 148 | 163 | ||
| 149 | extern physid_mask_t phys_cpu_present_map; | 164 | extern physid_mask_t phys_cpu_present_map; |
| 150 | 165 | ||
| 166 | extern int generic_mps_oem_check(struct mpc_table *, char *, char *); | ||
| 167 | |||
| 168 | extern int default_acpi_madt_oem_check(char *, char *); | ||
| 169 | |||
| 151 | #endif /* _ASM_X86_MPSPEC_H */ | 170 | #endif /* _ASM_X86_MPSPEC_H */ |
diff --git a/arch/x86/include/asm/mpspec_def.h b/arch/x86/include/asm/mpspec_def.h index 59568bc4767f..4a7f96d7c188 100644 --- a/arch/x86/include/asm/mpspec_def.h +++ b/arch/x86/include/asm/mpspec_def.h | |||
| @@ -24,17 +24,18 @@ | |||
| 24 | # endif | 24 | # endif |
| 25 | #endif | 25 | #endif |
| 26 | 26 | ||
| 27 | struct intel_mp_floating { | 27 | /* Intel MP Floating Pointer Structure */ |
| 28 | char mpf_signature[4]; /* "_MP_" */ | 28 | struct mpf_intel { |
| 29 | unsigned int mpf_physptr; /* Configuration table address */ | 29 | char signature[4]; /* "_MP_" */ |
| 30 | unsigned char mpf_length; /* Our length (paragraphs) */ | 30 | unsigned int physptr; /* Configuration table address */ |
| 31 | unsigned char mpf_specification;/* Specification version */ | 31 | unsigned char length; /* Our length (paragraphs) */ |
| 32 | unsigned char mpf_checksum; /* Checksum (makes sum 0) */ | 32 | unsigned char specification; /* Specification version */ |
| 33 | unsigned char mpf_feature1; /* Standard or configuration ? */ | 33 | unsigned char checksum; /* Checksum (makes sum 0) */ |
| 34 | unsigned char mpf_feature2; /* Bit7 set for IMCR|PIC */ | 34 | unsigned char feature1; /* Standard or configuration ? */ |
| 35 | unsigned char mpf_feature3; /* Unused (0) */ | 35 | unsigned char feature2; /* Bit7 set for IMCR|PIC */ |
| 36 | unsigned char mpf_feature4; /* Unused (0) */ | 36 | unsigned char feature3; /* Unused (0) */ |
| 37 | unsigned char mpf_feature5; /* Unused (0) */ | 37 | unsigned char feature4; /* Unused (0) */ |
| 38 | unsigned char feature5; /* Unused (0) */ | ||
| 38 | }; | 39 | }; |
| 39 | 40 | ||
| 40 | #define MPC_SIGNATURE "PCMP" | 41 | #define MPC_SIGNATURE "PCMP" |
diff --git a/arch/x86/include/asm/numaq.h b/arch/x86/include/asm/numaq.h index 1e8bd30b4c16..9f0a5f5d29ec 100644 --- a/arch/x86/include/asm/numaq.h +++ b/arch/x86/include/asm/numaq.h | |||
| @@ -31,6 +31,8 @@ | |||
| 31 | extern int found_numaq; | 31 | extern int found_numaq; |
| 32 | extern int get_memcfg_numaq(void); | 32 | extern int get_memcfg_numaq(void); |
| 33 | 33 | ||
| 34 | extern void *xquad_portio; | ||
| 35 | |||
| 34 | /* | 36 | /* |
| 35 | * SYS_CFG_DATA_PRIV_ADDR, struct eachquadmem, and struct sys_cfg_data are the | 37 | * SYS_CFG_DATA_PRIV_ADDR, struct eachquadmem, and struct sys_cfg_data are the |
| 36 | */ | 38 | */ |
diff --git a/arch/x86/include/asm/numaq/apic.h b/arch/x86/include/asm/numaq/apic.h deleted file mode 100644 index bf37bc49bd8e..000000000000 --- a/arch/x86/include/asm/numaq/apic.h +++ /dev/null | |||
| @@ -1,142 +0,0 @@ | |||
| 1 | #ifndef __ASM_NUMAQ_APIC_H | ||
| 2 | #define __ASM_NUMAQ_APIC_H | ||
| 3 | |||
| 4 | #include <asm/io.h> | ||
| 5 | #include <linux/mmzone.h> | ||
| 6 | #include <linux/nodemask.h> | ||
| 7 | |||
| 8 | #define APIC_DFR_VALUE (APIC_DFR_CLUSTER) | ||
| 9 | |||
| 10 | static inline const cpumask_t *target_cpus(void) | ||
| 11 | { | ||
| 12 | return &CPU_MASK_ALL; | ||
| 13 | } | ||
| 14 | |||
| 15 | #define NO_BALANCE_IRQ (1) | ||
| 16 | #define esr_disable (1) | ||
| 17 | |||
| 18 | #define INT_DELIVERY_MODE dest_LowestPrio | ||
| 19 | #define INT_DEST_MODE 0 /* physical delivery on LOCAL quad */ | ||
| 20 | |||
| 21 | static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid) | ||
| 22 | { | ||
| 23 | return physid_isset(apicid, bitmap); | ||
| 24 | } | ||
| 25 | static inline unsigned long check_apicid_present(int bit) | ||
| 26 | { | ||
| 27 | return physid_isset(bit, phys_cpu_present_map); | ||
| 28 | } | ||
| 29 | #define apicid_cluster(apicid) (apicid & 0xF0) | ||
| 30 | |||
| 31 | static inline int apic_id_registered(void) | ||
| 32 | { | ||
| 33 | return 1; | ||
| 34 | } | ||
| 35 | |||
| 36 | static inline void init_apic_ldr(void) | ||
| 37 | { | ||
| 38 | /* Already done in NUMA-Q firmware */ | ||
| 39 | } | ||
| 40 | |||
| 41 | static inline void setup_apic_routing(void) | ||
| 42 | { | ||
| 43 | printk("Enabling APIC mode: %s. Using %d I/O APICs\n", | ||
| 44 | "NUMA-Q", nr_ioapics); | ||
| 45 | } | ||
| 46 | |||
| 47 | /* | ||
| 48 | * Skip adding the timer int on secondary nodes, which causes | ||
| 49 | * a small but painful rift in the time-space continuum. | ||
| 50 | */ | ||
| 51 | static inline int multi_timer_check(int apic, int irq) | ||
| 52 | { | ||
| 53 | return apic != 0 && irq == 0; | ||
| 54 | } | ||
| 55 | |||
| 56 | static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map) | ||
| 57 | { | ||
| 58 | /* We don't have a good way to do this yet - hack */ | ||
| 59 | return physids_promote(0xFUL); | ||
| 60 | } | ||
| 61 | |||
| 62 | /* Mapping from cpu number to logical apicid */ | ||
| 63 | extern u8 cpu_2_logical_apicid[]; | ||
| 64 | static inline int cpu_to_logical_apicid(int cpu) | ||
| 65 | { | ||
| 66 | if (cpu >= nr_cpu_ids) | ||
| 67 | return BAD_APICID; | ||
| 68 | return (int)cpu_2_logical_apicid[cpu]; | ||
| 69 | } | ||
| 70 | |||
| 71 | /* | ||
| 72 | * Supporting over 60 cpus on NUMA-Q requires a locality-dependent | ||
| 73 | * cpu to APIC ID relation to properly interact with the intelligent | ||
| 74 | * mode of the cluster controller. | ||
| 75 | */ | ||
| 76 | static inline int cpu_present_to_apicid(int mps_cpu) | ||
| 77 | { | ||
| 78 | if (mps_cpu < 60) | ||
| 79 | return ((mps_cpu >> 2) << 4) | (1 << (mps_cpu & 0x3)); | ||
| 80 | else | ||
| 81 | return BAD_APICID; | ||
| 82 | } | ||
| 83 | |||
| 84 | static inline int apicid_to_node(int logical_apicid) | ||
| 85 | { | ||
| 86 | return logical_apicid >> 4; | ||
| 87 | } | ||
| 88 | |||
| 89 | static inline physid_mask_t apicid_to_cpu_present(int logical_apicid) | ||
| 90 | { | ||
| 91 | int node = apicid_to_node(logical_apicid); | ||
| 92 | int cpu = __ffs(logical_apicid & 0xf); | ||
| 93 | |||
| 94 | return physid_mask_of_physid(cpu + 4*node); | ||
| 95 | } | ||
| 96 | |||
| 97 | extern void *xquad_portio; | ||
| 98 | |||
| 99 | static inline void setup_portio_remap(void) | ||
| 100 | { | ||
| 101 | int num_quads = num_online_nodes(); | ||
| 102 | |||
| 103 | if (num_quads <= 1) | ||
| 104 | return; | ||
| 105 | |||
| 106 | printk("Remapping cross-quad port I/O for %d quads\n", num_quads); | ||
| 107 | xquad_portio = ioremap(XQUAD_PORTIO_BASE, num_quads*XQUAD_PORTIO_QUAD); | ||
| 108 | printk("xquad_portio vaddr 0x%08lx, len %08lx\n", | ||
| 109 | (u_long) xquad_portio, (u_long) num_quads*XQUAD_PORTIO_QUAD); | ||
| 110 | } | ||
| 111 | |||
| 112 | static inline int check_phys_apicid_present(int boot_cpu_physical_apicid) | ||
| 113 | { | ||
| 114 | return (1); | ||
| 115 | } | ||
| 116 | |||
| 117 | static inline void enable_apic_mode(void) | ||
| 118 | { | ||
| 119 | } | ||
| 120 | |||
| 121 | /* | ||
| 122 | * We use physical apicids here, not logical, so just return the default | ||
| 123 | * physical broadcast to stop people from breaking us | ||
| 124 | */ | ||
| 125 | static inline unsigned int cpu_mask_to_apicid(const cpumask_t *cpumask) | ||
| 126 | { | ||
| 127 | return (int) 0xF; | ||
| 128 | } | ||
| 129 | |||
| 130 | static inline unsigned int cpu_mask_to_apicid_and(const struct cpumask *cpumask, | ||
| 131 | const struct cpumask *andmask) | ||
| 132 | { | ||
| 133 | return (int) 0xF; | ||
| 134 | } | ||
| 135 | |||
| 136 | /* No NUMA-Q box has a HT CPU, but it can't hurt to use the default code. */ | ||
| 137 | static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb) | ||
| 138 | { | ||
| 139 | return cpuid_apic >> index_msb; | ||
| 140 | } | ||
| 141 | |||
| 142 | #endif /* __ASM_NUMAQ_APIC_H */ | ||
diff --git a/arch/x86/include/asm/numaq/apicdef.h b/arch/x86/include/asm/numaq/apicdef.h deleted file mode 100644 index e012a46cc22a..000000000000 --- a/arch/x86/include/asm/numaq/apicdef.h +++ /dev/null | |||
| @@ -1,14 +0,0 @@ | |||
| 1 | #ifndef __ASM_NUMAQ_APICDEF_H | ||
| 2 | #define __ASM_NUMAQ_APICDEF_H | ||
| 3 | |||
| 4 | |||
| 5 | #define APIC_ID_MASK (0xF<<24) | ||
| 6 | |||
| 7 | static inline unsigned get_apic_id(unsigned long x) | ||
| 8 | { | ||
| 9 | return (((x)>>24)&0x0F); | ||
| 10 | } | ||
| 11 | |||
| 12 | #define GET_APIC_ID(x) get_apic_id(x) | ||
| 13 | |||
| 14 | #endif | ||
diff --git a/arch/x86/include/asm/numaq/ipi.h b/arch/x86/include/asm/numaq/ipi.h deleted file mode 100644 index a8374c652778..000000000000 --- a/arch/x86/include/asm/numaq/ipi.h +++ /dev/null | |||
| @@ -1,22 +0,0 @@ | |||
| 1 | #ifndef __ASM_NUMAQ_IPI_H | ||
| 2 | #define __ASM_NUMAQ_IPI_H | ||
| 3 | |||
| 4 | void send_IPI_mask_sequence(const struct cpumask *mask, int vector); | ||
| 5 | void send_IPI_mask_allbutself(const struct cpumask *mask, int vector); | ||
| 6 | |||
| 7 | static inline void send_IPI_mask(const struct cpumask *mask, int vector) | ||
| 8 | { | ||
| 9 | send_IPI_mask_sequence(mask, vector); | ||
| 10 | } | ||
| 11 | |||
| 12 | static inline void send_IPI_allbutself(int vector) | ||
| 13 | { | ||
| 14 | send_IPI_mask_allbutself(cpu_online_mask, vector); | ||
| 15 | } | ||
| 16 | |||
| 17 | static inline void send_IPI_all(int vector) | ||
| 18 | { | ||
| 19 | send_IPI_mask(cpu_online_mask, vector); | ||
| 20 | } | ||
| 21 | |||
| 22 | #endif /* __ASM_NUMAQ_IPI_H */ | ||
diff --git a/arch/x86/include/asm/numaq/mpparse.h b/arch/x86/include/asm/numaq/mpparse.h deleted file mode 100644 index a2eeefcd1cc7..000000000000 --- a/arch/x86/include/asm/numaq/mpparse.h +++ /dev/null | |||
| @@ -1,6 +0,0 @@ | |||
| 1 | #ifndef __ASM_NUMAQ_MPPARSE_H | ||
| 2 | #define __ASM_NUMAQ_MPPARSE_H | ||
| 3 | |||
| 4 | extern void numaq_mps_oem_check(struct mpc_table *, char *, char *); | ||
| 5 | |||
| 6 | #endif /* __ASM_NUMAQ_MPPARSE_H */ | ||
diff --git a/arch/x86/include/asm/numaq/wakecpu.h b/arch/x86/include/asm/numaq/wakecpu.h deleted file mode 100644 index 6f499df8eddb..000000000000 --- a/arch/x86/include/asm/numaq/wakecpu.h +++ /dev/null | |||
| @@ -1,45 +0,0 @@ | |||
| 1 | #ifndef __ASM_NUMAQ_WAKECPU_H | ||
| 2 | #define __ASM_NUMAQ_WAKECPU_H | ||
| 3 | |||
| 4 | /* This file copes with machines that wakeup secondary CPUs by NMIs */ | ||
| 5 | |||
| 6 | #define TRAMPOLINE_PHYS_LOW (0x8) | ||
| 7 | #define TRAMPOLINE_PHYS_HIGH (0xa) | ||
| 8 | |||
| 9 | /* We don't do anything here because we use NMI's to boot instead */ | ||
| 10 | static inline void wait_for_init_deassert(atomic_t *deassert) | ||
| 11 | { | ||
| 12 | } | ||
| 13 | |||
| 14 | /* | ||
| 15 | * Because we use NMIs rather than the INIT-STARTUP sequence to | ||
| 16 | * bootstrap the CPUs, the APIC may be in a weird state. Kick it. | ||
| 17 | */ | ||
| 18 | static inline void smp_callin_clear_local_apic(void) | ||
| 19 | { | ||
| 20 | clear_local_APIC(); | ||
| 21 | } | ||
| 22 | |||
| 23 | static inline void store_NMI_vector(unsigned short *high, unsigned short *low) | ||
| 24 | { | ||
| 25 | printk("Storing NMI vector\n"); | ||
| 26 | *high = | ||
| 27 | *((volatile unsigned short *)phys_to_virt(TRAMPOLINE_PHYS_HIGH)); | ||
| 28 | *low = | ||
| 29 | *((volatile unsigned short *)phys_to_virt(TRAMPOLINE_PHYS_LOW)); | ||
| 30 | } | ||
| 31 | |||
| 32 | static inline void restore_NMI_vector(unsigned short *high, unsigned short *low) | ||
| 33 | { | ||
| 34 | printk("Restoring NMI vector\n"); | ||
| 35 | *((volatile unsigned short *)phys_to_virt(TRAMPOLINE_PHYS_HIGH)) = | ||
| 36 | *high; | ||
| 37 | *((volatile unsigned short *)phys_to_virt(TRAMPOLINE_PHYS_LOW)) = | ||
| 38 | *low; | ||
| 39 | } | ||
| 40 | |||
| 41 | static inline void inquire_remote_apic(int apicid) | ||
| 42 | { | ||
| 43 | } | ||
| 44 | |||
| 45 | #endif /* __ASM_NUMAQ_WAKECPU_H */ | ||
diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h index 776579119a00..89ed9d70b0aa 100644 --- a/arch/x86/include/asm/page.h +++ b/arch/x86/include/asm/page.h | |||
| @@ -1,42 +1,11 @@ | |||
| 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/types.h> |
| 5 | |||
| 6 | /* PAGE_SHIFT determines the page size */ | ||
| 7 | #define PAGE_SHIFT 12 | ||
| 8 | #define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) | ||
| 9 | #define PAGE_MASK (~(PAGE_SIZE-1)) | ||
| 10 | 5 | ||
| 11 | #ifdef __KERNEL__ | 6 | #ifdef __KERNEL__ |
| 12 | 7 | ||
| 13 | #define __PHYSICAL_MASK ((phys_addr_t)(1ULL << __PHYSICAL_MASK_SHIFT) - 1) | 8 | #include <asm/page_types.h> |
| 14 | #define __VIRTUAL_MASK ((1UL << __VIRTUAL_MASK_SHIFT) - 1) | ||
| 15 | |||
| 16 | /* Cast PAGE_MASK to a signed type so that it is sign-extended if | ||
| 17 | virtual addresses are 32-bits but physical addresses are larger | ||
| 18 | (ie, 32-bit PAE). */ | ||
| 19 | #define PHYSICAL_PAGE_MASK (((signed long)PAGE_MASK) & __PHYSICAL_MASK) | ||
| 20 | |||
| 21 | /* PTE_PFN_MASK extracts the PFN from a (pte|pmd|pud|pgd)val_t */ | ||
| 22 | #define PTE_PFN_MASK ((pteval_t)PHYSICAL_PAGE_MASK) | ||
| 23 | |||
| 24 | /* PTE_FLAGS_MASK extracts the flags from a (pte|pmd|pud|pgd)val_t */ | ||
| 25 | #define PTE_FLAGS_MASK (~PTE_PFN_MASK) | ||
| 26 | |||
| 27 | #define PMD_PAGE_SIZE (_AC(1, UL) << PMD_SHIFT) | ||
| 28 | #define PMD_PAGE_MASK (~(PMD_PAGE_SIZE-1)) | ||
| 29 | |||
| 30 | #define HPAGE_SHIFT PMD_SHIFT | ||
| 31 | #define HPAGE_SIZE (_AC(1,UL) << HPAGE_SHIFT) | ||
| 32 | #define HPAGE_MASK (~(HPAGE_SIZE - 1)) | ||
| 33 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) | ||
| 34 | |||
| 35 | #define HUGE_MAX_HSTATE 2 | ||
| 36 | |||
| 37 | #ifndef __ASSEMBLY__ | ||
| 38 | #include <linux/types.h> | ||
| 39 | #endif | ||
| 40 | 9 | ||
| 41 | #ifdef CONFIG_X86_64 | 10 | #ifdef CONFIG_X86_64 |
| 42 | #include <asm/page_64.h> | 11 | #include <asm/page_64.h> |
| @@ -44,38 +13,18 @@ | |||
| 44 | #include <asm/page_32.h> | 13 | #include <asm/page_32.h> |
| 45 | #endif /* CONFIG_X86_64 */ | 14 | #endif /* CONFIG_X86_64 */ |
| 46 | 15 | ||
| 47 | #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) | ||
| 48 | |||
| 49 | #define VM_DATA_DEFAULT_FLAGS \ | ||
| 50 | (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \ | ||
| 51 | VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) | ||
| 52 | |||
| 53 | |||
| 54 | #ifndef __ASSEMBLY__ | 16 | #ifndef __ASSEMBLY__ |
| 55 | 17 | ||
| 56 | typedef struct { pgdval_t pgd; } pgd_t; | ||
| 57 | typedef struct { pgprotval_t pgprot; } pgprot_t; | ||
| 58 | |||
| 59 | extern int page_is_ram(unsigned long pagenr); | ||
| 60 | extern int devmem_is_allowed(unsigned long pagenr); | ||
| 61 | extern void map_devmem(unsigned long pfn, unsigned long size, | ||
| 62 | pgprot_t vma_prot); | ||
| 63 | extern void unmap_devmem(unsigned long pfn, unsigned long size, | ||
| 64 | pgprot_t vma_prot); | ||
| 65 | |||
| 66 | extern unsigned long max_low_pfn_mapped; | ||
| 67 | extern unsigned long max_pfn_mapped; | ||
| 68 | |||
| 69 | struct page; | 18 | struct page; |
| 70 | 19 | ||
| 71 | static inline void clear_user_page(void *page, unsigned long vaddr, | 20 | static inline void clear_user_page(void *page, unsigned long vaddr, |
| 72 | struct page *pg) | 21 | struct page *pg) |
| 73 | { | 22 | { |
| 74 | clear_page(page); | 23 | clear_page(page); |
| 75 | } | 24 | } |
| 76 | 25 | ||
| 77 | static inline void copy_user_page(void *to, void *from, unsigned long vaddr, | 26 | static inline void copy_user_page(void *to, void *from, unsigned long vaddr, |
| 78 | struct page *topage) | 27 | struct page *topage) |
| 79 | { | 28 | { |
| 80 | copy_page(to, from); | 29 | copy_page(to, from); |
| 81 | } | 30 | } |
| @@ -84,99 +33,6 @@ static inline void copy_user_page(void *to, void *from, unsigned long vaddr, | |||
| 84 | alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr) | 33 | alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr) |
| 85 | #define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE | 34 | #define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE |
| 86 | 35 | ||
| 87 | static inline pgd_t native_make_pgd(pgdval_t val) | ||
| 88 | { | ||
| 89 | return (pgd_t) { val }; | ||
| 90 | } | ||
| 91 | |||
| 92 | static inline pgdval_t native_pgd_val(pgd_t pgd) | ||
| 93 | { | ||
| 94 | return pgd.pgd; | ||
| 95 | } | ||
| 96 | |||
| 97 | #if PAGETABLE_LEVELS >= 3 | ||
| 98 | #if PAGETABLE_LEVELS == 4 | ||
| 99 | typedef struct { pudval_t pud; } pud_t; | ||
| 100 | |||
| 101 | static inline pud_t native_make_pud(pmdval_t val) | ||
| 102 | { | ||
| 103 | return (pud_t) { val }; | ||
| 104 | } | ||
| 105 | |||
| 106 | static inline pudval_t native_pud_val(pud_t pud) | ||
| 107 | { | ||
| 108 | return pud.pud; | ||
| 109 | } | ||
| 110 | #else /* PAGETABLE_LEVELS == 3 */ | ||
| 111 | #include <asm-generic/pgtable-nopud.h> | ||
| 112 | |||
| 113 | static inline pudval_t native_pud_val(pud_t pud) | ||
| 114 | { | ||
| 115 | return native_pgd_val(pud.pgd); | ||
| 116 | } | ||
| 117 | #endif /* PAGETABLE_LEVELS == 4 */ | ||
| 118 | |||
| 119 | typedef struct { pmdval_t pmd; } pmd_t; | ||
| 120 | |||
| 121 | static inline pmd_t native_make_pmd(pmdval_t val) | ||
| 122 | { | ||
| 123 | return (pmd_t) { val }; | ||
| 124 | } | ||
| 125 | |||
| 126 | static inline pmdval_t native_pmd_val(pmd_t pmd) | ||
| 127 | { | ||
| 128 | return pmd.pmd; | ||
| 129 | } | ||
| 130 | #else /* PAGETABLE_LEVELS == 2 */ | ||
| 131 | #include <asm-generic/pgtable-nopmd.h> | ||
| 132 | |||
| 133 | static inline pmdval_t native_pmd_val(pmd_t pmd) | ||
| 134 | { | ||
| 135 | return native_pgd_val(pmd.pud.pgd); | ||
| 136 | } | ||
| 137 | #endif /* PAGETABLE_LEVELS >= 3 */ | ||
| 138 | |||
| 139 | static inline pte_t native_make_pte(pteval_t val) | ||
| 140 | { | ||
| 141 | return (pte_t) { .pte = val }; | ||
| 142 | } | ||
| 143 | |||
| 144 | static inline pteval_t native_pte_val(pte_t pte) | ||
| 145 | { | ||
| 146 | return pte.pte; | ||
| 147 | } | ||
| 148 | |||
| 149 | static inline pteval_t native_pte_flags(pte_t pte) | ||
| 150 | { | ||
| 151 | return native_pte_val(pte) & PTE_FLAGS_MASK; | ||
| 152 | } | ||
| 153 | |||
| 154 | #define pgprot_val(x) ((x).pgprot) | ||
| 155 | #define __pgprot(x) ((pgprot_t) { (x) } ) | ||
| 156 | |||
| 157 | #ifdef CONFIG_PARAVIRT | ||
| 158 | #include <asm/paravirt.h> | ||
| 159 | #else /* !CONFIG_PARAVIRT */ | ||
| 160 | |||
| 161 | #define pgd_val(x) native_pgd_val(x) | ||
| 162 | #define __pgd(x) native_make_pgd(x) | ||
| 163 | |||
| 164 | #ifndef __PAGETABLE_PUD_FOLDED | ||
| 165 | #define pud_val(x) native_pud_val(x) | ||
| 166 | #define __pud(x) native_make_pud(x) | ||
| 167 | #endif | ||
| 168 | |||
| 169 | #ifndef __PAGETABLE_PMD_FOLDED | ||
| 170 | #define pmd_val(x) native_pmd_val(x) | ||
| 171 | #define __pmd(x) native_make_pmd(x) | ||
| 172 | #endif | ||
| 173 | |||
| 174 | #define pte_val(x) native_pte_val(x) | ||
| 175 | #define pte_flags(x) native_pte_flags(x) | ||
| 176 | #define __pte(x) native_make_pte(x) | ||
| 177 | |||
| 178 | #endif /* CONFIG_PARAVIRT */ | ||
| 179 | |||
| 180 | #define __pa(x) __phys_addr((unsigned long)(x)) | 36 | #define __pa(x) __phys_addr((unsigned long)(x)) |
| 181 | #define __pa_nodebug(x) __phys_addr_nodebug((unsigned long)(x)) | 37 | #define __pa_nodebug(x) __phys_addr_nodebug((unsigned long)(x)) |
| 182 | /* __pa_symbol should be used for C visible symbols. | 38 | /* __pa_symbol should be used for C visible symbols. |
diff --git a/arch/x86/include/asm/page_32.h b/arch/x86/include/asm/page_32.h index bcde0d7b4325..da4e762406f7 100644 --- a/arch/x86/include/asm/page_32.h +++ b/arch/x86/include/asm/page_32.h | |||
| @@ -1,82 +1,14 @@ | |||
| 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 | #include <asm/page_32_types.h> |
| 5 | * This handles the memory map. | ||
| 6 | * | ||
| 7 | * A __PAGE_OFFSET of 0xC0000000 means that the kernel has | ||
| 8 | * a virtual address space of one gigabyte, which limits the | ||
| 9 | * amount of physical memory you can use to about 950MB. | ||
| 10 | * | ||
| 11 | * If you want more physical memory than this then see the CONFIG_HIGHMEM4G | ||
| 12 | * and CONFIG_HIGHMEM64G options in the kernel configuration. | ||
| 13 | */ | ||
| 14 | #define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) | ||
| 15 | |||
| 16 | #ifdef CONFIG_4KSTACKS | ||
| 17 | #define THREAD_ORDER 0 | ||
| 18 | #else | ||
| 19 | #define THREAD_ORDER 1 | ||
| 20 | #endif | ||
| 21 | #define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER) | ||
| 22 | |||
| 23 | #define STACKFAULT_STACK 0 | ||
| 24 | #define DOUBLEFAULT_STACK 1 | ||
| 25 | #define NMI_STACK 0 | ||
| 26 | #define DEBUG_STACK 0 | ||
| 27 | #define MCE_STACK 0 | ||
| 28 | #define N_EXCEPTION_STACKS 1 | ||
| 29 | |||
| 30 | #ifdef CONFIG_X86_PAE | ||
| 31 | /* 44=32+12, the limit we can fit into an unsigned long pfn */ | ||
| 32 | #define __PHYSICAL_MASK_SHIFT 44 | ||
| 33 | #define __VIRTUAL_MASK_SHIFT 32 | ||
| 34 | #define PAGETABLE_LEVELS 3 | ||
| 35 | |||
| 36 | #ifndef __ASSEMBLY__ | ||
| 37 | typedef u64 pteval_t; | ||
| 38 | typedef u64 pmdval_t; | ||
| 39 | typedef u64 pudval_t; | ||
| 40 | typedef u64 pgdval_t; | ||
| 41 | typedef u64 pgprotval_t; | ||
| 42 | |||
| 43 | typedef union { | ||
| 44 | struct { | ||
| 45 | unsigned long pte_low, pte_high; | ||
| 46 | }; | ||
| 47 | pteval_t pte; | ||
| 48 | } pte_t; | ||
| 49 | #endif /* __ASSEMBLY__ | ||
| 50 | */ | ||
| 51 | #else /* !CONFIG_X86_PAE */ | ||
| 52 | #define __PHYSICAL_MASK_SHIFT 32 | ||
| 53 | #define __VIRTUAL_MASK_SHIFT 32 | ||
| 54 | #define PAGETABLE_LEVELS 2 | ||
| 55 | |||
| 56 | #ifndef __ASSEMBLY__ | ||
| 57 | typedef unsigned long pteval_t; | ||
| 58 | typedef unsigned long pmdval_t; | ||
| 59 | typedef unsigned long pudval_t; | ||
| 60 | typedef unsigned long pgdval_t; | ||
| 61 | typedef unsigned long pgprotval_t; | ||
| 62 | |||
| 63 | typedef union { | ||
| 64 | pteval_t pte; | ||
| 65 | pteval_t pte_low; | ||
| 66 | } pte_t; | ||
| 67 | |||
| 68 | #endif /* __ASSEMBLY__ */ | ||
| 69 | #endif /* CONFIG_X86_PAE */ | ||
| 70 | 5 | ||
| 71 | #ifndef __ASSEMBLY__ | 6 | #ifndef __ASSEMBLY__ |
| 72 | typedef struct page *pgtable_t; | ||
| 73 | #endif | ||
| 74 | 7 | ||
| 75 | #ifdef CONFIG_HUGETLB_PAGE | 8 | #ifdef CONFIG_HUGETLB_PAGE |
| 76 | #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA | 9 | #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA |
| 77 | #endif | 10 | #endif |
| 78 | 11 | ||
| 79 | #ifndef __ASSEMBLY__ | ||
| 80 | #define __phys_addr_nodebug(x) ((x) - PAGE_OFFSET) | 12 | #define __phys_addr_nodebug(x) ((x) - PAGE_OFFSET) |
| 81 | #ifdef CONFIG_DEBUG_VIRTUAL | 13 | #ifdef CONFIG_DEBUG_VIRTUAL |
| 82 | extern unsigned long __phys_addr(unsigned long); | 14 | extern unsigned long __phys_addr(unsigned long); |
| @@ -89,23 +21,6 @@ extern unsigned long __phys_addr(unsigned long); | |||
| 89 | #define pfn_valid(pfn) ((pfn) < max_mapnr) | 21 | #define pfn_valid(pfn) ((pfn) < max_mapnr) |
| 90 | #endif /* CONFIG_FLATMEM */ | 22 | #endif /* CONFIG_FLATMEM */ |
| 91 | 23 | ||
| 92 | extern int nx_enabled; | ||
| 93 | |||
| 94 | /* | ||
| 95 | * This much address space is reserved for vmalloc() and iomap() | ||
| 96 | * as well as fixmap mappings. | ||
| 97 | */ | ||
| 98 | extern unsigned int __VMALLOC_RESERVE; | ||
| 99 | extern int sysctl_legacy_va_layout; | ||
| 100 | |||
| 101 | extern void find_low_pfn_range(void); | ||
| 102 | extern unsigned long init_memory_mapping(unsigned long start, | ||
| 103 | unsigned long end); | ||
| 104 | extern void initmem_init(unsigned long, unsigned long); | ||
| 105 | extern void free_initmem(void); | ||
| 106 | extern void setup_bootmem_allocator(void); | ||
| 107 | |||
| 108 | |||
| 109 | #ifdef CONFIG_X86_USE_3DNOW | 24 | #ifdef CONFIG_X86_USE_3DNOW |
| 110 | #include <asm/mmx.h> | 25 | #include <asm/mmx.h> |
| 111 | 26 | ||
diff --git a/arch/x86/include/asm/page_32_types.h b/arch/x86/include/asm/page_32_types.h new file mode 100644 index 000000000000..f1e4a79a6e41 --- /dev/null +++ b/arch/x86/include/asm/page_32_types.h | |||
| @@ -0,0 +1,60 @@ | |||
| 1 | #ifndef _ASM_X86_PAGE_32_DEFS_H | ||
| 2 | #define _ASM_X86_PAGE_32_DEFS_H | ||
| 3 | |||
| 4 | #include <linux/const.h> | ||
| 5 | |||
| 6 | /* | ||
| 7 | * This handles the memory map. | ||
| 8 | * | ||
| 9 | * A __PAGE_OFFSET of 0xC0000000 means that the kernel has | ||
| 10 | * a virtual address space of one gigabyte, which limits the | ||
| 11 | * amount of physical memory you can use to about 950MB. | ||
| 12 | * | ||
| 13 | * If you want more physical memory than this then see the CONFIG_HIGHMEM4G | ||
| 14 | * and CONFIG_HIGHMEM64G options in the kernel configuration. | ||
| 15 | */ | ||
| 16 | #define __PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL) | ||
| 17 | |||
| 18 | #ifdef CONFIG_4KSTACKS | ||
| 19 | #define THREAD_ORDER 0 | ||
| 20 | #else | ||
| 21 | #define THREAD_ORDER 1 | ||
| 22 | #endif | ||
| 23 | #define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER) | ||
| 24 | |||
| 25 | #define STACKFAULT_STACK 0 | ||
| 26 | #define DOUBLEFAULT_STACK 1 | ||
| 27 | #define NMI_STACK 0 | ||
| 28 | #define DEBUG_STACK 0 | ||
| 29 | #define MCE_STACK 0 | ||
| 30 | #define N_EXCEPTION_STACKS 1 | ||
| 31 | |||
| 32 | #ifdef CONFIG_X86_PAE | ||
| 33 | /* 44=32+12, the limit we can fit into an unsigned long pfn */ | ||
| 34 | #define __PHYSICAL_MASK_SHIFT 44 | ||
| 35 | #define __VIRTUAL_MASK_SHIFT 32 | ||
| 36 | |||
| 37 | #else /* !CONFIG_X86_PAE */ | ||
| 38 | #define __PHYSICAL_MASK_SHIFT 32 | ||
| 39 | #define __VIRTUAL_MASK_SHIFT 32 | ||
| 40 | #endif /* CONFIG_X86_PAE */ | ||
| 41 | |||
| 42 | #ifndef __ASSEMBLY__ | ||
| 43 | |||
| 44 | /* | ||
| 45 | * This much address space is reserved for vmalloc() and iomap() | ||
| 46 | * as well as fixmap mappings. | ||
| 47 | */ | ||
| 48 | extern unsigned int __VMALLOC_RESERVE; | ||
| 49 | extern int sysctl_legacy_va_layout; | ||
| 50 | |||
| 51 | extern void find_low_pfn_range(void); | ||
| 52 | extern unsigned long init_memory_mapping(unsigned long start, | ||
| 53 | unsigned long end); | ||
| 54 | extern void initmem_init(unsigned long, unsigned long); | ||
| 55 | extern void free_initmem(void); | ||
| 56 | extern void setup_bootmem_allocator(void); | ||
| 57 | |||
| 58 | #endif /* !__ASSEMBLY__ */ | ||
| 59 | |||
| 60 | #endif /* _ASM_X86_PAGE_32_DEFS_H */ | ||
diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h index 5ebca29f44f0..072694ed81a5 100644 --- a/arch/x86/include/asm/page_64.h +++ b/arch/x86/include/asm/page_64.h | |||
| @@ -1,105 +1,6 @@ | |||
| 1 | #ifndef _ASM_X86_PAGE_64_H | 1 | #ifndef _ASM_X86_PAGE_64_H |
| 2 | #define _ASM_X86_PAGE_64_H | 2 | #define _ASM_X86_PAGE_64_H |
| 3 | 3 | ||
| 4 | #define PAGETABLE_LEVELS 4 | 4 | #include <asm/page_64_types.h> |
| 5 | |||
| 6 | #define THREAD_ORDER 1 | ||
| 7 | #define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER) | ||
| 8 | #define CURRENT_MASK (~(THREAD_SIZE - 1)) | ||
| 9 | |||
| 10 | #define EXCEPTION_STACK_ORDER 0 | ||
| 11 | #define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER) | ||
| 12 | |||
| 13 | #define DEBUG_STACK_ORDER (EXCEPTION_STACK_ORDER + 1) | ||
| 14 | #define DEBUG_STKSZ (PAGE_SIZE << DEBUG_STACK_ORDER) | ||
| 15 | |||
| 16 | #define IRQSTACK_ORDER 2 | ||
| 17 | #define IRQSTACKSIZE (PAGE_SIZE << IRQSTACK_ORDER) | ||
| 18 | |||
| 19 | #define STACKFAULT_STACK 1 | ||
| 20 | #define DOUBLEFAULT_STACK 2 | ||
| 21 | #define NMI_STACK 3 | ||
| 22 | #define DEBUG_STACK 4 | ||
| 23 | #define MCE_STACK 5 | ||
| 24 | #define N_EXCEPTION_STACKS 5 /* hw limit: 7 */ | ||
| 25 | |||
| 26 | #define PUD_PAGE_SIZE (_AC(1, UL) << PUD_SHIFT) | ||
| 27 | #define PUD_PAGE_MASK (~(PUD_PAGE_SIZE-1)) | ||
| 28 | |||
| 29 | /* | ||
| 30 | * Set __PAGE_OFFSET to the most negative possible address + | ||
| 31 | * PGDIR_SIZE*16 (pgd slot 272). The gap is to allow a space for a | ||
| 32 | * hypervisor to fit. Choosing 16 slots here is arbitrary, but it's | ||
| 33 | * what Xen requires. | ||
| 34 | */ | ||
| 35 | #define __PAGE_OFFSET _AC(0xffff880000000000, UL) | ||
| 36 | |||
| 37 | #define __PHYSICAL_START CONFIG_PHYSICAL_START | ||
| 38 | #define __KERNEL_ALIGN 0x200000 | ||
| 39 | |||
| 40 | /* | ||
| 41 | * Make sure kernel is aligned to 2MB address. Catching it at compile | ||
| 42 | * time is better. Change your config file and compile the kernel | ||
| 43 | * for a 2MB aligned address (CONFIG_PHYSICAL_START) | ||
| 44 | */ | ||
| 45 | #if (CONFIG_PHYSICAL_START % __KERNEL_ALIGN) != 0 | ||
| 46 | #error "CONFIG_PHYSICAL_START must be a multiple of 2MB" | ||
| 47 | #endif | ||
| 48 | |||
| 49 | #define __START_KERNEL (__START_KERNEL_map + __PHYSICAL_START) | ||
| 50 | #define __START_KERNEL_map _AC(0xffffffff80000000, UL) | ||
| 51 | |||
| 52 | /* See Documentation/x86_64/mm.txt for a description of the memory map. */ | ||
| 53 | #define __PHYSICAL_MASK_SHIFT 46 | ||
| 54 | #define __VIRTUAL_MASK_SHIFT 48 | ||
| 55 | |||
| 56 | /* | ||
| 57 | * Kernel image size is limited to 512 MB (see level2_kernel_pgt in | ||
| 58 | * arch/x86/kernel/head_64.S), and it is mapped here: | ||
| 59 | */ | ||
| 60 | #define KERNEL_IMAGE_SIZE (512 * 1024 * 1024) | ||
| 61 | #define KERNEL_IMAGE_START _AC(0xffffffff80000000, UL) | ||
| 62 | |||
| 63 | #ifndef __ASSEMBLY__ | ||
| 64 | void clear_page(void *page); | ||
| 65 | void copy_page(void *to, void *from); | ||
| 66 | |||
| 67 | /* duplicated to the one in bootmem.h */ | ||
| 68 | extern unsigned long max_pfn; | ||
| 69 | extern unsigned long phys_base; | ||
| 70 | |||
| 71 | extern unsigned long __phys_addr(unsigned long); | ||
| 72 | #define __phys_reloc_hide(x) (x) | ||
| 73 | |||
| 74 | /* | ||
| 75 | * These are used to make use of C type-checking.. | ||
| 76 | */ | ||
| 77 | typedef unsigned long pteval_t; | ||
| 78 | typedef unsigned long pmdval_t; | ||
| 79 | typedef unsigned long pudval_t; | ||
| 80 | typedef unsigned long pgdval_t; | ||
| 81 | typedef unsigned long pgprotval_t; | ||
| 82 | |||
| 83 | typedef struct page *pgtable_t; | ||
| 84 | |||
| 85 | typedef struct { pteval_t pte; } pte_t; | ||
| 86 | |||
| 87 | #define vmemmap ((struct page *)VMEMMAP_START) | ||
| 88 | |||
| 89 | extern unsigned long init_memory_mapping(unsigned long start, | ||
| 90 | unsigned long end); | ||
| 91 | |||
| 92 | extern void initmem_init(unsigned long start_pfn, unsigned long end_pfn); | ||
| 93 | extern void free_initmem(void); | ||
| 94 | |||
| 95 | 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 | |||
| 98 | #endif /* !__ASSEMBLY__ */ | ||
| 99 | |||
| 100 | #ifdef CONFIG_FLATMEM | ||
| 101 | #define pfn_valid(pfn) ((pfn) < max_pfn) | ||
| 102 | #endif | ||
| 103 | |||
| 104 | 5 | ||
| 105 | #endif /* _ASM_X86_PAGE_64_H */ | 6 | #endif /* _ASM_X86_PAGE_64_H */ |
diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h new file mode 100644 index 000000000000..d38c91b70248 --- /dev/null +++ b/arch/x86/include/asm/page_64_types.h | |||
| @@ -0,0 +1,89 @@ | |||
| 1 | #ifndef _ASM_X86_PAGE_64_DEFS_H | ||
| 2 | #define _ASM_X86_PAGE_64_DEFS_H | ||
| 3 | |||
| 4 | #define THREAD_ORDER 1 | ||
| 5 | #define THREAD_SIZE (PAGE_SIZE << THREAD_ORDER) | ||
| 6 | #define CURRENT_MASK (~(THREAD_SIZE - 1)) | ||
| 7 | |||
| 8 | #define EXCEPTION_STACK_ORDER 0 | ||
| 9 | #define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER) | ||
| 10 | |||
| 11 | #define DEBUG_STACK_ORDER (EXCEPTION_STACK_ORDER + 1) | ||
| 12 | #define DEBUG_STKSZ (PAGE_SIZE << DEBUG_STACK_ORDER) | ||
| 13 | |||
| 14 | #define IRQ_STACK_ORDER 2 | ||
| 15 | #define IRQ_STACK_SIZE (PAGE_SIZE << IRQ_STACK_ORDER) | ||
| 16 | |||
| 17 | #define STACKFAULT_STACK 1 | ||
| 18 | #define DOUBLEFAULT_STACK 2 | ||
| 19 | #define NMI_STACK 3 | ||
| 20 | #define DEBUG_STACK 4 | ||
| 21 | #define MCE_STACK 5 | ||
| 22 | #define N_EXCEPTION_STACKS 5 /* hw limit: 7 */ | ||
| 23 | |||
| 24 | #define PUD_PAGE_SIZE (_AC(1, UL) << PUD_SHIFT) | ||
| 25 | #define PUD_PAGE_MASK (~(PUD_PAGE_SIZE-1)) | ||
| 26 | |||
| 27 | /* | ||
| 28 | * Set __PAGE_OFFSET to the most negative possible address + | ||
| 29 | * PGDIR_SIZE*16 (pgd slot 272). The gap is to allow a space for a | ||
| 30 | * hypervisor to fit. Choosing 16 slots here is arbitrary, but it's | ||
| 31 | * what Xen requires. | ||
| 32 | */ | ||
| 33 | #define __PAGE_OFFSET _AC(0xffff880000000000, UL) | ||
| 34 | |||
| 35 | #define __PHYSICAL_START CONFIG_PHYSICAL_START | ||
| 36 | #define __KERNEL_ALIGN 0x200000 | ||
| 37 | |||
| 38 | /* | ||
| 39 | * Make sure kernel is aligned to 2MB address. Catching it at compile | ||
| 40 | * time is better. Change your config file and compile the kernel | ||
| 41 | * for a 2MB aligned address (CONFIG_PHYSICAL_START) | ||
| 42 | */ | ||
| 43 | #if (CONFIG_PHYSICAL_START % __KERNEL_ALIGN) != 0 | ||
| 44 | #error "CONFIG_PHYSICAL_START must be a multiple of 2MB" | ||
| 45 | #endif | ||
| 46 | |||
| 47 | #define __START_KERNEL (__START_KERNEL_map + __PHYSICAL_START) | ||
| 48 | #define __START_KERNEL_map _AC(0xffffffff80000000, UL) | ||
| 49 | |||
| 50 | /* See Documentation/x86_64/mm.txt for a description of the memory map. */ | ||
| 51 | #define __PHYSICAL_MASK_SHIFT 46 | ||
| 52 | #define __VIRTUAL_MASK_SHIFT 48 | ||
| 53 | |||
| 54 | /* | ||
| 55 | * Kernel image size is limited to 512 MB (see level2_kernel_pgt in | ||
| 56 | * arch/x86/kernel/head_64.S), and it is mapped here: | ||
| 57 | */ | ||
| 58 | #define KERNEL_IMAGE_SIZE (512 * 1024 * 1024) | ||
| 59 | #define KERNEL_IMAGE_START _AC(0xffffffff80000000, UL) | ||
| 60 | |||
| 61 | #ifndef __ASSEMBLY__ | ||
| 62 | void clear_page(void *page); | ||
| 63 | void copy_page(void *to, void *from); | ||
| 64 | |||
| 65 | /* duplicated to the one in bootmem.h */ | ||
| 66 | extern unsigned long max_pfn; | ||
| 67 | extern unsigned long phys_base; | ||
| 68 | |||
| 69 | extern unsigned long __phys_addr(unsigned long); | ||
| 70 | #define __phys_reloc_hide(x) (x) | ||
| 71 | |||
| 72 | #define vmemmap ((struct page *)VMEMMAP_START) | ||
| 73 | |||
| 74 | extern unsigned long init_memory_mapping(unsigned long start, | ||
| 75 | unsigned long end); | ||
| 76 | |||
| 77 | extern void initmem_init(unsigned long start_pfn, unsigned long end_pfn); | ||
| 78 | extern void free_initmem(void); | ||
| 79 | |||
| 80 | extern void init_extra_mapping_uc(unsigned long phys, unsigned long size); | ||
| 81 | extern void init_extra_mapping_wb(unsigned long phys, unsigned long size); | ||
| 82 | |||
| 83 | #endif /* !__ASSEMBLY__ */ | ||
| 84 | |||
| 85 | #ifdef CONFIG_FLATMEM | ||
| 86 | #define pfn_valid(pfn) ((pfn) < max_pfn) | ||
| 87 | #endif | ||
| 88 | |||
| 89 | #endif /* _ASM_X86_PAGE_64_DEFS_H */ | ||
diff --git a/arch/x86/include/asm/page_types.h b/arch/x86/include/asm/page_types.h new file mode 100644 index 000000000000..2d625da6603c --- /dev/null +++ b/arch/x86/include/asm/page_types.h | |||
| @@ -0,0 +1,57 @@ | |||
| 1 | #ifndef _ASM_X86_PAGE_DEFS_H | ||
| 2 | #define _ASM_X86_PAGE_DEFS_H | ||
| 3 | |||
| 4 | #include <linux/const.h> | ||
| 5 | |||
| 6 | /* PAGE_SHIFT determines the page size */ | ||
| 7 | #define PAGE_SHIFT 12 | ||
| 8 | #define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) | ||
| 9 | #define PAGE_MASK (~(PAGE_SIZE-1)) | ||
| 10 | |||
| 11 | #define __PHYSICAL_MASK ((phys_addr_t)(1ULL << __PHYSICAL_MASK_SHIFT) - 1) | ||
| 12 | #define __VIRTUAL_MASK ((1UL << __VIRTUAL_MASK_SHIFT) - 1) | ||
| 13 | |||
| 14 | /* Cast PAGE_MASK to a signed type so that it is sign-extended if | ||
| 15 | virtual addresses are 32-bits but physical addresses are larger | ||
| 16 | (ie, 32-bit PAE). */ | ||
| 17 | #define PHYSICAL_PAGE_MASK (((signed long)PAGE_MASK) & __PHYSICAL_MASK) | ||
| 18 | |||
| 19 | #define PMD_PAGE_SIZE (_AC(1, UL) << PMD_SHIFT) | ||
| 20 | #define PMD_PAGE_MASK (~(PMD_PAGE_SIZE-1)) | ||
| 21 | |||
| 22 | #define HPAGE_SHIFT PMD_SHIFT | ||
| 23 | #define HPAGE_SIZE (_AC(1,UL) << HPAGE_SHIFT) | ||
| 24 | #define HPAGE_MASK (~(HPAGE_SIZE - 1)) | ||
| 25 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) | ||
| 26 | |||
| 27 | #define HUGE_MAX_HSTATE 2 | ||
| 28 | |||
| 29 | #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) | ||
| 30 | |||
| 31 | #define VM_DATA_DEFAULT_FLAGS \ | ||
| 32 | (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \ | ||
| 33 | VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) | ||
| 34 | |||
| 35 | #ifdef CONFIG_X86_64 | ||
| 36 | #include <asm/page_64_types.h> | ||
| 37 | #else | ||
| 38 | #include <asm/page_32_types.h> | ||
| 39 | #endif /* CONFIG_X86_64 */ | ||
| 40 | |||
| 41 | #ifndef __ASSEMBLY__ | ||
| 42 | |||
| 43 | struct pgprot; | ||
| 44 | |||
| 45 | extern int page_is_ram(unsigned long pagenr); | ||
| 46 | extern int devmem_is_allowed(unsigned long pagenr); | ||
| 47 | extern void map_devmem(unsigned long pfn, unsigned long size, | ||
| 48 | struct pgprot vma_prot); | ||
| 49 | extern void unmap_devmem(unsigned long pfn, unsigned long size, | ||
| 50 | struct pgprot vma_prot); | ||
| 51 | |||
| 52 | extern unsigned long max_low_pfn_mapped; | ||
| 53 | extern unsigned long max_pfn_mapped; | ||
| 54 | |||
| 55 | #endif /* !__ASSEMBLY__ */ | ||
| 56 | |||
| 57 | #endif /* _ASM_X86_PAGE_DEFS_H */ | ||
diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h index e299287e8e33..0617d5cc9712 100644 --- a/arch/x86/include/asm/paravirt.h +++ b/arch/x86/include/asm/paravirt.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * para-virtualization: those hooks are defined here. */ | 4 | * para-virtualization: those hooks are defined here. */ |
| 5 | 5 | ||
| 6 | #ifdef CONFIG_PARAVIRT | 6 | #ifdef CONFIG_PARAVIRT |
| 7 | #include <asm/page.h> | 7 | #include <asm/pgtable_types.h> |
| 8 | #include <asm/asm.h> | 8 | #include <asm/asm.h> |
| 9 | 9 | ||
| 10 | /* Bitmask of what can be clobbered: usually at least eax. */ | 10 | /* Bitmask of what can be clobbered: usually at least eax. */ |
| @@ -12,21 +12,38 @@ | |||
| 12 | #define CLBR_EAX (1 << 0) | 12 | #define CLBR_EAX (1 << 0) |
| 13 | #define CLBR_ECX (1 << 1) | 13 | #define CLBR_ECX (1 << 1) |
| 14 | #define CLBR_EDX (1 << 2) | 14 | #define CLBR_EDX (1 << 2) |
| 15 | #define CLBR_EDI (1 << 3) | ||
| 15 | 16 | ||
| 16 | #ifdef CONFIG_X86_64 | 17 | #ifdef CONFIG_X86_32 |
| 17 | #define CLBR_RSI (1 << 3) | 18 | /* CLBR_ANY should match all regs platform has. For i386, that's just it */ |
| 18 | #define CLBR_RDI (1 << 4) | 19 | #define CLBR_ANY ((1 << 4) - 1) |
| 20 | |||
| 21 | #define CLBR_ARG_REGS (CLBR_EAX | CLBR_EDX | CLBR_ECX) | ||
| 22 | #define CLBR_RET_REG (CLBR_EAX | CLBR_EDX) | ||
| 23 | #define CLBR_SCRATCH (0) | ||
| 24 | #else | ||
| 25 | #define CLBR_RAX CLBR_EAX | ||
| 26 | #define CLBR_RCX CLBR_ECX | ||
| 27 | #define CLBR_RDX CLBR_EDX | ||
| 28 | #define CLBR_RDI CLBR_EDI | ||
| 29 | #define CLBR_RSI (1 << 4) | ||
| 19 | #define CLBR_R8 (1 << 5) | 30 | #define CLBR_R8 (1 << 5) |
| 20 | #define CLBR_R9 (1 << 6) | 31 | #define CLBR_R9 (1 << 6) |
| 21 | #define CLBR_R10 (1 << 7) | 32 | #define CLBR_R10 (1 << 7) |
| 22 | #define CLBR_R11 (1 << 8) | 33 | #define CLBR_R11 (1 << 8) |
| 34 | |||
| 23 | #define CLBR_ANY ((1 << 9) - 1) | 35 | #define CLBR_ANY ((1 << 9) - 1) |
| 36 | |||
| 37 | #define CLBR_ARG_REGS (CLBR_RDI | CLBR_RSI | CLBR_RDX | \ | ||
| 38 | CLBR_RCX | CLBR_R8 | CLBR_R9) | ||
| 39 | #define CLBR_RET_REG (CLBR_RAX) | ||
| 40 | #define CLBR_SCRATCH (CLBR_R10 | CLBR_R11) | ||
| 41 | |||
| 24 | #include <asm/desc_defs.h> | 42 | #include <asm/desc_defs.h> |
| 25 | #else | ||
| 26 | /* CLBR_ANY should match all regs platform has. For i386, that's just it */ | ||
| 27 | #define CLBR_ANY ((1 << 3) - 1) | ||
| 28 | #endif /* X86_64 */ | 43 | #endif /* X86_64 */ |
| 29 | 44 | ||
| 45 | #define CLBR_CALLEE_SAVE ((CLBR_ARG_REGS | CLBR_SCRATCH) & ~CLBR_RET_REG) | ||
| 46 | |||
| 30 | #ifndef __ASSEMBLY__ | 47 | #ifndef __ASSEMBLY__ |
| 31 | #include <linux/types.h> | 48 | #include <linux/types.h> |
| 32 | #include <linux/cpumask.h> | 49 | #include <linux/cpumask.h> |
| @@ -40,6 +57,14 @@ struct tss_struct; | |||
| 40 | struct mm_struct; | 57 | struct mm_struct; |
| 41 | struct desc_struct; | 58 | struct desc_struct; |
| 42 | 59 | ||
| 60 | /* | ||
| 61 | * Wrapper type for pointers to code which uses the non-standard | ||
| 62 | * calling convention. See PV_CALL_SAVE_REGS_THUNK below. | ||
| 63 | */ | ||
| 64 | struct paravirt_callee_save { | ||
| 65 | void *func; | ||
| 66 | }; | ||
| 67 | |||
| 43 | /* general info */ | 68 | /* general info */ |
| 44 | struct pv_info { | 69 | struct pv_info { |
| 45 | unsigned int kernel_rpl; | 70 | unsigned int kernel_rpl; |
| @@ -189,11 +214,15 @@ struct pv_irq_ops { | |||
| 189 | * expected to use X86_EFLAGS_IF; all other bits | 214 | * expected to use X86_EFLAGS_IF; all other bits |
| 190 | * returned from save_fl are undefined, and may be ignored by | 215 | * returned from save_fl are undefined, and may be ignored by |
| 191 | * restore_fl. | 216 | * restore_fl. |
| 217 | * | ||
| 218 | * NOTE: These functions callers expect the callee to preserve | ||
| 219 | * more registers than the standard C calling convention. | ||
| 192 | */ | 220 | */ |
| 193 | unsigned long (*save_fl)(void); | 221 | struct paravirt_callee_save save_fl; |
| 194 | void (*restore_fl)(unsigned long); | 222 | struct paravirt_callee_save restore_fl; |
| 195 | void (*irq_disable)(void); | 223 | struct paravirt_callee_save irq_disable; |
| 196 | void (*irq_enable)(void); | 224 | struct paravirt_callee_save irq_enable; |
| 225 | |||
| 197 | void (*safe_halt)(void); | 226 | void (*safe_halt)(void); |
| 198 | void (*halt)(void); | 227 | void (*halt)(void); |
| 199 | 228 | ||
| @@ -244,7 +273,8 @@ struct pv_mmu_ops { | |||
| 244 | void (*flush_tlb_user)(void); | 273 | void (*flush_tlb_user)(void); |
| 245 | void (*flush_tlb_kernel)(void); | 274 | void (*flush_tlb_kernel)(void); |
| 246 | void (*flush_tlb_single)(unsigned long addr); | 275 | void (*flush_tlb_single)(unsigned long addr); |
| 247 | void (*flush_tlb_others)(const cpumask_t *cpus, struct mm_struct *mm, | 276 | void (*flush_tlb_others)(const struct cpumask *cpus, |
| 277 | struct mm_struct *mm, | ||
| 248 | unsigned long va); | 278 | unsigned long va); |
| 249 | 279 | ||
| 250 | /* Hooks for allocating and freeing a pagetable top-level */ | 280 | /* Hooks for allocating and freeing a pagetable top-level */ |
| @@ -278,12 +308,11 @@ struct pv_mmu_ops { | |||
| 278 | void (*ptep_modify_prot_commit)(struct mm_struct *mm, unsigned long addr, | 308 | void (*ptep_modify_prot_commit)(struct mm_struct *mm, unsigned long addr, |
| 279 | pte_t *ptep, pte_t pte); | 309 | pte_t *ptep, pte_t pte); |
| 280 | 310 | ||
| 281 | pteval_t (*pte_val)(pte_t); | 311 | struct paravirt_callee_save pte_val; |
| 282 | pteval_t (*pte_flags)(pte_t); | 312 | struct paravirt_callee_save make_pte; |
| 283 | pte_t (*make_pte)(pteval_t pte); | ||
| 284 | 313 | ||
| 285 | pgdval_t (*pgd_val)(pgd_t); | 314 | struct paravirt_callee_save pgd_val; |
| 286 | pgd_t (*make_pgd)(pgdval_t pgd); | 315 | struct paravirt_callee_save make_pgd; |
| 287 | 316 | ||
| 288 | #if PAGETABLE_LEVELS >= 3 | 317 | #if PAGETABLE_LEVELS >= 3 |
| 289 | #ifdef CONFIG_X86_PAE | 318 | #ifdef CONFIG_X86_PAE |
| @@ -298,12 +327,12 @@ struct pv_mmu_ops { | |||
| 298 | 327 | ||
| 299 | void (*set_pud)(pud_t *pudp, pud_t pudval); | 328 | void (*set_pud)(pud_t *pudp, pud_t pudval); |
| 300 | 329 | ||
| 301 | pmdval_t (*pmd_val)(pmd_t); | 330 | struct paravirt_callee_save pmd_val; |
| 302 | pmd_t (*make_pmd)(pmdval_t pmd); | 331 | struct paravirt_callee_save make_pmd; |
| 303 | 332 | ||
| 304 | #if PAGETABLE_LEVELS == 4 | 333 | #if PAGETABLE_LEVELS == 4 |
| 305 | pudval_t (*pud_val)(pud_t); | 334 | struct paravirt_callee_save pud_val; |
| 306 | pud_t (*make_pud)(pudval_t pud); | 335 | struct paravirt_callee_save make_pud; |
| 307 | 336 | ||
| 308 | void (*set_pgd)(pgd_t *pudp, pgd_t pgdval); | 337 | void (*set_pgd)(pgd_t *pudp, pgd_t pgdval); |
| 309 | #endif /* PAGETABLE_LEVELS == 4 */ | 338 | #endif /* PAGETABLE_LEVELS == 4 */ |
| @@ -388,6 +417,8 @@ extern struct pv_lock_ops pv_lock_ops; | |||
| 388 | asm("start_" #ops "_" #name ": " code "; end_" #ops "_" #name ":") | 417 | asm("start_" #ops "_" #name ": " code "; end_" #ops "_" #name ":") |
| 389 | 418 | ||
| 390 | unsigned paravirt_patch_nop(void); | 419 | unsigned paravirt_patch_nop(void); |
| 420 | unsigned paravirt_patch_ident_32(void *insnbuf, unsigned len); | ||
| 421 | unsigned paravirt_patch_ident_64(void *insnbuf, unsigned len); | ||
| 391 | unsigned paravirt_patch_ignore(unsigned len); | 422 | unsigned paravirt_patch_ignore(unsigned len); |
| 392 | unsigned paravirt_patch_call(void *insnbuf, | 423 | unsigned paravirt_patch_call(void *insnbuf, |
| 393 | const void *target, u16 tgt_clobbers, | 424 | const void *target, u16 tgt_clobbers, |
| @@ -479,25 +510,45 @@ int paravirt_disable_iospace(void); | |||
| 479 | * makes sure the incoming and outgoing types are always correct. | 510 | * makes sure the incoming and outgoing types are always correct. |
| 480 | */ | 511 | */ |
| 481 | #ifdef CONFIG_X86_32 | 512 | #ifdef CONFIG_X86_32 |
| 482 | #define PVOP_VCALL_ARGS unsigned long __eax, __edx, __ecx | 513 | #define PVOP_VCALL_ARGS \ |
| 514 | unsigned long __eax = __eax, __edx = __edx, __ecx = __ecx | ||
| 483 | #define PVOP_CALL_ARGS PVOP_VCALL_ARGS | 515 | #define PVOP_CALL_ARGS PVOP_VCALL_ARGS |
| 516 | |||
| 517 | #define PVOP_CALL_ARG1(x) "a" ((unsigned long)(x)) | ||
| 518 | #define PVOP_CALL_ARG2(x) "d" ((unsigned long)(x)) | ||
| 519 | #define PVOP_CALL_ARG3(x) "c" ((unsigned long)(x)) | ||
| 520 | |||
| 484 | #define PVOP_VCALL_CLOBBERS "=a" (__eax), "=d" (__edx), \ | 521 | #define PVOP_VCALL_CLOBBERS "=a" (__eax), "=d" (__edx), \ |
| 485 | "=c" (__ecx) | 522 | "=c" (__ecx) |
| 486 | #define PVOP_CALL_CLOBBERS PVOP_VCALL_CLOBBERS | 523 | #define PVOP_CALL_CLOBBERS PVOP_VCALL_CLOBBERS |
| 524 | |||
| 525 | #define PVOP_VCALLEE_CLOBBERS "=a" (__eax), "=d" (__edx) | ||
| 526 | #define PVOP_CALLEE_CLOBBERS PVOP_VCALLEE_CLOBBERS | ||
| 527 | |||
| 487 | #define EXTRA_CLOBBERS | 528 | #define EXTRA_CLOBBERS |
| 488 | #define VEXTRA_CLOBBERS | 529 | #define VEXTRA_CLOBBERS |
| 489 | #else | 530 | #else /* CONFIG_X86_64 */ |
| 490 | #define PVOP_VCALL_ARGS unsigned long __edi, __esi, __edx, __ecx | 531 | #define PVOP_VCALL_ARGS \ |
| 532 | unsigned long __edi = __edi, __esi = __esi, \ | ||
| 533 | __edx = __edx, __ecx = __ecx | ||
| 491 | #define PVOP_CALL_ARGS PVOP_VCALL_ARGS, __eax | 534 | #define PVOP_CALL_ARGS PVOP_VCALL_ARGS, __eax |
| 535 | |||
| 536 | #define PVOP_CALL_ARG1(x) "D" ((unsigned long)(x)) | ||
| 537 | #define PVOP_CALL_ARG2(x) "S" ((unsigned long)(x)) | ||
| 538 | #define PVOP_CALL_ARG3(x) "d" ((unsigned long)(x)) | ||
| 539 | #define PVOP_CALL_ARG4(x) "c" ((unsigned long)(x)) | ||
| 540 | |||
| 492 | #define PVOP_VCALL_CLOBBERS "=D" (__edi), \ | 541 | #define PVOP_VCALL_CLOBBERS "=D" (__edi), \ |
| 493 | "=S" (__esi), "=d" (__edx), \ | 542 | "=S" (__esi), "=d" (__edx), \ |
| 494 | "=c" (__ecx) | 543 | "=c" (__ecx) |
| 495 | |||
| 496 | #define PVOP_CALL_CLOBBERS PVOP_VCALL_CLOBBERS, "=a" (__eax) | 544 | #define PVOP_CALL_CLOBBERS PVOP_VCALL_CLOBBERS, "=a" (__eax) |
| 497 | 545 | ||
| 546 | #define PVOP_VCALLEE_CLOBBERS "=a" (__eax) | ||
| 547 | #define PVOP_CALLEE_CLOBBERS PVOP_VCALLEE_CLOBBERS | ||
| 548 | |||
| 498 | #define EXTRA_CLOBBERS , "r8", "r9", "r10", "r11" | 549 | #define EXTRA_CLOBBERS , "r8", "r9", "r10", "r11" |
| 499 | #define VEXTRA_CLOBBERS , "rax", "r8", "r9", "r10", "r11" | 550 | #define VEXTRA_CLOBBERS , "rax", "r8", "r9", "r10", "r11" |
| 500 | #endif | 551 | #endif /* CONFIG_X86_32 */ |
| 501 | 552 | ||
| 502 | #ifdef CONFIG_PARAVIRT_DEBUG | 553 | #ifdef CONFIG_PARAVIRT_DEBUG |
| 503 | #define PVOP_TEST_NULL(op) BUG_ON(op == NULL) | 554 | #define PVOP_TEST_NULL(op) BUG_ON(op == NULL) |
| @@ -505,10 +556,11 @@ int paravirt_disable_iospace(void); | |||
| 505 | #define PVOP_TEST_NULL(op) ((void)op) | 556 | #define PVOP_TEST_NULL(op) ((void)op) |
| 506 | #endif | 557 | #endif |
| 507 | 558 | ||
| 508 | #define __PVOP_CALL(rettype, op, pre, post, ...) \ | 559 | #define ____PVOP_CALL(rettype, op, clbr, call_clbr, extra_clbr, \ |
| 560 | pre, post, ...) \ | ||
| 509 | ({ \ | 561 | ({ \ |
| 510 | rettype __ret; \ | 562 | rettype __ret; \ |
| 511 | PVOP_CALL_ARGS; \ | 563 | PVOP_CALL_ARGS; \ |
| 512 | PVOP_TEST_NULL(op); \ | 564 | PVOP_TEST_NULL(op); \ |
| 513 | /* This is 32-bit specific, but is okay in 64-bit */ \ | 565 | /* This is 32-bit specific, but is okay in 64-bit */ \ |
| 514 | /* since this condition will never hold */ \ | 566 | /* since this condition will never hold */ \ |
| @@ -516,70 +568,113 @@ int paravirt_disable_iospace(void); | |||
| 516 | asm volatile(pre \ | 568 | asm volatile(pre \ |
| 517 | paravirt_alt(PARAVIRT_CALL) \ | 569 | paravirt_alt(PARAVIRT_CALL) \ |
| 518 | post \ | 570 | post \ |
| 519 | : PVOP_CALL_CLOBBERS \ | 571 | : call_clbr \ |
| 520 | : paravirt_type(op), \ | 572 | : paravirt_type(op), \ |
| 521 | paravirt_clobber(CLBR_ANY), \ | 573 | paravirt_clobber(clbr), \ |
| 522 | ##__VA_ARGS__ \ | 574 | ##__VA_ARGS__ \ |
| 523 | : "memory", "cc" EXTRA_CLOBBERS); \ | 575 | : "memory", "cc" extra_clbr); \ |
| 524 | __ret = (rettype)((((u64)__edx) << 32) | __eax); \ | 576 | __ret = (rettype)((((u64)__edx) << 32) | __eax); \ |
| 525 | } else { \ | 577 | } else { \ |
| 526 | asm volatile(pre \ | 578 | asm volatile(pre \ |
| 527 | paravirt_alt(PARAVIRT_CALL) \ | 579 | paravirt_alt(PARAVIRT_CALL) \ |
| 528 | post \ | 580 | post \ |
| 529 | : PVOP_CALL_CLOBBERS \ | 581 | : call_clbr \ |
| 530 | : paravirt_type(op), \ | 582 | : paravirt_type(op), \ |
| 531 | paravirt_clobber(CLBR_ANY), \ | 583 | paravirt_clobber(clbr), \ |
| 532 | ##__VA_ARGS__ \ | 584 | ##__VA_ARGS__ \ |
| 533 | : "memory", "cc" EXTRA_CLOBBERS); \ | 585 | : "memory", "cc" extra_clbr); \ |
| 534 | __ret = (rettype)__eax; \ | 586 | __ret = (rettype)__eax; \ |
| 535 | } \ | 587 | } \ |
| 536 | __ret; \ | 588 | __ret; \ |
| 537 | }) | 589 | }) |
| 538 | #define __PVOP_VCALL(op, pre, post, ...) \ | 590 | |
| 591 | #define __PVOP_CALL(rettype, op, pre, post, ...) \ | ||
| 592 | ____PVOP_CALL(rettype, op, CLBR_ANY, PVOP_CALL_CLOBBERS, \ | ||
| 593 | EXTRA_CLOBBERS, pre, post, ##__VA_ARGS__) | ||
| 594 | |||
| 595 | #define __PVOP_CALLEESAVE(rettype, op, pre, post, ...) \ | ||
| 596 | ____PVOP_CALL(rettype, op.func, CLBR_RET_REG, \ | ||
| 597 | PVOP_CALLEE_CLOBBERS, , \ | ||
| 598 | pre, post, ##__VA_ARGS__) | ||
| 599 | |||
| 600 | |||
| 601 | #define ____PVOP_VCALL(op, clbr, call_clbr, extra_clbr, pre, post, ...) \ | ||
| 539 | ({ \ | 602 | ({ \ |
| 540 | PVOP_VCALL_ARGS; \ | 603 | PVOP_VCALL_ARGS; \ |
| 541 | PVOP_TEST_NULL(op); \ | 604 | PVOP_TEST_NULL(op); \ |
| 542 | asm volatile(pre \ | 605 | asm volatile(pre \ |
| 543 | paravirt_alt(PARAVIRT_CALL) \ | 606 | paravirt_alt(PARAVIRT_CALL) \ |
| 544 | post \ | 607 | post \ |
| 545 | : PVOP_VCALL_CLOBBERS \ | 608 | : call_clbr \ |
| 546 | : paravirt_type(op), \ | 609 | : paravirt_type(op), \ |
| 547 | paravirt_clobber(CLBR_ANY), \ | 610 | paravirt_clobber(clbr), \ |
| 548 | ##__VA_ARGS__ \ | 611 | ##__VA_ARGS__ \ |
| 549 | : "memory", "cc" VEXTRA_CLOBBERS); \ | 612 | : "memory", "cc" extra_clbr); \ |
| 550 | }) | 613 | }) |
| 551 | 614 | ||
| 615 | #define __PVOP_VCALL(op, pre, post, ...) \ | ||
| 616 | ____PVOP_VCALL(op, CLBR_ANY, PVOP_VCALL_CLOBBERS, \ | ||
| 617 | VEXTRA_CLOBBERS, \ | ||
| 618 | pre, post, ##__VA_ARGS__) | ||
| 619 | |||
| 620 | #define __PVOP_VCALLEESAVE(rettype, op, pre, post, ...) \ | ||
| 621 | ____PVOP_CALL(rettype, op.func, CLBR_RET_REG, \ | ||
| 622 | PVOP_VCALLEE_CLOBBERS, , \ | ||
| 623 | pre, post, ##__VA_ARGS__) | ||
| 624 | |||
| 625 | |||
| 626 | |||
| 552 | #define PVOP_CALL0(rettype, op) \ | 627 | #define PVOP_CALL0(rettype, op) \ |
| 553 | __PVOP_CALL(rettype, op, "", "") | 628 | __PVOP_CALL(rettype, op, "", "") |
| 554 | #define PVOP_VCALL0(op) \ | 629 | #define PVOP_VCALL0(op) \ |
| 555 | __PVOP_VCALL(op, "", "") | 630 | __PVOP_VCALL(op, "", "") |
| 556 | 631 | ||
| 632 | #define PVOP_CALLEE0(rettype, op) \ | ||
| 633 | __PVOP_CALLEESAVE(rettype, op, "", "") | ||
| 634 | #define PVOP_VCALLEE0(op) \ | ||
| 635 | __PVOP_VCALLEESAVE(op, "", "") | ||
| 636 | |||
| 637 | |||
| 557 | #define PVOP_CALL1(rettype, op, arg1) \ | 638 | #define PVOP_CALL1(rettype, op, arg1) \ |
| 558 | __PVOP_CALL(rettype, op, "", "", "0" ((unsigned long)(arg1))) | 639 | __PVOP_CALL(rettype, op, "", "", PVOP_CALL_ARG1(arg1)) |
| 559 | #define PVOP_VCALL1(op, arg1) \ | 640 | #define PVOP_VCALL1(op, arg1) \ |
| 560 | __PVOP_VCALL(op, "", "", "0" ((unsigned long)(arg1))) | 641 | __PVOP_VCALL(op, "", "", PVOP_CALL_ARG1(arg1)) |
| 642 | |||
| 643 | #define PVOP_CALLEE1(rettype, op, arg1) \ | ||
| 644 | __PVOP_CALLEESAVE(rettype, op, "", "", PVOP_CALL_ARG1(arg1)) | ||
| 645 | #define PVOP_VCALLEE1(op, arg1) \ | ||
| 646 | __PVOP_VCALLEESAVE(op, "", "", PVOP_CALL_ARG1(arg1)) | ||
| 647 | |||
| 561 | 648 | ||
| 562 | #define PVOP_CALL2(rettype, op, arg1, arg2) \ | 649 | #define PVOP_CALL2(rettype, op, arg1, arg2) \ |
| 563 | __PVOP_CALL(rettype, op, "", "", "0" ((unsigned long)(arg1)), \ | 650 | __PVOP_CALL(rettype, op, "", "", PVOP_CALL_ARG1(arg1), \ |
| 564 | "1" ((unsigned long)(arg2))) | 651 | PVOP_CALL_ARG2(arg2)) |
| 565 | #define PVOP_VCALL2(op, arg1, arg2) \ | 652 | #define PVOP_VCALL2(op, arg1, arg2) \ |
| 566 | __PVOP_VCALL(op, "", "", "0" ((unsigned long)(arg1)), \ | 653 | __PVOP_VCALL(op, "", "", PVOP_CALL_ARG1(arg1), \ |
| 567 | "1" ((unsigned long)(arg2))) | 654 | PVOP_CALL_ARG2(arg2)) |
| 655 | |||
| 656 | #define PVOP_CALLEE2(rettype, op, arg1, arg2) \ | ||
| 657 | __PVOP_CALLEESAVE(rettype, op, "", "", PVOP_CALL_ARG1(arg1), \ | ||
| 658 | PVOP_CALL_ARG2(arg2)) | ||
| 659 | #define PVOP_VCALLEE2(op, arg1, arg2) \ | ||
| 660 | __PVOP_VCALLEESAVE(op, "", "", PVOP_CALL_ARG1(arg1), \ | ||
| 661 | PVOP_CALL_ARG2(arg2)) | ||
| 662 | |||
| 568 | 663 | ||
| 569 | #define PVOP_CALL3(rettype, op, arg1, arg2, arg3) \ | 664 | #define PVOP_CALL3(rettype, op, arg1, arg2, arg3) \ |
| 570 | __PVOP_CALL(rettype, op, "", "", "0" ((unsigned long)(arg1)), \ | 665 | __PVOP_CALL(rettype, op, "", "", PVOP_CALL_ARG1(arg1), \ |
| 571 | "1"((unsigned long)(arg2)), "2"((unsigned long)(arg3))) | 666 | PVOP_CALL_ARG2(arg2), PVOP_CALL_ARG3(arg3)) |
| 572 | #define PVOP_VCALL3(op, arg1, arg2, arg3) \ | 667 | #define PVOP_VCALL3(op, arg1, arg2, arg3) \ |
| 573 | __PVOP_VCALL(op, "", "", "0" ((unsigned long)(arg1)), \ | 668 | __PVOP_VCALL(op, "", "", PVOP_CALL_ARG1(arg1), \ |
| 574 | "1"((unsigned long)(arg2)), "2"((unsigned long)(arg3))) | 669 | PVOP_CALL_ARG2(arg2), PVOP_CALL_ARG3(arg3)) |
| 575 | 670 | ||
| 576 | /* This is the only difference in x86_64. We can make it much simpler */ | 671 | /* This is the only difference in x86_64. We can make it much simpler */ |
| 577 | #ifdef CONFIG_X86_32 | 672 | #ifdef CONFIG_X86_32 |
| 578 | #define PVOP_CALL4(rettype, op, arg1, arg2, arg3, arg4) \ | 673 | #define PVOP_CALL4(rettype, op, arg1, arg2, arg3, arg4) \ |
| 579 | __PVOP_CALL(rettype, op, \ | 674 | __PVOP_CALL(rettype, op, \ |
| 580 | "push %[_arg4];", "lea 4(%%esp),%%esp;", \ | 675 | "push %[_arg4];", "lea 4(%%esp),%%esp;", \ |
| 581 | "0" ((u32)(arg1)), "1" ((u32)(arg2)), \ | 676 | PVOP_CALL_ARG1(arg1), PVOP_CALL_ARG2(arg2), \ |
| 582 | "2" ((u32)(arg3)), [_arg4] "mr" ((u32)(arg4))) | 677 | PVOP_CALL_ARG3(arg3), [_arg4] "mr" ((u32)(arg4))) |
| 583 | #define PVOP_VCALL4(op, arg1, arg2, arg3, arg4) \ | 678 | #define PVOP_VCALL4(op, arg1, arg2, arg3, arg4) \ |
| 584 | __PVOP_VCALL(op, \ | 679 | __PVOP_VCALL(op, \ |
| 585 | "push %[_arg4];", "lea 4(%%esp),%%esp;", \ | 680 | "push %[_arg4];", "lea 4(%%esp),%%esp;", \ |
| @@ -587,13 +682,13 @@ int paravirt_disable_iospace(void); | |||
| 587 | "2" ((u32)(arg3)), [_arg4] "mr" ((u32)(arg4))) | 682 | "2" ((u32)(arg3)), [_arg4] "mr" ((u32)(arg4))) |
| 588 | #else | 683 | #else |
| 589 | #define PVOP_CALL4(rettype, op, arg1, arg2, arg3, arg4) \ | 684 | #define PVOP_CALL4(rettype, op, arg1, arg2, arg3, arg4) \ |
| 590 | __PVOP_CALL(rettype, op, "", "", "0" ((unsigned long)(arg1)), \ | 685 | __PVOP_CALL(rettype, op, "", "", \ |
| 591 | "1"((unsigned long)(arg2)), "2"((unsigned long)(arg3)), \ | 686 | PVOP_CALL_ARG1(arg1), PVOP_CALL_ARG2(arg2), \ |
| 592 | "3"((unsigned long)(arg4))) | 687 | PVOP_CALL_ARG3(arg3), PVOP_CALL_ARG4(arg4)) |
| 593 | #define PVOP_VCALL4(op, arg1, arg2, arg3, arg4) \ | 688 | #define PVOP_VCALL4(op, arg1, arg2, arg3, arg4) \ |
| 594 | __PVOP_VCALL(op, "", "", "0" ((unsigned long)(arg1)), \ | 689 | __PVOP_VCALL(op, "", "", \ |
| 595 | "1"((unsigned long)(arg2)), "2"((unsigned long)(arg3)), \ | 690 | PVOP_CALL_ARG1(arg1), PVOP_CALL_ARG2(arg2), \ |
| 596 | "3"((unsigned long)(arg4))) | 691 | PVOP_CALL_ARG3(arg3), PVOP_CALL_ARG4(arg4)) |
| 597 | #endif | 692 | #endif |
| 598 | 693 | ||
| 599 | static inline int paravirt_enabled(void) | 694 | static inline int paravirt_enabled(void) |
| @@ -984,10 +1079,11 @@ static inline void __flush_tlb_single(unsigned long addr) | |||
| 984 | PVOP_VCALL1(pv_mmu_ops.flush_tlb_single, addr); | 1079 | PVOP_VCALL1(pv_mmu_ops.flush_tlb_single, addr); |
| 985 | } | 1080 | } |
| 986 | 1081 | ||
| 987 | static inline void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm, | 1082 | static inline void flush_tlb_others(const struct cpumask *cpumask, |
| 1083 | struct mm_struct *mm, | ||
| 988 | unsigned long va) | 1084 | unsigned long va) |
| 989 | { | 1085 | { |
| 990 | PVOP_VCALL3(pv_mmu_ops.flush_tlb_others, &cpumask, mm, va); | 1086 | PVOP_VCALL3(pv_mmu_ops.flush_tlb_others, cpumask, mm, va); |
| 991 | } | 1087 | } |
| 992 | 1088 | ||
| 993 | static inline int paravirt_pgd_alloc(struct mm_struct *mm) | 1089 | static inline int paravirt_pgd_alloc(struct mm_struct *mm) |
| @@ -1059,13 +1155,13 @@ static inline pte_t __pte(pteval_t val) | |||
| 1059 | pteval_t ret; | 1155 | pteval_t ret; |
| 1060 | 1156 | ||
| 1061 | if (sizeof(pteval_t) > sizeof(long)) | 1157 | if (sizeof(pteval_t) > sizeof(long)) |
| 1062 | ret = PVOP_CALL2(pteval_t, | 1158 | ret = PVOP_CALLEE2(pteval_t, |
| 1063 | pv_mmu_ops.make_pte, | 1159 | pv_mmu_ops.make_pte, |
| 1064 | val, (u64)val >> 32); | 1160 | val, (u64)val >> 32); |
| 1065 | else | 1161 | else |
| 1066 | ret = PVOP_CALL1(pteval_t, | 1162 | ret = PVOP_CALLEE1(pteval_t, |
| 1067 | pv_mmu_ops.make_pte, | 1163 | pv_mmu_ops.make_pte, |
| 1068 | val); | 1164 | val); |
| 1069 | 1165 | ||
| 1070 | return (pte_t) { .pte = ret }; | 1166 | return (pte_t) { .pte = ret }; |
| 1071 | } | 1167 | } |
| @@ -1075,29 +1171,12 @@ static inline pteval_t pte_val(pte_t pte) | |||
| 1075 | pteval_t ret; | 1171 | pteval_t ret; |
| 1076 | 1172 | ||
| 1077 | if (sizeof(pteval_t) > sizeof(long)) | 1173 | if (sizeof(pteval_t) > sizeof(long)) |
| 1078 | ret = PVOP_CALL2(pteval_t, pv_mmu_ops.pte_val, | 1174 | ret = PVOP_CALLEE2(pteval_t, pv_mmu_ops.pte_val, |
| 1079 | pte.pte, (u64)pte.pte >> 32); | 1175 | pte.pte, (u64)pte.pte >> 32); |
| 1080 | else | ||
| 1081 | ret = PVOP_CALL1(pteval_t, pv_mmu_ops.pte_val, | ||
| 1082 | pte.pte); | ||
| 1083 | |||
| 1084 | return ret; | ||
| 1085 | } | ||
| 1086 | |||
| 1087 | static inline pteval_t pte_flags(pte_t pte) | ||
| 1088 | { | ||
| 1089 | pteval_t ret; | ||
| 1090 | |||
| 1091 | if (sizeof(pteval_t) > sizeof(long)) | ||
| 1092 | ret = PVOP_CALL2(pteval_t, pv_mmu_ops.pte_flags, | ||
| 1093 | pte.pte, (u64)pte.pte >> 32); | ||
| 1094 | else | 1176 | else |
| 1095 | ret = PVOP_CALL1(pteval_t, pv_mmu_ops.pte_flags, | 1177 | ret = PVOP_CALLEE1(pteval_t, pv_mmu_ops.pte_val, |
| 1096 | pte.pte); | 1178 | pte.pte); |
| 1097 | 1179 | ||
| 1098 | #ifdef CONFIG_PARAVIRT_DEBUG | ||
| 1099 | BUG_ON(ret & PTE_PFN_MASK); | ||
| 1100 | #endif | ||
| 1101 | return ret; | 1180 | return ret; |
| 1102 | } | 1181 | } |
| 1103 | 1182 | ||
| @@ -1106,11 +1185,11 @@ static inline pgd_t __pgd(pgdval_t val) | |||
| 1106 | pgdval_t ret; | 1185 | pgdval_t ret; |
| 1107 | 1186 | ||
| 1108 | if (sizeof(pgdval_t) > sizeof(long)) | 1187 | if (sizeof(pgdval_t) > sizeof(long)) |
| 1109 | ret = PVOP_CALL2(pgdval_t, pv_mmu_ops.make_pgd, | 1188 | ret = PVOP_CALLEE2(pgdval_t, pv_mmu_ops.make_pgd, |
| 1110 | val, (u64)val >> 32); | 1189 | val, (u64)val >> 32); |
| 1111 | else | 1190 | else |
| 1112 | ret = PVOP_CALL1(pgdval_t, pv_mmu_ops.make_pgd, | 1191 | ret = PVOP_CALLEE1(pgdval_t, pv_mmu_ops.make_pgd, |
| 1113 | val); | 1192 | val); |
| 1114 | 1193 | ||
| 1115 | return (pgd_t) { ret }; | 1194 | return (pgd_t) { ret }; |
| 1116 | } | 1195 | } |
| @@ -1120,11 +1199,11 @@ static inline pgdval_t pgd_val(pgd_t pgd) | |||
| 1120 | pgdval_t ret; | 1199 | pgdval_t ret; |
| 1121 | 1200 | ||
| 1122 | if (sizeof(pgdval_t) > sizeof(long)) | 1201 | if (sizeof(pgdval_t) > sizeof(long)) |
| 1123 | ret = PVOP_CALL2(pgdval_t, pv_mmu_ops.pgd_val, | 1202 | ret = PVOP_CALLEE2(pgdval_t, pv_mmu_ops.pgd_val, |
| 1124 | pgd.pgd, (u64)pgd.pgd >> 32); | 1203 | pgd.pgd, (u64)pgd.pgd >> 32); |
| 1125 | else | 1204 | else |
| 1126 | ret = PVOP_CALL1(pgdval_t, pv_mmu_ops.pgd_val, | 1205 | ret = PVOP_CALLEE1(pgdval_t, pv_mmu_ops.pgd_val, |
| 1127 | pgd.pgd); | 1206 | pgd.pgd); |
| 1128 | 1207 | ||
| 1129 | return ret; | 1208 | return ret; |
| 1130 | } | 1209 | } |
| @@ -1188,11 +1267,11 @@ static inline pmd_t __pmd(pmdval_t val) | |||
| 1188 | pmdval_t ret; | 1267 | pmdval_t ret; |
| 1189 | 1268 | ||
| 1190 | if (sizeof(pmdval_t) > sizeof(long)) | 1269 | if (sizeof(pmdval_t) > sizeof(long)) |
| 1191 | ret = PVOP_CALL2(pmdval_t, pv_mmu_ops.make_pmd, | 1270 | ret = PVOP_CALLEE2(pmdval_t, pv_mmu_ops.make_pmd, |
| 1192 | val, (u64)val >> 32); | 1271 | val, (u64)val >> 32); |
| 1193 | else | 1272 | else |
| 1194 | ret = PVOP_CALL1(pmdval_t, pv_mmu_ops.make_pmd, | 1273 | ret = PVOP_CALLEE1(pmdval_t, pv_mmu_ops.make_pmd, |
| 1195 | val); | 1274 | val); |
| 1196 | 1275 | ||
| 1197 | return (pmd_t) { ret }; | 1276 | return (pmd_t) { ret }; |
| 1198 | } | 1277 | } |
| @@ -1202,11 +1281,11 @@ static inline pmdval_t pmd_val(pmd_t pmd) | |||
| 1202 | pmdval_t ret; | 1281 | pmdval_t ret; |
| 1203 | 1282 | ||
| 1204 | if (sizeof(pmdval_t) > sizeof(long)) | 1283 | if (sizeof(pmdval_t) > sizeof(long)) |
| 1205 | ret = PVOP_CALL2(pmdval_t, pv_mmu_ops.pmd_val, | 1284 | ret = PVOP_CALLEE2(pmdval_t, pv_mmu_ops.pmd_val, |
| 1206 | pmd.pmd, (u64)pmd.pmd >> 32); | 1285 | pmd.pmd, (u64)pmd.pmd >> 32); |
| 1207 | else | 1286 | else |
| 1208 | ret = PVOP_CALL1(pmdval_t, pv_mmu_ops.pmd_val, | 1287 | ret = PVOP_CALLEE1(pmdval_t, pv_mmu_ops.pmd_val, |
| 1209 | pmd.pmd); | 1288 | pmd.pmd); |
| 1210 | 1289 | ||
| 1211 | return ret; | 1290 | return ret; |
| 1212 | } | 1291 | } |
| @@ -1228,11 +1307,11 @@ static inline pud_t __pud(pudval_t val) | |||
| 1228 | pudval_t ret; | 1307 | pudval_t ret; |
| 1229 | 1308 | ||
| 1230 | if (sizeof(pudval_t) > sizeof(long)) | 1309 | if (sizeof(pudval_t) > sizeof(long)) |
| 1231 | ret = PVOP_CALL2(pudval_t, pv_mmu_ops.make_pud, | 1310 | ret = PVOP_CALLEE2(pudval_t, pv_mmu_ops.make_pud, |
| 1232 | val, (u64)val >> 32); | 1311 | val, (u64)val >> 32); |
| 1233 | else | 1312 | else |
| 1234 | ret = PVOP_CALL1(pudval_t, pv_mmu_ops.make_pud, | 1313 | ret = PVOP_CALLEE1(pudval_t, pv_mmu_ops.make_pud, |
| 1235 | val); | 1314 | val); |
| 1236 | 1315 | ||
| 1237 | return (pud_t) { ret }; | 1316 | return (pud_t) { ret }; |
| 1238 | } | 1317 | } |
| @@ -1242,11 +1321,11 @@ static inline pudval_t pud_val(pud_t pud) | |||
| 1242 | pudval_t ret; | 1321 | pudval_t ret; |
| 1243 | 1322 | ||
| 1244 | if (sizeof(pudval_t) > sizeof(long)) | 1323 | if (sizeof(pudval_t) > sizeof(long)) |
| 1245 | ret = PVOP_CALL2(pudval_t, pv_mmu_ops.pud_val, | 1324 | ret = PVOP_CALLEE2(pudval_t, pv_mmu_ops.pud_val, |
| 1246 | pud.pud, (u64)pud.pud >> 32); | 1325 | pud.pud, (u64)pud.pud >> 32); |
| 1247 | else | 1326 | else |
| 1248 | ret = PVOP_CALL1(pudval_t, pv_mmu_ops.pud_val, | 1327 | ret = PVOP_CALLEE1(pudval_t, pv_mmu_ops.pud_val, |
| 1249 | pud.pud); | 1328 | pud.pud); |
| 1250 | 1329 | ||
| 1251 | return ret; | 1330 | return ret; |
| 1252 | } | 1331 | } |
| @@ -1374,9 +1453,10 @@ static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx, | |||
| 1374 | } | 1453 | } |
| 1375 | 1454 | ||
| 1376 | void _paravirt_nop(void); | 1455 | void _paravirt_nop(void); |
| 1377 | #define paravirt_nop ((void *)_paravirt_nop) | 1456 | u32 _paravirt_ident_32(u32); |
| 1457 | u64 _paravirt_ident_64(u64); | ||
| 1378 | 1458 | ||
| 1379 | void paravirt_use_bytelocks(void); | 1459 | #define paravirt_nop ((void *)_paravirt_nop) |
| 1380 | 1460 | ||
| 1381 | #ifdef CONFIG_SMP | 1461 | #ifdef CONFIG_SMP |
| 1382 | 1462 | ||
| @@ -1426,12 +1506,37 @@ extern struct paravirt_patch_site __parainstructions[], | |||
| 1426 | __parainstructions_end[]; | 1506 | __parainstructions_end[]; |
| 1427 | 1507 | ||
| 1428 | #ifdef CONFIG_X86_32 | 1508 | #ifdef CONFIG_X86_32 |
| 1429 | #define PV_SAVE_REGS "pushl %%ecx; pushl %%edx;" | 1509 | #define PV_SAVE_REGS "pushl %ecx; pushl %edx;" |
| 1430 | #define PV_RESTORE_REGS "popl %%edx; popl %%ecx" | 1510 | #define PV_RESTORE_REGS "popl %edx; popl %ecx;" |
| 1511 | |||
| 1512 | /* save and restore all caller-save registers, except return value */ | ||
| 1513 | #define PV_SAVE_ALL_CALLER_REGS "pushl %ecx;" | ||
| 1514 | #define PV_RESTORE_ALL_CALLER_REGS "popl %ecx;" | ||
| 1515 | |||
| 1431 | #define PV_FLAGS_ARG "0" | 1516 | #define PV_FLAGS_ARG "0" |
| 1432 | #define PV_EXTRA_CLOBBERS | 1517 | #define PV_EXTRA_CLOBBERS |
| 1433 | #define PV_VEXTRA_CLOBBERS | 1518 | #define PV_VEXTRA_CLOBBERS |
| 1434 | #else | 1519 | #else |
| 1520 | /* save and restore all caller-save registers, except return value */ | ||
| 1521 | #define PV_SAVE_ALL_CALLER_REGS \ | ||
| 1522 | "push %rcx;" \ | ||
| 1523 | "push %rdx;" \ | ||
| 1524 | "push %rsi;" \ | ||
| 1525 | "push %rdi;" \ | ||
| 1526 | "push %r8;" \ | ||
| 1527 | "push %r9;" \ | ||
| 1528 | "push %r10;" \ | ||
| 1529 | "push %r11;" | ||
| 1530 | #define PV_RESTORE_ALL_CALLER_REGS \ | ||
| 1531 | "pop %r11;" \ | ||
| 1532 | "pop %r10;" \ | ||
| 1533 | "pop %r9;" \ | ||
| 1534 | "pop %r8;" \ | ||
| 1535 | "pop %rdi;" \ | ||
| 1536 | "pop %rsi;" \ | ||
| 1537 | "pop %rdx;" \ | ||
| 1538 | "pop %rcx;" | ||
| 1539 | |||
| 1435 | /* We save some registers, but all of them, that's too much. We clobber all | 1540 | /* We save some registers, but all of them, that's too much. We clobber all |
| 1436 | * caller saved registers but the argument parameter */ | 1541 | * caller saved registers but the argument parameter */ |
| 1437 | #define PV_SAVE_REGS "pushq %%rdi;" | 1542 | #define PV_SAVE_REGS "pushq %%rdi;" |
| @@ -1441,52 +1546,76 @@ extern struct paravirt_patch_site __parainstructions[], | |||
| 1441 | #define PV_FLAGS_ARG "D" | 1546 | #define PV_FLAGS_ARG "D" |
| 1442 | #endif | 1547 | #endif |
| 1443 | 1548 | ||
| 1549 | /* | ||
| 1550 | * Generate a thunk around a function which saves all caller-save | ||
| 1551 | * registers except for the return value. This allows C functions to | ||
| 1552 | * be called from assembler code where fewer than normal registers are | ||
| 1553 | * available. It may also help code generation around calls from C | ||
| 1554 | * code if the common case doesn't use many registers. | ||
| 1555 | * | ||
| 1556 | * When a callee is wrapped in a thunk, the caller can assume that all | ||
| 1557 | * arg regs and all scratch registers are preserved across the | ||
| 1558 | * call. The return value in rax/eax will not be saved, even for void | ||
| 1559 | * functions. | ||
| 1560 | */ | ||
| 1561 | #define PV_CALLEE_SAVE_REGS_THUNK(func) \ | ||
| 1562 | extern typeof(func) __raw_callee_save_##func; \ | ||
| 1563 | static void *__##func##__ __used = func; \ | ||
| 1564 | \ | ||
| 1565 | asm(".pushsection .text;" \ | ||
| 1566 | "__raw_callee_save_" #func ": " \ | ||
| 1567 | PV_SAVE_ALL_CALLER_REGS \ | ||
| 1568 | "call " #func ";" \ | ||
| 1569 | PV_RESTORE_ALL_CALLER_REGS \ | ||
| 1570 | "ret;" \ | ||
| 1571 | ".popsection") | ||
| 1572 | |||
| 1573 | /* Get a reference to a callee-save function */ | ||
| 1574 | #define PV_CALLEE_SAVE(func) \ | ||
| 1575 | ((struct paravirt_callee_save) { __raw_callee_save_##func }) | ||
| 1576 | |||
| 1577 | /* Promise that "func" already uses the right calling convention */ | ||
| 1578 | #define __PV_IS_CALLEE_SAVE(func) \ | ||
| 1579 | ((struct paravirt_callee_save) { func }) | ||
| 1580 | |||
| 1444 | static inline unsigned long __raw_local_save_flags(void) | 1581 | static inline unsigned long __raw_local_save_flags(void) |
| 1445 | { | 1582 | { |
| 1446 | unsigned long f; | 1583 | unsigned long f; |
| 1447 | 1584 | ||
| 1448 | asm volatile(paravirt_alt(PV_SAVE_REGS | 1585 | asm volatile(paravirt_alt(PARAVIRT_CALL) |
| 1449 | PARAVIRT_CALL | ||
| 1450 | PV_RESTORE_REGS) | ||
| 1451 | : "=a"(f) | 1586 | : "=a"(f) |
| 1452 | : paravirt_type(pv_irq_ops.save_fl), | 1587 | : paravirt_type(pv_irq_ops.save_fl), |
| 1453 | paravirt_clobber(CLBR_EAX) | 1588 | paravirt_clobber(CLBR_EAX) |
| 1454 | : "memory", "cc" PV_VEXTRA_CLOBBERS); | 1589 | : "memory", "cc"); |
| 1455 | return f; | 1590 | return f; |
| 1456 | } | 1591 | } |
| 1457 | 1592 | ||
| 1458 | static inline void raw_local_irq_restore(unsigned long f) | 1593 | static inline void raw_local_irq_restore(unsigned long f) |
| 1459 | { | 1594 | { |
| 1460 | asm volatile(paravirt_alt(PV_SAVE_REGS | 1595 | asm volatile(paravirt_alt(PARAVIRT_CALL) |
| 1461 | PARAVIRT_CALL | ||
| 1462 | PV_RESTORE_REGS) | ||
| 1463 | : "=a"(f) | 1596 | : "=a"(f) |
| 1464 | : PV_FLAGS_ARG(f), | 1597 | : PV_FLAGS_ARG(f), |
| 1465 | paravirt_type(pv_irq_ops.restore_fl), | 1598 | paravirt_type(pv_irq_ops.restore_fl), |
| 1466 | paravirt_clobber(CLBR_EAX) | 1599 | paravirt_clobber(CLBR_EAX) |
| 1467 | : "memory", "cc" PV_EXTRA_CLOBBERS); | 1600 | : "memory", "cc"); |
| 1468 | } | 1601 | } |
| 1469 | 1602 | ||
| 1470 | static inline void raw_local_irq_disable(void) | 1603 | static inline void raw_local_irq_disable(void) |
| 1471 | { | 1604 | { |
| 1472 | asm volatile(paravirt_alt(PV_SAVE_REGS | 1605 | asm volatile(paravirt_alt(PARAVIRT_CALL) |
| 1473 | PARAVIRT_CALL | ||
| 1474 | PV_RESTORE_REGS) | ||
| 1475 | : | 1606 | : |
| 1476 | : paravirt_type(pv_irq_ops.irq_disable), | 1607 | : paravirt_type(pv_irq_ops.irq_disable), |
| 1477 | paravirt_clobber(CLBR_EAX) | 1608 | paravirt_clobber(CLBR_EAX) |
| 1478 | : "memory", "eax", "cc" PV_EXTRA_CLOBBERS); | 1609 | : "memory", "eax", "cc"); |
| 1479 | } | 1610 | } |
| 1480 | 1611 | ||
| 1481 | static inline void raw_local_irq_enable(void) | 1612 | static inline void raw_local_irq_enable(void) |
| 1482 | { | 1613 | { |
| 1483 | asm volatile(paravirt_alt(PV_SAVE_REGS | 1614 | asm volatile(paravirt_alt(PARAVIRT_CALL) |
| 1484 | PARAVIRT_CALL | ||
| 1485 | PV_RESTORE_REGS) | ||
| 1486 | : | 1615 | : |
| 1487 | : paravirt_type(pv_irq_ops.irq_enable), | 1616 | : paravirt_type(pv_irq_ops.irq_enable), |
| 1488 | paravirt_clobber(CLBR_EAX) | 1617 | paravirt_clobber(CLBR_EAX) |
| 1489 | : "memory", "eax", "cc" PV_EXTRA_CLOBBERS); | 1618 | : "memory", "eax", "cc"); |
| 1490 | } | 1619 | } |
| 1491 | 1620 | ||
| 1492 | static inline unsigned long __raw_local_irq_save(void) | 1621 | static inline unsigned long __raw_local_irq_save(void) |
| @@ -1529,33 +1658,49 @@ static inline unsigned long __raw_local_irq_save(void) | |||
| 1529 | .popsection | 1658 | .popsection |
| 1530 | 1659 | ||
| 1531 | 1660 | ||
| 1661 | #define COND_PUSH(set, mask, reg) \ | ||
| 1662 | .if ((~(set)) & mask); push %reg; .endif | ||
| 1663 | #define COND_POP(set, mask, reg) \ | ||
| 1664 | .if ((~(set)) & mask); pop %reg; .endif | ||
| 1665 | |||
| 1532 | #ifdef CONFIG_X86_64 | 1666 | #ifdef CONFIG_X86_64 |
| 1533 | #define PV_SAVE_REGS \ | 1667 | |
| 1534 | push %rax; \ | 1668 | #define PV_SAVE_REGS(set) \ |
| 1535 | push %rcx; \ | 1669 | COND_PUSH(set, CLBR_RAX, rax); \ |
| 1536 | push %rdx; \ | 1670 | COND_PUSH(set, CLBR_RCX, rcx); \ |
| 1537 | push %rsi; \ | 1671 | COND_PUSH(set, CLBR_RDX, rdx); \ |
| 1538 | push %rdi; \ | 1672 | COND_PUSH(set, CLBR_RSI, rsi); \ |
| 1539 | push %r8; \ | 1673 | COND_PUSH(set, CLBR_RDI, rdi); \ |
| 1540 | push %r9; \ | 1674 | COND_PUSH(set, CLBR_R8, r8); \ |
| 1541 | push %r10; \ | 1675 | COND_PUSH(set, CLBR_R9, r9); \ |
| 1542 | push %r11 | 1676 | COND_PUSH(set, CLBR_R10, r10); \ |
| 1543 | #define PV_RESTORE_REGS \ | 1677 | COND_PUSH(set, CLBR_R11, r11) |
| 1544 | pop %r11; \ | 1678 | #define PV_RESTORE_REGS(set) \ |
| 1545 | pop %r10; \ | 1679 | COND_POP(set, CLBR_R11, r11); \ |
| 1546 | pop %r9; \ | 1680 | COND_POP(set, CLBR_R10, r10); \ |
| 1547 | pop %r8; \ | 1681 | COND_POP(set, CLBR_R9, r9); \ |
| 1548 | pop %rdi; \ | 1682 | COND_POP(set, CLBR_R8, r8); \ |
| 1549 | pop %rsi; \ | 1683 | COND_POP(set, CLBR_RDI, rdi); \ |
| 1550 | pop %rdx; \ | 1684 | COND_POP(set, CLBR_RSI, rsi); \ |
| 1551 | pop %rcx; \ | 1685 | COND_POP(set, CLBR_RDX, rdx); \ |
| 1552 | pop %rax | 1686 | COND_POP(set, CLBR_RCX, rcx); \ |
| 1687 | COND_POP(set, CLBR_RAX, rax) | ||
| 1688 | |||
| 1553 | #define PARA_PATCH(struct, off) ((PARAVIRT_PATCH_##struct + (off)) / 8) | 1689 | #define PARA_PATCH(struct, off) ((PARAVIRT_PATCH_##struct + (off)) / 8) |
| 1554 | #define PARA_SITE(ptype, clobbers, ops) _PVSITE(ptype, clobbers, ops, .quad, 8) | 1690 | #define PARA_SITE(ptype, clobbers, ops) _PVSITE(ptype, clobbers, ops, .quad, 8) |
| 1555 | #define PARA_INDIRECT(addr) *addr(%rip) | 1691 | #define PARA_INDIRECT(addr) *addr(%rip) |
| 1556 | #else | 1692 | #else |
| 1557 | #define PV_SAVE_REGS pushl %eax; pushl %edi; pushl %ecx; pushl %edx | 1693 | #define PV_SAVE_REGS(set) \ |
| 1558 | #define PV_RESTORE_REGS popl %edx; popl %ecx; popl %edi; popl %eax | 1694 | COND_PUSH(set, CLBR_EAX, eax); \ |
| 1695 | COND_PUSH(set, CLBR_EDI, edi); \ | ||
| 1696 | COND_PUSH(set, CLBR_ECX, ecx); \ | ||
| 1697 | COND_PUSH(set, CLBR_EDX, edx) | ||
| 1698 | #define PV_RESTORE_REGS(set) \ | ||
| 1699 | COND_POP(set, CLBR_EDX, edx); \ | ||
| 1700 | COND_POP(set, CLBR_ECX, ecx); \ | ||
| 1701 | COND_POP(set, CLBR_EDI, edi); \ | ||
| 1702 | COND_POP(set, CLBR_EAX, eax) | ||
| 1703 | |||
| 1559 | #define PARA_PATCH(struct, off) ((PARAVIRT_PATCH_##struct + (off)) / 4) | 1704 | #define PARA_PATCH(struct, off) ((PARAVIRT_PATCH_##struct + (off)) / 4) |
| 1560 | #define PARA_SITE(ptype, clobbers, ops) _PVSITE(ptype, clobbers, ops, .long, 4) | 1705 | #define PARA_SITE(ptype, clobbers, ops) _PVSITE(ptype, clobbers, ops, .long, 4) |
| 1561 | #define PARA_INDIRECT(addr) *%cs:addr | 1706 | #define PARA_INDIRECT(addr) *%cs:addr |
| @@ -1567,15 +1712,15 @@ static inline unsigned long __raw_local_irq_save(void) | |||
| 1567 | 1712 | ||
| 1568 | #define DISABLE_INTERRUPTS(clobbers) \ | 1713 | #define DISABLE_INTERRUPTS(clobbers) \ |
| 1569 | PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_irq_disable), clobbers, \ | 1714 | PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_irq_disable), clobbers, \ |
| 1570 | PV_SAVE_REGS; \ | 1715 | PV_SAVE_REGS(clobbers | CLBR_CALLEE_SAVE); \ |
| 1571 | call PARA_INDIRECT(pv_irq_ops+PV_IRQ_irq_disable); \ | 1716 | call PARA_INDIRECT(pv_irq_ops+PV_IRQ_irq_disable); \ |
| 1572 | PV_RESTORE_REGS;) \ | 1717 | PV_RESTORE_REGS(clobbers | CLBR_CALLEE_SAVE);) |
| 1573 | 1718 | ||
| 1574 | #define ENABLE_INTERRUPTS(clobbers) \ | 1719 | #define ENABLE_INTERRUPTS(clobbers) \ |
| 1575 | PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_irq_enable), clobbers, \ | 1720 | PARA_SITE(PARA_PATCH(pv_irq_ops, PV_IRQ_irq_enable), clobbers, \ |
| 1576 | PV_SAVE_REGS; \ | 1721 | PV_SAVE_REGS(clobbers | CLBR_CALLEE_SAVE); \ |
| 1577 | call PARA_INDIRECT(pv_irq_ops+PV_IRQ_irq_enable); \ | 1722 | call PARA_INDIRECT(pv_irq_ops+PV_IRQ_irq_enable); \ |
| 1578 | PV_RESTORE_REGS;) | 1723 | PV_RESTORE_REGS(clobbers | CLBR_CALLEE_SAVE);) |
| 1579 | 1724 | ||
| 1580 | #define USERGS_SYSRET32 \ | 1725 | #define USERGS_SYSRET32 \ |
| 1581 | PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_usergs_sysret32), \ | 1726 | PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_usergs_sysret32), \ |
| @@ -1605,11 +1750,15 @@ static inline unsigned long __raw_local_irq_save(void) | |||
| 1605 | PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_swapgs), CLBR_NONE, \ | 1750 | PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_swapgs), CLBR_NONE, \ |
| 1606 | swapgs) | 1751 | swapgs) |
| 1607 | 1752 | ||
| 1753 | /* | ||
| 1754 | * Note: swapgs is very special, and in practise is either going to be | ||
| 1755 | * implemented with a single "swapgs" instruction or something very | ||
| 1756 | * special. Either way, we don't need to save any registers for | ||
| 1757 | * it. | ||
| 1758 | */ | ||
| 1608 | #define SWAPGS \ | 1759 | #define SWAPGS \ |
| 1609 | PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_swapgs), CLBR_NONE, \ | 1760 | PARA_SITE(PARA_PATCH(pv_cpu_ops, PV_CPU_swapgs), CLBR_NONE, \ |
| 1610 | PV_SAVE_REGS; \ | 1761 | call PARA_INDIRECT(pv_cpu_ops+PV_CPU_swapgs) \ |
| 1611 | call PARA_INDIRECT(pv_cpu_ops+PV_CPU_swapgs); \ | ||
| 1612 | PV_RESTORE_REGS \ | ||
| 1613 | ) | 1762 | ) |
| 1614 | 1763 | ||
| 1615 | #define GET_CR2_INTO_RCX \ | 1764 | #define GET_CR2_INTO_RCX \ |
diff --git a/arch/x86/include/asm/pat.h b/arch/x86/include/asm/pat.h index b8493b3b9890..9709fdff6615 100644 --- a/arch/x86/include/asm/pat.h +++ b/arch/x86/include/asm/pat.h | |||
| @@ -5,10 +5,8 @@ | |||
| 5 | 5 | ||
| 6 | #ifdef CONFIG_X86_PAT | 6 | #ifdef CONFIG_X86_PAT |
| 7 | extern int pat_enabled; | 7 | extern int pat_enabled; |
| 8 | extern void validate_pat_support(struct cpuinfo_x86 *c); | ||
| 9 | #else | 8 | #else |
| 10 | static const int pat_enabled; | 9 | static const int pat_enabled; |
| 11 | static inline void validate_pat_support(struct cpuinfo_x86 *c) { } | ||
| 12 | #endif | 10 | #endif |
| 13 | 11 | ||
| 14 | extern void pat_init(void); | 12 | extern void pat_init(void); |
| @@ -17,6 +15,4 @@ extern int reserve_memtype(u64 start, u64 end, | |||
| 17 | unsigned long req_type, unsigned long *ret_type); | 15 | unsigned long req_type, unsigned long *ret_type); |
| 18 | extern int free_memtype(u64 start, u64 end); | 16 | extern int free_memtype(u64 start, u64 end); |
| 19 | 17 | ||
| 20 | extern void pat_disable(char *reason); | ||
| 21 | |||
| 22 | #endif /* _ASM_X86_PAT_H */ | 18 | #endif /* _ASM_X86_PAT_H */ |
diff --git a/arch/x86/include/asm/mach-default/pci-functions.h b/arch/x86/include/asm/pci-functions.h index ed0bab427354..ed0bab427354 100644 --- a/arch/x86/include/asm/mach-default/pci-functions.h +++ b/arch/x86/include/asm/pci-functions.h | |||
diff --git a/arch/x86/include/asm/pda.h b/arch/x86/include/asm/pda.h deleted file mode 100644 index 2fbfff88df37..000000000000 --- a/arch/x86/include/asm/pda.h +++ /dev/null | |||
| @@ -1,137 +0,0 @@ | |||
| 1 | #ifndef _ASM_X86_PDA_H | ||
| 2 | #define _ASM_X86_PDA_H | ||
| 3 | |||
| 4 | #ifndef __ASSEMBLY__ | ||
| 5 | #include <linux/stddef.h> | ||
| 6 | #include <linux/types.h> | ||
| 7 | #include <linux/cache.h> | ||
| 8 | #include <asm/page.h> | ||
| 9 | |||
| 10 | /* Per processor datastructure. %gs points to it while the kernel runs */ | ||
| 11 | struct x8664_pda { | ||
| 12 | struct task_struct *pcurrent; /* 0 Current process */ | ||
| 13 | unsigned long data_offset; /* 8 Per cpu data offset from linker | ||
| 14 | address */ | ||
| 15 | unsigned long kernelstack; /* 16 top of kernel stack for current */ | ||
| 16 | unsigned long oldrsp; /* 24 user rsp for system call */ | ||
| 17 | int irqcount; /* 32 Irq nesting counter. Starts -1 */ | ||
| 18 | unsigned int cpunumber; /* 36 Logical CPU number */ | ||
| 19 | #ifdef CONFIG_CC_STACKPROTECTOR | ||
| 20 | unsigned long stack_canary; /* 40 stack canary value */ | ||
| 21 | /* gcc-ABI: this canary MUST be at | ||
| 22 | offset 40!!! */ | ||
| 23 | #endif | ||
| 24 | char *irqstackptr; | ||
| 25 | short nodenumber; /* number of current node (32k max) */ | ||
| 26 | short in_bootmem; /* pda lives in bootmem */ | ||
| 27 | unsigned int __softirq_pending; | ||
| 28 | unsigned int __nmi_count; /* number of NMI on this CPUs */ | ||
| 29 | short mmu_state; | ||
| 30 | short isidle; | ||
| 31 | struct mm_struct *active_mm; | ||
| 32 | unsigned apic_timer_irqs; | ||
| 33 | unsigned irq0_irqs; | ||
| 34 | unsigned irq_resched_count; | ||
| 35 | unsigned irq_call_count; | ||
| 36 | unsigned irq_tlb_count; | ||
| 37 | unsigned irq_thermal_count; | ||
| 38 | unsigned irq_threshold_count; | ||
| 39 | unsigned irq_spurious_count; | ||
| 40 | } ____cacheline_aligned_in_smp; | ||
| 41 | |||
| 42 | extern struct x8664_pda **_cpu_pda; | ||
| 43 | extern void pda_init(int); | ||
| 44 | |||
| 45 | #define cpu_pda(i) (_cpu_pda[i]) | ||
| 46 | |||
| 47 | /* | ||
| 48 | * There is no fast way to get the base address of the PDA, all the accesses | ||
| 49 | * have to mention %fs/%gs. So it needs to be done this Torvaldian way. | ||
| 50 | */ | ||
| 51 | extern void __bad_pda_field(void) __attribute__((noreturn)); | ||
| 52 | |||
| 53 | /* | ||
| 54 | * proxy_pda doesn't actually exist, but tell gcc it is accessed for | ||
| 55 | * all PDA accesses so it gets read/write dependencies right. | ||
| 56 | */ | ||
| 57 | extern struct x8664_pda _proxy_pda; | ||
| 58 | |||
| 59 | #define pda_offset(field) offsetof(struct x8664_pda, field) | ||
| 60 | |||
| 61 | #define pda_to_op(op, field, val) \ | ||
| 62 | do { \ | ||
| 63 | typedef typeof(_proxy_pda.field) T__; \ | ||
| 64 | if (0) { T__ tmp__; tmp__ = (val); } /* type checking */ \ | ||
| 65 | switch (sizeof(_proxy_pda.field)) { \ | ||
| 66 | case 2: \ | ||
| 67 | asm(op "w %1,%%gs:%c2" : \ | ||
| 68 | "+m" (_proxy_pda.field) : \ | ||
| 69 | "ri" ((T__)val), \ | ||
| 70 | "i"(pda_offset(field))); \ | ||
| 71 | break; \ | ||
| 72 | case 4: \ | ||
| 73 | asm(op "l %1,%%gs:%c2" : \ | ||
| 74 | "+m" (_proxy_pda.field) : \ | ||
| 75 | "ri" ((T__)val), \ | ||
| 76 | "i" (pda_offset(field))); \ | ||
| 77 | break; \ | ||
| 78 | case 8: \ | ||
| 79 | asm(op "q %1,%%gs:%c2": \ | ||
| 80 | "+m" (_proxy_pda.field) : \ | ||
| 81 | "ri" ((T__)val), \ | ||
| 82 | "i"(pda_offset(field))); \ | ||
| 83 | break; \ | ||
| 84 | default: \ | ||
| 85 | __bad_pda_field(); \ | ||
| 86 | } \ | ||
| 87 | } while (0) | ||
| 88 | |||
| 89 | #define pda_from_op(op, field) \ | ||
| 90 | ({ \ | ||
| 91 | typeof(_proxy_pda.field) ret__; \ | ||
| 92 | switch (sizeof(_proxy_pda.field)) { \ | ||
| 93 | case 2: \ | ||
| 94 | asm(op "w %%gs:%c1,%0" : \ | ||
| 95 | "=r" (ret__) : \ | ||
| 96 | "i" (pda_offset(field)), \ | ||
| 97 | "m" (_proxy_pda.field)); \ | ||
| 98 | break; \ | ||
| 99 | case 4: \ | ||
| 100 | asm(op "l %%gs:%c1,%0": \ | ||
| 101 | "=r" (ret__): \ | ||
| 102 | "i" (pda_offset(field)), \ | ||
| 103 | "m" (_proxy_pda.field)); \ | ||
| 104 | break; \ | ||
| 105 | case 8: \ | ||
| 106 | asm(op "q %%gs:%c1,%0": \ | ||
| 107 | "=r" (ret__) : \ | ||
| 108 | "i" (pda_offset(field)), \ | ||
| 109 | "m" (_proxy_pda.field)); \ | ||
| 110 | break; \ | ||
| 111 | default: \ | ||
| 112 | __bad_pda_field(); \ | ||
| 113 | } \ | ||
| 114 | ret__; \ | ||
| 115 | }) | ||
| 116 | |||
| 117 | #define read_pda(field) pda_from_op("mov", field) | ||
| 118 | #define write_pda(field, val) pda_to_op("mov", field, val) | ||
| 119 | #define add_pda(field, val) pda_to_op("add", field, val) | ||
| 120 | #define sub_pda(field, val) pda_to_op("sub", field, val) | ||
| 121 | #define or_pda(field, val) pda_to_op("or", field, val) | ||
| 122 | |||
| 123 | /* This is not atomic against other CPUs -- CPU preemption needs to be off */ | ||
| 124 | #define test_and_clear_bit_pda(bit, field) \ | ||
| 125 | ({ \ | ||
| 126 | int old__; \ | ||
| 127 | asm volatile("btr %2,%%gs:%c3\n\tsbbl %0,%0" \ | ||
| 128 | : "=r" (old__), "+m" (_proxy_pda.field) \ | ||
| 129 | : "dIr" (bit), "i" (pda_offset(field)) : "memory");\ | ||
| 130 | old__; \ | ||
| 131 | }) | ||
| 132 | |||
| 133 | #endif | ||
| 134 | |||
| 135 | #define PDA_STACKOFFSET (5*8) | ||
| 136 | |||
| 137 | #endif /* _ASM_X86_PDA_H */ | ||
diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h index ece72053ba63..aee103b26d01 100644 --- a/arch/x86/include/asm/percpu.h +++ b/arch/x86/include/asm/percpu.h | |||
| @@ -2,53 +2,12 @@ | |||
| 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 | #define __percpu_seg gs |
| 6 | 6 | #define __percpu_mov_op movq | |
| 7 | /* Same as asm-generic/percpu.h, except that we store the per cpu offset | 7 | #else |
| 8 | in the PDA. Longer term the PDA and every per cpu variable | 8 | #define __percpu_seg fs |
| 9 | should be just put into a single section and referenced directly | 9 | #define __percpu_mov_op movl |
| 10 | from %gs */ | ||
| 11 | |||
| 12 | #ifdef CONFIG_SMP | ||
| 13 | #include <asm/pda.h> | ||
| 14 | |||
| 15 | #define __per_cpu_offset(cpu) (cpu_pda(cpu)->data_offset) | ||
| 16 | #define __my_cpu_offset read_pda(data_offset) | ||
| 17 | |||
| 18 | #define per_cpu_offset(x) (__per_cpu_offset(x)) | ||
| 19 | |||
| 20 | #endif | 10 | #endif |
| 21 | #include <asm-generic/percpu.h> | ||
| 22 | |||
| 23 | DECLARE_PER_CPU(struct x8664_pda, pda); | ||
| 24 | |||
| 25 | /* | ||
| 26 | * These are supposed to be implemented as a single instruction which | ||
| 27 | * operates on the per-cpu data base segment. x86-64 doesn't have | ||
| 28 | * that yet, so this is a fairly inefficient workaround for the | ||
| 29 | * meantime. The single instruction is atomic with respect to | ||
| 30 | * preemption and interrupts, so we need to explicitly disable | ||
| 31 | * interrupts here to achieve the same effect. However, because it | ||
| 32 | * can be used from within interrupt-disable/enable, we can't actually | ||
| 33 | * disable interrupts; disabling preemption is enough. | ||
| 34 | */ | ||
| 35 | #define x86_read_percpu(var) \ | ||
| 36 | ({ \ | ||
| 37 | typeof(per_cpu_var(var)) __tmp; \ | ||
| 38 | preempt_disable(); \ | ||
| 39 | __tmp = __get_cpu_var(var); \ | ||
| 40 | preempt_enable(); \ | ||
| 41 | __tmp; \ | ||
| 42 | }) | ||
| 43 | |||
| 44 | #define x86_write_percpu(var, val) \ | ||
| 45 | do { \ | ||
| 46 | preempt_disable(); \ | ||
| 47 | __get_cpu_var(var) = (val); \ | ||
| 48 | preempt_enable(); \ | ||
| 49 | } while(0) | ||
| 50 | |||
| 51 | #else /* CONFIG_X86_64 */ | ||
| 52 | 11 | ||
| 53 | #ifdef __ASSEMBLY__ | 12 | #ifdef __ASSEMBLY__ |
| 54 | 13 | ||
| @@ -65,47 +24,48 @@ DECLARE_PER_CPU(struct x8664_pda, pda); | |||
| 65 | * PER_CPU(cpu_gdt_descr, %ebx) | 24 | * PER_CPU(cpu_gdt_descr, %ebx) |
| 66 | */ | 25 | */ |
| 67 | #ifdef CONFIG_SMP | 26 | #ifdef CONFIG_SMP |
| 68 | #define PER_CPU(var, reg) \ | 27 | #define PER_CPU(var, reg) \ |
| 69 | movl %fs:per_cpu__##this_cpu_off, reg; \ | 28 | __percpu_mov_op %__percpu_seg:per_cpu__this_cpu_off, reg; \ |
| 70 | lea per_cpu__##var(reg), reg | 29 | lea per_cpu__##var(reg), reg |
| 71 | #define PER_CPU_VAR(var) %fs:per_cpu__##var | 30 | #define PER_CPU_VAR(var) %__percpu_seg:per_cpu__##var |
| 72 | #else /* ! SMP */ | 31 | #else /* ! SMP */ |
| 73 | #define PER_CPU(var, reg) \ | 32 | #define PER_CPU(var, reg) \ |
| 74 | movl $per_cpu__##var, reg | 33 | __percpu_mov_op $per_cpu__##var, reg |
| 75 | #define PER_CPU_VAR(var) per_cpu__##var | 34 | #define PER_CPU_VAR(var) per_cpu__##var |
| 76 | #endif /* SMP */ | 35 | #endif /* SMP */ |
| 77 | 36 | ||
| 37 | #ifdef CONFIG_X86_64_SMP | ||
| 38 | #define INIT_PER_CPU_VAR(var) init_per_cpu__##var | ||
| 39 | #else | ||
| 40 | #define INIT_PER_CPU_VAR(var) per_cpu__##var | ||
| 41 | #endif | ||
| 42 | |||
| 78 | #else /* ...!ASSEMBLY */ | 43 | #else /* ...!ASSEMBLY */ |
| 79 | 44 | ||
| 45 | #include <linux/stringify.h> | ||
| 46 | |||
| 47 | #ifdef CONFIG_SMP | ||
| 48 | #define __percpu_arg(x) "%%"__stringify(__percpu_seg)":%P" #x | ||
| 49 | #define __my_cpu_offset percpu_read(this_cpu_off) | ||
| 50 | #else | ||
| 51 | #define __percpu_arg(x) "%" #x | ||
| 52 | #endif | ||
| 53 | |||
| 80 | /* | 54 | /* |
| 81 | * PER_CPU finds an address of a per-cpu variable. | 55 | * Initialized pointers to per-cpu variables needed for the boot |
| 56 | * processor need to use these macros to get the proper address | ||
| 57 | * offset from __per_cpu_load on SMP. | ||
| 82 | * | 58 | * |
| 83 | * Args: | 59 | * There also must be an entry in vmlinux_64.lds.S |
| 84 | * var - variable name | ||
| 85 | * cpu - 32bit register containing the current CPU number | ||
| 86 | * | ||
| 87 | * The resulting address is stored in the "cpu" argument. | ||
| 88 | * | ||
| 89 | * Example: | ||
| 90 | * PER_CPU(cpu_gdt_descr, %ebx) | ||
| 91 | */ | 60 | */ |
| 92 | #ifdef CONFIG_SMP | 61 | #define DECLARE_INIT_PER_CPU(var) \ |
| 93 | 62 | extern typeof(per_cpu_var(var)) init_per_cpu_var(var) | |
| 94 | #define __my_cpu_offset x86_read_percpu(this_cpu_off) | ||
| 95 | |||
| 96 | /* fs segment starts at (positive) offset == __per_cpu_offset[cpu] */ | ||
| 97 | #define __percpu_seg "%%fs:" | ||
| 98 | |||
| 99 | #else /* !SMP */ | ||
| 100 | |||
| 101 | #define __percpu_seg "" | ||
| 102 | |||
| 103 | #endif /* SMP */ | ||
| 104 | |||
| 105 | #include <asm-generic/percpu.h> | ||
| 106 | 63 | ||
| 107 | /* We can use this directly for local CPU (faster). */ | 64 | #ifdef CONFIG_X86_64_SMP |
| 108 | DECLARE_PER_CPU(unsigned long, this_cpu_off); | 65 | #define init_per_cpu_var(var) init_per_cpu__##var |
| 66 | #else | ||
| 67 | #define init_per_cpu_var(var) per_cpu_var(var) | ||
| 68 | #endif | ||
| 109 | 69 | ||
| 110 | /* For arch-specific code, we can use direct single-insn ops (they | 70 | /* For arch-specific code, we can use direct single-insn ops (they |
| 111 | * don't give an lvalue though). */ | 71 | * don't give an lvalue though). */ |
| @@ -120,20 +80,25 @@ do { \ | |||
| 120 | } \ | 80 | } \ |
| 121 | switch (sizeof(var)) { \ | 81 | switch (sizeof(var)) { \ |
| 122 | case 1: \ | 82 | case 1: \ |
| 123 | asm(op "b %1,"__percpu_seg"%0" \ | 83 | asm(op "b %1,"__percpu_arg(0) \ |
| 124 | : "+m" (var) \ | 84 | : "+m" (var) \ |
| 125 | : "ri" ((T__)val)); \ | 85 | : "ri" ((T__)val)); \ |
| 126 | break; \ | 86 | break; \ |
| 127 | case 2: \ | 87 | case 2: \ |
| 128 | asm(op "w %1,"__percpu_seg"%0" \ | 88 | asm(op "w %1,"__percpu_arg(0) \ |
| 129 | : "+m" (var) \ | 89 | : "+m" (var) \ |
| 130 | : "ri" ((T__)val)); \ | 90 | : "ri" ((T__)val)); \ |
| 131 | break; \ | 91 | break; \ |
| 132 | case 4: \ | 92 | case 4: \ |
| 133 | asm(op "l %1,"__percpu_seg"%0" \ | 93 | asm(op "l %1,"__percpu_arg(0) \ |
| 134 | : "+m" (var) \ | 94 | : "+m" (var) \ |
| 135 | : "ri" ((T__)val)); \ | 95 | : "ri" ((T__)val)); \ |
| 136 | break; \ | 96 | break; \ |
| 97 | case 8: \ | ||
| 98 | asm(op "q %1,"__percpu_arg(0) \ | ||
| 99 | : "+m" (var) \ | ||
| 100 | : "re" ((T__)val)); \ | ||
| 101 | break; \ | ||
| 137 | default: __bad_percpu_size(); \ | 102 | default: __bad_percpu_size(); \ |
| 138 | } \ | 103 | } \ |
| 139 | } while (0) | 104 | } while (0) |
| @@ -143,17 +108,22 @@ do { \ | |||
| 143 | typeof(var) ret__; \ | 108 | typeof(var) ret__; \ |
| 144 | switch (sizeof(var)) { \ | 109 | switch (sizeof(var)) { \ |
| 145 | case 1: \ | 110 | case 1: \ |
| 146 | asm(op "b "__percpu_seg"%1,%0" \ | 111 | asm(op "b "__percpu_arg(1)",%0" \ |
| 147 | : "=r" (ret__) \ | 112 | : "=r" (ret__) \ |
| 148 | : "m" (var)); \ | 113 | : "m" (var)); \ |
| 149 | break; \ | 114 | break; \ |
| 150 | case 2: \ | 115 | case 2: \ |
| 151 | asm(op "w "__percpu_seg"%1,%0" \ | 116 | asm(op "w "__percpu_arg(1)",%0" \ |
| 152 | : "=r" (ret__) \ | 117 | : "=r" (ret__) \ |
| 153 | : "m" (var)); \ | 118 | : "m" (var)); \ |
| 154 | break; \ | 119 | break; \ |
| 155 | case 4: \ | 120 | case 4: \ |
| 156 | asm(op "l "__percpu_seg"%1,%0" \ | 121 | asm(op "l "__percpu_arg(1)",%0" \ |
| 122 | : "=r" (ret__) \ | ||
| 123 | : "m" (var)); \ | ||
| 124 | break; \ | ||
| 125 | case 8: \ | ||
| 126 | asm(op "q "__percpu_arg(1)",%0" \ | ||
| 157 | : "=r" (ret__) \ | 127 | : "=r" (ret__) \ |
| 158 | : "m" (var)); \ | 128 | : "m" (var)); \ |
| 159 | break; \ | 129 | break; \ |
| @@ -162,13 +132,30 @@ do { \ | |||
| 162 | ret__; \ | 132 | ret__; \ |
| 163 | }) | 133 | }) |
| 164 | 134 | ||
| 165 | #define x86_read_percpu(var) percpu_from_op("mov", per_cpu__##var) | 135 | #define percpu_read(var) percpu_from_op("mov", per_cpu__##var) |
| 166 | #define x86_write_percpu(var, val) percpu_to_op("mov", per_cpu__##var, val) | 136 | #define percpu_write(var, val) percpu_to_op("mov", per_cpu__##var, val) |
| 167 | #define x86_add_percpu(var, val) percpu_to_op("add", per_cpu__##var, val) | 137 | #define percpu_add(var, val) percpu_to_op("add", per_cpu__##var, val) |
| 168 | #define x86_sub_percpu(var, val) percpu_to_op("sub", per_cpu__##var, val) | 138 | #define percpu_sub(var, val) percpu_to_op("sub", per_cpu__##var, val) |
| 169 | #define x86_or_percpu(var, val) percpu_to_op("or", per_cpu__##var, val) | 139 | #define percpu_and(var, val) percpu_to_op("and", per_cpu__##var, val) |
| 140 | #define percpu_or(var, val) percpu_to_op("or", per_cpu__##var, val) | ||
| 141 | #define percpu_xor(var, val) percpu_to_op("xor", per_cpu__##var, val) | ||
| 142 | |||
| 143 | /* This is not atomic against other CPUs -- CPU preemption needs to be off */ | ||
| 144 | #define x86_test_and_clear_bit_percpu(bit, var) \ | ||
| 145 | ({ \ | ||
| 146 | int old__; \ | ||
| 147 | asm volatile("btr %2,"__percpu_arg(1)"\n\tsbbl %0,%0" \ | ||
| 148 | : "=r" (old__), "+m" (per_cpu__##var) \ | ||
| 149 | : "dIr" (bit)); \ | ||
| 150 | old__; \ | ||
| 151 | }) | ||
| 152 | |||
| 153 | #include <asm-generic/percpu.h> | ||
| 154 | |||
| 155 | /* We can use this directly for local CPU (faster). */ | ||
| 156 | DECLARE_PER_CPU(unsigned long, this_cpu_off); | ||
| 157 | |||
| 170 | #endif /* !__ASSEMBLY__ */ | 158 | #endif /* !__ASSEMBLY__ */ |
| 171 | #endif /* !CONFIG_X86_64 */ | ||
| 172 | 159 | ||
| 173 | #ifdef CONFIG_SMP | 160 | #ifdef CONFIG_SMP |
| 174 | 161 | ||
| @@ -195,9 +182,9 @@ do { \ | |||
| 195 | #define early_per_cpu_ptr(_name) (_name##_early_ptr) | 182 | #define early_per_cpu_ptr(_name) (_name##_early_ptr) |
| 196 | #define early_per_cpu_map(_name, _idx) (_name##_early_map[_idx]) | 183 | #define early_per_cpu_map(_name, _idx) (_name##_early_map[_idx]) |
| 197 | #define early_per_cpu(_name, _cpu) \ | 184 | #define early_per_cpu(_name, _cpu) \ |
| 198 | (early_per_cpu_ptr(_name) ? \ | 185 | *(early_per_cpu_ptr(_name) ? \ |
| 199 | early_per_cpu_ptr(_name)[_cpu] : \ | 186 | &early_per_cpu_ptr(_name)[_cpu] : \ |
| 200 | per_cpu(_name, _cpu)) | 187 | &per_cpu(_name, _cpu)) |
| 201 | 188 | ||
| 202 | #else /* !CONFIG_SMP */ | 189 | #else /* !CONFIG_SMP */ |
| 203 | #define DEFINE_EARLY_PER_CPU(_type, _name, _initvalue) \ | 190 | #define DEFINE_EARLY_PER_CPU(_type, _name, _initvalue) \ |
diff --git a/arch/x86/include/asm/pgtable-2level.h b/arch/x86/include/asm/pgtable-2level.h index e0d199fe1d83..c1774ac9da7a 100644 --- a/arch/x86/include/asm/pgtable-2level.h +++ b/arch/x86/include/asm/pgtable-2level.h | |||
| @@ -53,8 +53,6 @@ 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_none(x) (!(x).pte_low) | ||
| 57 | |||
| 58 | /* | 56 | /* |
| 59 | * Bits _PAGE_BIT_PRESENT, _PAGE_BIT_FILE and _PAGE_BIT_PROTNONE are taken, | 57 | * Bits _PAGE_BIT_PRESENT, _PAGE_BIT_FILE and _PAGE_BIT_PROTNONE are taken, |
| 60 | * split up the 29 bits of offset into this range: | 58 | * split up the 29 bits of offset into this range: |
diff --git a/arch/x86/include/asm/pgtable-2level-defs.h b/arch/x86/include/asm/pgtable-2level_types.h index d77db8990eaa..daacc23e3fb9 100644 --- a/arch/x86/include/asm/pgtable-2level-defs.h +++ b/arch/x86/include/asm/pgtable-2level_types.h | |||
| @@ -1,7 +1,23 @@ | |||
| 1 | #ifndef _ASM_X86_PGTABLE_2LEVEL_DEFS_H | 1 | #ifndef _ASM_X86_PGTABLE_2LEVEL_DEFS_H |
| 2 | #define _ASM_X86_PGTABLE_2LEVEL_DEFS_H | 2 | #define _ASM_X86_PGTABLE_2LEVEL_DEFS_H |
| 3 | 3 | ||
| 4 | #ifndef __ASSEMBLY__ | ||
| 5 | #include <linux/types.h> | ||
| 6 | |||
| 7 | typedef unsigned long pteval_t; | ||
| 8 | typedef unsigned long pmdval_t; | ||
| 9 | typedef unsigned long pudval_t; | ||
| 10 | typedef unsigned long pgdval_t; | ||
| 11 | typedef unsigned long pgprotval_t; | ||
| 12 | |||
| 13 | typedef union { | ||
| 14 | pteval_t pte; | ||
| 15 | pteval_t pte_low; | ||
| 16 | } pte_t; | ||
| 17 | #endif /* !__ASSEMBLY__ */ | ||
| 18 | |||
| 4 | #define SHARED_KERNEL_PMD 0 | 19 | #define SHARED_KERNEL_PMD 0 |
| 20 | #define PAGETABLE_LEVELS 2 | ||
| 5 | 21 | ||
| 6 | /* | 22 | /* |
| 7 | * traditional i386 two-level paging structure: | 23 | * traditional i386 two-level paging structure: |
| @@ -10,6 +26,7 @@ | |||
| 10 | #define PGDIR_SHIFT 22 | 26 | #define PGDIR_SHIFT 22 |
| 11 | #define PTRS_PER_PGD 1024 | 27 | #define PTRS_PER_PGD 1024 |
| 12 | 28 | ||
| 29 | |||
| 13 | /* | 30 | /* |
| 14 | * the i386 is two-level, so we don't really have any | 31 | * the i386 is two-level, so we don't really have any |
| 15 | * PMD directory physically. | 32 | * PMD directory physically. |
diff --git a/arch/x86/include/asm/pgtable-3level.h b/arch/x86/include/asm/pgtable-3level.h index 447da43cddb3..3f13cdf61156 100644 --- a/arch/x86/include/asm/pgtable-3level.h +++ b/arch/x86/include/asm/pgtable-3level.h | |||
| @@ -18,21 +18,6 @@ | |||
| 18 | printk("%s:%d: bad pgd %p(%016Lx).\n", \ | 18 | printk("%s:%d: bad pgd %p(%016Lx).\n", \ |
| 19 | __FILE__, __LINE__, &(e), pgd_val(e)) | 19 | __FILE__, __LINE__, &(e), pgd_val(e)) |
| 20 | 20 | ||
| 21 | static inline int pud_none(pud_t pud) | ||
| 22 | { | ||
| 23 | return pud_val(pud) == 0; | ||
| 24 | } | ||
| 25 | |||
| 26 | static inline int pud_bad(pud_t pud) | ||
| 27 | { | ||
| 28 | return (pud_val(pud) & ~(PTE_PFN_MASK | _KERNPG_TABLE | _PAGE_USER)) != 0; | ||
| 29 | } | ||
| 30 | |||
| 31 | static inline int pud_present(pud_t pud) | ||
| 32 | { | ||
| 33 | return pud_val(pud) & _PAGE_PRESENT; | ||
| 34 | } | ||
| 35 | |||
| 36 | /* Rules for using set_pte: the pte being assigned *must* be | 21 | /* Rules for using set_pte: the pte being assigned *must* be |
| 37 | * either not present or in a state where the hardware will | 22 | * either not present or in a state where the hardware will |
| 38 | * not attempt to update the pte. In places where this is | 23 | * not attempt to update the pte. In places where this is |
| @@ -120,15 +105,6 @@ static inline void pud_clear(pud_t *pudp) | |||
| 120 | write_cr3(pgd); | 105 | write_cr3(pgd); |
| 121 | } | 106 | } |
| 122 | 107 | ||
| 123 | #define pud_page(pud) pfn_to_page(pud_val(pud) >> PAGE_SHIFT) | ||
| 124 | |||
| 125 | #define pud_page_vaddr(pud) ((unsigned long) __va(pud_val(pud) & PTE_PFN_MASK)) | ||
| 126 | |||
| 127 | |||
| 128 | /* Find an entry in the second-level page table.. */ | ||
| 129 | #define pmd_offset(pud, address) ((pmd_t *)pud_page_vaddr(*(pud)) + \ | ||
| 130 | pmd_index(address)) | ||
| 131 | |||
| 132 | #ifdef CONFIG_SMP | 108 | #ifdef CONFIG_SMP |
| 133 | static inline pte_t native_ptep_get_and_clear(pte_t *ptep) | 109 | static inline pte_t native_ptep_get_and_clear(pte_t *ptep) |
| 134 | { | 110 | { |
| @@ -145,17 +121,6 @@ static inline pte_t native_ptep_get_and_clear(pte_t *ptep) | |||
| 145 | #define native_ptep_get_and_clear(xp) native_local_ptep_get_and_clear(xp) | 121 | #define native_ptep_get_and_clear(xp) native_local_ptep_get_and_clear(xp) |
| 146 | #endif | 122 | #endif |
| 147 | 123 | ||
| 148 | #define __HAVE_ARCH_PTE_SAME | ||
| 149 | static inline int pte_same(pte_t a, pte_t b) | ||
| 150 | { | ||
| 151 | return a.pte_low == b.pte_low && a.pte_high == b.pte_high; | ||
| 152 | } | ||
| 153 | |||
| 154 | static inline int pte_none(pte_t pte) | ||
| 155 | { | ||
| 156 | return !pte.pte_low && !pte.pte_high; | ||
| 157 | } | ||
| 158 | |||
| 159 | /* | 124 | /* |
| 160 | * Bits 0, 6 and 7 are taken in the low part of the pte, | 125 | * Bits 0, 6 and 7 are taken in the low part of the pte, |
| 161 | * put the 32 bits of offset into the high part. | 126 | * put the 32 bits of offset into the high part. |
diff --git a/arch/x86/include/asm/pgtable-3level-defs.h b/arch/x86/include/asm/pgtable-3level_types.h index 62561367653c..1bd5876c8649 100644 --- a/arch/x86/include/asm/pgtable-3level-defs.h +++ b/arch/x86/include/asm/pgtable-3level_types.h | |||
| @@ -1,12 +1,31 @@ | |||
| 1 | #ifndef _ASM_X86_PGTABLE_3LEVEL_DEFS_H | 1 | #ifndef _ASM_X86_PGTABLE_3LEVEL_DEFS_H |
| 2 | #define _ASM_X86_PGTABLE_3LEVEL_DEFS_H | 2 | #define _ASM_X86_PGTABLE_3LEVEL_DEFS_H |
| 3 | 3 | ||
| 4 | #ifndef __ASSEMBLY__ | ||
| 5 | #include <linux/types.h> | ||
| 6 | |||
| 7 | typedef u64 pteval_t; | ||
| 8 | typedef u64 pmdval_t; | ||
| 9 | typedef u64 pudval_t; | ||
| 10 | typedef u64 pgdval_t; | ||
| 11 | typedef u64 pgprotval_t; | ||
| 12 | |||
| 13 | typedef union { | ||
| 14 | struct { | ||
| 15 | unsigned long pte_low, pte_high; | ||
| 16 | }; | ||
| 17 | pteval_t pte; | ||
| 18 | } pte_t; | ||
| 19 | #endif /* !__ASSEMBLY__ */ | ||
| 20 | |||
| 4 | #ifdef CONFIG_PARAVIRT | 21 | #ifdef CONFIG_PARAVIRT |
| 5 | #define SHARED_KERNEL_PMD (pv_info.shared_kernel_pmd) | 22 | #define SHARED_KERNEL_PMD (pv_info.shared_kernel_pmd) |
| 6 | #else | 23 | #else |
| 7 | #define SHARED_KERNEL_PMD 1 | 24 | #define SHARED_KERNEL_PMD 1 |
| 8 | #endif | 25 | #endif |
| 9 | 26 | ||
| 27 | #define PAGETABLE_LEVELS 3 | ||
| 28 | |||
| 10 | /* | 29 | /* |
| 11 | * PGDIR_SHIFT determines what a top-level page table entry can map | 30 | * PGDIR_SHIFT determines what a top-level page table entry can map |
| 12 | */ | 31 | */ |
| @@ -25,4 +44,5 @@ | |||
| 25 | */ | 44 | */ |
| 26 | #define PTRS_PER_PTE 512 | 45 | #define PTRS_PER_PTE 512 |
| 27 | 46 | ||
| 47 | |||
| 28 | #endif /* _ASM_X86_PGTABLE_3LEVEL_DEFS_H */ | 48 | #endif /* _ASM_X86_PGTABLE_3LEVEL_DEFS_H */ |
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h index 4f5af8447d54..1c097a3a6669 100644 --- a/arch/x86/include/asm/pgtable.h +++ b/arch/x86/include/asm/pgtable.h | |||
| @@ -1,164 +1,9 @@ | |||
| 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 | #include <asm/page.h> |
| 5 | |||
| 6 | #define _PAGE_BIT_PRESENT 0 /* is present */ | ||
| 7 | #define _PAGE_BIT_RW 1 /* writeable */ | ||
| 8 | #define _PAGE_BIT_USER 2 /* userspace addressable */ | ||
| 9 | #define _PAGE_BIT_PWT 3 /* page write through */ | ||
| 10 | #define _PAGE_BIT_PCD 4 /* page cache disabled */ | ||
| 11 | #define _PAGE_BIT_ACCESSED 5 /* was accessed (raised by CPU) */ | ||
| 12 | #define _PAGE_BIT_DIRTY 6 /* was written to (raised by CPU) */ | ||
| 13 | #define _PAGE_BIT_PSE 7 /* 4 MB (or 2MB) page */ | ||
| 14 | #define _PAGE_BIT_PAT 7 /* on 4KB pages */ | ||
| 15 | #define _PAGE_BIT_GLOBAL 8 /* Global TLB entry PPro+ */ | ||
| 16 | #define _PAGE_BIT_UNUSED1 9 /* available for programmer */ | ||
| 17 | #define _PAGE_BIT_IOMAP 10 /* flag used to indicate IO mapping */ | ||
| 18 | #define _PAGE_BIT_UNUSED3 11 | ||
| 19 | #define _PAGE_BIT_PAT_LARGE 12 /* On 2MB or 1GB pages */ | ||
| 20 | #define _PAGE_BIT_SPECIAL _PAGE_BIT_UNUSED1 | ||
| 21 | #define _PAGE_BIT_CPA_TEST _PAGE_BIT_UNUSED1 | ||
| 22 | #define _PAGE_BIT_NX 63 /* No execute: only valid after cpuid check */ | ||
| 23 | |||
| 24 | /* If _PAGE_BIT_PRESENT is clear, we use these: */ | ||
| 25 | /* - if the user mapped it with PROT_NONE; pte_present gives true */ | ||
| 26 | #define _PAGE_BIT_PROTNONE _PAGE_BIT_GLOBAL | ||
| 27 | /* - set: nonlinear file mapping, saved PTE; unset:swap */ | ||
| 28 | #define _PAGE_BIT_FILE _PAGE_BIT_DIRTY | ||
| 29 | |||
| 30 | #define _PAGE_PRESENT (_AT(pteval_t, 1) << _PAGE_BIT_PRESENT) | ||
| 31 | #define _PAGE_RW (_AT(pteval_t, 1) << _PAGE_BIT_RW) | ||
| 32 | #define _PAGE_USER (_AT(pteval_t, 1) << _PAGE_BIT_USER) | ||
| 33 | #define _PAGE_PWT (_AT(pteval_t, 1) << _PAGE_BIT_PWT) | ||
| 34 | #define _PAGE_PCD (_AT(pteval_t, 1) << _PAGE_BIT_PCD) | ||
| 35 | #define _PAGE_ACCESSED (_AT(pteval_t, 1) << _PAGE_BIT_ACCESSED) | ||
| 36 | #define _PAGE_DIRTY (_AT(pteval_t, 1) << _PAGE_BIT_DIRTY) | ||
| 37 | #define _PAGE_PSE (_AT(pteval_t, 1) << _PAGE_BIT_PSE) | ||
| 38 | #define _PAGE_GLOBAL (_AT(pteval_t, 1) << _PAGE_BIT_GLOBAL) | ||
| 39 | #define _PAGE_UNUSED1 (_AT(pteval_t, 1) << _PAGE_BIT_UNUSED1) | ||
| 40 | #define _PAGE_IOMAP (_AT(pteval_t, 1) << _PAGE_BIT_IOMAP) | ||
| 41 | #define _PAGE_UNUSED3 (_AT(pteval_t, 1) << _PAGE_BIT_UNUSED3) | ||
| 42 | #define _PAGE_PAT (_AT(pteval_t, 1) << _PAGE_BIT_PAT) | ||
| 43 | #define _PAGE_PAT_LARGE (_AT(pteval_t, 1) << _PAGE_BIT_PAT_LARGE) | ||
| 44 | #define _PAGE_SPECIAL (_AT(pteval_t, 1) << _PAGE_BIT_SPECIAL) | ||
| 45 | #define _PAGE_CPA_TEST (_AT(pteval_t, 1) << _PAGE_BIT_CPA_TEST) | ||
| 46 | #define __HAVE_ARCH_PTE_SPECIAL | ||
| 47 | |||
| 48 | #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) | ||
| 49 | #define _PAGE_NX (_AT(pteval_t, 1) << _PAGE_BIT_NX) | ||
| 50 | #else | ||
| 51 | #define _PAGE_NX (_AT(pteval_t, 0)) | ||
| 52 | #endif | ||
| 53 | 5 | ||
| 54 | #define _PAGE_FILE (_AT(pteval_t, 1) << _PAGE_BIT_FILE) | 6 | #include <asm/pgtable_types.h> |
| 55 | #define _PAGE_PROTNONE (_AT(pteval_t, 1) << _PAGE_BIT_PROTNONE) | ||
| 56 | |||
| 57 | #define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | \ | ||
| 58 | _PAGE_ACCESSED | _PAGE_DIRTY) | ||
| 59 | #define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | \ | ||
| 60 | _PAGE_DIRTY) | ||
| 61 | |||
| 62 | /* Set of bits not changed in pte_modify */ | ||
| 63 | #define _PAGE_CHG_MASK (PTE_PFN_MASK | _PAGE_PCD | _PAGE_PWT | \ | ||
| 64 | _PAGE_SPECIAL | _PAGE_ACCESSED | _PAGE_DIRTY) | ||
| 65 | |||
| 66 | #define _PAGE_CACHE_MASK (_PAGE_PCD | _PAGE_PWT) | ||
| 67 | #define _PAGE_CACHE_WB (0) | ||
| 68 | #define _PAGE_CACHE_WC (_PAGE_PWT) | ||
| 69 | #define _PAGE_CACHE_UC_MINUS (_PAGE_PCD) | ||
| 70 | #define _PAGE_CACHE_UC (_PAGE_PCD | _PAGE_PWT) | ||
| 71 | |||
| 72 | #define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED) | ||
| 73 | #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | \ | ||
| 74 | _PAGE_ACCESSED | _PAGE_NX) | ||
| 75 | |||
| 76 | #define PAGE_SHARED_EXEC __pgprot(_PAGE_PRESENT | _PAGE_RW | \ | ||
| 77 | _PAGE_USER | _PAGE_ACCESSED) | ||
| 78 | #define PAGE_COPY_NOEXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | \ | ||
| 79 | _PAGE_ACCESSED | _PAGE_NX) | ||
| 80 | #define PAGE_COPY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | \ | ||
| 81 | _PAGE_ACCESSED) | ||
| 82 | #define PAGE_COPY PAGE_COPY_NOEXEC | ||
| 83 | #define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER | \ | ||
| 84 | _PAGE_ACCESSED | _PAGE_NX) | ||
| 85 | #define PAGE_READONLY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | \ | ||
| 86 | _PAGE_ACCESSED) | ||
| 87 | |||
| 88 | #define __PAGE_KERNEL_EXEC \ | ||
| 89 | (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_GLOBAL) | ||
| 90 | #define __PAGE_KERNEL (__PAGE_KERNEL_EXEC | _PAGE_NX) | ||
| 91 | |||
| 92 | #define __PAGE_KERNEL_RO (__PAGE_KERNEL & ~_PAGE_RW) | ||
| 93 | #define __PAGE_KERNEL_RX (__PAGE_KERNEL_EXEC & ~_PAGE_RW) | ||
| 94 | #define __PAGE_KERNEL_EXEC_NOCACHE (__PAGE_KERNEL_EXEC | _PAGE_PCD | _PAGE_PWT) | ||
| 95 | #define __PAGE_KERNEL_WC (__PAGE_KERNEL | _PAGE_CACHE_WC) | ||
| 96 | #define __PAGE_KERNEL_NOCACHE (__PAGE_KERNEL | _PAGE_PCD | _PAGE_PWT) | ||
| 97 | #define __PAGE_KERNEL_UC_MINUS (__PAGE_KERNEL | _PAGE_PCD) | ||
| 98 | #define __PAGE_KERNEL_VSYSCALL (__PAGE_KERNEL_RX | _PAGE_USER) | ||
| 99 | #define __PAGE_KERNEL_VSYSCALL_NOCACHE (__PAGE_KERNEL_VSYSCALL | _PAGE_PCD | _PAGE_PWT) | ||
| 100 | #define __PAGE_KERNEL_LARGE (__PAGE_KERNEL | _PAGE_PSE) | ||
| 101 | #define __PAGE_KERNEL_LARGE_NOCACHE (__PAGE_KERNEL | _PAGE_CACHE_UC | _PAGE_PSE) | ||
| 102 | #define __PAGE_KERNEL_LARGE_EXEC (__PAGE_KERNEL_EXEC | _PAGE_PSE) | ||
| 103 | |||
| 104 | #define __PAGE_KERNEL_IO (__PAGE_KERNEL | _PAGE_IOMAP) | ||
| 105 | #define __PAGE_KERNEL_IO_NOCACHE (__PAGE_KERNEL_NOCACHE | _PAGE_IOMAP) | ||
| 106 | #define __PAGE_KERNEL_IO_UC_MINUS (__PAGE_KERNEL_UC_MINUS | _PAGE_IOMAP) | ||
| 107 | #define __PAGE_KERNEL_IO_WC (__PAGE_KERNEL_WC | _PAGE_IOMAP) | ||
| 108 | |||
| 109 | #define PAGE_KERNEL __pgprot(__PAGE_KERNEL) | ||
| 110 | #define PAGE_KERNEL_RO __pgprot(__PAGE_KERNEL_RO) | ||
| 111 | #define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC) | ||
| 112 | #define PAGE_KERNEL_RX __pgprot(__PAGE_KERNEL_RX) | ||
| 113 | #define PAGE_KERNEL_WC __pgprot(__PAGE_KERNEL_WC) | ||
| 114 | #define PAGE_KERNEL_NOCACHE __pgprot(__PAGE_KERNEL_NOCACHE) | ||
| 115 | #define PAGE_KERNEL_UC_MINUS __pgprot(__PAGE_KERNEL_UC_MINUS) | ||
| 116 | #define PAGE_KERNEL_EXEC_NOCACHE __pgprot(__PAGE_KERNEL_EXEC_NOCACHE) | ||
| 117 | #define PAGE_KERNEL_LARGE __pgprot(__PAGE_KERNEL_LARGE) | ||
| 118 | #define PAGE_KERNEL_LARGE_NOCACHE __pgprot(__PAGE_KERNEL_LARGE_NOCACHE) | ||
| 119 | #define PAGE_KERNEL_LARGE_EXEC __pgprot(__PAGE_KERNEL_LARGE_EXEC) | ||
| 120 | #define PAGE_KERNEL_VSYSCALL __pgprot(__PAGE_KERNEL_VSYSCALL) | ||
| 121 | #define PAGE_KERNEL_VSYSCALL_NOCACHE __pgprot(__PAGE_KERNEL_VSYSCALL_NOCACHE) | ||
| 122 | |||
| 123 | #define PAGE_KERNEL_IO __pgprot(__PAGE_KERNEL_IO) | ||
| 124 | #define PAGE_KERNEL_IO_NOCACHE __pgprot(__PAGE_KERNEL_IO_NOCACHE) | ||
| 125 | #define PAGE_KERNEL_IO_UC_MINUS __pgprot(__PAGE_KERNEL_IO_UC_MINUS) | ||
| 126 | #define PAGE_KERNEL_IO_WC __pgprot(__PAGE_KERNEL_IO_WC) | ||
| 127 | |||
| 128 | /* xwr */ | ||
| 129 | #define __P000 PAGE_NONE | ||
| 130 | #define __P001 PAGE_READONLY | ||
| 131 | #define __P010 PAGE_COPY | ||
| 132 | #define __P011 PAGE_COPY | ||
| 133 | #define __P100 PAGE_READONLY_EXEC | ||
| 134 | #define __P101 PAGE_READONLY_EXEC | ||
| 135 | #define __P110 PAGE_COPY_EXEC | ||
| 136 | #define __P111 PAGE_COPY_EXEC | ||
| 137 | |||
| 138 | #define __S000 PAGE_NONE | ||
| 139 | #define __S001 PAGE_READONLY | ||
| 140 | #define __S010 PAGE_SHARED | ||
| 141 | #define __S011 PAGE_SHARED | ||
| 142 | #define __S100 PAGE_READONLY_EXEC | ||
| 143 | #define __S101 PAGE_READONLY_EXEC | ||
| 144 | #define __S110 PAGE_SHARED_EXEC | ||
| 145 | #define __S111 PAGE_SHARED_EXEC | ||
| 146 | |||
| 147 | /* | ||
| 148 | * early identity mapping pte attrib macros. | ||
| 149 | */ | ||
| 150 | #ifdef CONFIG_X86_64 | ||
| 151 | #define __PAGE_KERNEL_IDENT_LARGE_EXEC __PAGE_KERNEL_LARGE_EXEC | ||
| 152 | #else | ||
| 153 | /* | ||
| 154 | * For PDE_IDENT_ATTR include USER bit. As the PDE and PTE protection | ||
| 155 | * bits are combined, this will alow user to access the high address mapped | ||
| 156 | * VDSO in the presence of CONFIG_COMPAT_VDSO | ||
| 157 | */ | ||
| 158 | #define PTE_IDENT_ATTR 0x003 /* PRESENT+RW */ | ||
| 159 | #define PDE_IDENT_ATTR 0x067 /* PRESENT+RW+USER+DIRTY+ACCESSED */ | ||
| 160 | #define PGD_IDENT_ATTR 0x001 /* PRESENT (no other attributes) */ | ||
| 161 | #endif | ||
| 162 | 7 | ||
| 163 | /* | 8 | /* |
| 164 | * Macro to mark a page protection value as UC- | 9 | * Macro to mark a page protection value as UC- |
| @@ -170,9 +15,6 @@ | |||
| 170 | 15 | ||
| 171 | #ifndef __ASSEMBLY__ | 16 | #ifndef __ASSEMBLY__ |
| 172 | 17 | ||
| 173 | #define pgprot_writecombine pgprot_writecombine | ||
| 174 | extern pgprot_t pgprot_writecombine(pgprot_t prot); | ||
| 175 | |||
| 176 | /* | 18 | /* |
| 177 | * ZERO_PAGE is a global shared page that is always zero: used | 19 | * ZERO_PAGE is a global shared page that is always zero: used |
| 178 | * for zero-mapped memory areas etc.. | 20 | * for zero-mapped memory areas etc.. |
| @@ -183,6 +25,66 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]; | |||
| 183 | extern spinlock_t pgd_lock; | 25 | extern spinlock_t pgd_lock; |
| 184 | extern struct list_head pgd_list; | 26 | extern struct list_head pgd_list; |
| 185 | 27 | ||
| 28 | #ifdef CONFIG_PARAVIRT | ||
| 29 | #include <asm/paravirt.h> | ||
| 30 | #else /* !CONFIG_PARAVIRT */ | ||
| 31 | #define set_pte(ptep, pte) native_set_pte(ptep, pte) | ||
| 32 | #define set_pte_at(mm, addr, ptep, pte) native_set_pte_at(mm, addr, ptep, pte) | ||
| 33 | |||
| 34 | #define set_pte_present(mm, addr, ptep, pte) \ | ||
| 35 | native_set_pte_present(mm, addr, ptep, pte) | ||
| 36 | #define set_pte_atomic(ptep, pte) \ | ||
| 37 | native_set_pte_atomic(ptep, pte) | ||
| 38 | |||
| 39 | #define set_pmd(pmdp, pmd) native_set_pmd(pmdp, pmd) | ||
| 40 | |||
| 41 | #ifndef __PAGETABLE_PUD_FOLDED | ||
| 42 | #define set_pgd(pgdp, pgd) native_set_pgd(pgdp, pgd) | ||
| 43 | #define pgd_clear(pgd) native_pgd_clear(pgd) | ||
| 44 | #endif | ||
| 45 | |||
| 46 | #ifndef set_pud | ||
| 47 | # define set_pud(pudp, pud) native_set_pud(pudp, pud) | ||
| 48 | #endif | ||
| 49 | |||
| 50 | #ifndef __PAGETABLE_PMD_FOLDED | ||
| 51 | #define pud_clear(pud) native_pud_clear(pud) | ||
| 52 | #endif | ||
| 53 | |||
| 54 | #define pte_clear(mm, addr, ptep) native_pte_clear(mm, addr, ptep) | ||
| 55 | #define pmd_clear(pmd) native_pmd_clear(pmd) | ||
| 56 | |||
| 57 | #define pte_update(mm, addr, ptep) do { } while (0) | ||
| 58 | #define pte_update_defer(mm, addr, ptep) do { } while (0) | ||
| 59 | |||
| 60 | static inline void __init paravirt_pagetable_setup_start(pgd_t *base) | ||
| 61 | { | ||
| 62 | native_pagetable_setup_start(base); | ||
| 63 | } | ||
| 64 | |||
| 65 | static inline void __init paravirt_pagetable_setup_done(pgd_t *base) | ||
| 66 | { | ||
| 67 | native_pagetable_setup_done(base); | ||
| 68 | } | ||
| 69 | |||
| 70 | #define pgd_val(x) native_pgd_val(x) | ||
| 71 | #define __pgd(x) native_make_pgd(x) | ||
| 72 | |||
| 73 | #ifndef __PAGETABLE_PUD_FOLDED | ||
| 74 | #define pud_val(x) native_pud_val(x) | ||
| 75 | #define __pud(x) native_make_pud(x) | ||
| 76 | #endif | ||
| 77 | |||
| 78 | #ifndef __PAGETABLE_PMD_FOLDED | ||
| 79 | #define pmd_val(x) native_pmd_val(x) | ||
| 80 | #define __pmd(x) native_make_pmd(x) | ||
| 81 | #endif | ||
| 82 | |||
| 83 | #define pte_val(x) native_pte_val(x) | ||
| 84 | #define __pte(x) native_make_pte(x) | ||
| 85 | |||
| 86 | #endif /* CONFIG_PARAVIRT */ | ||
| 87 | |||
| 186 | /* | 88 | /* |
| 187 | * The following only work if pte_present() is true. | 89 | * The following only work if pte_present() is true. |
| 188 | * Undefined behaviour if not.. | 90 | * Undefined behaviour if not.. |
| @@ -236,72 +138,84 @@ static inline unsigned long pte_pfn(pte_t pte) | |||
| 236 | 138 | ||
| 237 | static inline int pmd_large(pmd_t pte) | 139 | static inline int pmd_large(pmd_t pte) |
| 238 | { | 140 | { |
| 239 | return (pmd_val(pte) & (_PAGE_PSE | _PAGE_PRESENT)) == | 141 | return (pmd_flags(pte) & (_PAGE_PSE | _PAGE_PRESENT)) == |
| 240 | (_PAGE_PSE | _PAGE_PRESENT); | 142 | (_PAGE_PSE | _PAGE_PRESENT); |
| 241 | } | 143 | } |
| 242 | 144 | ||
| 145 | static inline pte_t pte_set_flags(pte_t pte, pteval_t set) | ||
| 146 | { | ||
| 147 | pteval_t v = native_pte_val(pte); | ||
| 148 | |||
| 149 | return native_make_pte(v | set); | ||
| 150 | } | ||
| 151 | |||
| 152 | static inline pte_t pte_clear_flags(pte_t pte, pteval_t clear) | ||
| 153 | { | ||
| 154 | pteval_t v = native_pte_val(pte); | ||
| 155 | |||
| 156 | return native_make_pte(v & ~clear); | ||
| 157 | } | ||
| 158 | |||
| 243 | static inline pte_t pte_mkclean(pte_t pte) | 159 | static inline pte_t pte_mkclean(pte_t pte) |
| 244 | { | 160 | { |
| 245 | return __pte(pte_val(pte) & ~_PAGE_DIRTY); | 161 | return pte_clear_flags(pte, _PAGE_DIRTY); |
| 246 | } | 162 | } |
| 247 | 163 | ||
| 248 | static inline pte_t pte_mkold(pte_t pte) | 164 | static inline pte_t pte_mkold(pte_t pte) |
| 249 | { | 165 | { |
| 250 | return __pte(pte_val(pte) & ~_PAGE_ACCESSED); | 166 | return pte_clear_flags(pte, _PAGE_ACCESSED); |
| 251 | } | 167 | } |
| 252 | 168 | ||
| 253 | static inline pte_t pte_wrprotect(pte_t pte) | 169 | static inline pte_t pte_wrprotect(pte_t pte) |
| 254 | { | 170 | { |
| 255 | return __pte(pte_val(pte) & ~_PAGE_RW); | 171 | return pte_clear_flags(pte, _PAGE_RW); |
| 256 | } | 172 | } |
| 257 | 173 | ||
| 258 | static inline pte_t pte_mkexec(pte_t pte) | 174 | static inline pte_t pte_mkexec(pte_t pte) |
| 259 | { | 175 | { |
| 260 | return __pte(pte_val(pte) & ~_PAGE_NX); | 176 | return pte_clear_flags(pte, _PAGE_NX); |
| 261 | } | 177 | } |
| 262 | 178 | ||
| 263 | static inline pte_t pte_mkdirty(pte_t pte) | 179 | static inline pte_t pte_mkdirty(pte_t pte) |
| 264 | { | 180 | { |
| 265 | return __pte(pte_val(pte) | _PAGE_DIRTY); | 181 | return pte_set_flags(pte, _PAGE_DIRTY); |
| 266 | } | 182 | } |
| 267 | 183 | ||
| 268 | static inline pte_t pte_mkyoung(pte_t pte) | 184 | static inline pte_t pte_mkyoung(pte_t pte) |
| 269 | { | 185 | { |
| 270 | return __pte(pte_val(pte) | _PAGE_ACCESSED); | 186 | return pte_set_flags(pte, _PAGE_ACCESSED); |
| 271 | } | 187 | } |
| 272 | 188 | ||
| 273 | static inline pte_t pte_mkwrite(pte_t pte) | 189 | static inline pte_t pte_mkwrite(pte_t pte) |
| 274 | { | 190 | { |
| 275 | return __pte(pte_val(pte) | _PAGE_RW); | 191 | return pte_set_flags(pte, _PAGE_RW); |
| 276 | } | 192 | } |
| 277 | 193 | ||
| 278 | static inline pte_t pte_mkhuge(pte_t pte) | 194 | static inline pte_t pte_mkhuge(pte_t pte) |
| 279 | { | 195 | { |
| 280 | return __pte(pte_val(pte) | _PAGE_PSE); | 196 | return pte_set_flags(pte, _PAGE_PSE); |
| 281 | } | 197 | } |
| 282 | 198 | ||
| 283 | static inline pte_t pte_clrhuge(pte_t pte) | 199 | static inline pte_t pte_clrhuge(pte_t pte) |
| 284 | { | 200 | { |
| 285 | return __pte(pte_val(pte) & ~_PAGE_PSE); | 201 | return pte_clear_flags(pte, _PAGE_PSE); |
| 286 | } | 202 | } |
| 287 | 203 | ||
| 288 | static inline pte_t pte_mkglobal(pte_t pte) | 204 | static inline pte_t pte_mkglobal(pte_t pte) |
| 289 | { | 205 | { |
| 290 | return __pte(pte_val(pte) | _PAGE_GLOBAL); | 206 | return pte_set_flags(pte, _PAGE_GLOBAL); |
| 291 | } | 207 | } |
| 292 | 208 | ||
| 293 | static inline pte_t pte_clrglobal(pte_t pte) | 209 | static inline pte_t pte_clrglobal(pte_t pte) |
| 294 | { | 210 | { |
| 295 | return __pte(pte_val(pte) & ~_PAGE_GLOBAL); | 211 | return pte_clear_flags(pte, _PAGE_GLOBAL); |
| 296 | } | 212 | } |
| 297 | 213 | ||
| 298 | static inline pte_t pte_mkspecial(pte_t pte) | 214 | static inline pte_t pte_mkspecial(pte_t pte) |
| 299 | { | 215 | { |
| 300 | return __pte(pte_val(pte) | _PAGE_SPECIAL); | 216 | return pte_set_flags(pte, _PAGE_SPECIAL); |
| 301 | } | 217 | } |
| 302 | 218 | ||
| 303 | extern pteval_t __supported_pte_mask; | ||
| 304 | |||
| 305 | /* | 219 | /* |
| 306 | * Mask out unsupported bits in a present pgprot. Non-present pgprots | 220 | * Mask out unsupported bits in a present pgprot. Non-present pgprots |
| 307 | * can use those bits for other purposes, so leave them be. | 221 | * can use those bits for other purposes, so leave them be. |
| @@ -374,82 +288,195 @@ static inline int is_new_memtype_allowed(unsigned long flags, | |||
| 374 | return 1; | 288 | return 1; |
| 375 | } | 289 | } |
| 376 | 290 | ||
| 377 | #ifndef __ASSEMBLY__ | 291 | #endif /* __ASSEMBLY__ */ |
| 378 | /* Indicate that x86 has its own track and untrack pfn vma functions */ | ||
| 379 | #define __HAVE_PFNMAP_TRACKING | ||
| 380 | |||
| 381 | #define __HAVE_PHYS_MEM_ACCESS_PROT | ||
| 382 | struct file; | ||
| 383 | pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, | ||
| 384 | unsigned long size, pgprot_t vma_prot); | ||
| 385 | int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, | ||
| 386 | unsigned long size, pgprot_t *vma_prot); | ||
| 387 | #endif | ||
| 388 | |||
| 389 | /* Install a pte for a particular vaddr in kernel space. */ | ||
| 390 | void set_pte_vaddr(unsigned long vaddr, pte_t pte); | ||
| 391 | 292 | ||
| 392 | #ifdef CONFIG_X86_32 | 293 | #ifdef CONFIG_X86_32 |
| 393 | extern void native_pagetable_setup_start(pgd_t *base); | 294 | # include "pgtable_32.h" |
| 394 | extern void native_pagetable_setup_done(pgd_t *base); | ||
| 395 | #else | 295 | #else |
| 396 | static inline void native_pagetable_setup_start(pgd_t *base) {} | 296 | # include "pgtable_64.h" |
| 397 | static inline void native_pagetable_setup_done(pgd_t *base) {} | ||
| 398 | #endif | 297 | #endif |
| 399 | 298 | ||
| 400 | struct seq_file; | 299 | #ifndef __ASSEMBLY__ |
| 401 | extern void arch_report_meminfo(struct seq_file *m); | 300 | #include <linux/mm_types.h> |
| 402 | 301 | ||
| 403 | #ifdef CONFIG_PARAVIRT | 302 | static inline int pte_none(pte_t pte) |
| 404 | #include <asm/paravirt.h> | 303 | { |
| 405 | #else /* !CONFIG_PARAVIRT */ | 304 | return !pte.pte; |
| 406 | #define set_pte(ptep, pte) native_set_pte(ptep, pte) | 305 | } |
| 407 | #define set_pte_at(mm, addr, ptep, pte) native_set_pte_at(mm, addr, ptep, pte) | ||
| 408 | 306 | ||
| 409 | #define set_pte_present(mm, addr, ptep, pte) \ | 307 | #define __HAVE_ARCH_PTE_SAME |
| 410 | native_set_pte_present(mm, addr, ptep, pte) | 308 | static inline int pte_same(pte_t a, pte_t b) |
| 411 | #define set_pte_atomic(ptep, pte) \ | 309 | { |
| 412 | native_set_pte_atomic(ptep, pte) | 310 | return a.pte == b.pte; |
| 311 | } | ||
| 413 | 312 | ||
| 414 | #define set_pmd(pmdp, pmd) native_set_pmd(pmdp, pmd) | 313 | static inline int pte_present(pte_t a) |
| 314 | { | ||
| 315 | return pte_flags(a) & (_PAGE_PRESENT | _PAGE_PROTNONE); | ||
| 316 | } | ||
| 415 | 317 | ||
| 416 | #ifndef __PAGETABLE_PUD_FOLDED | 318 | static inline int pmd_present(pmd_t pmd) |
| 417 | #define set_pgd(pgdp, pgd) native_set_pgd(pgdp, pgd) | 319 | { |
| 418 | #define pgd_clear(pgd) native_pgd_clear(pgd) | 320 | return pmd_flags(pmd) & _PAGE_PRESENT; |
| 419 | #endif | 321 | } |
| 420 | 322 | ||
| 421 | #ifndef set_pud | 323 | static inline int pmd_none(pmd_t pmd) |
| 422 | # define set_pud(pudp, pud) native_set_pud(pudp, pud) | 324 | { |
| 423 | #endif | 325 | /* Only check low word on 32-bit platforms, since it might be |
| 326 | out of sync with upper half. */ | ||
| 327 | return (unsigned long)native_pmd_val(pmd) == 0; | ||
| 328 | } | ||
| 424 | 329 | ||
| 425 | #ifndef __PAGETABLE_PMD_FOLDED | 330 | static inline unsigned long pmd_page_vaddr(pmd_t pmd) |
| 426 | #define pud_clear(pud) native_pud_clear(pud) | 331 | { |
| 427 | #endif | 332 | return (unsigned long)__va(pmd_val(pmd) & PTE_PFN_MASK); |
| 333 | } | ||
| 428 | 334 | ||
| 429 | #define pte_clear(mm, addr, ptep) native_pte_clear(mm, addr, ptep) | 335 | /* |
| 430 | #define pmd_clear(pmd) native_pmd_clear(pmd) | 336 | * Currently stuck as a macro due to indirect forward reference to |
| 337 | * linux/mmzone.h's __section_mem_map_addr() definition: | ||
| 338 | */ | ||
| 339 | #define pmd_page(pmd) pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT) | ||
| 431 | 340 | ||
| 432 | #define pte_update(mm, addr, ptep) do { } while (0) | 341 | /* |
| 433 | #define pte_update_defer(mm, addr, ptep) do { } while (0) | 342 | * the pmd page can be thought of an array like this: pmd_t[PTRS_PER_PMD] |
| 343 | * | ||
| 344 | * this macro returns the index of the entry in the pmd page which would | ||
| 345 | * control the given virtual address | ||
| 346 | */ | ||
| 347 | static inline unsigned pmd_index(unsigned long address) | ||
| 348 | { | ||
| 349 | return (address >> PMD_SHIFT) & (PTRS_PER_PMD - 1); | ||
| 350 | } | ||
| 434 | 351 | ||
| 435 | static inline void __init paravirt_pagetable_setup_start(pgd_t *base) | 352 | /* |
| 353 | * Conversion functions: convert a page and protection to a page entry, | ||
| 354 | * and a page entry and page directory to the page they refer to. | ||
| 355 | * | ||
| 356 | * (Currently stuck as a macro because of indirect forward reference | ||
| 357 | * to linux/mm.h:page_to_nid()) | ||
| 358 | */ | ||
| 359 | #define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot)) | ||
| 360 | |||
| 361 | /* | ||
| 362 | * the pte page can be thought of an array like this: pte_t[PTRS_PER_PTE] | ||
| 363 | * | ||
| 364 | * this function returns the index of the entry in the pte page which would | ||
| 365 | * control the given virtual address | ||
| 366 | */ | ||
| 367 | static inline unsigned pte_index(unsigned long address) | ||
| 436 | { | 368 | { |
| 437 | native_pagetable_setup_start(base); | 369 | return (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); |
| 438 | } | 370 | } |
| 439 | 371 | ||
| 440 | static inline void __init paravirt_pagetable_setup_done(pgd_t *base) | 372 | static inline pte_t *pte_offset_kernel(pmd_t *pmd, unsigned long address) |
| 441 | { | 373 | { |
| 442 | native_pagetable_setup_done(base); | 374 | return (pte_t *)pmd_page_vaddr(*pmd) + pte_index(address); |
| 443 | } | 375 | } |
| 444 | #endif /* CONFIG_PARAVIRT */ | ||
| 445 | 376 | ||
| 446 | #endif /* __ASSEMBLY__ */ | 377 | static inline int pmd_bad(pmd_t pmd) |
| 378 | { | ||
| 379 | return (pmd_flags(pmd) & ~_PAGE_USER) != _KERNPG_TABLE; | ||
| 380 | } | ||
| 447 | 381 | ||
| 448 | #ifdef CONFIG_X86_32 | 382 | static inline unsigned long pages_to_mb(unsigned long npg) |
| 449 | # include "pgtable_32.h" | 383 | { |
| 384 | return npg >> (20 - PAGE_SHIFT); | ||
| 385 | } | ||
| 386 | |||
| 387 | #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ | ||
| 388 | remap_pfn_range(vma, vaddr, pfn, size, prot) | ||
| 389 | |||
| 390 | #if PAGETABLE_LEVELS > 2 | ||
| 391 | static inline int pud_none(pud_t pud) | ||
| 392 | { | ||
| 393 | return native_pud_val(pud) == 0; | ||
| 394 | } | ||
| 395 | |||
| 396 | static inline int pud_present(pud_t pud) | ||
| 397 | { | ||
| 398 | return pud_flags(pud) & _PAGE_PRESENT; | ||
| 399 | } | ||
| 400 | |||
| 401 | static inline unsigned long pud_page_vaddr(pud_t pud) | ||
| 402 | { | ||
| 403 | return (unsigned long)__va((unsigned long)pud_val(pud) & PTE_PFN_MASK); | ||
| 404 | } | ||
| 405 | |||
| 406 | /* | ||
| 407 | * Currently stuck as a macro due to indirect forward reference to | ||
| 408 | * linux/mmzone.h's __section_mem_map_addr() definition: | ||
| 409 | */ | ||
| 410 | #define pud_page(pud) pfn_to_page(pud_val(pud) >> PAGE_SHIFT) | ||
| 411 | |||
| 412 | /* Find an entry in the second-level page table.. */ | ||
| 413 | static inline pmd_t *pmd_offset(pud_t *pud, unsigned long address) | ||
| 414 | { | ||
| 415 | return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(address); | ||
| 416 | } | ||
| 417 | |||
| 418 | static inline unsigned long pmd_pfn(pmd_t pmd) | ||
| 419 | { | ||
| 420 | return (pmd_val(pmd) & PTE_PFN_MASK) >> PAGE_SHIFT; | ||
| 421 | } | ||
| 422 | |||
| 423 | static inline int pud_large(pud_t pud) | ||
| 424 | { | ||
| 425 | return (pud_val(pud) & (_PAGE_PSE | _PAGE_PRESENT)) == | ||
| 426 | (_PAGE_PSE | _PAGE_PRESENT); | ||
| 427 | } | ||
| 428 | |||
| 429 | static inline int pud_bad(pud_t pud) | ||
| 430 | { | ||
| 431 | return (pud_flags(pud) & ~(_KERNPG_TABLE | _PAGE_USER)) != 0; | ||
| 432 | } | ||
| 450 | #else | 433 | #else |
| 451 | # include "pgtable_64.h" | 434 | static inline int pud_large(pud_t pud) |
| 452 | #endif | 435 | { |
| 436 | return 0; | ||
| 437 | } | ||
| 438 | #endif /* PAGETABLE_LEVELS > 2 */ | ||
| 439 | |||
| 440 | #if PAGETABLE_LEVELS > 3 | ||
| 441 | static inline int pgd_present(pgd_t pgd) | ||
| 442 | { | ||
| 443 | return pgd_flags(pgd) & _PAGE_PRESENT; | ||
| 444 | } | ||
| 445 | |||
| 446 | static inline unsigned long pgd_page_vaddr(pgd_t pgd) | ||
| 447 | { | ||
| 448 | return (unsigned long)__va((unsigned long)pgd_val(pgd) & PTE_PFN_MASK); | ||
| 449 | } | ||
| 450 | |||
| 451 | /* | ||
| 452 | * Currently stuck as a macro due to indirect forward reference to | ||
| 453 | * linux/mmzone.h's __section_mem_map_addr() definition: | ||
| 454 | */ | ||
| 455 | #define pgd_page(pgd) pfn_to_page(pgd_val(pgd) >> PAGE_SHIFT) | ||
| 456 | |||
| 457 | /* to find an entry in a page-table-directory. */ | ||
| 458 | static inline unsigned pud_index(unsigned long address) | ||
| 459 | { | ||
| 460 | return (address >> PUD_SHIFT) & (PTRS_PER_PUD - 1); | ||
| 461 | } | ||
| 462 | |||
| 463 | static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address) | ||
| 464 | { | ||
| 465 | return (pud_t *)pgd_page_vaddr(*pgd) + pud_index(address); | ||
| 466 | } | ||
| 467 | |||
| 468 | static inline int pgd_bad(pgd_t pgd) | ||
| 469 | { | ||
| 470 | return (pgd_flags(pgd) & ~_PAGE_USER) != _KERNPG_TABLE; | ||
| 471 | } | ||
| 472 | |||
| 473 | static inline int pgd_none(pgd_t pgd) | ||
| 474 | { | ||
| 475 | return !native_pgd_val(pgd); | ||
| 476 | } | ||
| 477 | #endif /* PAGETABLE_LEVELS > 3 */ | ||
| 478 | |||
| 479 | #endif /* __ASSEMBLY__ */ | ||
| 453 | 480 | ||
| 454 | /* | 481 | /* |
| 455 | * the pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD] | 482 | * the pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD] |
| @@ -476,28 +503,6 @@ static inline void __init paravirt_pagetable_setup_done(pgd_t *base) | |||
| 476 | 503 | ||
| 477 | #ifndef __ASSEMBLY__ | 504 | #ifndef __ASSEMBLY__ |
| 478 | 505 | ||
| 479 | enum { | ||
| 480 | PG_LEVEL_NONE, | ||
| 481 | PG_LEVEL_4K, | ||
| 482 | PG_LEVEL_2M, | ||
| 483 | PG_LEVEL_1G, | ||
| 484 | PG_LEVEL_NUM | ||
| 485 | }; | ||
| 486 | |||
| 487 | #ifdef CONFIG_PROC_FS | ||
| 488 | extern void update_page_count(int level, unsigned long pages); | ||
| 489 | #else | ||
| 490 | static inline void update_page_count(int level, unsigned long pages) { } | ||
| 491 | #endif | ||
| 492 | |||
| 493 | /* | ||
| 494 | * Helper function that returns the kernel pagetable entry controlling | ||
| 495 | * the virtual address 'address'. NULL means no pagetable entry present. | ||
| 496 | * NOTE: the return type is pte_t but if the pmd is PSE then we return it | ||
| 497 | * as a pte too. | ||
| 498 | */ | ||
| 499 | extern pte_t *lookup_address(unsigned long address, unsigned int *level); | ||
| 500 | |||
| 501 | /* local pte updates need not use xchg for locking */ | 506 | /* local pte updates need not use xchg for locking */ |
| 502 | static inline pte_t native_local_ptep_get_and_clear(pte_t *ptep) | 507 | static inline pte_t native_local_ptep_get_and_clear(pte_t *ptep) |
| 503 | { | 508 | { |
diff --git a/arch/x86/include/asm/pgtable_32.h b/arch/x86/include/asm/pgtable_32.h index 72b020deb46b..97612fc7632f 100644 --- a/arch/x86/include/asm/pgtable_32.h +++ b/arch/x86/include/asm/pgtable_32.h | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | #ifndef _ASM_X86_PGTABLE_32_H | 1 | #ifndef _ASM_X86_PGTABLE_32_H |
| 2 | #define _ASM_X86_PGTABLE_32_H | 2 | #define _ASM_X86_PGTABLE_32_H |
| 3 | 3 | ||
| 4 | #include <asm/pgtable_32_types.h> | ||
| 4 | 5 | ||
| 5 | /* | 6 | /* |
| 6 | * The Linux memory management assumes a three-level page table setup. On | 7 | * The Linux memory management assumes a three-level page table setup. On |
| @@ -33,47 +34,6 @@ void paging_init(void); | |||
| 33 | 34 | ||
| 34 | extern void set_pmd_pfn(unsigned long, unsigned long, pgprot_t); | 35 | extern void set_pmd_pfn(unsigned long, unsigned long, pgprot_t); |
| 35 | 36 | ||
| 36 | /* | ||
| 37 | * The Linux x86 paging architecture is 'compile-time dual-mode', it | ||
| 38 | * implements both the traditional 2-level x86 page tables and the | ||
| 39 | * newer 3-level PAE-mode page tables. | ||
| 40 | */ | ||
| 41 | #ifdef CONFIG_X86_PAE | ||
| 42 | # include <asm/pgtable-3level-defs.h> | ||
| 43 | # define PMD_SIZE (1UL << PMD_SHIFT) | ||
| 44 | # define PMD_MASK (~(PMD_SIZE - 1)) | ||
| 45 | #else | ||
| 46 | # include <asm/pgtable-2level-defs.h> | ||
| 47 | #endif | ||
| 48 | |||
| 49 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) | ||
| 50 | #define PGDIR_MASK (~(PGDIR_SIZE - 1)) | ||
| 51 | |||
| 52 | /* Just any arbitrary offset to the start of the vmalloc VM area: the | ||
| 53 | * current 8MB value just means that there will be a 8MB "hole" after the | ||
| 54 | * physical memory until the kernel virtual memory starts. That means that | ||
| 55 | * any out-of-bounds memory accesses will hopefully be caught. | ||
| 56 | * The vmalloc() routines leaves a hole of 4kB between each vmalloced | ||
| 57 | * area for the same reason. ;) | ||
| 58 | */ | ||
| 59 | #define VMALLOC_OFFSET (8 * 1024 * 1024) | ||
| 60 | #define VMALLOC_START ((unsigned long)high_memory + VMALLOC_OFFSET) | ||
| 61 | #ifdef CONFIG_X86_PAE | ||
| 62 | #define LAST_PKMAP 512 | ||
| 63 | #else | ||
| 64 | #define LAST_PKMAP 1024 | ||
| 65 | #endif | ||
| 66 | |||
| 67 | #define PKMAP_BASE ((FIXADDR_BOOT_START - PAGE_SIZE * (LAST_PKMAP + 1)) \ | ||
| 68 | & PMD_MASK) | ||
| 69 | |||
| 70 | #ifdef CONFIG_HIGHMEM | ||
| 71 | # define VMALLOC_END (PKMAP_BASE - 2 * PAGE_SIZE) | ||
| 72 | #else | ||
| 73 | # define VMALLOC_END (FIXADDR_START - 2 * PAGE_SIZE) | ||
| 74 | #endif | ||
| 75 | |||
| 76 | #define MAXMEM (VMALLOC_END - PAGE_OFFSET - __VMALLOC_RESERVE) | ||
| 77 | 37 | ||
| 78 | /* | 38 | /* |
| 79 | * Define this if things work differently on an i386 and an i486: | 39 | * Define this if things work differently on an i386 and an i486: |
| @@ -85,55 +45,12 @@ extern void set_pmd_pfn(unsigned long, unsigned long, pgprot_t); | |||
| 85 | /* The boot page tables (all created as a single array) */ | 45 | /* The boot page tables (all created as a single array) */ |
| 86 | extern unsigned long pg0[]; | 46 | extern unsigned long pg0[]; |
| 87 | 47 | ||
| 88 | #define pte_present(x) ((x).pte_low & (_PAGE_PRESENT | _PAGE_PROTNONE)) | ||
| 89 | |||
| 90 | /* To avoid harmful races, pmd_none(x) should check only the lower when PAE */ | ||
| 91 | #define pmd_none(x) (!(unsigned long)pmd_val((x))) | ||
| 92 | #define pmd_present(x) (pmd_val((x)) & _PAGE_PRESENT) | ||
| 93 | #define pmd_bad(x) ((pmd_val(x) & (PTE_FLAGS_MASK & ~_PAGE_USER)) != _KERNPG_TABLE) | ||
| 94 | |||
| 95 | #define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT)) | ||
| 96 | |||
| 97 | #ifdef CONFIG_X86_PAE | 48 | #ifdef CONFIG_X86_PAE |
| 98 | # include <asm/pgtable-3level.h> | 49 | # include <asm/pgtable-3level.h> |
| 99 | #else | 50 | #else |
| 100 | # include <asm/pgtable-2level.h> | 51 | # include <asm/pgtable-2level.h> |
| 101 | #endif | 52 | #endif |
| 102 | 53 | ||
| 103 | /* | ||
| 104 | * Conversion functions: convert a page and protection to a page entry, | ||
| 105 | * and a page entry and page directory to the page they refer to. | ||
| 106 | */ | ||
| 107 | #define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot)) | ||
| 108 | |||
| 109 | |||
| 110 | static inline int pud_large(pud_t pud) { return 0; } | ||
| 111 | |||
| 112 | /* | ||
| 113 | * the pmd page can be thought of an array like this: pmd_t[PTRS_PER_PMD] | ||
| 114 | * | ||
| 115 | * this macro returns the index of the entry in the pmd page which would | ||
| 116 | * control the given virtual address | ||
| 117 | */ | ||
| 118 | #define pmd_index(address) \ | ||
| 119 | (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)) | ||
| 120 | |||
| 121 | /* | ||
| 122 | * the pte page can be thought of an array like this: pte_t[PTRS_PER_PTE] | ||
| 123 | * | ||
| 124 | * this macro returns the index of the entry in the pte page which would | ||
| 125 | * control the given virtual address | ||
| 126 | */ | ||
| 127 | #define pte_index(address) \ | ||
| 128 | (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) | ||
| 129 | #define pte_offset_kernel(dir, address) \ | ||
| 130 | ((pte_t *)pmd_page_vaddr(*(dir)) + pte_index((address))) | ||
| 131 | |||
| 132 | #define pmd_page(pmd) (pfn_to_page(pmd_val((pmd)) >> PAGE_SHIFT)) | ||
| 133 | |||
| 134 | #define pmd_page_vaddr(pmd) \ | ||
| 135 | ((unsigned long)__va(pmd_val((pmd)) & PTE_PFN_MASK)) | ||
| 136 | |||
| 137 | #if defined(CONFIG_HIGHPTE) | 54 | #if defined(CONFIG_HIGHPTE) |
| 138 | #define pte_offset_map(dir, address) \ | 55 | #define pte_offset_map(dir, address) \ |
| 139 | ((pte_t *)kmap_atomic_pte(pmd_page(*(dir)), KM_PTE0) + \ | 56 | ((pte_t *)kmap_atomic_pte(pmd_page(*(dir)), KM_PTE0) + \ |
| @@ -176,7 +93,4 @@ do { \ | |||
| 176 | #define kern_addr_valid(kaddr) (0) | 93 | #define kern_addr_valid(kaddr) (0) |
| 177 | #endif | 94 | #endif |
| 178 | 95 | ||
| 179 | #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ | ||
| 180 | remap_pfn_range(vma, vaddr, pfn, size, prot) | ||
| 181 | |||
| 182 | #endif /* _ASM_X86_PGTABLE_32_H */ | 96 | #endif /* _ASM_X86_PGTABLE_32_H */ |
diff --git a/arch/x86/include/asm/pgtable_32_types.h b/arch/x86/include/asm/pgtable_32_types.h new file mode 100644 index 000000000000..bd8df3b2fe04 --- /dev/null +++ b/arch/x86/include/asm/pgtable_32_types.h | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | #ifndef _ASM_X86_PGTABLE_32_DEFS_H | ||
| 2 | #define _ASM_X86_PGTABLE_32_DEFS_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * The Linux x86 paging architecture is 'compile-time dual-mode', it | ||
| 6 | * implements both the traditional 2-level x86 page tables and the | ||
| 7 | * newer 3-level PAE-mode page tables. | ||
| 8 | */ | ||
| 9 | #ifdef CONFIG_X86_PAE | ||
| 10 | # include <asm/pgtable-3level_types.h> | ||
| 11 | # define PMD_SIZE (1UL << PMD_SHIFT) | ||
| 12 | # define PMD_MASK (~(PMD_SIZE - 1)) | ||
| 13 | #else | ||
| 14 | # include <asm/pgtable-2level_types.h> | ||
| 15 | #endif | ||
| 16 | |||
| 17 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) | ||
| 18 | #define PGDIR_MASK (~(PGDIR_SIZE - 1)) | ||
| 19 | |||
| 20 | /* Just any arbitrary offset to the start of the vmalloc VM area: the | ||
| 21 | * current 8MB value just means that there will be a 8MB "hole" after the | ||
| 22 | * physical memory until the kernel virtual memory starts. That means that | ||
| 23 | * any out-of-bounds memory accesses will hopefully be caught. | ||
| 24 | * The vmalloc() routines leaves a hole of 4kB between each vmalloced | ||
| 25 | * area for the same reason. ;) | ||
| 26 | */ | ||
| 27 | #define VMALLOC_OFFSET (8 * 1024 * 1024) | ||
| 28 | #define VMALLOC_START ((unsigned long)high_memory + VMALLOC_OFFSET) | ||
| 29 | #ifdef CONFIG_X86_PAE | ||
| 30 | #define LAST_PKMAP 512 | ||
| 31 | #else | ||
| 32 | #define LAST_PKMAP 1024 | ||
| 33 | #endif | ||
| 34 | |||
| 35 | #define PKMAP_BASE ((FIXADDR_BOOT_START - PAGE_SIZE * (LAST_PKMAP + 1)) \ | ||
| 36 | & PMD_MASK) | ||
| 37 | |||
| 38 | #ifdef CONFIG_HIGHMEM | ||
| 39 | # define VMALLOC_END (PKMAP_BASE - 2 * PAGE_SIZE) | ||
| 40 | #else | ||
| 41 | # define VMALLOC_END (FIXADDR_START - 2 * PAGE_SIZE) | ||
| 42 | #endif | ||
| 43 | |||
| 44 | #define MAXMEM (VMALLOC_END - PAGE_OFFSET - __VMALLOC_RESERVE) | ||
| 45 | |||
| 46 | #endif /* _ASM_X86_PGTABLE_32_DEFS_H */ | ||
diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h index ba09289accaa..6b87bc6d5018 100644 --- a/arch/x86/include/asm/pgtable_64.h +++ b/arch/x86/include/asm/pgtable_64.h | |||
| @@ -2,6 +2,8 @@ | |||
| 2 | #define _ASM_X86_PGTABLE_64_H | 2 | #define _ASM_X86_PGTABLE_64_H |
| 3 | 3 | ||
| 4 | #include <linux/const.h> | 4 | #include <linux/const.h> |
| 5 | #include <asm/pgtable_64_types.h> | ||
| 6 | |||
| 5 | #ifndef __ASSEMBLY__ | 7 | #ifndef __ASSEMBLY__ |
| 6 | 8 | ||
| 7 | /* | 9 | /* |
| @@ -11,7 +13,6 @@ | |||
| 11 | #include <asm/processor.h> | 13 | #include <asm/processor.h> |
| 12 | #include <linux/bitops.h> | 14 | #include <linux/bitops.h> |
| 13 | #include <linux/threads.h> | 15 | #include <linux/threads.h> |
| 14 | #include <asm/pda.h> | ||
| 15 | 16 | ||
| 16 | extern pud_t level3_kernel_pgt[512]; | 17 | extern pud_t level3_kernel_pgt[512]; |
| 17 | extern pud_t level3_ident_pgt[512]; | 18 | extern pud_t level3_ident_pgt[512]; |
| @@ -26,32 +27,6 @@ extern void paging_init(void); | |||
| 26 | 27 | ||
| 27 | #endif /* !__ASSEMBLY__ */ | 28 | #endif /* !__ASSEMBLY__ */ |
| 28 | 29 | ||
| 29 | #define SHARED_KERNEL_PMD 0 | ||
| 30 | |||
| 31 | /* | ||
| 32 | * PGDIR_SHIFT determines what a top-level page table entry can map | ||
| 33 | */ | ||
| 34 | #define PGDIR_SHIFT 39 | ||
| 35 | #define PTRS_PER_PGD 512 | ||
| 36 | |||
| 37 | /* | ||
| 38 | * 3rd level page | ||
| 39 | */ | ||
| 40 | #define PUD_SHIFT 30 | ||
| 41 | #define PTRS_PER_PUD 512 | ||
| 42 | |||
| 43 | /* | ||
| 44 | * PMD_SHIFT determines the size of the area a middle-level | ||
| 45 | * page table can map | ||
| 46 | */ | ||
| 47 | #define PMD_SHIFT 21 | ||
| 48 | #define PTRS_PER_PMD 512 | ||
| 49 | |||
| 50 | /* | ||
| 51 | * entries per page directory level | ||
| 52 | */ | ||
| 53 | #define PTRS_PER_PTE 512 | ||
| 54 | |||
| 55 | #ifndef __ASSEMBLY__ | 30 | #ifndef __ASSEMBLY__ |
| 56 | 31 | ||
| 57 | #define pte_ERROR(e) \ | 32 | #define pte_ERROR(e) \ |
| @@ -67,9 +42,6 @@ extern void paging_init(void); | |||
| 67 | printk("%s:%d: bad pgd %p(%016lx).\n", \ | 42 | printk("%s:%d: bad pgd %p(%016lx).\n", \ |
| 68 | __FILE__, __LINE__, &(e), pgd_val(e)) | 43 | __FILE__, __LINE__, &(e), pgd_val(e)) |
| 69 | 44 | ||
| 70 | #define pgd_none(x) (!pgd_val(x)) | ||
| 71 | #define pud_none(x) (!pud_val(x)) | ||
| 72 | |||
| 73 | struct mm_struct; | 45 | struct mm_struct; |
| 74 | 46 | ||
| 75 | void set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t new_pte); | 47 | void set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t new_pte); |
| @@ -134,48 +106,6 @@ static inline void native_pgd_clear(pgd_t *pgd) | |||
| 134 | native_set_pgd(pgd, native_make_pgd(0)); | 106 | native_set_pgd(pgd, native_make_pgd(0)); |
| 135 | } | 107 | } |
| 136 | 108 | ||
| 137 | #define pte_same(a, b) ((a).pte == (b).pte) | ||
| 138 | |||
| 139 | #endif /* !__ASSEMBLY__ */ | ||
| 140 | |||
| 141 | #define PMD_SIZE (_AC(1, UL) << PMD_SHIFT) | ||
| 142 | #define PMD_MASK (~(PMD_SIZE - 1)) | ||
| 143 | #define PUD_SIZE (_AC(1, UL) << PUD_SHIFT) | ||
| 144 | #define PUD_MASK (~(PUD_SIZE - 1)) | ||
| 145 | #define PGDIR_SIZE (_AC(1, UL) << PGDIR_SHIFT) | ||
| 146 | #define PGDIR_MASK (~(PGDIR_SIZE - 1)) | ||
| 147 | |||
| 148 | |||
| 149 | #define MAXMEM _AC(__AC(1, UL) << MAX_PHYSMEM_BITS, UL) | ||
| 150 | #define VMALLOC_START _AC(0xffffc20000000000, UL) | ||
| 151 | #define VMALLOC_END _AC(0xffffe1ffffffffff, UL) | ||
| 152 | #define VMEMMAP_START _AC(0xffffe20000000000, UL) | ||
| 153 | #define MODULES_VADDR _AC(0xffffffffa0000000, UL) | ||
| 154 | #define MODULES_END _AC(0xffffffffff000000, UL) | ||
| 155 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) | ||
| 156 | |||
| 157 | #ifndef __ASSEMBLY__ | ||
| 158 | |||
| 159 | static inline int pgd_bad(pgd_t pgd) | ||
| 160 | { | ||
| 161 | return (pgd_val(pgd) & ~(PTE_PFN_MASK | _PAGE_USER)) != _KERNPG_TABLE; | ||
| 162 | } | ||
| 163 | |||
| 164 | static inline int pud_bad(pud_t pud) | ||
| 165 | { | ||
| 166 | return (pud_val(pud) & ~(PTE_PFN_MASK | _PAGE_USER)) != _KERNPG_TABLE; | ||
| 167 | } | ||
| 168 | |||
| 169 | static inline int pmd_bad(pmd_t pmd) | ||
| 170 | { | ||
| 171 | return (pmd_val(pmd) & ~(PTE_PFN_MASK | _PAGE_USER)) != _KERNPG_TABLE; | ||
| 172 | } | ||
| 173 | |||
| 174 | #define pte_none(x) (!pte_val((x))) | ||
| 175 | #define pte_present(x) (pte_val((x)) & (_PAGE_PRESENT | _PAGE_PROTNONE)) | ||
| 176 | |||
| 177 | #define pages_to_mb(x) ((x) >> (20 - PAGE_SHIFT)) /* FIXME: is this right? */ | ||
| 178 | |||
| 179 | /* | 109 | /* |
| 180 | * Conversion functions: convert a page and protection to a page entry, | 110 | * Conversion functions: convert a page and protection to a page entry, |
| 181 | * and a page entry and page directory to the page they refer to. | 111 | * and a page entry and page directory to the page they refer to. |
| @@ -184,41 +114,12 @@ static inline int pmd_bad(pmd_t pmd) | |||
| 184 | /* | 114 | /* |
| 185 | * Level 4 access. | 115 | * Level 4 access. |
| 186 | */ | 116 | */ |
| 187 | #define pgd_page_vaddr(pgd) \ | ||
| 188 | ((unsigned long)__va((unsigned long)pgd_val((pgd)) & PTE_PFN_MASK)) | ||
| 189 | #define pgd_page(pgd) (pfn_to_page(pgd_val((pgd)) >> PAGE_SHIFT)) | ||
| 190 | #define pgd_present(pgd) (pgd_val(pgd) & _PAGE_PRESENT) | ||
| 191 | static inline int pgd_large(pgd_t pgd) { return 0; } | 117 | static inline int pgd_large(pgd_t pgd) { return 0; } |
| 192 | #define mk_kernel_pgd(address) __pgd((address) | _KERNPG_TABLE) | 118 | #define mk_kernel_pgd(address) __pgd((address) | _KERNPG_TABLE) |
| 193 | 119 | ||
| 194 | /* PUD - Level3 access */ | 120 | /* PUD - Level3 access */ |
| 195 | /* to find an entry in a page-table-directory. */ | ||
| 196 | #define pud_page_vaddr(pud) \ | ||
| 197 | ((unsigned long)__va(pud_val((pud)) & PHYSICAL_PAGE_MASK)) | ||
| 198 | #define pud_page(pud) (pfn_to_page(pud_val((pud)) >> PAGE_SHIFT)) | ||
| 199 | #define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD - 1)) | ||
| 200 | #define pud_offset(pgd, address) \ | ||
| 201 | ((pud_t *)pgd_page_vaddr(*(pgd)) + pud_index((address))) | ||
| 202 | #define pud_present(pud) (pud_val((pud)) & _PAGE_PRESENT) | ||
| 203 | |||
| 204 | static inline int pud_large(pud_t pte) | ||
| 205 | { | ||
| 206 | return (pud_val(pte) & (_PAGE_PSE | _PAGE_PRESENT)) == | ||
| 207 | (_PAGE_PSE | _PAGE_PRESENT); | ||
| 208 | } | ||
| 209 | 121 | ||
| 210 | /* PMD - Level 2 access */ | 122 | /* PMD - Level 2 access */ |
| 211 | #define pmd_page_vaddr(pmd) ((unsigned long) __va(pmd_val((pmd)) & PTE_PFN_MASK)) | ||
| 212 | #define pmd_page(pmd) (pfn_to_page(pmd_val((pmd)) >> PAGE_SHIFT)) | ||
| 213 | |||
| 214 | #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)) | ||
| 215 | #define pmd_offset(dir, address) ((pmd_t *)pud_page_vaddr(*(dir)) + \ | ||
| 216 | pmd_index(address)) | ||
| 217 | #define pmd_none(x) (!pmd_val((x))) | ||
| 218 | #define pmd_present(x) (pmd_val((x)) & _PAGE_PRESENT) | ||
| 219 | #define pfn_pmd(nr, prot) (__pmd(((nr) << PAGE_SHIFT) | pgprot_val((prot)))) | ||
| 220 | #define pmd_pfn(x) ((pmd_val((x)) & __PHYSICAL_MASK) >> PAGE_SHIFT) | ||
| 221 | |||
| 222 | #define pte_to_pgoff(pte) ((pte_val((pte)) & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT) | 123 | #define pte_to_pgoff(pte) ((pte_val((pte)) & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT) |
| 223 | #define pgoff_to_pte(off) ((pte_t) { .pte = ((off) << PAGE_SHIFT) | \ | 124 | #define pgoff_to_pte(off) ((pte_t) { .pte = ((off) << PAGE_SHIFT) | \ |
| 224 | _PAGE_FILE }) | 125 | _PAGE_FILE }) |
| @@ -226,13 +127,6 @@ static inline int pud_large(pud_t pte) | |||
| 226 | 127 | ||
| 227 | /* PTE - Level 1 access. */ | 128 | /* PTE - Level 1 access. */ |
| 228 | 129 | ||
| 229 | /* page, protection -> pte */ | ||
| 230 | #define mk_pte(page, pgprot) pfn_pte(page_to_pfn((page)), (pgprot)) | ||
| 231 | |||
| 232 | #define pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) | ||
| 233 | #define pte_offset_kernel(dir, address) ((pte_t *) pmd_page_vaddr(*(dir)) + \ | ||
| 234 | pte_index((address))) | ||
| 235 | |||
| 236 | /* x86-64 always has all page tables mapped. */ | 130 | /* x86-64 always has all page tables mapped. */ |
| 237 | #define pte_offset_map(dir, address) pte_offset_kernel((dir), (address)) | 131 | #define pte_offset_map(dir, address) pte_offset_kernel((dir), (address)) |
| 238 | #define pte_offset_map_nested(dir, address) pte_offset_kernel((dir), (address)) | 132 | #define pte_offset_map_nested(dir, address) pte_offset_kernel((dir), (address)) |
| @@ -266,9 +160,6 @@ extern int direct_gbpages; | |||
| 266 | extern int kern_addr_valid(unsigned long addr); | 160 | extern int kern_addr_valid(unsigned long addr); |
| 267 | extern void cleanup_highmap(void); | 161 | extern void cleanup_highmap(void); |
| 268 | 162 | ||
| 269 | #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ | ||
| 270 | remap_pfn_range(vma, vaddr, pfn, size, prot) | ||
| 271 | |||
| 272 | #define HAVE_ARCH_UNMAPPED_AREA | 163 | #define HAVE_ARCH_UNMAPPED_AREA |
| 273 | #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN | 164 | #define HAVE_ARCH_UNMAPPED_AREA_TOPDOWN |
| 274 | 165 | ||
diff --git a/arch/x86/include/asm/pgtable_64_types.h b/arch/x86/include/asm/pgtable_64_types.h new file mode 100644 index 000000000000..fbf42b8e0383 --- /dev/null +++ b/arch/x86/include/asm/pgtable_64_types.h | |||
| @@ -0,0 +1,63 @@ | |||
| 1 | #ifndef _ASM_X86_PGTABLE_64_DEFS_H | ||
| 2 | #define _ASM_X86_PGTABLE_64_DEFS_H | ||
| 3 | |||
| 4 | #ifndef __ASSEMBLY__ | ||
| 5 | #include <linux/types.h> | ||
| 6 | |||
| 7 | /* | ||
| 8 | * These are used to make use of C type-checking.. | ||
| 9 | */ | ||
| 10 | typedef unsigned long pteval_t; | ||
| 11 | typedef unsigned long pmdval_t; | ||
| 12 | typedef unsigned long pudval_t; | ||
| 13 | typedef unsigned long pgdval_t; | ||
| 14 | typedef unsigned long pgprotval_t; | ||
| 15 | |||
| 16 | typedef struct { pteval_t pte; } pte_t; | ||
| 17 | |||
| 18 | #endif /* !__ASSEMBLY__ */ | ||
| 19 | |||
| 20 | #define SHARED_KERNEL_PMD 0 | ||
| 21 | #define PAGETABLE_LEVELS 4 | ||
| 22 | |||
| 23 | /* | ||
| 24 | * PGDIR_SHIFT determines what a top-level page table entry can map | ||
| 25 | */ | ||
| 26 | #define PGDIR_SHIFT 39 | ||
| 27 | #define PTRS_PER_PGD 512 | ||
| 28 | |||
| 29 | /* | ||
| 30 | * 3rd level page | ||
| 31 | */ | ||
| 32 | #define PUD_SHIFT 30 | ||
| 33 | #define PTRS_PER_PUD 512 | ||
| 34 | |||
| 35 | /* | ||
| 36 | * PMD_SHIFT determines the size of the area a middle-level | ||
| 37 | * page table can map | ||
| 38 | */ | ||
| 39 | #define PMD_SHIFT 21 | ||
| 40 | #define PTRS_PER_PMD 512 | ||
| 41 | |||
| 42 | /* | ||
| 43 | * entries per page directory level | ||
| 44 | */ | ||
| 45 | #define PTRS_PER_PTE 512 | ||
| 46 | |||
| 47 | #define PMD_SIZE (_AC(1, UL) << PMD_SHIFT) | ||
| 48 | #define PMD_MASK (~(PMD_SIZE - 1)) | ||
| 49 | #define PUD_SIZE (_AC(1, UL) << PUD_SHIFT) | ||
| 50 | #define PUD_MASK (~(PUD_SIZE - 1)) | ||
| 51 | #define PGDIR_SIZE (_AC(1, UL) << PGDIR_SHIFT) | ||
| 52 | #define PGDIR_MASK (~(PGDIR_SIZE - 1)) | ||
| 53 | |||
| 54 | |||
| 55 | #define MAXMEM _AC(__AC(1, UL) << MAX_PHYSMEM_BITS, UL) | ||
| 56 | #define VMALLOC_START _AC(0xffffc20000000000, UL) | ||
| 57 | #define VMALLOC_END _AC(0xffffe1ffffffffff, UL) | ||
| 58 | #define VMEMMAP_START _AC(0xffffe20000000000, UL) | ||
| 59 | #define MODULES_VADDR _AC(0xffffffffa0000000, UL) | ||
| 60 | #define MODULES_END _AC(0xffffffffff000000, UL) | ||
| 61 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) | ||
| 62 | |||
| 63 | #endif /* _ASM_X86_PGTABLE_64_DEFS_H */ | ||
diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h new file mode 100644 index 000000000000..4d258ad76a0f --- /dev/null +++ b/arch/x86/include/asm/pgtable_types.h | |||
| @@ -0,0 +1,328 @@ | |||
| 1 | #ifndef _ASM_X86_PGTABLE_DEFS_H | ||
| 2 | #define _ASM_X86_PGTABLE_DEFS_H | ||
| 3 | |||
| 4 | #include <linux/const.h> | ||
| 5 | #include <asm/page_types.h> | ||
| 6 | |||
| 7 | #define FIRST_USER_ADDRESS 0 | ||
| 8 | |||
| 9 | #define _PAGE_BIT_PRESENT 0 /* is present */ | ||
| 10 | #define _PAGE_BIT_RW 1 /* writeable */ | ||
| 11 | #define _PAGE_BIT_USER 2 /* userspace addressable */ | ||
| 12 | #define _PAGE_BIT_PWT 3 /* page write through */ | ||
| 13 | #define _PAGE_BIT_PCD 4 /* page cache disabled */ | ||
| 14 | #define _PAGE_BIT_ACCESSED 5 /* was accessed (raised by CPU) */ | ||
| 15 | #define _PAGE_BIT_DIRTY 6 /* was written to (raised by CPU) */ | ||
| 16 | #define _PAGE_BIT_PSE 7 /* 4 MB (or 2MB) page */ | ||
| 17 | #define _PAGE_BIT_PAT 7 /* on 4KB pages */ | ||
| 18 | #define _PAGE_BIT_GLOBAL 8 /* Global TLB entry PPro+ */ | ||
| 19 | #define _PAGE_BIT_UNUSED1 9 /* available for programmer */ | ||
| 20 | #define _PAGE_BIT_IOMAP 10 /* flag used to indicate IO mapping */ | ||
| 21 | #define _PAGE_BIT_UNUSED3 11 | ||
| 22 | #define _PAGE_BIT_PAT_LARGE 12 /* On 2MB or 1GB pages */ | ||
| 23 | #define _PAGE_BIT_SPECIAL _PAGE_BIT_UNUSED1 | ||
| 24 | #define _PAGE_BIT_CPA_TEST _PAGE_BIT_UNUSED1 | ||
| 25 | #define _PAGE_BIT_NX 63 /* No execute: only valid after cpuid check */ | ||
| 26 | |||
| 27 | /* If _PAGE_BIT_PRESENT is clear, we use these: */ | ||
| 28 | /* - if the user mapped it with PROT_NONE; pte_present gives true */ | ||
| 29 | #define _PAGE_BIT_PROTNONE _PAGE_BIT_GLOBAL | ||
| 30 | /* - set: nonlinear file mapping, saved PTE; unset:swap */ | ||
| 31 | #define _PAGE_BIT_FILE _PAGE_BIT_DIRTY | ||
| 32 | |||
| 33 | #define _PAGE_PRESENT (_AT(pteval_t, 1) << _PAGE_BIT_PRESENT) | ||
| 34 | #define _PAGE_RW (_AT(pteval_t, 1) << _PAGE_BIT_RW) | ||
| 35 | #define _PAGE_USER (_AT(pteval_t, 1) << _PAGE_BIT_USER) | ||
| 36 | #define _PAGE_PWT (_AT(pteval_t, 1) << _PAGE_BIT_PWT) | ||
| 37 | #define _PAGE_PCD (_AT(pteval_t, 1) << _PAGE_BIT_PCD) | ||
| 38 | #define _PAGE_ACCESSED (_AT(pteval_t, 1) << _PAGE_BIT_ACCESSED) | ||
| 39 | #define _PAGE_DIRTY (_AT(pteval_t, 1) << _PAGE_BIT_DIRTY) | ||
| 40 | #define _PAGE_PSE (_AT(pteval_t, 1) << _PAGE_BIT_PSE) | ||
| 41 | #define _PAGE_GLOBAL (_AT(pteval_t, 1) << _PAGE_BIT_GLOBAL) | ||
| 42 | #define _PAGE_UNUSED1 (_AT(pteval_t, 1) << _PAGE_BIT_UNUSED1) | ||
| 43 | #define _PAGE_IOMAP (_AT(pteval_t, 1) << _PAGE_BIT_IOMAP) | ||
| 44 | #define _PAGE_UNUSED3 (_AT(pteval_t, 1) << _PAGE_BIT_UNUSED3) | ||
| 45 | #define _PAGE_PAT (_AT(pteval_t, 1) << _PAGE_BIT_PAT) | ||
| 46 | #define _PAGE_PAT_LARGE (_AT(pteval_t, 1) << _PAGE_BIT_PAT_LARGE) | ||
| 47 | #define _PAGE_SPECIAL (_AT(pteval_t, 1) << _PAGE_BIT_SPECIAL) | ||
| 48 | #define _PAGE_CPA_TEST (_AT(pteval_t, 1) << _PAGE_BIT_CPA_TEST) | ||
| 49 | #define __HAVE_ARCH_PTE_SPECIAL | ||
| 50 | |||
| 51 | #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) | ||
| 52 | #define _PAGE_NX (_AT(pteval_t, 1) << _PAGE_BIT_NX) | ||
| 53 | #else | ||
| 54 | #define _PAGE_NX (_AT(pteval_t, 0)) | ||
| 55 | #endif | ||
| 56 | |||
| 57 | #define _PAGE_FILE (_AT(pteval_t, 1) << _PAGE_BIT_FILE) | ||
| 58 | #define _PAGE_PROTNONE (_AT(pteval_t, 1) << _PAGE_BIT_PROTNONE) | ||
| 59 | |||
| 60 | #define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | \ | ||
| 61 | _PAGE_ACCESSED | _PAGE_DIRTY) | ||
| 62 | #define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | \ | ||
| 63 | _PAGE_DIRTY) | ||
| 64 | |||
| 65 | /* Set of bits not changed in pte_modify */ | ||
| 66 | #define _PAGE_CHG_MASK (PTE_PFN_MASK | _PAGE_PCD | _PAGE_PWT | \ | ||
| 67 | _PAGE_SPECIAL | _PAGE_ACCESSED | _PAGE_DIRTY) | ||
| 68 | |||
| 69 | #define _PAGE_CACHE_MASK (_PAGE_PCD | _PAGE_PWT) | ||
| 70 | #define _PAGE_CACHE_WB (0) | ||
| 71 | #define _PAGE_CACHE_WC (_PAGE_PWT) | ||
| 72 | #define _PAGE_CACHE_UC_MINUS (_PAGE_PCD) | ||
| 73 | #define _PAGE_CACHE_UC (_PAGE_PCD | _PAGE_PWT) | ||
| 74 | |||
| 75 | #define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED) | ||
| 76 | #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | \ | ||
| 77 | _PAGE_ACCESSED | _PAGE_NX) | ||
| 78 | |||
| 79 | #define PAGE_SHARED_EXEC __pgprot(_PAGE_PRESENT | _PAGE_RW | \ | ||
| 80 | _PAGE_USER | _PAGE_ACCESSED) | ||
| 81 | #define PAGE_COPY_NOEXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | \ | ||
| 82 | _PAGE_ACCESSED | _PAGE_NX) | ||
| 83 | #define PAGE_COPY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | \ | ||
| 84 | _PAGE_ACCESSED) | ||
| 85 | #define PAGE_COPY PAGE_COPY_NOEXEC | ||
| 86 | #define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER | \ | ||
| 87 | _PAGE_ACCESSED | _PAGE_NX) | ||
| 88 | #define PAGE_READONLY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | \ | ||
| 89 | _PAGE_ACCESSED) | ||
| 90 | |||
| 91 | #define __PAGE_KERNEL_EXEC \ | ||
| 92 | (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_GLOBAL) | ||
| 93 | #define __PAGE_KERNEL (__PAGE_KERNEL_EXEC | _PAGE_NX) | ||
| 94 | |||
| 95 | #define __PAGE_KERNEL_RO (__PAGE_KERNEL & ~_PAGE_RW) | ||
| 96 | #define __PAGE_KERNEL_RX (__PAGE_KERNEL_EXEC & ~_PAGE_RW) | ||
| 97 | #define __PAGE_KERNEL_EXEC_NOCACHE (__PAGE_KERNEL_EXEC | _PAGE_PCD | _PAGE_PWT) | ||
| 98 | #define __PAGE_KERNEL_WC (__PAGE_KERNEL | _PAGE_CACHE_WC) | ||
| 99 | #define __PAGE_KERNEL_NOCACHE (__PAGE_KERNEL | _PAGE_PCD | _PAGE_PWT) | ||
| 100 | #define __PAGE_KERNEL_UC_MINUS (__PAGE_KERNEL | _PAGE_PCD) | ||
| 101 | #define __PAGE_KERNEL_VSYSCALL (__PAGE_KERNEL_RX | _PAGE_USER) | ||
| 102 | #define __PAGE_KERNEL_VSYSCALL_NOCACHE (__PAGE_KERNEL_VSYSCALL | _PAGE_PCD | _PAGE_PWT) | ||
| 103 | #define __PAGE_KERNEL_LARGE (__PAGE_KERNEL | _PAGE_PSE) | ||
| 104 | #define __PAGE_KERNEL_LARGE_NOCACHE (__PAGE_KERNEL | _PAGE_CACHE_UC | _PAGE_PSE) | ||
| 105 | #define __PAGE_KERNEL_LARGE_EXEC (__PAGE_KERNEL_EXEC | _PAGE_PSE) | ||
| 106 | |||
| 107 | #define __PAGE_KERNEL_IO (__PAGE_KERNEL | _PAGE_IOMAP) | ||
| 108 | #define __PAGE_KERNEL_IO_NOCACHE (__PAGE_KERNEL_NOCACHE | _PAGE_IOMAP) | ||
| 109 | #define __PAGE_KERNEL_IO_UC_MINUS (__PAGE_KERNEL_UC_MINUS | _PAGE_IOMAP) | ||
| 110 | #define __PAGE_KERNEL_IO_WC (__PAGE_KERNEL_WC | _PAGE_IOMAP) | ||
| 111 | |||
| 112 | #define PAGE_KERNEL __pgprot(__PAGE_KERNEL) | ||
| 113 | #define PAGE_KERNEL_RO __pgprot(__PAGE_KERNEL_RO) | ||
| 114 | #define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC) | ||
| 115 | #define PAGE_KERNEL_RX __pgprot(__PAGE_KERNEL_RX) | ||
| 116 | #define PAGE_KERNEL_WC __pgprot(__PAGE_KERNEL_WC) | ||
| 117 | #define PAGE_KERNEL_NOCACHE __pgprot(__PAGE_KERNEL_NOCACHE) | ||
| 118 | #define PAGE_KERNEL_UC_MINUS __pgprot(__PAGE_KERNEL_UC_MINUS) | ||
| 119 | #define PAGE_KERNEL_EXEC_NOCACHE __pgprot(__PAGE_KERNEL_EXEC_NOCACHE) | ||
| 120 | #define PAGE_KERNEL_LARGE __pgprot(__PAGE_KERNEL_LARGE) | ||
| 121 | #define PAGE_KERNEL_LARGE_NOCACHE __pgprot(__PAGE_KERNEL_LARGE_NOCACHE) | ||
| 122 | #define PAGE_KERNEL_LARGE_EXEC __pgprot(__PAGE_KERNEL_LARGE_EXEC) | ||
| 123 | #define PAGE_KERNEL_VSYSCALL __pgprot(__PAGE_KERNEL_VSYSCALL) | ||
| 124 | #define PAGE_KERNEL_VSYSCALL_NOCACHE __pgprot(__PAGE_KERNEL_VSYSCALL_NOCACHE) | ||
| 125 | |||
| 126 | #define PAGE_KERNEL_IO __pgprot(__PAGE_KERNEL_IO) | ||
| 127 | #define PAGE_KERNEL_IO_NOCACHE __pgprot(__PAGE_KERNEL_IO_NOCACHE) | ||
| 128 | #define PAGE_KERNEL_IO_UC_MINUS __pgprot(__PAGE_KERNEL_IO_UC_MINUS) | ||
| 129 | #define PAGE_KERNEL_IO_WC __pgprot(__PAGE_KERNEL_IO_WC) | ||
| 130 | |||
| 131 | /* xwr */ | ||
| 132 | #define __P000 PAGE_NONE | ||
| 133 | #define __P001 PAGE_READONLY | ||
| 134 | #define __P010 PAGE_COPY | ||
| 135 | #define __P011 PAGE_COPY | ||
| 136 | #define __P100 PAGE_READONLY_EXEC | ||
| 137 | #define __P101 PAGE_READONLY_EXEC | ||
| 138 | #define __P110 PAGE_COPY_EXEC | ||
| 139 | #define __P111 PAGE_COPY_EXEC | ||
| 140 | |||
| 141 | #define __S000 PAGE_NONE | ||
| 142 | #define __S001 PAGE_READONLY | ||
| 143 | #define __S010 PAGE_SHARED | ||
| 144 | #define __S011 PAGE_SHARED | ||
| 145 | #define __S100 PAGE_READONLY_EXEC | ||
| 146 | #define __S101 PAGE_READONLY_EXEC | ||
| 147 | #define __S110 PAGE_SHARED_EXEC | ||
| 148 | #define __S111 PAGE_SHARED_EXEC | ||
| 149 | |||
| 150 | /* | ||
| 151 | * early identity mapping pte attrib macros. | ||
| 152 | */ | ||
| 153 | #ifdef CONFIG_X86_64 | ||
| 154 | #define __PAGE_KERNEL_IDENT_LARGE_EXEC __PAGE_KERNEL_LARGE_EXEC | ||
| 155 | #else | ||
| 156 | /* | ||
| 157 | * For PDE_IDENT_ATTR include USER bit. As the PDE and PTE protection | ||
| 158 | * bits are combined, this will alow user to access the high address mapped | ||
| 159 | * VDSO in the presence of CONFIG_COMPAT_VDSO | ||
| 160 | */ | ||
| 161 | #define PTE_IDENT_ATTR 0x003 /* PRESENT+RW */ | ||
| 162 | #define PDE_IDENT_ATTR 0x067 /* PRESENT+RW+USER+DIRTY+ACCESSED */ | ||
| 163 | #define PGD_IDENT_ATTR 0x001 /* PRESENT (no other attributes) */ | ||
| 164 | #endif | ||
| 165 | |||
| 166 | #ifdef CONFIG_X86_32 | ||
| 167 | # include "pgtable_32_types.h" | ||
| 168 | #else | ||
| 169 | # include "pgtable_64_types.h" | ||
| 170 | #endif | ||
| 171 | |||
| 172 | #ifndef __ASSEMBLY__ | ||
| 173 | |||
| 174 | #include <linux/types.h> | ||
| 175 | |||
| 176 | /* PTE_PFN_MASK extracts the PFN from a (pte|pmd|pud|pgd)val_t */ | ||
| 177 | #define PTE_PFN_MASK ((pteval_t)PHYSICAL_PAGE_MASK) | ||
| 178 | |||
| 179 | /* PTE_FLAGS_MASK extracts the flags from a (pte|pmd|pud|pgd)val_t */ | ||
| 180 | #define PTE_FLAGS_MASK (~PTE_PFN_MASK) | ||
| 181 | |||
| 182 | typedef struct pgprot { pgprotval_t pgprot; } pgprot_t; | ||
| 183 | |||
| 184 | typedef struct { pgdval_t pgd; } pgd_t; | ||
| 185 | |||
| 186 | static inline pgd_t native_make_pgd(pgdval_t val) | ||
| 187 | { | ||
| 188 | return (pgd_t) { val }; | ||
| 189 | } | ||
| 190 | |||
| 191 | static inline pgdval_t native_pgd_val(pgd_t pgd) | ||
| 192 | { | ||
| 193 | return pgd.pgd; | ||
| 194 | } | ||
| 195 | |||
| 196 | static inline pgdval_t pgd_flags(pgd_t pgd) | ||
| 197 | { | ||
| 198 | return native_pgd_val(pgd) & PTE_FLAGS_MASK; | ||
| 199 | } | ||
| 200 | |||
| 201 | #if PAGETABLE_LEVELS > 3 | ||
| 202 | typedef struct { pudval_t pud; } pud_t; | ||
| 203 | |||
| 204 | static inline pud_t native_make_pud(pmdval_t val) | ||
| 205 | { | ||
| 206 | return (pud_t) { val }; | ||
| 207 | } | ||
| 208 | |||
| 209 | static inline pudval_t native_pud_val(pud_t pud) | ||
| 210 | { | ||
| 211 | return pud.pud; | ||
| 212 | } | ||
| 213 | #else | ||
| 214 | #include <asm-generic/pgtable-nopud.h> | ||
| 215 | |||
| 216 | static inline pudval_t native_pud_val(pud_t pud) | ||
| 217 | { | ||
| 218 | return native_pgd_val(pud.pgd); | ||
| 219 | } | ||
| 220 | #endif | ||
| 221 | |||
| 222 | #if PAGETABLE_LEVELS > 2 | ||
| 223 | typedef struct { pmdval_t pmd; } pmd_t; | ||
| 224 | |||
| 225 | static inline pmd_t native_make_pmd(pmdval_t val) | ||
| 226 | { | ||
| 227 | return (pmd_t) { val }; | ||
| 228 | } | ||
| 229 | |||
| 230 | static inline pmdval_t native_pmd_val(pmd_t pmd) | ||
| 231 | { | ||
| 232 | return pmd.pmd; | ||
| 233 | } | ||
| 234 | #else | ||
| 235 | #include <asm-generic/pgtable-nopmd.h> | ||
| 236 | |||
| 237 | static inline pmdval_t native_pmd_val(pmd_t pmd) | ||
| 238 | { | ||
| 239 | return native_pgd_val(pmd.pud.pgd); | ||
| 240 | } | ||
| 241 | #endif | ||
| 242 | |||
| 243 | static inline pudval_t pud_flags(pud_t pud) | ||
| 244 | { | ||
| 245 | return native_pud_val(pud) & PTE_FLAGS_MASK; | ||
| 246 | } | ||
| 247 | |||
| 248 | static inline pmdval_t pmd_flags(pmd_t pmd) | ||
| 249 | { | ||
| 250 | return native_pmd_val(pmd) & PTE_FLAGS_MASK; | ||
| 251 | } | ||
| 252 | |||
| 253 | static inline pte_t native_make_pte(pteval_t val) | ||
| 254 | { | ||
| 255 | return (pte_t) { .pte = val }; | ||
| 256 | } | ||
| 257 | |||
| 258 | static inline pteval_t native_pte_val(pte_t pte) | ||
| 259 | { | ||
| 260 | return pte.pte; | ||
| 261 | } | ||
| 262 | |||
| 263 | static inline pteval_t pte_flags(pte_t pte) | ||
| 264 | { | ||
| 265 | return native_pte_val(pte) & PTE_FLAGS_MASK; | ||
| 266 | } | ||
| 267 | |||
| 268 | #define pgprot_val(x) ((x).pgprot) | ||
| 269 | #define __pgprot(x) ((pgprot_t) { (x) } ) | ||
| 270 | |||
| 271 | |||
| 272 | typedef struct page *pgtable_t; | ||
| 273 | |||
| 274 | extern pteval_t __supported_pte_mask; | ||
| 275 | extern int nx_enabled; | ||
| 276 | |||
| 277 | #define pgprot_writecombine pgprot_writecombine | ||
| 278 | extern pgprot_t pgprot_writecombine(pgprot_t prot); | ||
| 279 | |||
| 280 | /* Indicate that x86 has its own track and untrack pfn vma functions */ | ||
| 281 | #define __HAVE_PFNMAP_TRACKING | ||
| 282 | |||
| 283 | #define __HAVE_PHYS_MEM_ACCESS_PROT | ||
| 284 | struct file; | ||
| 285 | pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, | ||
| 286 | unsigned long size, pgprot_t vma_prot); | ||
| 287 | int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, | ||
| 288 | unsigned long size, pgprot_t *vma_prot); | ||
| 289 | |||
| 290 | /* Install a pte for a particular vaddr in kernel space. */ | ||
| 291 | void set_pte_vaddr(unsigned long vaddr, pte_t pte); | ||
| 292 | |||
| 293 | #ifdef CONFIG_X86_32 | ||
| 294 | extern void native_pagetable_setup_start(pgd_t *base); | ||
| 295 | extern void native_pagetable_setup_done(pgd_t *base); | ||
| 296 | #else | ||
| 297 | static inline void native_pagetable_setup_start(pgd_t *base) {} | ||
| 298 | static inline void native_pagetable_setup_done(pgd_t *base) {} | ||
| 299 | #endif | ||
| 300 | |||
| 301 | struct seq_file; | ||
| 302 | extern void arch_report_meminfo(struct seq_file *m); | ||
| 303 | |||
| 304 | enum { | ||
| 305 | PG_LEVEL_NONE, | ||
| 306 | PG_LEVEL_4K, | ||
| 307 | PG_LEVEL_2M, | ||
| 308 | PG_LEVEL_1G, | ||
| 309 | PG_LEVEL_NUM | ||
| 310 | }; | ||
| 311 | |||
| 312 | #ifdef CONFIG_PROC_FS | ||
| 313 | extern void update_page_count(int level, unsigned long pages); | ||
| 314 | #else | ||
| 315 | static inline void update_page_count(int level, unsigned long pages) { } | ||
| 316 | #endif | ||
| 317 | |||
| 318 | /* | ||
| 319 | * Helper function that returns the kernel pagetable entry controlling | ||
| 320 | * the virtual address 'address'. NULL means no pagetable entry present. | ||
| 321 | * NOTE: the return type is pte_t but if the pmd is PSE then we return it | ||
| 322 | * as a pte too. | ||
| 323 | */ | ||
| 324 | extern pte_t *lookup_address(unsigned long address, unsigned int *level); | ||
| 325 | |||
| 326 | #endif /* !__ASSEMBLY__ */ | ||
| 327 | |||
| 328 | #endif /* _ASM_X86_PGTABLE_DEFS_H */ | ||
diff --git a/arch/x86/include/asm/prctl.h b/arch/x86/include/asm/prctl.h index a8894647dd9a..3ac5032fae09 100644 --- a/arch/x86/include/asm/prctl.h +++ b/arch/x86/include/asm/prctl.h | |||
| @@ -6,8 +6,4 @@ | |||
| 6 | #define ARCH_GET_FS 0x1003 | 6 | #define ARCH_GET_FS 0x1003 |
| 7 | #define ARCH_GET_GS 0x1004 | 7 | #define ARCH_GET_GS 0x1004 |
| 8 | 8 | ||
| 9 | #ifdef CONFIG_X86_64 | ||
| 10 | extern long sys_arch_prctl(int, unsigned long); | ||
| 11 | #endif /* CONFIG_X86_64 */ | ||
| 12 | |||
| 13 | #endif /* _ASM_X86_PRCTL_H */ | 9 | #endif /* _ASM_X86_PRCTL_H */ |
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 3bfd5235a9eb..72914d0315e9 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
| @@ -16,6 +16,7 @@ struct mm_struct; | |||
| 16 | #include <asm/cpufeature.h> | 16 | #include <asm/cpufeature.h> |
| 17 | #include <asm/system.h> | 17 | #include <asm/system.h> |
| 18 | #include <asm/page.h> | 18 | #include <asm/page.h> |
| 19 | #include <asm/pgtable_types.h> | ||
| 19 | #include <asm/percpu.h> | 20 | #include <asm/percpu.h> |
| 20 | #include <asm/msr.h> | 21 | #include <asm/msr.h> |
| 21 | #include <asm/desc_defs.h> | 22 | #include <asm/desc_defs.h> |
| @@ -73,7 +74,7 @@ struct cpuinfo_x86 { | |||
| 73 | char pad0; | 74 | char pad0; |
| 74 | #else | 75 | #else |
| 75 | /* Number of 4K pages in DTLB/ITLB combined(in pages): */ | 76 | /* Number of 4K pages in DTLB/ITLB combined(in pages): */ |
| 76 | int x86_tlbsize; | 77 | int x86_tlbsize; |
| 77 | __u8 x86_virt_bits; | 78 | __u8 x86_virt_bits; |
| 78 | __u8 x86_phys_bits; | 79 | __u8 x86_phys_bits; |
| 79 | #endif | 80 | #endif |
| @@ -378,9 +379,30 @@ union thread_xstate { | |||
| 378 | 379 | ||
| 379 | #ifdef CONFIG_X86_64 | 380 | #ifdef CONFIG_X86_64 |
| 380 | DECLARE_PER_CPU(struct orig_ist, orig_ist); | 381 | DECLARE_PER_CPU(struct orig_ist, orig_ist); |
| 382 | |||
| 383 | union irq_stack_union { | ||
| 384 | char irq_stack[IRQ_STACK_SIZE]; | ||
| 385 | /* | ||
| 386 | * GCC hardcodes the stack canary as %gs:40. Since the | ||
| 387 | * irq_stack is the object at %gs:0, we reserve the bottom | ||
| 388 | * 48 bytes of the irq stack for the canary. | ||
| 389 | */ | ||
| 390 | struct { | ||
| 391 | char gs_base[40]; | ||
| 392 | unsigned long stack_canary; | ||
| 393 | }; | ||
| 394 | }; | ||
| 395 | |||
| 396 | DECLARE_PER_CPU(union irq_stack_union, irq_stack_union); | ||
| 397 | DECLARE_INIT_PER_CPU(irq_stack_union); | ||
| 398 | |||
| 399 | DECLARE_PER_CPU(char *, irq_stack_ptr); | ||
| 400 | #else /* X86_64 */ | ||
| 401 | #ifdef CONFIG_CC_STACKPROTECTOR | ||
| 402 | DECLARE_PER_CPU(unsigned long, stack_canary); | ||
| 381 | #endif | 403 | #endif |
| 404 | #endif /* X86_64 */ | ||
| 382 | 405 | ||
| 383 | extern void print_cpu_info(struct cpuinfo_x86 *); | ||
| 384 | extern unsigned int xstate_size; | 406 | extern unsigned int xstate_size; |
| 385 | extern void free_thread_xstate(struct task_struct *); | 407 | extern void free_thread_xstate(struct task_struct *); |
| 386 | extern struct kmem_cache *task_xstate_cachep; | 408 | extern struct kmem_cache *task_xstate_cachep; |
| @@ -752,9 +774,9 @@ extern int sysenter_setup(void); | |||
| 752 | extern struct desc_ptr early_gdt_descr; | 774 | extern struct desc_ptr early_gdt_descr; |
| 753 | 775 | ||
| 754 | extern void cpu_set_gdt(int); | 776 | extern void cpu_set_gdt(int); |
| 755 | extern void switch_to_new_gdt(void); | 777 | extern void switch_to_new_gdt(int); |
| 778 | extern void load_percpu_segment(int); | ||
| 756 | extern void cpu_init(void); | 779 | extern void cpu_init(void); |
| 757 | extern void init_gdt(int cpu); | ||
| 758 | 780 | ||
| 759 | static inline unsigned long get_debugctlmsr(void) | 781 | static inline unsigned long get_debugctlmsr(void) |
| 760 | { | 782 | { |
diff --git a/arch/x86/include/asm/proto.h b/arch/x86/include/asm/proto.h index d6a22f92ba77..49fb3ecf3bb3 100644 --- a/arch/x86/include/asm/proto.h +++ b/arch/x86/include/asm/proto.h | |||
| @@ -18,11 +18,7 @@ extern void syscall32_cpu_init(void); | |||
| 18 | 18 | ||
| 19 | extern void check_efer(void); | 19 | extern void check_efer(void); |
| 20 | 20 | ||
| 21 | #ifdef CONFIG_X86_BIOS_REBOOT | ||
| 22 | extern int reboot_force; | 21 | extern int reboot_force; |
| 23 | #else | ||
| 24 | static const int reboot_force = 0; | ||
| 25 | #endif | ||
| 26 | 22 | ||
| 27 | long do_arch_prctl(struct task_struct *task, int code, unsigned long addr); | 23 | long do_arch_prctl(struct task_struct *task, int code, unsigned long addr); |
| 28 | 24 | ||
diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h index 6d34d954c228..e304b66abeea 100644 --- a/arch/x86/include/asm/ptrace.h +++ b/arch/x86/include/asm/ptrace.h | |||
| @@ -28,7 +28,7 @@ struct pt_regs { | |||
| 28 | int xds; | 28 | int xds; |
| 29 | int xes; | 29 | int xes; |
| 30 | int xfs; | 30 | int xfs; |
| 31 | /* int gs; */ | 31 | int xgs; |
| 32 | long orig_eax; | 32 | long orig_eax; |
| 33 | long eip; | 33 | long eip; |
| 34 | int xcs; | 34 | int xcs; |
| @@ -50,7 +50,7 @@ struct pt_regs { | |||
| 50 | unsigned long ds; | 50 | unsigned long ds; |
| 51 | unsigned long es; | 51 | unsigned long es; |
| 52 | unsigned long fs; | 52 | unsigned long fs; |
| 53 | /* int gs; */ | 53 | unsigned long gs; |
| 54 | unsigned long orig_ax; | 54 | unsigned long orig_ax; |
| 55 | unsigned long ip; | 55 | unsigned long ip; |
| 56 | unsigned long cs; | 56 | unsigned long cs; |
diff --git a/arch/x86/include/asm/mach-rdc321x/rdc321x_defs.h b/arch/x86/include/asm/rdc321x_defs.h index c8e9c8bed3d0..c8e9c8bed3d0 100644 --- a/arch/x86/include/asm/mach-rdc321x/rdc321x_defs.h +++ b/arch/x86/include/asm/rdc321x_defs.h | |||
diff --git a/arch/x86/include/asm/segment.h b/arch/x86/include/asm/segment.h index 1dc1b51ac623..14e0ed86a6f9 100644 --- a/arch/x86/include/asm/segment.h +++ b/arch/x86/include/asm/segment.h | |||
| @@ -61,7 +61,7 @@ | |||
| 61 | * | 61 | * |
| 62 | * 26 - ESPFIX small SS | 62 | * 26 - ESPFIX small SS |
| 63 | * 27 - per-cpu [ offset to per-cpu data area ] | 63 | * 27 - per-cpu [ offset to per-cpu data area ] |
| 64 | * 28 - unused | 64 | * 28 - stack_canary-20 [ for stack protector ] |
| 65 | * 29 - unused | 65 | * 29 - unused |
| 66 | * 30 - unused | 66 | * 30 - unused |
| 67 | * 31 - TSS for double fault handler | 67 | * 31 - TSS for double fault handler |
| @@ -95,6 +95,13 @@ | |||
| 95 | #define __KERNEL_PERCPU 0 | 95 | #define __KERNEL_PERCPU 0 |
| 96 | #endif | 96 | #endif |
| 97 | 97 | ||
| 98 | #define GDT_ENTRY_STACK_CANARY (GDT_ENTRY_KERNEL_BASE + 16) | ||
| 99 | #ifdef CONFIG_CC_STACKPROTECTOR | ||
| 100 | #define __KERNEL_STACK_CANARY (GDT_ENTRY_STACK_CANARY * 8) | ||
| 101 | #else | ||
| 102 | #define __KERNEL_STACK_CANARY 0 | ||
| 103 | #endif | ||
| 104 | |||
| 98 | #define GDT_ENTRY_DOUBLEFAULT_TSS 31 | 105 | #define GDT_ENTRY_DOUBLEFAULT_TSS 31 |
| 99 | 106 | ||
| 100 | /* | 107 | /* |
diff --git a/arch/x86/include/asm/setup.h b/arch/x86/include/asm/setup.h index ebe858cdc8a3..8029369cd6f4 100644 --- a/arch/x86/include/asm/setup.h +++ b/arch/x86/include/asm/setup.h | |||
| @@ -1,27 +1,12 @@ | |||
| 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 | #ifdef __KERNEL__ | ||
| 5 | |||
| 4 | #define COMMAND_LINE_SIZE 2048 | 6 | #define COMMAND_LINE_SIZE 2048 |
| 5 | 7 | ||
| 6 | #ifndef __ASSEMBLY__ | 8 | #ifndef __ASSEMBLY__ |
| 7 | 9 | ||
| 8 | /* Interrupt control for vSMPowered x86_64 systems */ | ||
| 9 | void vsmp_init(void); | ||
| 10 | |||
| 11 | |||
| 12 | void setup_bios_corruption_check(void); | ||
| 13 | |||
| 14 | |||
| 15 | #ifdef CONFIG_X86_VISWS | ||
| 16 | extern void visws_early_detect(void); | ||
| 17 | extern int is_visws_box(void); | ||
| 18 | #else | ||
| 19 | static inline void visws_early_detect(void) { } | ||
| 20 | static inline int is_visws_box(void) { return 0; } | ||
| 21 | #endif | ||
| 22 | |||
| 23 | extern int wakeup_secondary_cpu_via_nmi(int apicid, unsigned long start_eip); | ||
| 24 | extern int wakeup_secondary_cpu_via_init(int apicid, unsigned long start_eip); | ||
| 25 | /* | 10 | /* |
| 26 | * Any setup quirks to be performed? | 11 | * Any setup quirks to be performed? |
| 27 | */ | 12 | */ |
| @@ -43,21 +28,13 @@ struct x86_quirks { | |||
| 43 | void (*mpc_oem_bus_info)(struct mpc_bus *m, char *name); | 28 | void (*mpc_oem_bus_info)(struct mpc_bus *m, char *name); |
| 44 | void (*mpc_oem_pci_bus)(struct mpc_bus *m); | 29 | void (*mpc_oem_pci_bus)(struct mpc_bus *m); |
| 45 | void (*smp_read_mpc_oem)(struct mpc_oemtable *oemtable, | 30 | void (*smp_read_mpc_oem)(struct mpc_oemtable *oemtable, |
| 46 | unsigned short oemsize); | 31 | unsigned short oemsize); |
| 47 | int (*setup_ioapic_ids)(void); | 32 | int (*setup_ioapic_ids)(void); |
| 48 | int (*update_genapic)(void); | 33 | int (*update_apic)(void); |
| 49 | }; | 34 | }; |
| 50 | 35 | ||
| 51 | extern struct x86_quirks *x86_quirks; | ||
| 52 | extern unsigned long saved_video_mode; | ||
| 53 | |||
| 54 | #ifndef CONFIG_PARAVIRT | ||
| 55 | #define paravirt_post_allocator_init() do {} while (0) | ||
| 56 | #endif | ||
| 57 | #endif /* __ASSEMBLY__ */ | 36 | #endif /* __ASSEMBLY__ */ |
| 58 | 37 | ||
| 59 | #ifdef __KERNEL__ | ||
| 60 | |||
| 61 | #ifdef __i386__ | 38 | #ifdef __i386__ |
| 62 | 39 | ||
| 63 | #include <linux/pfn.h> | 40 | #include <linux/pfn.h> |
| @@ -78,6 +55,28 @@ extern unsigned long saved_video_mode; | |||
| 78 | #ifndef __ASSEMBLY__ | 55 | #ifndef __ASSEMBLY__ |
| 79 | #include <asm/bootparam.h> | 56 | #include <asm/bootparam.h> |
| 80 | 57 | ||
| 58 | /* Interrupt control for vSMPowered x86_64 systems */ | ||
| 59 | void vsmp_init(void); | ||
| 60 | |||
| 61 | void setup_bios_corruption_check(void); | ||
| 62 | |||
| 63 | #ifdef CONFIG_X86_VISWS | ||
| 64 | extern void visws_early_detect(void); | ||
| 65 | extern int is_visws_box(void); | ||
| 66 | #else | ||
| 67 | static inline void visws_early_detect(void) { } | ||
| 68 | static inline int is_visws_box(void) { return 0; } | ||
| 69 | #endif | ||
| 70 | |||
| 71 | extern int wakeup_secondary_cpu_via_nmi(int apicid, unsigned long start_eip); | ||
| 72 | extern int wakeup_secondary_cpu_via_init(int apicid, unsigned long start_eip); | ||
| 73 | extern struct x86_quirks *x86_quirks; | ||
| 74 | extern unsigned long saved_video_mode; | ||
| 75 | |||
| 76 | #ifndef CONFIG_PARAVIRT | ||
| 77 | #define paravirt_post_allocator_init() do {} while (0) | ||
| 78 | #endif | ||
| 79 | |||
| 81 | #ifndef _SETUP | 80 | #ifndef _SETUP |
| 82 | 81 | ||
| 83 | /* | 82 | /* |
| @@ -100,7 +99,6 @@ extern unsigned long init_pg_tables_start; | |||
| 100 | extern unsigned long init_pg_tables_end; | 99 | extern unsigned long init_pg_tables_end; |
| 101 | 100 | ||
| 102 | #else | 101 | #else |
| 103 | void __init x86_64_init_pda(void); | ||
| 104 | void __init x86_64_start_kernel(char *real_mode); | 102 | void __init x86_64_start_kernel(char *real_mode); |
| 105 | void __init x86_64_start_reservations(char *real_mode_data); | 103 | void __init x86_64_start_reservations(char *real_mode_data); |
| 106 | 104 | ||
diff --git a/arch/x86/include/asm/mach-default/setup_arch.h b/arch/x86/include/asm/setup_arch.h index 38846208b548..38846208b548 100644 --- a/arch/x86/include/asm/mach-default/setup_arch.h +++ b/arch/x86/include/asm/setup_arch.h | |||
diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h index 19953df61c52..47d0e21f2b9e 100644 --- a/arch/x86/include/asm/smp.h +++ b/arch/x86/include/asm/smp.h | |||
| @@ -15,34 +15,8 @@ | |||
| 15 | # include <asm/io_apic.h> | 15 | # include <asm/io_apic.h> |
| 16 | # endif | 16 | # endif |
| 17 | #endif | 17 | #endif |
| 18 | #include <asm/pda.h> | ||
| 19 | #include <asm/thread_info.h> | 18 | #include <asm/thread_info.h> |
| 20 | 19 | #include <asm/cpumask.h> | |
| 21 | #ifdef CONFIG_X86_64 | ||
| 22 | |||
| 23 | extern cpumask_var_t cpu_callin_mask; | ||
| 24 | extern cpumask_var_t cpu_callout_mask; | ||
| 25 | extern cpumask_var_t cpu_initialized_mask; | ||
| 26 | extern cpumask_var_t cpu_sibling_setup_mask; | ||
| 27 | |||
| 28 | #else /* CONFIG_X86_32 */ | ||
| 29 | |||
| 30 | extern cpumask_t cpu_callin_map; | ||
| 31 | extern cpumask_t cpu_callout_map; | ||
| 32 | extern cpumask_t cpu_initialized; | ||
| 33 | extern cpumask_t cpu_sibling_setup_map; | ||
| 34 | |||
| 35 | #define cpu_callin_mask ((struct cpumask *)&cpu_callin_map) | ||
| 36 | #define cpu_callout_mask ((struct cpumask *)&cpu_callout_map) | ||
| 37 | #define cpu_initialized_mask ((struct cpumask *)&cpu_initialized) | ||
| 38 | #define cpu_sibling_setup_mask ((struct cpumask *)&cpu_sibling_setup_map) | ||
| 39 | |||
| 40 | #endif /* CONFIG_X86_32 */ | ||
| 41 | |||
| 42 | extern void (*mtrr_hook)(void); | ||
| 43 | extern void zap_low_mappings(void); | ||
| 44 | |||
| 45 | extern int __cpuinit get_local_pda(int cpu); | ||
| 46 | 20 | ||
| 47 | extern int smp_num_siblings; | 21 | extern int smp_num_siblings; |
| 48 | extern unsigned int num_processors; | 22 | extern unsigned int num_processors; |
| @@ -50,9 +24,7 @@ extern unsigned int num_processors; | |||
| 50 | DECLARE_PER_CPU(cpumask_t, cpu_sibling_map); | 24 | DECLARE_PER_CPU(cpumask_t, cpu_sibling_map); |
| 51 | DECLARE_PER_CPU(cpumask_t, cpu_core_map); | 25 | DECLARE_PER_CPU(cpumask_t, cpu_core_map); |
| 52 | DECLARE_PER_CPU(u16, cpu_llc_id); | 26 | DECLARE_PER_CPU(u16, cpu_llc_id); |
| 53 | #ifdef CONFIG_X86_32 | ||
| 54 | DECLARE_PER_CPU(int, cpu_number); | 27 | DECLARE_PER_CPU(int, cpu_number); |
| 55 | #endif | ||
| 56 | 28 | ||
| 57 | static inline struct cpumask *cpu_sibling_mask(int cpu) | 29 | static inline struct cpumask *cpu_sibling_mask(int cpu) |
| 58 | { | 30 | { |
| @@ -167,8 +139,6 @@ void play_dead_common(void); | |||
| 167 | void native_send_call_func_ipi(const struct cpumask *mask); | 139 | void native_send_call_func_ipi(const struct cpumask *mask); |
| 168 | void native_send_call_func_single_ipi(int cpu); | 140 | void native_send_call_func_single_ipi(int cpu); |
| 169 | 141 | ||
| 170 | extern void prefill_possible_map(void); | ||
| 171 | |||
| 172 | void smp_store_cpu_info(int id); | 142 | void smp_store_cpu_info(int id); |
| 173 | #define cpu_physical_id(cpu) per_cpu(x86_cpu_to_apicid, cpu) | 143 | #define cpu_physical_id(cpu) per_cpu(x86_cpu_to_apicid, cpu) |
| 174 | 144 | ||
| @@ -177,10 +147,6 @@ static inline int num_booting_cpus(void) | |||
| 177 | { | 147 | { |
| 178 | return cpumask_weight(cpu_callout_mask); | 148 | return cpumask_weight(cpu_callout_mask); |
| 179 | } | 149 | } |
| 180 | #else | ||
| 181 | static inline void prefill_possible_map(void) | ||
| 182 | { | ||
| 183 | } | ||
| 184 | #endif /* CONFIG_SMP */ | 150 | #endif /* CONFIG_SMP */ |
| 185 | 151 | ||
| 186 | extern unsigned disabled_cpus __cpuinitdata; | 152 | extern unsigned disabled_cpus __cpuinitdata; |
| @@ -191,11 +157,11 @@ extern unsigned disabled_cpus __cpuinitdata; | |||
| 191 | * from the initial startup. We map APIC_BASE very early in page_setup(), | 157 | * from the initial startup. We map APIC_BASE very early in page_setup(), |
| 192 | * so this is correct in the x86 case. | 158 | * so this is correct in the x86 case. |
| 193 | */ | 159 | */ |
| 194 | #define raw_smp_processor_id() (x86_read_percpu(cpu_number)) | 160 | #define raw_smp_processor_id() (percpu_read(cpu_number)) |
| 195 | extern int safe_smp_processor_id(void); | 161 | extern int safe_smp_processor_id(void); |
| 196 | 162 | ||
| 197 | #elif defined(CONFIG_X86_64_SMP) | 163 | #elif defined(CONFIG_X86_64_SMP) |
| 198 | #define raw_smp_processor_id() read_pda(cpunumber) | 164 | #define raw_smp_processor_id() (percpu_read(cpu_number)) |
| 199 | 165 | ||
| 200 | #define stack_smp_processor_id() \ | 166 | #define stack_smp_processor_id() \ |
| 201 | ({ \ | 167 | ({ \ |
| @@ -205,10 +171,6 @@ extern int safe_smp_processor_id(void); | |||
| 205 | }) | 171 | }) |
| 206 | #define safe_smp_processor_id() smp_processor_id() | 172 | #define safe_smp_processor_id() smp_processor_id() |
| 207 | 173 | ||
| 208 | #else /* !CONFIG_X86_32_SMP && !CONFIG_X86_64_SMP */ | ||
| 209 | #define cpu_physical_id(cpu) boot_cpu_physical_apicid | ||
| 210 | #define safe_smp_processor_id() 0 | ||
| 211 | #define stack_smp_processor_id() 0 | ||
| 212 | #endif | 174 | #endif |
| 213 | 175 | ||
| 214 | #ifdef CONFIG_X86_LOCAL_APIC | 176 | #ifdef CONFIG_X86_LOCAL_APIC |
| @@ -220,28 +182,9 @@ static inline int logical_smp_processor_id(void) | |||
| 220 | return GET_APIC_LOGICAL_ID(*(u32 *)(APIC_BASE + APIC_LDR)); | 182 | return GET_APIC_LOGICAL_ID(*(u32 *)(APIC_BASE + APIC_LDR)); |
| 221 | } | 183 | } |
| 222 | 184 | ||
| 223 | #include <mach_apicdef.h> | ||
| 224 | static inline unsigned int read_apic_id(void) | ||
| 225 | { | ||
| 226 | unsigned int reg; | ||
| 227 | |||
| 228 | reg = *(u32 *)(APIC_BASE + APIC_ID); | ||
| 229 | |||
| 230 | return GET_APIC_ID(reg); | ||
| 231 | } | ||
| 232 | #endif | 185 | #endif |
| 233 | 186 | ||
| 234 | |||
| 235 | # if defined(APIC_DEFINITION) || defined(CONFIG_X86_64) | ||
| 236 | extern int hard_smp_processor_id(void); | 187 | extern int hard_smp_processor_id(void); |
| 237 | # else | ||
| 238 | #include <mach_apicdef.h> | ||
| 239 | static inline int hard_smp_processor_id(void) | ||
| 240 | { | ||
| 241 | /* we don't want to mark this access volatile - bad code generation */ | ||
| 242 | return read_apic_id(); | ||
| 243 | } | ||
| 244 | # endif /* APIC_DEFINITION */ | ||
| 245 | 188 | ||
| 246 | #else /* CONFIG_X86_LOCAL_APIC */ | 189 | #else /* CONFIG_X86_LOCAL_APIC */ |
| 247 | 190 | ||
| @@ -251,11 +194,5 @@ static inline int hard_smp_processor_id(void) | |||
| 251 | 194 | ||
| 252 | #endif /* CONFIG_X86_LOCAL_APIC */ | 195 | #endif /* CONFIG_X86_LOCAL_APIC */ |
| 253 | 196 | ||
| 254 | #ifdef CONFIG_X86_HAS_BOOT_CPU_ID | ||
| 255 | extern unsigned char boot_cpu_id; | ||
| 256 | #else | ||
| 257 | #define boot_cpu_id 0 | ||
| 258 | #endif | ||
| 259 | |||
| 260 | #endif /* __ASSEMBLY__ */ | 197 | #endif /* __ASSEMBLY__ */ |
| 261 | #endif /* _ASM_X86_SMP_H */ | 198 | #endif /* _ASM_X86_SMP_H */ |
diff --git a/arch/x86/include/asm/mach-default/smpboot_hooks.h b/arch/x86/include/asm/smpboot_hooks.h index 23bf52103b89..1def60114906 100644 --- a/arch/x86/include/asm/mach-default/smpboot_hooks.h +++ b/arch/x86/include/asm/smpboot_hooks.h | |||
| @@ -13,10 +13,10 @@ static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip) | |||
| 13 | CMOS_WRITE(0xa, 0xf); | 13 | CMOS_WRITE(0xa, 0xf); |
| 14 | local_flush_tlb(); | 14 | local_flush_tlb(); |
| 15 | pr_debug("1.\n"); | 15 | pr_debug("1.\n"); |
| 16 | *((volatile unsigned short *)phys_to_virt(TRAMPOLINE_PHYS_HIGH)) = | 16 | *((volatile unsigned short *)phys_to_virt(apic->trampoline_phys_high)) = |
| 17 | start_eip >> 4; | 17 | start_eip >> 4; |
| 18 | pr_debug("2.\n"); | 18 | pr_debug("2.\n"); |
| 19 | *((volatile unsigned short *)phys_to_virt(TRAMPOLINE_PHYS_LOW)) = | 19 | *((volatile unsigned short *)phys_to_virt(apic->trampoline_phys_low)) = |
| 20 | start_eip & 0xf; | 20 | start_eip & 0xf; |
| 21 | pr_debug("3.\n"); | 21 | pr_debug("3.\n"); |
| 22 | } | 22 | } |
| @@ -34,7 +34,7 @@ static inline void smpboot_restore_warm_reset_vector(void) | |||
| 34 | */ | 34 | */ |
| 35 | CMOS_WRITE(0, 0xf); | 35 | CMOS_WRITE(0, 0xf); |
| 36 | 36 | ||
| 37 | *((volatile long *)phys_to_virt(TRAMPOLINE_PHYS_LOW)) = 0; | 37 | *((volatile long *)phys_to_virt(apic->trampoline_phys_low)) = 0; |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | static inline void __init smpboot_setup_io_apic(void) | 40 | static inline void __init smpboot_setup_io_apic(void) |
diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h index 8247e94ac6b1..3a5696656680 100644 --- a/arch/x86/include/asm/spinlock.h +++ b/arch/x86/include/asm/spinlock.h | |||
| @@ -172,70 +172,8 @@ static inline int __ticket_spin_is_contended(raw_spinlock_t *lock) | |||
| 172 | return (((tmp >> TICKET_SHIFT) - tmp) & ((1 << TICKET_SHIFT) - 1)) > 1; | 172 | return (((tmp >> TICKET_SHIFT) - tmp) & ((1 << TICKET_SHIFT) - 1)) > 1; |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | #ifdef CONFIG_PARAVIRT | 175 | #ifndef CONFIG_PARAVIRT |
| 176 | /* | ||
| 177 | * Define virtualization-friendly old-style lock byte lock, for use in | ||
| 178 | * pv_lock_ops if desired. | ||
| 179 | * | ||
| 180 | * This differs from the pre-2.6.24 spinlock by always using xchgb | ||
| 181 | * rather than decb to take the lock; this allows it to use a | ||
| 182 | * zero-initialized lock structure. It also maintains a 1-byte | ||
| 183 | * contention counter, so that we can implement | ||
| 184 | * __byte_spin_is_contended. | ||
| 185 | */ | ||
| 186 | struct __byte_spinlock { | ||
| 187 | s8 lock; | ||
| 188 | s8 spinners; | ||
| 189 | }; | ||
| 190 | |||
| 191 | static inline int __byte_spin_is_locked(raw_spinlock_t *lock) | ||
| 192 | { | ||
| 193 | struct __byte_spinlock *bl = (struct __byte_spinlock *)lock; | ||
| 194 | return bl->lock != 0; | ||
| 195 | } | ||
| 196 | |||
| 197 | static inline int __byte_spin_is_contended(raw_spinlock_t *lock) | ||
| 198 | { | ||
| 199 | struct __byte_spinlock *bl = (struct __byte_spinlock *)lock; | ||
| 200 | return bl->spinners != 0; | ||
| 201 | } | ||
| 202 | |||
| 203 | static inline void __byte_spin_lock(raw_spinlock_t *lock) | ||
| 204 | { | ||
| 205 | struct __byte_spinlock *bl = (struct __byte_spinlock *)lock; | ||
| 206 | s8 val = 1; | ||
| 207 | |||
| 208 | asm("1: xchgb %1, %0\n" | ||
| 209 | " test %1,%1\n" | ||
| 210 | " jz 3f\n" | ||
| 211 | " " LOCK_PREFIX "incb %2\n" | ||
| 212 | "2: rep;nop\n" | ||
| 213 | " cmpb $1, %0\n" | ||
| 214 | " je 2b\n" | ||
| 215 | " " LOCK_PREFIX "decb %2\n" | ||
| 216 | " jmp 1b\n" | ||
| 217 | "3:" | ||
| 218 | : "+m" (bl->lock), "+q" (val), "+m" (bl->spinners): : "memory"); | ||
| 219 | } | ||
| 220 | |||
| 221 | static inline int __byte_spin_trylock(raw_spinlock_t *lock) | ||
| 222 | { | ||
| 223 | struct __byte_spinlock *bl = (struct __byte_spinlock *)lock; | ||
| 224 | u8 old = 1; | ||
| 225 | |||
| 226 | asm("xchgb %1,%0" | ||
| 227 | : "+m" (bl->lock), "+q" (old) : : "memory"); | ||
| 228 | 176 | ||
| 229 | return old == 0; | ||
| 230 | } | ||
| 231 | |||
| 232 | static inline void __byte_spin_unlock(raw_spinlock_t *lock) | ||
| 233 | { | ||
| 234 | struct __byte_spinlock *bl = (struct __byte_spinlock *)lock; | ||
| 235 | smp_wmb(); | ||
| 236 | bl->lock = 0; | ||
| 237 | } | ||
| 238 | #else /* !CONFIG_PARAVIRT */ | ||
| 239 | static inline int __raw_spin_is_locked(raw_spinlock_t *lock) | 177 | static inline int __raw_spin_is_locked(raw_spinlock_t *lock) |
| 240 | { | 178 | { |
| 241 | return __ticket_spin_is_locked(lock); | 179 | return __ticket_spin_is_locked(lock); |
| @@ -268,7 +206,7 @@ static __always_inline void __raw_spin_lock_flags(raw_spinlock_t *lock, | |||
| 268 | __raw_spin_lock(lock); | 206 | __raw_spin_lock(lock); |
| 269 | } | 207 | } |
| 270 | 208 | ||
| 271 | #endif /* CONFIG_PARAVIRT */ | 209 | #endif |
| 272 | 210 | ||
| 273 | static inline void __raw_spin_unlock_wait(raw_spinlock_t *lock) | 211 | static inline void __raw_spin_unlock_wait(raw_spinlock_t *lock) |
| 274 | { | 212 | { |
| @@ -330,8 +268,7 @@ static inline int __raw_read_trylock(raw_rwlock_t *lock) | |||
| 330 | { | 268 | { |
| 331 | atomic_t *count = (atomic_t *)lock; | 269 | atomic_t *count = (atomic_t *)lock; |
| 332 | 270 | ||
| 333 | atomic_dec(count); | 271 | if (atomic_dec_return(count) >= 0) |
| 334 | if (atomic_read(count) >= 0) | ||
| 335 | return 1; | 272 | return 1; |
| 336 | atomic_inc(count); | 273 | atomic_inc(count); |
| 337 | return 0; | 274 | return 0; |
diff --git a/arch/x86/include/asm/stackprotector.h b/arch/x86/include/asm/stackprotector.h new file mode 100644 index 000000000000..c2d742c6e15f --- /dev/null +++ b/arch/x86/include/asm/stackprotector.h | |||
| @@ -0,0 +1,124 @@ | |||
| 1 | /* | ||
| 2 | * GCC stack protector support. | ||
| 3 | * | ||
| 4 | * Stack protector works by putting predefined pattern at the start of | ||
| 5 | * the stack frame and verifying that it hasn't been overwritten when | ||
| 6 | * returning from the function. The pattern is called stack canary | ||
| 7 | * and unfortunately gcc requires it to be at a fixed offset from %gs. | ||
| 8 | * On x86_64, the offset is 40 bytes and on x86_32 20 bytes. x86_64 | ||
| 9 | * and x86_32 use segment registers differently and thus handles this | ||
| 10 | * requirement differently. | ||
| 11 | * | ||
| 12 | * On x86_64, %gs is shared by percpu area and stack canary. All | ||
| 13 | * percpu symbols are zero based and %gs points to the base of percpu | ||
| 14 | * area. The first occupant of the percpu area is always | ||
| 15 | * irq_stack_union which contains stack_canary at offset 40. Userland | ||
| 16 | * %gs is always saved and restored on kernel entry and exit using | ||
| 17 | * swapgs, so stack protector doesn't add any complexity there. | ||
| 18 | * | ||
| 19 | * On x86_32, it's slightly more complicated. As in x86_64, %gs is | ||
| 20 | * used for userland TLS. Unfortunately, some processors are much | ||
| 21 | * slower at loading segment registers with different value when | ||
| 22 | * entering and leaving the kernel, so the kernel uses %fs for percpu | ||
| 23 | * area and manages %gs lazily so that %gs is switched only when | ||
| 24 | * necessary, usually during task switch. | ||
| 25 | * | ||
| 26 | * As gcc requires the stack canary at %gs:20, %gs can't be managed | ||
| 27 | * lazily if stack protector is enabled, so the kernel saves and | ||
| 28 | * restores userland %gs on kernel entry and exit. This behavior is | ||
| 29 | * controlled by CONFIG_X86_32_LAZY_GS and accessors are defined in | ||
| 30 | * system.h to hide the details. | ||
| 31 | */ | ||
| 32 | |||
| 33 | #ifndef _ASM_STACKPROTECTOR_H | ||
| 34 | #define _ASM_STACKPROTECTOR_H 1 | ||
| 35 | |||
| 36 | #ifdef CONFIG_CC_STACKPROTECTOR | ||
| 37 | |||
| 38 | #include <asm/tsc.h> | ||
| 39 | #include <asm/processor.h> | ||
| 40 | #include <asm/percpu.h> | ||
| 41 | #include <asm/system.h> | ||
| 42 | #include <asm/desc.h> | ||
| 43 | #include <linux/random.h> | ||
| 44 | |||
| 45 | /* | ||
| 46 | * 24 byte read-only segment initializer for stack canary. Linker | ||
| 47 | * can't handle the address bit shifting. Address will be set in | ||
| 48 | * head_32 for boot CPU and setup_per_cpu_areas() for others. | ||
| 49 | */ | ||
| 50 | #define GDT_STACK_CANARY_INIT \ | ||
| 51 | [GDT_ENTRY_STACK_CANARY] = { { { 0x00000018, 0x00409000 } } }, | ||
| 52 | |||
| 53 | /* | ||
| 54 | * Initialize the stackprotector canary value. | ||
| 55 | * | ||
| 56 | * NOTE: this must only be called from functions that never return, | ||
| 57 | * and it must always be inlined. | ||
| 58 | */ | ||
| 59 | static __always_inline void boot_init_stack_canary(void) | ||
| 60 | { | ||
| 61 | u64 canary; | ||
| 62 | u64 tsc; | ||
| 63 | |||
| 64 | #ifdef CONFIG_X86_64 | ||
| 65 | BUILD_BUG_ON(offsetof(union irq_stack_union, stack_canary) != 40); | ||
| 66 | #endif | ||
| 67 | /* | ||
| 68 | * We both use the random pool and the current TSC as a source | ||
| 69 | * of randomness. The TSC only matters for very early init, | ||
| 70 | * there it already has some randomness on most systems. Later | ||
| 71 | * on during the bootup the random pool has true entropy too. | ||
| 72 | */ | ||
| 73 | get_random_bytes(&canary, sizeof(canary)); | ||
| 74 | tsc = __native_read_tsc(); | ||
| 75 | canary += tsc + (tsc << 32UL); | ||
| 76 | |||
| 77 | current->stack_canary = canary; | ||
| 78 | #ifdef CONFIG_X86_64 | ||
| 79 | percpu_write(irq_stack_union.stack_canary, canary); | ||
| 80 | #else | ||
| 81 | percpu_write(stack_canary, canary); | ||
| 82 | #endif | ||
| 83 | } | ||
| 84 | |||
| 85 | static inline void setup_stack_canary_segment(int cpu) | ||
| 86 | { | ||
| 87 | #ifdef CONFIG_X86_32 | ||
| 88 | unsigned long canary = (unsigned long)&per_cpu(stack_canary, cpu) - 20; | ||
| 89 | struct desc_struct *gdt_table = get_cpu_gdt_table(cpu); | ||
| 90 | struct desc_struct desc; | ||
| 91 | |||
| 92 | desc = gdt_table[GDT_ENTRY_STACK_CANARY]; | ||
| 93 | desc.base0 = canary & 0xffff; | ||
| 94 | desc.base1 = (canary >> 16) & 0xff; | ||
| 95 | desc.base2 = (canary >> 24) & 0xff; | ||
| 96 | write_gdt_entry(gdt_table, GDT_ENTRY_STACK_CANARY, &desc, DESCTYPE_S); | ||
| 97 | #endif | ||
| 98 | } | ||
| 99 | |||
| 100 | static inline void load_stack_canary_segment(void) | ||
| 101 | { | ||
| 102 | #ifdef CONFIG_X86_32 | ||
| 103 | asm("mov %0, %%gs" : : "r" (__KERNEL_STACK_CANARY) : "memory"); | ||
| 104 | #endif | ||
| 105 | } | ||
| 106 | |||
| 107 | #else /* CC_STACKPROTECTOR */ | ||
| 108 | |||
| 109 | #define GDT_STACK_CANARY_INIT | ||
| 110 | |||
| 111 | /* dummy boot_init_stack_canary() is defined in linux/stackprotector.h */ | ||
| 112 | |||
| 113 | static inline void setup_stack_canary_segment(int cpu) | ||
| 114 | { } | ||
| 115 | |||
| 116 | static inline void load_stack_canary_segment(void) | ||
| 117 | { | ||
| 118 | #ifdef CONFIG_X86_32 | ||
| 119 | asm volatile ("mov %0, %%gs" : : "r" (0)); | ||
| 120 | #endif | ||
| 121 | } | ||
| 122 | |||
| 123 | #endif /* CC_STACKPROTECTOR */ | ||
| 124 | #endif /* _ASM_STACKPROTECTOR_H */ | ||
diff --git a/arch/x86/include/asm/summit/apic.h b/arch/x86/include/asm/summit/apic.h deleted file mode 100644 index 93d2c8667cfe..000000000000 --- a/arch/x86/include/asm/summit/apic.h +++ /dev/null | |||
| @@ -1,202 +0,0 @@ | |||
| 1 | #ifndef __ASM_SUMMIT_APIC_H | ||
| 2 | #define __ASM_SUMMIT_APIC_H | ||
| 3 | |||
| 4 | #include <asm/smp.h> | ||
| 5 | #include <linux/gfp.h> | ||
| 6 | |||
| 7 | #define esr_disable (1) | ||
| 8 | #define NO_BALANCE_IRQ (0) | ||
| 9 | |||
| 10 | /* In clustered mode, the high nibble of APIC ID is a cluster number. | ||
| 11 | * The low nibble is a 4-bit bitmap. */ | ||
| 12 | #define XAPIC_DEST_CPUS_SHIFT 4 | ||
| 13 | #define XAPIC_DEST_CPUS_MASK ((1u << XAPIC_DEST_CPUS_SHIFT) - 1) | ||
| 14 | #define XAPIC_DEST_CLUSTER_MASK (XAPIC_DEST_CPUS_MASK << XAPIC_DEST_CPUS_SHIFT) | ||
| 15 | |||
| 16 | #define APIC_DFR_VALUE (APIC_DFR_CLUSTER) | ||
| 17 | |||
| 18 | static inline const cpumask_t *target_cpus(void) | ||
| 19 | { | ||
| 20 | /* CPU_MASK_ALL (0xff) has undefined behaviour with | ||
| 21 | * dest_LowestPrio mode logical clustered apic interrupt routing | ||
| 22 | * Just start on cpu 0. IRQ balancing will spread load | ||
| 23 | */ | ||
| 24 | return &cpumask_of_cpu(0); | ||
| 25 | } | ||
| 26 | |||
| 27 | #define INT_DELIVERY_MODE (dest_LowestPrio) | ||
| 28 | #define INT_DEST_MODE 1 /* logical delivery broadcast to all procs */ | ||
| 29 | |||
| 30 | static inline unsigned long check_apicid_used(physid_mask_t bitmap, int apicid) | ||
| 31 | { | ||
| 32 | return 0; | ||
| 33 | } | ||
| 34 | |||
| 35 | /* we don't use the phys_cpu_present_map to indicate apicid presence */ | ||
| 36 | static inline unsigned long check_apicid_present(int bit) | ||
| 37 | { | ||
| 38 | return 1; | ||
| 39 | } | ||
| 40 | |||
| 41 | #define apicid_cluster(apicid) ((apicid) & XAPIC_DEST_CLUSTER_MASK) | ||
| 42 | |||
| 43 | extern u8 cpu_2_logical_apicid[]; | ||
| 44 | |||
| 45 | static inline void init_apic_ldr(void) | ||
| 46 | { | ||
| 47 | unsigned long val, id; | ||
| 48 | int count = 0; | ||
| 49 | u8 my_id = (u8)hard_smp_processor_id(); | ||
| 50 | u8 my_cluster = (u8)apicid_cluster(my_id); | ||
| 51 | #ifdef CONFIG_SMP | ||
| 52 | u8 lid; | ||
| 53 | int i; | ||
| 54 | |||
| 55 | /* Create logical APIC IDs by counting CPUs already in cluster. */ | ||
| 56 | for (count = 0, i = nr_cpu_ids; --i >= 0; ) { | ||
| 57 | lid = cpu_2_logical_apicid[i]; | ||
| 58 | if (lid != BAD_APICID && apicid_cluster(lid) == my_cluster) | ||
| 59 | ++count; | ||
| 60 | } | ||
| 61 | #endif | ||
| 62 | /* We only have a 4 wide bitmap in cluster mode. If a deranged | ||
| 63 | * BIOS puts 5 CPUs in one APIC cluster, we're hosed. */ | ||
| 64 | BUG_ON(count >= XAPIC_DEST_CPUS_SHIFT); | ||
| 65 | id = my_cluster | (1UL << count); | ||
| 66 | apic_write(APIC_DFR, APIC_DFR_VALUE); | ||
| 67 | val = apic_read(APIC_LDR) & ~APIC_LDR_MASK; | ||
| 68 | val |= SET_APIC_LOGICAL_ID(id); | ||
| 69 | apic_write(APIC_LDR, val); | ||
| 70 | } | ||
| 71 | |||
| 72 | static inline int multi_timer_check(int apic, int irq) | ||
| 73 | { | ||
| 74 | return 0; | ||
| 75 | } | ||
| 76 | |||
| 77 | static inline int apic_id_registered(void) | ||
| 78 | { | ||
| 79 | return 1; | ||
| 80 | } | ||
| 81 | |||
| 82 | static inline void setup_apic_routing(void) | ||
| 83 | { | ||
| 84 | printk("Enabling APIC mode: Summit. Using %d I/O APICs\n", | ||
| 85 | nr_ioapics); | ||
| 86 | } | ||
| 87 | |||
| 88 | static inline int apicid_to_node(int logical_apicid) | ||
| 89 | { | ||
| 90 | #ifdef CONFIG_SMP | ||
| 91 | return apicid_2_node[hard_smp_processor_id()]; | ||
| 92 | #else | ||
| 93 | return 0; | ||
| 94 | #endif | ||
| 95 | } | ||
| 96 | |||
| 97 | /* Mapping from cpu number to logical apicid */ | ||
| 98 | static inline int cpu_to_logical_apicid(int cpu) | ||
| 99 | { | ||
| 100 | #ifdef CONFIG_SMP | ||
| 101 | if (cpu >= nr_cpu_ids) | ||
| 102 | return BAD_APICID; | ||
| 103 | return (int)cpu_2_logical_apicid[cpu]; | ||
| 104 | #else | ||
| 105 | return logical_smp_processor_id(); | ||
| 106 | #endif | ||
| 107 | } | ||
| 108 | |||
| 109 | static inline int cpu_present_to_apicid(int mps_cpu) | ||
| 110 | { | ||
| 111 | if (mps_cpu < nr_cpu_ids) | ||
| 112 | return (int)per_cpu(x86_bios_cpu_apicid, mps_cpu); | ||
| 113 | else | ||
| 114 | return BAD_APICID; | ||
| 115 | } | ||
| 116 | |||
| 117 | static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_id_map) | ||
| 118 | { | ||
| 119 | /* For clustered we don't have a good way to do this yet - hack */ | ||
| 120 | return physids_promote(0x0F); | ||
| 121 | } | ||
| 122 | |||
| 123 | static inline physid_mask_t apicid_to_cpu_present(int apicid) | ||
| 124 | { | ||
| 125 | return physid_mask_of_physid(0); | ||
| 126 | } | ||
| 127 | |||
| 128 | static inline void setup_portio_remap(void) | ||
| 129 | { | ||
| 130 | } | ||
| 131 | |||
| 132 | static inline int check_phys_apicid_present(int boot_cpu_physical_apicid) | ||
| 133 | { | ||
| 134 | return 1; | ||
| 135 | } | ||
| 136 | |||
| 137 | static inline void enable_apic_mode(void) | ||
| 138 | { | ||
| 139 | } | ||
| 140 | |||
| 141 | static inline unsigned int cpu_mask_to_apicid(const cpumask_t *cpumask) | ||
| 142 | { | ||
| 143 | int num_bits_set; | ||
| 144 | int cpus_found = 0; | ||
| 145 | int cpu; | ||
| 146 | int apicid; | ||
| 147 | |||
| 148 | num_bits_set = cpus_weight(*cpumask); | ||
| 149 | /* Return id to all */ | ||
| 150 | if (num_bits_set >= nr_cpu_ids) | ||
| 151 | return (int) 0xFF; | ||
| 152 | /* | ||
| 153 | * The cpus in the mask must all be on the apic cluster. If are not | ||
| 154 | * on the same apicid cluster return default value of TARGET_CPUS. | ||
| 155 | */ | ||
| 156 | cpu = first_cpu(*cpumask); | ||
| 157 | apicid = cpu_to_logical_apicid(cpu); | ||
| 158 | while (cpus_found < num_bits_set) { | ||
| 159 | if (cpu_isset(cpu, *cpumask)) { | ||
| 160 | int new_apicid = cpu_to_logical_apicid(cpu); | ||
| 161 | if (apicid_cluster(apicid) != | ||
| 162 | apicid_cluster(new_apicid)){ | ||
| 163 | printk ("%s: Not a valid mask!\n", __func__); | ||
| 164 | return 0xFF; | ||
| 165 | } | ||
| 166 | apicid = apicid | new_apicid; | ||
| 167 | cpus_found++; | ||
| 168 | } | ||
| 169 | cpu++; | ||
| 170 | } | ||
| 171 | return apicid; | ||
| 172 | } | ||
| 173 | |||
| 174 | static inline unsigned int cpu_mask_to_apicid_and(const struct cpumask *inmask, | ||
| 175 | const struct cpumask *andmask) | ||
| 176 | { | ||
| 177 | int apicid = cpu_to_logical_apicid(0); | ||
| 178 | cpumask_var_t cpumask; | ||
| 179 | |||
| 180 | if (!alloc_cpumask_var(&cpumask, GFP_ATOMIC)) | ||
| 181 | return apicid; | ||
| 182 | |||
| 183 | cpumask_and(cpumask, inmask, andmask); | ||
| 184 | cpumask_and(cpumask, cpumask, cpu_online_mask); | ||
| 185 | apicid = cpu_mask_to_apicid(cpumask); | ||
| 186 | |||
| 187 | free_cpumask_var(cpumask); | ||
| 188 | return apicid; | ||
| 189 | } | ||
| 190 | |||
| 191 | /* cpuid returns the value latched in the HW at reset, not the APIC ID | ||
| 192 | * register's value. For any box whose BIOS changes APIC IDs, like | ||
| 193 | * clustered APIC systems, we must use hard_smp_processor_id. | ||
| 194 | * | ||
| 195 | * See Intel's IA-32 SW Dev's Manual Vol2 under CPUID. | ||
| 196 | */ | ||
| 197 | static inline u32 phys_pkg_id(u32 cpuid_apic, int index_msb) | ||
| 198 | { | ||
| 199 | return hard_smp_processor_id() >> index_msb; | ||
| 200 | } | ||
| 201 | |||
| 202 | #endif /* __ASM_SUMMIT_APIC_H */ | ||
diff --git a/arch/x86/include/asm/summit/apicdef.h b/arch/x86/include/asm/summit/apicdef.h deleted file mode 100644 index f3fbca1f61c1..000000000000 --- a/arch/x86/include/asm/summit/apicdef.h +++ /dev/null | |||
| @@ -1,13 +0,0 @@ | |||
| 1 | #ifndef __ASM_SUMMIT_APICDEF_H | ||
| 2 | #define __ASM_SUMMIT_APICDEF_H | ||
| 3 | |||
| 4 | #define APIC_ID_MASK (0xFF<<24) | ||
| 5 | |||
| 6 | static inline unsigned get_apic_id(unsigned long x) | ||
| 7 | { | ||
| 8 | return (x>>24)&0xFF; | ||
| 9 | } | ||
| 10 | |||
| 11 | #define GET_APIC_ID(x) get_apic_id(x) | ||
| 12 | |||
| 13 | #endif | ||
diff --git a/arch/x86/include/asm/summit/ipi.h b/arch/x86/include/asm/summit/ipi.h deleted file mode 100644 index a8a2c24f50cc..000000000000 --- a/arch/x86/include/asm/summit/ipi.h +++ /dev/null | |||
| @@ -1,26 +0,0 @@ | |||
| 1 | #ifndef __ASM_SUMMIT_IPI_H | ||
| 2 | #define __ASM_SUMMIT_IPI_H | ||
| 3 | |||
| 4 | void send_IPI_mask_sequence(const cpumask_t *mask, int vector); | ||
| 5 | void send_IPI_mask_allbutself(const cpumask_t *mask, int vector); | ||
| 6 | |||
| 7 | static inline void send_IPI_mask(const cpumask_t *mask, int vector) | ||
| 8 | { | ||
| 9 | send_IPI_mask_sequence(mask, vector); | ||
| 10 | } | ||
| 11 | |||
| 12 | static inline void send_IPI_allbutself(int vector) | ||
| 13 | { | ||
| 14 | cpumask_t mask = cpu_online_map; | ||
| 15 | cpu_clear(smp_processor_id(), mask); | ||
| 16 | |||
| 17 | if (!cpus_empty(mask)) | ||
| 18 | send_IPI_mask(&mask, vector); | ||
| 19 | } | ||
| 20 | |||
| 21 | static inline void send_IPI_all(int vector) | ||
| 22 | { | ||
| 23 | send_IPI_mask(&cpu_online_map, vector); | ||
| 24 | } | ||
| 25 | |||
| 26 | #endif /* __ASM_SUMMIT_IPI_H */ | ||
diff --git a/arch/x86/include/asm/summit/mpparse.h b/arch/x86/include/asm/summit/mpparse.h deleted file mode 100644 index 380e86c02363..000000000000 --- a/arch/x86/include/asm/summit/mpparse.h +++ /dev/null | |||
| @@ -1,109 +0,0 @@ | |||
| 1 | #ifndef __ASM_SUMMIT_MPPARSE_H | ||
| 2 | #define __ASM_SUMMIT_MPPARSE_H | ||
| 3 | |||
| 4 | #include <asm/tsc.h> | ||
| 5 | |||
| 6 | extern int use_cyclone; | ||
| 7 | |||
| 8 | #ifdef CONFIG_X86_SUMMIT_NUMA | ||
| 9 | extern void setup_summit(void); | ||
| 10 | #else | ||
| 11 | #define setup_summit() {} | ||
| 12 | #endif | ||
| 13 | |||
| 14 | static inline int mps_oem_check(struct mpc_table *mpc, char *oem, | ||
| 15 | char *productid) | ||
| 16 | { | ||
| 17 | if (!strncmp(oem, "IBM ENSW", 8) && | ||
| 18 | (!strncmp(productid, "VIGIL SMP", 9) | ||
| 19 | || !strncmp(productid, "EXA", 3) | ||
| 20 | || !strncmp(productid, "RUTHLESS SMP", 12))){ | ||
| 21 | mark_tsc_unstable("Summit based system"); | ||
| 22 | use_cyclone = 1; /*enable cyclone-timer*/ | ||
| 23 | setup_summit(); | ||
| 24 | return 1; | ||
| 25 | } | ||
| 26 | return 0; | ||
| 27 | } | ||
| 28 | |||
| 29 | /* Hook from generic ACPI tables.c */ | ||
| 30 | static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) | ||
| 31 | { | ||
| 32 | if (!strncmp(oem_id, "IBM", 3) && | ||
| 33 | (!strncmp(oem_table_id, "SERVIGIL", 8) | ||
| 34 | || !strncmp(oem_table_id, "EXA", 3))){ | ||
| 35 | mark_tsc_unstable("Summit based system"); | ||
| 36 | use_cyclone = 1; /*enable cyclone-timer*/ | ||
| 37 | setup_summit(); | ||
| 38 | return 1; | ||
| 39 | } | ||
| 40 | return 0; | ||
| 41 | } | ||
| 42 | |||
| 43 | struct rio_table_hdr { | ||
| 44 | unsigned char version; /* Version number of this data structure */ | ||
| 45 | /* Version 3 adds chassis_num & WP_index */ | ||
| 46 | unsigned char num_scal_dev; /* # of Scalability devices (Twisters for Vigil) */ | ||
| 47 | unsigned char num_rio_dev; /* # of RIO I/O devices (Cyclones and Winnipegs) */ | ||
| 48 | } __attribute__((packed)); | ||
| 49 | |||
| 50 | struct scal_detail { | ||
| 51 | unsigned char node_id; /* Scalability Node ID */ | ||
| 52 | unsigned long CBAR; /* Address of 1MB register space */ | ||
| 53 | unsigned char port0node; /* Node ID port connected to: 0xFF=None */ | ||
| 54 | unsigned char port0port; /* Port num port connected to: 0,1,2, or 0xFF=None */ | ||
| 55 | unsigned char port1node; /* Node ID port connected to: 0xFF = None */ | ||
| 56 | unsigned char port1port; /* Port num port connected to: 0,1,2, or 0xFF=None */ | ||
| 57 | unsigned char port2node; /* Node ID port connected to: 0xFF = None */ | ||
| 58 | unsigned char port2port; /* Port num port connected to: 0,1,2, or 0xFF=None */ | ||
| 59 | unsigned char chassis_num; /* 1 based Chassis number (1 = boot node) */ | ||
| 60 | } __attribute__((packed)); | ||
| 61 | |||
| 62 | struct rio_detail { | ||
| 63 | unsigned char node_id; /* RIO Node ID */ | ||
| 64 | unsigned long BBAR; /* Address of 1MB register space */ | ||
| 65 | unsigned char type; /* Type of device */ | ||
| 66 | unsigned char owner_id; /* For WPEG: Node ID of Cyclone that owns this WPEG*/ | ||
| 67 | /* For CYC: Node ID of Twister that owns this CYC */ | ||
| 68 | unsigned char port0node; /* Node ID port connected to: 0xFF=None */ | ||
| 69 | unsigned char port0port; /* Port num port connected to: 0,1,2, or 0xFF=None */ | ||
| 70 | unsigned char port1node; /* Node ID port connected to: 0xFF=None */ | ||
| 71 | unsigned char port1port; /* Port num port connected to: 0,1,2, or 0xFF=None */ | ||
| 72 | unsigned char first_slot; /* For WPEG: Lowest slot number below this WPEG */ | ||
| 73 | /* For CYC: 0 */ | ||
| 74 | unsigned char status; /* For WPEG: Bit 0 = 1 : the XAPIC is used */ | ||
| 75 | /* = 0 : the XAPIC is not used, ie:*/ | ||
| 76 | /* ints fwded to another XAPIC */ | ||
| 77 | /* Bits1:7 Reserved */ | ||
| 78 | /* For CYC: Bits0:7 Reserved */ | ||
| 79 | unsigned char WP_index; /* For WPEG: WPEG instance index - lower ones have */ | ||
| 80 | /* lower slot numbers/PCI bus numbers */ | ||
| 81 | /* For CYC: No meaning */ | ||
| 82 | unsigned char chassis_num; /* 1 based Chassis number */ | ||
| 83 | /* For LookOut WPEGs this field indicates the */ | ||
| 84 | /* Expansion Chassis #, enumerated from Boot */ | ||
| 85 | /* Node WPEG external port, then Boot Node CYC */ | ||
| 86 | /* external port, then Next Vigil chassis WPEG */ | ||
| 87 | /* external port, etc. */ | ||
| 88 | /* Shared Lookouts have only 1 chassis number (the */ | ||
| 89 | /* first one assigned) */ | ||
| 90 | } __attribute__((packed)); | ||
| 91 | |||
| 92 | |||
| 93 | typedef enum { | ||
| 94 | CompatTwister = 0, /* Compatibility Twister */ | ||
| 95 | AltTwister = 1, /* Alternate Twister of internal 8-way */ | ||
| 96 | CompatCyclone = 2, /* Compatibility Cyclone */ | ||
| 97 | AltCyclone = 3, /* Alternate Cyclone of internal 8-way */ | ||
| 98 | CompatWPEG = 4, /* Compatibility WPEG */ | ||
| 99 | AltWPEG = 5, /* Second Planar WPEG */ | ||
| 100 | LookOutAWPEG = 6, /* LookOut WPEG */ | ||
| 101 | LookOutBWPEG = 7, /* LookOut WPEG */ | ||
| 102 | } node_type; | ||
| 103 | |||
| 104 | static inline int is_WPEG(struct rio_detail *rio){ | ||
| 105 | return (rio->type == CompatWPEG || rio->type == AltWPEG || | ||
| 106 | rio->type == LookOutAWPEG || rio->type == LookOutBWPEG); | ||
| 107 | } | ||
| 108 | |||
| 109 | #endif /* __ASM_SUMMIT_MPPARSE_H */ | ||
diff --git a/arch/x86/include/asm/syscalls.h b/arch/x86/include/asm/syscalls.h index c0b0bda754ee..7043408f6904 100644 --- a/arch/x86/include/asm/syscalls.h +++ b/arch/x86/include/asm/syscalls.h | |||
| @@ -29,21 +29,21 @@ asmlinkage int sys_get_thread_area(struct user_desc __user *); | |||
| 29 | /* X86_32 only */ | 29 | /* X86_32 only */ |
| 30 | #ifdef CONFIG_X86_32 | 30 | #ifdef CONFIG_X86_32 |
| 31 | /* kernel/process_32.c */ | 31 | /* kernel/process_32.c */ |
| 32 | asmlinkage int sys_fork(struct pt_regs); | 32 | int sys_fork(struct pt_regs *); |
| 33 | asmlinkage int sys_clone(struct pt_regs); | 33 | int sys_clone(struct pt_regs *); |
| 34 | asmlinkage int sys_vfork(struct pt_regs); | 34 | int sys_vfork(struct pt_regs *); |
| 35 | asmlinkage int sys_execve(struct pt_regs); | 35 | int sys_execve(struct pt_regs *); |
| 36 | 36 | ||
| 37 | /* kernel/signal_32.c */ | 37 | /* kernel/signal_32.c */ |
| 38 | asmlinkage int sys_sigsuspend(int, int, old_sigset_t); | 38 | asmlinkage int sys_sigsuspend(int, int, old_sigset_t); |
| 39 | asmlinkage int sys_sigaction(int, const struct old_sigaction __user *, | 39 | asmlinkage int sys_sigaction(int, const struct old_sigaction __user *, |
| 40 | struct old_sigaction __user *); | 40 | struct old_sigaction __user *); |
| 41 | asmlinkage int sys_sigaltstack(unsigned long); | 41 | int sys_sigaltstack(struct pt_regs *); |
| 42 | asmlinkage unsigned long sys_sigreturn(unsigned long); | 42 | unsigned long sys_sigreturn(struct pt_regs *); |
| 43 | asmlinkage int sys_rt_sigreturn(unsigned long); | 43 | long sys_rt_sigreturn(struct pt_regs *); |
| 44 | 44 | ||
| 45 | /* kernel/ioport.c */ | 45 | /* kernel/ioport.c */ |
| 46 | asmlinkage long sys_iopl(unsigned long); | 46 | long sys_iopl(struct pt_regs *); |
| 47 | 47 | ||
| 48 | /* kernel/sys_i386_32.c */ | 48 | /* kernel/sys_i386_32.c */ |
| 49 | asmlinkage long sys_mmap2(unsigned long, unsigned long, unsigned long, | 49 | asmlinkage long sys_mmap2(unsigned long, unsigned long, unsigned long, |
| @@ -59,8 +59,8 @@ struct oldold_utsname; | |||
| 59 | asmlinkage int sys_olduname(struct oldold_utsname __user *); | 59 | asmlinkage int sys_olduname(struct oldold_utsname __user *); |
| 60 | 60 | ||
| 61 | /* kernel/vm86_32.c */ | 61 | /* kernel/vm86_32.c */ |
| 62 | asmlinkage int sys_vm86old(struct pt_regs); | 62 | int sys_vm86old(struct pt_regs *); |
| 63 | asmlinkage int sys_vm86(struct pt_regs); | 63 | int sys_vm86(struct pt_regs *); |
| 64 | 64 | ||
| 65 | #else /* CONFIG_X86_32 */ | 65 | #else /* CONFIG_X86_32 */ |
| 66 | 66 | ||
| @@ -74,6 +74,7 @@ asmlinkage long sys_vfork(struct pt_regs *); | |||
| 74 | asmlinkage long sys_execve(char __user *, char __user * __user *, | 74 | asmlinkage long sys_execve(char __user *, char __user * __user *, |
| 75 | char __user * __user *, | 75 | char __user * __user *, |
| 76 | struct pt_regs *); | 76 | struct pt_regs *); |
| 77 | long sys_arch_prctl(int, unsigned long); | ||
| 77 | 78 | ||
| 78 | /* kernel/ioport.c */ | 79 | /* kernel/ioport.c */ |
| 79 | asmlinkage long sys_iopl(unsigned int, struct pt_regs *); | 80 | asmlinkage long sys_iopl(unsigned int, struct pt_regs *); |
| @@ -81,7 +82,7 @@ asmlinkage long sys_iopl(unsigned int, struct pt_regs *); | |||
| 81 | /* kernel/signal_64.c */ | 82 | /* kernel/signal_64.c */ |
| 82 | asmlinkage long sys_sigaltstack(const stack_t __user *, stack_t __user *, | 83 | asmlinkage long sys_sigaltstack(const stack_t __user *, stack_t __user *, |
| 83 | struct pt_regs *); | 84 | struct pt_regs *); |
| 84 | asmlinkage long sys_rt_sigreturn(struct pt_regs *); | 85 | long sys_rt_sigreturn(struct pt_regs *); |
| 85 | 86 | ||
| 86 | /* kernel/sys_x86_64.c */ | 87 | /* kernel/sys_x86_64.c */ |
| 87 | asmlinkage long sys_mmap(unsigned long, unsigned long, unsigned long, | 88 | asmlinkage long sys_mmap(unsigned long, unsigned long, unsigned long, |
diff --git a/arch/x86/include/asm/system.h b/arch/x86/include/asm/system.h index 8e626ea33a1a..c00bfdbdd456 100644 --- a/arch/x86/include/asm/system.h +++ b/arch/x86/include/asm/system.h | |||
| @@ -23,6 +23,20 @@ struct task_struct *__switch_to(struct task_struct *prev, | |||
| 23 | 23 | ||
| 24 | #ifdef CONFIG_X86_32 | 24 | #ifdef CONFIG_X86_32 |
| 25 | 25 | ||
| 26 | #ifdef CONFIG_CC_STACKPROTECTOR | ||
| 27 | #define __switch_canary \ | ||
| 28 | "movl %P[task_canary](%[next]), %%ebx\n\t" \ | ||
| 29 | "movl %%ebx, "__percpu_arg([stack_canary])"\n\t" | ||
| 30 | #define __switch_canary_oparam \ | ||
| 31 | , [stack_canary] "=m" (per_cpu_var(stack_canary)) | ||
| 32 | #define __switch_canary_iparam \ | ||
| 33 | , [task_canary] "i" (offsetof(struct task_struct, stack_canary)) | ||
| 34 | #else /* CC_STACKPROTECTOR */ | ||
| 35 | #define __switch_canary | ||
| 36 | #define __switch_canary_oparam | ||
| 37 | #define __switch_canary_iparam | ||
| 38 | #endif /* CC_STACKPROTECTOR */ | ||
| 39 | |||
| 26 | /* | 40 | /* |
| 27 | * Saving eflags is important. It switches not only IOPL between tasks, | 41 | * Saving eflags is important. It switches not only IOPL between tasks, |
| 28 | * it also protects other tasks from NT leaking through sysenter etc. | 42 | * it also protects other tasks from NT leaking through sysenter etc. |
| @@ -44,6 +58,7 @@ do { \ | |||
| 44 | "movl %[next_sp],%%esp\n\t" /* restore ESP */ \ | 58 | "movl %[next_sp],%%esp\n\t" /* restore ESP */ \ |
| 45 | "movl $1f,%[prev_ip]\n\t" /* save EIP */ \ | 59 | "movl $1f,%[prev_ip]\n\t" /* save EIP */ \ |
| 46 | "pushl %[next_ip]\n\t" /* restore EIP */ \ | 60 | "pushl %[next_ip]\n\t" /* restore EIP */ \ |
| 61 | __switch_canary \ | ||
| 47 | "jmp __switch_to\n" /* regparm call */ \ | 62 | "jmp __switch_to\n" /* regparm call */ \ |
| 48 | "1:\t" \ | 63 | "1:\t" \ |
| 49 | "popl %%ebp\n\t" /* restore EBP */ \ | 64 | "popl %%ebp\n\t" /* restore EBP */ \ |
| @@ -58,6 +73,8 @@ do { \ | |||
| 58 | "=b" (ebx), "=c" (ecx), "=d" (edx), \ | 73 | "=b" (ebx), "=c" (ecx), "=d" (edx), \ |
| 59 | "=S" (esi), "=D" (edi) \ | 74 | "=S" (esi), "=D" (edi) \ |
| 60 | \ | 75 | \ |
| 76 | __switch_canary_oparam \ | ||
| 77 | \ | ||
| 61 | /* input parameters: */ \ | 78 | /* input parameters: */ \ |
| 62 | : [next_sp] "m" (next->thread.sp), \ | 79 | : [next_sp] "m" (next->thread.sp), \ |
| 63 | [next_ip] "m" (next->thread.ip), \ | 80 | [next_ip] "m" (next->thread.ip), \ |
| @@ -66,6 +83,8 @@ do { \ | |||
| 66 | [prev] "a" (prev), \ | 83 | [prev] "a" (prev), \ |
| 67 | [next] "d" (next) \ | 84 | [next] "d" (next) \ |
| 68 | \ | 85 | \ |
| 86 | __switch_canary_iparam \ | ||
| 87 | \ | ||
| 69 | : /* reloaded segment registers */ \ | 88 | : /* reloaded segment registers */ \ |
| 70 | "memory"); \ | 89 | "memory"); \ |
| 71 | } while (0) | 90 | } while (0) |
| @@ -86,27 +105,44 @@ do { \ | |||
| 86 | , "rcx", "rbx", "rdx", "r8", "r9", "r10", "r11", \ | 105 | , "rcx", "rbx", "rdx", "r8", "r9", "r10", "r11", \ |
| 87 | "r12", "r13", "r14", "r15" | 106 | "r12", "r13", "r14", "r15" |
| 88 | 107 | ||
| 108 | #ifdef CONFIG_CC_STACKPROTECTOR | ||
| 109 | #define __switch_canary \ | ||
| 110 | "movq %P[task_canary](%%rsi),%%r8\n\t" \ | ||
| 111 | "movq %%r8,"__percpu_arg([gs_canary])"\n\t" | ||
| 112 | #define __switch_canary_oparam \ | ||
| 113 | , [gs_canary] "=m" (per_cpu_var(irq_stack_union.stack_canary)) | ||
| 114 | #define __switch_canary_iparam \ | ||
| 115 | , [task_canary] "i" (offsetof(struct task_struct, stack_canary)) | ||
| 116 | #else /* CC_STACKPROTECTOR */ | ||
| 117 | #define __switch_canary | ||
| 118 | #define __switch_canary_oparam | ||
| 119 | #define __switch_canary_iparam | ||
| 120 | #endif /* CC_STACKPROTECTOR */ | ||
| 121 | |||
| 89 | /* Save restore flags to clear handle leaking NT */ | 122 | /* Save restore flags to clear handle leaking NT */ |
| 90 | #define switch_to(prev, next, last) \ | 123 | #define switch_to(prev, next, last) \ |
| 91 | asm volatile(SAVE_CONTEXT \ | 124 | asm volatile(SAVE_CONTEXT \ |
| 92 | "movq %%rsp,%P[threadrsp](%[prev])\n\t" /* save RSP */ \ | 125 | "movq %%rsp,%P[threadrsp](%[prev])\n\t" /* save RSP */ \ |
| 93 | "movq %P[threadrsp](%[next]),%%rsp\n\t" /* restore RSP */ \ | 126 | "movq %P[threadrsp](%[next]),%%rsp\n\t" /* restore RSP */ \ |
| 94 | "call __switch_to\n\t" \ | 127 | "call __switch_to\n\t" \ |
| 95 | ".globl thread_return\n" \ | 128 | ".globl thread_return\n" \ |
| 96 | "thread_return:\n\t" \ | 129 | "thread_return:\n\t" \ |
| 97 | "movq %%gs:%P[pda_pcurrent],%%rsi\n\t" \ | 130 | "movq "__percpu_arg([current_task])",%%rsi\n\t" \ |
| 131 | __switch_canary \ | ||
| 98 | "movq %P[thread_info](%%rsi),%%r8\n\t" \ | 132 | "movq %P[thread_info](%%rsi),%%r8\n\t" \ |
| 99 | LOCK_PREFIX "btr %[tif_fork],%P[ti_flags](%%r8)\n\t" \ | ||
| 100 | "movq %%rax,%%rdi\n\t" \ | 133 | "movq %%rax,%%rdi\n\t" \ |
| 101 | "jc ret_from_fork\n\t" \ | 134 | "testl %[_tif_fork],%P[ti_flags](%%r8)\n\t" \ |
| 135 | "jnz ret_from_fork\n\t" \ | ||
| 102 | RESTORE_CONTEXT \ | 136 | RESTORE_CONTEXT \ |
| 103 | : "=a" (last) \ | 137 | : "=a" (last) \ |
| 138 | __switch_canary_oparam \ | ||
| 104 | : [next] "S" (next), [prev] "D" (prev), \ | 139 | : [next] "S" (next), [prev] "D" (prev), \ |
| 105 | [threadrsp] "i" (offsetof(struct task_struct, thread.sp)), \ | 140 | [threadrsp] "i" (offsetof(struct task_struct, thread.sp)), \ |
| 106 | [ti_flags] "i" (offsetof(struct thread_info, flags)), \ | 141 | [ti_flags] "i" (offsetof(struct thread_info, flags)), \ |
| 107 | [tif_fork] "i" (TIF_FORK), \ | 142 | [_tif_fork] "i" (_TIF_FORK), \ |
| 108 | [thread_info] "i" (offsetof(struct task_struct, stack)), \ | 143 | [thread_info] "i" (offsetof(struct task_struct, stack)), \ |
| 109 | [pda_pcurrent] "i" (offsetof(struct x8664_pda, pcurrent)) \ | 144 | [current_task] "m" (per_cpu_var(current_task)) \ |
| 145 | __switch_canary_iparam \ | ||
| 110 | : "memory", "cc" __EXTRA_CLOBBER) | 146 | : "memory", "cc" __EXTRA_CLOBBER) |
| 111 | #endif | 147 | #endif |
| 112 | 148 | ||
| @@ -165,6 +201,25 @@ extern void native_load_gs_index(unsigned); | |||
| 165 | #define savesegment(seg, value) \ | 201 | #define savesegment(seg, value) \ |
| 166 | asm("mov %%" #seg ",%0":"=r" (value) : : "memory") | 202 | asm("mov %%" #seg ",%0":"=r" (value) : : "memory") |
| 167 | 203 | ||
| 204 | /* | ||
| 205 | * x86_32 user gs accessors. | ||
| 206 | */ | ||
| 207 | #ifdef CONFIG_X86_32 | ||
| 208 | #ifdef CONFIG_X86_32_LAZY_GS | ||
| 209 | #define get_user_gs(regs) (u16)({unsigned long v; savesegment(gs, v); v;}) | ||
| 210 | #define set_user_gs(regs, v) loadsegment(gs, (unsigned long)(v)) | ||
| 211 | #define task_user_gs(tsk) ((tsk)->thread.gs) | ||
| 212 | #define lazy_save_gs(v) savesegment(gs, (v)) | ||
| 213 | #define lazy_load_gs(v) loadsegment(gs, (v)) | ||
| 214 | #else /* X86_32_LAZY_GS */ | ||
| 215 | #define get_user_gs(regs) (u16)((regs)->gs) | ||
| 216 | #define set_user_gs(regs, v) do { (regs)->gs = (v); } while (0) | ||
| 217 | #define task_user_gs(tsk) (task_pt_regs(tsk)->gs) | ||
| 218 | #define lazy_save_gs(v) do { } while (0) | ||
| 219 | #define lazy_load_gs(v) do { } while (0) | ||
| 220 | #endif /* X86_32_LAZY_GS */ | ||
| 221 | #endif /* X86_32 */ | ||
| 222 | |||
| 168 | static inline unsigned long get_limit(unsigned long segment) | 223 | static inline unsigned long get_limit(unsigned long segment) |
| 169 | { | 224 | { |
| 170 | unsigned long __limit; | 225 | unsigned long __limit; |
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index 98789647baa9..df9d5f78385e 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h | |||
| @@ -40,6 +40,7 @@ struct thread_info { | |||
| 40 | */ | 40 | */ |
| 41 | __u8 supervisor_stack[0]; | 41 | __u8 supervisor_stack[0]; |
| 42 | #endif | 42 | #endif |
| 43 | int uaccess_err; | ||
| 43 | }; | 44 | }; |
| 44 | 45 | ||
| 45 | #define INIT_THREAD_INFO(tsk) \ | 46 | #define INIT_THREAD_INFO(tsk) \ |
| @@ -194,25 +195,21 @@ static inline struct thread_info *current_thread_info(void) | |||
| 194 | 195 | ||
| 195 | #else /* X86_32 */ | 196 | #else /* X86_32 */ |
| 196 | 197 | ||
| 197 | #include <asm/pda.h> | 198 | #include <asm/percpu.h> |
| 199 | #define KERNEL_STACK_OFFSET (5*8) | ||
| 198 | 200 | ||
| 199 | /* | 201 | /* |
| 200 | * macros/functions for gaining access to the thread information structure | 202 | * macros/functions for gaining access to the thread information structure |
| 201 | * preempt_count needs to be 1 initially, until the scheduler is functional. | 203 | * preempt_count needs to be 1 initially, until the scheduler is functional. |
| 202 | */ | 204 | */ |
| 203 | #ifndef __ASSEMBLY__ | 205 | #ifndef __ASSEMBLY__ |
| 204 | static inline struct thread_info *current_thread_info(void) | 206 | DECLARE_PER_CPU(unsigned long, kernel_stack); |
| 205 | { | ||
| 206 | struct thread_info *ti; | ||
| 207 | ti = (void *)(read_pda(kernelstack) + PDA_STACKOFFSET - THREAD_SIZE); | ||
| 208 | return ti; | ||
| 209 | } | ||
| 210 | 207 | ||
| 211 | /* do not use in interrupt context */ | 208 | static inline struct thread_info *current_thread_info(void) |
| 212 | static inline struct thread_info *stack_thread_info(void) | ||
| 213 | { | 209 | { |
| 214 | struct thread_info *ti; | 210 | struct thread_info *ti; |
| 215 | asm("andq %%rsp,%0; " : "=r" (ti) : "0" (~(THREAD_SIZE - 1))); | 211 | ti = (void *)(percpu_read(kernel_stack) + |
| 212 | KERNEL_STACK_OFFSET - THREAD_SIZE); | ||
| 216 | return ti; | 213 | return ti; |
| 217 | } | 214 | } |
| 218 | 215 | ||
| @@ -220,8 +217,8 @@ static inline struct thread_info *stack_thread_info(void) | |||
| 220 | 217 | ||
| 221 | /* how to get the thread information struct from ASM */ | 218 | /* how to get the thread information struct from ASM */ |
| 222 | #define GET_THREAD_INFO(reg) \ | 219 | #define GET_THREAD_INFO(reg) \ |
| 223 | movq %gs:pda_kernelstack,reg ; \ | 220 | movq PER_CPU_VAR(kernel_stack),reg ; \ |
| 224 | subq $(THREAD_SIZE-PDA_STACKOFFSET),reg | 221 | subq $(THREAD_SIZE-KERNEL_STACK_OFFSET),reg |
| 225 | 222 | ||
| 226 | #endif | 223 | #endif |
| 227 | 224 | ||
diff --git a/arch/x86/include/asm/tlbflush.h b/arch/x86/include/asm/tlbflush.h index 0e7bbb549116..d3539f998f88 100644 --- a/arch/x86/include/asm/tlbflush.h +++ b/arch/x86/include/asm/tlbflush.h | |||
| @@ -113,7 +113,7 @@ static inline void flush_tlb_range(struct vm_area_struct *vma, | |||
| 113 | __flush_tlb(); | 113 | __flush_tlb(); |
| 114 | } | 114 | } |
| 115 | 115 | ||
| 116 | static inline void native_flush_tlb_others(const cpumask_t *cpumask, | 116 | static inline void native_flush_tlb_others(const struct cpumask *cpumask, |
| 117 | struct mm_struct *mm, | 117 | struct mm_struct *mm, |
| 118 | unsigned long va) | 118 | unsigned long va) |
| 119 | { | 119 | { |
| @@ -142,31 +142,28 @@ static inline void flush_tlb_range(struct vm_area_struct *vma, | |||
| 142 | flush_tlb_mm(vma->vm_mm); | 142 | flush_tlb_mm(vma->vm_mm); |
| 143 | } | 143 | } |
| 144 | 144 | ||
| 145 | void native_flush_tlb_others(const cpumask_t *cpumask, struct mm_struct *mm, | 145 | void native_flush_tlb_others(const struct cpumask *cpumask, |
| 146 | unsigned long va); | 146 | struct mm_struct *mm, unsigned long va); |
| 147 | 147 | ||
| 148 | #define TLBSTATE_OK 1 | 148 | #define TLBSTATE_OK 1 |
| 149 | #define TLBSTATE_LAZY 2 | 149 | #define TLBSTATE_LAZY 2 |
| 150 | 150 | ||
| 151 | #ifdef CONFIG_X86_32 | ||
| 152 | struct tlb_state { | 151 | struct tlb_state { |
| 153 | struct mm_struct *active_mm; | 152 | struct mm_struct *active_mm; |
| 154 | int state; | 153 | int state; |
| 155 | char __cacheline_padding[L1_CACHE_BYTES-8]; | ||
| 156 | }; | 154 | }; |
| 157 | DECLARE_PER_CPU(struct tlb_state, cpu_tlbstate); | 155 | DECLARE_PER_CPU(struct tlb_state, cpu_tlbstate); |
| 158 | 156 | ||
| 159 | void reset_lazy_tlbstate(void); | ||
| 160 | #else | ||
| 161 | static inline void reset_lazy_tlbstate(void) | 157 | static inline void reset_lazy_tlbstate(void) |
| 162 | { | 158 | { |
| 159 | percpu_write(cpu_tlbstate.state, 0); | ||
| 160 | percpu_write(cpu_tlbstate.active_mm, &init_mm); | ||
| 163 | } | 161 | } |
| 164 | #endif | ||
| 165 | 162 | ||
| 166 | #endif /* SMP */ | 163 | #endif /* SMP */ |
| 167 | 164 | ||
| 168 | #ifndef CONFIG_PARAVIRT | 165 | #ifndef CONFIG_PARAVIRT |
| 169 | #define flush_tlb_others(mask, mm, va) native_flush_tlb_others(&mask, mm, va) | 166 | #define flush_tlb_others(mask, mm, va) native_flush_tlb_others(mask, mm, va) |
| 170 | #endif | 167 | #endif |
| 171 | 168 | ||
| 172 | static inline void flush_tlb_kernel_range(unsigned long start, | 169 | static inline void flush_tlb_kernel_range(unsigned long start, |
| @@ -175,4 +172,6 @@ static inline void flush_tlb_kernel_range(unsigned long start, | |||
| 175 | flush_tlb_all(); | 172 | flush_tlb_all(); |
| 176 | } | 173 | } |
| 177 | 174 | ||
| 175 | extern void zap_low_mappings(void); | ||
| 176 | |||
| 178 | #endif /* _ASM_X86_TLBFLUSH_H */ | 177 | #endif /* _ASM_X86_TLBFLUSH_H */ |
diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h index 4e2f2e0aab27..77cfb2cfb386 100644 --- a/arch/x86/include/asm/topology.h +++ b/arch/x86/include/asm/topology.h | |||
| @@ -74,6 +74,8 @@ static inline const struct cpumask *cpumask_of_node(int node) | |||
| 74 | return &node_to_cpumask_map[node]; | 74 | return &node_to_cpumask_map[node]; |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | static inline void setup_node_to_cpumask_map(void) { } | ||
| 78 | |||
| 77 | #else /* CONFIG_X86_64 */ | 79 | #else /* CONFIG_X86_64 */ |
| 78 | 80 | ||
| 79 | /* Mappings between node number and cpus on that node. */ | 81 | /* Mappings between node number and cpus on that node. */ |
| @@ -83,7 +85,8 @@ extern cpumask_t *node_to_cpumask_map; | |||
| 83 | DECLARE_EARLY_PER_CPU(int, x86_cpu_to_node_map); | 85 | DECLARE_EARLY_PER_CPU(int, x86_cpu_to_node_map); |
| 84 | 86 | ||
| 85 | /* Returns the number of the current Node. */ | 87 | /* Returns the number of the current Node. */ |
| 86 | #define numa_node_id() read_pda(nodenumber) | 88 | DECLARE_PER_CPU(int, node_number); |
| 89 | #define numa_node_id() percpu_read(node_number) | ||
| 87 | 90 | ||
| 88 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS | 91 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS |
| 89 | extern int cpu_to_node(int cpu); | 92 | extern int cpu_to_node(int cpu); |
| @@ -102,10 +105,7 @@ static inline int cpu_to_node(int cpu) | |||
| 102 | /* Same function but used if called before per_cpu areas are setup */ | 105 | /* Same function but used if called before per_cpu areas are setup */ |
| 103 | static inline int early_cpu_to_node(int cpu) | 106 | static inline int early_cpu_to_node(int cpu) |
| 104 | { | 107 | { |
| 105 | if (early_per_cpu_ptr(x86_cpu_to_node_map)) | 108 | return early_per_cpu(x86_cpu_to_node_map, cpu); |
| 106 | return early_per_cpu_ptr(x86_cpu_to_node_map)[cpu]; | ||
| 107 | |||
| 108 | return per_cpu(x86_cpu_to_node_map, cpu); | ||
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | /* Returns a pointer to the cpumask of CPUs on Node 'node'. */ | 111 | /* Returns a pointer to the cpumask of CPUs on Node 'node'. */ |
| @@ -122,6 +122,8 @@ static inline cpumask_t node_to_cpumask(int node) | |||
| 122 | 122 | ||
| 123 | #endif /* !CONFIG_DEBUG_PER_CPU_MAPS */ | 123 | #endif /* !CONFIG_DEBUG_PER_CPU_MAPS */ |
| 124 | 124 | ||
| 125 | extern void setup_node_to_cpumask_map(void); | ||
| 126 | |||
| 125 | /* | 127 | /* |
| 126 | * Replace default node_to_cpumask_ptr with optimized version | 128 | * Replace default node_to_cpumask_ptr with optimized version |
| 127 | * Deprecated: use "const struct cpumask *mask = cpumask_of_node(node)" | 129 | * Deprecated: use "const struct cpumask *mask = cpumask_of_node(node)" |
| @@ -192,9 +194,20 @@ extern int __node_distance(int, int); | |||
| 192 | 194 | ||
| 193 | #else /* !CONFIG_NUMA */ | 195 | #else /* !CONFIG_NUMA */ |
| 194 | 196 | ||
| 195 | #define numa_node_id() 0 | 197 | static inline int numa_node_id(void) |
| 196 | #define cpu_to_node(cpu) 0 | 198 | { |
| 197 | #define early_cpu_to_node(cpu) 0 | 199 | return 0; |
| 200 | } | ||
| 201 | |||
| 202 | static inline int cpu_to_node(int cpu) | ||
| 203 | { | ||
| 204 | return 0; | ||
| 205 | } | ||
| 206 | |||
| 207 | static inline int early_cpu_to_node(int cpu) | ||
| 208 | { | ||
| 209 | return 0; | ||
| 210 | } | ||
| 198 | 211 | ||
| 199 | static inline const cpumask_t *cpumask_of_node(int node) | 212 | static inline const cpumask_t *cpumask_of_node(int node) |
| 200 | { | 213 | { |
| @@ -209,6 +222,8 @@ static inline int node_to_first_cpu(int node) | |||
| 209 | return first_cpu(cpu_online_map); | 222 | return first_cpu(cpu_online_map); |
| 210 | } | 223 | } |
| 211 | 224 | ||
| 225 | static inline void setup_node_to_cpumask_map(void) { } | ||
| 226 | |||
| 212 | /* | 227 | /* |
| 213 | * Replace default node_to_cpumask_ptr with optimized version | 228 | * Replace default node_to_cpumask_ptr with optimized version |
| 214 | * Deprecated: use "const struct cpumask *mask = cpumask_of_node(node)" | 229 | * Deprecated: use "const struct cpumask *mask = cpumask_of_node(node)" |
diff --git a/arch/x86/include/asm/trampoline.h b/arch/x86/include/asm/trampoline.h index 780ba0ab94f9..90f06c25221d 100644 --- a/arch/x86/include/asm/trampoline.h +++ b/arch/x86/include/asm/trampoline.h | |||
| @@ -13,6 +13,7 @@ extern unsigned char *trampoline_base; | |||
| 13 | 13 | ||
| 14 | extern unsigned long init_rsp; | 14 | extern unsigned long init_rsp; |
| 15 | extern unsigned long initial_code; | 15 | extern unsigned long initial_code; |
| 16 | extern unsigned long initial_gs; | ||
| 16 | 17 | ||
| 17 | #define TRAMPOLINE_SIZE roundup(trampoline_end - trampoline_data, PAGE_SIZE) | 18 | #define TRAMPOLINE_SIZE roundup(trampoline_end - trampoline_data, PAGE_SIZE) |
| 18 | #define TRAMPOLINE_BASE 0x6000 | 19 | #define TRAMPOLINE_BASE 0x6000 |
diff --git a/arch/x86/include/asm/traps.h b/arch/x86/include/asm/traps.h index cf3bb053da0b..0d5342515b86 100644 --- a/arch/x86/include/asm/traps.h +++ b/arch/x86/include/asm/traps.h | |||
| @@ -41,7 +41,7 @@ dotraplinkage void do_int3(struct pt_regs *, long); | |||
| 41 | dotraplinkage void do_overflow(struct pt_regs *, long); | 41 | dotraplinkage void do_overflow(struct pt_regs *, long); |
| 42 | dotraplinkage void do_bounds(struct pt_regs *, long); | 42 | dotraplinkage void do_bounds(struct pt_regs *, long); |
| 43 | dotraplinkage void do_invalid_op(struct pt_regs *, long); | 43 | dotraplinkage void do_invalid_op(struct pt_regs *, long); |
| 44 | dotraplinkage void do_device_not_available(struct pt_regs); | 44 | dotraplinkage void do_device_not_available(struct pt_regs *, long); |
| 45 | dotraplinkage void do_coprocessor_segment_overrun(struct pt_regs *, long); | 45 | dotraplinkage void do_coprocessor_segment_overrun(struct pt_regs *, long); |
| 46 | dotraplinkage void do_invalid_TSS(struct pt_regs *, long); | 46 | dotraplinkage void do_invalid_TSS(struct pt_regs *, long); |
| 47 | dotraplinkage void do_segment_not_present(struct pt_regs *, long); | 47 | dotraplinkage void do_segment_not_present(struct pt_regs *, long); |
diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h index 4340055b7559..b685ece89d5c 100644 --- a/arch/x86/include/asm/uaccess.h +++ b/arch/x86/include/asm/uaccess.h | |||
| @@ -121,7 +121,7 @@ extern int __get_user_bad(void); | |||
| 121 | 121 | ||
| 122 | #define __get_user_x(size, ret, x, ptr) \ | 122 | #define __get_user_x(size, ret, x, ptr) \ |
| 123 | asm volatile("call __get_user_" #size \ | 123 | asm volatile("call __get_user_" #size \ |
| 124 | : "=a" (ret),"=d" (x) \ | 124 | : "=a" (ret), "=d" (x) \ |
| 125 | : "0" (ptr)) \ | 125 | : "0" (ptr)) \ |
| 126 | 126 | ||
| 127 | /* Careful: we have to cast the result to the type of the pointer | 127 | /* Careful: we have to cast the result to the type of the pointer |
| @@ -181,12 +181,12 @@ extern int __get_user_bad(void); | |||
| 181 | 181 | ||
| 182 | #define __put_user_x(size, x, ptr, __ret_pu) \ | 182 | #define __put_user_x(size, x, ptr, __ret_pu) \ |
| 183 | asm volatile("call __put_user_" #size : "=a" (__ret_pu) \ | 183 | asm volatile("call __put_user_" #size : "=a" (__ret_pu) \ |
| 184 | :"0" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx") | 184 | : "0" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx") |
| 185 | 185 | ||
| 186 | 186 | ||
| 187 | 187 | ||
| 188 | #ifdef CONFIG_X86_32 | 188 | #ifdef CONFIG_X86_32 |
| 189 | #define __put_user_u64(x, addr, err) \ | 189 | #define __put_user_asm_u64(x, addr, err, errret) \ |
| 190 | asm volatile("1: movl %%eax,0(%2)\n" \ | 190 | asm volatile("1: movl %%eax,0(%2)\n" \ |
| 191 | "2: movl %%edx,4(%2)\n" \ | 191 | "2: movl %%edx,4(%2)\n" \ |
| 192 | "3:\n" \ | 192 | "3:\n" \ |
| @@ -197,14 +197,24 @@ extern int __get_user_bad(void); | |||
| 197 | _ASM_EXTABLE(1b, 4b) \ | 197 | _ASM_EXTABLE(1b, 4b) \ |
| 198 | _ASM_EXTABLE(2b, 4b) \ | 198 | _ASM_EXTABLE(2b, 4b) \ |
| 199 | : "=r" (err) \ | 199 | : "=r" (err) \ |
| 200 | : "A" (x), "r" (addr), "i" (-EFAULT), "0" (err)) | 200 | : "A" (x), "r" (addr), "i" (errret), "0" (err)) |
| 201 | |||
| 202 | #define __put_user_asm_ex_u64(x, addr) \ | ||
| 203 | asm volatile("1: movl %%eax,0(%1)\n" \ | ||
| 204 | "2: movl %%edx,4(%1)\n" \ | ||
| 205 | "3:\n" \ | ||
| 206 | _ASM_EXTABLE(1b, 2b - 1b) \ | ||
| 207 | _ASM_EXTABLE(2b, 3b - 2b) \ | ||
| 208 | : : "A" (x), "r" (addr)) | ||
| 201 | 209 | ||
| 202 | #define __put_user_x8(x, ptr, __ret_pu) \ | 210 | #define __put_user_x8(x, ptr, __ret_pu) \ |
| 203 | asm volatile("call __put_user_8" : "=a" (__ret_pu) \ | 211 | asm volatile("call __put_user_8" : "=a" (__ret_pu) \ |
| 204 | : "A" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx") | 212 | : "A" ((typeof(*(ptr)))(x)), "c" (ptr) : "ebx") |
| 205 | #else | 213 | #else |
| 206 | #define __put_user_u64(x, ptr, retval) \ | 214 | #define __put_user_asm_u64(x, ptr, retval, errret) \ |
| 207 | __put_user_asm(x, ptr, retval, "q", "", "Zr", -EFAULT) | 215 | __put_user_asm(x, ptr, retval, "q", "", "Zr", errret) |
| 216 | #define __put_user_asm_ex_u64(x, addr) \ | ||
| 217 | __put_user_asm_ex(x, addr, "q", "", "Zr") | ||
| 208 | #define __put_user_x8(x, ptr, __ret_pu) __put_user_x(8, x, ptr, __ret_pu) | 218 | #define __put_user_x8(x, ptr, __ret_pu) __put_user_x(8, x, ptr, __ret_pu) |
| 209 | #endif | 219 | #endif |
| 210 | 220 | ||
| @@ -276,10 +286,32 @@ do { \ | |||
| 276 | __put_user_asm(x, ptr, retval, "w", "w", "ir", errret); \ | 286 | __put_user_asm(x, ptr, retval, "w", "w", "ir", errret); \ |
| 277 | break; \ | 287 | break; \ |
| 278 | case 4: \ | 288 | case 4: \ |
| 279 | __put_user_asm(x, ptr, retval, "l", "k", "ir", errret);\ | 289 | __put_user_asm(x, ptr, retval, "l", "k", "ir", errret); \ |
| 280 | break; \ | 290 | break; \ |
| 281 | case 8: \ | 291 | case 8: \ |
| 282 | __put_user_u64((__typeof__(*ptr))(x), ptr, retval); \ | 292 | __put_user_asm_u64((__typeof__(*ptr))(x), ptr, retval, \ |
| 293 | errret); \ | ||
| 294 | break; \ | ||
| 295 | default: \ | ||
| 296 | __put_user_bad(); \ | ||
| 297 | } \ | ||
| 298 | } while (0) | ||
| 299 | |||
| 300 | #define __put_user_size_ex(x, ptr, size) \ | ||
| 301 | do { \ | ||
| 302 | __chk_user_ptr(ptr); \ | ||
| 303 | switch (size) { \ | ||
| 304 | case 1: \ | ||
| 305 | __put_user_asm_ex(x, ptr, "b", "b", "iq"); \ | ||
| 306 | break; \ | ||
| 307 | case 2: \ | ||
| 308 | __put_user_asm_ex(x, ptr, "w", "w", "ir"); \ | ||
| 309 | break; \ | ||
| 310 | case 4: \ | ||
| 311 | __put_user_asm_ex(x, ptr, "l", "k", "ir"); \ | ||
| 312 | break; \ | ||
| 313 | case 8: \ | ||
| 314 | __put_user_asm_ex_u64((__typeof__(*ptr))(x), ptr); \ | ||
| 283 | break; \ | 315 | break; \ |
| 284 | default: \ | 316 | default: \ |
| 285 | __put_user_bad(); \ | 317 | __put_user_bad(); \ |
| @@ -311,9 +343,12 @@ do { \ | |||
| 311 | 343 | ||
| 312 | #ifdef CONFIG_X86_32 | 344 | #ifdef CONFIG_X86_32 |
| 313 | #define __get_user_asm_u64(x, ptr, retval, errret) (x) = __get_user_bad() | 345 | #define __get_user_asm_u64(x, ptr, retval, errret) (x) = __get_user_bad() |
| 346 | #define __get_user_asm_ex_u64(x, ptr) (x) = __get_user_bad() | ||
| 314 | #else | 347 | #else |
| 315 | #define __get_user_asm_u64(x, ptr, retval, errret) \ | 348 | #define __get_user_asm_u64(x, ptr, retval, errret) \ |
| 316 | __get_user_asm(x, ptr, retval, "q", "", "=r", errret) | 349 | __get_user_asm(x, ptr, retval, "q", "", "=r", errret) |
| 350 | #define __get_user_asm_ex_u64(x, ptr) \ | ||
| 351 | __get_user_asm_ex(x, ptr, "q", "", "=r") | ||
| 317 | #endif | 352 | #endif |
| 318 | 353 | ||
| 319 | #define __get_user_size(x, ptr, size, retval, errret) \ | 354 | #define __get_user_size(x, ptr, size, retval, errret) \ |
| @@ -350,6 +385,33 @@ do { \ | |||
| 350 | : "=r" (err), ltype(x) \ | 385 | : "=r" (err), ltype(x) \ |
| 351 | : "m" (__m(addr)), "i" (errret), "0" (err)) | 386 | : "m" (__m(addr)), "i" (errret), "0" (err)) |
| 352 | 387 | ||
| 388 | #define __get_user_size_ex(x, ptr, size) \ | ||
| 389 | do { \ | ||
| 390 | __chk_user_ptr(ptr); \ | ||
| 391 | switch (size) { \ | ||
| 392 | case 1: \ | ||
| 393 | __get_user_asm_ex(x, ptr, "b", "b", "=q"); \ | ||
| 394 | break; \ | ||
| 395 | case 2: \ | ||
| 396 | __get_user_asm_ex(x, ptr, "w", "w", "=r"); \ | ||
| 397 | break; \ | ||
| 398 | case 4: \ | ||
| 399 | __get_user_asm_ex(x, ptr, "l", "k", "=r"); \ | ||
| 400 | break; \ | ||
| 401 | case 8: \ | ||
| 402 | __get_user_asm_ex_u64(x, ptr); \ | ||
| 403 | break; \ | ||
| 404 | default: \ | ||
| 405 | (x) = __get_user_bad(); \ | ||
| 406 | } \ | ||
| 407 | } while (0) | ||
| 408 | |||
| 409 | #define __get_user_asm_ex(x, addr, itype, rtype, ltype) \ | ||
| 410 | asm volatile("1: mov"itype" %1,%"rtype"0\n" \ | ||
| 411 | "2:\n" \ | ||
| 412 | _ASM_EXTABLE(1b, 2b - 1b) \ | ||
| 413 | : ltype(x) : "m" (__m(addr))) | ||
| 414 | |||
| 353 | #define __put_user_nocheck(x, ptr, size) \ | 415 | #define __put_user_nocheck(x, ptr, size) \ |
| 354 | ({ \ | 416 | ({ \ |
| 355 | int __pu_err; \ | 417 | int __pu_err; \ |
| @@ -385,6 +447,26 @@ struct __large_struct { unsigned long buf[100]; }; | |||
| 385 | _ASM_EXTABLE(1b, 3b) \ | 447 | _ASM_EXTABLE(1b, 3b) \ |
| 386 | : "=r"(err) \ | 448 | : "=r"(err) \ |
| 387 | : ltype(x), "m" (__m(addr)), "i" (errret), "0" (err)) | 449 | : ltype(x), "m" (__m(addr)), "i" (errret), "0" (err)) |
| 450 | |||
| 451 | #define __put_user_asm_ex(x, addr, itype, rtype, ltype) \ | ||
| 452 | asm volatile("1: mov"itype" %"rtype"0,%1\n" \ | ||
| 453 | "2:\n" \ | ||
| 454 | _ASM_EXTABLE(1b, 2b - 1b) \ | ||
| 455 | : : ltype(x), "m" (__m(addr))) | ||
| 456 | |||
| 457 | /* | ||
| 458 | * uaccess_try and catch | ||
| 459 | */ | ||
| 460 | #define uaccess_try do { \ | ||
| 461 | int prev_err = current_thread_info()->uaccess_err; \ | ||
| 462 | current_thread_info()->uaccess_err = 0; \ | ||
| 463 | barrier(); | ||
| 464 | |||
| 465 | #define uaccess_catch(err) \ | ||
| 466 | (err) |= current_thread_info()->uaccess_err; \ | ||
| 467 | current_thread_info()->uaccess_err = prev_err; \ | ||
| 468 | } while (0) | ||
| 469 | |||
| 388 | /** | 470 | /** |
| 389 | * __get_user: - Get a simple variable from user space, with less checking. | 471 | * __get_user: - Get a simple variable from user space, with less checking. |
| 390 | * @x: Variable to store result. | 472 | * @x: Variable to store result. |
| @@ -408,6 +490,7 @@ struct __large_struct { unsigned long buf[100]; }; | |||
| 408 | 490 | ||
| 409 | #define __get_user(x, ptr) \ | 491 | #define __get_user(x, ptr) \ |
| 410 | __get_user_nocheck((x), (ptr), sizeof(*(ptr))) | 492 | __get_user_nocheck((x), (ptr), sizeof(*(ptr))) |
| 493 | |||
| 411 | /** | 494 | /** |
| 412 | * __put_user: - Write a simple value into user space, with less checking. | 495 | * __put_user: - Write a simple value into user space, with less checking. |
| 413 | * @x: Value to copy to user space. | 496 | * @x: Value to copy to user space. |
| @@ -435,6 +518,45 @@ struct __large_struct { unsigned long buf[100]; }; | |||
| 435 | #define __put_user_unaligned __put_user | 518 | #define __put_user_unaligned __put_user |
| 436 | 519 | ||
| 437 | /* | 520 | /* |
| 521 | * {get|put}_user_try and catch | ||
| 522 | * | ||
| 523 | * get_user_try { | ||
| 524 | * get_user_ex(...); | ||
| 525 | * } get_user_catch(err) | ||
| 526 | */ | ||
| 527 | #define get_user_try uaccess_try | ||
| 528 | #define get_user_catch(err) uaccess_catch(err) | ||
| 529 | |||
| 530 | #define get_user_ex(x, ptr) do { \ | ||
| 531 | unsigned long __gue_val; \ | ||
| 532 | __get_user_size_ex((__gue_val), (ptr), (sizeof(*(ptr)))); \ | ||
| 533 | (x) = (__force __typeof__(*(ptr)))__gue_val; \ | ||
| 534 | } while (0) | ||
| 535 | |||
| 536 | #ifdef CONFIG_X86_WP_WORKS_OK | ||
| 537 | |||
| 538 | #define put_user_try uaccess_try | ||
| 539 | #define put_user_catch(err) uaccess_catch(err) | ||
| 540 | |||
| 541 | #define put_user_ex(x, ptr) \ | ||
| 542 | __put_user_size_ex((__typeof__(*(ptr)))(x), (ptr), sizeof(*(ptr))) | ||
| 543 | |||
| 544 | #else /* !CONFIG_X86_WP_WORKS_OK */ | ||
| 545 | |||
| 546 | #define put_user_try do { \ | ||
| 547 | int __uaccess_err = 0; | ||
| 548 | |||
| 549 | #define put_user_catch(err) \ | ||
| 550 | (err) |= __uaccess_err; \ | ||
| 551 | } while (0) | ||
| 552 | |||
| 553 | #define put_user_ex(x, ptr) do { \ | ||
| 554 | __uaccess_err |= __put_user(x, ptr); \ | ||
| 555 | } while (0) | ||
| 556 | |||
| 557 | #endif /* CONFIG_X86_WP_WORKS_OK */ | ||
| 558 | |||
| 559 | /* | ||
| 438 | * movsl can be slow when source and dest are not both 8-byte aligned | 560 | * movsl can be slow when source and dest are not both 8-byte aligned |
| 439 | */ | 561 | */ |
| 440 | #ifdef CONFIG_X86_INTEL_USERCOPY | 562 | #ifdef CONFIG_X86_INTEL_USERCOPY |
diff --git a/arch/x86/include/asm/uv/uv.h b/arch/x86/include/asm/uv/uv.h new file mode 100644 index 000000000000..8242bf965812 --- /dev/null +++ b/arch/x86/include/asm/uv/uv.h | |||
| @@ -0,0 +1,36 @@ | |||
| 1 | #ifndef _ASM_X86_UV_UV_H | ||
| 2 | #define _ASM_X86_UV_UV_H | ||
| 3 | |||
| 4 | enum uv_system_type {UV_NONE, UV_LEGACY_APIC, UV_X2APIC, UV_NON_UNIQUE_APIC}; | ||
| 5 | |||
| 6 | struct cpumask; | ||
| 7 | struct mm_struct; | ||
| 8 | |||
| 9 | #ifdef CONFIG_X86_UV | ||
| 10 | |||
| 11 | extern enum uv_system_type get_uv_system_type(void); | ||
| 12 | extern int is_uv_system(void); | ||
| 13 | extern void uv_cpu_init(void); | ||
| 14 | extern void uv_system_init(void); | ||
| 15 | extern int uv_wakeup_secondary(int phys_apicid, unsigned int start_rip); | ||
| 16 | extern const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, | ||
| 17 | struct mm_struct *mm, | ||
| 18 | unsigned long va, | ||
| 19 | unsigned int cpu); | ||
| 20 | |||
| 21 | #else /* X86_UV */ | ||
| 22 | |||
| 23 | static inline enum uv_system_type get_uv_system_type(void) { return UV_NONE; } | ||
| 24 | static inline int is_uv_system(void) { return 0; } | ||
| 25 | static inline void uv_cpu_init(void) { } | ||
| 26 | static inline void uv_system_init(void) { } | ||
| 27 | static inline int uv_wakeup_secondary(int phys_apicid, unsigned int start_rip) | ||
| 28 | { return 1; } | ||
| 29 | static inline const struct cpumask * | ||
| 30 | uv_flush_tlb_others(const struct cpumask *cpumask, struct mm_struct *mm, | ||
| 31 | unsigned long va, unsigned int cpu) | ||
| 32 | { return cpumask; } | ||
| 33 | |||
| 34 | #endif /* X86_UV */ | ||
| 35 | |||
| 36 | #endif /* _ASM_X86_UV_UV_H */ | ||
diff --git a/arch/x86/include/asm/uv/uv_bau.h b/arch/x86/include/asm/uv/uv_bau.h index 50423c7b56b2..9b0e61bf7a88 100644 --- a/arch/x86/include/asm/uv/uv_bau.h +++ b/arch/x86/include/asm/uv/uv_bau.h | |||
| @@ -325,7 +325,6 @@ static inline void bau_cpubits_clear(struct bau_local_cpumask *dstp, int nbits) | |||
| 325 | #define cpubit_isset(cpu, bau_local_cpumask) \ | 325 | #define cpubit_isset(cpu, bau_local_cpumask) \ |
| 326 | test_bit((cpu), (bau_local_cpumask).bits) | 326 | test_bit((cpu), (bau_local_cpumask).bits) |
| 327 | 327 | ||
| 328 | extern int uv_flush_tlb_others(cpumask_t *, struct mm_struct *, unsigned long); | ||
| 329 | extern void uv_bau_message_intr1(void); | 328 | extern void uv_bau_message_intr1(void); |
| 330 | extern void uv_bau_timeout_intr1(void); | 329 | extern void uv_bau_timeout_intr1(void); |
| 331 | 330 | ||
diff --git a/arch/x86/include/asm/voyager.h b/arch/x86/include/asm/voyager.h index b3e647307625..c1635d43616f 100644 --- a/arch/x86/include/asm/voyager.h +++ b/arch/x86/include/asm/voyager.h | |||
| @@ -527,3 +527,45 @@ extern void voyager_smp_intr_init(void); | |||
| 527 | #define VOYAGER_PSI_SUBREAD 2 | 527 | #define VOYAGER_PSI_SUBREAD 2 |
| 528 | #define VOYAGER_PSI_SUBWRITE 3 | 528 | #define VOYAGER_PSI_SUBWRITE 3 |
| 529 | extern void voyager_cat_psi(__u8, __u16, __u8 *); | 529 | extern void voyager_cat_psi(__u8, __u16, __u8 *); |
| 530 | |||
| 531 | /* These define the CPIs we use in linux */ | ||
| 532 | #define VIC_CPI_LEVEL0 0 | ||
| 533 | #define VIC_CPI_LEVEL1 1 | ||
| 534 | /* now the fake CPIs */ | ||
| 535 | #define VIC_TIMER_CPI 2 | ||
| 536 | #define VIC_INVALIDATE_CPI 3 | ||
| 537 | #define VIC_RESCHEDULE_CPI 4 | ||
| 538 | #define VIC_ENABLE_IRQ_CPI 5 | ||
| 539 | #define VIC_CALL_FUNCTION_CPI 6 | ||
| 540 | #define VIC_CALL_FUNCTION_SINGLE_CPI 7 | ||
| 541 | |||
| 542 | /* Now the QIC CPIs: Since we don't need the two initial levels, | ||
| 543 | * these are 2 less than the VIC CPIs */ | ||
| 544 | #define QIC_CPI_OFFSET 1 | ||
| 545 | #define QIC_TIMER_CPI (VIC_TIMER_CPI - QIC_CPI_OFFSET) | ||
| 546 | #define QIC_INVALIDATE_CPI (VIC_INVALIDATE_CPI - QIC_CPI_OFFSET) | ||
| 547 | #define QIC_RESCHEDULE_CPI (VIC_RESCHEDULE_CPI - QIC_CPI_OFFSET) | ||
| 548 | #define QIC_ENABLE_IRQ_CPI (VIC_ENABLE_IRQ_CPI - QIC_CPI_OFFSET) | ||
| 549 | #define QIC_CALL_FUNCTION_CPI (VIC_CALL_FUNCTION_CPI - QIC_CPI_OFFSET) | ||
| 550 | #define QIC_CALL_FUNCTION_SINGLE_CPI (VIC_CALL_FUNCTION_SINGLE_CPI - QIC_CPI_OFFSET) | ||
| 551 | |||
| 552 | #define VIC_START_FAKE_CPI VIC_TIMER_CPI | ||
| 553 | #define VIC_END_FAKE_CPI VIC_CALL_FUNCTION_SINGLE_CPI | ||
| 554 | |||
| 555 | /* this is the SYS_INT CPI. */ | ||
| 556 | #define VIC_SYS_INT 8 | ||
| 557 | #define VIC_CMN_INT 15 | ||
| 558 | |||
| 559 | /* This is the boot CPI for alternate processors. It gets overwritten | ||
| 560 | * by the above once the system has activated all available processors */ | ||
| 561 | #define VIC_CPU_BOOT_CPI VIC_CPI_LEVEL0 | ||
| 562 | #define VIC_CPU_BOOT_ERRATA_CPI (VIC_CPI_LEVEL0 + 8) | ||
| 563 | |||
| 564 | extern asmlinkage void vic_cpi_interrupt(void); | ||
| 565 | extern asmlinkage void vic_sys_interrupt(void); | ||
| 566 | extern asmlinkage void vic_cmn_interrupt(void); | ||
| 567 | extern asmlinkage void qic_timer_interrupt(void); | ||
| 568 | extern asmlinkage void qic_invalidate_interrupt(void); | ||
| 569 | extern asmlinkage void qic_reschedule_interrupt(void); | ||
| 570 | extern asmlinkage void qic_enable_irq_interrupt(void); | ||
| 571 | extern asmlinkage void qic_call_function_interrupt(void); | ||
diff --git a/arch/x86/include/asm/xen/events.h b/arch/x86/include/asm/xen/events.h index 19144184983a..1df35417c412 100644 --- a/arch/x86/include/asm/xen/events.h +++ b/arch/x86/include/asm/xen/events.h | |||
| @@ -15,10 +15,4 @@ static inline int xen_irqs_disabled(struct pt_regs *regs) | |||
| 15 | return raw_irqs_disabled_flags(regs->flags); | 15 | return raw_irqs_disabled_flags(regs->flags); |
| 16 | } | 16 | } |
| 17 | 17 | ||
| 18 | static inline void xen_do_IRQ(int irq, struct pt_regs *regs) | ||
| 19 | { | ||
| 20 | regs->orig_ax = ~irq; | ||
| 21 | do_IRQ(regs); | ||
| 22 | } | ||
| 23 | |||
| 24 | #endif /* _ASM_X86_XEN_EVENTS_H */ | 18 | #endif /* _ASM_X86_XEN_EVENTS_H */ |
diff --git a/arch/x86/include/asm/xen/hypervisor.h b/arch/x86/include/asm/xen/hypervisor.h index 81fbd735aec4..d5b7e90c0edf 100644 --- a/arch/x86/include/asm/xen/hypervisor.h +++ b/arch/x86/include/asm/xen/hypervisor.h | |||
| @@ -38,22 +38,30 @@ extern struct shared_info *HYPERVISOR_shared_info; | |||
| 38 | extern struct start_info *xen_start_info; | 38 | extern struct start_info *xen_start_info; |
| 39 | 39 | ||
| 40 | enum xen_domain_type { | 40 | enum xen_domain_type { |
| 41 | XEN_NATIVE, | 41 | XEN_NATIVE, /* running on bare hardware */ |
| 42 | XEN_PV_DOMAIN, | 42 | XEN_PV_DOMAIN, /* running in a PV domain */ |
| 43 | XEN_HVM_DOMAIN, | 43 | XEN_HVM_DOMAIN, /* running in a Xen hvm domain */ |
| 44 | }; | 44 | }; |
| 45 | 45 | ||
| 46 | extern enum xen_domain_type xen_domain_type; | ||
| 47 | |||
| 48 | #ifdef CONFIG_XEN | 46 | #ifdef CONFIG_XEN |
| 49 | #define xen_domain() (xen_domain_type != XEN_NATIVE) | 47 | extern enum xen_domain_type xen_domain_type; |
| 50 | #else | 48 | #else |
| 51 | #define xen_domain() (0) | 49 | #define xen_domain_type XEN_NATIVE |
| 52 | #endif | 50 | #endif |
| 53 | 51 | ||
| 54 | #define xen_pv_domain() (xen_domain() && xen_domain_type == XEN_PV_DOMAIN) | 52 | #define xen_domain() (xen_domain_type != XEN_NATIVE) |
| 55 | #define xen_hvm_domain() (xen_domain() && xen_domain_type == XEN_HVM_DOMAIN) | 53 | #define xen_pv_domain() (xen_domain() && \ |
| 54 | xen_domain_type == XEN_PV_DOMAIN) | ||
| 55 | #define xen_hvm_domain() (xen_domain() && \ | ||
| 56 | xen_domain_type == XEN_HVM_DOMAIN) | ||
| 57 | |||
| 58 | #ifdef CONFIG_XEN_DOM0 | ||
| 59 | #include <xen/interface/xen.h> | ||
| 56 | 60 | ||
| 57 | #define xen_initial_domain() (xen_pv_domain() && xen_start_info->flags & SIF_INITDOMAIN) | 61 | #define xen_initial_domain() (xen_pv_domain() && \ |
| 62 | xen_start_info->flags & SIF_INITDOMAIN) | ||
| 63 | #else /* !CONFIG_XEN_DOM0 */ | ||
| 64 | #define xen_initial_domain() (0) | ||
| 65 | #endif /* CONFIG_XEN_DOM0 */ | ||
| 58 | 66 | ||
| 59 | #endif /* _ASM_X86_XEN_HYPERVISOR_H */ | 67 | #endif /* _ASM_X86_XEN_HYPERVISOR_H */ |
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index d364df03c1d6..de5657c039e9 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile | |||
| @@ -23,11 +23,12 @@ nostackp := $(call cc-option, -fno-stack-protector) | |||
| 23 | CFLAGS_vsyscall_64.o := $(PROFILING) -g0 $(nostackp) | 23 | CFLAGS_vsyscall_64.o := $(PROFILING) -g0 $(nostackp) |
| 24 | CFLAGS_hpet.o := $(nostackp) | 24 | CFLAGS_hpet.o := $(nostackp) |
| 25 | CFLAGS_tsc.o := $(nostackp) | 25 | CFLAGS_tsc.o := $(nostackp) |
| 26 | CFLAGS_paravirt.o := $(nostackp) | ||
| 26 | 27 | ||
| 27 | obj-y := process_$(BITS).o signal.o entry_$(BITS).o | 28 | obj-y := process_$(BITS).o signal.o entry_$(BITS).o |
| 28 | obj-y += traps.o irq.o irq_$(BITS).o dumpstack_$(BITS).o | 29 | obj-y += traps.o irq.o irq_$(BITS).o dumpstack_$(BITS).o |
| 29 | obj-y += time_$(BITS).o ioport.o ldt.o dumpstack.o | 30 | obj-y += time_$(BITS).o ioport.o ldt.o dumpstack.o |
| 30 | obj-y += setup.o i8259.o irqinit_$(BITS).o setup_percpu.o | 31 | obj-y += setup.o i8259.o irqinit_$(BITS).o |
| 31 | obj-$(CONFIG_X86_VISWS) += visws_quirks.o | 32 | obj-$(CONFIG_X86_VISWS) += visws_quirks.o |
| 32 | obj-$(CONFIG_X86_32) += probe_roms_32.o | 33 | obj-$(CONFIG_X86_32) += probe_roms_32.o |
| 33 | obj-$(CONFIG_X86_32) += sys_i386_32.o i386_ksyms_32.o | 34 | obj-$(CONFIG_X86_32) += sys_i386_32.o i386_ksyms_32.o |
| @@ -49,30 +50,26 @@ obj-y += step.o | |||
| 49 | obj-$(CONFIG_STACKTRACE) += stacktrace.o | 50 | obj-$(CONFIG_STACKTRACE) += stacktrace.o |
| 50 | obj-y += cpu/ | 51 | obj-y += cpu/ |
| 51 | obj-y += acpi/ | 52 | obj-y += acpi/ |
| 52 | obj-$(CONFIG_X86_BIOS_REBOOT) += reboot.o | 53 | obj-y += reboot.o |
| 53 | obj-$(CONFIG_MCA) += mca_32.o | 54 | obj-$(CONFIG_MCA) += mca_32.o |
| 54 | obj-$(CONFIG_X86_MSR) += msr.o | 55 | obj-$(CONFIG_X86_MSR) += msr.o |
| 55 | obj-$(CONFIG_X86_CPUID) += cpuid.o | 56 | obj-$(CONFIG_X86_CPUID) += cpuid.o |
| 56 | obj-$(CONFIG_PCI) += early-quirks.o | 57 | obj-$(CONFIG_PCI) += early-quirks.o |
| 57 | apm-y := apm_32.o | 58 | apm-y := apm_32.o |
| 58 | obj-$(CONFIG_APM) += apm.o | 59 | obj-$(CONFIG_APM) += apm.o |
| 59 | obj-$(CONFIG_X86_SMP) += smp.o | 60 | obj-$(CONFIG_SMP) += smp.o |
| 60 | obj-$(CONFIG_X86_SMP) += smpboot.o tsc_sync.o ipi.o tlb_$(BITS).o | 61 | obj-$(CONFIG_SMP) += smpboot.o tsc_sync.o |
| 61 | obj-$(CONFIG_X86_32_SMP) += smpcommon.o | 62 | obj-$(CONFIG_SMP) += setup_percpu.o |
| 62 | obj-$(CONFIG_X86_64_SMP) += tsc_sync.o smpcommon.o | 63 | obj-$(CONFIG_X86_64_SMP) += tsc_sync.o |
| 63 | obj-$(CONFIG_X86_TRAMPOLINE) += trampoline_$(BITS).o | 64 | obj-$(CONFIG_X86_TRAMPOLINE) += trampoline_$(BITS).o |
| 64 | obj-$(CONFIG_X86_MPPARSE) += mpparse.o | 65 | obj-$(CONFIG_X86_MPPARSE) += mpparse.o |
| 65 | obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.o | 66 | obj-y += apic/ |
| 66 | obj-$(CONFIG_X86_IO_APIC) += io_apic.o | ||
| 67 | obj-$(CONFIG_X86_REBOOTFIXUPS) += reboot_fixups_32.o | 67 | obj-$(CONFIG_X86_REBOOTFIXUPS) += reboot_fixups_32.o |
| 68 | obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o | 68 | obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o |
| 69 | obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o | 69 | obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o |
| 70 | obj-$(CONFIG_KEXEC) += machine_kexec_$(BITS).o | 70 | obj-$(CONFIG_KEXEC) += machine_kexec_$(BITS).o |
| 71 | obj-$(CONFIG_KEXEC) += relocate_kernel_$(BITS).o crash.o | 71 | obj-$(CONFIG_KEXEC) += relocate_kernel_$(BITS).o crash.o |
| 72 | obj-$(CONFIG_CRASH_DUMP) += crash_dump_$(BITS).o | 72 | obj-$(CONFIG_CRASH_DUMP) += crash_dump_$(BITS).o |
| 73 | obj-$(CONFIG_X86_NUMAQ) += numaq_32.o | ||
| 74 | obj-$(CONFIG_X86_ES7000) += es7000_32.o | ||
| 75 | obj-$(CONFIG_X86_SUMMIT_NUMA) += summit_32.o | ||
| 76 | obj-y += vsmp_64.o | 73 | obj-y += vsmp_64.o |
| 77 | obj-$(CONFIG_KPROBES) += kprobes.o | 74 | obj-$(CONFIG_KPROBES) += kprobes.o |
| 78 | obj-$(CONFIG_MODULES) += module_$(BITS).o | 75 | obj-$(CONFIG_MODULES) += module_$(BITS).o |
| @@ -114,16 +111,13 @@ obj-$(CONFIG_SWIOTLB) += pci-swiotlb_64.o # NB rename without _64 | |||
| 114 | ### | 111 | ### |
| 115 | # 64 bit specific files | 112 | # 64 bit specific files |
| 116 | ifeq ($(CONFIG_X86_64),y) | 113 | ifeq ($(CONFIG_X86_64),y) |
| 117 | obj-y += genapic_64.o genapic_flat_64.o genx2apic_uv_x.o tlb_uv.o | 114 | obj-$(CONFIG_X86_UV) += tlb_uv.o bios_uv.o uv_irq.o uv_sysfs.o |
| 118 | obj-y += bios_uv.o uv_irq.o uv_sysfs.o | 115 | obj-$(CONFIG_X86_PM_TIMER) += pmtimer_64.o |
| 119 | obj-y += genx2apic_cluster.o | 116 | obj-$(CONFIG_AUDIT) += audit_64.o |
| 120 | obj-y += genx2apic_phys.o | 117 | |
| 121 | obj-$(CONFIG_X86_PM_TIMER) += pmtimer_64.o | 118 | obj-$(CONFIG_GART_IOMMU) += pci-gart_64.o aperture_64.o |
| 122 | obj-$(CONFIG_AUDIT) += audit_64.o | 119 | obj-$(CONFIG_CALGARY_IOMMU) += pci-calgary_64.o tce_64.o |
| 123 | 120 | obj-$(CONFIG_AMD_IOMMU) += amd_iommu_init.o amd_iommu.o | |
| 124 | obj-$(CONFIG_GART_IOMMU) += pci-gart_64.o aperture_64.o | 121 | |
| 125 | obj-$(CONFIG_CALGARY_IOMMU) += pci-calgary_64.o tce_64.o | 122 | obj-$(CONFIG_PCI_MMCONFIG) += mmconf-fam10h_64.o |
| 126 | obj-$(CONFIG_AMD_IOMMU) += amd_iommu_init.o amd_iommu.o | ||
| 127 | |||
| 128 | obj-$(CONFIG_PCI_MMCONFIG) += mmconf-fam10h_64.o | ||
| 129 | endif | 123 | endif |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 7678f10c4568..a18eb7ce2236 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -37,15 +37,10 @@ | |||
| 37 | #include <asm/pgtable.h> | 37 | #include <asm/pgtable.h> |
| 38 | #include <asm/io_apic.h> | 38 | #include <asm/io_apic.h> |
| 39 | #include <asm/apic.h> | 39 | #include <asm/apic.h> |
| 40 | #include <asm/genapic.h> | ||
| 41 | #include <asm/io.h> | 40 | #include <asm/io.h> |
| 42 | #include <asm/mpspec.h> | 41 | #include <asm/mpspec.h> |
| 43 | #include <asm/smp.h> | 42 | #include <asm/smp.h> |
| 44 | 43 | ||
| 45 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 46 | # include <mach_apic.h> | ||
| 47 | #endif | ||
| 48 | |||
| 49 | static int __initdata acpi_force = 0; | 44 | static int __initdata acpi_force = 0; |
| 50 | u32 acpi_rsdt_forced; | 45 | u32 acpi_rsdt_forced; |
| 51 | #ifdef CONFIG_ACPI | 46 | #ifdef CONFIG_ACPI |
| @@ -56,16 +51,7 @@ int acpi_disabled = 1; | |||
| 56 | EXPORT_SYMBOL(acpi_disabled); | 51 | EXPORT_SYMBOL(acpi_disabled); |
| 57 | 52 | ||
| 58 | #ifdef CONFIG_X86_64 | 53 | #ifdef CONFIG_X86_64 |
| 59 | 54 | # include <asm/proto.h> | |
| 60 | #include <asm/proto.h> | ||
| 61 | |||
| 62 | #else /* X86 */ | ||
| 63 | |||
| 64 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 65 | #include <mach_apic.h> | ||
| 66 | #include <mach_mpparse.h> | ||
| 67 | #endif /* CONFIG_X86_LOCAL_APIC */ | ||
| 68 | |||
| 69 | #endif /* X86 */ | 55 | #endif /* X86 */ |
| 70 | 56 | ||
| 71 | #define BAD_MADT_ENTRY(entry, end) ( \ | 57 | #define BAD_MADT_ENTRY(entry, end) ( \ |
| @@ -121,35 +107,18 @@ enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_PIC; | |||
| 121 | */ | 107 | */ |
| 122 | char *__init __acpi_map_table(unsigned long phys, unsigned long size) | 108 | char *__init __acpi_map_table(unsigned long phys, unsigned long size) |
| 123 | { | 109 | { |
| 124 | unsigned long base, offset, mapped_size; | ||
| 125 | int idx; | ||
| 126 | 110 | ||
| 127 | if (!phys || !size) | 111 | if (!phys || !size) |
| 128 | return NULL; | 112 | return NULL; |
| 129 | 113 | ||
| 130 | if (phys+size <= (max_low_pfn_mapped << PAGE_SHIFT)) | 114 | return early_ioremap(phys, size); |
| 131 | return __va(phys); | 115 | } |
| 132 | 116 | void __init __acpi_unmap_table(char *map, unsigned long size) | |
| 133 | offset = phys & (PAGE_SIZE - 1); | 117 | { |
| 134 | mapped_size = PAGE_SIZE - offset; | 118 | if (!map || !size) |
| 135 | clear_fixmap(FIX_ACPI_END); | 119 | return; |
| 136 | set_fixmap(FIX_ACPI_END, phys); | ||
| 137 | base = fix_to_virt(FIX_ACPI_END); | ||
| 138 | |||
| 139 | /* | ||
| 140 | * Most cases can be covered by the below. | ||
| 141 | */ | ||
| 142 | idx = FIX_ACPI_END; | ||
| 143 | while (mapped_size < size) { | ||
| 144 | if (--idx < FIX_ACPI_BEGIN) | ||
| 145 | return NULL; /* cannot handle this */ | ||
| 146 | phys += PAGE_SIZE; | ||
| 147 | clear_fixmap(idx); | ||
| 148 | set_fixmap(idx, phys); | ||
| 149 | mapped_size += PAGE_SIZE; | ||
| 150 | } | ||
| 151 | 120 | ||
| 152 | return ((unsigned char *)base + offset); | 121 | early_iounmap(map, size); |
| 153 | } | 122 | } |
| 154 | 123 | ||
| 155 | #ifdef CONFIG_PCI_MMCONFIG | 124 | #ifdef CONFIG_PCI_MMCONFIG |
| @@ -239,7 +208,8 @@ static int __init acpi_parse_madt(struct acpi_table_header *table) | |||
| 239 | madt->address); | 208 | madt->address); |
| 240 | } | 209 | } |
| 241 | 210 | ||
| 242 | acpi_madt_oem_check(madt->header.oem_id, madt->header.oem_table_id); | 211 | default_acpi_madt_oem_check(madt->header.oem_id, |
| 212 | madt->header.oem_table_id); | ||
| 243 | 213 | ||
| 244 | return 0; | 214 | return 0; |
| 245 | } | 215 | } |
| @@ -884,7 +854,7 @@ static struct { | |||
| 884 | DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1); | 854 | DECLARE_BITMAP(pin_programmed, MP_MAX_IOAPIC_PIN + 1); |
| 885 | } mp_ioapic_routing[MAX_IO_APICS]; | 855 | } mp_ioapic_routing[MAX_IO_APICS]; |
| 886 | 856 | ||
| 887 | static int mp_find_ioapic(int gsi) | 857 | int mp_find_ioapic(int gsi) |
| 888 | { | 858 | { |
| 889 | int i = 0; | 859 | int i = 0; |
| 890 | 860 | ||
| @@ -899,6 +869,16 @@ static int mp_find_ioapic(int gsi) | |||
| 899 | return -1; | 869 | return -1; |
| 900 | } | 870 | } |
| 901 | 871 | ||
| 872 | int mp_find_ioapic_pin(int ioapic, int gsi) | ||
| 873 | { | ||
| 874 | if (WARN_ON(ioapic == -1)) | ||
| 875 | return -1; | ||
| 876 | if (WARN_ON(gsi > mp_ioapic_routing[ioapic].gsi_end)) | ||
| 877 | return -1; | ||
| 878 | |||
| 879 | return gsi - mp_ioapic_routing[ioapic].gsi_base; | ||
| 880 | } | ||
| 881 | |||
| 902 | static u8 __init uniq_ioapic_id(u8 id) | 882 | static u8 __init uniq_ioapic_id(u8 id) |
| 903 | { | 883 | { |
| 904 | #ifdef CONFIG_X86_32 | 884 | #ifdef CONFIG_X86_32 |
| @@ -912,8 +892,8 @@ static u8 __init uniq_ioapic_id(u8 id) | |||
| 912 | DECLARE_BITMAP(used, 256); | 892 | DECLARE_BITMAP(used, 256); |
| 913 | bitmap_zero(used, 256); | 893 | bitmap_zero(used, 256); |
| 914 | for (i = 0; i < nr_ioapics; i++) { | 894 | for (i = 0; i < nr_ioapics; i++) { |
| 915 | struct mp_config_ioapic *ia = &mp_ioapics[i]; | 895 | struct mpc_ioapic *ia = &mp_ioapics[i]; |
| 916 | __set_bit(ia->mp_apicid, used); | 896 | __set_bit(ia->apicid, used); |
| 917 | } | 897 | } |
| 918 | if (!test_bit(id, used)) | 898 | if (!test_bit(id, used)) |
| 919 | return id; | 899 | return id; |
| @@ -945,29 +925,29 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base) | |||
| 945 | 925 | ||
| 946 | idx = nr_ioapics; | 926 | idx = nr_ioapics; |
| 947 | 927 | ||
| 948 | mp_ioapics[idx].mp_type = MP_IOAPIC; | 928 | mp_ioapics[idx].type = MP_IOAPIC; |
| 949 | mp_ioapics[idx].mp_flags = MPC_APIC_USABLE; | 929 | mp_ioapics[idx].flags = MPC_APIC_USABLE; |
| 950 | mp_ioapics[idx].mp_apicaddr = address; | 930 | mp_ioapics[idx].apicaddr = address; |
| 951 | 931 | ||
| 952 | set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); | 932 | set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); |
| 953 | mp_ioapics[idx].mp_apicid = uniq_ioapic_id(id); | 933 | mp_ioapics[idx].apicid = uniq_ioapic_id(id); |
| 954 | #ifdef CONFIG_X86_32 | 934 | #ifdef CONFIG_X86_32 |
| 955 | mp_ioapics[idx].mp_apicver = io_apic_get_version(idx); | 935 | mp_ioapics[idx].apicver = io_apic_get_version(idx); |
| 956 | #else | 936 | #else |
| 957 | mp_ioapics[idx].mp_apicver = 0; | 937 | mp_ioapics[idx].apicver = 0; |
| 958 | #endif | 938 | #endif |
| 959 | /* | 939 | /* |
| 960 | * Build basic GSI lookup table to facilitate gsi->io_apic lookups | 940 | * Build basic GSI lookup table to facilitate gsi->io_apic lookups |
| 961 | * and to prevent reprogramming of IOAPIC pins (PCI GSIs). | 941 | * and to prevent reprogramming of IOAPIC pins (PCI GSIs). |
| 962 | */ | 942 | */ |
| 963 | mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].mp_apicid; | 943 | mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].apicid; |
| 964 | mp_ioapic_routing[idx].gsi_base = gsi_base; | 944 | mp_ioapic_routing[idx].gsi_base = gsi_base; |
| 965 | mp_ioapic_routing[idx].gsi_end = gsi_base + | 945 | mp_ioapic_routing[idx].gsi_end = gsi_base + |
| 966 | io_apic_get_redir_entries(idx); | 946 | io_apic_get_redir_entries(idx); |
| 967 | 947 | ||
| 968 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%lx, " | 948 | printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " |
| 969 | "GSI %d-%d\n", idx, mp_ioapics[idx].mp_apicid, | 949 | "GSI %d-%d\n", idx, mp_ioapics[idx].apicid, |
| 970 | mp_ioapics[idx].mp_apicver, mp_ioapics[idx].mp_apicaddr, | 950 | mp_ioapics[idx].apicver, mp_ioapics[idx].apicaddr, |
| 971 | mp_ioapic_routing[idx].gsi_base, mp_ioapic_routing[idx].gsi_end); | 951 | mp_ioapic_routing[idx].gsi_base, mp_ioapic_routing[idx].gsi_end); |
| 972 | 952 | ||
| 973 | nr_ioapics++; | 953 | nr_ioapics++; |
| @@ -996,19 +976,19 @@ int __init acpi_probe_gsi(void) | |||
| 996 | return max_gsi + 1; | 976 | return max_gsi + 1; |
| 997 | } | 977 | } |
| 998 | 978 | ||
| 999 | static void assign_to_mp_irq(struct mp_config_intsrc *m, | 979 | static void assign_to_mp_irq(struct mpc_intsrc *m, |
| 1000 | struct mp_config_intsrc *mp_irq) | 980 | struct mpc_intsrc *mp_irq) |
| 1001 | { | 981 | { |
| 1002 | memcpy(mp_irq, m, sizeof(struct mp_config_intsrc)); | 982 | memcpy(mp_irq, m, sizeof(struct mpc_intsrc)); |
| 1003 | } | 983 | } |
| 1004 | 984 | ||
| 1005 | static int mp_irq_cmp(struct mp_config_intsrc *mp_irq, | 985 | static int mp_irq_cmp(struct mpc_intsrc *mp_irq, |
| 1006 | struct mp_config_intsrc *m) | 986 | struct mpc_intsrc *m) |
| 1007 | { | 987 | { |
| 1008 | return memcmp(mp_irq, m, sizeof(struct mp_config_intsrc)); | 988 | return memcmp(mp_irq, m, sizeof(struct mpc_intsrc)); |
| 1009 | } | 989 | } |
| 1010 | 990 | ||
| 1011 | static void save_mp_irq(struct mp_config_intsrc *m) | 991 | static void save_mp_irq(struct mpc_intsrc *m) |
| 1012 | { | 992 | { |
| 1013 | int i; | 993 | int i; |
| 1014 | 994 | ||
| @@ -1026,7 +1006,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) | |||
| 1026 | { | 1006 | { |
| 1027 | int ioapic; | 1007 | int ioapic; |
| 1028 | int pin; | 1008 | int pin; |
| 1029 | struct mp_config_intsrc mp_irq; | 1009 | struct mpc_intsrc mp_irq; |
| 1030 | 1010 | ||
| 1031 | /* | 1011 | /* |
| 1032 | * Convert 'gsi' to 'ioapic.pin'. | 1012 | * Convert 'gsi' to 'ioapic.pin'. |
| @@ -1034,7 +1014,7 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) | |||
| 1034 | ioapic = mp_find_ioapic(gsi); | 1014 | ioapic = mp_find_ioapic(gsi); |
| 1035 | if (ioapic < 0) | 1015 | if (ioapic < 0) |
| 1036 | return; | 1016 | return; |
| 1037 | pin = gsi - mp_ioapic_routing[ioapic].gsi_base; | 1017 | pin = mp_find_ioapic_pin(ioapic, gsi); |
| 1038 | 1018 | ||
| 1039 | /* | 1019 | /* |
| 1040 | * TBD: This check is for faulty timer entries, where the override | 1020 | * TBD: This check is for faulty timer entries, where the override |
| @@ -1044,13 +1024,13 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) | |||
| 1044 | if ((bus_irq == 0) && (trigger == 3)) | 1024 | if ((bus_irq == 0) && (trigger == 3)) |
| 1045 | trigger = 1; | 1025 | trigger = 1; |
| 1046 | 1026 | ||
| 1047 | mp_irq.mp_type = MP_INTSRC; | 1027 | mp_irq.type = MP_INTSRC; |
| 1048 | mp_irq.mp_irqtype = mp_INT; | 1028 | mp_irq.irqtype = mp_INT; |
| 1049 | mp_irq.mp_irqflag = (trigger << 2) | polarity; | 1029 | mp_irq.irqflag = (trigger << 2) | polarity; |
| 1050 | mp_irq.mp_srcbus = MP_ISA_BUS; | 1030 | mp_irq.srcbus = MP_ISA_BUS; |
| 1051 | mp_irq.mp_srcbusirq = bus_irq; /* IRQ */ | 1031 | mp_irq.srcbusirq = bus_irq; /* IRQ */ |
| 1052 | mp_irq.mp_dstapic = mp_ioapics[ioapic].mp_apicid; /* APIC ID */ | 1032 | mp_irq.dstapic = mp_ioapics[ioapic].apicid; /* APIC ID */ |
| 1053 | mp_irq.mp_dstirq = pin; /* INTIN# */ | 1033 | mp_irq.dstirq = pin; /* INTIN# */ |
| 1054 | 1034 | ||
| 1055 | save_mp_irq(&mp_irq); | 1035 | save_mp_irq(&mp_irq); |
| 1056 | } | 1036 | } |
| @@ -1060,7 +1040,7 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
| 1060 | int i; | 1040 | int i; |
| 1061 | int ioapic; | 1041 | int ioapic; |
| 1062 | unsigned int dstapic; | 1042 | unsigned int dstapic; |
| 1063 | struct mp_config_intsrc mp_irq; | 1043 | struct mpc_intsrc mp_irq; |
| 1064 | 1044 | ||
| 1065 | #if defined (CONFIG_MCA) || defined (CONFIG_EISA) | 1045 | #if defined (CONFIG_MCA) || defined (CONFIG_EISA) |
| 1066 | /* | 1046 | /* |
| @@ -1085,7 +1065,7 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
| 1085 | ioapic = mp_find_ioapic(0); | 1065 | ioapic = mp_find_ioapic(0); |
| 1086 | if (ioapic < 0) | 1066 | if (ioapic < 0) |
| 1087 | return; | 1067 | return; |
| 1088 | dstapic = mp_ioapics[ioapic].mp_apicid; | 1068 | dstapic = mp_ioapics[ioapic].apicid; |
| 1089 | 1069 | ||
| 1090 | /* | 1070 | /* |
| 1091 | * Use the default configuration for the IRQs 0-15. Unless | 1071 | * Use the default configuration for the IRQs 0-15. Unless |
| @@ -1095,16 +1075,14 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
| 1095 | int idx; | 1075 | int idx; |
| 1096 | 1076 | ||
| 1097 | for (idx = 0; idx < mp_irq_entries; idx++) { | 1077 | for (idx = 0; idx < mp_irq_entries; idx++) { |
| 1098 | struct mp_config_intsrc *irq = mp_irqs + idx; | 1078 | struct mpc_intsrc *irq = mp_irqs + idx; |
| 1099 | 1079 | ||
| 1100 | /* Do we already have a mapping for this ISA IRQ? */ | 1080 | /* Do we already have a mapping for this ISA IRQ? */ |
| 1101 | if (irq->mp_srcbus == MP_ISA_BUS | 1081 | if (irq->srcbus == MP_ISA_BUS && irq->srcbusirq == i) |
| 1102 | && irq->mp_srcbusirq == i) | ||
| 1103 | break; | 1082 | break; |
| 1104 | 1083 | ||
| 1105 | /* Do we already have a mapping for this IOAPIC pin */ | 1084 | /* Do we already have a mapping for this IOAPIC pin */ |
| 1106 | if (irq->mp_dstapic == dstapic && | 1085 | if (irq->dstapic == dstapic && irq->dstirq == i) |
| 1107 | irq->mp_dstirq == i) | ||
| 1108 | break; | 1086 | break; |
| 1109 | } | 1087 | } |
| 1110 | 1088 | ||
| @@ -1113,13 +1091,13 @@ void __init mp_config_acpi_legacy_irqs(void) | |||
| 1113 | continue; /* IRQ already used */ | 1091 | continue; /* IRQ already used */ |
| 1114 | } | 1092 | } |
| 1115 | 1093 | ||
| 1116 | mp_irq.mp_type = MP_INTSRC; | 1094 | mp_irq.type = MP_INTSRC; |
| 1117 | mp_irq.mp_irqflag = 0; /* Conforming */ | 1095 | mp_irq.irqflag = 0; /* Conforming */ |
| 1118 | mp_irq.mp_srcbus = MP_ISA_BUS; | 1096 | mp_irq.srcbus = MP_ISA_BUS; |
| 1119 | mp_irq.mp_dstapic = dstapic; | 1097 | mp_irq.dstapic = dstapic; |
| 1120 | mp_irq.mp_irqtype = mp_INT; | 1098 | mp_irq.irqtype = mp_INT; |
| 1121 | mp_irq.mp_srcbusirq = i; /* Identity mapped */ | 1099 | mp_irq.srcbusirq = i; /* Identity mapped */ |
| 1122 | mp_irq.mp_dstirq = i; | 1100 | mp_irq.dstirq = i; |
| 1123 | 1101 | ||
| 1124 | save_mp_irq(&mp_irq); | 1102 | save_mp_irq(&mp_irq); |
| 1125 | } | 1103 | } |
| @@ -1156,7 +1134,7 @@ int mp_register_gsi(u32 gsi, int triggering, int polarity) | |||
| 1156 | return gsi; | 1134 | return gsi; |
| 1157 | } | 1135 | } |
| 1158 | 1136 | ||
| 1159 | ioapic_pin = gsi - mp_ioapic_routing[ioapic].gsi_base; | 1137 | ioapic_pin = mp_find_ioapic_pin(ioapic, gsi); |
| 1160 | 1138 | ||
| 1161 | #ifdef CONFIG_X86_32 | 1139 | #ifdef CONFIG_X86_32 |
| 1162 | if (ioapic_renumber_irq) | 1140 | if (ioapic_renumber_irq) |
| @@ -1230,22 +1208,22 @@ int mp_config_acpi_gsi(unsigned char number, unsigned int devfn, u8 pin, | |||
| 1230 | u32 gsi, int triggering, int polarity) | 1208 | u32 gsi, int triggering, int polarity) |
| 1231 | { | 1209 | { |
| 1232 | #ifdef CONFIG_X86_MPPARSE | 1210 | #ifdef CONFIG_X86_MPPARSE |
| 1233 | struct mp_config_intsrc mp_irq; | 1211 | struct mpc_intsrc mp_irq; |
| 1234 | int ioapic; | 1212 | int ioapic; |
| 1235 | 1213 | ||
| 1236 | if (!acpi_ioapic) | 1214 | if (!acpi_ioapic) |
| 1237 | return 0; | 1215 | return 0; |
| 1238 | 1216 | ||
| 1239 | /* print the entry should happen on mptable identically */ | 1217 | /* print the entry should happen on mptable identically */ |
| 1240 | mp_irq.mp_type = MP_INTSRC; | 1218 | mp_irq.type = MP_INTSRC; |
| 1241 | mp_irq.mp_irqtype = mp_INT; | 1219 | mp_irq.irqtype = mp_INT; |
| 1242 | mp_irq.mp_irqflag = (triggering == ACPI_EDGE_SENSITIVE ? 4 : 0x0c) | | 1220 | mp_irq.irqflag = (triggering == ACPI_EDGE_SENSITIVE ? 4 : 0x0c) | |
| 1243 | (polarity == ACPI_ACTIVE_HIGH ? 1 : 3); | 1221 | (polarity == ACPI_ACTIVE_HIGH ? 1 : 3); |
| 1244 | mp_irq.mp_srcbus = number; | 1222 | mp_irq.srcbus = number; |
| 1245 | mp_irq.mp_srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3); | 1223 | mp_irq.srcbusirq = (((devfn >> 3) & 0x1f) << 2) | ((pin - 1) & 3); |
| 1246 | ioapic = mp_find_ioapic(gsi); | 1224 | ioapic = mp_find_ioapic(gsi); |
| 1247 | mp_irq.mp_dstapic = mp_ioapic_routing[ioapic].apic_id; | 1225 | mp_irq.dstapic = mp_ioapic_routing[ioapic].apic_id; |
| 1248 | mp_irq.mp_dstirq = gsi - mp_ioapic_routing[ioapic].gsi_base; | 1226 | mp_irq.dstirq = mp_find_ioapic_pin(ioapic, gsi); |
| 1249 | 1227 | ||
| 1250 | save_mp_irq(&mp_irq); | 1228 | save_mp_irq(&mp_irq); |
| 1251 | #endif | 1229 | #endif |
| @@ -1372,7 +1350,7 @@ static void __init acpi_process_madt(void) | |||
| 1372 | if (!error) { | 1350 | if (!error) { |
| 1373 | acpi_lapic = 1; | 1351 | acpi_lapic = 1; |
| 1374 | 1352 | ||
| 1375 | #ifdef CONFIG_X86_GENERICARCH | 1353 | #ifdef CONFIG_X86_BIGSMP |
| 1376 | generic_bigsmp_probe(); | 1354 | generic_bigsmp_probe(); |
| 1377 | #endif | 1355 | #endif |
| 1378 | /* | 1356 | /* |
| @@ -1384,9 +1362,8 @@ static void __init acpi_process_madt(void) | |||
| 1384 | acpi_ioapic = 1; | 1362 | acpi_ioapic = 1; |
| 1385 | 1363 | ||
| 1386 | smp_found_config = 1; | 1364 | smp_found_config = 1; |
| 1387 | #ifdef CONFIG_X86_32 | 1365 | if (apic->setup_apic_routing) |
| 1388 | setup_apic_routing(); | 1366 | apic->setup_apic_routing(); |
| 1389 | #endif | ||
| 1390 | } | 1367 | } |
| 1391 | } | 1368 | } |
| 1392 | if (error == -EINVAL) { | 1369 | if (error == -EINVAL) { |
diff --git a/arch/x86/kernel/acpi/realmode/wakeup.S b/arch/x86/kernel/acpi/realmode/wakeup.S index 3355973b12ac..580b4e296010 100644 --- a/arch/x86/kernel/acpi/realmode/wakeup.S +++ b/arch/x86/kernel/acpi/realmode/wakeup.S | |||
| @@ -3,8 +3,8 @@ | |||
| 3 | */ | 3 | */ |
| 4 | #include <asm/segment.h> | 4 | #include <asm/segment.h> |
| 5 | #include <asm/msr-index.h> | 5 | #include <asm/msr-index.h> |
| 6 | #include <asm/page.h> | 6 | #include <asm/page_types.h> |
| 7 | #include <asm/pgtable.h> | 7 | #include <asm/pgtable_types.h> |
| 8 | #include <asm/processor-flags.h> | 8 | #include <asm/processor-flags.h> |
| 9 | 9 | ||
| 10 | .code16 | 10 | .code16 |
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c index a60c1f3bcb87..7c243a2c5115 100644 --- a/arch/x86/kernel/acpi/sleep.c +++ b/arch/x86/kernel/acpi/sleep.c | |||
| @@ -101,6 +101,7 @@ int acpi_save_state_mem(void) | |||
| 101 | stack_start.sp = temp_stack + sizeof(temp_stack); | 101 | stack_start.sp = temp_stack + sizeof(temp_stack); |
| 102 | early_gdt_descr.address = | 102 | early_gdt_descr.address = |
| 103 | (unsigned long)get_cpu_gdt_table(smp_processor_id()); | 103 | (unsigned long)get_cpu_gdt_table(smp_processor_id()); |
| 104 | initial_gs = per_cpu_offset(smp_processor_id()); | ||
| 104 | #endif | 105 | #endif |
| 105 | initial_code = (unsigned long)wakeup_long64; | 106 | initial_code = (unsigned long)wakeup_long64; |
| 106 | saved_magic = 0x123456789abcdef0; | 107 | saved_magic = 0x123456789abcdef0; |
diff --git a/arch/x86/kernel/acpi/wakeup_32.S b/arch/x86/kernel/acpi/wakeup_32.S index a12e6a9fb659..8ded418b0593 100644 --- a/arch/x86/kernel/acpi/wakeup_32.S +++ b/arch/x86/kernel/acpi/wakeup_32.S | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | .section .text.page_aligned | 1 | .section .text.page_aligned |
| 2 | #include <linux/linkage.h> | 2 | #include <linux/linkage.h> |
| 3 | #include <asm/segment.h> | 3 | #include <asm/segment.h> |
| 4 | #include <asm/page.h> | 4 | #include <asm/page_types.h> |
| 5 | 5 | ||
| 6 | # Copyright 2003, 2008 Pavel Machek <pavel@suse.cz>, distribute under GPLv2 | 6 | # Copyright 2003, 2008 Pavel Machek <pavel@suse.cz>, distribute under GPLv2 |
| 7 | 7 | ||
diff --git a/arch/x86/kernel/acpi/wakeup_64.S b/arch/x86/kernel/acpi/wakeup_64.S index bcc293423a70..82add8b804b7 100644 --- a/arch/x86/kernel/acpi/wakeup_64.S +++ b/arch/x86/kernel/acpi/wakeup_64.S | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | .text | 1 | .text |
| 2 | #include <linux/linkage.h> | 2 | #include <linux/linkage.h> |
| 3 | #include <asm/segment.h> | 3 | #include <asm/segment.h> |
| 4 | #include <asm/pgtable.h> | 4 | #include <asm/pgtable_types.h> |
| 5 | #include <asm/page.h> | 5 | #include <asm/page_types.h> |
| 6 | #include <asm/msr.h> | 6 | #include <asm/msr.h> |
| 7 | #include <asm/asm-offsets.h> | 7 | #include <asm/asm-offsets.h> |
| 8 | 8 | ||
diff --git a/arch/x86/kernel/apic/Makefile b/arch/x86/kernel/apic/Makefile new file mode 100644 index 000000000000..da7b7b9f8bd8 --- /dev/null +++ b/arch/x86/kernel/apic/Makefile | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | # | ||
| 2 | # Makefile for local APIC drivers and for the IO-APIC code | ||
| 3 | # | ||
| 4 | |||
| 5 | obj-$(CONFIG_X86_LOCAL_APIC) += apic.o probe_$(BITS).o ipi.o nmi.o | ||
| 6 | obj-$(CONFIG_X86_IO_APIC) += io_apic.o | ||
| 7 | obj-$(CONFIG_SMP) += ipi.o | ||
| 8 | |||
| 9 | ifeq ($(CONFIG_X86_64),y) | ||
| 10 | obj-y += apic_flat_64.o | ||
| 11 | obj-$(CONFIG_X86_X2APIC) += x2apic_cluster.o | ||
| 12 | obj-$(CONFIG_X86_X2APIC) += x2apic_phys.o | ||
| 13 | obj-$(CONFIG_X86_UV) += x2apic_uv_x.o | ||
| 14 | endif | ||
| 15 | |||
| 16 | obj-$(CONFIG_X86_BIGSMP) += bigsmp_32.o | ||
| 17 | obj-$(CONFIG_X86_NUMAQ) += numaq_32.o | ||
| 18 | obj-$(CONFIG_X86_ES7000) += es7000_32.o | ||
| 19 | obj-$(CONFIG_X86_SUMMIT) += summit_32.o | ||
diff --git a/arch/x86/kernel/apic.c b/arch/x86/kernel/apic/apic.c index 570f36e44e59..160b3ab11e7a 100644 --- a/arch/x86/kernel/apic.c +++ b/arch/x86/kernel/apic/apic.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Local APIC handling, local APIC timers | 2 | * Local APIC handling, local APIC timers |
| 3 | * | 3 | * |
| 4 | * (c) 1999, 2000 Ingo Molnar <mingo@redhat.com> | 4 | * (c) 1999, 2000, 2009 Ingo Molnar <mingo@redhat.com> |
| 5 | * | 5 | * |
| 6 | * Fixes | 6 | * Fixes |
| 7 | * Maciej W. Rozycki : Bits for genuine 82489DX APICs; | 7 | * Maciej W. Rozycki : Bits for genuine 82489DX APICs; |
| @@ -14,51 +14,70 @@ | |||
| 14 | * Mikael Pettersson : PM converted to driver model. | 14 | * Mikael Pettersson : PM converted to driver model. |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | #include <linux/init.h> | ||
| 18 | |||
| 19 | #include <linux/mm.h> | ||
| 20 | #include <linux/delay.h> | ||
| 21 | #include <linux/bootmem.h> | ||
| 22 | #include <linux/interrupt.h> | ||
| 23 | #include <linux/mc146818rtc.h> | ||
| 24 | #include <linux/kernel_stat.h> | 17 | #include <linux/kernel_stat.h> |
| 25 | #include <linux/sysdev.h> | 18 | #include <linux/mc146818rtc.h> |
| 26 | #include <linux/ioport.h> | ||
| 27 | #include <linux/cpu.h> | ||
| 28 | #include <linux/clockchips.h> | ||
| 29 | #include <linux/acpi_pmtmr.h> | 19 | #include <linux/acpi_pmtmr.h> |
| 20 | #include <linux/clockchips.h> | ||
| 21 | #include <linux/interrupt.h> | ||
| 22 | #include <linux/bootmem.h> | ||
| 23 | #include <linux/ftrace.h> | ||
| 24 | #include <linux/ioport.h> | ||
| 30 | #include <linux/module.h> | 25 | #include <linux/module.h> |
| 31 | #include <linux/dmi.h> | 26 | #include <linux/sysdev.h> |
| 27 | #include <linux/delay.h> | ||
| 28 | #include <linux/timex.h> | ||
| 32 | #include <linux/dmar.h> | 29 | #include <linux/dmar.h> |
| 33 | #include <linux/ftrace.h> | 30 | #include <linux/init.h> |
| 34 | #include <linux/smp.h> | 31 | #include <linux/cpu.h> |
| 32 | #include <linux/dmi.h> | ||
| 35 | #include <linux/nmi.h> | 33 | #include <linux/nmi.h> |
| 36 | #include <linux/timex.h> | 34 | #include <linux/smp.h> |
| 35 | #include <linux/mm.h> | ||
| 37 | 36 | ||
| 38 | #include <asm/atomic.h> | ||
| 39 | #include <asm/mtrr.h> | ||
| 40 | #include <asm/mpspec.h> | ||
| 41 | #include <asm/desc.h> | ||
| 42 | #include <asm/arch_hooks.h> | 37 | #include <asm/arch_hooks.h> |
| 43 | #include <asm/hpet.h> | ||
| 44 | #include <asm/pgalloc.h> | 38 | #include <asm/pgalloc.h> |
| 39 | #include <asm/atomic.h> | ||
| 40 | #include <asm/mpspec.h> | ||
| 45 | #include <asm/i8253.h> | 41 | #include <asm/i8253.h> |
| 46 | #include <asm/idle.h> | 42 | #include <asm/i8259.h> |
| 47 | #include <asm/proto.h> | 43 | #include <asm/proto.h> |
| 48 | #include <asm/apic.h> | 44 | #include <asm/apic.h> |
| 49 | #include <asm/i8259.h> | 45 | #include <asm/desc.h> |
| 46 | #include <asm/hpet.h> | ||
| 47 | #include <asm/idle.h> | ||
| 48 | #include <asm/mtrr.h> | ||
| 50 | #include <asm/smp.h> | 49 | #include <asm/smp.h> |
| 51 | 50 | ||
| 52 | #include <mach_apic.h> | 51 | unsigned int num_processors; |
| 53 | #include <mach_apicdef.h> | 52 | |
| 54 | #include <mach_ipi.h> | 53 | unsigned disabled_cpus __cpuinitdata; |
| 54 | |||
| 55 | /* Processor that is doing the boot up */ | ||
| 56 | unsigned int boot_cpu_physical_apicid = -1U; | ||
| 55 | 57 | ||
| 56 | /* | 58 | /* |
| 57 | * Sanity check | 59 | * The highest APIC ID seen during enumeration. |
| 60 | * | ||
| 61 | * This determines the messaging protocol we can use: if all APIC IDs | ||
| 62 | * are in the 0 ... 7 range, then we can use logical addressing which | ||
| 63 | * has some performance advantages (better broadcasting). | ||
| 64 | * | ||
| 65 | * If there's an APIC ID above 8, we use physical addressing. | ||
| 58 | */ | 66 | */ |
| 59 | #if ((SPURIOUS_APIC_VECTOR & 0x0F) != 0x0F) | 67 | unsigned int max_physical_apicid; |
| 60 | # error SPURIOUS_APIC_VECTOR definition error | 68 | |
| 61 | #endif | 69 | /* |
| 70 | * Bitmask of physically existing CPUs: | ||
| 71 | */ | ||
| 72 | physid_mask_t phys_cpu_present_map; | ||
| 73 | |||
| 74 | /* | ||
| 75 | * Map cpu index to physical APIC ID | ||
| 76 | */ | ||
| 77 | DEFINE_EARLY_PER_CPU(u16, x86_cpu_to_apicid, BAD_APICID); | ||
| 78 | DEFINE_EARLY_PER_CPU(u16, x86_bios_cpu_apicid, BAD_APICID); | ||
| 79 | EXPORT_EARLY_PER_CPU_SYMBOL(x86_cpu_to_apicid); | ||
| 80 | EXPORT_EARLY_PER_CPU_SYMBOL(x86_bios_cpu_apicid); | ||
| 62 | 81 | ||
| 63 | #ifdef CONFIG_X86_32 | 82 | #ifdef CONFIG_X86_32 |
| 64 | /* | 83 | /* |
| @@ -92,11 +111,7 @@ static __init int setup_apicpmtimer(char *s) | |||
| 92 | __setup("apicpmtimer", setup_apicpmtimer); | 111 | __setup("apicpmtimer", setup_apicpmtimer); |
| 93 | #endif | 112 | #endif |
| 94 | 113 | ||
| 95 | #ifdef CONFIG_X86_64 | 114 | #ifdef CONFIG_X86_X2APIC |
| 96 | #define HAVE_X2APIC | ||
| 97 | #endif | ||
| 98 | |||
| 99 | #ifdef HAVE_X2APIC | ||
| 100 | int x2apic; | 115 | int x2apic; |
| 101 | /* x2apic enabled before OS handover */ | 116 | /* x2apic enabled before OS handover */ |
| 102 | static int x2apic_preenabled; | 117 | static int x2apic_preenabled; |
| @@ -194,18 +209,13 @@ static int modern_apic(void) | |||
| 194 | return lapic_get_version() >= 0x14; | 209 | return lapic_get_version() >= 0x14; |
| 195 | } | 210 | } |
| 196 | 211 | ||
| 197 | /* | 212 | void native_apic_wait_icr_idle(void) |
| 198 | * Paravirt kernels also might be using these below ops. So we still | ||
| 199 | * use generic apic_read()/apic_write(), which might be pointing to different | ||
| 200 | * ops in PARAVIRT case. | ||
| 201 | */ | ||
| 202 | void xapic_wait_icr_idle(void) | ||
| 203 | { | 213 | { |
| 204 | while (apic_read(APIC_ICR) & APIC_ICR_BUSY) | 214 | while (apic_read(APIC_ICR) & APIC_ICR_BUSY) |
| 205 | cpu_relax(); | 215 | cpu_relax(); |
| 206 | } | 216 | } |
| 207 | 217 | ||
| 208 | u32 safe_xapic_wait_icr_idle(void) | 218 | u32 native_safe_apic_wait_icr_idle(void) |
| 209 | { | 219 | { |
| 210 | u32 send_status; | 220 | u32 send_status; |
| 211 | int timeout; | 221 | int timeout; |
| @@ -221,13 +231,13 @@ u32 safe_xapic_wait_icr_idle(void) | |||
| 221 | return send_status; | 231 | return send_status; |
| 222 | } | 232 | } |
| 223 | 233 | ||
| 224 | void xapic_icr_write(u32 low, u32 id) | 234 | void native_apic_icr_write(u32 low, u32 id) |
| 225 | { | 235 | { |
| 226 | apic_write(APIC_ICR2, SET_APIC_DEST_FIELD(id)); | 236 | apic_write(APIC_ICR2, SET_APIC_DEST_FIELD(id)); |
| 227 | apic_write(APIC_ICR, low); | 237 | apic_write(APIC_ICR, low); |
| 228 | } | 238 | } |
| 229 | 239 | ||
| 230 | static u64 xapic_icr_read(void) | 240 | u64 native_apic_icr_read(void) |
| 231 | { | 241 | { |
| 232 | u32 icr1, icr2; | 242 | u32 icr1, icr2; |
| 233 | 243 | ||
| @@ -237,54 +247,6 @@ static u64 xapic_icr_read(void) | |||
| 237 | return icr1 | ((u64)icr2 << 32); | 247 | return icr1 | ((u64)icr2 << 32); |
| 238 | } | 248 | } |
| 239 | 249 | ||
| 240 | static struct apic_ops xapic_ops = { | ||
| 241 | .read = native_apic_mem_read, | ||
| 242 | .write = native_apic_mem_write, | ||
| 243 | .icr_read = xapic_icr_read, | ||
| 244 | .icr_write = xapic_icr_write, | ||
| 245 | .wait_icr_idle = xapic_wait_icr_idle, | ||
| 246 | .safe_wait_icr_idle = safe_xapic_wait_icr_idle, | ||
| 247 | }; | ||
| 248 | |||
| 249 | struct apic_ops __read_mostly *apic_ops = &xapic_ops; | ||
| 250 | EXPORT_SYMBOL_GPL(apic_ops); | ||
| 251 | |||
| 252 | #ifdef HAVE_X2APIC | ||
| 253 | static void x2apic_wait_icr_idle(void) | ||
| 254 | { | ||
| 255 | /* no need to wait for icr idle in x2apic */ | ||
| 256 | return; | ||
| 257 | } | ||
| 258 | |||
| 259 | static u32 safe_x2apic_wait_icr_idle(void) | ||
| 260 | { | ||
| 261 | /* no need to wait for icr idle in x2apic */ | ||
| 262 | return 0; | ||
| 263 | } | ||
| 264 | |||
| 265 | void x2apic_icr_write(u32 low, u32 id) | ||
| 266 | { | ||
| 267 | wrmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), ((__u64) id) << 32 | low); | ||
| 268 | } | ||
| 269 | |||
| 270 | static u64 x2apic_icr_read(void) | ||
| 271 | { | ||
| 272 | unsigned long val; | ||
| 273 | |||
| 274 | rdmsrl(APIC_BASE_MSR + (APIC_ICR >> 4), val); | ||
| 275 | return val; | ||
| 276 | } | ||
| 277 | |||
| 278 | static struct apic_ops x2apic_ops = { | ||
| 279 | .read = native_apic_msr_read, | ||
| 280 | .write = native_apic_msr_write, | ||
| 281 | .icr_read = x2apic_icr_read, | ||
| 282 | .icr_write = x2apic_icr_write, | ||
| 283 | .wait_icr_idle = x2apic_wait_icr_idle, | ||
| 284 | .safe_wait_icr_idle = safe_x2apic_wait_icr_idle, | ||
| 285 | }; | ||
| 286 | #endif | ||
| 287 | |||
| 288 | /** | 250 | /** |
| 289 | * enable_NMI_through_LVT0 - enable NMI through local vector table 0 | 251 | * enable_NMI_through_LVT0 - enable NMI through local vector table 0 |
| 290 | */ | 252 | */ |
| @@ -457,7 +419,7 @@ static void lapic_timer_setup(enum clock_event_mode mode, | |||
| 457 | static void lapic_timer_broadcast(const struct cpumask *mask) | 419 | static void lapic_timer_broadcast(const struct cpumask *mask) |
| 458 | { | 420 | { |
| 459 | #ifdef CONFIG_SMP | 421 | #ifdef CONFIG_SMP |
| 460 | send_IPI_mask(mask, LOCAL_TIMER_VECTOR); | 422 | apic->send_IPI_mask(mask, LOCAL_TIMER_VECTOR); |
| 461 | #endif | 423 | #endif |
| 462 | } | 424 | } |
| 463 | 425 | ||
| @@ -535,7 +497,8 @@ static void __init lapic_cal_handler(struct clock_event_device *dev) | |||
| 535 | } | 497 | } |
| 536 | } | 498 | } |
| 537 | 499 | ||
| 538 | static int __init calibrate_by_pmtimer(long deltapm, long *delta) | 500 | static int __init |
| 501 | calibrate_by_pmtimer(long deltapm, long *delta, long *deltatsc) | ||
| 539 | { | 502 | { |
| 540 | const long pm_100ms = PMTMR_TICKS_PER_SEC / 10; | 503 | const long pm_100ms = PMTMR_TICKS_PER_SEC / 10; |
| 541 | const long pm_thresh = pm_100ms / 100; | 504 | const long pm_thresh = pm_100ms / 100; |
| @@ -546,7 +509,7 @@ static int __init calibrate_by_pmtimer(long deltapm, long *delta) | |||
| 546 | return -1; | 509 | return -1; |
| 547 | #endif | 510 | #endif |
| 548 | 511 | ||
| 549 | apic_printk(APIC_VERBOSE, "... PM timer delta = %ld\n", deltapm); | 512 | apic_printk(APIC_VERBOSE, "... PM-Timer delta = %ld\n", deltapm); |
| 550 | 513 | ||
| 551 | /* Check, if the PM timer is available */ | 514 | /* Check, if the PM timer is available */ |
| 552 | if (!deltapm) | 515 | if (!deltapm) |
| @@ -556,19 +519,30 @@ static int __init calibrate_by_pmtimer(long deltapm, long *delta) | |||
| 556 | 519 | ||
| 557 | if (deltapm > (pm_100ms - pm_thresh) && | 520 | if (deltapm > (pm_100ms - pm_thresh) && |
| 558 | deltapm < (pm_100ms + pm_thresh)) { | 521 | deltapm < (pm_100ms + pm_thresh)) { |
| 559 | apic_printk(APIC_VERBOSE, "... PM timer result ok\n"); | 522 | apic_printk(APIC_VERBOSE, "... PM-Timer result ok\n"); |
| 560 | } else { | 523 | return 0; |
| 561 | res = (((u64)deltapm) * mult) >> 22; | 524 | } |
| 562 | do_div(res, 1000000); | 525 | |
| 563 | pr_warning("APIC calibration not consistent " | 526 | res = (((u64)deltapm) * mult) >> 22; |
| 564 | "with PM Timer: %ldms instead of 100ms\n", | 527 | do_div(res, 1000000); |
| 565 | (long)res); | 528 | pr_warning("APIC calibration not consistent " |
| 566 | /* Correct the lapic counter value */ | 529 | "with PM-Timer: %ldms instead of 100ms\n",(long)res); |
| 567 | res = (((u64)(*delta)) * pm_100ms); | 530 | |
| 531 | /* Correct the lapic counter value */ | ||
| 532 | res = (((u64)(*delta)) * pm_100ms); | ||
| 533 | do_div(res, deltapm); | ||
| 534 | pr_info("APIC delta adjusted to PM-Timer: " | ||
| 535 | "%lu (%ld)\n", (unsigned long)res, *delta); | ||
| 536 | *delta = (long)res; | ||
| 537 | |||
| 538 | /* Correct the tsc counter value */ | ||
| 539 | if (cpu_has_tsc) { | ||
| 540 | res = (((u64)(*deltatsc)) * pm_100ms); | ||
| 568 | do_div(res, deltapm); | 541 | do_div(res, deltapm); |
| 569 | pr_info("APIC delta adjusted to PM-Timer: " | 542 | apic_printk(APIC_VERBOSE, "TSC delta adjusted to " |
| 570 | "%lu (%ld)\n", (unsigned long)res, *delta); | 543 | "PM-Timer: %lu (%ld) \n", |
| 571 | *delta = (long)res; | 544 | (unsigned long)res, *deltatsc); |
| 545 | *deltatsc = (long)res; | ||
| 572 | } | 546 | } |
| 573 | 547 | ||
| 574 | return 0; | 548 | return 0; |
| @@ -579,7 +553,7 @@ static int __init calibrate_APIC_clock(void) | |||
| 579 | struct clock_event_device *levt = &__get_cpu_var(lapic_events); | 553 | struct clock_event_device *levt = &__get_cpu_var(lapic_events); |
| 580 | void (*real_handler)(struct clock_event_device *dev); | 554 | void (*real_handler)(struct clock_event_device *dev); |
| 581 | unsigned long deltaj; | 555 | unsigned long deltaj; |
| 582 | long delta; | 556 | long delta, deltatsc; |
| 583 | int pm_referenced = 0; | 557 | int pm_referenced = 0; |
| 584 | 558 | ||
| 585 | local_irq_disable(); | 559 | local_irq_disable(); |
| @@ -609,9 +583,11 @@ static int __init calibrate_APIC_clock(void) | |||
| 609 | delta = lapic_cal_t1 - lapic_cal_t2; | 583 | delta = lapic_cal_t1 - lapic_cal_t2; |
| 610 | apic_printk(APIC_VERBOSE, "... lapic delta = %ld\n", delta); | 584 | apic_printk(APIC_VERBOSE, "... lapic delta = %ld\n", delta); |
| 611 | 585 | ||
| 586 | deltatsc = (long)(lapic_cal_tsc2 - lapic_cal_tsc1); | ||
| 587 | |||
| 612 | /* we trust the PM based calibration if possible */ | 588 | /* we trust the PM based calibration if possible */ |
| 613 | pm_referenced = !calibrate_by_pmtimer(lapic_cal_pm2 - lapic_cal_pm1, | 589 | pm_referenced = !calibrate_by_pmtimer(lapic_cal_pm2 - lapic_cal_pm1, |
| 614 | &delta); | 590 | &delta, &deltatsc); |
| 615 | 591 | ||
| 616 | /* Calculate the scaled math multiplication factor */ | 592 | /* Calculate the scaled math multiplication factor */ |
| 617 | lapic_clockevent.mult = div_sc(delta, TICK_NSEC * LAPIC_CAL_LOOPS, | 593 | lapic_clockevent.mult = div_sc(delta, TICK_NSEC * LAPIC_CAL_LOOPS, |
| @@ -629,11 +605,10 @@ static int __init calibrate_APIC_clock(void) | |||
| 629 | calibration_result); | 605 | calibration_result); |
| 630 | 606 | ||
| 631 | if (cpu_has_tsc) { | 607 | if (cpu_has_tsc) { |
| 632 | delta = (long)(lapic_cal_tsc2 - lapic_cal_tsc1); | ||
| 633 | apic_printk(APIC_VERBOSE, "..... CPU clock speed is " | 608 | apic_printk(APIC_VERBOSE, "..... CPU clock speed is " |
| 634 | "%ld.%04ld MHz.\n", | 609 | "%ld.%04ld MHz.\n", |
| 635 | (delta / LAPIC_CAL_LOOPS) / (1000000 / HZ), | 610 | (deltatsc / LAPIC_CAL_LOOPS) / (1000000 / HZ), |
| 636 | (delta / LAPIC_CAL_LOOPS) % (1000000 / HZ)); | 611 | (deltatsc / LAPIC_CAL_LOOPS) % (1000000 / HZ)); |
| 637 | } | 612 | } |
| 638 | 613 | ||
| 639 | apic_printk(APIC_VERBOSE, "..... host bus clock speed is " | 614 | apic_printk(APIC_VERBOSE, "..... host bus clock speed is " |
| @@ -991,11 +966,11 @@ int __init verify_local_APIC(void) | |||
| 991 | */ | 966 | */ |
| 992 | reg0 = apic_read(APIC_ID); | 967 | reg0 = apic_read(APIC_ID); |
| 993 | apic_printk(APIC_DEBUG, "Getting ID: %x\n", reg0); | 968 | apic_printk(APIC_DEBUG, "Getting ID: %x\n", reg0); |
| 994 | apic_write(APIC_ID, reg0 ^ APIC_ID_MASK); | 969 | apic_write(APIC_ID, reg0 ^ apic->apic_id_mask); |
| 995 | reg1 = apic_read(APIC_ID); | 970 | reg1 = apic_read(APIC_ID); |
| 996 | apic_printk(APIC_DEBUG, "Getting ID: %x\n", reg1); | 971 | apic_printk(APIC_DEBUG, "Getting ID: %x\n", reg1); |
| 997 | apic_write(APIC_ID, reg0); | 972 | apic_write(APIC_ID, reg0); |
| 998 | if (reg1 != (reg0 ^ APIC_ID_MASK)) | 973 | if (reg1 != (reg0 ^ apic->apic_id_mask)) |
| 999 | return 0; | 974 | return 0; |
| 1000 | 975 | ||
| 1001 | /* | 976 | /* |
| @@ -1089,7 +1064,7 @@ static void __cpuinit lapic_setup_esr(void) | |||
| 1089 | return; | 1064 | return; |
| 1090 | } | 1065 | } |
| 1091 | 1066 | ||
| 1092 | if (esr_disable) { | 1067 | if (apic->disable_esr) { |
| 1093 | /* | 1068 | /* |
| 1094 | * Something untraceable is creating bad interrupts on | 1069 | * Something untraceable is creating bad interrupts on |
| 1095 | * secondary quads ... for the moment, just leave the | 1070 | * secondary quads ... for the moment, just leave the |
| @@ -1130,9 +1105,14 @@ void __cpuinit setup_local_APIC(void) | |||
| 1130 | unsigned int value; | 1105 | unsigned int value; |
| 1131 | int i, j; | 1106 | int i, j; |
| 1132 | 1107 | ||
| 1108 | if (disable_apic) { | ||
| 1109 | arch_disable_smp_support(); | ||
| 1110 | return; | ||
| 1111 | } | ||
| 1112 | |||
| 1133 | #ifdef CONFIG_X86_32 | 1113 | #ifdef CONFIG_X86_32 |
| 1134 | /* Pound the ESR really hard over the head with a big hammer - mbligh */ | 1114 | /* Pound the ESR really hard over the head with a big hammer - mbligh */ |
| 1135 | if (lapic_is_integrated() && esr_disable) { | 1115 | if (lapic_is_integrated() && apic->disable_esr) { |
| 1136 | apic_write(APIC_ESR, 0); | 1116 | apic_write(APIC_ESR, 0); |
| 1137 | apic_write(APIC_ESR, 0); | 1117 | apic_write(APIC_ESR, 0); |
| 1138 | apic_write(APIC_ESR, 0); | 1118 | apic_write(APIC_ESR, 0); |
| @@ -1146,7 +1126,7 @@ void __cpuinit setup_local_APIC(void) | |||
| 1146 | * Double-check whether this APIC is really registered. | 1126 | * Double-check whether this APIC is really registered. |
| 1147 | * This is meaningless in clustered apic mode, so we skip it. | 1127 | * This is meaningless in clustered apic mode, so we skip it. |
| 1148 | */ | 1128 | */ |
| 1149 | if (!apic_id_registered()) | 1129 | if (!apic->apic_id_registered()) |
| 1150 | BUG(); | 1130 | BUG(); |
| 1151 | 1131 | ||
| 1152 | /* | 1132 | /* |
| @@ -1154,7 +1134,7 @@ void __cpuinit setup_local_APIC(void) | |||
| 1154 | * an APIC. See e.g. "AP-388 82489DX User's Manual" (Intel | 1134 | * an APIC. See e.g. "AP-388 82489DX User's Manual" (Intel |
| 1155 | * document number 292116). So here it goes... | 1135 | * document number 292116). So here it goes... |
| 1156 | */ | 1136 | */ |
| 1157 | init_apic_ldr(); | 1137 | apic->init_apic_ldr(); |
| 1158 | 1138 | ||
| 1159 | /* | 1139 | /* |
| 1160 | * Set Task Priority to 'accept all'. We never change this | 1140 | * Set Task Priority to 'accept all'. We never change this |
| @@ -1282,17 +1262,19 @@ void __cpuinit end_local_APIC_setup(void) | |||
| 1282 | apic_pm_activate(); | 1262 | apic_pm_activate(); |
| 1283 | } | 1263 | } |
| 1284 | 1264 | ||
| 1285 | #ifdef HAVE_X2APIC | 1265 | #ifdef CONFIG_X86_X2APIC |
| 1286 | void check_x2apic(void) | 1266 | void check_x2apic(void) |
| 1287 | { | 1267 | { |
| 1288 | int msr, msr2; | 1268 | int msr, msr2; |
| 1289 | 1269 | ||
| 1270 | if (!cpu_has_x2apic) | ||
| 1271 | return; | ||
| 1272 | |||
| 1290 | rdmsr(MSR_IA32_APICBASE, msr, msr2); | 1273 | rdmsr(MSR_IA32_APICBASE, msr, msr2); |
| 1291 | 1274 | ||
| 1292 | if (msr & X2APIC_ENABLE) { | 1275 | if (msr & X2APIC_ENABLE) { |
| 1293 | pr_info("x2apic enabled by BIOS, switching to x2apic ops\n"); | 1276 | pr_info("x2apic enabled by BIOS, switching to x2apic ops\n"); |
| 1294 | x2apic_preenabled = x2apic = 1; | 1277 | x2apic_preenabled = x2apic = 1; |
| 1295 | apic_ops = &x2apic_ops; | ||
| 1296 | } | 1278 | } |
| 1297 | } | 1279 | } |
| 1298 | 1280 | ||
| @@ -1300,6 +1282,9 @@ void enable_x2apic(void) | |||
| 1300 | { | 1282 | { |
| 1301 | int msr, msr2; | 1283 | int msr, msr2; |
| 1302 | 1284 | ||
| 1285 | if (!x2apic) | ||
| 1286 | return; | ||
| 1287 | |||
| 1303 | rdmsr(MSR_IA32_APICBASE, msr, msr2); | 1288 | rdmsr(MSR_IA32_APICBASE, msr, msr2); |
| 1304 | if (!(msr & X2APIC_ENABLE)) { | 1289 | if (!(msr & X2APIC_ENABLE)) { |
| 1305 | pr_info("Enabling x2apic\n"); | 1290 | pr_info("Enabling x2apic\n"); |
| @@ -1363,7 +1348,6 @@ void __init enable_IR_x2apic(void) | |||
| 1363 | 1348 | ||
| 1364 | if (!x2apic) { | 1349 | if (!x2apic) { |
| 1365 | x2apic = 1; | 1350 | x2apic = 1; |
| 1366 | apic_ops = &x2apic_ops; | ||
| 1367 | enable_x2apic(); | 1351 | enable_x2apic(); |
| 1368 | } | 1352 | } |
| 1369 | 1353 | ||
| @@ -1401,7 +1385,7 @@ end: | |||
| 1401 | 1385 | ||
| 1402 | return; | 1386 | return; |
| 1403 | } | 1387 | } |
| 1404 | #endif /* HAVE_X2APIC */ | 1388 | #endif /* CONFIG_X86_X2APIC */ |
| 1405 | 1389 | ||
| 1406 | #ifdef CONFIG_X86_64 | 1390 | #ifdef CONFIG_X86_64 |
| 1407 | /* | 1391 | /* |
| @@ -1532,7 +1516,7 @@ void __init early_init_lapic_mapping(void) | |||
| 1532 | */ | 1516 | */ |
| 1533 | void __init init_apic_mappings(void) | 1517 | void __init init_apic_mappings(void) |
| 1534 | { | 1518 | { |
| 1535 | #ifdef HAVE_X2APIC | 1519 | #ifdef CONFIG_X86_X2APIC |
| 1536 | if (x2apic) { | 1520 | if (x2apic) { |
| 1537 | boot_cpu_physical_apicid = read_apic_id(); | 1521 | boot_cpu_physical_apicid = read_apic_id(); |
| 1538 | return; | 1522 | return; |
| @@ -1570,11 +1554,11 @@ int apic_version[MAX_APICS]; | |||
| 1570 | 1554 | ||
| 1571 | int __init APIC_init_uniprocessor(void) | 1555 | int __init APIC_init_uniprocessor(void) |
| 1572 | { | 1556 | { |
| 1573 | #ifdef CONFIG_X86_64 | ||
| 1574 | if (disable_apic) { | 1557 | if (disable_apic) { |
| 1575 | pr_info("Apic disabled\n"); | 1558 | pr_info("Apic disabled\n"); |
| 1576 | return -1; | 1559 | return -1; |
| 1577 | } | 1560 | } |
| 1561 | #ifdef CONFIG_X86_64 | ||
| 1578 | if (!cpu_has_apic) { | 1562 | if (!cpu_has_apic) { |
| 1579 | disable_apic = 1; | 1563 | disable_apic = 1; |
| 1580 | pr_info("Apic disabled by BIOS\n"); | 1564 | pr_info("Apic disabled by BIOS\n"); |
| @@ -1596,11 +1580,9 @@ int __init APIC_init_uniprocessor(void) | |||
| 1596 | } | 1580 | } |
| 1597 | #endif | 1581 | #endif |
| 1598 | 1582 | ||
| 1599 | #ifdef HAVE_X2APIC | ||
| 1600 | enable_IR_x2apic(); | 1583 | enable_IR_x2apic(); |
| 1601 | #endif | ||
| 1602 | #ifdef CONFIG_X86_64 | 1584 | #ifdef CONFIG_X86_64 |
| 1603 | setup_apic_routing(); | 1585 | default_setup_apic_routing(); |
| 1604 | #endif | 1586 | #endif |
| 1605 | 1587 | ||
| 1606 | verify_local_APIC(); | 1588 | verify_local_APIC(); |
| @@ -1621,35 +1603,31 @@ int __init APIC_init_uniprocessor(void) | |||
| 1621 | physid_set_mask_of_physid(boot_cpu_physical_apicid, &phys_cpu_present_map); | 1603 | physid_set_mask_of_physid(boot_cpu_physical_apicid, &phys_cpu_present_map); |
| 1622 | setup_local_APIC(); | 1604 | setup_local_APIC(); |
| 1623 | 1605 | ||
| 1624 | #ifdef CONFIG_X86_64 | 1606 | #ifdef CONFIG_X86_IO_APIC |
| 1625 | /* | 1607 | /* |
| 1626 | * Now enable IO-APICs, actually call clear_IO_APIC | 1608 | * Now enable IO-APICs, actually call clear_IO_APIC |
| 1627 | * We need clear_IO_APIC before enabling vector on BP | 1609 | * We need clear_IO_APIC before enabling error vector |
| 1628 | */ | 1610 | */ |
| 1629 | if (!skip_ioapic_setup && nr_ioapics) | 1611 | if (!skip_ioapic_setup && nr_ioapics) |
| 1630 | enable_IO_APIC(); | 1612 | enable_IO_APIC(); |
| 1631 | #endif | 1613 | #endif |
| 1632 | 1614 | ||
| 1633 | #ifdef CONFIG_X86_IO_APIC | ||
| 1634 | if (!smp_found_config || skip_ioapic_setup || !nr_ioapics) | ||
| 1635 | #endif | ||
| 1636 | localise_nmi_watchdog(); | ||
| 1637 | end_local_APIC_setup(); | 1615 | end_local_APIC_setup(); |
| 1638 | 1616 | ||
| 1639 | #ifdef CONFIG_X86_IO_APIC | 1617 | #ifdef CONFIG_X86_IO_APIC |
| 1640 | if (smp_found_config && !skip_ioapic_setup && nr_ioapics) | 1618 | if (smp_found_config && !skip_ioapic_setup && nr_ioapics) |
| 1641 | setup_IO_APIC(); | 1619 | setup_IO_APIC(); |
| 1642 | # ifdef CONFIG_X86_64 | 1620 | else { |
| 1643 | else | ||
| 1644 | nr_ioapics = 0; | 1621 | nr_ioapics = 0; |
| 1645 | # endif | 1622 | localise_nmi_watchdog(); |
| 1623 | } | ||
| 1624 | #else | ||
| 1625 | localise_nmi_watchdog(); | ||
| 1646 | #endif | 1626 | #endif |
| 1647 | 1627 | ||
| 1628 | setup_boot_clock(); | ||
| 1648 | #ifdef CONFIG_X86_64 | 1629 | #ifdef CONFIG_X86_64 |
| 1649 | setup_boot_APIC_clock(); | ||
| 1650 | check_nmi_watchdog(); | 1630 | check_nmi_watchdog(); |
| 1651 | #else | ||
| 1652 | setup_boot_clock(); | ||
| 1653 | #endif | 1631 | #endif |
| 1654 | 1632 | ||
| 1655 | return 0; | 1633 | return 0; |
| @@ -1738,7 +1716,8 @@ void __init connect_bsp_APIC(void) | |||
| 1738 | outb(0x01, 0x23); | 1716 | outb(0x01, 0x23); |
| 1739 | } | 1717 | } |
| 1740 | #endif | 1718 | #endif |
| 1741 | enable_apic_mode(); | 1719 | if (apic->enable_apic_mode) |
| 1720 | apic->enable_apic_mode(); | ||
| 1742 | } | 1721 | } |
| 1743 | 1722 | ||
| 1744 | /** | 1723 | /** |
| @@ -1876,29 +1855,39 @@ void __cpuinit generic_processor_info(int apicid, int version) | |||
| 1876 | } | 1855 | } |
| 1877 | #endif | 1856 | #endif |
| 1878 | 1857 | ||
| 1879 | #if defined(CONFIG_X86_SMP) || defined(CONFIG_X86_64) | 1858 | #if defined(CONFIG_SMP) || defined(CONFIG_X86_64) |
| 1880 | /* are we being called early in kernel startup? */ | 1859 | early_per_cpu(x86_cpu_to_apicid, cpu) = apicid; |
| 1881 | if (early_per_cpu_ptr(x86_cpu_to_apicid)) { | 1860 | early_per_cpu(x86_bios_cpu_apicid, cpu) = apicid; |
| 1882 | u16 *cpu_to_apicid = early_per_cpu_ptr(x86_cpu_to_apicid); | ||
| 1883 | u16 *bios_cpu_apicid = early_per_cpu_ptr(x86_bios_cpu_apicid); | ||
| 1884 | |||
| 1885 | cpu_to_apicid[cpu] = apicid; | ||
| 1886 | bios_cpu_apicid[cpu] = apicid; | ||
| 1887 | } else { | ||
| 1888 | per_cpu(x86_cpu_to_apicid, cpu) = apicid; | ||
| 1889 | per_cpu(x86_bios_cpu_apicid, cpu) = apicid; | ||
| 1890 | } | ||
| 1891 | #endif | 1861 | #endif |
| 1892 | 1862 | ||
| 1893 | set_cpu_possible(cpu, true); | 1863 | set_cpu_possible(cpu, true); |
| 1894 | set_cpu_present(cpu, true); | 1864 | set_cpu_present(cpu, true); |
| 1895 | } | 1865 | } |
| 1896 | 1866 | ||
| 1897 | #ifdef CONFIG_X86_64 | ||
| 1898 | int hard_smp_processor_id(void) | 1867 | int hard_smp_processor_id(void) |
| 1899 | { | 1868 | { |
| 1900 | return read_apic_id(); | 1869 | return read_apic_id(); |
| 1901 | } | 1870 | } |
| 1871 | |||
| 1872 | void default_init_apic_ldr(void) | ||
| 1873 | { | ||
| 1874 | unsigned long val; | ||
| 1875 | |||
| 1876 | apic_write(APIC_DFR, APIC_DFR_VALUE); | ||
| 1877 | val = apic_read(APIC_LDR) & ~APIC_LDR_MASK; | ||
| 1878 | val |= SET_APIC_LOGICAL_ID(1UL << smp_processor_id()); | ||
| 1879 | apic_write(APIC_LDR, val); | ||
| 1880 | } | ||
| 1881 | |||
| 1882 | #ifdef CONFIG_X86_32 | ||
| 1883 | int default_apicid_to_node(int logical_apicid) | ||
| 1884 | { | ||
| 1885 | #ifdef CONFIG_SMP | ||
| 1886 | return apicid_2_node[hard_smp_processor_id()]; | ||
| 1887 | #else | ||
| 1888 | return 0; | ||
| 1889 | #endif | ||
| 1890 | } | ||
| 1902 | #endif | 1891 | #endif |
| 1903 | 1892 | ||
| 1904 | /* | 1893 | /* |
| @@ -1976,7 +1965,7 @@ static int lapic_resume(struct sys_device *dev) | |||
| 1976 | 1965 | ||
| 1977 | local_irq_save(flags); | 1966 | local_irq_save(flags); |
| 1978 | 1967 | ||
| 1979 | #ifdef HAVE_X2APIC | 1968 | #ifdef CONFIG_X86_X2APIC |
| 1980 | if (x2apic) | 1969 | if (x2apic) |
| 1981 | enable_x2apic(); | 1970 | enable_x2apic(); |
| 1982 | else | 1971 | else |
diff --git a/arch/x86/kernel/genapic_flat_64.c b/arch/x86/kernel/apic/apic_flat_64.c index 34185488e4fb..3b002995e145 100644 --- a/arch/x86/kernel/genapic_flat_64.c +++ b/arch/x86/kernel/apic/apic_flat_64.c | |||
| @@ -17,9 +17,8 @@ | |||
| 17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
| 18 | #include <linux/hardirq.h> | 18 | #include <linux/hardirq.h> |
| 19 | #include <asm/smp.h> | 19 | #include <asm/smp.h> |
| 20 | #include <asm/apic.h> | ||
| 20 | #include <asm/ipi.h> | 21 | #include <asm/ipi.h> |
| 21 | #include <asm/genapic.h> | ||
| 22 | #include <mach_apicdef.h> | ||
| 23 | 22 | ||
| 24 | #ifdef CONFIG_ACPI | 23 | #ifdef CONFIG_ACPI |
| 25 | #include <acpi/acpi_bus.h> | 24 | #include <acpi/acpi_bus.h> |
| @@ -74,7 +73,7 @@ static inline void _flat_send_IPI_mask(unsigned long mask, int vector) | |||
| 74 | unsigned long flags; | 73 | unsigned long flags; |
| 75 | 74 | ||
| 76 | local_irq_save(flags); | 75 | local_irq_save(flags); |
| 77 | __send_IPI_dest_field(mask, vector, APIC_DEST_LOGICAL); | 76 | __default_send_IPI_dest_field(mask, vector, apic->dest_logical); |
| 78 | local_irq_restore(flags); | 77 | local_irq_restore(flags); |
| 79 | } | 78 | } |
| 80 | 79 | ||
| @@ -85,14 +84,15 @@ static void flat_send_IPI_mask(const struct cpumask *cpumask, int vector) | |||
| 85 | _flat_send_IPI_mask(mask, vector); | 84 | _flat_send_IPI_mask(mask, vector); |
| 86 | } | 85 | } |
| 87 | 86 | ||
| 88 | static void flat_send_IPI_mask_allbutself(const struct cpumask *cpumask, | 87 | static void |
| 89 | int vector) | 88 | flat_send_IPI_mask_allbutself(const struct cpumask *cpumask, int vector) |
| 90 | { | 89 | { |
| 91 | unsigned long mask = cpumask_bits(cpumask)[0]; | 90 | unsigned long mask = cpumask_bits(cpumask)[0]; |
| 92 | int cpu = smp_processor_id(); | 91 | int cpu = smp_processor_id(); |
| 93 | 92 | ||
| 94 | if (cpu < BITS_PER_LONG) | 93 | if (cpu < BITS_PER_LONG) |
| 95 | clear_bit(cpu, &mask); | 94 | clear_bit(cpu, &mask); |
| 95 | |||
| 96 | _flat_send_IPI_mask(mask, vector); | 96 | _flat_send_IPI_mask(mask, vector); |
| 97 | } | 97 | } |
| 98 | 98 | ||
| @@ -114,23 +114,27 @@ static void flat_send_IPI_allbutself(int vector) | |||
| 114 | _flat_send_IPI_mask(mask, vector); | 114 | _flat_send_IPI_mask(mask, vector); |
| 115 | } | 115 | } |
| 116 | } else if (num_online_cpus() > 1) { | 116 | } else if (num_online_cpus() > 1) { |
| 117 | __send_IPI_shortcut(APIC_DEST_ALLBUT, vector,APIC_DEST_LOGICAL); | 117 | __default_send_IPI_shortcut(APIC_DEST_ALLBUT, |
| 118 | vector, apic->dest_logical); | ||
| 118 | } | 119 | } |
| 119 | } | 120 | } |
| 120 | 121 | ||
| 121 | static void flat_send_IPI_all(int vector) | 122 | static void flat_send_IPI_all(int vector) |
| 122 | { | 123 | { |
| 123 | if (vector == NMI_VECTOR) | 124 | if (vector == NMI_VECTOR) { |
| 124 | flat_send_IPI_mask(cpu_online_mask, vector); | 125 | flat_send_IPI_mask(cpu_online_mask, vector); |
| 125 | else | 126 | } else { |
| 126 | __send_IPI_shortcut(APIC_DEST_ALLINC, vector, APIC_DEST_LOGICAL); | 127 | __default_send_IPI_shortcut(APIC_DEST_ALLINC, |
| 128 | vector, apic->dest_logical); | ||
| 129 | } | ||
| 127 | } | 130 | } |
| 128 | 131 | ||
| 129 | static unsigned int get_apic_id(unsigned long x) | 132 | static unsigned int flat_get_apic_id(unsigned long x) |
| 130 | { | 133 | { |
| 131 | unsigned int id; | 134 | unsigned int id; |
| 132 | 135 | ||
| 133 | id = (((x)>>24) & 0xFFu); | 136 | id = (((x)>>24) & 0xFFu); |
| 137 | |||
| 134 | return id; | 138 | return id; |
| 135 | } | 139 | } |
| 136 | 140 | ||
| @@ -146,7 +150,7 @@ static unsigned int read_xapic_id(void) | |||
| 146 | { | 150 | { |
| 147 | unsigned int id; | 151 | unsigned int id; |
| 148 | 152 | ||
| 149 | id = get_apic_id(apic_read(APIC_ID)); | 153 | id = flat_get_apic_id(apic_read(APIC_ID)); |
| 150 | return id; | 154 | return id; |
| 151 | } | 155 | } |
| 152 | 156 | ||
| @@ -169,31 +173,68 @@ static unsigned int flat_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | |||
| 169 | return mask1 & mask2; | 173 | return mask1 & mask2; |
| 170 | } | 174 | } |
| 171 | 175 | ||
| 172 | static unsigned int phys_pkg_id(int index_msb) | 176 | static int flat_phys_pkg_id(int initial_apic_id, int index_msb) |
| 173 | { | 177 | { |
| 174 | return hard_smp_processor_id() >> index_msb; | 178 | return hard_smp_processor_id() >> index_msb; |
| 175 | } | 179 | } |
| 176 | 180 | ||
| 177 | struct genapic apic_flat = { | 181 | struct apic apic_flat = { |
| 178 | .name = "flat", | 182 | .name = "flat", |
| 179 | .acpi_madt_oem_check = flat_acpi_madt_oem_check, | 183 | .probe = NULL, |
| 180 | .int_delivery_mode = dest_LowestPrio, | 184 | .acpi_madt_oem_check = flat_acpi_madt_oem_check, |
| 181 | .int_dest_mode = (APIC_DEST_LOGICAL != 0), | 185 | .apic_id_registered = flat_apic_id_registered, |
| 182 | .target_cpus = flat_target_cpus, | 186 | |
| 183 | .vector_allocation_domain = flat_vector_allocation_domain, | 187 | .irq_delivery_mode = dest_LowestPrio, |
| 184 | .apic_id_registered = flat_apic_id_registered, | 188 | .irq_dest_mode = 1, /* logical */ |
| 185 | .init_apic_ldr = flat_init_apic_ldr, | 189 | |
| 186 | .send_IPI_all = flat_send_IPI_all, | 190 | .target_cpus = flat_target_cpus, |
| 187 | .send_IPI_allbutself = flat_send_IPI_allbutself, | 191 | .disable_esr = 0, |
| 188 | .send_IPI_mask = flat_send_IPI_mask, | 192 | .dest_logical = APIC_DEST_LOGICAL, |
| 189 | .send_IPI_mask_allbutself = flat_send_IPI_mask_allbutself, | 193 | .check_apicid_used = NULL, |
| 190 | .send_IPI_self = apic_send_IPI_self, | 194 | .check_apicid_present = NULL, |
| 191 | .cpu_mask_to_apicid = flat_cpu_mask_to_apicid, | 195 | |
| 192 | .cpu_mask_to_apicid_and = flat_cpu_mask_to_apicid_and, | 196 | .vector_allocation_domain = flat_vector_allocation_domain, |
| 193 | .phys_pkg_id = phys_pkg_id, | 197 | .init_apic_ldr = flat_init_apic_ldr, |
| 194 | .get_apic_id = get_apic_id, | 198 | |
| 195 | .set_apic_id = set_apic_id, | 199 | .ioapic_phys_id_map = NULL, |
| 196 | .apic_id_mask = (0xFFu<<24), | 200 | .setup_apic_routing = NULL, |
| 201 | .multi_timer_check = NULL, | ||
| 202 | .apicid_to_node = NULL, | ||
| 203 | .cpu_to_logical_apicid = NULL, | ||
| 204 | .cpu_present_to_apicid = default_cpu_present_to_apicid, | ||
| 205 | .apicid_to_cpu_present = NULL, | ||
| 206 | .setup_portio_remap = NULL, | ||
| 207 | .check_phys_apicid_present = default_check_phys_apicid_present, | ||
| 208 | .enable_apic_mode = NULL, | ||
| 209 | .phys_pkg_id = flat_phys_pkg_id, | ||
| 210 | .mps_oem_check = NULL, | ||
| 211 | |||
| 212 | .get_apic_id = flat_get_apic_id, | ||
| 213 | .set_apic_id = set_apic_id, | ||
| 214 | .apic_id_mask = 0xFFu << 24, | ||
| 215 | |||
| 216 | .cpu_mask_to_apicid = flat_cpu_mask_to_apicid, | ||
| 217 | .cpu_mask_to_apicid_and = flat_cpu_mask_to_apicid_and, | ||
| 218 | |||
| 219 | .send_IPI_mask = flat_send_IPI_mask, | ||
| 220 | .send_IPI_mask_allbutself = flat_send_IPI_mask_allbutself, | ||
| 221 | .send_IPI_allbutself = flat_send_IPI_allbutself, | ||
| 222 | .send_IPI_all = flat_send_IPI_all, | ||
| 223 | .send_IPI_self = apic_send_IPI_self, | ||
| 224 | |||
| 225 | .wakeup_cpu = NULL, | ||
| 226 | .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, | ||
| 227 | .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, | ||
| 228 | .wait_for_init_deassert = NULL, | ||
| 229 | .smp_callin_clear_local_apic = NULL, | ||
| 230 | .inquire_remote_apic = NULL, | ||
| 231 | |||
| 232 | .read = native_apic_mem_read, | ||
| 233 | .write = native_apic_mem_write, | ||
| 234 | .icr_read = native_apic_icr_read, | ||
| 235 | .icr_write = native_apic_icr_write, | ||
| 236 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
| 237 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
| 197 | }; | 238 | }; |
| 198 | 239 | ||
| 199 | /* | 240 | /* |
| @@ -232,18 +273,18 @@ static void physflat_vector_allocation_domain(int cpu, struct cpumask *retmask) | |||
| 232 | 273 | ||
| 233 | static void physflat_send_IPI_mask(const struct cpumask *cpumask, int vector) | 274 | static void physflat_send_IPI_mask(const struct cpumask *cpumask, int vector) |
| 234 | { | 275 | { |
| 235 | send_IPI_mask_sequence(cpumask, vector); | 276 | default_send_IPI_mask_sequence_phys(cpumask, vector); |
| 236 | } | 277 | } |
| 237 | 278 | ||
| 238 | static void physflat_send_IPI_mask_allbutself(const struct cpumask *cpumask, | 279 | static void physflat_send_IPI_mask_allbutself(const struct cpumask *cpumask, |
| 239 | int vector) | 280 | int vector) |
| 240 | { | 281 | { |
| 241 | send_IPI_mask_allbutself(cpumask, vector); | 282 | default_send_IPI_mask_allbutself_phys(cpumask, vector); |
| 242 | } | 283 | } |
| 243 | 284 | ||
| 244 | static void physflat_send_IPI_allbutself(int vector) | 285 | static void physflat_send_IPI_allbutself(int vector) |
| 245 | { | 286 | { |
| 246 | send_IPI_mask_allbutself(cpu_online_mask, vector); | 287 | default_send_IPI_mask_allbutself_phys(cpu_online_mask, vector); |
| 247 | } | 288 | } |
| 248 | 289 | ||
| 249 | static void physflat_send_IPI_all(int vector) | 290 | static void physflat_send_IPI_all(int vector) |
| @@ -276,32 +317,73 @@ physflat_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | |||
| 276 | * We're using fixed IRQ delivery, can only return one phys APIC ID. | 317 | * We're using fixed IRQ delivery, can only return one phys APIC ID. |
| 277 | * May as well be the first. | 318 | * May as well be the first. |
| 278 | */ | 319 | */ |
| 279 | for_each_cpu_and(cpu, cpumask, andmask) | 320 | for_each_cpu_and(cpu, cpumask, andmask) { |
| 280 | if (cpumask_test_cpu(cpu, cpu_online_mask)) | 321 | if (cpumask_test_cpu(cpu, cpu_online_mask)) |
| 281 | break; | 322 | break; |
| 323 | } | ||
| 282 | if (cpu < nr_cpu_ids) | 324 | if (cpu < nr_cpu_ids) |
| 283 | return per_cpu(x86_cpu_to_apicid, cpu); | 325 | return per_cpu(x86_cpu_to_apicid, cpu); |
| 326 | |||
| 284 | return BAD_APICID; | 327 | return BAD_APICID; |
| 285 | } | 328 | } |
| 286 | 329 | ||
| 287 | struct genapic apic_physflat = { | 330 | struct apic apic_physflat = { |
| 288 | .name = "physical flat", | 331 | |
| 289 | .acpi_madt_oem_check = physflat_acpi_madt_oem_check, | 332 | .name = "physical flat", |
| 290 | .int_delivery_mode = dest_Fixed, | 333 | .probe = NULL, |
| 291 | .int_dest_mode = (APIC_DEST_PHYSICAL != 0), | 334 | .acpi_madt_oem_check = physflat_acpi_madt_oem_check, |
| 292 | .target_cpus = physflat_target_cpus, | 335 | .apic_id_registered = flat_apic_id_registered, |
| 293 | .vector_allocation_domain = physflat_vector_allocation_domain, | 336 | |
| 294 | .apic_id_registered = flat_apic_id_registered, | 337 | .irq_delivery_mode = dest_Fixed, |
| 295 | .init_apic_ldr = flat_init_apic_ldr,/*not needed, but shouldn't hurt*/ | 338 | .irq_dest_mode = 0, /* physical */ |
| 296 | .send_IPI_all = physflat_send_IPI_all, | 339 | |
| 297 | .send_IPI_allbutself = physflat_send_IPI_allbutself, | 340 | .target_cpus = physflat_target_cpus, |
| 298 | .send_IPI_mask = physflat_send_IPI_mask, | 341 | .disable_esr = 0, |
| 299 | .send_IPI_mask_allbutself = physflat_send_IPI_mask_allbutself, | 342 | .dest_logical = 0, |
| 300 | .send_IPI_self = apic_send_IPI_self, | 343 | .check_apicid_used = NULL, |
| 301 | .cpu_mask_to_apicid = physflat_cpu_mask_to_apicid, | 344 | .check_apicid_present = NULL, |
| 302 | .cpu_mask_to_apicid_and = physflat_cpu_mask_to_apicid_and, | 345 | |
| 303 | .phys_pkg_id = phys_pkg_id, | 346 | .vector_allocation_domain = physflat_vector_allocation_domain, |
| 304 | .get_apic_id = get_apic_id, | 347 | /* not needed, but shouldn't hurt: */ |
| 305 | .set_apic_id = set_apic_id, | 348 | .init_apic_ldr = flat_init_apic_ldr, |
| 306 | .apic_id_mask = (0xFFu<<24), | 349 | |
| 350 | .ioapic_phys_id_map = NULL, | ||
| 351 | .setup_apic_routing = NULL, | ||
| 352 | .multi_timer_check = NULL, | ||
| 353 | .apicid_to_node = NULL, | ||
| 354 | .cpu_to_logical_apicid = NULL, | ||
| 355 | .cpu_present_to_apicid = default_cpu_present_to_apicid, | ||
| 356 | .apicid_to_cpu_present = NULL, | ||
| 357 | .setup_portio_remap = NULL, | ||
| 358 | .check_phys_apicid_present = default_check_phys_apicid_present, | ||
| 359 | .enable_apic_mode = NULL, | ||
| 360 | .phys_pkg_id = flat_phys_pkg_id, | ||
| 361 | .mps_oem_check = NULL, | ||
| 362 | |||
| 363 | .get_apic_id = flat_get_apic_id, | ||
| 364 | .set_apic_id = set_apic_id, | ||
| 365 | .apic_id_mask = 0xFFu << 24, | ||
| 366 | |||
| 367 | .cpu_mask_to_apicid = physflat_cpu_mask_to_apicid, | ||
| 368 | .cpu_mask_to_apicid_and = physflat_cpu_mask_to_apicid_and, | ||
| 369 | |||
| 370 | .send_IPI_mask = physflat_send_IPI_mask, | ||
| 371 | .send_IPI_mask_allbutself = physflat_send_IPI_mask_allbutself, | ||
| 372 | .send_IPI_allbutself = physflat_send_IPI_allbutself, | ||
| 373 | .send_IPI_all = physflat_send_IPI_all, | ||
| 374 | .send_IPI_self = apic_send_IPI_self, | ||
| 375 | |||
| 376 | .wakeup_cpu = NULL, | ||
| 377 | .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, | ||
| 378 | .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, | ||
| 379 | .wait_for_init_deassert = NULL, | ||
| 380 | .smp_callin_clear_local_apic = NULL, | ||
| 381 | .inquire_remote_apic = NULL, | ||
| 382 | |||
| 383 | .read = native_apic_mem_read, | ||
| 384 | .write = native_apic_mem_write, | ||
| 385 | .icr_read = native_apic_icr_read, | ||
| 386 | .icr_write = native_apic_icr_write, | ||
| 387 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
| 388 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
| 307 | }; | 389 | }; |
diff --git a/arch/x86/kernel/apic/bigsmp_32.c b/arch/x86/kernel/apic/bigsmp_32.c new file mode 100644 index 000000000000..0b1093394fdf --- /dev/null +++ b/arch/x86/kernel/apic/bigsmp_32.c | |||
| @@ -0,0 +1,274 @@ | |||
| 1 | /* | ||
| 2 | * APIC driver for "bigsmp" xAPIC machines with more than 8 virtual CPUs. | ||
| 3 | * | ||
| 4 | * Drives the local APIC in "clustered mode". | ||
| 5 | */ | ||
| 6 | #include <linux/threads.h> | ||
| 7 | #include <linux/cpumask.h> | ||
| 8 | #include <linux/kernel.h> | ||
| 9 | #include <linux/init.h> | ||
| 10 | #include <linux/dmi.h> | ||
| 11 | #include <linux/smp.h> | ||
| 12 | |||
| 13 | #include <asm/apicdef.h> | ||
| 14 | #include <asm/fixmap.h> | ||
| 15 | #include <asm/mpspec.h> | ||
| 16 | #include <asm/apic.h> | ||
| 17 | #include <asm/ipi.h> | ||
| 18 | |||
| 19 | static inline unsigned bigsmp_get_apic_id(unsigned long x) | ||
| 20 | { | ||
| 21 | return (x >> 24) & 0xFF; | ||
| 22 | } | ||
| 23 | |||
| 24 | static inline int bigsmp_apic_id_registered(void) | ||
| 25 | { | ||
| 26 | return 1; | ||
| 27 | } | ||
| 28 | |||
| 29 | static inline const cpumask_t *bigsmp_target_cpus(void) | ||
| 30 | { | ||
| 31 | #ifdef CONFIG_SMP | ||
| 32 | return &cpu_online_map; | ||
| 33 | #else | ||
| 34 | return &cpumask_of_cpu(0); | ||
| 35 | #endif | ||
| 36 | } | ||
| 37 | |||
| 38 | static inline unsigned long | ||
| 39 | bigsmp_check_apicid_used(physid_mask_t bitmap, int apicid) | ||
| 40 | { | ||
| 41 | return 0; | ||
| 42 | } | ||
| 43 | |||
| 44 | static inline unsigned long bigsmp_check_apicid_present(int bit) | ||
| 45 | { | ||
| 46 | return 1; | ||
| 47 | } | ||
| 48 | |||
| 49 | static inline unsigned long calculate_ldr(int cpu) | ||
| 50 | { | ||
| 51 | unsigned long val, id; | ||
| 52 | |||
| 53 | val = apic_read(APIC_LDR) & ~APIC_LDR_MASK; | ||
| 54 | id = per_cpu(x86_bios_cpu_apicid, cpu); | ||
| 55 | val |= SET_APIC_LOGICAL_ID(id); | ||
| 56 | |||
| 57 | return val; | ||
| 58 | } | ||
| 59 | |||
| 60 | /* | ||
| 61 | * Set up the logical destination ID. | ||
| 62 | * | ||
| 63 | * Intel recommends to set DFR, LDR and TPR before enabling | ||
| 64 | * an APIC. See e.g. "AP-388 82489DX User's Manual" (Intel | ||
| 65 | * document number 292116). So here it goes... | ||
| 66 | */ | ||
| 67 | static inline void bigsmp_init_apic_ldr(void) | ||
| 68 | { | ||
| 69 | unsigned long val; | ||
| 70 | int cpu = smp_processor_id(); | ||
| 71 | |||
| 72 | apic_write(APIC_DFR, APIC_DFR_FLAT); | ||
| 73 | val = calculate_ldr(cpu); | ||
| 74 | apic_write(APIC_LDR, val); | ||
| 75 | } | ||
| 76 | |||
| 77 | static inline void bigsmp_setup_apic_routing(void) | ||
| 78 | { | ||
| 79 | printk(KERN_INFO | ||
| 80 | "Enabling APIC mode: Physflat. Using %d I/O APICs\n", | ||
| 81 | nr_ioapics); | ||
| 82 | } | ||
| 83 | |||
| 84 | static inline int bigsmp_apicid_to_node(int logical_apicid) | ||
| 85 | { | ||
| 86 | return apicid_2_node[hard_smp_processor_id()]; | ||
| 87 | } | ||
| 88 | |||
| 89 | static inline int bigsmp_cpu_present_to_apicid(int mps_cpu) | ||
| 90 | { | ||
| 91 | if (mps_cpu < nr_cpu_ids) | ||
| 92 | return (int) per_cpu(x86_bios_cpu_apicid, mps_cpu); | ||
| 93 | |||
| 94 | return BAD_APICID; | ||
| 95 | } | ||
| 96 | |||
| 97 | static inline physid_mask_t bigsmp_apicid_to_cpu_present(int phys_apicid) | ||
| 98 | { | ||
| 99 | return physid_mask_of_physid(phys_apicid); | ||
| 100 | } | ||
| 101 | |||
| 102 | /* Mapping from cpu number to logical apicid */ | ||
| 103 | static inline int bigsmp_cpu_to_logical_apicid(int cpu) | ||
| 104 | { | ||
| 105 | if (cpu >= nr_cpu_ids) | ||
| 106 | return BAD_APICID; | ||
| 107 | return cpu_physical_id(cpu); | ||
| 108 | } | ||
| 109 | |||
| 110 | static inline physid_mask_t bigsmp_ioapic_phys_id_map(physid_mask_t phys_map) | ||
| 111 | { | ||
| 112 | /* For clustered we don't have a good way to do this yet - hack */ | ||
| 113 | return physids_promote(0xFFL); | ||
| 114 | } | ||
| 115 | |||
| 116 | static inline void bigsmp_setup_portio_remap(void) | ||
| 117 | { | ||
| 118 | } | ||
| 119 | |||
| 120 | static inline int bigsmp_check_phys_apicid_present(int boot_cpu_physical_apicid) | ||
| 121 | { | ||
| 122 | return 1; | ||
| 123 | } | ||
| 124 | |||
| 125 | /* As we are using single CPU as destination, pick only one CPU here */ | ||
| 126 | static inline unsigned int bigsmp_cpu_mask_to_apicid(const cpumask_t *cpumask) | ||
| 127 | { | ||
| 128 | return bigsmp_cpu_to_logical_apicid(first_cpu(*cpumask)); | ||
| 129 | } | ||
| 130 | |||
| 131 | static inline unsigned int | ||
| 132 | bigsmp_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | ||
| 133 | const struct cpumask *andmask) | ||
| 134 | { | ||
| 135 | int cpu; | ||
| 136 | |||
| 137 | /* | ||
| 138 | * We're using fixed IRQ delivery, can only return one phys APIC ID. | ||
| 139 | * May as well be the first. | ||
| 140 | */ | ||
| 141 | for_each_cpu_and(cpu, cpumask, andmask) { | ||
| 142 | if (cpumask_test_cpu(cpu, cpu_online_mask)) | ||
| 143 | break; | ||
| 144 | } | ||
| 145 | if (cpu < nr_cpu_ids) | ||
| 146 | return bigsmp_cpu_to_logical_apicid(cpu); | ||
| 147 | |||
| 148 | return BAD_APICID; | ||
| 149 | } | ||
| 150 | |||
| 151 | static inline int bigsmp_phys_pkg_id(int cpuid_apic, int index_msb) | ||
| 152 | { | ||
| 153 | return cpuid_apic >> index_msb; | ||
| 154 | } | ||
| 155 | |||
| 156 | static inline void bigsmp_send_IPI_mask(const struct cpumask *mask, int vector) | ||
| 157 | { | ||
| 158 | default_send_IPI_mask_sequence_phys(mask, vector); | ||
| 159 | } | ||
| 160 | |||
| 161 | static inline void bigsmp_send_IPI_allbutself(int vector) | ||
| 162 | { | ||
| 163 | default_send_IPI_mask_allbutself_phys(cpu_online_mask, vector); | ||
| 164 | } | ||
| 165 | |||
| 166 | static inline void bigsmp_send_IPI_all(int vector) | ||
| 167 | { | ||
| 168 | bigsmp_send_IPI_mask(cpu_online_mask, vector); | ||
| 169 | } | ||
| 170 | |||
| 171 | static int dmi_bigsmp; /* can be set by dmi scanners */ | ||
| 172 | |||
| 173 | static int hp_ht_bigsmp(const struct dmi_system_id *d) | ||
| 174 | { | ||
| 175 | printk(KERN_NOTICE "%s detected: force use of apic=bigsmp\n", d->ident); | ||
| 176 | dmi_bigsmp = 1; | ||
| 177 | |||
| 178 | return 0; | ||
| 179 | } | ||
| 180 | |||
| 181 | |||
| 182 | static const struct dmi_system_id bigsmp_dmi_table[] = { | ||
| 183 | { hp_ht_bigsmp, "HP ProLiant DL760 G2", | ||
| 184 | { DMI_MATCH(DMI_BIOS_VENDOR, "HP"), | ||
| 185 | DMI_MATCH(DMI_BIOS_VERSION, "P44-"), | ||
| 186 | } | ||
| 187 | }, | ||
| 188 | |||
| 189 | { hp_ht_bigsmp, "HP ProLiant DL740", | ||
| 190 | { DMI_MATCH(DMI_BIOS_VENDOR, "HP"), | ||
| 191 | DMI_MATCH(DMI_BIOS_VERSION, "P47-"), | ||
| 192 | } | ||
| 193 | }, | ||
| 194 | { } /* NULL entry stops DMI scanning */ | ||
| 195 | }; | ||
| 196 | |||
| 197 | static void bigsmp_vector_allocation_domain(int cpu, cpumask_t *retmask) | ||
| 198 | { | ||
| 199 | cpus_clear(*retmask); | ||
| 200 | cpu_set(cpu, *retmask); | ||
| 201 | } | ||
| 202 | |||
| 203 | static int probe_bigsmp(void) | ||
| 204 | { | ||
| 205 | if (def_to_bigsmp) | ||
| 206 | dmi_bigsmp = 1; | ||
| 207 | else | ||
| 208 | dmi_check_system(bigsmp_dmi_table); | ||
| 209 | |||
| 210 | return dmi_bigsmp; | ||
| 211 | } | ||
| 212 | |||
| 213 | struct apic apic_bigsmp = { | ||
| 214 | |||
| 215 | .name = "bigsmp", | ||
| 216 | .probe = probe_bigsmp, | ||
| 217 | .acpi_madt_oem_check = NULL, | ||
| 218 | .apic_id_registered = bigsmp_apic_id_registered, | ||
| 219 | |||
| 220 | .irq_delivery_mode = dest_Fixed, | ||
| 221 | /* phys delivery to target CPU: */ | ||
| 222 | .irq_dest_mode = 0, | ||
| 223 | |||
| 224 | .target_cpus = bigsmp_target_cpus, | ||
| 225 | .disable_esr = 1, | ||
| 226 | .dest_logical = 0, | ||
| 227 | .check_apicid_used = bigsmp_check_apicid_used, | ||
| 228 | .check_apicid_present = bigsmp_check_apicid_present, | ||
| 229 | |||
| 230 | .vector_allocation_domain = bigsmp_vector_allocation_domain, | ||
| 231 | .init_apic_ldr = bigsmp_init_apic_ldr, | ||
| 232 | |||
| 233 | .ioapic_phys_id_map = bigsmp_ioapic_phys_id_map, | ||
| 234 | .setup_apic_routing = bigsmp_setup_apic_routing, | ||
| 235 | .multi_timer_check = NULL, | ||
| 236 | .apicid_to_node = bigsmp_apicid_to_node, | ||
| 237 | .cpu_to_logical_apicid = bigsmp_cpu_to_logical_apicid, | ||
| 238 | .cpu_present_to_apicid = bigsmp_cpu_present_to_apicid, | ||
| 239 | .apicid_to_cpu_present = bigsmp_apicid_to_cpu_present, | ||
| 240 | .setup_portio_remap = NULL, | ||
| 241 | .check_phys_apicid_present = bigsmp_check_phys_apicid_present, | ||
| 242 | .enable_apic_mode = NULL, | ||
| 243 | .phys_pkg_id = bigsmp_phys_pkg_id, | ||
| 244 | .mps_oem_check = NULL, | ||
| 245 | |||
| 246 | .get_apic_id = bigsmp_get_apic_id, | ||
| 247 | .set_apic_id = NULL, | ||
| 248 | .apic_id_mask = 0xFF << 24, | ||
| 249 | |||
| 250 | .cpu_mask_to_apicid = bigsmp_cpu_mask_to_apicid, | ||
| 251 | .cpu_mask_to_apicid_and = bigsmp_cpu_mask_to_apicid_and, | ||
| 252 | |||
| 253 | .send_IPI_mask = bigsmp_send_IPI_mask, | ||
| 254 | .send_IPI_mask_allbutself = NULL, | ||
| 255 | .send_IPI_allbutself = bigsmp_send_IPI_allbutself, | ||
| 256 | .send_IPI_all = bigsmp_send_IPI_all, | ||
| 257 | .send_IPI_self = default_send_IPI_self, | ||
| 258 | |||
| 259 | .wakeup_cpu = NULL, | ||
| 260 | .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, | ||
| 261 | .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, | ||
| 262 | |||
| 263 | .wait_for_init_deassert = default_wait_for_init_deassert, | ||
| 264 | |||
| 265 | .smp_callin_clear_local_apic = NULL, | ||
| 266 | .inquire_remote_apic = default_inquire_remote_apic, | ||
| 267 | |||
| 268 | .read = native_apic_mem_read, | ||
| 269 | .write = native_apic_mem_write, | ||
| 270 | .icr_read = native_apic_icr_read, | ||
| 271 | .icr_write = native_apic_icr_write, | ||
| 272 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
| 273 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
| 274 | }; | ||
diff --git a/arch/x86/kernel/apic/es7000_32.c b/arch/x86/kernel/apic/es7000_32.c new file mode 100644 index 000000000000..320f2d2e4e54 --- /dev/null +++ b/arch/x86/kernel/apic/es7000_32.c | |||
| @@ -0,0 +1,757 @@ | |||
| 1 | /* | ||
| 2 | * Written by: Garry Forsgren, Unisys Corporation | ||
| 3 | * Natalie Protasevich, Unisys Corporation | ||
| 4 | * | ||
| 5 | * This file contains the code to configure and interface | ||
| 6 | * with Unisys ES7000 series hardware system manager. | ||
| 7 | * | ||
| 8 | * Copyright (c) 2003 Unisys Corporation. | ||
| 9 | * Copyright (C) 2009, Red Hat, Inc., Ingo Molnar | ||
| 10 | * | ||
| 11 | * All Rights Reserved. | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify it | ||
| 14 | * under the terms of version 2 of the GNU General Public License as | ||
| 15 | * published by the Free Software Foundation. | ||
| 16 | * | ||
| 17 | * This program is distributed in the hope that it would be useful, but | ||
| 18 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License along | ||
| 22 | * with this program; if not, write the Free Software Foundation, Inc., 59 | ||
| 23 | * Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
| 24 | * | ||
| 25 | * Contact information: Unisys Corporation, Township Line & Union Meeting | ||
| 26 | * Roads-A, Unisys Way, Blue Bell, Pennsylvania, 19424, or: | ||
| 27 | * | ||
| 28 | * http://www.unisys.com | ||
| 29 | */ | ||
| 30 | #include <linux/notifier.h> | ||
| 31 | #include <linux/spinlock.h> | ||
| 32 | #include <linux/cpumask.h> | ||
| 33 | #include <linux/threads.h> | ||
| 34 | #include <linux/kernel.h> | ||
| 35 | #include <linux/module.h> | ||
| 36 | #include <linux/reboot.h> | ||
| 37 | #include <linux/string.h> | ||
| 38 | #include <linux/types.h> | ||
| 39 | #include <linux/errno.h> | ||
| 40 | #include <linux/acpi.h> | ||
| 41 | #include <linux/init.h> | ||
| 42 | #include <linux/nmi.h> | ||
| 43 | #include <linux/smp.h> | ||
| 44 | #include <linux/io.h> | ||
| 45 | |||
| 46 | #include <asm/apicdef.h> | ||
| 47 | #include <asm/atomic.h> | ||
| 48 | #include <asm/fixmap.h> | ||
| 49 | #include <asm/mpspec.h> | ||
| 50 | #include <asm/setup.h> | ||
| 51 | #include <asm/apic.h> | ||
| 52 | #include <asm/ipi.h> | ||
| 53 | |||
| 54 | /* | ||
| 55 | * ES7000 chipsets | ||
| 56 | */ | ||
| 57 | |||
| 58 | #define NON_UNISYS 0 | ||
| 59 | #define ES7000_CLASSIC 1 | ||
| 60 | #define ES7000_ZORRO 2 | ||
| 61 | |||
| 62 | #define MIP_REG 1 | ||
| 63 | #define MIP_PSAI_REG 4 | ||
| 64 | |||
| 65 | #define MIP_BUSY 1 | ||
| 66 | #define MIP_SPIN 0xf0000 | ||
| 67 | #define MIP_VALID 0x0100000000000000ULL | ||
| 68 | #define MIP_SW_APIC 0x1020b | ||
| 69 | |||
| 70 | #define MIP_PORT(val) ((val >> 32) & 0xffff) | ||
| 71 | |||
| 72 | #define MIP_RD_LO(val) (val & 0xffffffff) | ||
| 73 | |||
| 74 | struct mip_reg { | ||
| 75 | unsigned long long off_0x00; | ||
| 76 | unsigned long long off_0x08; | ||
| 77 | unsigned long long off_0x10; | ||
| 78 | unsigned long long off_0x18; | ||
| 79 | unsigned long long off_0x20; | ||
| 80 | unsigned long long off_0x28; | ||
| 81 | unsigned long long off_0x30; | ||
| 82 | unsigned long long off_0x38; | ||
| 83 | }; | ||
| 84 | |||
| 85 | struct mip_reg_info { | ||
| 86 | unsigned long long mip_info; | ||
| 87 | unsigned long long delivery_info; | ||
| 88 | unsigned long long host_reg; | ||
| 89 | unsigned long long mip_reg; | ||
| 90 | }; | ||
| 91 | |||
| 92 | struct psai { | ||
| 93 | unsigned long long entry_type; | ||
| 94 | unsigned long long addr; | ||
| 95 | unsigned long long bep_addr; | ||
| 96 | }; | ||
| 97 | |||
| 98 | #ifdef CONFIG_ACPI | ||
| 99 | |||
| 100 | struct es7000_oem_table { | ||
| 101 | struct acpi_table_header Header; | ||
| 102 | u32 OEMTableAddr; | ||
| 103 | u32 OEMTableSize; | ||
| 104 | }; | ||
| 105 | |||
| 106 | static unsigned long oem_addrX; | ||
| 107 | static unsigned long oem_size; | ||
| 108 | |||
| 109 | #endif | ||
| 110 | |||
| 111 | /* | ||
| 112 | * ES7000 Globals | ||
| 113 | */ | ||
| 114 | |||
| 115 | static volatile unsigned long *psai; | ||
| 116 | static struct mip_reg *mip_reg; | ||
| 117 | static struct mip_reg *host_reg; | ||
| 118 | static int mip_port; | ||
| 119 | static unsigned long mip_addr; | ||
| 120 | static unsigned long host_addr; | ||
| 121 | |||
| 122 | int es7000_plat; | ||
| 123 | |||
| 124 | /* | ||
| 125 | * GSI override for ES7000 platforms. | ||
| 126 | */ | ||
| 127 | |||
| 128 | static unsigned int base; | ||
| 129 | |||
| 130 | static int | ||
| 131 | es7000_rename_gsi(int ioapic, int gsi) | ||
| 132 | { | ||
| 133 | if (es7000_plat == ES7000_ZORRO) | ||
| 134 | return gsi; | ||
| 135 | |||
| 136 | if (!base) { | ||
| 137 | int i; | ||
| 138 | for (i = 0; i < nr_ioapics; i++) | ||
| 139 | base += nr_ioapic_registers[i]; | ||
| 140 | } | ||
| 141 | |||
| 142 | if (!ioapic && (gsi < 16)) | ||
| 143 | gsi += base; | ||
| 144 | |||
| 145 | return gsi; | ||
| 146 | } | ||
| 147 | |||
| 148 | static int wakeup_secondary_cpu_via_mip(int cpu, unsigned long eip) | ||
| 149 | { | ||
| 150 | unsigned long vect = 0, psaival = 0; | ||
| 151 | |||
| 152 | if (psai == NULL) | ||
| 153 | return -1; | ||
| 154 | |||
| 155 | vect = ((unsigned long)__pa(eip)/0x1000) << 16; | ||
| 156 | psaival = (0x1000000 | vect | cpu); | ||
| 157 | |||
| 158 | while (*psai & 0x1000000) | ||
| 159 | ; | ||
| 160 | |||
| 161 | *psai = psaival; | ||
| 162 | |||
| 163 | return 0; | ||
| 164 | } | ||
| 165 | |||
| 166 | static int __init es7000_update_apic(void) | ||
| 167 | { | ||
| 168 | apic->wakeup_cpu = wakeup_secondary_cpu_via_mip; | ||
| 169 | |||
| 170 | /* MPENTIUMIII */ | ||
| 171 | if (boot_cpu_data.x86 == 6 && | ||
| 172 | (boot_cpu_data.x86_model >= 7 || boot_cpu_data.x86_model <= 11)) { | ||
| 173 | es7000_update_apic_to_cluster(); | ||
| 174 | apic->wait_for_init_deassert = NULL; | ||
| 175 | apic->wakeup_cpu = wakeup_secondary_cpu_via_mip; | ||
| 176 | } | ||
| 177 | |||
| 178 | return 0; | ||
| 179 | } | ||
| 180 | |||
| 181 | static void __init setup_unisys(void) | ||
| 182 | { | ||
| 183 | /* | ||
| 184 | * Determine the generation of the ES7000 currently running. | ||
| 185 | * | ||
| 186 | * es7000_plat = 1 if the machine is a 5xx ES7000 box | ||
| 187 | * es7000_plat = 2 if the machine is a x86_64 ES7000 box | ||
| 188 | * | ||
| 189 | */ | ||
| 190 | if (!(boot_cpu_data.x86 <= 15 && boot_cpu_data.x86_model <= 2)) | ||
| 191 | es7000_plat = ES7000_ZORRO; | ||
| 192 | else | ||
| 193 | es7000_plat = ES7000_CLASSIC; | ||
| 194 | ioapic_renumber_irq = es7000_rename_gsi; | ||
| 195 | |||
| 196 | x86_quirks->update_apic = es7000_update_apic; | ||
| 197 | } | ||
| 198 | |||
| 199 | /* | ||
| 200 | * Parse the OEM Table: | ||
| 201 | */ | ||
| 202 | static int __init parse_unisys_oem(char *oemptr) | ||
| 203 | { | ||
| 204 | int i; | ||
| 205 | int success = 0; | ||
| 206 | unsigned char type, size; | ||
| 207 | unsigned long val; | ||
| 208 | char *tp = NULL; | ||
| 209 | struct psai *psaip = NULL; | ||
| 210 | struct mip_reg_info *mi; | ||
| 211 | struct mip_reg *host, *mip; | ||
| 212 | |||
| 213 | tp = oemptr; | ||
| 214 | |||
| 215 | tp += 8; | ||
| 216 | |||
| 217 | for (i = 0; i <= 6; i++) { | ||
| 218 | type = *tp++; | ||
| 219 | size = *tp++; | ||
| 220 | tp -= 2; | ||
| 221 | switch (type) { | ||
| 222 | case MIP_REG: | ||
| 223 | mi = (struct mip_reg_info *)tp; | ||
| 224 | val = MIP_RD_LO(mi->host_reg); | ||
| 225 | host_addr = val; | ||
| 226 | host = (struct mip_reg *)val; | ||
| 227 | host_reg = __va(host); | ||
| 228 | val = MIP_RD_LO(mi->mip_reg); | ||
| 229 | mip_port = MIP_PORT(mi->mip_info); | ||
| 230 | mip_addr = val; | ||
| 231 | mip = (struct mip_reg *)val; | ||
| 232 | mip_reg = __va(mip); | ||
| 233 | pr_debug("es7000_mipcfg: host_reg = 0x%lx \n", | ||
| 234 | (unsigned long)host_reg); | ||
| 235 | pr_debug("es7000_mipcfg: mip_reg = 0x%lx \n", | ||
| 236 | (unsigned long)mip_reg); | ||
| 237 | success++; | ||
| 238 | break; | ||
| 239 | case MIP_PSAI_REG: | ||
| 240 | psaip = (struct psai *)tp; | ||
| 241 | if (tp != NULL) { | ||
| 242 | if (psaip->addr) | ||
| 243 | psai = __va(psaip->addr); | ||
| 244 | else | ||
| 245 | psai = NULL; | ||
| 246 | success++; | ||
| 247 | } | ||
| 248 | break; | ||
| 249 | default: | ||
| 250 | break; | ||
| 251 | } | ||
| 252 | tp += size; | ||
| 253 | } | ||
| 254 | |||
| 255 | if (success < 2) | ||
| 256 | es7000_plat = NON_UNISYS; | ||
| 257 | else | ||
| 258 | setup_unisys(); | ||
| 259 | |||
| 260 | return es7000_plat; | ||
| 261 | } | ||
| 262 | |||
| 263 | #ifdef CONFIG_ACPI | ||
| 264 | static int __init find_unisys_acpi_oem_table(unsigned long *oem_addr) | ||
| 265 | { | ||
| 266 | struct acpi_table_header *header = NULL; | ||
| 267 | struct es7000_oem_table *table; | ||
| 268 | acpi_size tbl_size; | ||
| 269 | acpi_status ret; | ||
| 270 | int i = 0; | ||
| 271 | |||
| 272 | for (;;) { | ||
| 273 | ret = acpi_get_table_with_size("OEM1", i++, &header, &tbl_size); | ||
| 274 | if (!ACPI_SUCCESS(ret)) | ||
| 275 | return -1; | ||
| 276 | |||
| 277 | if (!memcmp((char *) &header->oem_id, "UNISYS", 6)) | ||
| 278 | break; | ||
| 279 | |||
| 280 | early_acpi_os_unmap_memory(header, tbl_size); | ||
| 281 | } | ||
| 282 | |||
| 283 | table = (void *)header; | ||
| 284 | |||
| 285 | oem_addrX = table->OEMTableAddr; | ||
| 286 | oem_size = table->OEMTableSize; | ||
| 287 | |||
| 288 | early_acpi_os_unmap_memory(header, tbl_size); | ||
| 289 | |||
| 290 | *oem_addr = (unsigned long)__acpi_map_table(oem_addrX, oem_size); | ||
| 291 | |||
| 292 | return 0; | ||
| 293 | } | ||
| 294 | |||
| 295 | static void __init unmap_unisys_acpi_oem_table(unsigned long oem_addr) | ||
| 296 | { | ||
| 297 | if (!oem_addr) | ||
| 298 | return; | ||
| 299 | |||
| 300 | __acpi_unmap_table((char *)oem_addr, oem_size); | ||
| 301 | } | ||
| 302 | |||
| 303 | static int es7000_check_dsdt(void) | ||
| 304 | { | ||
| 305 | struct acpi_table_header header; | ||
| 306 | |||
| 307 | if (ACPI_SUCCESS(acpi_get_table_header(ACPI_SIG_DSDT, 0, &header)) && | ||
| 308 | !strncmp(header.oem_id, "UNISYS", 6)) | ||
| 309 | return 1; | ||
| 310 | return 0; | ||
| 311 | } | ||
| 312 | |||
| 313 | /* Hook from generic ACPI tables.c */ | ||
| 314 | static int __init es7000_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | ||
| 315 | { | ||
| 316 | unsigned long oem_addr = 0; | ||
| 317 | int check_dsdt; | ||
| 318 | int ret = 0; | ||
| 319 | |||
| 320 | /* check dsdt at first to avoid clear fix_map for oem_addr */ | ||
| 321 | check_dsdt = es7000_check_dsdt(); | ||
| 322 | |||
| 323 | if (!find_unisys_acpi_oem_table(&oem_addr)) { | ||
| 324 | if (check_dsdt) { | ||
| 325 | ret = parse_unisys_oem((char *)oem_addr); | ||
| 326 | } else { | ||
| 327 | setup_unisys(); | ||
| 328 | ret = 1; | ||
| 329 | } | ||
| 330 | /* | ||
| 331 | * we need to unmap it | ||
| 332 | */ | ||
| 333 | unmap_unisys_acpi_oem_table(oem_addr); | ||
| 334 | } | ||
| 335 | return ret; | ||
| 336 | } | ||
| 337 | #else /* !CONFIG_ACPI: */ | ||
| 338 | static int __init es7000_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | ||
| 339 | { | ||
| 340 | return 0; | ||
| 341 | } | ||
| 342 | #endif /* !CONFIG_ACPI */ | ||
| 343 | |||
| 344 | static void es7000_spin(int n) | ||
| 345 | { | ||
| 346 | int i = 0; | ||
| 347 | |||
| 348 | while (i++ < n) | ||
| 349 | rep_nop(); | ||
| 350 | } | ||
| 351 | |||
| 352 | static int __init | ||
| 353 | es7000_mip_write(struct mip_reg *mip_reg) | ||
| 354 | { | ||
| 355 | int status = 0; | ||
| 356 | int spin; | ||
| 357 | |||
| 358 | spin = MIP_SPIN; | ||
| 359 | while ((host_reg->off_0x38 & MIP_VALID) != 0) { | ||
| 360 | if (--spin <= 0) { | ||
| 361 | WARN(1, "Timeout waiting for Host Valid Flag\n"); | ||
| 362 | return -1; | ||
| 363 | } | ||
| 364 | es7000_spin(MIP_SPIN); | ||
| 365 | } | ||
| 366 | |||
| 367 | memcpy(host_reg, mip_reg, sizeof(struct mip_reg)); | ||
| 368 | outb(1, mip_port); | ||
| 369 | |||
| 370 | spin = MIP_SPIN; | ||
| 371 | |||
| 372 | while ((mip_reg->off_0x38 & MIP_VALID) == 0) { | ||
| 373 | if (--spin <= 0) { | ||
| 374 | WARN(1, "Timeout waiting for MIP Valid Flag\n"); | ||
| 375 | return -1; | ||
| 376 | } | ||
| 377 | es7000_spin(MIP_SPIN); | ||
| 378 | } | ||
| 379 | |||
| 380 | status = (mip_reg->off_0x00 & 0xffff0000000000ULL) >> 48; | ||
| 381 | mip_reg->off_0x38 &= ~MIP_VALID; | ||
| 382 | |||
| 383 | return status; | ||
| 384 | } | ||
| 385 | |||
| 386 | static void __init es7000_enable_apic_mode(void) | ||
| 387 | { | ||
| 388 | struct mip_reg es7000_mip_reg; | ||
| 389 | int mip_status; | ||
| 390 | |||
| 391 | if (!es7000_plat) | ||
| 392 | return; | ||
| 393 | |||
| 394 | printk(KERN_INFO "ES7000: Enabling APIC mode.\n"); | ||
| 395 | memset(&es7000_mip_reg, 0, sizeof(struct mip_reg)); | ||
| 396 | es7000_mip_reg.off_0x00 = MIP_SW_APIC; | ||
| 397 | es7000_mip_reg.off_0x38 = MIP_VALID; | ||
| 398 | |||
| 399 | while ((mip_status = es7000_mip_write(&es7000_mip_reg)) != 0) | ||
| 400 | WARN(1, "Command failed, status = %x\n", mip_status); | ||
| 401 | } | ||
| 402 | |||
| 403 | static void es7000_vector_allocation_domain(int cpu, cpumask_t *retmask) | ||
| 404 | { | ||
| 405 | /* Careful. Some cpus do not strictly honor the set of cpus | ||
| 406 | * specified in the interrupt destination when using lowest | ||
| 407 | * priority interrupt delivery mode. | ||
| 408 | * | ||
| 409 | * In particular there was a hyperthreading cpu observed to | ||
| 410 | * deliver interrupts to the wrong hyperthread when only one | ||
| 411 | * hyperthread was specified in the interrupt desitination. | ||
| 412 | */ | ||
| 413 | *retmask = (cpumask_t){ { [0] = APIC_ALL_CPUS, } }; | ||
| 414 | } | ||
| 415 | |||
| 416 | |||
| 417 | static void es7000_wait_for_init_deassert(atomic_t *deassert) | ||
| 418 | { | ||
| 419 | #ifndef CONFIG_ES7000_CLUSTERED_APIC | ||
| 420 | while (!atomic_read(deassert)) | ||
| 421 | cpu_relax(); | ||
| 422 | #endif | ||
| 423 | return; | ||
| 424 | } | ||
| 425 | |||
| 426 | static unsigned int es7000_get_apic_id(unsigned long x) | ||
| 427 | { | ||
| 428 | return (x >> 24) & 0xFF; | ||
| 429 | } | ||
| 430 | |||
| 431 | static void es7000_send_IPI_mask(const struct cpumask *mask, int vector) | ||
| 432 | { | ||
| 433 | default_send_IPI_mask_sequence_phys(mask, vector); | ||
| 434 | } | ||
| 435 | |||
| 436 | static void es7000_send_IPI_allbutself(int vector) | ||
| 437 | { | ||
| 438 | default_send_IPI_mask_allbutself_phys(cpu_online_mask, vector); | ||
| 439 | } | ||
| 440 | |||
| 441 | static void es7000_send_IPI_all(int vector) | ||
| 442 | { | ||
| 443 | es7000_send_IPI_mask(cpu_online_mask, vector); | ||
| 444 | } | ||
| 445 | |||
| 446 | static int es7000_apic_id_registered(void) | ||
| 447 | { | ||
| 448 | return 1; | ||
| 449 | } | ||
| 450 | |||
| 451 | static const cpumask_t *target_cpus_cluster(void) | ||
| 452 | { | ||
| 453 | return &CPU_MASK_ALL; | ||
| 454 | } | ||
| 455 | |||
| 456 | static const cpumask_t *es7000_target_cpus(void) | ||
| 457 | { | ||
| 458 | return &cpumask_of_cpu(smp_processor_id()); | ||
| 459 | } | ||
| 460 | |||
| 461 | static unsigned long | ||
| 462 | es7000_check_apicid_used(physid_mask_t bitmap, int apicid) | ||
| 463 | { | ||
| 464 | return 0; | ||
| 465 | } | ||
| 466 | static unsigned long es7000_check_apicid_present(int bit) | ||
| 467 | { | ||
| 468 | return physid_isset(bit, phys_cpu_present_map); | ||
| 469 | } | ||
| 470 | |||
| 471 | static unsigned long calculate_ldr(int cpu) | ||
| 472 | { | ||
| 473 | unsigned long id = per_cpu(x86_bios_cpu_apicid, cpu); | ||
| 474 | |||
| 475 | return SET_APIC_LOGICAL_ID(id); | ||
| 476 | } | ||
| 477 | |||
| 478 | /* | ||
| 479 | * Set up the logical destination ID. | ||
| 480 | * | ||
| 481 | * Intel recommends to set DFR, LdR and TPR before enabling | ||
| 482 | * an APIC. See e.g. "AP-388 82489DX User's Manual" (Intel | ||
| 483 | * document number 292116). So here it goes... | ||
| 484 | */ | ||
| 485 | static void es7000_init_apic_ldr_cluster(void) | ||
| 486 | { | ||
| 487 | unsigned long val; | ||
| 488 | int cpu = smp_processor_id(); | ||
| 489 | |||
| 490 | apic_write(APIC_DFR, APIC_DFR_CLUSTER); | ||
| 491 | val = calculate_ldr(cpu); | ||
| 492 | apic_write(APIC_LDR, val); | ||
| 493 | } | ||
| 494 | |||
| 495 | static void es7000_init_apic_ldr(void) | ||
| 496 | { | ||
| 497 | unsigned long val; | ||
| 498 | int cpu = smp_processor_id(); | ||
| 499 | |||
| 500 | apic_write(APIC_DFR, APIC_DFR_FLAT); | ||
| 501 | val = calculate_ldr(cpu); | ||
| 502 | apic_write(APIC_LDR, val); | ||
| 503 | } | ||
| 504 | |||
| 505 | static void es7000_setup_apic_routing(void) | ||
| 506 | { | ||
| 507 | int apic = per_cpu(x86_bios_cpu_apicid, smp_processor_id()); | ||
| 508 | |||
| 509 | printk(KERN_INFO | ||
| 510 | "Enabling APIC mode: %s. Using %d I/O APICs, target cpus %lx\n", | ||
| 511 | (apic_version[apic] == 0x14) ? | ||
| 512 | "Physical Cluster" : "Logical Cluster", | ||
| 513 | nr_ioapics, cpus_addr(*es7000_target_cpus())[0]); | ||
| 514 | } | ||
| 515 | |||
| 516 | static int es7000_apicid_to_node(int logical_apicid) | ||
| 517 | { | ||
| 518 | return 0; | ||
| 519 | } | ||
| 520 | |||
| 521 | |||
| 522 | static int es7000_cpu_present_to_apicid(int mps_cpu) | ||
| 523 | { | ||
| 524 | if (!mps_cpu) | ||
| 525 | return boot_cpu_physical_apicid; | ||
| 526 | else if (mps_cpu < nr_cpu_ids) | ||
| 527 | return per_cpu(x86_bios_cpu_apicid, mps_cpu); | ||
| 528 | else | ||
| 529 | return BAD_APICID; | ||
| 530 | } | ||
| 531 | |||
| 532 | static int cpu_id; | ||
| 533 | |||
| 534 | static physid_mask_t es7000_apicid_to_cpu_present(int phys_apicid) | ||
| 535 | { | ||
| 536 | physid_mask_t mask; | ||
| 537 | |||
| 538 | mask = physid_mask_of_physid(cpu_id); | ||
| 539 | ++cpu_id; | ||
| 540 | |||
| 541 | return mask; | ||
| 542 | } | ||
| 543 | |||
| 544 | /* Mapping from cpu number to logical apicid */ | ||
| 545 | static int es7000_cpu_to_logical_apicid(int cpu) | ||
| 546 | { | ||
| 547 | #ifdef CONFIG_SMP | ||
| 548 | if (cpu >= nr_cpu_ids) | ||
| 549 | return BAD_APICID; | ||
| 550 | return cpu_2_logical_apicid[cpu]; | ||
| 551 | #else | ||
| 552 | return logical_smp_processor_id(); | ||
| 553 | #endif | ||
| 554 | } | ||
| 555 | |||
| 556 | static physid_mask_t es7000_ioapic_phys_id_map(physid_mask_t phys_map) | ||
| 557 | { | ||
| 558 | /* For clustered we don't have a good way to do this yet - hack */ | ||
| 559 | return physids_promote(0xff); | ||
| 560 | } | ||
| 561 | |||
| 562 | static int es7000_check_phys_apicid_present(int cpu_physical_apicid) | ||
| 563 | { | ||
| 564 | boot_cpu_physical_apicid = read_apic_id(); | ||
| 565 | return 1; | ||
| 566 | } | ||
| 567 | |||
| 568 | static unsigned int | ||
| 569 | es7000_cpu_mask_to_apicid_cluster(const struct cpumask *cpumask) | ||
| 570 | { | ||
| 571 | int cpus_found = 0; | ||
| 572 | int num_bits_set; | ||
| 573 | int apicid; | ||
| 574 | int cpu; | ||
| 575 | |||
| 576 | num_bits_set = cpumask_weight(cpumask); | ||
| 577 | /* Return id to all */ | ||
| 578 | if (num_bits_set == nr_cpu_ids) | ||
| 579 | return 0xFF; | ||
| 580 | /* | ||
| 581 | * The cpus in the mask must all be on the apic cluster. If are not | ||
| 582 | * on the same apicid cluster return default value of target_cpus(): | ||
| 583 | */ | ||
| 584 | cpu = cpumask_first(cpumask); | ||
| 585 | apicid = es7000_cpu_to_logical_apicid(cpu); | ||
| 586 | |||
| 587 | while (cpus_found < num_bits_set) { | ||
| 588 | if (cpumask_test_cpu(cpu, cpumask)) { | ||
| 589 | int new_apicid = es7000_cpu_to_logical_apicid(cpu); | ||
| 590 | |||
| 591 | if (APIC_CLUSTER(apicid) != APIC_CLUSTER(new_apicid)) { | ||
| 592 | WARN(1, "Not a valid mask!"); | ||
| 593 | |||
| 594 | return 0xFF; | ||
| 595 | } | ||
| 596 | apicid = new_apicid; | ||
| 597 | cpus_found++; | ||
| 598 | } | ||
| 599 | cpu++; | ||
| 600 | } | ||
| 601 | return apicid; | ||
| 602 | } | ||
| 603 | |||
| 604 | static unsigned int es7000_cpu_mask_to_apicid(const cpumask_t *cpumask) | ||
| 605 | { | ||
| 606 | int cpus_found = 0; | ||
| 607 | int num_bits_set; | ||
| 608 | int apicid; | ||
| 609 | int cpu; | ||
| 610 | |||
| 611 | num_bits_set = cpus_weight(*cpumask); | ||
| 612 | /* Return id to all */ | ||
| 613 | if (num_bits_set == nr_cpu_ids) | ||
| 614 | return es7000_cpu_to_logical_apicid(0); | ||
| 615 | /* | ||
| 616 | * The cpus in the mask must all be on the apic cluster. If are not | ||
| 617 | * on the same apicid cluster return default value of target_cpus(): | ||
| 618 | */ | ||
| 619 | cpu = first_cpu(*cpumask); | ||
| 620 | apicid = es7000_cpu_to_logical_apicid(cpu); | ||
| 621 | while (cpus_found < num_bits_set) { | ||
| 622 | if (cpu_isset(cpu, *cpumask)) { | ||
| 623 | int new_apicid = es7000_cpu_to_logical_apicid(cpu); | ||
| 624 | |||
| 625 | if (APIC_CLUSTER(apicid) != APIC_CLUSTER(new_apicid)) { | ||
| 626 | printk("%s: Not a valid mask!\n", __func__); | ||
| 627 | |||
| 628 | return es7000_cpu_to_logical_apicid(0); | ||
| 629 | } | ||
| 630 | apicid = new_apicid; | ||
| 631 | cpus_found++; | ||
| 632 | } | ||
| 633 | cpu++; | ||
| 634 | } | ||
| 635 | return apicid; | ||
| 636 | } | ||
| 637 | |||
| 638 | static unsigned int | ||
| 639 | es7000_cpu_mask_to_apicid_and(const struct cpumask *inmask, | ||
| 640 | const struct cpumask *andmask) | ||
| 641 | { | ||
| 642 | int apicid = es7000_cpu_to_logical_apicid(0); | ||
| 643 | cpumask_var_t cpumask; | ||
| 644 | |||
| 645 | if (!alloc_cpumask_var(&cpumask, GFP_ATOMIC)) | ||
| 646 | return apicid; | ||
| 647 | |||
| 648 | cpumask_and(cpumask, inmask, andmask); | ||
| 649 | cpumask_and(cpumask, cpumask, cpu_online_mask); | ||
| 650 | apicid = es7000_cpu_mask_to_apicid(cpumask); | ||
| 651 | |||
| 652 | free_cpumask_var(cpumask); | ||
| 653 | |||
| 654 | return apicid; | ||
| 655 | } | ||
| 656 | |||
| 657 | static int es7000_phys_pkg_id(int cpuid_apic, int index_msb) | ||
| 658 | { | ||
| 659 | return cpuid_apic >> index_msb; | ||
| 660 | } | ||
| 661 | |||
| 662 | void __init es7000_update_apic_to_cluster(void) | ||
| 663 | { | ||
| 664 | apic->target_cpus = target_cpus_cluster; | ||
| 665 | apic->irq_delivery_mode = dest_LowestPrio; | ||
| 666 | /* logical delivery broadcast to all procs: */ | ||
| 667 | apic->irq_dest_mode = 1; | ||
| 668 | |||
| 669 | apic->init_apic_ldr = es7000_init_apic_ldr_cluster; | ||
| 670 | |||
| 671 | apic->cpu_mask_to_apicid = es7000_cpu_mask_to_apicid_cluster; | ||
| 672 | } | ||
| 673 | |||
| 674 | static int probe_es7000(void) | ||
| 675 | { | ||
| 676 | /* probed later in mptable/ACPI hooks */ | ||
| 677 | return 0; | ||
| 678 | } | ||
| 679 | |||
| 680 | static __init int | ||
| 681 | es7000_mps_oem_check(struct mpc_table *mpc, char *oem, char *productid) | ||
| 682 | { | ||
| 683 | if (mpc->oemptr) { | ||
| 684 | struct mpc_oemtable *oem_table = | ||
| 685 | (struct mpc_oemtable *)mpc->oemptr; | ||
| 686 | |||
| 687 | if (!strncmp(oem, "UNISYS", 6)) | ||
| 688 | return parse_unisys_oem((char *)oem_table); | ||
| 689 | } | ||
| 690 | return 0; | ||
| 691 | } | ||
| 692 | |||
| 693 | |||
| 694 | struct apic apic_es7000 = { | ||
| 695 | |||
| 696 | .name = "es7000", | ||
| 697 | .probe = probe_es7000, | ||
| 698 | .acpi_madt_oem_check = es7000_acpi_madt_oem_check, | ||
| 699 | .apic_id_registered = es7000_apic_id_registered, | ||
| 700 | |||
| 701 | .irq_delivery_mode = dest_Fixed, | ||
| 702 | /* phys delivery to target CPUs: */ | ||
| 703 | .irq_dest_mode = 0, | ||
| 704 | |||
| 705 | .target_cpus = es7000_target_cpus, | ||
| 706 | .disable_esr = 1, | ||
| 707 | .dest_logical = 0, | ||
| 708 | .check_apicid_used = es7000_check_apicid_used, | ||
| 709 | .check_apicid_present = es7000_check_apicid_present, | ||
| 710 | |||
| 711 | .vector_allocation_domain = es7000_vector_allocation_domain, | ||
| 712 | .init_apic_ldr = es7000_init_apic_ldr, | ||
| 713 | |||
| 714 | .ioapic_phys_id_map = es7000_ioapic_phys_id_map, | ||
| 715 | .setup_apic_routing = es7000_setup_apic_routing, | ||
| 716 | .multi_timer_check = NULL, | ||
| 717 | .apicid_to_node = es7000_apicid_to_node, | ||
| 718 | .cpu_to_logical_apicid = es7000_cpu_to_logical_apicid, | ||
| 719 | .cpu_present_to_apicid = es7000_cpu_present_to_apicid, | ||
| 720 | .apicid_to_cpu_present = es7000_apicid_to_cpu_present, | ||
| 721 | .setup_portio_remap = NULL, | ||
| 722 | .check_phys_apicid_present = es7000_check_phys_apicid_present, | ||
| 723 | .enable_apic_mode = es7000_enable_apic_mode, | ||
| 724 | .phys_pkg_id = es7000_phys_pkg_id, | ||
| 725 | .mps_oem_check = es7000_mps_oem_check, | ||
| 726 | |||
| 727 | .get_apic_id = es7000_get_apic_id, | ||
| 728 | .set_apic_id = NULL, | ||
| 729 | .apic_id_mask = 0xFF << 24, | ||
| 730 | |||
| 731 | .cpu_mask_to_apicid = es7000_cpu_mask_to_apicid, | ||
| 732 | .cpu_mask_to_apicid_and = es7000_cpu_mask_to_apicid_and, | ||
| 733 | |||
| 734 | .send_IPI_mask = es7000_send_IPI_mask, | ||
| 735 | .send_IPI_mask_allbutself = NULL, | ||
| 736 | .send_IPI_allbutself = es7000_send_IPI_allbutself, | ||
| 737 | .send_IPI_all = es7000_send_IPI_all, | ||
| 738 | .send_IPI_self = default_send_IPI_self, | ||
| 739 | |||
| 740 | .wakeup_cpu = NULL, | ||
| 741 | |||
| 742 | .trampoline_phys_low = 0x467, | ||
| 743 | .trampoline_phys_high = 0x469, | ||
| 744 | |||
| 745 | .wait_for_init_deassert = es7000_wait_for_init_deassert, | ||
| 746 | |||
| 747 | /* Nothing to do for most platforms, since cleared by the INIT cycle: */ | ||
| 748 | .smp_callin_clear_local_apic = NULL, | ||
| 749 | .inquire_remote_apic = default_inquire_remote_apic, | ||
| 750 | |||
| 751 | .read = native_apic_mem_read, | ||
| 752 | .write = native_apic_mem_write, | ||
| 753 | .icr_read = native_apic_icr_read, | ||
| 754 | .icr_write = native_apic_icr_write, | ||
| 755 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
| 756 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
| 757 | }; | ||
diff --git a/arch/x86/kernel/io_apic.c b/arch/x86/kernel/apic/io_apic.c index bc7ac4da90d7..00e6071cefc4 100644 --- a/arch/x86/kernel/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Intel IO-APIC support for multi-Pentium hosts. | 2 | * Intel IO-APIC support for multi-Pentium hosts. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 1997, 1998, 1999, 2000 Ingo Molnar, Hajnalka Szabo | 4 | * Copyright (C) 1997, 1998, 1999, 2000, 2009 Ingo Molnar, Hajnalka Szabo |
| 5 | * | 5 | * |
| 6 | * Many thanks to Stig Venaas for trying out countless experimental | 6 | * Many thanks to Stig Venaas for trying out countless experimental |
| 7 | * patches and reporting/debugging problems patiently! | 7 | * patches and reporting/debugging problems patiently! |
| @@ -46,6 +46,7 @@ | |||
| 46 | #include <asm/idle.h> | 46 | #include <asm/idle.h> |
| 47 | #include <asm/io.h> | 47 | #include <asm/io.h> |
| 48 | #include <asm/smp.h> | 48 | #include <asm/smp.h> |
| 49 | #include <asm/cpu.h> | ||
| 49 | #include <asm/desc.h> | 50 | #include <asm/desc.h> |
| 50 | #include <asm/proto.h> | 51 | #include <asm/proto.h> |
| 51 | #include <asm/acpi.h> | 52 | #include <asm/acpi.h> |
| @@ -61,9 +62,7 @@ | |||
| 61 | #include <asm/uv/uv_hub.h> | 62 | #include <asm/uv/uv_hub.h> |
| 62 | #include <asm/uv/uv_irq.h> | 63 | #include <asm/uv/uv_irq.h> |
| 63 | 64 | ||
| 64 | #include <mach_ipi.h> | 65 | #include <asm/apic.h> |
| 65 | #include <mach_apic.h> | ||
| 66 | #include <mach_apicdef.h> | ||
| 67 | 66 | ||
| 68 | #define __apicdebuginit(type) static type __init | 67 | #define __apicdebuginit(type) static type __init |
| 69 | 68 | ||
| @@ -82,11 +81,11 @@ static DEFINE_SPINLOCK(vector_lock); | |||
| 82 | int nr_ioapic_registers[MAX_IO_APICS]; | 81 | int nr_ioapic_registers[MAX_IO_APICS]; |
| 83 | 82 | ||
| 84 | /* I/O APIC entries */ | 83 | /* I/O APIC entries */ |
| 85 | struct mp_config_ioapic mp_ioapics[MAX_IO_APICS]; | 84 | struct mpc_ioapic mp_ioapics[MAX_IO_APICS]; |
| 86 | int nr_ioapics; | 85 | int nr_ioapics; |
| 87 | 86 | ||
| 88 | /* MP IRQ source entries */ | 87 | /* MP IRQ source entries */ |
| 89 | struct mp_config_intsrc mp_irqs[MAX_IRQ_SOURCES]; | 88 | struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES]; |
| 90 | 89 | ||
| 91 | /* # of MP IRQ source entries */ | 90 | /* # of MP IRQ source entries */ |
| 92 | int mp_irq_entries; | 91 | int mp_irq_entries; |
| @@ -99,10 +98,19 @@ DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES); | |||
| 99 | 98 | ||
| 100 | int skip_ioapic_setup; | 99 | int skip_ioapic_setup; |
| 101 | 100 | ||
| 101 | void arch_disable_smp_support(void) | ||
| 102 | { | ||
| 103 | #ifdef CONFIG_PCI | ||
| 104 | noioapicquirk = 1; | ||
| 105 | noioapicreroute = -1; | ||
| 106 | #endif | ||
| 107 | skip_ioapic_setup = 1; | ||
| 108 | } | ||
| 109 | |||
| 102 | static int __init parse_noapic(char *str) | 110 | static int __init parse_noapic(char *str) |
| 103 | { | 111 | { |
| 104 | /* disable IO-APIC */ | 112 | /* disable IO-APIC */ |
| 105 | disable_ioapic_setup(); | 113 | arch_disable_smp_support(); |
| 106 | return 0; | 114 | return 0; |
| 107 | } | 115 | } |
| 108 | early_param("noapic", parse_noapic); | 116 | early_param("noapic", parse_noapic); |
| @@ -356,7 +364,7 @@ set_extra_move_desc(struct irq_desc *desc, const struct cpumask *mask) | |||
| 356 | 364 | ||
| 357 | if (!cfg->move_in_progress) { | 365 | if (!cfg->move_in_progress) { |
| 358 | /* it means that domain is not changed */ | 366 | /* it means that domain is not changed */ |
| 359 | if (!cpumask_intersects(&desc->affinity, mask)) | 367 | if (!cpumask_intersects(desc->affinity, mask)) |
| 360 | cfg->move_desc_pending = 1; | 368 | cfg->move_desc_pending = 1; |
| 361 | } | 369 | } |
| 362 | } | 370 | } |
| @@ -386,7 +394,7 @@ struct io_apic { | |||
| 386 | static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx) | 394 | static __attribute_const__ struct io_apic __iomem *io_apic_base(int idx) |
| 387 | { | 395 | { |
| 388 | return (void __iomem *) __fix_to_virt(FIX_IO_APIC_BASE_0 + idx) | 396 | return (void __iomem *) __fix_to_virt(FIX_IO_APIC_BASE_0 + idx) |
| 389 | + (mp_ioapics[idx].mp_apicaddr & ~PAGE_MASK); | 397 | + (mp_ioapics[idx].apicaddr & ~PAGE_MASK); |
| 390 | } | 398 | } |
| 391 | 399 | ||
| 392 | static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) | 400 | static inline unsigned int io_apic_read(unsigned int apic, unsigned int reg) |
| @@ -478,7 +486,7 @@ __ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e) | |||
| 478 | io_apic_write(apic, 0x10 + 2*pin, eu.w1); | 486 | io_apic_write(apic, 0x10 + 2*pin, eu.w1); |
| 479 | } | 487 | } |
| 480 | 488 | ||
| 481 | static void ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e) | 489 | void ioapic_write_entry(int apic, int pin, struct IO_APIC_route_entry e) |
| 482 | { | 490 | { |
| 483 | unsigned long flags; | 491 | unsigned long flags; |
| 484 | spin_lock_irqsave(&ioapic_lock, flags); | 492 | spin_lock_irqsave(&ioapic_lock, flags); |
| @@ -513,11 +521,11 @@ static void send_cleanup_vector(struct irq_cfg *cfg) | |||
| 513 | for_each_cpu_and(i, cfg->old_domain, cpu_online_mask) | 521 | for_each_cpu_and(i, cfg->old_domain, cpu_online_mask) |
| 514 | cfg->move_cleanup_count++; | 522 | cfg->move_cleanup_count++; |
| 515 | for_each_cpu_and(i, cfg->old_domain, cpu_online_mask) | 523 | for_each_cpu_and(i, cfg->old_domain, cpu_online_mask) |
| 516 | send_IPI_mask(cpumask_of(i), IRQ_MOVE_CLEANUP_VECTOR); | 524 | apic->send_IPI_mask(cpumask_of(i), IRQ_MOVE_CLEANUP_VECTOR); |
| 517 | } else { | 525 | } else { |
| 518 | cpumask_and(cleanup_mask, cfg->old_domain, cpu_online_mask); | 526 | cpumask_and(cleanup_mask, cfg->old_domain, cpu_online_mask); |
| 519 | cfg->move_cleanup_count = cpumask_weight(cleanup_mask); | 527 | cfg->move_cleanup_count = cpumask_weight(cleanup_mask); |
| 520 | send_IPI_mask(cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR); | 528 | apic->send_IPI_mask(cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR); |
| 521 | free_cpumask_var(cleanup_mask); | 529 | free_cpumask_var(cleanup_mask); |
| 522 | } | 530 | } |
| 523 | cfg->move_in_progress = 0; | 531 | cfg->move_in_progress = 0; |
| @@ -562,8 +570,9 @@ static int | |||
| 562 | assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask); | 570 | assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask); |
| 563 | 571 | ||
| 564 | /* | 572 | /* |
| 565 | * Either sets desc->affinity to a valid value, and returns cpu_mask_to_apicid | 573 | * Either sets desc->affinity to a valid value, and returns |
| 566 | * of that, or returns BAD_APICID and leaves desc->affinity untouched. | 574 | * ->cpu_mask_to_apicid of that, or returns BAD_APICID and |
| 575 | * leaves desc->affinity untouched. | ||
| 567 | */ | 576 | */ |
| 568 | static unsigned int | 577 | static unsigned int |
| 569 | set_desc_affinity(struct irq_desc *desc, const struct cpumask *mask) | 578 | set_desc_affinity(struct irq_desc *desc, const struct cpumask *mask) |
| @@ -579,9 +588,10 @@ set_desc_affinity(struct irq_desc *desc, const struct cpumask *mask) | |||
| 579 | if (assign_irq_vector(irq, cfg, mask)) | 588 | if (assign_irq_vector(irq, cfg, mask)) |
| 580 | return BAD_APICID; | 589 | return BAD_APICID; |
| 581 | 590 | ||
| 582 | cpumask_and(&desc->affinity, cfg->domain, mask); | 591 | cpumask_and(desc->affinity, cfg->domain, mask); |
| 583 | set_extra_move_desc(desc, mask); | 592 | set_extra_move_desc(desc, mask); |
| 584 | return cpu_mask_to_apicid_and(&desc->affinity, cpu_online_mask); | 593 | |
| 594 | return apic->cpu_mask_to_apicid_and(desc->affinity, cpu_online_mask); | ||
| 585 | } | 595 | } |
| 586 | 596 | ||
| 587 | static void | 597 | static void |
| @@ -796,23 +806,6 @@ static void clear_IO_APIC (void) | |||
| 796 | clear_IO_APIC_pin(apic, pin); | 806 | clear_IO_APIC_pin(apic, pin); |
| 797 | } | 807 | } |
| 798 | 808 | ||
| 799 | #if !defined(CONFIG_SMP) && defined(CONFIG_X86_32) | ||
| 800 | void send_IPI_self(int vector) | ||
| 801 | { | ||
| 802 | unsigned int cfg; | ||
| 803 | |||
| 804 | /* | ||
| 805 | * Wait for idle. | ||
| 806 | */ | ||
| 807 | apic_wait_icr_idle(); | ||
| 808 | cfg = APIC_DM_FIXED | APIC_DEST_SELF | vector | APIC_DEST_LOGICAL; | ||
| 809 | /* | ||
| 810 | * Send the IPI. The write to APIC_ICR fires this off. | ||
| 811 | */ | ||
| 812 | apic_write(APIC_ICR, cfg); | ||
| 813 | } | ||
| 814 | #endif /* !CONFIG_SMP && CONFIG_X86_32*/ | ||
| 815 | |||
| 816 | #ifdef CONFIG_X86_32 | 809 | #ifdef CONFIG_X86_32 |
| 817 | /* | 810 | /* |
| 818 | * support for broken MP BIOSs, enables hand-redirection of PIRQ0-7 to | 811 | * support for broken MP BIOSs, enables hand-redirection of PIRQ0-7 to |
| @@ -820,8 +813,9 @@ void send_IPI_self(int vector) | |||
| 820 | */ | 813 | */ |
| 821 | 814 | ||
| 822 | #define MAX_PIRQS 8 | 815 | #define MAX_PIRQS 8 |
| 823 | static int pirq_entries [MAX_PIRQS]; | 816 | static int pirq_entries[MAX_PIRQS] = { |
| 824 | static int pirqs_enabled; | 817 | [0 ... MAX_PIRQS - 1] = -1 |
| 818 | }; | ||
| 825 | 819 | ||
| 826 | static int __init ioapic_pirq_setup(char *str) | 820 | static int __init ioapic_pirq_setup(char *str) |
| 827 | { | 821 | { |
| @@ -830,10 +824,6 @@ static int __init ioapic_pirq_setup(char *str) | |||
| 830 | 824 | ||
| 831 | get_options(str, ARRAY_SIZE(ints), ints); | 825 | get_options(str, ARRAY_SIZE(ints), ints); |
| 832 | 826 | ||
| 833 | for (i = 0; i < MAX_PIRQS; i++) | ||
| 834 | pirq_entries[i] = -1; | ||
| 835 | |||
| 836 | pirqs_enabled = 1; | ||
| 837 | apic_printk(APIC_VERBOSE, KERN_INFO | 827 | apic_printk(APIC_VERBOSE, KERN_INFO |
| 838 | "PIRQ redirection, working around broken MP-BIOS.\n"); | 828 | "PIRQ redirection, working around broken MP-BIOS.\n"); |
| 839 | max = MAX_PIRQS; | 829 | max = MAX_PIRQS; |
| @@ -944,10 +934,10 @@ static int find_irq_entry(int apic, int pin, int type) | |||
| 944 | int i; | 934 | int i; |
| 945 | 935 | ||
| 946 | for (i = 0; i < mp_irq_entries; i++) | 936 | for (i = 0; i < mp_irq_entries; i++) |
| 947 | if (mp_irqs[i].mp_irqtype == type && | 937 | if (mp_irqs[i].irqtype == type && |
| 948 | (mp_irqs[i].mp_dstapic == mp_ioapics[apic].mp_apicid || | 938 | (mp_irqs[i].dstapic == mp_ioapics[apic].apicid || |
| 949 | mp_irqs[i].mp_dstapic == MP_APIC_ALL) && | 939 | mp_irqs[i].dstapic == MP_APIC_ALL) && |
| 950 | mp_irqs[i].mp_dstirq == pin) | 940 | mp_irqs[i].dstirq == pin) |
| 951 | return i; | 941 | return i; |
| 952 | 942 | ||
| 953 | return -1; | 943 | return -1; |
| @@ -961,13 +951,13 @@ static int __init find_isa_irq_pin(int irq, int type) | |||
| 961 | int i; | 951 | int i; |
| 962 | 952 | ||
| 963 | for (i = 0; i < mp_irq_entries; i++) { | 953 | for (i = 0; i < mp_irq_entries; i++) { |
| 964 | int lbus = mp_irqs[i].mp_srcbus; | 954 | int lbus = mp_irqs[i].srcbus; |
| 965 | 955 | ||
| 966 | if (test_bit(lbus, mp_bus_not_pci) && | 956 | if (test_bit(lbus, mp_bus_not_pci) && |
| 967 | (mp_irqs[i].mp_irqtype == type) && | 957 | (mp_irqs[i].irqtype == type) && |
| 968 | (mp_irqs[i].mp_srcbusirq == irq)) | 958 | (mp_irqs[i].srcbusirq == irq)) |
| 969 | 959 | ||
| 970 | return mp_irqs[i].mp_dstirq; | 960 | return mp_irqs[i].dstirq; |
| 971 | } | 961 | } |
| 972 | return -1; | 962 | return -1; |
| 973 | } | 963 | } |
| @@ -977,17 +967,17 @@ static int __init find_isa_irq_apic(int irq, int type) | |||
| 977 | int i; | 967 | int i; |
| 978 | 968 | ||
| 979 | for (i = 0; i < mp_irq_entries; i++) { | 969 | for (i = 0; i < mp_irq_entries; i++) { |
| 980 | int lbus = mp_irqs[i].mp_srcbus; | 970 | int lbus = mp_irqs[i].srcbus; |
| 981 | 971 | ||
| 982 | if (test_bit(lbus, mp_bus_not_pci) && | 972 | if (test_bit(lbus, mp_bus_not_pci) && |
| 983 | (mp_irqs[i].mp_irqtype == type) && | 973 | (mp_irqs[i].irqtype == type) && |
| 984 | (mp_irqs[i].mp_srcbusirq == irq)) | 974 | (mp_irqs[i].srcbusirq == irq)) |
| 985 | break; | 975 | break; |
| 986 | } | 976 | } |
| 987 | if (i < mp_irq_entries) { | 977 | if (i < mp_irq_entries) { |
| 988 | int apic; | 978 | int apic; |
| 989 | for(apic = 0; apic < nr_ioapics; apic++) { | 979 | for(apic = 0; apic < nr_ioapics; apic++) { |
| 990 | if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mp_dstapic) | 980 | if (mp_ioapics[apic].apicid == mp_irqs[i].dstapic) |
| 991 | return apic; | 981 | return apic; |
| 992 | } | 982 | } |
| 993 | } | 983 | } |
| @@ -1012,23 +1002,23 @@ int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin) | |||
| 1012 | return -1; | 1002 | return -1; |
| 1013 | } | 1003 | } |
| 1014 | for (i = 0; i < mp_irq_entries; i++) { | 1004 | for (i = 0; i < mp_irq_entries; i++) { |
| 1015 | int lbus = mp_irqs[i].mp_srcbus; | 1005 | int lbus = mp_irqs[i].srcbus; |
| 1016 | 1006 | ||
| 1017 | for (apic = 0; apic < nr_ioapics; apic++) | 1007 | for (apic = 0; apic < nr_ioapics; apic++) |
| 1018 | if (mp_ioapics[apic].mp_apicid == mp_irqs[i].mp_dstapic || | 1008 | if (mp_ioapics[apic].apicid == mp_irqs[i].dstapic || |
| 1019 | mp_irqs[i].mp_dstapic == MP_APIC_ALL) | 1009 | mp_irqs[i].dstapic == MP_APIC_ALL) |
| 1020 | break; | 1010 | break; |
| 1021 | 1011 | ||
| 1022 | if (!test_bit(lbus, mp_bus_not_pci) && | 1012 | if (!test_bit(lbus, mp_bus_not_pci) && |
| 1023 | !mp_irqs[i].mp_irqtype && | 1013 | !mp_irqs[i].irqtype && |
| 1024 | (bus == lbus) && | 1014 | (bus == lbus) && |
| 1025 | (slot == ((mp_irqs[i].mp_srcbusirq >> 2) & 0x1f))) { | 1015 | (slot == ((mp_irqs[i].srcbusirq >> 2) & 0x1f))) { |
| 1026 | int irq = pin_2_irq(i,apic,mp_irqs[i].mp_dstirq); | 1016 | int irq = pin_2_irq(i, apic, mp_irqs[i].dstirq); |
| 1027 | 1017 | ||
| 1028 | if (!(apic || IO_APIC_IRQ(irq))) | 1018 | if (!(apic || IO_APIC_IRQ(irq))) |
| 1029 | continue; | 1019 | continue; |
| 1030 | 1020 | ||
| 1031 | if (pin == (mp_irqs[i].mp_srcbusirq & 3)) | 1021 | if (pin == (mp_irqs[i].srcbusirq & 3)) |
| 1032 | return irq; | 1022 | return irq; |
| 1033 | /* | 1023 | /* |
| 1034 | * Use the first all-but-pin matching entry as a | 1024 | * Use the first all-but-pin matching entry as a |
| @@ -1071,7 +1061,7 @@ static int EISA_ELCR(unsigned int irq) | |||
| 1071 | * EISA conforming in the MP table, that means its trigger type must | 1061 | * EISA conforming in the MP table, that means its trigger type must |
| 1072 | * be read in from the ELCR */ | 1062 | * be read in from the ELCR */ |
| 1073 | 1063 | ||
| 1074 | #define default_EISA_trigger(idx) (EISA_ELCR(mp_irqs[idx].mp_srcbusirq)) | 1064 | #define default_EISA_trigger(idx) (EISA_ELCR(mp_irqs[idx].srcbusirq)) |
| 1075 | #define default_EISA_polarity(idx) default_ISA_polarity(idx) | 1065 | #define default_EISA_polarity(idx) default_ISA_polarity(idx) |
| 1076 | 1066 | ||
| 1077 | /* PCI interrupts are always polarity one level triggered, | 1067 | /* PCI interrupts are always polarity one level triggered, |
| @@ -1088,13 +1078,13 @@ static int EISA_ELCR(unsigned int irq) | |||
| 1088 | 1078 | ||
| 1089 | static int MPBIOS_polarity(int idx) | 1079 | static int MPBIOS_polarity(int idx) |
| 1090 | { | 1080 | { |
| 1091 | int bus = mp_irqs[idx].mp_srcbus; | 1081 | int bus = mp_irqs[idx].srcbus; |
| 1092 | int polarity; | 1082 | int polarity; |
| 1093 | 1083 | ||
| 1094 | /* | 1084 | /* |
| 1095 | * Determine IRQ line polarity (high active or low active): | 1085 | * Determine IRQ line polarity (high active or low active): |
| 1096 | */ | 1086 | */ |
| 1097 | switch (mp_irqs[idx].mp_irqflag & 3) | 1087 | switch (mp_irqs[idx].irqflag & 3) |
| 1098 | { | 1088 | { |
| 1099 | case 0: /* conforms, ie. bus-type dependent polarity */ | 1089 | case 0: /* conforms, ie. bus-type dependent polarity */ |
| 1100 | if (test_bit(bus, mp_bus_not_pci)) | 1090 | if (test_bit(bus, mp_bus_not_pci)) |
| @@ -1130,13 +1120,13 @@ static int MPBIOS_polarity(int idx) | |||
| 1130 | 1120 | ||
| 1131 | static int MPBIOS_trigger(int idx) | 1121 | static int MPBIOS_trigger(int idx) |
| 1132 | { | 1122 | { |
| 1133 | int bus = mp_irqs[idx].mp_srcbus; | 1123 | int bus = mp_irqs[idx].srcbus; |
| 1134 | int trigger; | 1124 | int trigger; |
| 1135 | 1125 | ||
| 1136 | /* | 1126 | /* |
| 1137 | * Determine IRQ trigger mode (edge or level sensitive): | 1127 | * Determine IRQ trigger mode (edge or level sensitive): |
| 1138 | */ | 1128 | */ |
| 1139 | switch ((mp_irqs[idx].mp_irqflag>>2) & 3) | 1129 | switch ((mp_irqs[idx].irqflag>>2) & 3) |
| 1140 | { | 1130 | { |
| 1141 | case 0: /* conforms, ie. bus-type dependent */ | 1131 | case 0: /* conforms, ie. bus-type dependent */ |
| 1142 | if (test_bit(bus, mp_bus_not_pci)) | 1132 | if (test_bit(bus, mp_bus_not_pci)) |
| @@ -1214,16 +1204,16 @@ int (*ioapic_renumber_irq)(int ioapic, int irq); | |||
| 1214 | static int pin_2_irq(int idx, int apic, int pin) | 1204 | static int pin_2_irq(int idx, int apic, int pin) |
| 1215 | { | 1205 | { |
| 1216 | int irq, i; | 1206 | int irq, i; |
| 1217 | int bus = mp_irqs[idx].mp_srcbus; | 1207 | int bus = mp_irqs[idx].srcbus; |
| 1218 | 1208 | ||
| 1219 | /* | 1209 | /* |
| 1220 | * Debugging check, we are in big trouble if this message pops up! | 1210 | * Debugging check, we are in big trouble if this message pops up! |
| 1221 | */ | 1211 | */ |
| 1222 | if (mp_irqs[idx].mp_dstirq != pin) | 1212 | if (mp_irqs[idx].dstirq != pin) |
| 1223 | printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n"); | 1213 | printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n"); |
| 1224 | 1214 | ||
| 1225 | if (test_bit(bus, mp_bus_not_pci)) { | 1215 | if (test_bit(bus, mp_bus_not_pci)) { |
| 1226 | irq = mp_irqs[idx].mp_srcbusirq; | 1216 | irq = mp_irqs[idx].srcbusirq; |
| 1227 | } else { | 1217 | } else { |
| 1228 | /* | 1218 | /* |
| 1229 | * PCI IRQs are mapped in order | 1219 | * PCI IRQs are mapped in order |
| @@ -1315,7 +1305,7 @@ __assign_irq_vector(int irq, struct irq_cfg *cfg, const struct cpumask *mask) | |||
| 1315 | int new_cpu; | 1305 | int new_cpu; |
| 1316 | int vector, offset; | 1306 | int vector, offset; |
| 1317 | 1307 | ||
| 1318 | vector_allocation_domain(cpu, tmp_mask); | 1308 | apic->vector_allocation_domain(cpu, tmp_mask); |
| 1319 | 1309 | ||
| 1320 | vector = current_vector; | 1310 | vector = current_vector; |
| 1321 | offset = current_offset; | 1311 | offset = current_offset; |
| @@ -1485,10 +1475,10 @@ static void ioapic_register_intr(int irq, struct irq_desc *desc, unsigned long t | |||
| 1485 | handle_edge_irq, "edge"); | 1475 | handle_edge_irq, "edge"); |
| 1486 | } | 1476 | } |
| 1487 | 1477 | ||
| 1488 | static int setup_ioapic_entry(int apic, int irq, | 1478 | int setup_ioapic_entry(int apic_id, int irq, |
| 1489 | struct IO_APIC_route_entry *entry, | 1479 | struct IO_APIC_route_entry *entry, |
| 1490 | unsigned int destination, int trigger, | 1480 | unsigned int destination, int trigger, |
| 1491 | int polarity, int vector) | 1481 | int polarity, int vector) |
| 1492 | { | 1482 | { |
| 1493 | /* | 1483 | /* |
| 1494 | * add it to the IO-APIC irq-routing table: | 1484 | * add it to the IO-APIC irq-routing table: |
| @@ -1497,25 +1487,25 @@ static int setup_ioapic_entry(int apic, int irq, | |||
| 1497 | 1487 | ||
| 1498 | #ifdef CONFIG_INTR_REMAP | 1488 | #ifdef CONFIG_INTR_REMAP |
| 1499 | if (intr_remapping_enabled) { | 1489 | if (intr_remapping_enabled) { |
| 1500 | struct intel_iommu *iommu = map_ioapic_to_ir(apic); | 1490 | struct intel_iommu *iommu = map_ioapic_to_ir(apic_id); |
| 1501 | struct irte irte; | 1491 | struct irte irte; |
| 1502 | struct IR_IO_APIC_route_entry *ir_entry = | 1492 | struct IR_IO_APIC_route_entry *ir_entry = |
| 1503 | (struct IR_IO_APIC_route_entry *) entry; | 1493 | (struct IR_IO_APIC_route_entry *) entry; |
| 1504 | int index; | 1494 | int index; |
| 1505 | 1495 | ||
| 1506 | if (!iommu) | 1496 | if (!iommu) |
| 1507 | panic("No mapping iommu for ioapic %d\n", apic); | 1497 | panic("No mapping iommu for ioapic %d\n", apic_id); |
| 1508 | 1498 | ||
| 1509 | index = alloc_irte(iommu, irq, 1); | 1499 | index = alloc_irte(iommu, irq, 1); |
| 1510 | if (index < 0) | 1500 | if (index < 0) |
| 1511 | panic("Failed to allocate IRTE for ioapic %d\n", apic); | 1501 | panic("Failed to allocate IRTE for ioapic %d\n", apic_id); |
| 1512 | 1502 | ||
| 1513 | memset(&irte, 0, sizeof(irte)); | 1503 | memset(&irte, 0, sizeof(irte)); |
| 1514 | 1504 | ||
| 1515 | irte.present = 1; | 1505 | irte.present = 1; |
| 1516 | irte.dst_mode = INT_DEST_MODE; | 1506 | irte.dst_mode = apic->irq_dest_mode; |
| 1517 | irte.trigger_mode = trigger; | 1507 | irte.trigger_mode = trigger; |
| 1518 | irte.dlvry_mode = INT_DELIVERY_MODE; | 1508 | irte.dlvry_mode = apic->irq_delivery_mode; |
| 1519 | irte.vector = vector; | 1509 | irte.vector = vector; |
| 1520 | irte.dest_id = IRTE_DEST(destination); | 1510 | irte.dest_id = IRTE_DEST(destination); |
| 1521 | 1511 | ||
| @@ -1528,8 +1518,8 @@ static int setup_ioapic_entry(int apic, int irq, | |||
| 1528 | } else | 1518 | } else |
| 1529 | #endif | 1519 | #endif |
| 1530 | { | 1520 | { |
| 1531 | entry->delivery_mode = INT_DELIVERY_MODE; | 1521 | entry->delivery_mode = apic->irq_delivery_mode; |
| 1532 | entry->dest_mode = INT_DEST_MODE; | 1522 | entry->dest_mode = apic->irq_dest_mode; |
| 1533 | entry->dest = destination; | 1523 | entry->dest = destination; |
| 1534 | } | 1524 | } |
| 1535 | 1525 | ||
| @@ -1546,7 +1536,7 @@ static int setup_ioapic_entry(int apic, int irq, | |||
| 1546 | return 0; | 1536 | return 0; |
| 1547 | } | 1537 | } |
| 1548 | 1538 | ||
| 1549 | static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq, struct irq_desc *desc, | 1539 | static void setup_IO_APIC_irq(int apic_id, int pin, unsigned int irq, struct irq_desc *desc, |
| 1550 | int trigger, int polarity) | 1540 | int trigger, int polarity) |
| 1551 | { | 1541 | { |
| 1552 | struct irq_cfg *cfg; | 1542 | struct irq_cfg *cfg; |
| @@ -1558,22 +1548,22 @@ static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq, struct irq_de | |||
| 1558 | 1548 | ||
| 1559 | cfg = desc->chip_data; | 1549 | cfg = desc->chip_data; |
| 1560 | 1550 | ||
| 1561 | if (assign_irq_vector(irq, cfg, TARGET_CPUS)) | 1551 | if (assign_irq_vector(irq, cfg, apic->target_cpus())) |
| 1562 | return; | 1552 | return; |
| 1563 | 1553 | ||
| 1564 | dest = cpu_mask_to_apicid_and(cfg->domain, TARGET_CPUS); | 1554 | dest = apic->cpu_mask_to_apicid_and(cfg->domain, apic->target_cpus()); |
| 1565 | 1555 | ||
| 1566 | apic_printk(APIC_VERBOSE,KERN_DEBUG | 1556 | apic_printk(APIC_VERBOSE,KERN_DEBUG |
| 1567 | "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> " | 1557 | "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> " |
| 1568 | "IRQ %d Mode:%i Active:%i)\n", | 1558 | "IRQ %d Mode:%i Active:%i)\n", |
| 1569 | apic, mp_ioapics[apic].mp_apicid, pin, cfg->vector, | 1559 | apic_id, mp_ioapics[apic_id].apicid, pin, cfg->vector, |
| 1570 | irq, trigger, polarity); | 1560 | irq, trigger, polarity); |
| 1571 | 1561 | ||
| 1572 | 1562 | ||
| 1573 | if (setup_ioapic_entry(mp_ioapics[apic].mp_apicid, irq, &entry, | 1563 | if (setup_ioapic_entry(mp_ioapics[apic_id].apicid, irq, &entry, |
| 1574 | dest, trigger, polarity, cfg->vector)) { | 1564 | dest, trigger, polarity, cfg->vector)) { |
| 1575 | printk("Failed to setup ioapic entry for ioapic %d, pin %d\n", | 1565 | printk("Failed to setup ioapic entry for ioapic %d, pin %d\n", |
| 1576 | mp_ioapics[apic].mp_apicid, pin); | 1566 | mp_ioapics[apic_id].apicid, pin); |
| 1577 | __clear_irq_vector(irq, cfg); | 1567 | __clear_irq_vector(irq, cfg); |
| 1578 | return; | 1568 | return; |
| 1579 | } | 1569 | } |
| @@ -1582,12 +1572,12 @@ static void setup_IO_APIC_irq(int apic, int pin, unsigned int irq, struct irq_de | |||
| 1582 | if (irq < NR_IRQS_LEGACY) | 1572 | if (irq < NR_IRQS_LEGACY) |
| 1583 | disable_8259A_irq(irq); | 1573 | disable_8259A_irq(irq); |
| 1584 | 1574 | ||
| 1585 | ioapic_write_entry(apic, pin, entry); | 1575 | ioapic_write_entry(apic_id, pin, entry); |
| 1586 | } | 1576 | } |
| 1587 | 1577 | ||
| 1588 | static void __init setup_IO_APIC_irqs(void) | 1578 | static void __init setup_IO_APIC_irqs(void) |
| 1589 | { | 1579 | { |
| 1590 | int apic, pin, idx, irq; | 1580 | int apic_id, pin, idx, irq; |
| 1591 | int notcon = 0; | 1581 | int notcon = 0; |
| 1592 | struct irq_desc *desc; | 1582 | struct irq_desc *desc; |
| 1593 | struct irq_cfg *cfg; | 1583 | struct irq_cfg *cfg; |
| @@ -1595,21 +1585,19 @@ static void __init setup_IO_APIC_irqs(void) | |||
| 1595 | 1585 | ||
| 1596 | apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n"); | 1586 | apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n"); |
| 1597 | 1587 | ||
| 1598 | for (apic = 0; apic < nr_ioapics; apic++) { | 1588 | for (apic_id = 0; apic_id < nr_ioapics; apic_id++) { |
| 1599 | for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) { | 1589 | for (pin = 0; pin < nr_ioapic_registers[apic_id]; pin++) { |
| 1600 | 1590 | ||
| 1601 | idx = find_irq_entry(apic, pin, mp_INT); | 1591 | idx = find_irq_entry(apic_id, pin, mp_INT); |
| 1602 | if (idx == -1) { | 1592 | if (idx == -1) { |
| 1603 | if (!notcon) { | 1593 | if (!notcon) { |
| 1604 | notcon = 1; | 1594 | notcon = 1; |
| 1605 | apic_printk(APIC_VERBOSE, | 1595 | apic_printk(APIC_VERBOSE, |
| 1606 | KERN_DEBUG " %d-%d", | 1596 | KERN_DEBUG " %d-%d", |
| 1607 | mp_ioapics[apic].mp_apicid, | 1597 | mp_ioapics[apic_id].apicid, pin); |
| 1608 | pin); | ||
| 1609 | } else | 1598 | } else |
| 1610 | apic_printk(APIC_VERBOSE, " %d-%d", | 1599 | apic_printk(APIC_VERBOSE, " %d-%d", |
| 1611 | mp_ioapics[apic].mp_apicid, | 1600 | mp_ioapics[apic_id].apicid, pin); |
| 1612 | pin); | ||
| 1613 | continue; | 1601 | continue; |
| 1614 | } | 1602 | } |
| 1615 | if (notcon) { | 1603 | if (notcon) { |
| @@ -1618,20 +1606,25 @@ static void __init setup_IO_APIC_irqs(void) | |||
| 1618 | notcon = 0; | 1606 | notcon = 0; |
| 1619 | } | 1607 | } |
| 1620 | 1608 | ||
| 1621 | irq = pin_2_irq(idx, apic, pin); | 1609 | irq = pin_2_irq(idx, apic_id, pin); |
| 1622 | #ifdef CONFIG_X86_32 | 1610 | |
| 1623 | if (multi_timer_check(apic, irq)) | 1611 | /* |
| 1612 | * Skip the timer IRQ if there's a quirk handler | ||
| 1613 | * installed and if it returns 1: | ||
| 1614 | */ | ||
| 1615 | if (apic->multi_timer_check && | ||
| 1616 | apic->multi_timer_check(apic_id, irq)) | ||
| 1624 | continue; | 1617 | continue; |
| 1625 | #endif | 1618 | |
| 1626 | desc = irq_to_desc_alloc_cpu(irq, cpu); | 1619 | desc = irq_to_desc_alloc_cpu(irq, cpu); |
| 1627 | if (!desc) { | 1620 | if (!desc) { |
| 1628 | printk(KERN_INFO "can not get irq_desc for %d\n", irq); | 1621 | printk(KERN_INFO "can not get irq_desc for %d\n", irq); |
| 1629 | continue; | 1622 | continue; |
| 1630 | } | 1623 | } |
| 1631 | cfg = desc->chip_data; | 1624 | cfg = desc->chip_data; |
| 1632 | add_pin_to_irq_cpu(cfg, cpu, apic, pin); | 1625 | add_pin_to_irq_cpu(cfg, cpu, apic_id, pin); |
| 1633 | 1626 | ||
| 1634 | setup_IO_APIC_irq(apic, pin, irq, desc, | 1627 | setup_IO_APIC_irq(apic_id, pin, irq, desc, |
| 1635 | irq_trigger(idx), irq_polarity(idx)); | 1628 | irq_trigger(idx), irq_polarity(idx)); |
| 1636 | } | 1629 | } |
| 1637 | } | 1630 | } |
| @@ -1644,7 +1637,7 @@ static void __init setup_IO_APIC_irqs(void) | |||
| 1644 | /* | 1637 | /* |
| 1645 | * Set up the timer pin, possibly with the 8259A-master behind. | 1638 | * Set up the timer pin, possibly with the 8259A-master behind. |
| 1646 | */ | 1639 | */ |
| 1647 | static void __init setup_timer_IRQ0_pin(unsigned int apic, unsigned int pin, | 1640 | static void __init setup_timer_IRQ0_pin(unsigned int apic_id, unsigned int pin, |
| 1648 | int vector) | 1641 | int vector) |
| 1649 | { | 1642 | { |
| 1650 | struct IO_APIC_route_entry entry; | 1643 | struct IO_APIC_route_entry entry; |
| @@ -1660,10 +1653,10 @@ static void __init setup_timer_IRQ0_pin(unsigned int apic, unsigned int pin, | |||
| 1660 | * We use logical delivery to get the timer IRQ | 1653 | * We use logical delivery to get the timer IRQ |
| 1661 | * to the first CPU. | 1654 | * to the first CPU. |
| 1662 | */ | 1655 | */ |
| 1663 | entry.dest_mode = INT_DEST_MODE; | 1656 | entry.dest_mode = apic->irq_dest_mode; |
| 1664 | entry.mask = 1; /* mask IRQ now */ | 1657 | entry.mask = 0; /* don't mask IRQ for edge */ |
| 1665 | entry.dest = cpu_mask_to_apicid(TARGET_CPUS); | 1658 | entry.dest = apic->cpu_mask_to_apicid(apic->target_cpus()); |
| 1666 | entry.delivery_mode = INT_DELIVERY_MODE; | 1659 | entry.delivery_mode = apic->irq_delivery_mode; |
| 1667 | entry.polarity = 0; | 1660 | entry.polarity = 0; |
| 1668 | entry.trigger = 0; | 1661 | entry.trigger = 0; |
| 1669 | entry.vector = vector; | 1662 | entry.vector = vector; |
| @@ -1677,7 +1670,7 @@ static void __init setup_timer_IRQ0_pin(unsigned int apic, unsigned int pin, | |||
| 1677 | /* | 1670 | /* |
| 1678 | * Add it to the IO-APIC irq-routing table: | 1671 | * Add it to the IO-APIC irq-routing table: |
| 1679 | */ | 1672 | */ |
| 1680 | ioapic_write_entry(apic, pin, entry); | 1673 | ioapic_write_entry(apic_id, pin, entry); |
| 1681 | } | 1674 | } |
| 1682 | 1675 | ||
| 1683 | 1676 | ||
| @@ -1699,7 +1692,7 @@ __apicdebuginit(void) print_IO_APIC(void) | |||
| 1699 | printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries); | 1692 | printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries); |
| 1700 | for (i = 0; i < nr_ioapics; i++) | 1693 | for (i = 0; i < nr_ioapics; i++) |
| 1701 | printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n", | 1694 | printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n", |
| 1702 | mp_ioapics[i].mp_apicid, nr_ioapic_registers[i]); | 1695 | mp_ioapics[i].apicid, nr_ioapic_registers[i]); |
| 1703 | 1696 | ||
| 1704 | /* | 1697 | /* |
| 1705 | * We are a bit conservative about what we expect. We have to | 1698 | * We are a bit conservative about what we expect. We have to |
| @@ -1719,7 +1712,7 @@ __apicdebuginit(void) print_IO_APIC(void) | |||
| 1719 | spin_unlock_irqrestore(&ioapic_lock, flags); | 1712 | spin_unlock_irqrestore(&ioapic_lock, flags); |
| 1720 | 1713 | ||
| 1721 | printk("\n"); | 1714 | printk("\n"); |
| 1722 | printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].mp_apicid); | 1715 | printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].apicid); |
| 1723 | printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw); | 1716 | printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw); |
| 1724 | printk(KERN_DEBUG "....... : physical APIC id: %02X\n", reg_00.bits.ID); | 1717 | printk(KERN_DEBUG "....... : physical APIC id: %02X\n", reg_00.bits.ID); |
| 1725 | printk(KERN_DEBUG "....... : Delivery Type: %X\n", reg_00.bits.delivery_type); | 1718 | printk(KERN_DEBUG "....... : Delivery Type: %X\n", reg_00.bits.delivery_type); |
| @@ -1980,13 +1973,6 @@ void __init enable_IO_APIC(void) | |||
| 1980 | int apic; | 1973 | int apic; |
| 1981 | unsigned long flags; | 1974 | unsigned long flags; |
| 1982 | 1975 | ||
| 1983 | #ifdef CONFIG_X86_32 | ||
| 1984 | int i; | ||
| 1985 | if (!pirqs_enabled) | ||
| 1986 | for (i = 0; i < MAX_PIRQS; i++) | ||
| 1987 | pirq_entries[i] = -1; | ||
| 1988 | #endif | ||
| 1989 | |||
| 1990 | /* | 1976 | /* |
| 1991 | * The number of IO-APIC IRQ registers (== #pins): | 1977 | * The number of IO-APIC IRQ registers (== #pins): |
| 1992 | */ | 1978 | */ |
| @@ -2090,7 +2076,7 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
| 2090 | { | 2076 | { |
| 2091 | union IO_APIC_reg_00 reg_00; | 2077 | union IO_APIC_reg_00 reg_00; |
| 2092 | physid_mask_t phys_id_present_map; | 2078 | physid_mask_t phys_id_present_map; |
| 2093 | int apic; | 2079 | int apic_id; |
| 2094 | int i; | 2080 | int i; |
| 2095 | unsigned char old_id; | 2081 | unsigned char old_id; |
| 2096 | unsigned long flags; | 2082 | unsigned long flags; |
| @@ -2109,26 +2095,26 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
| 2109 | * This is broken; anything with a real cpu count has to | 2095 | * This is broken; anything with a real cpu count has to |
| 2110 | * circumvent this idiocy regardless. | 2096 | * circumvent this idiocy regardless. |
| 2111 | */ | 2097 | */ |
| 2112 | phys_id_present_map = ioapic_phys_id_map(phys_cpu_present_map); | 2098 | phys_id_present_map = apic->ioapic_phys_id_map(phys_cpu_present_map); |
| 2113 | 2099 | ||
| 2114 | /* | 2100 | /* |
| 2115 | * Set the IOAPIC ID to the value stored in the MPC table. | 2101 | * Set the IOAPIC ID to the value stored in the MPC table. |
| 2116 | */ | 2102 | */ |
| 2117 | for (apic = 0; apic < nr_ioapics; apic++) { | 2103 | for (apic_id = 0; apic_id < nr_ioapics; apic_id++) { |
| 2118 | 2104 | ||
| 2119 | /* Read the register 0 value */ | 2105 | /* Read the register 0 value */ |
| 2120 | spin_lock_irqsave(&ioapic_lock, flags); | 2106 | spin_lock_irqsave(&ioapic_lock, flags); |
| 2121 | reg_00.raw = io_apic_read(apic, 0); | 2107 | reg_00.raw = io_apic_read(apic_id, 0); |
| 2122 | spin_unlock_irqrestore(&ioapic_lock, flags); | 2108 | spin_unlock_irqrestore(&ioapic_lock, flags); |
| 2123 | 2109 | ||
| 2124 | old_id = mp_ioapics[apic].mp_apicid; | 2110 | old_id = mp_ioapics[apic_id].apicid; |
| 2125 | 2111 | ||
| 2126 | if (mp_ioapics[apic].mp_apicid >= get_physical_broadcast()) { | 2112 | if (mp_ioapics[apic_id].apicid >= get_physical_broadcast()) { |
| 2127 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n", | 2113 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n", |
| 2128 | apic, mp_ioapics[apic].mp_apicid); | 2114 | apic_id, mp_ioapics[apic_id].apicid); |
| 2129 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", | 2115 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", |
| 2130 | reg_00.bits.ID); | 2116 | reg_00.bits.ID); |
| 2131 | mp_ioapics[apic].mp_apicid = reg_00.bits.ID; | 2117 | mp_ioapics[apic_id].apicid = reg_00.bits.ID; |
| 2132 | } | 2118 | } |
| 2133 | 2119 | ||
| 2134 | /* | 2120 | /* |
| @@ -2136,10 +2122,10 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
| 2136 | * system must have a unique ID or we get lots of nice | 2122 | * system must have a unique ID or we get lots of nice |
| 2137 | * 'stuck on smp_invalidate_needed IPI wait' messages. | 2123 | * 'stuck on smp_invalidate_needed IPI wait' messages. |
| 2138 | */ | 2124 | */ |
| 2139 | if (check_apicid_used(phys_id_present_map, | 2125 | if (apic->check_apicid_used(phys_id_present_map, |
| 2140 | mp_ioapics[apic].mp_apicid)) { | 2126 | mp_ioapics[apic_id].apicid)) { |
| 2141 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n", | 2127 | printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n", |
| 2142 | apic, mp_ioapics[apic].mp_apicid); | 2128 | apic_id, mp_ioapics[apic_id].apicid); |
| 2143 | for (i = 0; i < get_physical_broadcast(); i++) | 2129 | for (i = 0; i < get_physical_broadcast(); i++) |
| 2144 | if (!physid_isset(i, phys_id_present_map)) | 2130 | if (!physid_isset(i, phys_id_present_map)) |
| 2145 | break; | 2131 | break; |
| @@ -2148,13 +2134,13 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
| 2148 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", | 2134 | printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n", |
| 2149 | i); | 2135 | i); |
| 2150 | physid_set(i, phys_id_present_map); | 2136 | physid_set(i, phys_id_present_map); |
| 2151 | mp_ioapics[apic].mp_apicid = i; | 2137 | mp_ioapics[apic_id].apicid = i; |
| 2152 | } else { | 2138 | } else { |
| 2153 | physid_mask_t tmp; | 2139 | physid_mask_t tmp; |
| 2154 | tmp = apicid_to_cpu_present(mp_ioapics[apic].mp_apicid); | 2140 | tmp = apic->apicid_to_cpu_present(mp_ioapics[apic_id].apicid); |
| 2155 | apic_printk(APIC_VERBOSE, "Setting %d in the " | 2141 | apic_printk(APIC_VERBOSE, "Setting %d in the " |
| 2156 | "phys_id_present_map\n", | 2142 | "phys_id_present_map\n", |
| 2157 | mp_ioapics[apic].mp_apicid); | 2143 | mp_ioapics[apic_id].apicid); |
| 2158 | physids_or(phys_id_present_map, phys_id_present_map, tmp); | 2144 | physids_or(phys_id_present_map, phys_id_present_map, tmp); |
| 2159 | } | 2145 | } |
| 2160 | 2146 | ||
| @@ -2163,11 +2149,11 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
| 2163 | * We need to adjust the IRQ routing table | 2149 | * We need to adjust the IRQ routing table |
| 2164 | * if the ID changed. | 2150 | * if the ID changed. |
| 2165 | */ | 2151 | */ |
| 2166 | if (old_id != mp_ioapics[apic].mp_apicid) | 2152 | if (old_id != mp_ioapics[apic_id].apicid) |
| 2167 | for (i = 0; i < mp_irq_entries; i++) | 2153 | for (i = 0; i < mp_irq_entries; i++) |
| 2168 | if (mp_irqs[i].mp_dstapic == old_id) | 2154 | if (mp_irqs[i].dstapic == old_id) |
| 2169 | mp_irqs[i].mp_dstapic | 2155 | mp_irqs[i].dstapic |
| 2170 | = mp_ioapics[apic].mp_apicid; | 2156 | = mp_ioapics[apic_id].apicid; |
| 2171 | 2157 | ||
| 2172 | /* | 2158 | /* |
| 2173 | * Read the right value from the MPC table and | 2159 | * Read the right value from the MPC table and |
| @@ -2175,20 +2161,20 @@ static void __init setup_ioapic_ids_from_mpc(void) | |||
| 2175 | */ | 2161 | */ |
| 2176 | apic_printk(APIC_VERBOSE, KERN_INFO | 2162 | apic_printk(APIC_VERBOSE, KERN_INFO |
| 2177 | "...changing IO-APIC physical APIC ID to %d ...", | 2163 | "...changing IO-APIC physical APIC ID to %d ...", |
| 2178 | mp_ioapics[apic].mp_apicid); | 2164 | mp_ioapics[apic_id].apicid); |
| 2179 | 2165 | ||
| 2180 | reg_00.bits.ID = mp_ioapics[apic].mp_apicid; | 2166 | reg_00.bits.ID = mp_ioapics[apic_id].apicid; |
| 2181 | spin_lock_irqsave(&ioapic_lock, flags); | 2167 | spin_lock_irqsave(&ioapic_lock, flags); |
| 2182 | io_apic_write(apic, 0, reg_00.raw); | 2168 | io_apic_write(apic_id, 0, reg_00.raw); |
| 2183 | spin_unlock_irqrestore(&ioapic_lock, flags); | 2169 | spin_unlock_irqrestore(&ioapic_lock, flags); |
| 2184 | 2170 | ||
| 2185 | /* | 2171 | /* |
| 2186 | * Sanity check | 2172 | * Sanity check |
| 2187 | */ | 2173 | */ |
| 2188 | spin_lock_irqsave(&ioapic_lock, flags); | 2174 | spin_lock_irqsave(&ioapic_lock, flags); |
| 2189 | reg_00.raw = io_apic_read(apic, 0); | 2175 | reg_00.raw = io_apic_read(apic_id, 0); |
| 2190 | spin_unlock_irqrestore(&ioapic_lock, flags); | 2176 | spin_unlock_irqrestore(&ioapic_lock, flags); |
| 2191 | if (reg_00.bits.ID != mp_ioapics[apic].mp_apicid) | 2177 | if (reg_00.bits.ID != mp_ioapics[apic_id].apicid) |
| 2192 | printk("could not set ID!\n"); | 2178 | printk("could not set ID!\n"); |
| 2193 | else | 2179 | else |
| 2194 | apic_printk(APIC_VERBOSE, " ok.\n"); | 2180 | apic_printk(APIC_VERBOSE, " ok.\n"); |
| @@ -2291,7 +2277,7 @@ static int ioapic_retrigger_irq(unsigned int irq) | |||
| 2291 | unsigned long flags; | 2277 | unsigned long flags; |
| 2292 | 2278 | ||
| 2293 | spin_lock_irqsave(&vector_lock, flags); | 2279 | spin_lock_irqsave(&vector_lock, flags); |
| 2294 | send_IPI_mask(cpumask_of(cpumask_first(cfg->domain)), cfg->vector); | 2280 | apic->send_IPI_mask(cpumask_of(cpumask_first(cfg->domain)), cfg->vector); |
| 2295 | spin_unlock_irqrestore(&vector_lock, flags); | 2281 | spin_unlock_irqrestore(&vector_lock, flags); |
| 2296 | 2282 | ||
| 2297 | return 1; | 2283 | return 1; |
| @@ -2299,7 +2285,7 @@ static int ioapic_retrigger_irq(unsigned int irq) | |||
| 2299 | #else | 2285 | #else |
| 2300 | static int ioapic_retrigger_irq(unsigned int irq) | 2286 | static int ioapic_retrigger_irq(unsigned int irq) |
| 2301 | { | 2287 | { |
| 2302 | send_IPI_self(irq_cfg(irq)->vector); | 2288 | apic->send_IPI_self(irq_cfg(irq)->vector); |
| 2303 | 2289 | ||
| 2304 | return 1; | 2290 | return 1; |
| 2305 | } | 2291 | } |
| @@ -2363,7 +2349,7 @@ migrate_ioapic_irq_desc(struct irq_desc *desc, const struct cpumask *mask) | |||
| 2363 | 2349 | ||
| 2364 | set_extra_move_desc(desc, mask); | 2350 | set_extra_move_desc(desc, mask); |
| 2365 | 2351 | ||
| 2366 | dest = cpu_mask_to_apicid_and(cfg->domain, mask); | 2352 | dest = apic->cpu_mask_to_apicid_and(cfg->domain, mask); |
| 2367 | 2353 | ||
| 2368 | modify_ioapic_rte = desc->status & IRQ_LEVEL; | 2354 | modify_ioapic_rte = desc->status & IRQ_LEVEL; |
| 2369 | if (modify_ioapic_rte) { | 2355 | if (modify_ioapic_rte) { |
| @@ -2383,7 +2369,7 @@ migrate_ioapic_irq_desc(struct irq_desc *desc, const struct cpumask *mask) | |||
| 2383 | if (cfg->move_in_progress) | 2369 | if (cfg->move_in_progress) |
| 2384 | send_cleanup_vector(cfg); | 2370 | send_cleanup_vector(cfg); |
| 2385 | 2371 | ||
| 2386 | cpumask_copy(&desc->affinity, mask); | 2372 | cpumask_copy(desc->affinity, mask); |
| 2387 | } | 2373 | } |
| 2388 | 2374 | ||
| 2389 | static int migrate_irq_remapped_level_desc(struct irq_desc *desc) | 2375 | static int migrate_irq_remapped_level_desc(struct irq_desc *desc) |
| @@ -2405,11 +2391,11 @@ static int migrate_irq_remapped_level_desc(struct irq_desc *desc) | |||
| 2405 | } | 2391 | } |
| 2406 | 2392 | ||
| 2407 | /* everthing is clear. we have right of way */ | 2393 | /* everthing is clear. we have right of way */ |
| 2408 | migrate_ioapic_irq_desc(desc, &desc->pending_mask); | 2394 | migrate_ioapic_irq_desc(desc, desc->pending_mask); |
| 2409 | 2395 | ||
| 2410 | ret = 0; | 2396 | ret = 0; |
| 2411 | desc->status &= ~IRQ_MOVE_PENDING; | 2397 | desc->status &= ~IRQ_MOVE_PENDING; |
| 2412 | cpumask_clear(&desc->pending_mask); | 2398 | cpumask_clear(desc->pending_mask); |
| 2413 | 2399 | ||
| 2414 | unmask: | 2400 | unmask: |
| 2415 | unmask_IO_APIC_irq_desc(desc); | 2401 | unmask_IO_APIC_irq_desc(desc); |
| @@ -2434,7 +2420,7 @@ static void ir_irq_migration(struct work_struct *work) | |||
| 2434 | continue; | 2420 | continue; |
| 2435 | } | 2421 | } |
| 2436 | 2422 | ||
| 2437 | desc->chip->set_affinity(irq, &desc->pending_mask); | 2423 | desc->chip->set_affinity(irq, desc->pending_mask); |
| 2438 | spin_unlock_irqrestore(&desc->lock, flags); | 2424 | spin_unlock_irqrestore(&desc->lock, flags); |
| 2439 | } | 2425 | } |
| 2440 | } | 2426 | } |
| @@ -2448,7 +2434,7 @@ static void set_ir_ioapic_affinity_irq_desc(struct irq_desc *desc, | |||
| 2448 | { | 2434 | { |
| 2449 | if (desc->status & IRQ_LEVEL) { | 2435 | if (desc->status & IRQ_LEVEL) { |
| 2450 | desc->status |= IRQ_MOVE_PENDING; | 2436 | desc->status |= IRQ_MOVE_PENDING; |
| 2451 | cpumask_copy(&desc->pending_mask, mask); | 2437 | cpumask_copy(desc->pending_mask, mask); |
| 2452 | migrate_irq_remapped_level_desc(desc); | 2438 | migrate_irq_remapped_level_desc(desc); |
| 2453 | return; | 2439 | return; |
| 2454 | } | 2440 | } |
| @@ -2516,7 +2502,7 @@ static void irq_complete_move(struct irq_desc **descp) | |||
| 2516 | 2502 | ||
| 2517 | /* domain has not changed, but affinity did */ | 2503 | /* domain has not changed, but affinity did */ |
| 2518 | me = smp_processor_id(); | 2504 | me = smp_processor_id(); |
| 2519 | if (cpu_isset(me, desc->affinity)) { | 2505 | if (cpumask_test_cpu(me, desc->affinity)) { |
| 2520 | *descp = desc = move_irq_desc(desc, me); | 2506 | *descp = desc = move_irq_desc(desc, me); |
| 2521 | /* get the new one */ | 2507 | /* get the new one */ |
| 2522 | cfg = desc->chip_data; | 2508 | cfg = desc->chip_data; |
| @@ -2867,19 +2853,15 @@ static inline void __init check_timer(void) | |||
| 2867 | int cpu = boot_cpu_id; | 2853 | int cpu = boot_cpu_id; |
| 2868 | int apic1, pin1, apic2, pin2; | 2854 | int apic1, pin1, apic2, pin2; |
| 2869 | unsigned long flags; | 2855 | unsigned long flags; |
| 2870 | unsigned int ver; | ||
| 2871 | int no_pin1 = 0; | 2856 | int no_pin1 = 0; |
| 2872 | 2857 | ||
| 2873 | local_irq_save(flags); | 2858 | local_irq_save(flags); |
| 2874 | 2859 | ||
| 2875 | ver = apic_read(APIC_LVR); | ||
| 2876 | ver = GET_APIC_VERSION(ver); | ||
| 2877 | |||
| 2878 | /* | 2860 | /* |
| 2879 | * get/set the timer IRQ vector: | 2861 | * get/set the timer IRQ vector: |
| 2880 | */ | 2862 | */ |
| 2881 | disable_8259A_irq(0); | 2863 | disable_8259A_irq(0); |
| 2882 | assign_irq_vector(0, cfg, TARGET_CPUS); | 2864 | assign_irq_vector(0, cfg, apic->target_cpus()); |
| 2883 | 2865 | ||
| 2884 | /* | 2866 | /* |
| 2885 | * As IRQ0 is to be enabled in the 8259A, the virtual | 2867 | * As IRQ0 is to be enabled in the 8259A, the virtual |
| @@ -2893,7 +2875,13 @@ static inline void __init check_timer(void) | |||
| 2893 | apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT); | 2875 | apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT); |
| 2894 | init_8259A(1); | 2876 | init_8259A(1); |
| 2895 | #ifdef CONFIG_X86_32 | 2877 | #ifdef CONFIG_X86_32 |
| 2896 | timer_ack = (nmi_watchdog == NMI_IO_APIC && !APIC_INTEGRATED(ver)); | 2878 | { |
| 2879 | unsigned int ver; | ||
| 2880 | |||
| 2881 | ver = apic_read(APIC_LVR); | ||
| 2882 | ver = GET_APIC_VERSION(ver); | ||
| 2883 | timer_ack = (nmi_watchdog == NMI_IO_APIC && !APIC_INTEGRATED(ver)); | ||
| 2884 | } | ||
| 2897 | #endif | 2885 | #endif |
| 2898 | 2886 | ||
| 2899 | pin1 = find_isa_irq_pin(0, mp_INT); | 2887 | pin1 = find_isa_irq_pin(0, mp_INT); |
| @@ -2932,8 +2920,17 @@ static inline void __init check_timer(void) | |||
| 2932 | if (no_pin1) { | 2920 | if (no_pin1) { |
| 2933 | add_pin_to_irq_cpu(cfg, cpu, apic1, pin1); | 2921 | add_pin_to_irq_cpu(cfg, cpu, apic1, pin1); |
| 2934 | setup_timer_IRQ0_pin(apic1, pin1, cfg->vector); | 2922 | setup_timer_IRQ0_pin(apic1, pin1, cfg->vector); |
| 2923 | } else { | ||
| 2924 | /* for edge trigger, setup_IO_APIC_irq already | ||
| 2925 | * leave it unmasked. | ||
| 2926 | * so only need to unmask if it is level-trigger | ||
| 2927 | * do we really have level trigger timer? | ||
| 2928 | */ | ||
| 2929 | int idx; | ||
| 2930 | idx = find_irq_entry(apic1, pin1, mp_INT); | ||
| 2931 | if (idx != -1 && irq_trigger(idx)) | ||
| 2932 | unmask_IO_APIC_irq_desc(desc); | ||
| 2935 | } | 2933 | } |
| 2936 | unmask_IO_APIC_irq_desc(desc); | ||
| 2937 | if (timer_irq_works()) { | 2934 | if (timer_irq_works()) { |
| 2938 | if (nmi_watchdog == NMI_IO_APIC) { | 2935 | if (nmi_watchdog == NMI_IO_APIC) { |
| 2939 | setup_nmi(); | 2936 | setup_nmi(); |
| @@ -2947,6 +2944,7 @@ static inline void __init check_timer(void) | |||
| 2947 | if (intr_remapping_enabled) | 2944 | if (intr_remapping_enabled) |
| 2948 | panic("timer doesn't work through Interrupt-remapped IO-APIC"); | 2945 | panic("timer doesn't work through Interrupt-remapped IO-APIC"); |
| 2949 | #endif | 2946 | #endif |
| 2947 | local_irq_disable(); | ||
| 2950 | clear_IO_APIC_pin(apic1, pin1); | 2948 | clear_IO_APIC_pin(apic1, pin1); |
| 2951 | if (!no_pin1) | 2949 | if (!no_pin1) |
| 2952 | apic_printk(APIC_QUIET, KERN_ERR "..MP-BIOS bug: " | 2950 | apic_printk(APIC_QUIET, KERN_ERR "..MP-BIOS bug: " |
| @@ -2961,7 +2959,6 @@ static inline void __init check_timer(void) | |||
| 2961 | */ | 2959 | */ |
| 2962 | replace_pin_at_irq_cpu(cfg, cpu, apic1, pin1, apic2, pin2); | 2960 | replace_pin_at_irq_cpu(cfg, cpu, apic1, pin1, apic2, pin2); |
| 2963 | setup_timer_IRQ0_pin(apic2, pin2, cfg->vector); | 2961 | setup_timer_IRQ0_pin(apic2, pin2, cfg->vector); |
| 2964 | unmask_IO_APIC_irq_desc(desc); | ||
| 2965 | enable_8259A_irq(0); | 2962 | enable_8259A_irq(0); |
| 2966 | if (timer_irq_works()) { | 2963 | if (timer_irq_works()) { |
| 2967 | apic_printk(APIC_QUIET, KERN_INFO "....... works.\n"); | 2964 | apic_printk(APIC_QUIET, KERN_INFO "....... works.\n"); |
| @@ -2976,6 +2973,7 @@ static inline void __init check_timer(void) | |||
| 2976 | /* | 2973 | /* |
| 2977 | * Cleanup, just in case ... | 2974 | * Cleanup, just in case ... |
| 2978 | */ | 2975 | */ |
| 2976 | local_irq_disable(); | ||
| 2979 | disable_8259A_irq(0); | 2977 | disable_8259A_irq(0); |
| 2980 | clear_IO_APIC_pin(apic2, pin2); | 2978 | clear_IO_APIC_pin(apic2, pin2); |
| 2981 | apic_printk(APIC_QUIET, KERN_INFO "....... failed.\n"); | 2979 | apic_printk(APIC_QUIET, KERN_INFO "....... failed.\n"); |
| @@ -3001,6 +2999,7 @@ static inline void __init check_timer(void) | |||
| 3001 | apic_printk(APIC_QUIET, KERN_INFO "..... works.\n"); | 2999 | apic_printk(APIC_QUIET, KERN_INFO "..... works.\n"); |
| 3002 | goto out; | 3000 | goto out; |
| 3003 | } | 3001 | } |
| 3002 | local_irq_disable(); | ||
| 3004 | disable_8259A_irq(0); | 3003 | disable_8259A_irq(0); |
| 3005 | apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | cfg->vector); | 3004 | apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | cfg->vector); |
| 3006 | apic_printk(APIC_QUIET, KERN_INFO "..... failed.\n"); | 3005 | apic_printk(APIC_QUIET, KERN_INFO "..... failed.\n"); |
| @@ -3018,6 +3017,7 @@ static inline void __init check_timer(void) | |||
| 3018 | apic_printk(APIC_QUIET, KERN_INFO "..... works.\n"); | 3017 | apic_printk(APIC_QUIET, KERN_INFO "..... works.\n"); |
| 3019 | goto out; | 3018 | goto out; |
| 3020 | } | 3019 | } |
| 3020 | local_irq_disable(); | ||
| 3021 | apic_printk(APIC_QUIET, KERN_INFO "..... failed :(.\n"); | 3021 | apic_printk(APIC_QUIET, KERN_INFO "..... failed :(.\n"); |
| 3022 | panic("IO-APIC + timer doesn't work! Boot with apic=debug and send a " | 3022 | panic("IO-APIC + timer doesn't work! Boot with apic=debug and send a " |
| 3023 | "report. Then try booting with the 'noapic' option.\n"); | 3023 | "report. Then try booting with the 'noapic' option.\n"); |
| @@ -3047,13 +3047,9 @@ out: | |||
| 3047 | void __init setup_IO_APIC(void) | 3047 | void __init setup_IO_APIC(void) |
| 3048 | { | 3048 | { |
| 3049 | 3049 | ||
| 3050 | #ifdef CONFIG_X86_32 | ||
| 3051 | enable_IO_APIC(); | ||
| 3052 | #else | ||
| 3053 | /* | 3050 | /* |
| 3054 | * calling enable_IO_APIC() is moved to setup_local_APIC for BP | 3051 | * calling enable_IO_APIC() is moved to setup_local_APIC for BP |
| 3055 | */ | 3052 | */ |
| 3056 | #endif | ||
| 3057 | 3053 | ||
| 3058 | io_apic_irqs = ~PIC_IRQS; | 3054 | io_apic_irqs = ~PIC_IRQS; |
| 3059 | 3055 | ||
| @@ -3118,8 +3114,8 @@ static int ioapic_resume(struct sys_device *dev) | |||
| 3118 | 3114 | ||
| 3119 | spin_lock_irqsave(&ioapic_lock, flags); | 3115 | spin_lock_irqsave(&ioapic_lock, flags); |
| 3120 | reg_00.raw = io_apic_read(dev->id, 0); | 3116 | reg_00.raw = io_apic_read(dev->id, 0); |
| 3121 | if (reg_00.bits.ID != mp_ioapics[dev->id].mp_apicid) { | 3117 | if (reg_00.bits.ID != mp_ioapics[dev->id].apicid) { |
| 3122 | reg_00.bits.ID = mp_ioapics[dev->id].mp_apicid; | 3118 | reg_00.bits.ID = mp_ioapics[dev->id].apicid; |
| 3123 | io_apic_write(dev->id, 0, reg_00.raw); | 3119 | io_apic_write(dev->id, 0, reg_00.raw); |
| 3124 | } | 3120 | } |
| 3125 | spin_unlock_irqrestore(&ioapic_lock, flags); | 3121 | spin_unlock_irqrestore(&ioapic_lock, flags); |
| @@ -3169,6 +3165,7 @@ static int __init ioapic_init_sysfs(void) | |||
| 3169 | 3165 | ||
| 3170 | device_initcall(ioapic_init_sysfs); | 3166 | device_initcall(ioapic_init_sysfs); |
| 3171 | 3167 | ||
| 3168 | static int nr_irqs_gsi = NR_IRQS_LEGACY; | ||
| 3172 | /* | 3169 | /* |
| 3173 | * Dynamic irq allocate and deallocation | 3170 | * Dynamic irq allocate and deallocation |
| 3174 | */ | 3171 | */ |
| @@ -3183,11 +3180,11 @@ unsigned int create_irq_nr(unsigned int irq_want) | |||
| 3183 | struct irq_desc *desc_new = NULL; | 3180 | struct irq_desc *desc_new = NULL; |
| 3184 | 3181 | ||
| 3185 | irq = 0; | 3182 | irq = 0; |
| 3186 | spin_lock_irqsave(&vector_lock, flags); | 3183 | if (irq_want < nr_irqs_gsi) |
| 3187 | for (new = irq_want; new < NR_IRQS; new++) { | 3184 | irq_want = nr_irqs_gsi; |
| 3188 | if (platform_legacy_irq(new)) | ||
| 3189 | continue; | ||
| 3190 | 3185 | ||
| 3186 | spin_lock_irqsave(&vector_lock, flags); | ||
| 3187 | for (new = irq_want; new < nr_irqs; new++) { | ||
| 3191 | desc_new = irq_to_desc_alloc_cpu(new, cpu); | 3188 | desc_new = irq_to_desc_alloc_cpu(new, cpu); |
| 3192 | if (!desc_new) { | 3189 | if (!desc_new) { |
| 3193 | printk(KERN_INFO "can not get irq_desc for %d\n", new); | 3190 | printk(KERN_INFO "can not get irq_desc for %d\n", new); |
| @@ -3197,7 +3194,7 @@ unsigned int create_irq_nr(unsigned int irq_want) | |||
| 3197 | 3194 | ||
| 3198 | if (cfg_new->vector != 0) | 3195 | if (cfg_new->vector != 0) |
| 3199 | continue; | 3196 | continue; |
| 3200 | if (__assign_irq_vector(new, cfg_new, TARGET_CPUS) == 0) | 3197 | if (__assign_irq_vector(new, cfg_new, apic->target_cpus()) == 0) |
| 3201 | irq = new; | 3198 | irq = new; |
| 3202 | break; | 3199 | break; |
| 3203 | } | 3200 | } |
| @@ -3212,7 +3209,6 @@ unsigned int create_irq_nr(unsigned int irq_want) | |||
| 3212 | return irq; | 3209 | return irq; |
| 3213 | } | 3210 | } |
| 3214 | 3211 | ||
| 3215 | static int nr_irqs_gsi = NR_IRQS_LEGACY; | ||
| 3216 | int create_irq(void) | 3212 | int create_irq(void) |
| 3217 | { | 3213 | { |
| 3218 | unsigned int irq_want; | 3214 | unsigned int irq_want; |
| @@ -3259,12 +3255,15 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_ms | |||
| 3259 | int err; | 3255 | int err; |
| 3260 | unsigned dest; | 3256 | unsigned dest; |
| 3261 | 3257 | ||
| 3258 | if (disable_apic) | ||
| 3259 | return -ENXIO; | ||
| 3260 | |||
| 3262 | cfg = irq_cfg(irq); | 3261 | cfg = irq_cfg(irq); |
| 3263 | err = assign_irq_vector(irq, cfg, TARGET_CPUS); | 3262 | err = assign_irq_vector(irq, cfg, apic->target_cpus()); |
| 3264 | if (err) | 3263 | if (err) |
| 3265 | return err; | 3264 | return err; |
| 3266 | 3265 | ||
| 3267 | dest = cpu_mask_to_apicid_and(cfg->domain, TARGET_CPUS); | 3266 | dest = apic->cpu_mask_to_apicid_and(cfg->domain, apic->target_cpus()); |
| 3268 | 3267 | ||
| 3269 | #ifdef CONFIG_INTR_REMAP | 3268 | #ifdef CONFIG_INTR_REMAP |
| 3270 | if (irq_remapped(irq)) { | 3269 | if (irq_remapped(irq)) { |
| @@ -3278,9 +3277,9 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_ms | |||
| 3278 | memset (&irte, 0, sizeof(irte)); | 3277 | memset (&irte, 0, sizeof(irte)); |
| 3279 | 3278 | ||
| 3280 | irte.present = 1; | 3279 | irte.present = 1; |
| 3281 | irte.dst_mode = INT_DEST_MODE; | 3280 | irte.dst_mode = apic->irq_dest_mode; |
| 3282 | irte.trigger_mode = 0; /* edge */ | 3281 | irte.trigger_mode = 0; /* edge */ |
| 3283 | irte.dlvry_mode = INT_DELIVERY_MODE; | 3282 | irte.dlvry_mode = apic->irq_delivery_mode; |
| 3284 | irte.vector = cfg->vector; | 3283 | irte.vector = cfg->vector; |
| 3285 | irte.dest_id = IRTE_DEST(dest); | 3284 | irte.dest_id = IRTE_DEST(dest); |
| 3286 | 3285 | ||
| @@ -3298,10 +3297,10 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_ms | |||
| 3298 | msg->address_hi = MSI_ADDR_BASE_HI; | 3297 | msg->address_hi = MSI_ADDR_BASE_HI; |
| 3299 | msg->address_lo = | 3298 | msg->address_lo = |
| 3300 | MSI_ADDR_BASE_LO | | 3299 | MSI_ADDR_BASE_LO | |
| 3301 | ((INT_DEST_MODE == 0) ? | 3300 | ((apic->irq_dest_mode == 0) ? |
| 3302 | MSI_ADDR_DEST_MODE_PHYSICAL: | 3301 | MSI_ADDR_DEST_MODE_PHYSICAL: |
| 3303 | MSI_ADDR_DEST_MODE_LOGICAL) | | 3302 | MSI_ADDR_DEST_MODE_LOGICAL) | |
| 3304 | ((INT_DELIVERY_MODE != dest_LowestPrio) ? | 3303 | ((apic->irq_delivery_mode != dest_LowestPrio) ? |
| 3305 | MSI_ADDR_REDIRECTION_CPU: | 3304 | MSI_ADDR_REDIRECTION_CPU: |
| 3306 | MSI_ADDR_REDIRECTION_LOWPRI) | | 3305 | MSI_ADDR_REDIRECTION_LOWPRI) | |
| 3307 | MSI_ADDR_DEST_ID(dest); | 3306 | MSI_ADDR_DEST_ID(dest); |
| @@ -3309,7 +3308,7 @@ static int msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_ms | |||
| 3309 | msg->data = | 3308 | msg->data = |
| 3310 | MSI_DATA_TRIGGER_EDGE | | 3309 | MSI_DATA_TRIGGER_EDGE | |
| 3311 | MSI_DATA_LEVEL_ASSERT | | 3310 | MSI_DATA_LEVEL_ASSERT | |
| 3312 | ((INT_DELIVERY_MODE != dest_LowestPrio) ? | 3311 | ((apic->irq_delivery_mode != dest_LowestPrio) ? |
| 3313 | MSI_DATA_DELIVERY_FIXED: | 3312 | MSI_DATA_DELIVERY_FIXED: |
| 3314 | MSI_DATA_DELIVERY_LOWPRI) | | 3313 | MSI_DATA_DELIVERY_LOWPRI) | |
| 3315 | MSI_DATA_VECTOR(cfg->vector); | 3314 | MSI_DATA_VECTOR(cfg->vector); |
| @@ -3464,40 +3463,6 @@ static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq) | |||
| 3464 | return 0; | 3463 | return 0; |
| 3465 | } | 3464 | } |
| 3466 | 3465 | ||
| 3467 | int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc) | ||
| 3468 | { | ||
| 3469 | unsigned int irq; | ||
| 3470 | int ret; | ||
| 3471 | unsigned int irq_want; | ||
| 3472 | |||
| 3473 | irq_want = nr_irqs_gsi; | ||
| 3474 | irq = create_irq_nr(irq_want); | ||
| 3475 | if (irq == 0) | ||
| 3476 | return -1; | ||
| 3477 | |||
| 3478 | #ifdef CONFIG_INTR_REMAP | ||
| 3479 | if (!intr_remapping_enabled) | ||
| 3480 | goto no_ir; | ||
| 3481 | |||
| 3482 | ret = msi_alloc_irte(dev, irq, 1); | ||
| 3483 | if (ret < 0) | ||
| 3484 | goto error; | ||
| 3485 | no_ir: | ||
| 3486 | #endif | ||
| 3487 | ret = setup_msi_irq(dev, msidesc, irq); | ||
| 3488 | if (ret < 0) { | ||
| 3489 | destroy_irq(irq); | ||
| 3490 | return ret; | ||
| 3491 | } | ||
| 3492 | return 0; | ||
| 3493 | |||
| 3494 | #ifdef CONFIG_INTR_REMAP | ||
| 3495 | error: | ||
| 3496 | destroy_irq(irq); | ||
| 3497 | return ret; | ||
| 3498 | #endif | ||
| 3499 | } | ||
| 3500 | |||
| 3501 | int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | 3466 | int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) |
| 3502 | { | 3467 | { |
| 3503 | unsigned int irq; | 3468 | unsigned int irq; |
| @@ -3514,9 +3479,9 @@ int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | |||
| 3514 | sub_handle = 0; | 3479 | sub_handle = 0; |
| 3515 | list_for_each_entry(msidesc, &dev->msi_list, list) { | 3480 | list_for_each_entry(msidesc, &dev->msi_list, list) { |
| 3516 | irq = create_irq_nr(irq_want); | 3481 | irq = create_irq_nr(irq_want); |
| 3517 | irq_want++; | ||
| 3518 | if (irq == 0) | 3482 | if (irq == 0) |
| 3519 | return -1; | 3483 | return -1; |
| 3484 | irq_want = irq + 1; | ||
| 3520 | #ifdef CONFIG_INTR_REMAP | 3485 | #ifdef CONFIG_INTR_REMAP |
| 3521 | if (!intr_remapping_enabled) | 3486 | if (!intr_remapping_enabled) |
| 3522 | goto no_ir; | 3487 | goto no_ir; |
| @@ -3727,13 +3692,17 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev) | |||
| 3727 | struct irq_cfg *cfg; | 3692 | struct irq_cfg *cfg; |
| 3728 | int err; | 3693 | int err; |
| 3729 | 3694 | ||
| 3695 | if (disable_apic) | ||
| 3696 | return -ENXIO; | ||
| 3697 | |||
| 3730 | cfg = irq_cfg(irq); | 3698 | cfg = irq_cfg(irq); |
| 3731 | err = assign_irq_vector(irq, cfg, TARGET_CPUS); | 3699 | err = assign_irq_vector(irq, cfg, apic->target_cpus()); |
| 3732 | if (!err) { | 3700 | if (!err) { |
| 3733 | struct ht_irq_msg msg; | 3701 | struct ht_irq_msg msg; |
| 3734 | unsigned dest; | 3702 | unsigned dest; |
| 3735 | 3703 | ||
| 3736 | dest = cpu_mask_to_apicid_and(cfg->domain, TARGET_CPUS); | 3704 | dest = apic->cpu_mask_to_apicid_and(cfg->domain, |
| 3705 | apic->target_cpus()); | ||
| 3737 | 3706 | ||
| 3738 | msg.address_hi = HT_IRQ_HIGH_DEST_ID(dest); | 3707 | msg.address_hi = HT_IRQ_HIGH_DEST_ID(dest); |
| 3739 | 3708 | ||
| @@ -3741,11 +3710,11 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev) | |||
| 3741 | HT_IRQ_LOW_BASE | | 3710 | HT_IRQ_LOW_BASE | |
| 3742 | HT_IRQ_LOW_DEST_ID(dest) | | 3711 | HT_IRQ_LOW_DEST_ID(dest) | |
| 3743 | HT_IRQ_LOW_VECTOR(cfg->vector) | | 3712 | HT_IRQ_LOW_VECTOR(cfg->vector) | |
| 3744 | ((INT_DEST_MODE == 0) ? | 3713 | ((apic->irq_dest_mode == 0) ? |
| 3745 | HT_IRQ_LOW_DM_PHYSICAL : | 3714 | HT_IRQ_LOW_DM_PHYSICAL : |
| 3746 | HT_IRQ_LOW_DM_LOGICAL) | | 3715 | HT_IRQ_LOW_DM_LOGICAL) | |
| 3747 | HT_IRQ_LOW_RQEOI_EDGE | | 3716 | HT_IRQ_LOW_RQEOI_EDGE | |
| 3748 | ((INT_DELIVERY_MODE != dest_LowestPrio) ? | 3717 | ((apic->irq_delivery_mode != dest_LowestPrio) ? |
| 3749 | HT_IRQ_LOW_MT_FIXED : | 3718 | HT_IRQ_LOW_MT_FIXED : |
| 3750 | HT_IRQ_LOW_MT_ARBITRATED) | | 3719 | HT_IRQ_LOW_MT_ARBITRATED) | |
| 3751 | HT_IRQ_LOW_IRQ_MASKED; | 3720 | HT_IRQ_LOW_IRQ_MASKED; |
| @@ -3761,7 +3730,7 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev) | |||
| 3761 | } | 3730 | } |
| 3762 | #endif /* CONFIG_HT_IRQ */ | 3731 | #endif /* CONFIG_HT_IRQ */ |
| 3763 | 3732 | ||
| 3764 | #ifdef CONFIG_X86_64 | 3733 | #ifdef CONFIG_X86_UV |
| 3765 | /* | 3734 | /* |
| 3766 | * Re-target the irq to the specified CPU and enable the specified MMR located | 3735 | * Re-target the irq to the specified CPU and enable the specified MMR located |
| 3767 | * on the specified blade to allow the sending of MSIs to the specified CPU. | 3736 | * on the specified blade to allow the sending of MSIs to the specified CPU. |
| @@ -3793,12 +3762,12 @@ int arch_enable_uv_irq(char *irq_name, unsigned int irq, int cpu, int mmr_blade, | |||
| 3793 | BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long)); | 3762 | BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long)); |
| 3794 | 3763 | ||
| 3795 | entry->vector = cfg->vector; | 3764 | entry->vector = cfg->vector; |
| 3796 | entry->delivery_mode = INT_DELIVERY_MODE; | 3765 | entry->delivery_mode = apic->irq_delivery_mode; |
| 3797 | entry->dest_mode = INT_DEST_MODE; | 3766 | entry->dest_mode = apic->irq_dest_mode; |
| 3798 | entry->polarity = 0; | 3767 | entry->polarity = 0; |
| 3799 | entry->trigger = 0; | 3768 | entry->trigger = 0; |
| 3800 | entry->mask = 0; | 3769 | entry->mask = 0; |
| 3801 | entry->dest = cpu_mask_to_apicid(eligible_cpu); | 3770 | entry->dest = apic->cpu_mask_to_apicid(eligible_cpu); |
| 3802 | 3771 | ||
| 3803 | mmr_pnode = uv_blade_to_pnode(mmr_blade); | 3772 | mmr_pnode = uv_blade_to_pnode(mmr_blade); |
| 3804 | uv_write_global_mmr64(mmr_pnode, mmr_offset, mmr_value); | 3773 | uv_write_global_mmr64(mmr_pnode, mmr_offset, mmr_value); |
| @@ -3861,6 +3830,28 @@ void __init probe_nr_irqs_gsi(void) | |||
| 3861 | printk(KERN_DEBUG "nr_irqs_gsi: %d\n", nr_irqs_gsi); | 3830 | printk(KERN_DEBUG "nr_irqs_gsi: %d\n", nr_irqs_gsi); |
| 3862 | } | 3831 | } |
| 3863 | 3832 | ||
| 3833 | #ifdef CONFIG_SPARSE_IRQ | ||
| 3834 | int __init arch_probe_nr_irqs(void) | ||
| 3835 | { | ||
| 3836 | int nr; | ||
| 3837 | |||
| 3838 | if (nr_irqs > (NR_VECTORS * nr_cpu_ids)) | ||
| 3839 | nr_irqs = NR_VECTORS * nr_cpu_ids; | ||
| 3840 | |||
| 3841 | nr = nr_irqs_gsi + 8 * nr_cpu_ids; | ||
| 3842 | #if defined(CONFIG_PCI_MSI) || defined(CONFIG_HT_IRQ) | ||
| 3843 | /* | ||
| 3844 | * for MSI and HT dyn irq | ||
| 3845 | */ | ||
| 3846 | nr += nr_irqs_gsi * 16; | ||
| 3847 | #endif | ||
| 3848 | if (nr < nr_irqs) | ||
| 3849 | nr_irqs = nr; | ||
| 3850 | |||
| 3851 | return 0; | ||
| 3852 | } | ||
| 3853 | #endif | ||
| 3854 | |||
| 3864 | /* -------------------------------------------------------------------------- | 3855 | /* -------------------------------------------------------------------------- |
| 3865 | ACPI-based IOAPIC Configuration | 3856 | ACPI-based IOAPIC Configuration |
| 3866 | -------------------------------------------------------------------------- */ | 3857 | -------------------------------------------------------------------------- */ |
| @@ -3886,7 +3877,7 @@ int __init io_apic_get_unique_id(int ioapic, int apic_id) | |||
| 3886 | */ | 3877 | */ |
| 3887 | 3878 | ||
| 3888 | if (physids_empty(apic_id_map)) | 3879 | if (physids_empty(apic_id_map)) |
| 3889 | apic_id_map = ioapic_phys_id_map(phys_cpu_present_map); | 3880 | apic_id_map = apic->ioapic_phys_id_map(phys_cpu_present_map); |
| 3890 | 3881 | ||
| 3891 | spin_lock_irqsave(&ioapic_lock, flags); | 3882 | spin_lock_irqsave(&ioapic_lock, flags); |
| 3892 | reg_00.raw = io_apic_read(ioapic, 0); | 3883 | reg_00.raw = io_apic_read(ioapic, 0); |
| @@ -3902,10 +3893,10 @@ int __init io_apic_get_unique_id(int ioapic, int apic_id) | |||
| 3902 | * Every APIC in a system must have a unique ID or we get lots of nice | 3893 | * Every APIC in a system must have a unique ID or we get lots of nice |
| 3903 | * 'stuck on smp_invalidate_needed IPI wait' messages. | 3894 | * 'stuck on smp_invalidate_needed IPI wait' messages. |
| 3904 | */ | 3895 | */ |
| 3905 | if (check_apicid_used(apic_id_map, apic_id)) { | 3896 | if (apic->check_apicid_used(apic_id_map, apic_id)) { |
| 3906 | 3897 | ||
| 3907 | for (i = 0; i < get_physical_broadcast(); i++) { | 3898 | for (i = 0; i < get_physical_broadcast(); i++) { |
| 3908 | if (!check_apicid_used(apic_id_map, i)) | 3899 | if (!apic->check_apicid_used(apic_id_map, i)) |
| 3909 | break; | 3900 | break; |
| 3910 | } | 3901 | } |
| 3911 | 3902 | ||
| @@ -3918,7 +3909,7 @@ int __init io_apic_get_unique_id(int ioapic, int apic_id) | |||
| 3918 | apic_id = i; | 3909 | apic_id = i; |
| 3919 | } | 3910 | } |
| 3920 | 3911 | ||
| 3921 | tmp = apicid_to_cpu_present(apic_id); | 3912 | tmp = apic->apicid_to_cpu_present(apic_id); |
| 3922 | physids_or(apic_id_map, apic_id_map, tmp); | 3913 | physids_or(apic_id_map, apic_id_map, tmp); |
| 3923 | 3914 | ||
| 3924 | if (reg_00.bits.ID != apic_id) { | 3915 | if (reg_00.bits.ID != apic_id) { |
| @@ -3995,8 +3986,8 @@ int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity) | |||
| 3995 | return -1; | 3986 | return -1; |
| 3996 | 3987 | ||
| 3997 | for (i = 0; i < mp_irq_entries; i++) | 3988 | for (i = 0; i < mp_irq_entries; i++) |
| 3998 | if (mp_irqs[i].mp_irqtype == mp_INT && | 3989 | if (mp_irqs[i].irqtype == mp_INT && |
| 3999 | mp_irqs[i].mp_srcbusirq == bus_irq) | 3990 | mp_irqs[i].srcbusirq == bus_irq) |
| 4000 | break; | 3991 | break; |
| 4001 | if (i >= mp_irq_entries) | 3992 | if (i >= mp_irq_entries) |
| 4002 | return -1; | 3993 | return -1; |
| @@ -4011,7 +4002,7 @@ int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity) | |||
| 4011 | /* | 4002 | /* |
| 4012 | * This function currently is only a helper for the i386 smp boot process where | 4003 | * This function currently is only a helper for the i386 smp boot process where |
| 4013 | * we need to reprogram the ioredtbls to cater for the cpus which have come online | 4004 | * we need to reprogram the ioredtbls to cater for the cpus which have come online |
| 4014 | * so mask in all cases should simply be TARGET_CPUS | 4005 | * so mask in all cases should simply be apic->target_cpus() |
| 4015 | */ | 4006 | */ |
| 4016 | #ifdef CONFIG_SMP | 4007 | #ifdef CONFIG_SMP |
| 4017 | void __init setup_ioapic_dest(void) | 4008 | void __init setup_ioapic_dest(void) |
| @@ -4050,9 +4041,9 @@ void __init setup_ioapic_dest(void) | |||
| 4050 | */ | 4041 | */ |
| 4051 | if (desc->status & | 4042 | if (desc->status & |
| 4052 | (IRQ_NO_BALANCING | IRQ_AFFINITY_SET)) | 4043 | (IRQ_NO_BALANCING | IRQ_AFFINITY_SET)) |
| 4053 | mask = &desc->affinity; | 4044 | mask = desc->affinity; |
| 4054 | else | 4045 | else |
| 4055 | mask = TARGET_CPUS; | 4046 | mask = apic->target_cpus(); |
| 4056 | 4047 | ||
| 4057 | #ifdef CONFIG_INTR_REMAP | 4048 | #ifdef CONFIG_INTR_REMAP |
| 4058 | if (intr_remapping_enabled) | 4049 | if (intr_remapping_enabled) |
| @@ -4111,7 +4102,7 @@ void __init ioapic_init_mappings(void) | |||
| 4111 | ioapic_res = ioapic_setup_resources(); | 4102 | ioapic_res = ioapic_setup_resources(); |
| 4112 | for (i = 0; i < nr_ioapics; i++) { | 4103 | for (i = 0; i < nr_ioapics; i++) { |
| 4113 | if (smp_found_config) { | 4104 | if (smp_found_config) { |
| 4114 | ioapic_phys = mp_ioapics[i].mp_apicaddr; | 4105 | ioapic_phys = mp_ioapics[i].apicaddr; |
| 4115 | #ifdef CONFIG_X86_32 | 4106 | #ifdef CONFIG_X86_32 |
| 4116 | if (!ioapic_phys) { | 4107 | if (!ioapic_phys) { |
| 4117 | printk(KERN_ERR | 4108 | printk(KERN_ERR |
diff --git a/arch/x86/kernel/apic/ipi.c b/arch/x86/kernel/apic/ipi.c new file mode 100644 index 000000000000..dbf5445727a9 --- /dev/null +++ b/arch/x86/kernel/apic/ipi.c | |||
| @@ -0,0 +1,164 @@ | |||
| 1 | #include <linux/cpumask.h> | ||
| 2 | #include <linux/interrupt.h> | ||
| 3 | #include <linux/init.h> | ||
| 4 | |||
| 5 | #include <linux/mm.h> | ||
| 6 | #include <linux/delay.h> | ||
| 7 | #include <linux/spinlock.h> | ||
| 8 | #include <linux/kernel_stat.h> | ||
| 9 | #include <linux/mc146818rtc.h> | ||
| 10 | #include <linux/cache.h> | ||
| 11 | #include <linux/cpu.h> | ||
| 12 | #include <linux/module.h> | ||
| 13 | |||
| 14 | #include <asm/smp.h> | ||
| 15 | #include <asm/mtrr.h> | ||
| 16 | #include <asm/tlbflush.h> | ||
| 17 | #include <asm/mmu_context.h> | ||
| 18 | #include <asm/apic.h> | ||
| 19 | #include <asm/proto.h> | ||
| 20 | #include <asm/ipi.h> | ||
| 21 | |||
| 22 | void default_send_IPI_mask_sequence_phys(const struct cpumask *mask, int vector) | ||
| 23 | { | ||
| 24 | unsigned long query_cpu; | ||
| 25 | unsigned long flags; | ||
| 26 | |||
| 27 | /* | ||
| 28 | * Hack. The clustered APIC addressing mode doesn't allow us to send | ||
| 29 | * to an arbitrary mask, so I do a unicast to each CPU instead. | ||
| 30 | * - mbligh | ||
| 31 | */ | ||
| 32 | local_irq_save(flags); | ||
| 33 | for_each_cpu(query_cpu, mask) { | ||
| 34 | __default_send_IPI_dest_field(per_cpu(x86_cpu_to_apicid, | ||
| 35 | query_cpu), vector, APIC_DEST_PHYSICAL); | ||
| 36 | } | ||
| 37 | local_irq_restore(flags); | ||
| 38 | } | ||
| 39 | |||
| 40 | void default_send_IPI_mask_allbutself_phys(const struct cpumask *mask, | ||
| 41 | int vector) | ||
| 42 | { | ||
| 43 | unsigned int this_cpu = smp_processor_id(); | ||
| 44 | unsigned int query_cpu; | ||
| 45 | unsigned long flags; | ||
| 46 | |||
| 47 | /* See Hack comment above */ | ||
| 48 | |||
| 49 | local_irq_save(flags); | ||
| 50 | for_each_cpu(query_cpu, mask) { | ||
| 51 | if (query_cpu == this_cpu) | ||
| 52 | continue; | ||
| 53 | __default_send_IPI_dest_field(per_cpu(x86_cpu_to_apicid, | ||
| 54 | query_cpu), vector, APIC_DEST_PHYSICAL); | ||
| 55 | } | ||
| 56 | local_irq_restore(flags); | ||
| 57 | } | ||
| 58 | |||
| 59 | void default_send_IPI_mask_sequence_logical(const struct cpumask *mask, | ||
| 60 | int vector) | ||
| 61 | { | ||
| 62 | unsigned long flags; | ||
| 63 | unsigned int query_cpu; | ||
| 64 | |||
| 65 | /* | ||
| 66 | * Hack. The clustered APIC addressing mode doesn't allow us to send | ||
| 67 | * to an arbitrary mask, so I do a unicasts to each CPU instead. This | ||
| 68 | * should be modified to do 1 message per cluster ID - mbligh | ||
| 69 | */ | ||
| 70 | |||
| 71 | local_irq_save(flags); | ||
| 72 | for_each_cpu(query_cpu, mask) | ||
| 73 | __default_send_IPI_dest_field( | ||
| 74 | apic->cpu_to_logical_apicid(query_cpu), vector, | ||
| 75 | apic->dest_logical); | ||
| 76 | local_irq_restore(flags); | ||
| 77 | } | ||
| 78 | |||
| 79 | void default_send_IPI_mask_allbutself_logical(const struct cpumask *mask, | ||
| 80 | int vector) | ||
| 81 | { | ||
| 82 | unsigned long flags; | ||
| 83 | unsigned int query_cpu; | ||
| 84 | unsigned int this_cpu = smp_processor_id(); | ||
| 85 | |||
| 86 | /* See Hack comment above */ | ||
| 87 | |||
| 88 | local_irq_save(flags); | ||
| 89 | for_each_cpu(query_cpu, mask) { | ||
| 90 | if (query_cpu == this_cpu) | ||
| 91 | continue; | ||
| 92 | __default_send_IPI_dest_field( | ||
| 93 | apic->cpu_to_logical_apicid(query_cpu), vector, | ||
| 94 | apic->dest_logical); | ||
| 95 | } | ||
| 96 | local_irq_restore(flags); | ||
| 97 | } | ||
| 98 | |||
| 99 | #ifdef CONFIG_X86_32 | ||
| 100 | |||
| 101 | /* | ||
| 102 | * This is only used on smaller machines. | ||
| 103 | */ | ||
| 104 | void default_send_IPI_mask_logical(const struct cpumask *cpumask, int vector) | ||
| 105 | { | ||
| 106 | unsigned long mask = cpumask_bits(cpumask)[0]; | ||
| 107 | unsigned long flags; | ||
| 108 | |||
| 109 | local_irq_save(flags); | ||
| 110 | WARN_ON(mask & ~cpumask_bits(cpu_online_mask)[0]); | ||
| 111 | __default_send_IPI_dest_field(mask, vector, apic->dest_logical); | ||
| 112 | local_irq_restore(flags); | ||
| 113 | } | ||
| 114 | |||
| 115 | void default_send_IPI_allbutself(int vector) | ||
| 116 | { | ||
| 117 | /* | ||
| 118 | * if there are no other CPUs in the system then we get an APIC send | ||
| 119 | * error if we try to broadcast, thus avoid sending IPIs in this case. | ||
| 120 | */ | ||
| 121 | if (!(num_online_cpus() > 1)) | ||
| 122 | return; | ||
| 123 | |||
| 124 | __default_local_send_IPI_allbutself(vector); | ||
| 125 | } | ||
| 126 | |||
| 127 | void default_send_IPI_all(int vector) | ||
| 128 | { | ||
| 129 | __default_local_send_IPI_all(vector); | ||
| 130 | } | ||
| 131 | |||
| 132 | void default_send_IPI_self(int vector) | ||
| 133 | { | ||
| 134 | __default_send_IPI_shortcut(APIC_DEST_SELF, vector, apic->dest_logical); | ||
| 135 | } | ||
| 136 | |||
| 137 | /* must come after the send_IPI functions above for inlining */ | ||
| 138 | static int convert_apicid_to_cpu(int apic_id) | ||
| 139 | { | ||
| 140 | int i; | ||
| 141 | |||
| 142 | for_each_possible_cpu(i) { | ||
| 143 | if (per_cpu(x86_cpu_to_apicid, i) == apic_id) | ||
| 144 | return i; | ||
| 145 | } | ||
| 146 | return -1; | ||
| 147 | } | ||
| 148 | |||
| 149 | int safe_smp_processor_id(void) | ||
| 150 | { | ||
| 151 | int apicid, cpuid; | ||
| 152 | |||
| 153 | if (!boot_cpu_has(X86_FEATURE_APIC)) | ||
| 154 | return 0; | ||
| 155 | |||
| 156 | apicid = hard_smp_processor_id(); | ||
| 157 | if (apicid == BAD_APICID) | ||
| 158 | return 0; | ||
| 159 | |||
| 160 | cpuid = convert_apicid_to_cpu(apicid); | ||
| 161 | |||
| 162 | return cpuid >= 0 ? cpuid : 0; | ||
| 163 | } | ||
| 164 | #endif | ||
diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/apic/nmi.c index 7228979f1e7f..bdfad80c3cf1 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/apic/nmi.c | |||
| @@ -34,7 +34,7 @@ | |||
| 34 | 34 | ||
| 35 | #include <asm/mce.h> | 35 | #include <asm/mce.h> |
| 36 | 36 | ||
| 37 | #include <mach_traps.h> | 37 | #include <asm/mach_traps.h> |
| 38 | 38 | ||
| 39 | int unknown_nmi_panic; | 39 | int unknown_nmi_panic; |
| 40 | int nmi_watchdog_enabled; | 40 | int nmi_watchdog_enabled; |
| @@ -61,11 +61,7 @@ static int endflag __initdata; | |||
| 61 | 61 | ||
| 62 | static inline unsigned int get_nmi_count(int cpu) | 62 | static inline unsigned int get_nmi_count(int cpu) |
| 63 | { | 63 | { |
| 64 | #ifdef CONFIG_X86_64 | 64 | return per_cpu(irq_stat, cpu).__nmi_count; |
| 65 | return cpu_pda(cpu)->__nmi_count; | ||
| 66 | #else | ||
| 67 | return nmi_count(cpu); | ||
| 68 | #endif | ||
| 69 | } | 65 | } |
| 70 | 66 | ||
| 71 | static inline int mce_in_progress(void) | 67 | static inline int mce_in_progress(void) |
| @@ -82,12 +78,8 @@ static inline int mce_in_progress(void) | |||
| 82 | */ | 78 | */ |
| 83 | static inline unsigned int get_timer_irqs(int cpu) | 79 | static inline unsigned int get_timer_irqs(int cpu) |
| 84 | { | 80 | { |
| 85 | #ifdef CONFIG_X86_64 | ||
| 86 | return read_pda(apic_timer_irqs) + read_pda(irq0_irqs); | ||
| 87 | #else | ||
| 88 | return per_cpu(irq_stat, cpu).apic_timer_irqs + | 81 | return per_cpu(irq_stat, cpu).apic_timer_irqs + |
| 89 | per_cpu(irq_stat, cpu).irq0_irqs; | 82 | per_cpu(irq_stat, cpu).irq0_irqs; |
| 90 | #endif | ||
| 91 | } | 83 | } |
| 92 | 84 | ||
| 93 | #ifdef CONFIG_SMP | 85 | #ifdef CONFIG_SMP |
diff --git a/arch/x86/kernel/apic/numaq_32.c b/arch/x86/kernel/apic/numaq_32.c new file mode 100644 index 000000000000..d9d6d61eed82 --- /dev/null +++ b/arch/x86/kernel/apic/numaq_32.c | |||
| @@ -0,0 +1,565 @@ | |||
| 1 | /* | ||
| 2 | * Written by: Patricia Gaughen, IBM Corporation | ||
| 3 | * | ||
| 4 | * Copyright (C) 2002, IBM Corp. | ||
| 5 | * Copyright (C) 2009, Red Hat, Inc., Ingo Molnar | ||
| 6 | * | ||
| 7 | * All rights reserved. | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify | ||
| 10 | * it under the terms of the GNU General Public License as published by | ||
| 11 | * the Free Software Foundation; either version 2 of the License, or | ||
| 12 | * (at your option) any later version. | ||
| 13 | * | ||
| 14 | * This program is distributed in the hope that it will be useful, but | ||
| 15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 16 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
| 17 | * NON INFRINGEMENT. See the GNU General Public License for more | ||
| 18 | * details. | ||
| 19 | * | ||
| 20 | * You should have received a copy of the GNU General Public License | ||
| 21 | * along with this program; if not, write to the Free Software | ||
| 22 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 23 | * | ||
| 24 | * Send feedback to <gone@us.ibm.com> | ||
| 25 | */ | ||
| 26 | #include <linux/nodemask.h> | ||
| 27 | #include <linux/topology.h> | ||
| 28 | #include <linux/bootmem.h> | ||
| 29 | #include <linux/threads.h> | ||
| 30 | #include <linux/cpumask.h> | ||
| 31 | #include <linux/kernel.h> | ||
| 32 | #include <linux/mmzone.h> | ||
| 33 | #include <linux/module.h> | ||
| 34 | #include <linux/string.h> | ||
| 35 | #include <linux/init.h> | ||
| 36 | #include <linux/numa.h> | ||
| 37 | #include <linux/smp.h> | ||
| 38 | #include <linux/io.h> | ||
| 39 | #include <linux/mm.h> | ||
| 40 | |||
| 41 | #include <asm/processor.h> | ||
| 42 | #include <asm/fixmap.h> | ||
| 43 | #include <asm/mpspec.h> | ||
| 44 | #include <asm/numaq.h> | ||
| 45 | #include <asm/setup.h> | ||
| 46 | #include <asm/apic.h> | ||
| 47 | #include <asm/e820.h> | ||
| 48 | #include <asm/ipi.h> | ||
| 49 | |||
| 50 | #define MB_TO_PAGES(addr) ((addr) << (20 - PAGE_SHIFT)) | ||
| 51 | |||
| 52 | int found_numaq; | ||
| 53 | |||
| 54 | /* | ||
| 55 | * Have to match translation table entries to main table entries by counter | ||
| 56 | * hence the mpc_record variable .... can't see a less disgusting way of | ||
| 57 | * doing this .... | ||
| 58 | */ | ||
| 59 | struct mpc_trans { | ||
| 60 | unsigned char mpc_type; | ||
| 61 | unsigned char trans_len; | ||
| 62 | unsigned char trans_type; | ||
| 63 | unsigned char trans_quad; | ||
| 64 | unsigned char trans_global; | ||
| 65 | unsigned char trans_local; | ||
| 66 | unsigned short trans_reserved; | ||
| 67 | }; | ||
| 68 | |||
| 69 | /* x86_quirks member */ | ||
| 70 | static int mpc_record; | ||
| 71 | |||
| 72 | static __cpuinitdata struct mpc_trans *translation_table[MAX_MPC_ENTRY]; | ||
| 73 | |||
| 74 | int mp_bus_id_to_node[MAX_MP_BUSSES]; | ||
| 75 | int mp_bus_id_to_local[MAX_MP_BUSSES]; | ||
| 76 | int quad_local_to_mp_bus_id[NR_CPUS/4][4]; | ||
| 77 | |||
| 78 | |||
| 79 | static inline void numaq_register_node(int node, struct sys_cfg_data *scd) | ||
| 80 | { | ||
| 81 | struct eachquadmem *eq = scd->eq + node; | ||
| 82 | |||
| 83 | node_set_online(node); | ||
| 84 | |||
| 85 | /* Convert to pages */ | ||
| 86 | node_start_pfn[node] = | ||
| 87 | MB_TO_PAGES(eq->hi_shrd_mem_start - eq->priv_mem_size); | ||
| 88 | |||
| 89 | node_end_pfn[node] = | ||
| 90 | MB_TO_PAGES(eq->hi_shrd_mem_start + eq->hi_shrd_mem_size); | ||
| 91 | |||
| 92 | e820_register_active_regions(node, node_start_pfn[node], | ||
| 93 | node_end_pfn[node]); | ||
| 94 | |||
| 95 | memory_present(node, node_start_pfn[node], node_end_pfn[node]); | ||
| 96 | |||
| 97 | node_remap_size[node] = node_memmap_size_bytes(node, | ||
| 98 | node_start_pfn[node], | ||
| 99 | node_end_pfn[node]); | ||
| 100 | } | ||
| 101 | |||
| 102 | /* | ||
| 103 | * Function: smp_dump_qct() | ||
| 104 | * | ||
| 105 | * Description: gets memory layout from the quad config table. This | ||
| 106 | * function also updates node_online_map with the nodes (quads) present. | ||
| 107 | */ | ||
| 108 | static void __init smp_dump_qct(void) | ||
| 109 | { | ||
| 110 | struct sys_cfg_data *scd; | ||
| 111 | int node; | ||
| 112 | |||
| 113 | scd = (void *)__va(SYS_CFG_DATA_PRIV_ADDR); | ||
| 114 | |||
| 115 | nodes_clear(node_online_map); | ||
| 116 | for_each_node(node) { | ||
| 117 | if (scd->quads_present31_0 & (1 << node)) | ||
| 118 | numaq_register_node(node, scd); | ||
| 119 | } | ||
| 120 | } | ||
| 121 | |||
| 122 | void __cpuinit numaq_tsc_disable(void) | ||
| 123 | { | ||
| 124 | if (!found_numaq) | ||
| 125 | return; | ||
| 126 | |||
| 127 | if (num_online_nodes() > 1) { | ||
| 128 | printk(KERN_DEBUG "NUMAQ: disabling TSC\n"); | ||
| 129 | setup_clear_cpu_cap(X86_FEATURE_TSC); | ||
| 130 | } | ||
| 131 | } | ||
| 132 | |||
| 133 | static int __init numaq_pre_time_init(void) | ||
| 134 | { | ||
| 135 | numaq_tsc_disable(); | ||
| 136 | return 0; | ||
| 137 | } | ||
| 138 | |||
| 139 | static inline int generate_logical_apicid(int quad, int phys_apicid) | ||
| 140 | { | ||
| 141 | return (quad << 4) + (phys_apicid ? phys_apicid << 1 : 1); | ||
| 142 | } | ||
| 143 | |||
| 144 | /* x86_quirks member */ | ||
| 145 | static int mpc_apic_id(struct mpc_cpu *m) | ||
| 146 | { | ||
| 147 | int quad = translation_table[mpc_record]->trans_quad; | ||
| 148 | int logical_apicid = generate_logical_apicid(quad, m->apicid); | ||
| 149 | |||
| 150 | printk(KERN_DEBUG | ||
| 151 | "Processor #%d %u:%u APIC version %d (quad %d, apic %d)\n", | ||
| 152 | m->apicid, (m->cpufeature & CPU_FAMILY_MASK) >> 8, | ||
| 153 | (m->cpufeature & CPU_MODEL_MASK) >> 4, | ||
| 154 | m->apicver, quad, logical_apicid); | ||
| 155 | |||
| 156 | return logical_apicid; | ||
| 157 | } | ||
| 158 | |||
| 159 | /* x86_quirks member */ | ||
| 160 | static void mpc_oem_bus_info(struct mpc_bus *m, char *name) | ||
| 161 | { | ||
| 162 | int quad = translation_table[mpc_record]->trans_quad; | ||
| 163 | int local = translation_table[mpc_record]->trans_local; | ||
| 164 | |||
| 165 | mp_bus_id_to_node[m->busid] = quad; | ||
| 166 | mp_bus_id_to_local[m->busid] = local; | ||
| 167 | |||
| 168 | printk(KERN_INFO "Bus #%d is %s (node %d)\n", m->busid, name, quad); | ||
| 169 | } | ||
| 170 | |||
| 171 | /* x86_quirks member */ | ||
| 172 | static void mpc_oem_pci_bus(struct mpc_bus *m) | ||
| 173 | { | ||
| 174 | int quad = translation_table[mpc_record]->trans_quad; | ||
| 175 | int local = translation_table[mpc_record]->trans_local; | ||
| 176 | |||
| 177 | quad_local_to_mp_bus_id[quad][local] = m->busid; | ||
| 178 | } | ||
| 179 | |||
| 180 | static void __init MP_translation_info(struct mpc_trans *m) | ||
| 181 | { | ||
| 182 | printk(KERN_INFO | ||
| 183 | "Translation: record %d, type %d, quad %d, global %d, local %d\n", | ||
| 184 | mpc_record, m->trans_type, m->trans_quad, m->trans_global, | ||
| 185 | m->trans_local); | ||
| 186 | |||
| 187 | if (mpc_record >= MAX_MPC_ENTRY) | ||
| 188 | printk(KERN_ERR "MAX_MPC_ENTRY exceeded!\n"); | ||
| 189 | else | ||
| 190 | translation_table[mpc_record] = m; /* stash this for later */ | ||
| 191 | |||
| 192 | if (m->trans_quad < MAX_NUMNODES && !node_online(m->trans_quad)) | ||
| 193 | node_set_online(m->trans_quad); | ||
| 194 | } | ||
| 195 | |||
| 196 | static int __init mpf_checksum(unsigned char *mp, int len) | ||
| 197 | { | ||
| 198 | int sum = 0; | ||
| 199 | |||
| 200 | while (len--) | ||
| 201 | sum += *mp++; | ||
| 202 | |||
| 203 | return sum & 0xFF; | ||
| 204 | } | ||
| 205 | |||
| 206 | /* | ||
| 207 | * Read/parse the MPC oem tables | ||
| 208 | */ | ||
| 209 | static void __init | ||
| 210 | smp_read_mpc_oem(struct mpc_oemtable *oemtable, unsigned short oemsize) | ||
| 211 | { | ||
| 212 | int count = sizeof(*oemtable); /* the header size */ | ||
| 213 | unsigned char *oemptr = ((unsigned char *)oemtable) + count; | ||
| 214 | |||
| 215 | mpc_record = 0; | ||
| 216 | printk(KERN_INFO | ||
| 217 | "Found an OEM MPC table at %8p - parsing it ... \n", oemtable); | ||
| 218 | |||
| 219 | if (memcmp(oemtable->signature, MPC_OEM_SIGNATURE, 4)) { | ||
| 220 | printk(KERN_WARNING | ||
| 221 | "SMP mpc oemtable: bad signature [%c%c%c%c]!\n", | ||
| 222 | oemtable->signature[0], oemtable->signature[1], | ||
| 223 | oemtable->signature[2], oemtable->signature[3]); | ||
| 224 | return; | ||
| 225 | } | ||
| 226 | |||
| 227 | if (mpf_checksum((unsigned char *)oemtable, oemtable->length)) { | ||
| 228 | printk(KERN_WARNING "SMP oem mptable: checksum error!\n"); | ||
| 229 | return; | ||
| 230 | } | ||
| 231 | |||
| 232 | while (count < oemtable->length) { | ||
| 233 | switch (*oemptr) { | ||
| 234 | case MP_TRANSLATION: | ||
| 235 | { | ||
| 236 | struct mpc_trans *m = (void *)oemptr; | ||
| 237 | |||
| 238 | MP_translation_info(m); | ||
| 239 | oemptr += sizeof(*m); | ||
| 240 | count += sizeof(*m); | ||
| 241 | ++mpc_record; | ||
| 242 | break; | ||
| 243 | } | ||
| 244 | default: | ||
| 245 | printk(KERN_WARNING | ||
| 246 | "Unrecognised OEM table entry type! - %d\n", | ||
| 247 | (int)*oemptr); | ||
| 248 | return; | ||
| 249 | } | ||
| 250 | } | ||
| 251 | } | ||
| 252 | |||
| 253 | static int __init numaq_setup_ioapic_ids(void) | ||
| 254 | { | ||
| 255 | /* so can skip it */ | ||
| 256 | return 1; | ||
| 257 | } | ||
| 258 | |||
| 259 | static int __init numaq_update_apic(void) | ||
| 260 | { | ||
| 261 | apic->wakeup_cpu = wakeup_secondary_cpu_via_nmi; | ||
| 262 | |||
| 263 | return 0; | ||
| 264 | } | ||
| 265 | |||
| 266 | static struct x86_quirks numaq_x86_quirks __initdata = { | ||
| 267 | .arch_pre_time_init = numaq_pre_time_init, | ||
| 268 | .arch_time_init = NULL, | ||
| 269 | .arch_pre_intr_init = NULL, | ||
| 270 | .arch_memory_setup = NULL, | ||
| 271 | .arch_intr_init = NULL, | ||
| 272 | .arch_trap_init = NULL, | ||
| 273 | .mach_get_smp_config = NULL, | ||
| 274 | .mach_find_smp_config = NULL, | ||
| 275 | .mpc_record = &mpc_record, | ||
| 276 | .mpc_apic_id = mpc_apic_id, | ||
| 277 | .mpc_oem_bus_info = mpc_oem_bus_info, | ||
| 278 | .mpc_oem_pci_bus = mpc_oem_pci_bus, | ||
| 279 | .smp_read_mpc_oem = smp_read_mpc_oem, | ||
| 280 | .setup_ioapic_ids = numaq_setup_ioapic_ids, | ||
| 281 | .update_apic = numaq_update_apic, | ||
| 282 | }; | ||
| 283 | |||
| 284 | static __init void early_check_numaq(void) | ||
| 285 | { | ||
| 286 | /* | ||
| 287 | * Find possible boot-time SMP configuration: | ||
| 288 | */ | ||
| 289 | early_find_smp_config(); | ||
| 290 | |||
| 291 | /* | ||
| 292 | * get boot-time SMP configuration: | ||
| 293 | */ | ||
| 294 | if (smp_found_config) | ||
| 295 | early_get_smp_config(); | ||
| 296 | |||
| 297 | if (found_numaq) | ||
| 298 | x86_quirks = &numaq_x86_quirks; | ||
| 299 | } | ||
| 300 | |||
| 301 | int __init get_memcfg_numaq(void) | ||
| 302 | { | ||
| 303 | early_check_numaq(); | ||
| 304 | if (!found_numaq) | ||
| 305 | return 0; | ||
| 306 | smp_dump_qct(); | ||
| 307 | |||
| 308 | return 1; | ||
| 309 | } | ||
| 310 | |||
| 311 | #define NUMAQ_APIC_DFR_VALUE (APIC_DFR_CLUSTER) | ||
| 312 | |||
| 313 | static inline unsigned int numaq_get_apic_id(unsigned long x) | ||
| 314 | { | ||
| 315 | return (x >> 24) & 0x0F; | ||
| 316 | } | ||
| 317 | |||
| 318 | static inline void numaq_send_IPI_mask(const struct cpumask *mask, int vector) | ||
| 319 | { | ||
| 320 | default_send_IPI_mask_sequence_logical(mask, vector); | ||
| 321 | } | ||
| 322 | |||
| 323 | static inline void numaq_send_IPI_allbutself(int vector) | ||
| 324 | { | ||
| 325 | default_send_IPI_mask_allbutself_logical(cpu_online_mask, vector); | ||
| 326 | } | ||
| 327 | |||
| 328 | static inline void numaq_send_IPI_all(int vector) | ||
| 329 | { | ||
| 330 | numaq_send_IPI_mask(cpu_online_mask, vector); | ||
| 331 | } | ||
| 332 | |||
| 333 | #define NUMAQ_TRAMPOLINE_PHYS_LOW (0x8) | ||
| 334 | #define NUMAQ_TRAMPOLINE_PHYS_HIGH (0xa) | ||
| 335 | |||
| 336 | /* | ||
| 337 | * Because we use NMIs rather than the INIT-STARTUP sequence to | ||
| 338 | * bootstrap the CPUs, the APIC may be in a weird state. Kick it: | ||
| 339 | */ | ||
| 340 | static inline void numaq_smp_callin_clear_local_apic(void) | ||
| 341 | { | ||
| 342 | clear_local_APIC(); | ||
| 343 | } | ||
| 344 | |||
| 345 | static inline const cpumask_t *numaq_target_cpus(void) | ||
| 346 | { | ||
| 347 | return &CPU_MASK_ALL; | ||
| 348 | } | ||
| 349 | |||
| 350 | static inline unsigned long | ||
| 351 | numaq_check_apicid_used(physid_mask_t bitmap, int apicid) | ||
| 352 | { | ||
| 353 | return physid_isset(apicid, bitmap); | ||
| 354 | } | ||
| 355 | |||
| 356 | static inline unsigned long numaq_check_apicid_present(int bit) | ||
| 357 | { | ||
| 358 | return physid_isset(bit, phys_cpu_present_map); | ||
| 359 | } | ||
| 360 | |||
| 361 | static inline int numaq_apic_id_registered(void) | ||
| 362 | { | ||
| 363 | return 1; | ||
| 364 | } | ||
| 365 | |||
| 366 | static inline void numaq_init_apic_ldr(void) | ||
| 367 | { | ||
| 368 | /* Already done in NUMA-Q firmware */ | ||
| 369 | } | ||
| 370 | |||
| 371 | static inline void numaq_setup_apic_routing(void) | ||
| 372 | { | ||
| 373 | printk(KERN_INFO | ||
| 374 | "Enabling APIC mode: NUMA-Q. Using %d I/O APICs\n", | ||
| 375 | nr_ioapics); | ||
| 376 | } | ||
| 377 | |||
| 378 | /* | ||
| 379 | * Skip adding the timer int on secondary nodes, which causes | ||
| 380 | * a small but painful rift in the time-space continuum. | ||
| 381 | */ | ||
| 382 | static inline int numaq_multi_timer_check(int apic, int irq) | ||
| 383 | { | ||
| 384 | return apic != 0 && irq == 0; | ||
| 385 | } | ||
| 386 | |||
| 387 | static inline physid_mask_t numaq_ioapic_phys_id_map(physid_mask_t phys_map) | ||
| 388 | { | ||
| 389 | /* We don't have a good way to do this yet - hack */ | ||
| 390 | return physids_promote(0xFUL); | ||
| 391 | } | ||
| 392 | |||
| 393 | static inline int numaq_cpu_to_logical_apicid(int cpu) | ||
| 394 | { | ||
| 395 | if (cpu >= nr_cpu_ids) | ||
| 396 | return BAD_APICID; | ||
| 397 | return cpu_2_logical_apicid[cpu]; | ||
| 398 | } | ||
| 399 | |||
| 400 | /* | ||
| 401 | * Supporting over 60 cpus on NUMA-Q requires a locality-dependent | ||
| 402 | * cpu to APIC ID relation to properly interact with the intelligent | ||
| 403 | * mode of the cluster controller. | ||
| 404 | */ | ||
| 405 | static inline int numaq_cpu_present_to_apicid(int mps_cpu) | ||
| 406 | { | ||
| 407 | if (mps_cpu < 60) | ||
| 408 | return ((mps_cpu >> 2) << 4) | (1 << (mps_cpu & 0x3)); | ||
| 409 | else | ||
| 410 | return BAD_APICID; | ||
| 411 | } | ||
| 412 | |||
| 413 | static inline int numaq_apicid_to_node(int logical_apicid) | ||
| 414 | { | ||
| 415 | return logical_apicid >> 4; | ||
| 416 | } | ||
| 417 | |||
| 418 | static inline physid_mask_t numaq_apicid_to_cpu_present(int logical_apicid) | ||
| 419 | { | ||
| 420 | int node = numaq_apicid_to_node(logical_apicid); | ||
| 421 | int cpu = __ffs(logical_apicid & 0xf); | ||
| 422 | |||
| 423 | return physid_mask_of_physid(cpu + 4*node); | ||
| 424 | } | ||
| 425 | |||
| 426 | /* Where the IO area was mapped on multiquad, always 0 otherwise */ | ||
| 427 | void *xquad_portio; | ||
| 428 | |||
| 429 | static inline int numaq_check_phys_apicid_present(int boot_cpu_physical_apicid) | ||
| 430 | { | ||
| 431 | return 1; | ||
| 432 | } | ||
| 433 | |||
| 434 | /* | ||
| 435 | * We use physical apicids here, not logical, so just return the default | ||
| 436 | * physical broadcast to stop people from breaking us | ||
| 437 | */ | ||
| 438 | static inline unsigned int numaq_cpu_mask_to_apicid(const cpumask_t *cpumask) | ||
| 439 | { | ||
| 440 | return 0x0F; | ||
| 441 | } | ||
| 442 | |||
| 443 | static inline unsigned int | ||
| 444 | numaq_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | ||
| 445 | const struct cpumask *andmask) | ||
| 446 | { | ||
| 447 | return 0x0F; | ||
| 448 | } | ||
| 449 | |||
| 450 | /* No NUMA-Q box has a HT CPU, but it can't hurt to use the default code. */ | ||
| 451 | static inline int numaq_phys_pkg_id(int cpuid_apic, int index_msb) | ||
| 452 | { | ||
| 453 | return cpuid_apic >> index_msb; | ||
| 454 | } | ||
| 455 | |||
| 456 | static int | ||
| 457 | numaq_mps_oem_check(struct mpc_table *mpc, char *oem, char *productid) | ||
| 458 | { | ||
| 459 | if (strncmp(oem, "IBM NUMA", 8)) | ||
| 460 | printk(KERN_ERR "Warning! Not a NUMA-Q system!\n"); | ||
| 461 | else | ||
| 462 | found_numaq = 1; | ||
| 463 | |||
| 464 | return found_numaq; | ||
| 465 | } | ||
| 466 | |||
| 467 | static int probe_numaq(void) | ||
| 468 | { | ||
| 469 | /* already know from get_memcfg_numaq() */ | ||
| 470 | return found_numaq; | ||
| 471 | } | ||
| 472 | |||
| 473 | static void numaq_vector_allocation_domain(int cpu, cpumask_t *retmask) | ||
| 474 | { | ||
| 475 | /* Careful. Some cpus do not strictly honor the set of cpus | ||
| 476 | * specified in the interrupt destination when using lowest | ||
| 477 | * priority interrupt delivery mode. | ||
| 478 | * | ||
| 479 | * In particular there was a hyperthreading cpu observed to | ||
| 480 | * deliver interrupts to the wrong hyperthread when only one | ||
| 481 | * hyperthread was specified in the interrupt desitination. | ||
| 482 | */ | ||
| 483 | *retmask = (cpumask_t){ { [0] = APIC_ALL_CPUS, } }; | ||
| 484 | } | ||
| 485 | |||
| 486 | static void numaq_setup_portio_remap(void) | ||
| 487 | { | ||
| 488 | int num_quads = num_online_nodes(); | ||
| 489 | |||
| 490 | if (num_quads <= 1) | ||
| 491 | return; | ||
| 492 | |||
| 493 | printk(KERN_INFO | ||
| 494 | "Remapping cross-quad port I/O for %d quads\n", num_quads); | ||
| 495 | |||
| 496 | xquad_portio = ioremap(XQUAD_PORTIO_BASE, num_quads*XQUAD_PORTIO_QUAD); | ||
| 497 | |||
| 498 | printk(KERN_INFO | ||
| 499 | "xquad_portio vaddr 0x%08lx, len %08lx\n", | ||
| 500 | (u_long) xquad_portio, (u_long) num_quads*XQUAD_PORTIO_QUAD); | ||
| 501 | } | ||
| 502 | |||
| 503 | struct apic apic_numaq = { | ||
| 504 | |||
| 505 | .name = "NUMAQ", | ||
| 506 | .probe = probe_numaq, | ||
| 507 | .acpi_madt_oem_check = NULL, | ||
| 508 | .apic_id_registered = numaq_apic_id_registered, | ||
| 509 | |||
| 510 | .irq_delivery_mode = dest_LowestPrio, | ||
| 511 | /* physical delivery on LOCAL quad: */ | ||
| 512 | .irq_dest_mode = 0, | ||
| 513 | |||
| 514 | .target_cpus = numaq_target_cpus, | ||
| 515 | .disable_esr = 1, | ||
| 516 | .dest_logical = APIC_DEST_LOGICAL, | ||
| 517 | .check_apicid_used = numaq_check_apicid_used, | ||
| 518 | .check_apicid_present = numaq_check_apicid_present, | ||
| 519 | |||
| 520 | .vector_allocation_domain = numaq_vector_allocation_domain, | ||
| 521 | .init_apic_ldr = numaq_init_apic_ldr, | ||
| 522 | |||
| 523 | .ioapic_phys_id_map = numaq_ioapic_phys_id_map, | ||
| 524 | .setup_apic_routing = numaq_setup_apic_routing, | ||
| 525 | .multi_timer_check = numaq_multi_timer_check, | ||
| 526 | .apicid_to_node = numaq_apicid_to_node, | ||
| 527 | .cpu_to_logical_apicid = numaq_cpu_to_logical_apicid, | ||
| 528 | .cpu_present_to_apicid = numaq_cpu_present_to_apicid, | ||
| 529 | .apicid_to_cpu_present = numaq_apicid_to_cpu_present, | ||
| 530 | .setup_portio_remap = numaq_setup_portio_remap, | ||
| 531 | .check_phys_apicid_present = numaq_check_phys_apicid_present, | ||
| 532 | .enable_apic_mode = NULL, | ||
| 533 | .phys_pkg_id = numaq_phys_pkg_id, | ||
| 534 | .mps_oem_check = numaq_mps_oem_check, | ||
| 535 | |||
| 536 | .get_apic_id = numaq_get_apic_id, | ||
| 537 | .set_apic_id = NULL, | ||
| 538 | .apic_id_mask = 0x0F << 24, | ||
| 539 | |||
| 540 | .cpu_mask_to_apicid = numaq_cpu_mask_to_apicid, | ||
| 541 | .cpu_mask_to_apicid_and = numaq_cpu_mask_to_apicid_and, | ||
| 542 | |||
| 543 | .send_IPI_mask = numaq_send_IPI_mask, | ||
| 544 | .send_IPI_mask_allbutself = NULL, | ||
| 545 | .send_IPI_allbutself = numaq_send_IPI_allbutself, | ||
| 546 | .send_IPI_all = numaq_send_IPI_all, | ||
| 547 | .send_IPI_self = default_send_IPI_self, | ||
| 548 | |||
| 549 | .wakeup_cpu = NULL, | ||
| 550 | .trampoline_phys_low = NUMAQ_TRAMPOLINE_PHYS_LOW, | ||
| 551 | .trampoline_phys_high = NUMAQ_TRAMPOLINE_PHYS_HIGH, | ||
| 552 | |||
| 553 | /* We don't do anything here because we use NMI's to boot instead */ | ||
| 554 | .wait_for_init_deassert = NULL, | ||
| 555 | |||
| 556 | .smp_callin_clear_local_apic = numaq_smp_callin_clear_local_apic, | ||
| 557 | .inquire_remote_apic = NULL, | ||
| 558 | |||
| 559 | .read = native_apic_mem_read, | ||
| 560 | .write = native_apic_mem_write, | ||
| 561 | .icr_read = native_apic_icr_read, | ||
| 562 | .icr_write = native_apic_icr_write, | ||
| 563 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
| 564 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
| 565 | }; | ||
diff --git a/arch/x86/kernel/apic/probe_32.c b/arch/x86/kernel/apic/probe_32.c new file mode 100644 index 000000000000..c9ec90742e9f --- /dev/null +++ b/arch/x86/kernel/apic/probe_32.c | |||
| @@ -0,0 +1,296 @@ | |||
| 1 | /* | ||
| 2 | * Default generic APIC driver. This handles up to 8 CPUs. | ||
| 3 | * | ||
| 4 | * Copyright 2003 Andi Kleen, SuSE Labs. | ||
| 5 | * Subject to the GNU Public License, v.2 | ||
| 6 | * | ||
| 7 | * Generic x86 APIC driver probe layer. | ||
| 8 | */ | ||
| 9 | #include <linux/threads.h> | ||
| 10 | #include <linux/cpumask.h> | ||
| 11 | #include <linux/module.h> | ||
| 12 | #include <linux/string.h> | ||
| 13 | #include <linux/kernel.h> | ||
| 14 | #include <linux/ctype.h> | ||
| 15 | #include <linux/init.h> | ||
| 16 | #include <linux/errno.h> | ||
| 17 | #include <asm/fixmap.h> | ||
| 18 | #include <asm/mpspec.h> | ||
| 19 | #include <asm/apicdef.h> | ||
| 20 | #include <asm/apic.h> | ||
| 21 | #include <asm/setup.h> | ||
| 22 | |||
| 23 | #include <linux/threads.h> | ||
| 24 | #include <linux/cpumask.h> | ||
| 25 | #include <asm/mpspec.h> | ||
| 26 | #include <asm/fixmap.h> | ||
| 27 | #include <asm/apicdef.h> | ||
| 28 | #include <linux/kernel.h> | ||
| 29 | #include <linux/string.h> | ||
| 30 | #include <linux/smp.h> | ||
| 31 | #include <linux/init.h> | ||
| 32 | #include <asm/ipi.h> | ||
| 33 | |||
| 34 | #include <linux/smp.h> | ||
| 35 | #include <linux/init.h> | ||
| 36 | #include <linux/interrupt.h> | ||
| 37 | #include <asm/acpi.h> | ||
| 38 | #include <asm/arch_hooks.h> | ||
| 39 | #include <asm/e820.h> | ||
| 40 | #include <asm/setup.h> | ||
| 41 | |||
| 42 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 43 | #define DEFAULT_SEND_IPI (1) | ||
| 44 | #else | ||
| 45 | #define DEFAULT_SEND_IPI (0) | ||
| 46 | #endif | ||
| 47 | |||
| 48 | int no_broadcast = DEFAULT_SEND_IPI; | ||
| 49 | |||
| 50 | static __init int no_ipi_broadcast(char *str) | ||
| 51 | { | ||
| 52 | get_option(&str, &no_broadcast); | ||
| 53 | pr_info("Using %s mode\n", | ||
| 54 | no_broadcast ? "No IPI Broadcast" : "IPI Broadcast"); | ||
| 55 | return 1; | ||
| 56 | } | ||
| 57 | __setup("no_ipi_broadcast=", no_ipi_broadcast); | ||
| 58 | |||
| 59 | static int __init print_ipi_mode(void) | ||
| 60 | { | ||
| 61 | pr_info("Using IPI %s mode\n", | ||
| 62 | no_broadcast ? "No-Shortcut" : "Shortcut"); | ||
| 63 | return 0; | ||
| 64 | } | ||
| 65 | late_initcall(print_ipi_mode); | ||
| 66 | |||
| 67 | void default_setup_apic_routing(void) | ||
| 68 | { | ||
| 69 | #ifdef CONFIG_X86_IO_APIC | ||
| 70 | printk(KERN_INFO | ||
| 71 | "Enabling APIC mode: Flat. Using %d I/O APICs\n", | ||
| 72 | nr_ioapics); | ||
| 73 | #endif | ||
| 74 | } | ||
| 75 | |||
| 76 | static void default_vector_allocation_domain(int cpu, struct cpumask *retmask) | ||
| 77 | { | ||
| 78 | /* | ||
| 79 | * Careful. Some cpus do not strictly honor the set of cpus | ||
| 80 | * specified in the interrupt destination when using lowest | ||
| 81 | * priority interrupt delivery mode. | ||
| 82 | * | ||
| 83 | * In particular there was a hyperthreading cpu observed to | ||
| 84 | * deliver interrupts to the wrong hyperthread when only one | ||
| 85 | * hyperthread was specified in the interrupt desitination. | ||
| 86 | */ | ||
| 87 | *retmask = (cpumask_t) { { [0] = APIC_ALL_CPUS } }; | ||
| 88 | } | ||
| 89 | |||
| 90 | /* should be called last. */ | ||
| 91 | static int probe_default(void) | ||
| 92 | { | ||
| 93 | return 1; | ||
| 94 | } | ||
| 95 | |||
| 96 | struct apic apic_default = { | ||
| 97 | |||
| 98 | .name = "default", | ||
| 99 | .probe = probe_default, | ||
| 100 | .acpi_madt_oem_check = NULL, | ||
| 101 | .apic_id_registered = default_apic_id_registered, | ||
| 102 | |||
| 103 | .irq_delivery_mode = dest_LowestPrio, | ||
| 104 | /* logical delivery broadcast to all CPUs: */ | ||
| 105 | .irq_dest_mode = 1, | ||
| 106 | |||
| 107 | .target_cpus = default_target_cpus, | ||
| 108 | .disable_esr = 0, | ||
| 109 | .dest_logical = APIC_DEST_LOGICAL, | ||
| 110 | .check_apicid_used = default_check_apicid_used, | ||
| 111 | .check_apicid_present = default_check_apicid_present, | ||
| 112 | |||
| 113 | .vector_allocation_domain = default_vector_allocation_domain, | ||
| 114 | .init_apic_ldr = default_init_apic_ldr, | ||
| 115 | |||
| 116 | .ioapic_phys_id_map = default_ioapic_phys_id_map, | ||
| 117 | .setup_apic_routing = default_setup_apic_routing, | ||
| 118 | .multi_timer_check = NULL, | ||
| 119 | .apicid_to_node = default_apicid_to_node, | ||
| 120 | .cpu_to_logical_apicid = default_cpu_to_logical_apicid, | ||
| 121 | .cpu_present_to_apicid = default_cpu_present_to_apicid, | ||
| 122 | .apicid_to_cpu_present = default_apicid_to_cpu_present, | ||
| 123 | .setup_portio_remap = NULL, | ||
| 124 | .check_phys_apicid_present = default_check_phys_apicid_present, | ||
| 125 | .enable_apic_mode = NULL, | ||
| 126 | .phys_pkg_id = default_phys_pkg_id, | ||
| 127 | .mps_oem_check = NULL, | ||
| 128 | |||
| 129 | .get_apic_id = default_get_apic_id, | ||
| 130 | .set_apic_id = NULL, | ||
| 131 | .apic_id_mask = 0x0F << 24, | ||
| 132 | |||
| 133 | .cpu_mask_to_apicid = default_cpu_mask_to_apicid, | ||
| 134 | .cpu_mask_to_apicid_and = default_cpu_mask_to_apicid_and, | ||
| 135 | |||
| 136 | .send_IPI_mask = default_send_IPI_mask_logical, | ||
| 137 | .send_IPI_mask_allbutself = default_send_IPI_mask_allbutself_logical, | ||
| 138 | .send_IPI_allbutself = default_send_IPI_allbutself, | ||
| 139 | .send_IPI_all = default_send_IPI_all, | ||
| 140 | .send_IPI_self = default_send_IPI_self, | ||
| 141 | |||
| 142 | .wakeup_cpu = NULL, | ||
| 143 | .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, | ||
| 144 | .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, | ||
| 145 | |||
| 146 | .wait_for_init_deassert = default_wait_for_init_deassert, | ||
| 147 | |||
| 148 | .smp_callin_clear_local_apic = NULL, | ||
| 149 | .inquire_remote_apic = default_inquire_remote_apic, | ||
| 150 | |||
| 151 | .read = native_apic_mem_read, | ||
| 152 | .write = native_apic_mem_write, | ||
| 153 | .icr_read = native_apic_icr_read, | ||
| 154 | .icr_write = native_apic_icr_write, | ||
| 155 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
| 156 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
| 157 | }; | ||
| 158 | |||
| 159 | extern struct apic apic_numaq; | ||
| 160 | extern struct apic apic_summit; | ||
| 161 | extern struct apic apic_bigsmp; | ||
| 162 | extern struct apic apic_es7000; | ||
| 163 | extern struct apic apic_default; | ||
| 164 | |||
| 165 | struct apic *apic = &apic_default; | ||
| 166 | EXPORT_SYMBOL_GPL(apic); | ||
| 167 | |||
| 168 | static struct apic *apic_probe[] __initdata = { | ||
| 169 | #ifdef CONFIG_X86_NUMAQ | ||
| 170 | &apic_numaq, | ||
| 171 | #endif | ||
| 172 | #ifdef CONFIG_X86_SUMMIT | ||
| 173 | &apic_summit, | ||
| 174 | #endif | ||
| 175 | #ifdef CONFIG_X86_BIGSMP | ||
| 176 | &apic_bigsmp, | ||
| 177 | #endif | ||
| 178 | #ifdef CONFIG_X86_ES7000 | ||
| 179 | &apic_es7000, | ||
| 180 | #endif | ||
| 181 | &apic_default, /* must be last */ | ||
| 182 | NULL, | ||
| 183 | }; | ||
| 184 | |||
| 185 | static int cmdline_apic __initdata; | ||
| 186 | static int __init parse_apic(char *arg) | ||
| 187 | { | ||
| 188 | int i; | ||
| 189 | |||
| 190 | if (!arg) | ||
| 191 | return -EINVAL; | ||
| 192 | |||
| 193 | for (i = 0; apic_probe[i]; i++) { | ||
| 194 | if (!strcmp(apic_probe[i]->name, arg)) { | ||
| 195 | apic = apic_probe[i]; | ||
| 196 | cmdline_apic = 1; | ||
| 197 | return 0; | ||
| 198 | } | ||
| 199 | } | ||
| 200 | |||
| 201 | if (x86_quirks->update_apic) | ||
| 202 | x86_quirks->update_apic(); | ||
| 203 | |||
| 204 | /* Parsed again by __setup for debug/verbose */ | ||
| 205 | return 0; | ||
| 206 | } | ||
| 207 | early_param("apic", parse_apic); | ||
| 208 | |||
| 209 | void __init generic_bigsmp_probe(void) | ||
| 210 | { | ||
| 211 | #ifdef CONFIG_X86_BIGSMP | ||
| 212 | /* | ||
| 213 | * This routine is used to switch to bigsmp mode when | ||
| 214 | * - There is no apic= option specified by the user | ||
| 215 | * - generic_apic_probe() has chosen apic_default as the sub_arch | ||
| 216 | * - we find more than 8 CPUs in acpi LAPIC listing with xAPIC support | ||
| 217 | */ | ||
| 218 | |||
| 219 | if (!cmdline_apic && apic == &apic_default) { | ||
| 220 | if (apic_bigsmp.probe()) { | ||
| 221 | apic = &apic_bigsmp; | ||
| 222 | if (x86_quirks->update_apic) | ||
| 223 | x86_quirks->update_apic(); | ||
| 224 | printk(KERN_INFO "Overriding APIC driver with %s\n", | ||
| 225 | apic->name); | ||
| 226 | } | ||
| 227 | } | ||
| 228 | #endif | ||
| 229 | } | ||
| 230 | |||
| 231 | void __init generic_apic_probe(void) | ||
| 232 | { | ||
| 233 | if (!cmdline_apic) { | ||
| 234 | int i; | ||
| 235 | for (i = 0; apic_probe[i]; i++) { | ||
| 236 | if (apic_probe[i]->probe()) { | ||
| 237 | apic = apic_probe[i]; | ||
| 238 | break; | ||
| 239 | } | ||
| 240 | } | ||
| 241 | /* Not visible without early console */ | ||
| 242 | if (!apic_probe[i]) | ||
| 243 | panic("Didn't find an APIC driver"); | ||
| 244 | |||
| 245 | if (x86_quirks->update_apic) | ||
| 246 | x86_quirks->update_apic(); | ||
| 247 | } | ||
| 248 | printk(KERN_INFO "Using APIC driver %s\n", apic->name); | ||
| 249 | } | ||
| 250 | |||
| 251 | /* These functions can switch the APIC even after the initial ->probe() */ | ||
| 252 | |||
| 253 | int __init | ||
| 254 | generic_mps_oem_check(struct mpc_table *mpc, char *oem, char *productid) | ||
| 255 | { | ||
| 256 | int i; | ||
| 257 | |||
| 258 | for (i = 0; apic_probe[i]; ++i) { | ||
| 259 | if (!apic_probe[i]->mps_oem_check) | ||
| 260 | continue; | ||
| 261 | if (!apic_probe[i]->mps_oem_check(mpc, oem, productid)) | ||
| 262 | continue; | ||
| 263 | |||
| 264 | if (!cmdline_apic) { | ||
| 265 | apic = apic_probe[i]; | ||
| 266 | if (x86_quirks->update_apic) | ||
| 267 | x86_quirks->update_apic(); | ||
| 268 | printk(KERN_INFO "Switched to APIC driver `%s'.\n", | ||
| 269 | apic->name); | ||
| 270 | } | ||
| 271 | return 1; | ||
| 272 | } | ||
| 273 | return 0; | ||
| 274 | } | ||
| 275 | |||
| 276 | int __init default_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | ||
| 277 | { | ||
| 278 | int i; | ||
| 279 | |||
| 280 | for (i = 0; apic_probe[i]; ++i) { | ||
| 281 | if (!apic_probe[i]->acpi_madt_oem_check) | ||
| 282 | continue; | ||
| 283 | if (!apic_probe[i]->acpi_madt_oem_check(oem_id, oem_table_id)) | ||
| 284 | continue; | ||
| 285 | |||
| 286 | if (!cmdline_apic) { | ||
| 287 | apic = apic_probe[i]; | ||
| 288 | if (x86_quirks->update_apic) | ||
| 289 | x86_quirks->update_apic(); | ||
| 290 | printk(KERN_INFO "Switched to APIC driver `%s'.\n", | ||
| 291 | apic->name); | ||
| 292 | } | ||
| 293 | return 1; | ||
| 294 | } | ||
| 295 | return 0; | ||
| 296 | } | ||
diff --git a/arch/x86/kernel/genapic_64.c b/arch/x86/kernel/apic/probe_64.c index 2bced78b0b8e..70935dd904db 100644 --- a/arch/x86/kernel/genapic_64.c +++ b/arch/x86/kernel/apic/probe_64.c | |||
| @@ -19,22 +19,27 @@ | |||
| 19 | #include <linux/dmar.h> | 19 | #include <linux/dmar.h> |
| 20 | 20 | ||
| 21 | #include <asm/smp.h> | 21 | #include <asm/smp.h> |
| 22 | #include <asm/apic.h> | ||
| 22 | #include <asm/ipi.h> | 23 | #include <asm/ipi.h> |
| 23 | #include <asm/genapic.h> | ||
| 24 | #include <asm/setup.h> | 24 | #include <asm/setup.h> |
| 25 | 25 | ||
| 26 | extern struct genapic apic_flat; | 26 | extern struct apic apic_flat; |
| 27 | extern struct genapic apic_physflat; | 27 | extern struct apic apic_physflat; |
| 28 | extern struct genapic apic_x2xpic_uv_x; | 28 | extern struct apic apic_x2xpic_uv_x; |
| 29 | extern struct genapic apic_x2apic_phys; | 29 | extern struct apic apic_x2apic_phys; |
| 30 | extern struct genapic apic_x2apic_cluster; | 30 | extern struct apic apic_x2apic_cluster; |
| 31 | 31 | ||
| 32 | struct genapic __read_mostly *genapic = &apic_flat; | 32 | struct apic __read_mostly *apic = &apic_flat; |
| 33 | EXPORT_SYMBOL_GPL(apic); | ||
| 33 | 34 | ||
| 34 | static struct genapic *apic_probe[] __initdata = { | 35 | static struct apic *apic_probe[] __initdata = { |
| 36 | #ifdef CONFIG_X86_UV | ||
| 35 | &apic_x2apic_uv_x, | 37 | &apic_x2apic_uv_x, |
| 38 | #endif | ||
| 39 | #ifdef CONFIG_X86_X2APIC | ||
| 36 | &apic_x2apic_phys, | 40 | &apic_x2apic_phys, |
| 37 | &apic_x2apic_cluster, | 41 | &apic_x2apic_cluster, |
| 42 | #endif | ||
| 38 | &apic_physflat, | 43 | &apic_physflat, |
| 39 | NULL, | 44 | NULL, |
| 40 | }; | 45 | }; |
| @@ -42,39 +47,41 @@ static struct genapic *apic_probe[] __initdata = { | |||
| 42 | /* | 47 | /* |
| 43 | * Check the APIC IDs in bios_cpu_apicid and choose the APIC mode. | 48 | * Check the APIC IDs in bios_cpu_apicid and choose the APIC mode. |
| 44 | */ | 49 | */ |
| 45 | void __init setup_apic_routing(void) | 50 | void __init default_setup_apic_routing(void) |
| 46 | { | 51 | { |
| 47 | if (genapic == &apic_x2apic_phys || genapic == &apic_x2apic_cluster) { | 52 | #ifdef CONFIG_X86_X2APIC |
| 53 | if (apic == &apic_x2apic_phys || apic == &apic_x2apic_cluster) { | ||
| 48 | if (!intr_remapping_enabled) | 54 | if (!intr_remapping_enabled) |
| 49 | genapic = &apic_flat; | 55 | apic = &apic_flat; |
| 50 | } | 56 | } |
| 57 | #endif | ||
| 51 | 58 | ||
| 52 | if (genapic == &apic_flat) { | 59 | if (apic == &apic_flat) { |
| 53 | if (max_physical_apicid >= 8) | 60 | if (max_physical_apicid >= 8) |
| 54 | genapic = &apic_physflat; | 61 | apic = &apic_physflat; |
| 55 | printk(KERN_INFO "Setting APIC routing to %s\n", genapic->name); | 62 | printk(KERN_INFO "Setting APIC routing to %s\n", apic->name); |
| 56 | } | 63 | } |
| 57 | 64 | ||
| 58 | if (x86_quirks->update_genapic) | 65 | if (x86_quirks->update_apic) |
| 59 | x86_quirks->update_genapic(); | 66 | x86_quirks->update_apic(); |
| 60 | } | 67 | } |
| 61 | 68 | ||
| 62 | /* Same for both flat and physical. */ | 69 | /* Same for both flat and physical. */ |
| 63 | 70 | ||
| 64 | void apic_send_IPI_self(int vector) | 71 | void apic_send_IPI_self(int vector) |
| 65 | { | 72 | { |
| 66 | __send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL); | 73 | __default_send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL); |
| 67 | } | 74 | } |
| 68 | 75 | ||
| 69 | int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id) | 76 | int __init default_acpi_madt_oem_check(char *oem_id, char *oem_table_id) |
| 70 | { | 77 | { |
| 71 | int i; | 78 | int i; |
| 72 | 79 | ||
| 73 | for (i = 0; apic_probe[i]; ++i) { | 80 | for (i = 0; apic_probe[i]; ++i) { |
| 74 | if (apic_probe[i]->acpi_madt_oem_check(oem_id, oem_table_id)) { | 81 | if (apic_probe[i]->acpi_madt_oem_check(oem_id, oem_table_id)) { |
| 75 | genapic = apic_probe[i]; | 82 | apic = apic_probe[i]; |
| 76 | printk(KERN_INFO "Setting APIC routing to %s.\n", | 83 | printk(KERN_INFO "Setting APIC routing to %s.\n", |
| 77 | genapic->name); | 84 | apic->name); |
| 78 | return 1; | 85 | return 1; |
| 79 | } | 86 | } |
| 80 | } | 87 | } |
diff --git a/arch/x86/kernel/apic/summit_32.c b/arch/x86/kernel/apic/summit_32.c new file mode 100644 index 000000000000..cfe7b09015d8 --- /dev/null +++ b/arch/x86/kernel/apic/summit_32.c | |||
| @@ -0,0 +1,601 @@ | |||
| 1 | /* | ||
| 2 | * IBM Summit-Specific Code | ||
| 3 | * | ||
| 4 | * Written By: Matthew Dobson, IBM Corporation | ||
| 5 | * | ||
| 6 | * Copyright (c) 2003 IBM Corp. | ||
| 7 | * | ||
| 8 | * All rights reserved. | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License as published by | ||
| 12 | * the Free Software Foundation; either version 2 of the License, or (at | ||
| 13 | * your option) any later version. | ||
| 14 | * | ||
| 15 | * This program is distributed in the hope that it will be useful, but | ||
| 16 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 17 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
| 18 | * NON INFRINGEMENT. See the GNU General Public License for more | ||
| 19 | * details. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License | ||
| 22 | * along with this program; if not, write to the Free Software | ||
| 23 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 24 | * | ||
| 25 | * Send feedback to <colpatch@us.ibm.com> | ||
| 26 | * | ||
| 27 | */ | ||
| 28 | |||
| 29 | #include <linux/mm.h> | ||
| 30 | #include <linux/init.h> | ||
| 31 | #include <asm/io.h> | ||
| 32 | #include <asm/bios_ebda.h> | ||
| 33 | |||
| 34 | /* | ||
| 35 | * APIC driver for the IBM "Summit" chipset. | ||
| 36 | */ | ||
| 37 | #include <linux/threads.h> | ||
| 38 | #include <linux/cpumask.h> | ||
| 39 | #include <asm/mpspec.h> | ||
| 40 | #include <asm/apic.h> | ||
| 41 | #include <asm/smp.h> | ||
| 42 | #include <asm/fixmap.h> | ||
| 43 | #include <asm/apicdef.h> | ||
| 44 | #include <asm/ipi.h> | ||
| 45 | #include <linux/kernel.h> | ||
| 46 | #include <linux/string.h> | ||
| 47 | #include <linux/init.h> | ||
| 48 | #include <linux/gfp.h> | ||
| 49 | #include <linux/smp.h> | ||
| 50 | |||
| 51 | static inline unsigned summit_get_apic_id(unsigned long x) | ||
| 52 | { | ||
| 53 | return (x >> 24) & 0xFF; | ||
| 54 | } | ||
| 55 | |||
| 56 | static inline void summit_send_IPI_mask(const cpumask_t *mask, int vector) | ||
| 57 | { | ||
| 58 | default_send_IPI_mask_sequence_logical(mask, vector); | ||
| 59 | } | ||
| 60 | |||
| 61 | static inline void summit_send_IPI_allbutself(int vector) | ||
| 62 | { | ||
| 63 | cpumask_t mask = cpu_online_map; | ||
| 64 | cpu_clear(smp_processor_id(), mask); | ||
| 65 | |||
| 66 | if (!cpus_empty(mask)) | ||
| 67 | summit_send_IPI_mask(&mask, vector); | ||
| 68 | } | ||
| 69 | |||
| 70 | static inline void summit_send_IPI_all(int vector) | ||
| 71 | { | ||
| 72 | summit_send_IPI_mask(&cpu_online_map, vector); | ||
| 73 | } | ||
| 74 | |||
| 75 | #include <asm/tsc.h> | ||
| 76 | |||
| 77 | extern int use_cyclone; | ||
| 78 | |||
| 79 | #ifdef CONFIG_X86_SUMMIT_NUMA | ||
| 80 | extern void setup_summit(void); | ||
| 81 | #else | ||
| 82 | #define setup_summit() {} | ||
| 83 | #endif | ||
| 84 | |||
| 85 | static inline int | ||
| 86 | summit_mps_oem_check(struct mpc_table *mpc, char *oem, char *productid) | ||
| 87 | { | ||
| 88 | if (!strncmp(oem, "IBM ENSW", 8) && | ||
| 89 | (!strncmp(productid, "VIGIL SMP", 9) | ||
| 90 | || !strncmp(productid, "EXA", 3) | ||
| 91 | || !strncmp(productid, "RUTHLESS SMP", 12))){ | ||
| 92 | mark_tsc_unstable("Summit based system"); | ||
| 93 | use_cyclone = 1; /*enable cyclone-timer*/ | ||
| 94 | setup_summit(); | ||
| 95 | return 1; | ||
| 96 | } | ||
| 97 | return 0; | ||
| 98 | } | ||
| 99 | |||
| 100 | /* Hook from generic ACPI tables.c */ | ||
| 101 | static inline int summit_acpi_madt_oem_check(char *oem_id, char *oem_table_id) | ||
| 102 | { | ||
| 103 | if (!strncmp(oem_id, "IBM", 3) && | ||
| 104 | (!strncmp(oem_table_id, "SERVIGIL", 8) | ||
| 105 | || !strncmp(oem_table_id, "EXA", 3))){ | ||
| 106 | mark_tsc_unstable("Summit based system"); | ||
| 107 | use_cyclone = 1; /*enable cyclone-timer*/ | ||
| 108 | setup_summit(); | ||
| 109 | return 1; | ||
| 110 | } | ||
| 111 | return 0; | ||
| 112 | } | ||
| 113 | |||
| 114 | struct rio_table_hdr { | ||
| 115 | unsigned char version; /* Version number of this data structure */ | ||
| 116 | /* Version 3 adds chassis_num & WP_index */ | ||
| 117 | unsigned char num_scal_dev; /* # of Scalability devices (Twisters for Vigil) */ | ||
| 118 | unsigned char num_rio_dev; /* # of RIO I/O devices (Cyclones and Winnipegs) */ | ||
| 119 | } __attribute__((packed)); | ||
| 120 | |||
| 121 | struct scal_detail { | ||
| 122 | unsigned char node_id; /* Scalability Node ID */ | ||
| 123 | unsigned long CBAR; /* Address of 1MB register space */ | ||
| 124 | unsigned char port0node; /* Node ID port connected to: 0xFF=None */ | ||
| 125 | unsigned char port0port; /* Port num port connected to: 0,1,2, or 0xFF=None */ | ||
| 126 | unsigned char port1node; /* Node ID port connected to: 0xFF = None */ | ||
| 127 | unsigned char port1port; /* Port num port connected to: 0,1,2, or 0xFF=None */ | ||
| 128 | unsigned char port2node; /* Node ID port connected to: 0xFF = None */ | ||
| 129 | unsigned char port2port; /* Port num port connected to: 0,1,2, or 0xFF=None */ | ||
| 130 | unsigned char chassis_num; /* 1 based Chassis number (1 = boot node) */ | ||
| 131 | } __attribute__((packed)); | ||
| 132 | |||
| 133 | struct rio_detail { | ||
| 134 | unsigned char node_id; /* RIO Node ID */ | ||
| 135 | unsigned long BBAR; /* Address of 1MB register space */ | ||
| 136 | unsigned char type; /* Type of device */ | ||
| 137 | unsigned char owner_id; /* For WPEG: Node ID of Cyclone that owns this WPEG*/ | ||
| 138 | /* For CYC: Node ID of Twister that owns this CYC */ | ||
| 139 | unsigned char port0node; /* Node ID port connected to: 0xFF=None */ | ||
| 140 | unsigned char port0port; /* Port num port connected to: 0,1,2, or 0xFF=None */ | ||
| 141 | unsigned char port1node; /* Node ID port connected to: 0xFF=None */ | ||
| 142 | unsigned char port1port; /* Port num port connected to: 0,1,2, or 0xFF=None */ | ||
| 143 | unsigned char first_slot; /* For WPEG: Lowest slot number below this WPEG */ | ||
| 144 | /* For CYC: 0 */ | ||
| 145 | unsigned char status; /* For WPEG: Bit 0 = 1 : the XAPIC is used */ | ||
| 146 | /* = 0 : the XAPIC is not used, ie:*/ | ||
| 147 | /* ints fwded to another XAPIC */ | ||
| 148 | /* Bits1:7 Reserved */ | ||
| 149 | /* For CYC: Bits0:7 Reserved */ | ||
| 150 | unsigned char WP_index; /* For WPEG: WPEG instance index - lower ones have */ | ||
| 151 | /* lower slot numbers/PCI bus numbers */ | ||
| 152 | /* For CYC: No meaning */ | ||
| 153 | unsigned char chassis_num; /* 1 based Chassis number */ | ||
| 154 | /* For LookOut WPEGs this field indicates the */ | ||
| 155 | /* Expansion Chassis #, enumerated from Boot */ | ||
| 156 | /* Node WPEG external port, then Boot Node CYC */ | ||
| 157 | /* external port, then Next Vigil chassis WPEG */ | ||
| 158 | /* external port, etc. */ | ||
| 159 | /* Shared Lookouts have only 1 chassis number (the */ | ||
| 160 | /* first one assigned) */ | ||
| 161 | } __attribute__((packed)); | ||
| 162 | |||
| 163 | |||
| 164 | typedef enum { | ||
| 165 | CompatTwister = 0, /* Compatibility Twister */ | ||
| 166 | AltTwister = 1, /* Alternate Twister of internal 8-way */ | ||
| 167 | CompatCyclone = 2, /* Compatibility Cyclone */ | ||
| 168 | AltCyclone = 3, /* Alternate Cyclone of internal 8-way */ | ||
| 169 | CompatWPEG = 4, /* Compatibility WPEG */ | ||
| 170 | AltWPEG = 5, /* Second Planar WPEG */ | ||
| 171 | LookOutAWPEG = 6, /* LookOut WPEG */ | ||
| 172 | LookOutBWPEG = 7, /* LookOut WPEG */ | ||
| 173 | } node_type; | ||
| 174 | |||
| 175 | static inline int is_WPEG(struct rio_detail *rio){ | ||
| 176 | return (rio->type == CompatWPEG || rio->type == AltWPEG || | ||
| 177 | rio->type == LookOutAWPEG || rio->type == LookOutBWPEG); | ||
| 178 | } | ||
| 179 | |||
| 180 | |||
| 181 | /* In clustered mode, the high nibble of APIC ID is a cluster number. | ||
| 182 | * The low nibble is a 4-bit bitmap. */ | ||
| 183 | #define XAPIC_DEST_CPUS_SHIFT 4 | ||
| 184 | #define XAPIC_DEST_CPUS_MASK ((1u << XAPIC_DEST_CPUS_SHIFT) - 1) | ||
| 185 | #define XAPIC_DEST_CLUSTER_MASK (XAPIC_DEST_CPUS_MASK << XAPIC_DEST_CPUS_SHIFT) | ||
| 186 | |||
| 187 | #define SUMMIT_APIC_DFR_VALUE (APIC_DFR_CLUSTER) | ||
| 188 | |||
| 189 | static inline const cpumask_t *summit_target_cpus(void) | ||
| 190 | { | ||
| 191 | /* CPU_MASK_ALL (0xff) has undefined behaviour with | ||
| 192 | * dest_LowestPrio mode logical clustered apic interrupt routing | ||
| 193 | * Just start on cpu 0. IRQ balancing will spread load | ||
| 194 | */ | ||
| 195 | return &cpumask_of_cpu(0); | ||
| 196 | } | ||
| 197 | |||
| 198 | static inline unsigned long | ||
| 199 | summit_check_apicid_used(physid_mask_t bitmap, int apicid) | ||
| 200 | { | ||
| 201 | return 0; | ||
| 202 | } | ||
| 203 | |||
| 204 | /* we don't use the phys_cpu_present_map to indicate apicid presence */ | ||
| 205 | static inline unsigned long summit_check_apicid_present(int bit) | ||
| 206 | { | ||
| 207 | return 1; | ||
| 208 | } | ||
| 209 | |||
| 210 | static inline void summit_init_apic_ldr(void) | ||
| 211 | { | ||
| 212 | unsigned long val, id; | ||
| 213 | int count = 0; | ||
| 214 | u8 my_id = (u8)hard_smp_processor_id(); | ||
| 215 | u8 my_cluster = APIC_CLUSTER(my_id); | ||
| 216 | #ifdef CONFIG_SMP | ||
| 217 | u8 lid; | ||
| 218 | int i; | ||
| 219 | |||
| 220 | /* Create logical APIC IDs by counting CPUs already in cluster. */ | ||
| 221 | for (count = 0, i = nr_cpu_ids; --i >= 0; ) { | ||
| 222 | lid = cpu_2_logical_apicid[i]; | ||
| 223 | if (lid != BAD_APICID && APIC_CLUSTER(lid) == my_cluster) | ||
| 224 | ++count; | ||
| 225 | } | ||
| 226 | #endif | ||
| 227 | /* We only have a 4 wide bitmap in cluster mode. If a deranged | ||
| 228 | * BIOS puts 5 CPUs in one APIC cluster, we're hosed. */ | ||
| 229 | BUG_ON(count >= XAPIC_DEST_CPUS_SHIFT); | ||
| 230 | id = my_cluster | (1UL << count); | ||
| 231 | apic_write(APIC_DFR, SUMMIT_APIC_DFR_VALUE); | ||
| 232 | val = apic_read(APIC_LDR) & ~APIC_LDR_MASK; | ||
| 233 | val |= SET_APIC_LOGICAL_ID(id); | ||
| 234 | apic_write(APIC_LDR, val); | ||
| 235 | } | ||
| 236 | |||
| 237 | static inline int summit_apic_id_registered(void) | ||
| 238 | { | ||
| 239 | return 1; | ||
| 240 | } | ||
| 241 | |||
| 242 | static inline void summit_setup_apic_routing(void) | ||
| 243 | { | ||
| 244 | printk("Enabling APIC mode: Summit. Using %d I/O APICs\n", | ||
| 245 | nr_ioapics); | ||
| 246 | } | ||
| 247 | |||
| 248 | static inline int summit_apicid_to_node(int logical_apicid) | ||
| 249 | { | ||
| 250 | #ifdef CONFIG_SMP | ||
| 251 | return apicid_2_node[hard_smp_processor_id()]; | ||
| 252 | #else | ||
| 253 | return 0; | ||
| 254 | #endif | ||
| 255 | } | ||
| 256 | |||
| 257 | /* Mapping from cpu number to logical apicid */ | ||
| 258 | static inline int summit_cpu_to_logical_apicid(int cpu) | ||
| 259 | { | ||
| 260 | #ifdef CONFIG_SMP | ||
| 261 | if (cpu >= nr_cpu_ids) | ||
| 262 | return BAD_APICID; | ||
| 263 | return cpu_2_logical_apicid[cpu]; | ||
| 264 | #else | ||
| 265 | return logical_smp_processor_id(); | ||
| 266 | #endif | ||
| 267 | } | ||
| 268 | |||
| 269 | static inline int summit_cpu_present_to_apicid(int mps_cpu) | ||
| 270 | { | ||
| 271 | if (mps_cpu < nr_cpu_ids) | ||
| 272 | return (int)per_cpu(x86_bios_cpu_apicid, mps_cpu); | ||
| 273 | else | ||
| 274 | return BAD_APICID; | ||
| 275 | } | ||
| 276 | |||
| 277 | static inline physid_mask_t | ||
| 278 | summit_ioapic_phys_id_map(physid_mask_t phys_id_map) | ||
| 279 | { | ||
| 280 | /* For clustered we don't have a good way to do this yet - hack */ | ||
| 281 | return physids_promote(0x0F); | ||
| 282 | } | ||
| 283 | |||
| 284 | static inline physid_mask_t summit_apicid_to_cpu_present(int apicid) | ||
| 285 | { | ||
| 286 | return physid_mask_of_physid(0); | ||
| 287 | } | ||
| 288 | |||
| 289 | static inline void summit_setup_portio_remap(void) | ||
| 290 | { | ||
| 291 | } | ||
| 292 | |||
| 293 | static inline int summit_check_phys_apicid_present(int boot_cpu_physical_apicid) | ||
| 294 | { | ||
| 295 | return 1; | ||
| 296 | } | ||
| 297 | |||
| 298 | static inline unsigned int summit_cpu_mask_to_apicid(const cpumask_t *cpumask) | ||
| 299 | { | ||
| 300 | int cpus_found = 0; | ||
| 301 | int num_bits_set; | ||
| 302 | int apicid; | ||
| 303 | int cpu; | ||
| 304 | |||
| 305 | num_bits_set = cpus_weight(*cpumask); | ||
| 306 | /* Return id to all */ | ||
| 307 | if (num_bits_set >= nr_cpu_ids) | ||
| 308 | return 0xFF; | ||
| 309 | /* | ||
| 310 | * The cpus in the mask must all be on the apic cluster. If are not | ||
| 311 | * on the same apicid cluster return default value of target_cpus(): | ||
| 312 | */ | ||
| 313 | cpu = first_cpu(*cpumask); | ||
| 314 | apicid = summit_cpu_to_logical_apicid(cpu); | ||
| 315 | |||
| 316 | while (cpus_found < num_bits_set) { | ||
| 317 | if (cpu_isset(cpu, *cpumask)) { | ||
| 318 | int new_apicid = summit_cpu_to_logical_apicid(cpu); | ||
| 319 | |||
| 320 | if (APIC_CLUSTER(apicid) != APIC_CLUSTER(new_apicid)) { | ||
| 321 | printk ("%s: Not a valid mask!\n", __func__); | ||
| 322 | |||
| 323 | return 0xFF; | ||
| 324 | } | ||
| 325 | apicid = apicid | new_apicid; | ||
| 326 | cpus_found++; | ||
| 327 | } | ||
| 328 | cpu++; | ||
| 329 | } | ||
| 330 | return apicid; | ||
| 331 | } | ||
| 332 | |||
| 333 | static inline unsigned int | ||
| 334 | summit_cpu_mask_to_apicid_and(const struct cpumask *inmask, | ||
| 335 | const struct cpumask *andmask) | ||
| 336 | { | ||
| 337 | int apicid = summit_cpu_to_logical_apicid(0); | ||
| 338 | cpumask_var_t cpumask; | ||
| 339 | |||
| 340 | if (!alloc_cpumask_var(&cpumask, GFP_ATOMIC)) | ||
| 341 | return apicid; | ||
| 342 | |||
| 343 | cpumask_and(cpumask, inmask, andmask); | ||
| 344 | cpumask_and(cpumask, cpumask, cpu_online_mask); | ||
| 345 | apicid = summit_cpu_mask_to_apicid(cpumask); | ||
| 346 | |||
| 347 | free_cpumask_var(cpumask); | ||
| 348 | |||
| 349 | return apicid; | ||
| 350 | } | ||
| 351 | |||
| 352 | /* | ||
| 353 | * cpuid returns the value latched in the HW at reset, not the APIC ID | ||
| 354 | * register's value. For any box whose BIOS changes APIC IDs, like | ||
| 355 | * clustered APIC systems, we must use hard_smp_processor_id. | ||
| 356 | * | ||
| 357 | * See Intel's IA-32 SW Dev's Manual Vol2 under CPUID. | ||
| 358 | */ | ||
| 359 | static inline int summit_phys_pkg_id(int cpuid_apic, int index_msb) | ||
| 360 | { | ||
| 361 | return hard_smp_processor_id() >> index_msb; | ||
| 362 | } | ||
| 363 | |||
| 364 | static int probe_summit(void) | ||
| 365 | { | ||
| 366 | /* probed later in mptable/ACPI hooks */ | ||
| 367 | return 0; | ||
| 368 | } | ||
| 369 | |||
| 370 | static void summit_vector_allocation_domain(int cpu, cpumask_t *retmask) | ||
| 371 | { | ||
| 372 | /* Careful. Some cpus do not strictly honor the set of cpus | ||
| 373 | * specified in the interrupt destination when using lowest | ||
| 374 | * priority interrupt delivery mode. | ||
| 375 | * | ||
| 376 | * In particular there was a hyperthreading cpu observed to | ||
| 377 | * deliver interrupts to the wrong hyperthread when only one | ||
| 378 | * hyperthread was specified in the interrupt desitination. | ||
| 379 | */ | ||
| 380 | *retmask = (cpumask_t){ { [0] = APIC_ALL_CPUS, } }; | ||
| 381 | } | ||
| 382 | |||
| 383 | #ifdef CONFIG_X86_SUMMIT_NUMA | ||
| 384 | static struct rio_table_hdr *rio_table_hdr __initdata; | ||
| 385 | static struct scal_detail *scal_devs[MAX_NUMNODES] __initdata; | ||
| 386 | static struct rio_detail *rio_devs[MAX_NUMNODES*4] __initdata; | ||
| 387 | |||
| 388 | #ifndef CONFIG_X86_NUMAQ | ||
| 389 | static int mp_bus_id_to_node[MAX_MP_BUSSES] __initdata; | ||
| 390 | #endif | ||
| 391 | |||
| 392 | static int __init setup_pci_node_map_for_wpeg(int wpeg_num, int last_bus) | ||
| 393 | { | ||
| 394 | int twister = 0, node = 0; | ||
| 395 | int i, bus, num_buses; | ||
| 396 | |||
| 397 | for (i = 0; i < rio_table_hdr->num_rio_dev; i++) { | ||
| 398 | if (rio_devs[i]->node_id == rio_devs[wpeg_num]->owner_id) { | ||
| 399 | twister = rio_devs[i]->owner_id; | ||
| 400 | break; | ||
| 401 | } | ||
| 402 | } | ||
| 403 | if (i == rio_table_hdr->num_rio_dev) { | ||
| 404 | printk(KERN_ERR "%s: Couldn't find owner Cyclone for Winnipeg!\n", __func__); | ||
| 405 | return last_bus; | ||
| 406 | } | ||
| 407 | |||
| 408 | for (i = 0; i < rio_table_hdr->num_scal_dev; i++) { | ||
| 409 | if (scal_devs[i]->node_id == twister) { | ||
| 410 | node = scal_devs[i]->node_id; | ||
| 411 | break; | ||
| 412 | } | ||
| 413 | } | ||
| 414 | if (i == rio_table_hdr->num_scal_dev) { | ||
| 415 | printk(KERN_ERR "%s: Couldn't find owner Twister for Cyclone!\n", __func__); | ||
| 416 | return last_bus; | ||
| 417 | } | ||
| 418 | |||
| 419 | switch (rio_devs[wpeg_num]->type) { | ||
| 420 | case CompatWPEG: | ||
| 421 | /* | ||
| 422 | * The Compatibility Winnipeg controls the 2 legacy buses, | ||
| 423 | * the 66MHz PCI bus [2 slots] and the 2 "extra" buses in case | ||
| 424 | * a PCI-PCI bridge card is used in either slot: total 5 buses. | ||
| 425 | */ | ||
| 426 | num_buses = 5; | ||
| 427 | break; | ||
| 428 | case AltWPEG: | ||
| 429 | /* | ||
| 430 | * The Alternate Winnipeg controls the 2 133MHz buses [1 slot | ||
| 431 | * each], their 2 "extra" buses, the 100MHz bus [2 slots] and | ||
| 432 | * the "extra" buses for each of those slots: total 7 buses. | ||
| 433 | */ | ||
| 434 | num_buses = 7; | ||
| 435 | break; | ||
| 436 | case LookOutAWPEG: | ||
| 437 | case LookOutBWPEG: | ||
| 438 | /* | ||
| 439 | * A Lookout Winnipeg controls 3 100MHz buses [2 slots each] | ||
| 440 | * & the "extra" buses for each of those slots: total 9 buses. | ||
| 441 | */ | ||
| 442 | num_buses = 9; | ||
| 443 | break; | ||
| 444 | default: | ||
| 445 | printk(KERN_INFO "%s: Unsupported Winnipeg type!\n", __func__); | ||
| 446 | return last_bus; | ||
| 447 | } | ||
| 448 | |||
| 449 | for (bus = last_bus; bus < last_bus + num_buses; bus++) | ||
| 450 | mp_bus_id_to_node[bus] = node; | ||
| 451 | return bus; | ||
| 452 | } | ||
| 453 | |||
| 454 | static int __init build_detail_arrays(void) | ||
| 455 | { | ||
| 456 | unsigned long ptr; | ||
| 457 | int i, scal_detail_size, rio_detail_size; | ||
| 458 | |||
| 459 | if (rio_table_hdr->num_scal_dev > MAX_NUMNODES) { | ||
| 460 | printk(KERN_WARNING "%s: MAX_NUMNODES too low! Defined as %d, but system has %d nodes.\n", __func__, MAX_NUMNODES, rio_table_hdr->num_scal_dev); | ||
| 461 | return 0; | ||
| 462 | } | ||
| 463 | |||
| 464 | switch (rio_table_hdr->version) { | ||
| 465 | default: | ||
| 466 | printk(KERN_WARNING "%s: Invalid Rio Grande Table Version: %d\n", __func__, rio_table_hdr->version); | ||
| 467 | return 0; | ||
| 468 | case 2: | ||
| 469 | scal_detail_size = 11; | ||
| 470 | rio_detail_size = 13; | ||
| 471 | break; | ||
| 472 | case 3: | ||
| 473 | scal_detail_size = 12; | ||
| 474 | rio_detail_size = 15; | ||
| 475 | break; | ||
| 476 | } | ||
| 477 | |||
| 478 | ptr = (unsigned long)rio_table_hdr + 3; | ||
| 479 | for (i = 0; i < rio_table_hdr->num_scal_dev; i++, ptr += scal_detail_size) | ||
| 480 | scal_devs[i] = (struct scal_detail *)ptr; | ||
| 481 | |||
| 482 | for (i = 0; i < rio_table_hdr->num_rio_dev; i++, ptr += rio_detail_size) | ||
| 483 | rio_devs[i] = (struct rio_detail *)ptr; | ||
| 484 | |||
| 485 | return 1; | ||
| 486 | } | ||
| 487 | |||
| 488 | void __init setup_summit(void) | ||
| 489 | { | ||
| 490 | unsigned long ptr; | ||
| 491 | unsigned short offset; | ||
| 492 | int i, next_wpeg, next_bus = 0; | ||
| 493 | |||
| 494 | /* The pointer to the EBDA is stored in the word @ phys 0x40E(40:0E) */ | ||
| 495 | ptr = get_bios_ebda(); | ||
| 496 | ptr = (unsigned long)phys_to_virt(ptr); | ||
| 497 | |||
| 498 | rio_table_hdr = NULL; | ||
| 499 | offset = 0x180; | ||
| 500 | while (offset) { | ||
| 501 | /* The block id is stored in the 2nd word */ | ||
| 502 | if (*((unsigned short *)(ptr + offset + 2)) == 0x4752) { | ||
| 503 | /* set the pointer past the offset & block id */ | ||
| 504 | rio_table_hdr = (struct rio_table_hdr *)(ptr + offset + 4); | ||
| 505 | break; | ||
| 506 | } | ||
| 507 | /* The next offset is stored in the 1st word. 0 means no more */ | ||
| 508 | offset = *((unsigned short *)(ptr + offset)); | ||
| 509 | } | ||
| 510 | if (!rio_table_hdr) { | ||
| 511 | printk(KERN_ERR "%s: Unable to locate Rio Grande Table in EBDA - bailing!\n", __func__); | ||
| 512 | return; | ||
| 513 | } | ||
| 514 | |||
| 515 | if (!build_detail_arrays()) | ||
| 516 | return; | ||
| 517 | |||
| 518 | /* The first Winnipeg we're looking for has an index of 0 */ | ||
| 519 | next_wpeg = 0; | ||
| 520 | do { | ||
| 521 | for (i = 0; i < rio_table_hdr->num_rio_dev; i++) { | ||
| 522 | if (is_WPEG(rio_devs[i]) && rio_devs[i]->WP_index == next_wpeg) { | ||
| 523 | /* It's the Winnipeg we're looking for! */ | ||
| 524 | next_bus = setup_pci_node_map_for_wpeg(i, next_bus); | ||
| 525 | next_wpeg++; | ||
| 526 | break; | ||
| 527 | } | ||
| 528 | } | ||
| 529 | /* | ||
| 530 | * If we go through all Rio devices and don't find one with | ||
| 531 | * the next index, it means we've found all the Winnipegs, | ||
| 532 | * and thus all the PCI buses. | ||
| 533 | */ | ||
| 534 | if (i == rio_table_hdr->num_rio_dev) | ||
| 535 | next_wpeg = 0; | ||
| 536 | } while (next_wpeg != 0); | ||
| 537 | } | ||
| 538 | #endif | ||
| 539 | |||
| 540 | struct apic apic_summit = { | ||
| 541 | |||
| 542 | .name = "summit", | ||
| 543 | .probe = probe_summit, | ||
| 544 | .acpi_madt_oem_check = summit_acpi_madt_oem_check, | ||
| 545 | .apic_id_registered = summit_apic_id_registered, | ||
| 546 | |||
| 547 | .irq_delivery_mode = dest_LowestPrio, | ||
| 548 | /* logical delivery broadcast to all CPUs: */ | ||
| 549 | .irq_dest_mode = 1, | ||
| 550 | |||
| 551 | .target_cpus = summit_target_cpus, | ||
| 552 | .disable_esr = 1, | ||
| 553 | .dest_logical = APIC_DEST_LOGICAL, | ||
| 554 | .check_apicid_used = summit_check_apicid_used, | ||
| 555 | .check_apicid_present = summit_check_apicid_present, | ||
| 556 | |||
| 557 | .vector_allocation_domain = summit_vector_allocation_domain, | ||
| 558 | .init_apic_ldr = summit_init_apic_ldr, | ||
| 559 | |||
| 560 | .ioapic_phys_id_map = summit_ioapic_phys_id_map, | ||
| 561 | .setup_apic_routing = summit_setup_apic_routing, | ||
| 562 | .multi_timer_check = NULL, | ||
| 563 | .apicid_to_node = summit_apicid_to_node, | ||
| 564 | .cpu_to_logical_apicid = summit_cpu_to_logical_apicid, | ||
| 565 | .cpu_present_to_apicid = summit_cpu_present_to_apicid, | ||
| 566 | .apicid_to_cpu_present = summit_apicid_to_cpu_present, | ||
| 567 | .setup_portio_remap = NULL, | ||
| 568 | .check_phys_apicid_present = summit_check_phys_apicid_present, | ||
| 569 | .enable_apic_mode = NULL, | ||
| 570 | .phys_pkg_id = summit_phys_pkg_id, | ||
| 571 | .mps_oem_check = summit_mps_oem_check, | ||
| 572 | |||
| 573 | .get_apic_id = summit_get_apic_id, | ||
| 574 | .set_apic_id = NULL, | ||
| 575 | .apic_id_mask = 0xFF << 24, | ||
| 576 | |||
| 577 | .cpu_mask_to_apicid = summit_cpu_mask_to_apicid, | ||
| 578 | .cpu_mask_to_apicid_and = summit_cpu_mask_to_apicid_and, | ||
| 579 | |||
| 580 | .send_IPI_mask = summit_send_IPI_mask, | ||
| 581 | .send_IPI_mask_allbutself = NULL, | ||
| 582 | .send_IPI_allbutself = summit_send_IPI_allbutself, | ||
| 583 | .send_IPI_all = summit_send_IPI_all, | ||
| 584 | .send_IPI_self = default_send_IPI_self, | ||
| 585 | |||
| 586 | .wakeup_cpu = NULL, | ||
| 587 | .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, | ||
| 588 | .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, | ||
| 589 | |||
| 590 | .wait_for_init_deassert = default_wait_for_init_deassert, | ||
| 591 | |||
| 592 | .smp_callin_clear_local_apic = NULL, | ||
| 593 | .inquire_remote_apic = default_inquire_remote_apic, | ||
| 594 | |||
| 595 | .read = native_apic_mem_read, | ||
| 596 | .write = native_apic_mem_write, | ||
| 597 | .icr_read = native_apic_icr_read, | ||
| 598 | .icr_write = native_apic_icr_write, | ||
| 599 | .wait_icr_idle = native_apic_wait_icr_idle, | ||
| 600 | .safe_wait_icr_idle = native_safe_apic_wait_icr_idle, | ||
| 601 | }; | ||
diff --git a/arch/x86/kernel/genx2apic_cluster.c b/arch/x86/kernel/apic/x2apic_cluster.c index 6ce497cc372d..4e39d9ad4d52 100644 --- a/arch/x86/kernel/genx2apic_cluster.c +++ b/arch/x86/kernel/apic/x2apic_cluster.c | |||
| @@ -7,8 +7,8 @@ | |||
| 7 | #include <linux/dmar.h> | 7 | #include <linux/dmar.h> |
| 8 | 8 | ||
| 9 | #include <asm/smp.h> | 9 | #include <asm/smp.h> |
| 10 | #include <asm/apic.h> | ||
| 10 | #include <asm/ipi.h> | 11 | #include <asm/ipi.h> |
| 11 | #include <asm/genapic.h> | ||
| 12 | 12 | ||
| 13 | DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid); | 13 | DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid); |
| 14 | 14 | ||
| @@ -36,8 +36,8 @@ static void x2apic_vector_allocation_domain(int cpu, struct cpumask *retmask) | |||
| 36 | cpumask_set_cpu(cpu, retmask); | 36 | cpumask_set_cpu(cpu, retmask); |
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | static void __x2apic_send_IPI_dest(unsigned int apicid, int vector, | 39 | static void |
| 40 | unsigned int dest) | 40 | __x2apic_send_IPI_dest(unsigned int apicid, int vector, unsigned int dest) |
| 41 | { | 41 | { |
| 42 | unsigned long cfg; | 42 | unsigned long cfg; |
| 43 | 43 | ||
| @@ -46,7 +46,7 @@ static void __x2apic_send_IPI_dest(unsigned int apicid, int vector, | |||
| 46 | /* | 46 | /* |
| 47 | * send the IPI. | 47 | * send the IPI. |
| 48 | */ | 48 | */ |
| 49 | x2apic_icr_write(cfg, apicid); | 49 | native_x2apic_icr_write(cfg, apicid); |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | /* | 52 | /* |
| @@ -57,45 +57,50 @@ static void __x2apic_send_IPI_dest(unsigned int apicid, int vector, | |||
| 57 | */ | 57 | */ |
| 58 | static void x2apic_send_IPI_mask(const struct cpumask *mask, int vector) | 58 | static void x2apic_send_IPI_mask(const struct cpumask *mask, int vector) |
| 59 | { | 59 | { |
| 60 | unsigned long flags; | ||
| 61 | unsigned long query_cpu; | 60 | unsigned long query_cpu; |
| 61 | unsigned long flags; | ||
| 62 | 62 | ||
| 63 | local_irq_save(flags); | 63 | local_irq_save(flags); |
| 64 | for_each_cpu(query_cpu, mask) | 64 | for_each_cpu(query_cpu, mask) { |
| 65 | __x2apic_send_IPI_dest( | 65 | __x2apic_send_IPI_dest( |
| 66 | per_cpu(x86_cpu_to_logical_apicid, query_cpu), | 66 | per_cpu(x86_cpu_to_logical_apicid, query_cpu), |
| 67 | vector, APIC_DEST_LOGICAL); | 67 | vector, apic->dest_logical); |
| 68 | } | ||
| 68 | local_irq_restore(flags); | 69 | local_irq_restore(flags); |
| 69 | } | 70 | } |
| 70 | 71 | ||
| 71 | static void x2apic_send_IPI_mask_allbutself(const struct cpumask *mask, | 72 | static void |
| 72 | int vector) | 73 | x2apic_send_IPI_mask_allbutself(const struct cpumask *mask, int vector) |
| 73 | { | 74 | { |
| 74 | unsigned long flags; | ||
| 75 | unsigned long query_cpu; | ||
| 76 | unsigned long this_cpu = smp_processor_id(); | 75 | unsigned long this_cpu = smp_processor_id(); |
| 76 | unsigned long query_cpu; | ||
| 77 | unsigned long flags; | ||
| 77 | 78 | ||
| 78 | local_irq_save(flags); | 79 | local_irq_save(flags); |
| 79 | for_each_cpu(query_cpu, mask) | 80 | for_each_cpu(query_cpu, mask) { |
| 80 | if (query_cpu != this_cpu) | 81 | if (query_cpu == this_cpu) |
| 81 | __x2apic_send_IPI_dest( | 82 | continue; |
| 83 | __x2apic_send_IPI_dest( | ||
| 82 | per_cpu(x86_cpu_to_logical_apicid, query_cpu), | 84 | per_cpu(x86_cpu_to_logical_apicid, query_cpu), |
| 83 | vector, APIC_DEST_LOGICAL); | 85 | vector, apic->dest_logical); |
| 86 | } | ||
| 84 | local_irq_restore(flags); | 87 | local_irq_restore(flags); |
| 85 | } | 88 | } |
| 86 | 89 | ||
| 87 | static void x2apic_send_IPI_allbutself(int vector) | 90 | static void x2apic_send_IPI_allbutself(int vector) |
| 88 | { | 91 | { |
| 89 | unsigned long flags; | ||
| 90 | unsigned long query_cpu; | ||
| 91 | unsigned long this_cpu = smp_processor_id(); | 92 | unsigned long this_cpu = smp_processor_id(); |
| 93 | unsigned long query_cpu; | ||
| 94 | unsigned long flags; | ||
| 92 | 95 | ||
| 93 | local_irq_save(flags); | 96 | local_irq_save(flags); |
| 94 | for_each_online_cpu(query_cpu) | 97 | for_each_online_cpu(query_cpu) { |
| 95 | if (query_cpu != this_cpu) | 98 | if (query_cpu == this_cpu) |
| 96 | __x2apic_send_IPI_dest( | 99 | continue; |
| 100 | __x2apic_send_IPI_dest( | ||
| 97 | per_cpu(x86_cpu_to_logical_apicid, query_cpu), | 101 | per_cpu(x86_cpu_to_logical_apicid, query_cpu), |
| 98 | vector, APIC_DEST_LOGICAL); | 102 | vector, apic->dest_logical); |
| 103 | } | ||
| 99 | local_irq_restore(flags); | 104 | local_irq_restore(flags); |
| 100 | } | 105 | } |
| 101 | 106 | ||
| @@ -111,21 +116,21 @@ static int x2apic_apic_id_registered(void) | |||
| 111 | 116 | ||
| 112 | static unsigned int x2apic_cpu_mask_to_apicid(const struct cpumask *cpumask) | 117 | static unsigned int x2apic_cpu_mask_to_apicid(const struct cpumask *cpumask) |
| 113 | { | 118 | { |
| 114 | int cpu; | ||
| 115 | |||
| 116 | /* | 119 | /* |
| 117 | * We're using fixed IRQ delivery, can only return one logical APIC ID. | 120 | * We're using fixed IRQ delivery, can only return one logical APIC ID. |
| 118 | * May as well be the first. | 121 | * May as well be the first. |
| 119 | */ | 122 | */ |
| 120 | cpu = cpumask_first(cpumask); | 123 | int cpu = cpumask_first(cpumask); |
| 124 | |||
| 121 | if ((unsigned)cpu < nr_cpu_ids) | 125 | if ((unsigned)cpu < nr_cpu_ids) |
| 122 | return per_cpu(x86_cpu_to_logical_apicid, cpu); | 126 | return per_cpu(x86_cpu_to_logical_apicid, cpu); |
| 123 | else | 127 | else |
| 124 | return BAD_APICID; | 128 | return BAD_APICID; |
| 125 | } | 129 | } |
| 126 | 130 | ||
| 127 | static unsigned int x2apic_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | 131 | static unsigned int |
| 128 | const struct cpumask *andmask) | 132 | x2apic_cpu_mask_to_apicid_and(const struct cpumask *cpumask, |
| 133 | const struct cpumask *andmask) | ||
| 129 | { | 134 | { |
| 130 | int cpu; | 135 | int cpu; |
| 131 | 136 | ||
| @@ -133,15 +138,18 @@ static unsigned int x2apic_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | |||
| 133 | * We're using fixed IRQ delivery, can only return one logical APIC ID. | 138 | * We're using fixed IRQ delivery, can only return one logical APIC ID. |
| 134 | * May as well be the first. | 139 | * May as well be the first. |
| 135 | */ | 140 | */ |
| 136 | for_each_cpu_and(cpu, cpumask, andmask) | 141 | for_each_cpu_and(cpu, cpumask, andmask) { |
| 137 | if (cpumask_test_cpu(cpu, cpu_online_mask)) | 142 | if (cpumask_test_cpu(cpu, cpu_online_mask)) |
| 138 | break; | 143 | break; |
| 144 | } | ||
| 145 | |||
| 139 | if (cpu < nr_cpu_ids) | 146 | if (cpu < nr_cpu_ids) |
| 140 | return per_cpu(x86_cpu_to_logical_apicid, cpu); | 147 | return per_cpu(x86_cpu_to_logical_apicid, cpu); |
| 148 | |||
| 141 | return BAD_APICID; | 149 | return BAD_APICID; |
| 142 | } | 150 | } |
| 143 | 151 | ||
| 144 | static unsigned int get_apic_id(unsigned long x) | 152 | static unsigned int x2apic_cluster_phys_get_apic_id(unsigned long x) |
| 145 | { | 153 | { |
| 146 | unsigned int id; | 154 | unsigned int id; |
| 147 | 155 | ||
| @@ -157,7 +165,7 @@ static unsigned long set_apic_id(unsigned int id) | |||
| 157 | return x; | 165 | return x; |
| 158 | } | 166 | } |
| 159 | 167 | ||
| 160 | static unsigned int phys_pkg_id(int index_msb) | 168 | static int x2apic_cluster_phys_pkg_id(int initial_apicid, int index_msb) |
| 161 | { | 169 | { |
| 162 | return current_cpu_data.initial_apicid >> index_msb; | 170 | return current_cpu_data.initial_apicid >> index_msb; |
| 163 | } | 171 | } |
| @@ -172,27 +180,64 @@ static void init_x2apic_ldr(void) | |||
| 172 | int cpu = smp_processor_id(); | 180 | int cpu = smp_processor_id(); |
| 173 | 181 | ||
| 174 | per_cpu(x86_cpu_to_logical_apicid, cpu) = apic_read(APIC_LDR); | 182 | per_cpu(x86_cpu_to_logical_apicid, cpu) = apic_read(APIC_LDR); |
| 175 | return; | 183 | } |
| 176 | } | 184 | |
| 177 | 185 | struct apic apic_x2apic_cluster = { | |
| 178 | struct genapic apic_x2apic_cluster = { | 186 | |
| 179 | .name = "cluster x2apic", | 187 | .name = "cluster x2apic", |
| 180 | .acpi_madt_oem_check = x2apic_acpi_madt_oem_check, | 188 | .probe = NULL, |
| 181 | .int_delivery_mode = dest_LowestPrio, | 189 | .acpi_madt_oem_check = x2apic_acpi_madt_oem_check, |
| 182 | .int_dest_mode = (APIC_DEST_LOGICAL != 0), | 190 | .apic_id_registered = x2apic_apic_id_registered, |
| 183 | .target_cpus = x2apic_target_cpus, | 191 | |
| 184 | .vector_allocation_domain = x2apic_vector_allocation_domain, | 192 | .irq_delivery_mode = dest_LowestPrio, |
| 185 | .apic_id_registered = x2apic_apic_id_registered, | 193 | .irq_dest_mode = 1, /* logical */ |
| 186 | .init_apic_ldr = init_x2apic_ldr, | 194 | |
| 187 | .send_IPI_all = x2apic_send_IPI_all, | 195 | .target_cpus = x2apic_target_cpus, |
| 188 | .send_IPI_allbutself = x2apic_send_IPI_allbutself, | 196 | .disable_esr = 0, |
| 189 | .send_IPI_mask = x2apic_send_IPI_mask, | 197 | .dest_logical = APIC_DEST_LOGICAL, |
| 190 | .send_IPI_mask_allbutself = x2apic_send_IPI_mask_allbutself, | 198 | .check_apicid_used = NULL, |
| 191 | .send_IPI_self = x2apic_send_IPI_self, | 199 | .check_apicid_present = NULL, |
| 192 | .cpu_mask_to_apicid = x2apic_cpu_mask_to_apicid, | 200 | |
| 193 | .cpu_mask_to_apicid_and = x2apic_cpu_mask_to_apicid_and, | 201 | .vector_allocation_domain = x2apic_vector_allocation_domain, |
| 194 | .phys_pkg_id = phys_pkg_id, | 202 | .init_apic_ldr = init_x2apic_ldr, |
| 195 | .get_apic_id = get_apic_id, | 203 | |
| 196 | .set_apic_id = set_apic_id, | 204 | .ioapic_phys_id_map = NULL, |
| 197 | .apic_id_mask = (0xFFFFFFFFu), | 205 | .setup_apic_routing = NULL, |
| 206 | .multi_timer_check = NULL, | ||
| 207 | .apicid_to_node = NULL, | ||
| 208 | .cpu_to_logical_apicid = NULL, | ||
| 209 | .cpu_present_to_apicid = default_cpu_present_to_apicid, | ||
| 210 | .apicid_to_cpu_present = NULL, | ||
| 211 | .setup_portio_remap = NULL, | ||
| 212 | .check_phys_apicid_present = default_check_phys_apicid_present, | ||
| 213 | .enable_apic_mode = NULL, | ||
| 214 | .phys_pkg_id = x2apic_cluster_phys_pkg_id, | ||
| 215 | .mps_oem_check = NULL, | ||
| 216 | |||
| 217 | .get_apic_id = x2apic_cluster_phys_get_apic_id, | ||
| 218 | .set_apic_id = set_apic_id, | ||
| 219 | .apic_id_mask = 0xFFFFFFFFu, | ||
| 220 | |||
| 221 | .cpu_mask_to_apicid = x2apic_cpu_mask_to_apicid, | ||
| 222 | .cpu_mask_to_apicid_and = x2apic_cpu_mask_to_apicid_and, | ||
| 223 | |||
| 224 | .send_IPI_mask = x2apic_send_IPI_mask, | ||
| 225 | .send_IPI_mask_allbutself = x2apic_send_IPI_mask_allbutself, | ||
| 226 | .send_IPI_allbutself = x2apic_send_IPI_allbutself, | ||
| 227 | .send_IPI_all = x2apic_send_IPI_all, | ||
| 228 | .send_IPI_self = x2apic_send_IPI_self, | ||
| 229 | |||
| 230 | .wakeup_cpu = NULL, | ||
| 231 | .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, | ||
| 232 | .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, | ||
| 233 | .wait_for_init_deassert = NULL, | ||
| 234 | .smp_callin_clear_local_apic = NULL, | ||
| 235 | .inquire_remote_apic = NULL, | ||
| 236 | |||
| 237 | .read = native_apic_msr_read, | ||
| 238 | .write = native_apic_msr_write, | ||
| 239 | .icr_read = native_x2apic_icr_read, | ||
| 240 | .icr_write = native_x2apic_icr_write, | ||
| 241 | .wait_icr_idle = native_x2apic_wait_icr_idle, | ||
| 242 | .safe_wait_icr_idle = native_safe_x2apic_wait_icr_idle, | ||
| 198 | }; | 243 | }; |
diff --git a/arch/x86/kernel/genx2apic_phys.c b/arch/x86/kernel/apic/x2apic_phys.c index 21bcc0e098ba..d2d52eb9f7ea 100644 --- a/arch/x86/kernel/genx2apic_phys.c +++ b/arch/x86/kernel/apic/x2apic_phys.c | |||
| @@ -7,8 +7,8 @@ | |||
| 7 | #include <linux/dmar.h> | 7 | #include <linux/dmar.h> |
| 8 | 8 | ||
| 9 | #include <asm/smp.h> | 9 | #include <asm/smp.h> |
| 10 | #include <asm/apic.h> | ||
| 10 | #include <asm/ipi.h> | 11 | #include <asm/ipi.h> |
| 11 | #include <asm/genapic.h> | ||
| 12 | 12 | ||
| 13 | static int x2apic_phys; | 13 | static int x2apic_phys; |
| 14 | 14 | ||
| @@ -50,13 +50,13 @@ static void __x2apic_send_IPI_dest(unsigned int apicid, int vector, | |||
| 50 | /* | 50 | /* |
| 51 | * send the IPI. | 51 | * send the IPI. |
| 52 | */ | 52 | */ |
| 53 | x2apic_icr_write(cfg, apicid); | 53 | native_x2apic_icr_write(cfg, apicid); |
| 54 | } | 54 | } |
| 55 | 55 | ||
| 56 | static void x2apic_send_IPI_mask(const struct cpumask *mask, int vector) | 56 | static void x2apic_send_IPI_mask(const struct cpumask *mask, int vector) |
| 57 | { | 57 | { |
| 58 | unsigned long flags; | ||
| 59 | unsigned long query_cpu; | 58 | unsigned long query_cpu; |
| 59 | unsigned long flags; | ||
| 60 | 60 | ||
| 61 | local_irq_save(flags); | 61 | local_irq_save(flags); |
| 62 | for_each_cpu(query_cpu, mask) { | 62 | for_each_cpu(query_cpu, mask) { |
| @@ -66,12 +66,12 @@ static void x2apic_send_IPI_mask(const struct cpumask *mask, int vector) | |||
| 66 | local_irq_restore(flags); | 66 | local_irq_restore(flags); |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | static void x2apic_send_IPI_mask_allbutself(const struct cpumask *mask, | 69 | static void |
| 70 | int vector) | 70 | x2apic_send_IPI_mask_allbutself(const struct cpumask *mask, int vector) |
| 71 | { | 71 | { |
| 72 | unsigned long flags; | ||
| 73 | unsigned long query_cpu; | ||
| 74 | unsigned long this_cpu = smp_processor_id(); | 72 | unsigned long this_cpu = smp_processor_id(); |
| 73 | unsigned long query_cpu; | ||
| 74 | unsigned long flags; | ||
| 75 | 75 | ||
| 76 | local_irq_save(flags); | 76 | local_irq_save(flags); |
| 77 | for_each_cpu(query_cpu, mask) { | 77 | for_each_cpu(query_cpu, mask) { |
| @@ -85,16 +85,17 @@ static void x2apic_send_IPI_mask_allbutself(const struct cpumask *mask, | |||
| 85 | 85 | ||
| 86 | static void x2apic_send_IPI_allbutself(int vector) | 86 | static void x2apic_send_IPI_allbutself(int vector) |
| 87 | { | 87 | { |
| 88 | unsigned long flags; | ||
| 89 | unsigned long query_cpu; | ||
| 90 | unsigned long this_cpu = smp_processor_id(); | 88 | unsigned long this_cpu = smp_processor_id(); |
| 89 | unsigned long query_cpu; | ||
| 90 | unsigned long flags; | ||
| 91 | 91 | ||
| 92 | local_irq_save(flags); | 92 | local_irq_save(flags); |
| 93 | for_each_online_cpu(query_cpu) | 93 | for_each_online_cpu(query_cpu) { |
| 94 | if (query_cpu != this_cpu) | 94 | if (query_cpu == this_cpu) |
| 95 | __x2apic_send_IPI_dest( | 95 | continue; |
| 96 | per_cpu(x86_cpu_to_apicid, query_cpu), | 96 | __x2apic_send_IPI_dest(per_cpu(x86_cpu_to_apicid, query_cpu), |
| 97 | vector, APIC_DEST_PHYSICAL); | 97 | vector, APIC_DEST_PHYSICAL); |
| 98 | } | ||
| 98 | local_irq_restore(flags); | 99 | local_irq_restore(flags); |
| 99 | } | 100 | } |
| 100 | 101 | ||
| @@ -110,21 +111,21 @@ static int x2apic_apic_id_registered(void) | |||
| 110 | 111 | ||
| 111 | static unsigned int x2apic_cpu_mask_to_apicid(const struct cpumask *cpumask) | 112 | static unsigned int x2apic_cpu_mask_to_apicid(const struct cpumask *cpumask) |
| 112 | { | 113 | { |
| 113 | int cpu; | ||
| 114 | |||
| 115 | /* | 114 | /* |
| 116 | * We're using fixed IRQ delivery, can only return one phys APIC ID. | 115 | * We're using fixed IRQ delivery, can only return one phys APIC ID. |
| 117 | * May as well be the first. | 116 | * May as well be the first. |
| 118 | */ | 117 | */ |
| 119 | cpu = cpumask_first(cpumask); | 118 | int cpu = cpumask_first(cpumask); |
| 119 | |||
| 120 | if ((unsigned)cpu < nr_cpu_ids) | 120 | if ((unsigned)cpu < nr_cpu_ids) |
| 121 | return per_cpu(x86_cpu_to_apicid, cpu); | 121 | return per_cpu(x86_cpu_to_apicid, cpu); |
| 122 | else | 122 | else |
| 123 | return BAD_APICID; | 123 | return BAD_APICID; |
| 124 | } | 124 | } |
| 125 | 125 | ||
| 126 | static unsigned int x2apic_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | 126 | static unsigned int |
| 127 | const struct cpumask *andmask) | 127 | x2apic_cpu_mask_to_apicid_and(const struct cpumask *cpumask, |
| 128 | const struct cpumask *andmask) | ||
| 128 | { | 129 | { |
| 129 | int cpu; | 130 | int cpu; |
| 130 | 131 | ||
| @@ -132,31 +133,28 @@ static unsigned int x2apic_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | |||
| 132 | * We're using fixed IRQ delivery, can only return one phys APIC ID. | 133 | * We're using fixed IRQ delivery, can only return one phys APIC ID. |
| 133 | * May as well be the first. | 134 | * May as well be the first. |
| 134 | */ | 135 | */ |
| 135 | for_each_cpu_and(cpu, cpumask, andmask) | 136 | for_each_cpu_and(cpu, cpumask, andmask) { |
| 136 | if (cpumask_test_cpu(cpu, cpu_online_mask)) | 137 | if (cpumask_test_cpu(cpu, cpu_online_mask)) |
| 137 | break; | 138 | break; |
| 139 | } | ||
| 140 | |||
| 138 | if (cpu < nr_cpu_ids) | 141 | if (cpu < nr_cpu_ids) |
| 139 | return per_cpu(x86_cpu_to_apicid, cpu); | 142 | return per_cpu(x86_cpu_to_apicid, cpu); |
| 143 | |||
| 140 | return BAD_APICID; | 144 | return BAD_APICID; |
| 141 | } | 145 | } |
| 142 | 146 | ||
| 143 | static unsigned int get_apic_id(unsigned long x) | 147 | static unsigned int x2apic_phys_get_apic_id(unsigned long x) |
| 144 | { | 148 | { |
| 145 | unsigned int id; | 149 | return x; |
| 146 | |||
| 147 | id = x; | ||
| 148 | return id; | ||
| 149 | } | 150 | } |
| 150 | 151 | ||
| 151 | static unsigned long set_apic_id(unsigned int id) | 152 | static unsigned long set_apic_id(unsigned int id) |
| 152 | { | 153 | { |
| 153 | unsigned long x; | 154 | return id; |
| 154 | |||
| 155 | x = id; | ||
| 156 | return x; | ||
| 157 | } | 155 | } |
| 158 | 156 | ||
| 159 | static unsigned int phys_pkg_id(int index_msb) | 157 | static int x2apic_phys_pkg_id(int initial_apicid, int index_msb) |
| 160 | { | 158 | { |
| 161 | return current_cpu_data.initial_apicid >> index_msb; | 159 | return current_cpu_data.initial_apicid >> index_msb; |
| 162 | } | 160 | } |
| @@ -168,27 +166,64 @@ static void x2apic_send_IPI_self(int vector) | |||
| 168 | 166 | ||
| 169 | static void init_x2apic_ldr(void) | 167 | static void init_x2apic_ldr(void) |
| 170 | { | 168 | { |
| 171 | return; | 169 | } |
| 172 | } | 170 | |
| 173 | 171 | struct apic apic_x2apic_phys = { | |
| 174 | struct genapic apic_x2apic_phys = { | 172 | |
| 175 | .name = "physical x2apic", | 173 | .name = "physical x2apic", |
| 176 | .acpi_madt_oem_check = x2apic_acpi_madt_oem_check, | 174 | .probe = NULL, |
| 177 | .int_delivery_mode = dest_Fixed, | 175 | .acpi_madt_oem_check = x2apic_acpi_madt_oem_check, |
| 178 | .int_dest_mode = (APIC_DEST_PHYSICAL != 0), | 176 | .apic_id_registered = x2apic_apic_id_registered, |
| 179 | .target_cpus = x2apic_target_cpus, | 177 | |
| 180 | .vector_allocation_domain = x2apic_vector_allocation_domain, | 178 | .irq_delivery_mode = dest_Fixed, |
| 181 | .apic_id_registered = x2apic_apic_id_registered, | 179 | .irq_dest_mode = 0, /* physical */ |
| 182 | .init_apic_ldr = init_x2apic_ldr, | 180 | |
| 183 | .send_IPI_all = x2apic_send_IPI_all, | 181 | .target_cpus = x2apic_target_cpus, |
| 184 | .send_IPI_allbutself = x2apic_send_IPI_allbutself, | 182 | .disable_esr = 0, |
| 185 | .send_IPI_mask = x2apic_send_IPI_mask, | 183 | .dest_logical = 0, |
| 186 | .send_IPI_mask_allbutself = x2apic_send_IPI_mask_allbutself, | 184 | .check_apicid_used = NULL, |
| 187 | .send_IPI_self = x2apic_send_IPI_self, | 185 | .check_apicid_present = NULL, |
| 188 | .cpu_mask_to_apicid = x2apic_cpu_mask_to_apicid, | 186 | |
| 189 | .cpu_mask_to_apicid_and = x2apic_cpu_mask_to_apicid_and, | 187 | .vector_allocation_domain = x2apic_vector_allocation_domain, |
| 190 | .phys_pkg_id = phys_pkg_id, | 188 | .init_apic_ldr = init_x2apic_ldr, |
| 191 | .get_apic_id = get_apic_id, | 189 | |
| 192 | .set_apic_id = set_apic_id, | 190 | .ioapic_phys_id_map = NULL, |
| 193 | .apic_id_mask = (0xFFFFFFFFu), | 191 | .setup_apic_routing = NULL, |
| 192 | .multi_timer_check = NULL, | ||
| 193 | .apicid_to_node = NULL, | ||
| 194 | .cpu_to_logical_apicid = NULL, | ||
| 195 | .cpu_present_to_apicid = default_cpu_present_to_apicid, | ||
| 196 | .apicid_to_cpu_present = NULL, | ||
| 197 | .setup_portio_remap = NULL, | ||
| 198 | .check_phys_apicid_present = default_check_phys_apicid_present, | ||
| 199 | .enable_apic_mode = NULL, | ||
| 200 | .phys_pkg_id = x2apic_phys_pkg_id, | ||
| 201 | .mps_oem_check = NULL, | ||
| 202 | |||
| 203 | .get_apic_id = x2apic_phys_get_apic_id, | ||
| 204 | .set_apic_id = set_apic_id, | ||
| 205 | .apic_id_mask = 0xFFFFFFFFu, | ||
| 206 | |||
| 207 | .cpu_mask_to_apicid = x2apic_cpu_mask_to_apicid, | ||
| 208 | .cpu_mask_to_apicid_and = x2apic_cpu_mask_to_apicid_and, | ||
| 209 | |||
| 210 | .send_IPI_mask = x2apic_send_IPI_mask, | ||
| 211 | .send_IPI_mask_allbutself = x2apic_send_IPI_mask_allbutself, | ||
| 212 | .send_IPI_allbutself = x2apic_send_IPI_allbutself, | ||
| 213 | .send_IPI_all = x2apic_send_IPI_all, | ||
| 214 | .send_IPI_self = x2apic_send_IPI_self, | ||
| 215 | |||
| 216 | .wakeup_cpu = NULL, | ||
| 217 | .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, | ||
| 218 | .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, | ||
| 219 | .wait_for_init_deassert = NULL, | ||
| 220 | .smp_callin_clear_local_apic = NULL, | ||
| 221 | .inquire_remote_apic = NULL, | ||
| 222 | |||
| 223 | .read = native_apic_msr_read, | ||
| 224 | .write = native_apic_msr_write, | ||
| 225 | .icr_read = native_x2apic_icr_read, | ||
| 226 | .icr_write = native_x2apic_icr_write, | ||
| 227 | .wait_icr_idle = native_x2apic_wait_icr_idle, | ||
| 228 | .safe_wait_icr_idle = native_safe_x2apic_wait_icr_idle, | ||
| 194 | }; | 229 | }; |
diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index b193e082f6ce..20b4ad07c3a1 100644 --- a/arch/x86/kernel/genx2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c | |||
| @@ -22,9 +22,10 @@ | |||
| 22 | #include <linux/proc_fs.h> | 22 | #include <linux/proc_fs.h> |
| 23 | #include <asm/current.h> | 23 | #include <asm/current.h> |
| 24 | #include <asm/smp.h> | 24 | #include <asm/smp.h> |
| 25 | #include <asm/apic.h> | ||
| 25 | #include <asm/ipi.h> | 26 | #include <asm/ipi.h> |
| 26 | #include <asm/genapic.h> | ||
| 27 | #include <asm/pgtable.h> | 27 | #include <asm/pgtable.h> |
| 28 | #include <asm/uv/uv.h> | ||
| 28 | #include <asm/uv/uv_mmrs.h> | 29 | #include <asm/uv/uv_mmrs.h> |
| 29 | #include <asm/uv/uv_hub.h> | 30 | #include <asm/uv/uv_hub.h> |
| 30 | #include <asm/uv/bios.h> | 31 | #include <asm/uv/bios.h> |
| @@ -113,16 +114,16 @@ int uv_wakeup_secondary(int phys_apicid, unsigned int start_rip) | |||
| 113 | 114 | ||
| 114 | static void uv_send_IPI_one(int cpu, int vector) | 115 | static void uv_send_IPI_one(int cpu, int vector) |
| 115 | { | 116 | { |
| 116 | unsigned long val, apicid, lapicid; | 117 | unsigned long val, apicid; |
| 117 | int pnode; | 118 | int pnode; |
| 118 | 119 | ||
| 119 | apicid = per_cpu(x86_cpu_to_apicid, cpu); | 120 | apicid = per_cpu(x86_cpu_to_apicid, cpu); |
| 120 | lapicid = apicid & 0x3f; /* ZZZ macro needed */ | ||
| 121 | pnode = uv_apicid_to_pnode(apicid); | 121 | pnode = uv_apicid_to_pnode(apicid); |
| 122 | val = | 122 | |
| 123 | (1UL << UVH_IPI_INT_SEND_SHFT) | (lapicid << | 123 | val = (1UL << UVH_IPI_INT_SEND_SHFT) | |
| 124 | UVH_IPI_INT_APIC_ID_SHFT) | | 124 | (apicid << UVH_IPI_INT_APIC_ID_SHFT) | |
| 125 | (vector << UVH_IPI_INT_VECTOR_SHFT); | 125 | (vector << UVH_IPI_INT_VECTOR_SHFT); |
| 126 | |||
| 126 | uv_write_global_mmr64(pnode, UVH_IPI_INT, val); | 127 | uv_write_global_mmr64(pnode, UVH_IPI_INT, val); |
| 127 | } | 128 | } |
| 128 | 129 | ||
| @@ -136,22 +137,24 @@ static void uv_send_IPI_mask(const struct cpumask *mask, int vector) | |||
| 136 | 137 | ||
| 137 | static void uv_send_IPI_mask_allbutself(const struct cpumask *mask, int vector) | 138 | static void uv_send_IPI_mask_allbutself(const struct cpumask *mask, int vector) |
| 138 | { | 139 | { |
| 139 | unsigned int cpu; | ||
| 140 | unsigned int this_cpu = smp_processor_id(); | 140 | unsigned int this_cpu = smp_processor_id(); |
| 141 | unsigned int cpu; | ||
| 141 | 142 | ||
| 142 | for_each_cpu(cpu, mask) | 143 | for_each_cpu(cpu, mask) { |
| 143 | if (cpu != this_cpu) | 144 | if (cpu != this_cpu) |
| 144 | uv_send_IPI_one(cpu, vector); | 145 | uv_send_IPI_one(cpu, vector); |
| 146 | } | ||
| 145 | } | 147 | } |
| 146 | 148 | ||
| 147 | static void uv_send_IPI_allbutself(int vector) | 149 | static void uv_send_IPI_allbutself(int vector) |
| 148 | { | 150 | { |
| 149 | unsigned int cpu; | ||
| 150 | unsigned int this_cpu = smp_processor_id(); | 151 | unsigned int this_cpu = smp_processor_id(); |
| 152 | unsigned int cpu; | ||
| 151 | 153 | ||
| 152 | for_each_online_cpu(cpu) | 154 | for_each_online_cpu(cpu) { |
| 153 | if (cpu != this_cpu) | 155 | if (cpu != this_cpu) |
| 154 | uv_send_IPI_one(cpu, vector); | 156 | uv_send_IPI_one(cpu, vector); |
| 157 | } | ||
| 155 | } | 158 | } |
| 156 | 159 | ||
| 157 | static void uv_send_IPI_all(int vector) | 160 | static void uv_send_IPI_all(int vector) |
| @@ -170,21 +173,21 @@ static void uv_init_apic_ldr(void) | |||
| 170 | 173 | ||
| 171 | static unsigned int uv_cpu_mask_to_apicid(const struct cpumask *cpumask) | 174 | static unsigned int uv_cpu_mask_to_apicid(const struct cpumask *cpumask) |
| 172 | { | 175 | { |
| 173 | int cpu; | ||
| 174 | |||
| 175 | /* | 176 | /* |
| 176 | * We're using fixed IRQ delivery, can only return one phys APIC ID. | 177 | * We're using fixed IRQ delivery, can only return one phys APIC ID. |
| 177 | * May as well be the first. | 178 | * May as well be the first. |
| 178 | */ | 179 | */ |
| 179 | cpu = cpumask_first(cpumask); | 180 | int cpu = cpumask_first(cpumask); |
| 181 | |||
| 180 | if ((unsigned)cpu < nr_cpu_ids) | 182 | if ((unsigned)cpu < nr_cpu_ids) |
| 181 | return per_cpu(x86_cpu_to_apicid, cpu); | 183 | return per_cpu(x86_cpu_to_apicid, cpu); |
| 182 | else | 184 | else |
| 183 | return BAD_APICID; | 185 | return BAD_APICID; |
| 184 | } | 186 | } |
| 185 | 187 | ||
| 186 | static unsigned int uv_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | 188 | static unsigned int |
| 187 | const struct cpumask *andmask) | 189 | uv_cpu_mask_to_apicid_and(const struct cpumask *cpumask, |
| 190 | const struct cpumask *andmask) | ||
| 188 | { | 191 | { |
| 189 | int cpu; | 192 | int cpu; |
| 190 | 193 | ||
| @@ -192,15 +195,17 @@ static unsigned int uv_cpu_mask_to_apicid_and(const struct cpumask *cpumask, | |||
| 192 | * We're using fixed IRQ delivery, can only return one phys APIC ID. | 195 | * We're using fixed IRQ delivery, can only return one phys APIC ID. |
| 193 | * May as well be the first. | 196 | * May as well be the first. |
| 194 | */ | 197 | */ |
| 195 | for_each_cpu_and(cpu, cpumask, andmask) | 198 | for_each_cpu_and(cpu, cpumask, andmask) { |
| 196 | if (cpumask_test_cpu(cpu, cpu_online_mask)) | 199 | if (cpumask_test_cpu(cpu, cpu_online_mask)) |
| 197 | break; | 200 | break; |
| 201 | } | ||
| 198 | if (cpu < nr_cpu_ids) | 202 | if (cpu < nr_cpu_ids) |
| 199 | return per_cpu(x86_cpu_to_apicid, cpu); | 203 | return per_cpu(x86_cpu_to_apicid, cpu); |
| 204 | |||
| 200 | return BAD_APICID; | 205 | return BAD_APICID; |
| 201 | } | 206 | } |
| 202 | 207 | ||
| 203 | static unsigned int get_apic_id(unsigned long x) | 208 | static unsigned int x2apic_get_apic_id(unsigned long x) |
| 204 | { | 209 | { |
| 205 | unsigned int id; | 210 | unsigned int id; |
| 206 | 211 | ||
| @@ -222,10 +227,10 @@ static unsigned long set_apic_id(unsigned int id) | |||
| 222 | static unsigned int uv_read_apic_id(void) | 227 | static unsigned int uv_read_apic_id(void) |
| 223 | { | 228 | { |
| 224 | 229 | ||
| 225 | return get_apic_id(apic_read(APIC_ID)); | 230 | return x2apic_get_apic_id(apic_read(APIC_ID)); |
| 226 | } | 231 | } |
| 227 | 232 | ||
| 228 | static unsigned int phys_pkg_id(int index_msb) | 233 | static int uv_phys_pkg_id(int initial_apicid, int index_msb) |
| 229 | { | 234 | { |
| 230 | return uv_read_apic_id() >> index_msb; | 235 | return uv_read_apic_id() >> index_msb; |
| 231 | } | 236 | } |
| @@ -235,26 +240,64 @@ static void uv_send_IPI_self(int vector) | |||
| 235 | apic_write(APIC_SELF_IPI, vector); | 240 | apic_write(APIC_SELF_IPI, vector); |
| 236 | } | 241 | } |
| 237 | 242 | ||
| 238 | struct genapic apic_x2apic_uv_x = { | 243 | struct apic apic_x2apic_uv_x = { |
| 239 | .name = "UV large system", | 244 | |
| 240 | .acpi_madt_oem_check = uv_acpi_madt_oem_check, | 245 | .name = "UV large system", |
| 241 | .int_delivery_mode = dest_Fixed, | 246 | .probe = NULL, |
| 242 | .int_dest_mode = (APIC_DEST_PHYSICAL != 0), | 247 | .acpi_madt_oem_check = uv_acpi_madt_oem_check, |
| 243 | .target_cpus = uv_target_cpus, | 248 | .apic_id_registered = uv_apic_id_registered, |
| 244 | .vector_allocation_domain = uv_vector_allocation_domain, | 249 | |
| 245 | .apic_id_registered = uv_apic_id_registered, | 250 | .irq_delivery_mode = dest_Fixed, |
| 246 | .init_apic_ldr = uv_init_apic_ldr, | 251 | .irq_dest_mode = 1, /* logical */ |
| 247 | .send_IPI_all = uv_send_IPI_all, | 252 | |
| 248 | .send_IPI_allbutself = uv_send_IPI_allbutself, | 253 | .target_cpus = uv_target_cpus, |
| 249 | .send_IPI_mask = uv_send_IPI_mask, | 254 | .disable_esr = 0, |
| 250 | .send_IPI_mask_allbutself = uv_send_IPI_mask_allbutself, | 255 | .dest_logical = APIC_DEST_LOGICAL, |
| 251 | .send_IPI_self = uv_send_IPI_self, | 256 | .check_apicid_used = NULL, |
| 252 | .cpu_mask_to_apicid = uv_cpu_mask_to_apicid, | 257 | .check_apicid_present = NULL, |
| 253 | .cpu_mask_to_apicid_and = uv_cpu_mask_to_apicid_and, | 258 | |
| 254 | .phys_pkg_id = phys_pkg_id, | 259 | .vector_allocation_domain = uv_vector_allocation_domain, |
| 255 | .get_apic_id = get_apic_id, | 260 | .init_apic_ldr = uv_init_apic_ldr, |
| 256 | .set_apic_id = set_apic_id, | 261 | |
| 257 | .apic_id_mask = (0xFFFFFFFFu), | 262 | .ioapic_phys_id_map = NULL, |
| 263 | .setup_apic_routing = NULL, | ||
| 264 | .multi_timer_check = NULL, | ||
| 265 | .apicid_to_node = NULL, | ||
| 266 | .cpu_to_logical_apicid = NULL, | ||
| 267 | .cpu_present_to_apicid = default_cpu_present_to_apicid, | ||
| 268 | .apicid_to_cpu_present = NULL, | ||
| 269 | .setup_portio_remap = NULL, | ||
| 270 | .check_phys_apicid_present = default_check_phys_apicid_present, | ||
| 271 | .enable_apic_mode = NULL, | ||
| 272 | .phys_pkg_id = uv_phys_pkg_id, | ||
| 273 | .mps_oem_check = NULL, | ||
| 274 | |||
| 275 | .get_apic_id = x2apic_get_apic_id, | ||
| 276 | .set_apic_id = set_apic_id, | ||
| 277 | .apic_id_mask = 0xFFFFFFFFu, | ||
| 278 | |||
| 279 | .cpu_mask_to_apicid = uv_cpu_mask_to_apicid, | ||
| 280 | .cpu_mask_to_apicid_and = uv_cpu_mask_to_apicid_and, | ||
| 281 | |||
| 282 | .send_IPI_mask = uv_send_IPI_mask, | ||
| 283 | .send_IPI_mask_allbutself = uv_send_IPI_mask_allbutself, | ||
| 284 | .send_IPI_allbutself = uv_send_IPI_allbutself, | ||
| 285 | .send_IPI_all = uv_send_IPI_all, | ||
| 286 | .send_IPI_self = uv_send_IPI_self, | ||
| 287 | |||
| 288 | .wakeup_cpu = NULL, | ||
| 289 | .trampoline_phys_low = DEFAULT_TRAMPOLINE_PHYS_LOW, | ||
| 290 | .trampoline_phys_high = DEFAULT_TRAMPOLINE_PHYS_HIGH, | ||
| 291 | .wait_for_init_deassert = NULL, | ||
| 292 | .smp_callin_clear_local_apic = NULL, | ||
| 293 | .inquire_remote_apic = NULL, | ||
| 294 | |||
| 295 | .read = native_apic_msr_read, | ||
| 296 | .write = native_apic_msr_write, | ||
| 297 | .icr_read = native_x2apic_icr_read, | ||
| 298 | .icr_write = native_x2apic_icr_write, | ||
| 299 | .wait_icr_idle = native_x2apic_wait_icr_idle, | ||
| 300 | .safe_wait_icr_idle = native_safe_x2apic_wait_icr_idle, | ||
| 258 | }; | 301 | }; |
| 259 | 302 | ||
| 260 | static __cpuinit void set_x2apic_extra_bits(int pnode) | 303 | static __cpuinit void set_x2apic_extra_bits(int pnode) |
diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c index 98807bb095ad..37ba5f85b718 100644 --- a/arch/x86/kernel/apm_32.c +++ b/arch/x86/kernel/apm_32.c | |||
| @@ -301,7 +301,7 @@ extern int (*console_blank_hook)(int); | |||
| 301 | */ | 301 | */ |
| 302 | #define APM_ZERO_SEGS | 302 | #define APM_ZERO_SEGS |
| 303 | 303 | ||
| 304 | #include "apm.h" | 304 | #include <asm/apm.h> |
| 305 | 305 | ||
| 306 | /* | 306 | /* |
| 307 | * Define to re-initialize the interrupt 0 timer to 100 Hz after a suspend. | 307 | * Define to re-initialize the interrupt 0 timer to 100 Hz after a suspend. |
diff --git a/arch/x86/kernel/asm-offsets_32.c b/arch/x86/kernel/asm-offsets_32.c index ee4df08feee6..fbf2f33e3080 100644 --- a/arch/x86/kernel/asm-offsets_32.c +++ b/arch/x86/kernel/asm-offsets_32.c | |||
| @@ -75,6 +75,7 @@ void foo(void) | |||
| 75 | OFFSET(PT_DS, pt_regs, ds); | 75 | OFFSET(PT_DS, pt_regs, ds); |
| 76 | OFFSET(PT_ES, pt_regs, es); | 76 | OFFSET(PT_ES, pt_regs, es); |
| 77 | OFFSET(PT_FS, pt_regs, fs); | 77 | OFFSET(PT_FS, pt_regs, fs); |
| 78 | OFFSET(PT_GS, pt_regs, gs); | ||
| 78 | OFFSET(PT_ORIG_EAX, pt_regs, orig_ax); | 79 | OFFSET(PT_ORIG_EAX, pt_regs, orig_ax); |
| 79 | OFFSET(PT_EIP, pt_regs, ip); | 80 | OFFSET(PT_EIP, pt_regs, ip); |
| 80 | OFFSET(PT_CS, pt_regs, cs); | 81 | OFFSET(PT_CS, pt_regs, cs); |
diff --git a/arch/x86/kernel/asm-offsets_64.c b/arch/x86/kernel/asm-offsets_64.c index 1d41d3f1edbc..8793ab33e2c1 100644 --- a/arch/x86/kernel/asm-offsets_64.c +++ b/arch/x86/kernel/asm-offsets_64.c | |||
| @@ -11,7 +11,6 @@ | |||
| 11 | #include <linux/hardirq.h> | 11 | #include <linux/hardirq.h> |
| 12 | #include <linux/suspend.h> | 12 | #include <linux/suspend.h> |
| 13 | #include <linux/kbuild.h> | 13 | #include <linux/kbuild.h> |
| 14 | #include <asm/pda.h> | ||
| 15 | #include <asm/processor.h> | 14 | #include <asm/processor.h> |
| 16 | #include <asm/segment.h> | 15 | #include <asm/segment.h> |
| 17 | #include <asm/thread_info.h> | 16 | #include <asm/thread_info.h> |
| @@ -48,16 +47,6 @@ int main(void) | |||
| 48 | #endif | 47 | #endif |
| 49 | BLANK(); | 48 | BLANK(); |
| 50 | #undef ENTRY | 49 | #undef ENTRY |
| 51 | #define ENTRY(entry) DEFINE(pda_ ## entry, offsetof(struct x8664_pda, entry)) | ||
| 52 | ENTRY(kernelstack); | ||
| 53 | ENTRY(oldrsp); | ||
| 54 | ENTRY(pcurrent); | ||
| 55 | ENTRY(irqcount); | ||
| 56 | ENTRY(cpunumber); | ||
| 57 | ENTRY(irqstackptr); | ||
| 58 | ENTRY(data_offset); | ||
| 59 | BLANK(); | ||
| 60 | #undef ENTRY | ||
| 61 | #ifdef CONFIG_PARAVIRT | 50 | #ifdef CONFIG_PARAVIRT |
| 62 | BLANK(); | 51 | BLANK(); |
| 63 | OFFSET(PARAVIRT_enabled, pv_info, paravirt_enabled); | 52 | OFFSET(PARAVIRT_enabled, pv_info, paravirt_enabled); |
diff --git a/arch/x86/kernel/cpu/addon_cpuid_features.c b/arch/x86/kernel/cpu/addon_cpuid_features.c index 2cf23634b6d9..6882a735d9c0 100644 --- a/arch/x86/kernel/cpu/addon_cpuid_features.c +++ b/arch/x86/kernel/cpu/addon_cpuid_features.c | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | #include <asm/pat.h> | 7 | #include <asm/pat.h> |
| 8 | #include <asm/processor.h> | 8 | #include <asm/processor.h> |
| 9 | 9 | ||
| 10 | #include <mach_apic.h> | 10 | #include <asm/apic.h> |
| 11 | 11 | ||
| 12 | struct cpuid_bit { | 12 | struct cpuid_bit { |
| 13 | u16 feature; | 13 | u16 feature; |
| @@ -69,7 +69,7 @@ void __cpuinit init_scattered_cpuid_features(struct cpuinfo_x86 *c) | |||
| 69 | */ | 69 | */ |
| 70 | void __cpuinit detect_extended_topology(struct cpuinfo_x86 *c) | 70 | void __cpuinit detect_extended_topology(struct cpuinfo_x86 *c) |
| 71 | { | 71 | { |
| 72 | #ifdef CONFIG_X86_SMP | 72 | #ifdef CONFIG_SMP |
| 73 | unsigned int eax, ebx, ecx, edx, sub_index; | 73 | unsigned int eax, ebx, ecx, edx, sub_index; |
| 74 | unsigned int ht_mask_width, core_plus_mask_width; | 74 | unsigned int ht_mask_width, core_plus_mask_width; |
| 75 | unsigned int core_select_mask, core_level_siblings; | 75 | unsigned int core_select_mask, core_level_siblings; |
| @@ -116,22 +116,14 @@ void __cpuinit detect_extended_topology(struct cpuinfo_x86 *c) | |||
| 116 | 116 | ||
| 117 | core_select_mask = (~(-1 << core_plus_mask_width)) >> ht_mask_width; | 117 | core_select_mask = (~(-1 << core_plus_mask_width)) >> ht_mask_width; |
| 118 | 118 | ||
| 119 | #ifdef CONFIG_X86_32 | 119 | c->cpu_core_id = apic->phys_pkg_id(c->initial_apicid, ht_mask_width) |
| 120 | c->cpu_core_id = phys_pkg_id(c->initial_apicid, ht_mask_width) | ||
| 121 | & core_select_mask; | 120 | & core_select_mask; |
| 122 | c->phys_proc_id = phys_pkg_id(c->initial_apicid, core_plus_mask_width); | 121 | c->phys_proc_id = apic->phys_pkg_id(c->initial_apicid, core_plus_mask_width); |
| 123 | /* | 122 | /* |
| 124 | * Reinit the apicid, now that we have extended initial_apicid. | 123 | * Reinit the apicid, now that we have extended initial_apicid. |
| 125 | */ | 124 | */ |
| 126 | c->apicid = phys_pkg_id(c->initial_apicid, 0); | 125 | c->apicid = apic->phys_pkg_id(c->initial_apicid, 0); |
| 127 | #else | 126 | |
| 128 | c->cpu_core_id = phys_pkg_id(ht_mask_width) & core_select_mask; | ||
| 129 | c->phys_proc_id = phys_pkg_id(core_plus_mask_width); | ||
| 130 | /* | ||
| 131 | * Reinit the apicid, now that we have extended initial_apicid. | ||
| 132 | */ | ||
| 133 | c->apicid = phys_pkg_id(0); | ||
| 134 | #endif | ||
| 135 | c->x86_max_cores = (core_level_siblings / smp_num_siblings); | 127 | c->x86_max_cores = (core_level_siblings / smp_num_siblings); |
| 136 | 128 | ||
| 137 | 129 | ||
| @@ -143,37 +135,3 @@ void __cpuinit detect_extended_topology(struct cpuinfo_x86 *c) | |||
| 143 | return; | 135 | return; |
| 144 | #endif | 136 | #endif |
| 145 | } | 137 | } |
| 146 | |||
| 147 | #ifdef CONFIG_X86_PAT | ||
| 148 | void __cpuinit validate_pat_support(struct cpuinfo_x86 *c) | ||
| 149 | { | ||
| 150 | if (!cpu_has_pat) | ||
| 151 | pat_disable("PAT not supported by CPU."); | ||
| 152 | |||
| 153 | switch (c->x86_vendor) { | ||
| 154 | case X86_VENDOR_INTEL: | ||
| 155 | /* | ||
| 156 | * There is a known erratum on Pentium III and Core Solo | ||
| 157 | * and Core Duo CPUs. | ||
| 158 | * " Page with PAT set to WC while associated MTRR is UC | ||
| 159 | * may consolidate to UC " | ||
| 160 | * Because of this erratum, it is better to stick with | ||
| 161 | * setting WC in MTRR rather than using PAT on these CPUs. | ||
| 162 | * | ||
| 163 | * Enable PAT WC only on P4, Core 2 or later CPUs. | ||
| 164 | */ | ||
| 165 | if (c->x86 > 0x6 || (c->x86 == 6 && c->x86_model >= 15)) | ||
| 166 | return; | ||
| 167 | |||
| 168 | pat_disable("PAT WC disabled due to known CPU erratum."); | ||
| 169 | return; | ||
| 170 | |||
| 171 | case X86_VENDOR_AMD: | ||
| 172 | case X86_VENDOR_CENTAUR: | ||
| 173 | case X86_VENDOR_TRANSMETA: | ||
| 174 | return; | ||
| 175 | } | ||
| 176 | |||
| 177 | pat_disable("PAT disabled. Not yet verified on this CPU type."); | ||
| 178 | } | ||
| 179 | #endif | ||
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index 7c878f6aa919..25423a5b80ed 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
| @@ -12,8 +12,6 @@ | |||
| 12 | # include <asm/cacheflush.h> | 12 | # include <asm/cacheflush.h> |
| 13 | #endif | 13 | #endif |
| 14 | 14 | ||
| 15 | #include <mach_apic.h> | ||
| 16 | |||
| 17 | #include "cpu.h" | 15 | #include "cpu.h" |
| 18 | 16 | ||
| 19 | #ifdef CONFIG_X86_32 | 17 | #ifdef CONFIG_X86_32 |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 83492b1f93b1..826d5c876278 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
| @@ -21,14 +21,14 @@ | |||
| 21 | #include <asm/asm.h> | 21 | #include <asm/asm.h> |
| 22 | #include <asm/numa.h> | 22 | #include <asm/numa.h> |
| 23 | #include <asm/smp.h> | 23 | #include <asm/smp.h> |
| 24 | #ifdef CONFIG_X86_LOCAL_APIC | 24 | #include <asm/cpu.h> |
| 25 | #include <asm/mpspec.h> | 25 | #include <asm/cpumask.h> |
| 26 | #include <asm/apic.h> | 26 | #include <asm/apic.h> |
| 27 | #include <mach_apic.h> | 27 | |
| 28 | #include <asm/genapic.h> | 28 | #ifdef CONFIG_X86_LOCAL_APIC |
| 29 | #include <asm/uv/uv.h> | ||
| 29 | #endif | 30 | #endif |
| 30 | 31 | ||
| 31 | #include <asm/pda.h> | ||
| 32 | #include <asm/pgtable.h> | 32 | #include <asm/pgtable.h> |
| 33 | #include <asm/processor.h> | 33 | #include <asm/processor.h> |
| 34 | #include <asm/desc.h> | 34 | #include <asm/desc.h> |
| @@ -37,6 +37,7 @@ | |||
| 37 | #include <asm/sections.h> | 37 | #include <asm/sections.h> |
| 38 | #include <asm/setup.h> | 38 | #include <asm/setup.h> |
| 39 | #include <asm/hypervisor.h> | 39 | #include <asm/hypervisor.h> |
| 40 | #include <asm/stackprotector.h> | ||
| 40 | 41 | ||
| 41 | #include "cpu.h" | 42 | #include "cpu.h" |
| 42 | 43 | ||
| @@ -50,6 +51,15 @@ cpumask_var_t cpu_initialized_mask; | |||
| 50 | /* representing cpus for which sibling maps can be computed */ | 51 | /* representing cpus for which sibling maps can be computed */ |
| 51 | cpumask_var_t cpu_sibling_setup_mask; | 52 | cpumask_var_t cpu_sibling_setup_mask; |
| 52 | 53 | ||
| 54 | /* correctly size the local cpu masks */ | ||
| 55 | void __init setup_cpu_local_masks(void) | ||
| 56 | { | ||
| 57 | alloc_bootmem_cpumask_var(&cpu_initialized_mask); | ||
| 58 | alloc_bootmem_cpumask_var(&cpu_callin_mask); | ||
| 59 | alloc_bootmem_cpumask_var(&cpu_callout_mask); | ||
| 60 | alloc_bootmem_cpumask_var(&cpu_sibling_setup_mask); | ||
| 61 | } | ||
| 62 | |||
| 53 | #else /* CONFIG_X86_32 */ | 63 | #else /* CONFIG_X86_32 */ |
| 54 | 64 | ||
| 55 | cpumask_t cpu_callin_map; | 65 | cpumask_t cpu_callin_map; |
| @@ -62,23 +72,23 @@ cpumask_t cpu_sibling_setup_map; | |||
| 62 | 72 | ||
| 63 | static struct cpu_dev *this_cpu __cpuinitdata; | 73 | static struct cpu_dev *this_cpu __cpuinitdata; |
| 64 | 74 | ||
| 75 | DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = { | ||
| 65 | #ifdef CONFIG_X86_64 | 76 | #ifdef CONFIG_X86_64 |
| 66 | /* We need valid kernel segments for data and code in long mode too | 77 | /* |
| 67 | * IRET will check the segment types kkeil 2000/10/28 | 78 | * We need valid kernel segments for data and code in long mode too |
| 68 | * Also sysret mandates a special GDT layout | 79 | * IRET will check the segment types kkeil 2000/10/28 |
| 69 | */ | 80 | * Also sysret mandates a special GDT layout |
| 70 | /* The TLS descriptors are currently at a different place compared to i386. | 81 | * |
| 71 | Hopefully nobody expects them at a fixed place (Wine?) */ | 82 | * The TLS descriptors are currently at a different place compared to i386. |
| 72 | DEFINE_PER_CPU(struct gdt_page, gdt_page) = { .gdt = { | 83 | * Hopefully nobody expects them at a fixed place (Wine?) |
| 84 | */ | ||
| 73 | [GDT_ENTRY_KERNEL32_CS] = { { { 0x0000ffff, 0x00cf9b00 } } }, | 85 | [GDT_ENTRY_KERNEL32_CS] = { { { 0x0000ffff, 0x00cf9b00 } } }, |
| 74 | [GDT_ENTRY_KERNEL_CS] = { { { 0x0000ffff, 0x00af9b00 } } }, | 86 | [GDT_ENTRY_KERNEL_CS] = { { { 0x0000ffff, 0x00af9b00 } } }, |
| 75 | [GDT_ENTRY_KERNEL_DS] = { { { 0x0000ffff, 0x00cf9300 } } }, | 87 | [GDT_ENTRY_KERNEL_DS] = { { { 0x0000ffff, 0x00cf9300 } } }, |
| 76 | [GDT_ENTRY_DEFAULT_USER32_CS] = { { { 0x0000ffff, 0x00cffb00 } } }, | 88 | [GDT_ENTRY_DEFAULT_USER32_CS] = { { { 0x0000ffff, 0x00cffb00 } } }, |
| 77 | [GDT_ENTRY_DEFAULT_USER_DS] = { { { 0x0000ffff, 0x00cff300 } } }, | 89 | [GDT_ENTRY_DEFAULT_USER_DS] = { { { 0x0000ffff, 0x00cff300 } } }, |
| 78 | [GDT_ENTRY_DEFAULT_USER_CS] = { { { 0x0000ffff, 0x00affb00 } } }, | 90 | [GDT_ENTRY_DEFAULT_USER_CS] = { { { 0x0000ffff, 0x00affb00 } } }, |
| 79 | } }; | ||
| 80 | #else | 91 | #else |
| 81 | DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = { | ||
| 82 | [GDT_ENTRY_KERNEL_CS] = { { { 0x0000ffff, 0x00cf9a00 } } }, | 92 | [GDT_ENTRY_KERNEL_CS] = { { { 0x0000ffff, 0x00cf9a00 } } }, |
| 83 | [GDT_ENTRY_KERNEL_DS] = { { { 0x0000ffff, 0x00cf9200 } } }, | 93 | [GDT_ENTRY_KERNEL_DS] = { { { 0x0000ffff, 0x00cf9200 } } }, |
| 84 | [GDT_ENTRY_DEFAULT_USER_CS] = { { { 0x0000ffff, 0x00cffa00 } } }, | 94 | [GDT_ENTRY_DEFAULT_USER_CS] = { { { 0x0000ffff, 0x00cffa00 } } }, |
| @@ -110,9 +120,10 @@ DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = { | |||
| 110 | [GDT_ENTRY_APMBIOS_BASE+2] = { { { 0x0000ffff, 0x00409200 } } }, | 120 | [GDT_ENTRY_APMBIOS_BASE+2] = { { { 0x0000ffff, 0x00409200 } } }, |
| 111 | 121 | ||
| 112 | [GDT_ENTRY_ESPFIX_SS] = { { { 0x00000000, 0x00c09200 } } }, | 122 | [GDT_ENTRY_ESPFIX_SS] = { { { 0x00000000, 0x00c09200 } } }, |
| 113 | [GDT_ENTRY_PERCPU] = { { { 0x00000000, 0x00000000 } } }, | 123 | [GDT_ENTRY_PERCPU] = { { { 0x0000ffff, 0x00cf9200 } } }, |
| 114 | } }; | 124 | GDT_STACK_CANARY_INIT |
| 115 | #endif | 125 | #endif |
| 126 | } }; | ||
| 116 | EXPORT_PER_CPU_SYMBOL_GPL(gdt_page); | 127 | EXPORT_PER_CPU_SYMBOL_GPL(gdt_page); |
| 117 | 128 | ||
| 118 | #ifdef CONFIG_X86_32 | 129 | #ifdef CONFIG_X86_32 |
| @@ -213,6 +224,49 @@ static inline void squash_the_stupid_serial_number(struct cpuinfo_x86 *c) | |||
| 213 | #endif | 224 | #endif |
| 214 | 225 | ||
| 215 | /* | 226 | /* |
| 227 | * Some CPU features depend on higher CPUID levels, which may not always | ||
| 228 | * be available due to CPUID level capping or broken virtualization | ||
| 229 | * software. Add those features to this table to auto-disable them. | ||
| 230 | */ | ||
| 231 | struct cpuid_dependent_feature { | ||
| 232 | u32 feature; | ||
| 233 | u32 level; | ||
| 234 | }; | ||
| 235 | static const struct cpuid_dependent_feature __cpuinitconst | ||
| 236 | cpuid_dependent_features[] = { | ||
| 237 | { X86_FEATURE_MWAIT, 0x00000005 }, | ||
| 238 | { X86_FEATURE_DCA, 0x00000009 }, | ||
| 239 | { X86_FEATURE_XSAVE, 0x0000000d }, | ||
| 240 | { 0, 0 } | ||
| 241 | }; | ||
| 242 | |||
| 243 | static void __cpuinit filter_cpuid_features(struct cpuinfo_x86 *c, bool warn) | ||
| 244 | { | ||
| 245 | const struct cpuid_dependent_feature *df; | ||
| 246 | for (df = cpuid_dependent_features; df->feature; df++) { | ||
| 247 | /* | ||
| 248 | * Note: cpuid_level is set to -1 if unavailable, but | ||
| 249 | * extended_extended_level is set to 0 if unavailable | ||
| 250 | * and the legitimate extended levels are all negative | ||
| 251 | * when signed; hence the weird messing around with | ||
| 252 | * signs here... | ||
| 253 | */ | ||
| 254 | if (cpu_has(c, df->feature) && | ||
| 255 | ((s32)df->level < 0 ? | ||
| 256 | (u32)df->level > (u32)c->extended_cpuid_level : | ||
| 257 | (s32)df->level > (s32)c->cpuid_level)) { | ||
| 258 | clear_cpu_cap(c, df->feature); | ||
| 259 | if (warn) | ||
| 260 | printk(KERN_WARNING | ||
| 261 | "CPU: CPU feature %s disabled " | ||
| 262 | "due to lack of CPUID level 0x%x\n", | ||
| 263 | x86_cap_flags[df->feature], | ||
| 264 | df->level); | ||
| 265 | } | ||
| 266 | } | ||
| 267 | } | ||
| 268 | |||
| 269 | /* | ||
| 216 | * Naming convention should be: <Name> [(<Codename>)] | 270 | * Naming convention should be: <Name> [(<Codename>)] |
| 217 | * This table only is used unless init_<vendor>() below doesn't set it; | 271 | * This table only is used unless init_<vendor>() below doesn't set it; |
| 218 | * in particular, if CPUID levels 0x80000002..4 are supported, this isn't used | 272 | * in particular, if CPUID levels 0x80000002..4 are supported, this isn't used |
| @@ -242,18 +296,29 @@ static char __cpuinit *table_lookup_model(struct cpuinfo_x86 *c) | |||
| 242 | 296 | ||
| 243 | __u32 cleared_cpu_caps[NCAPINTS] __cpuinitdata; | 297 | __u32 cleared_cpu_caps[NCAPINTS] __cpuinitdata; |
| 244 | 298 | ||
| 299 | void load_percpu_segment(int cpu) | ||
| 300 | { | ||
| 301 | #ifdef CONFIG_X86_32 | ||
| 302 | loadsegment(fs, __KERNEL_PERCPU); | ||
| 303 | #else | ||
| 304 | loadsegment(gs, 0); | ||
| 305 | wrmsrl(MSR_GS_BASE, (unsigned long)per_cpu(irq_stack_union.gs_base, cpu)); | ||
| 306 | #endif | ||
| 307 | load_stack_canary_segment(); | ||
| 308 | } | ||
| 309 | |||
| 245 | /* Current gdt points %fs at the "master" per-cpu area: after this, | 310 | /* Current gdt points %fs at the "master" per-cpu area: after this, |
| 246 | * it's on the real one. */ | 311 | * it's on the real one. */ |
| 247 | void switch_to_new_gdt(void) | 312 | void switch_to_new_gdt(int cpu) |
| 248 | { | 313 | { |
| 249 | struct desc_ptr gdt_descr; | 314 | struct desc_ptr gdt_descr; |
| 250 | 315 | ||
| 251 | gdt_descr.address = (long)get_cpu_gdt_table(smp_processor_id()); | 316 | gdt_descr.address = (long)get_cpu_gdt_table(cpu); |
| 252 | gdt_descr.size = GDT_SIZE - 1; | 317 | gdt_descr.size = GDT_SIZE - 1; |
| 253 | load_gdt(&gdt_descr); | 318 | load_gdt(&gdt_descr); |
| 254 | #ifdef CONFIG_X86_32 | 319 | /* Reload the per-cpu base */ |
| 255 | asm("mov %0, %%fs" : : "r" (__KERNEL_PERCPU) : "memory"); | 320 | |
| 256 | #endif | 321 | load_percpu_segment(cpu); |
| 257 | } | 322 | } |
| 258 | 323 | ||
| 259 | static struct cpu_dev *cpu_devs[X86_VENDOR_NUM] = {}; | 324 | static struct cpu_dev *cpu_devs[X86_VENDOR_NUM] = {}; |
| @@ -383,11 +448,7 @@ void __cpuinit detect_ht(struct cpuinfo_x86 *c) | |||
| 383 | } | 448 | } |
| 384 | 449 | ||
| 385 | index_msb = get_count_order(smp_num_siblings); | 450 | index_msb = get_count_order(smp_num_siblings); |
| 386 | #ifdef CONFIG_X86_64 | 451 | c->phys_proc_id = apic->phys_pkg_id(c->initial_apicid, index_msb); |
| 387 | c->phys_proc_id = phys_pkg_id(index_msb); | ||
| 388 | #else | ||
| 389 | c->phys_proc_id = phys_pkg_id(c->initial_apicid, index_msb); | ||
| 390 | #endif | ||
| 391 | 452 | ||
| 392 | smp_num_siblings = smp_num_siblings / c->x86_max_cores; | 453 | smp_num_siblings = smp_num_siblings / c->x86_max_cores; |
| 393 | 454 | ||
| @@ -395,13 +456,8 @@ void __cpuinit detect_ht(struct cpuinfo_x86 *c) | |||
| 395 | 456 | ||
| 396 | core_bits = get_count_order(c->x86_max_cores); | 457 | core_bits = get_count_order(c->x86_max_cores); |
| 397 | 458 | ||
| 398 | #ifdef CONFIG_X86_64 | 459 | c->cpu_core_id = apic->phys_pkg_id(c->initial_apicid, index_msb) & |
| 399 | c->cpu_core_id = phys_pkg_id(index_msb) & | ||
| 400 | ((1 << core_bits) - 1); | 460 | ((1 << core_bits) - 1); |
| 401 | #else | ||
| 402 | c->cpu_core_id = phys_pkg_id(c->initial_apicid, index_msb) & | ||
| 403 | ((1 << core_bits) - 1); | ||
| 404 | #endif | ||
| 405 | } | 461 | } |
| 406 | 462 | ||
| 407 | out: | 463 | out: |
| @@ -570,11 +626,10 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c) | |||
| 570 | if (this_cpu->c_early_init) | 626 | if (this_cpu->c_early_init) |
| 571 | this_cpu->c_early_init(c); | 627 | this_cpu->c_early_init(c); |
| 572 | 628 | ||
| 573 | validate_pat_support(c); | ||
| 574 | |||
| 575 | #ifdef CONFIG_SMP | 629 | #ifdef CONFIG_SMP |
| 576 | c->cpu_index = boot_cpu_id; | 630 | c->cpu_index = boot_cpu_id; |
| 577 | #endif | 631 | #endif |
| 632 | filter_cpuid_features(c, false); | ||
| 578 | } | 633 | } |
| 579 | 634 | ||
| 580 | void __init early_cpu_init(void) | 635 | void __init early_cpu_init(void) |
| @@ -637,7 +692,7 @@ static void __cpuinit generic_identify(struct cpuinfo_x86 *c) | |||
| 637 | c->initial_apicid = (cpuid_ebx(1) >> 24) & 0xFF; | 692 | c->initial_apicid = (cpuid_ebx(1) >> 24) & 0xFF; |
| 638 | #ifdef CONFIG_X86_32 | 693 | #ifdef CONFIG_X86_32 |
| 639 | # ifdef CONFIG_X86_HT | 694 | # ifdef CONFIG_X86_HT |
| 640 | c->apicid = phys_pkg_id(c->initial_apicid, 0); | 695 | c->apicid = apic->phys_pkg_id(c->initial_apicid, 0); |
| 641 | # else | 696 | # else |
| 642 | c->apicid = c->initial_apicid; | 697 | c->apicid = c->initial_apicid; |
| 643 | # endif | 698 | # endif |
| @@ -684,7 +739,7 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c) | |||
| 684 | this_cpu->c_identify(c); | 739 | this_cpu->c_identify(c); |
| 685 | 740 | ||
| 686 | #ifdef CONFIG_X86_64 | 741 | #ifdef CONFIG_X86_64 |
| 687 | c->apicid = phys_pkg_id(0); | 742 | c->apicid = apic->phys_pkg_id(c->initial_apicid, 0); |
| 688 | #endif | 743 | #endif |
| 689 | 744 | ||
| 690 | /* | 745 | /* |
| @@ -708,6 +763,9 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c) | |||
| 708 | * we do "generic changes." | 763 | * we do "generic changes." |
| 709 | */ | 764 | */ |
| 710 | 765 | ||
| 766 | /* Filter out anything that depends on CPUID levels we don't have */ | ||
| 767 | filter_cpuid_features(c, true); | ||
| 768 | |||
| 711 | /* If the model name is still unset, do table lookup. */ | 769 | /* If the model name is still unset, do table lookup. */ |
| 712 | if (!c->x86_model_id[0]) { | 770 | if (!c->x86_model_id[0]) { |
| 713 | char *p; | 771 | char *p; |
| @@ -877,54 +935,22 @@ static __init int setup_disablecpuid(char *arg) | |||
| 877 | __setup("clearcpuid=", setup_disablecpuid); | 935 | __setup("clearcpuid=", setup_disablecpuid); |
| 878 | 936 | ||
| 879 | #ifdef CONFIG_X86_64 | 937 | #ifdef CONFIG_X86_64 |
| 880 | struct x8664_pda **_cpu_pda __read_mostly; | ||
| 881 | EXPORT_SYMBOL(_cpu_pda); | ||
| 882 | |||
| 883 | struct desc_ptr idt_descr = { 256 * 16 - 1, (unsigned long) idt_table }; | 938 | struct desc_ptr idt_descr = { 256 * 16 - 1, (unsigned long) idt_table }; |
| 884 | 939 | ||
| 885 | static char boot_cpu_stack[IRQSTACKSIZE] __page_aligned_bss; | 940 | DEFINE_PER_CPU_FIRST(union irq_stack_union, |
| 941 | irq_stack_union) __aligned(PAGE_SIZE); | ||
| 942 | DEFINE_PER_CPU(char *, irq_stack_ptr) = | ||
| 943 | init_per_cpu_var(irq_stack_union.irq_stack) + IRQ_STACK_SIZE - 64; | ||
| 886 | 944 | ||
| 887 | void __cpuinit pda_init(int cpu) | 945 | DEFINE_PER_CPU(unsigned long, kernel_stack) = |
| 888 | { | 946 | (unsigned long)&init_thread_union - KERNEL_STACK_OFFSET + THREAD_SIZE; |
| 889 | struct x8664_pda *pda = cpu_pda(cpu); | 947 | EXPORT_PER_CPU_SYMBOL(kernel_stack); |
| 890 | 948 | ||
| 891 | /* Setup up data that may be needed in __get_free_pages early */ | 949 | DEFINE_PER_CPU(unsigned int, irq_count) = -1; |
| 892 | loadsegment(fs, 0); | ||
| 893 | loadsegment(gs, 0); | ||
| 894 | /* Memory clobbers used to order PDA accessed */ | ||
| 895 | mb(); | ||
| 896 | wrmsrl(MSR_GS_BASE, pda); | ||
| 897 | mb(); | ||
| 898 | |||
| 899 | pda->cpunumber = cpu; | ||
| 900 | pda->irqcount = -1; | ||
| 901 | pda->kernelstack = (unsigned long)stack_thread_info() - | ||
| 902 | PDA_STACKOFFSET + THREAD_SIZE; | ||
| 903 | pda->active_mm = &init_mm; | ||
| 904 | pda->mmu_state = 0; | ||
| 905 | |||
| 906 | if (cpu == 0) { | ||
| 907 | /* others are initialized in smpboot.c */ | ||
| 908 | pda->pcurrent = &init_task; | ||
| 909 | pda->irqstackptr = boot_cpu_stack; | ||
| 910 | pda->irqstackptr += IRQSTACKSIZE - 64; | ||
| 911 | } else { | ||
| 912 | if (!pda->irqstackptr) { | ||
| 913 | pda->irqstackptr = (char *) | ||
| 914 | __get_free_pages(GFP_ATOMIC, IRQSTACK_ORDER); | ||
| 915 | if (!pda->irqstackptr) | ||
| 916 | panic("cannot allocate irqstack for cpu %d", | ||
| 917 | cpu); | ||
| 918 | pda->irqstackptr += IRQSTACKSIZE - 64; | ||
| 919 | } | ||
| 920 | 950 | ||
| 921 | if (pda->nodenumber == 0 && cpu_to_node(cpu) != NUMA_NO_NODE) | 951 | static DEFINE_PER_CPU_PAGE_ALIGNED(char, exception_stacks |
| 922 | pda->nodenumber = cpu_to_node(cpu); | 952 | [(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ + DEBUG_STKSZ]) |
| 923 | } | 953 | __aligned(PAGE_SIZE); |
| 924 | } | ||
| 925 | |||
| 926 | static char boot_exception_stacks[(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ + | ||
| 927 | DEBUG_STKSZ] __page_aligned_bss; | ||
| 928 | 954 | ||
| 929 | extern asmlinkage void ignore_sysret(void); | 955 | extern asmlinkage void ignore_sysret(void); |
| 930 | 956 | ||
| @@ -957,16 +983,21 @@ unsigned long kernel_eflags; | |||
| 957 | */ | 983 | */ |
| 958 | DEFINE_PER_CPU(struct orig_ist, orig_ist); | 984 | DEFINE_PER_CPU(struct orig_ist, orig_ist); |
| 959 | 985 | ||
| 960 | #else | 986 | #else /* x86_64 */ |
| 961 | 987 | ||
| 962 | /* Make sure %fs is initialized properly in idle threads */ | 988 | #ifdef CONFIG_CC_STACKPROTECTOR |
| 989 | DEFINE_PER_CPU(unsigned long, stack_canary); | ||
| 990 | #endif | ||
| 991 | |||
| 992 | /* Make sure %fs and %gs are initialized properly in idle threads */ | ||
| 963 | struct pt_regs * __cpuinit idle_regs(struct pt_regs *regs) | 993 | struct pt_regs * __cpuinit idle_regs(struct pt_regs *regs) |
| 964 | { | 994 | { |
| 965 | memset(regs, 0, sizeof(struct pt_regs)); | 995 | memset(regs, 0, sizeof(struct pt_regs)); |
| 966 | regs->fs = __KERNEL_PERCPU; | 996 | regs->fs = __KERNEL_PERCPU; |
| 997 | regs->gs = __KERNEL_STACK_CANARY; | ||
| 967 | return regs; | 998 | return regs; |
| 968 | } | 999 | } |
| 969 | #endif | 1000 | #endif /* x86_64 */ |
| 970 | 1001 | ||
| 971 | /* | 1002 | /* |
| 972 | * cpu_init() initializes state that is per-CPU. Some data is already | 1003 | * cpu_init() initializes state that is per-CPU. Some data is already |
| @@ -982,15 +1013,14 @@ void __cpuinit cpu_init(void) | |||
| 982 | struct tss_struct *t = &per_cpu(init_tss, cpu); | 1013 | struct tss_struct *t = &per_cpu(init_tss, cpu); |
| 983 | struct orig_ist *orig_ist = &per_cpu(orig_ist, cpu); | 1014 | struct orig_ist *orig_ist = &per_cpu(orig_ist, cpu); |
| 984 | unsigned long v; | 1015 | unsigned long v; |
| 985 | char *estacks = NULL; | ||
| 986 | struct task_struct *me; | 1016 | struct task_struct *me; |
| 987 | int i; | 1017 | int i; |
| 988 | 1018 | ||
| 989 | /* CPU 0 is initialised in head64.c */ | 1019 | #ifdef CONFIG_NUMA |
| 990 | if (cpu != 0) | 1020 | if (cpu != 0 && percpu_read(node_number) == 0 && |
| 991 | pda_init(cpu); | 1021 | cpu_to_node(cpu) != NUMA_NO_NODE) |
| 992 | else | 1022 | percpu_write(node_number, cpu_to_node(cpu)); |
| 993 | estacks = boot_exception_stacks; | 1023 | #endif |
| 994 | 1024 | ||
| 995 | me = current; | 1025 | me = current; |
| 996 | 1026 | ||
| @@ -1006,7 +1036,9 @@ void __cpuinit cpu_init(void) | |||
| 1006 | * and set up the GDT descriptor: | 1036 | * and set up the GDT descriptor: |
| 1007 | */ | 1037 | */ |
| 1008 | 1038 | ||
| 1009 | switch_to_new_gdt(); | 1039 | switch_to_new_gdt(cpu); |
| 1040 | loadsegment(fs, 0); | ||
| 1041 | |||
| 1010 | load_idt((const struct desc_ptr *)&idt_descr); | 1042 | load_idt((const struct desc_ptr *)&idt_descr); |
| 1011 | 1043 | ||
| 1012 | memset(me->thread.tls_array, 0, GDT_ENTRY_TLS_ENTRIES * 8); | 1044 | memset(me->thread.tls_array, 0, GDT_ENTRY_TLS_ENTRIES * 8); |
| @@ -1017,25 +1049,20 @@ void __cpuinit cpu_init(void) | |||
| 1017 | barrier(); | 1049 | barrier(); |
| 1018 | 1050 | ||
| 1019 | check_efer(); | 1051 | check_efer(); |
| 1020 | if (cpu != 0 && x2apic) | 1052 | if (cpu != 0) |
| 1021 | enable_x2apic(); | 1053 | enable_x2apic(); |
| 1022 | 1054 | ||
| 1023 | /* | 1055 | /* |
| 1024 | * set up and load the per-CPU TSS | 1056 | * set up and load the per-CPU TSS |
| 1025 | */ | 1057 | */ |
| 1026 | if (!orig_ist->ist[0]) { | 1058 | if (!orig_ist->ist[0]) { |
| 1027 | static const unsigned int order[N_EXCEPTION_STACKS] = { | 1059 | static const unsigned int sizes[N_EXCEPTION_STACKS] = { |
| 1028 | [0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER, | 1060 | [0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STKSZ, |
| 1029 | [DEBUG_STACK - 1] = DEBUG_STACK_ORDER | 1061 | [DEBUG_STACK - 1] = DEBUG_STKSZ |
| 1030 | }; | 1062 | }; |
| 1063 | char *estacks = per_cpu(exception_stacks, cpu); | ||
| 1031 | for (v = 0; v < N_EXCEPTION_STACKS; v++) { | 1064 | for (v = 0; v < N_EXCEPTION_STACKS; v++) { |
| 1032 | if (cpu) { | 1065 | estacks += sizes[v]; |
| 1033 | estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]); | ||
| 1034 | if (!estacks) | ||
| 1035 | panic("Cannot allocate exception " | ||
| 1036 | "stack %ld %d\n", v, cpu); | ||
| 1037 | } | ||
| 1038 | estacks += PAGE_SIZE << order[v]; | ||
| 1039 | orig_ist->ist[v] = t->x86_tss.ist[v] = | 1066 | orig_ist->ist[v] = t->x86_tss.ist[v] = |
| 1040 | (unsigned long)estacks; | 1067 | (unsigned long)estacks; |
| 1041 | } | 1068 | } |
| @@ -1069,22 +1096,19 @@ void __cpuinit cpu_init(void) | |||
| 1069 | */ | 1096 | */ |
| 1070 | if (kgdb_connected && arch_kgdb_ops.correct_hw_break) | 1097 | if (kgdb_connected && arch_kgdb_ops.correct_hw_break) |
| 1071 | arch_kgdb_ops.correct_hw_break(); | 1098 | arch_kgdb_ops.correct_hw_break(); |
| 1072 | else { | 1099 | else |
| 1073 | #endif | 1100 | #endif |
| 1074 | /* | 1101 | { |
| 1075 | * Clear all 6 debug registers: | 1102 | /* |
| 1076 | */ | 1103 | * Clear all 6 debug registers: |
| 1077 | 1104 | */ | |
| 1078 | set_debugreg(0UL, 0); | 1105 | set_debugreg(0UL, 0); |
| 1079 | set_debugreg(0UL, 1); | 1106 | set_debugreg(0UL, 1); |
| 1080 | set_debugreg(0UL, 2); | 1107 | set_debugreg(0UL, 2); |
| 1081 | set_debugreg(0UL, 3); | 1108 | set_debugreg(0UL, 3); |
| 1082 | set_debugreg(0UL, 6); | 1109 | set_debugreg(0UL, 6); |
| 1083 | set_debugreg(0UL, 7); | 1110 | set_debugreg(0UL, 7); |
| 1084 | #ifdef CONFIG_KGDB | ||
| 1085 | /* If the kgdb is connected no debug regs should be altered. */ | ||
| 1086 | } | 1111 | } |
| 1087 | #endif | ||
| 1088 | 1112 | ||
| 1089 | fpu_init(); | 1113 | fpu_init(); |
| 1090 | 1114 | ||
| @@ -1114,7 +1138,7 @@ void __cpuinit cpu_init(void) | |||
| 1114 | clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE); | 1138 | clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE); |
| 1115 | 1139 | ||
| 1116 | load_idt(&idt_descr); | 1140 | load_idt(&idt_descr); |
| 1117 | switch_to_new_gdt(); | 1141 | switch_to_new_gdt(cpu); |
| 1118 | 1142 | ||
| 1119 | /* | 1143 | /* |
| 1120 | * Set up and load the per-CPU TSS and LDT | 1144 | * Set up and load the per-CPU TSS and LDT |
| @@ -1135,9 +1159,6 @@ void __cpuinit cpu_init(void) | |||
| 1135 | __set_tss_desc(cpu, GDT_ENTRY_DOUBLEFAULT_TSS, &doublefault_tss); | 1159 | __set_tss_desc(cpu, GDT_ENTRY_DOUBLEFAULT_TSS, &doublefault_tss); |
| 1136 | #endif | 1160 | #endif |
| 1137 | 1161 | ||
| 1138 | /* Clear %gs. */ | ||
| 1139 | asm volatile ("mov %0, %%gs" : : "r" (0)); | ||
| 1140 | |||
| 1141 | /* Clear all 6 debug registers: */ | 1162 | /* Clear all 6 debug registers: */ |
| 1142 | set_debugreg(0, 0); | 1163 | set_debugreg(0, 0); |
| 1143 | set_debugreg(0, 1); | 1164 | set_debugreg(0, 1); |
diff --git a/arch/x86/kernel/cpu/cpufreq/e_powersaver.c b/arch/x86/kernel/cpu/cpufreq/e_powersaver.c index c2f930d86640..41ab3f064cb1 100644 --- a/arch/x86/kernel/cpu/cpufreq/e_powersaver.c +++ b/arch/x86/kernel/cpu/cpufreq/e_powersaver.c | |||
| @@ -204,12 +204,12 @@ static int eps_cpu_init(struct cpufreq_policy *policy) | |||
| 204 | } | 204 | } |
| 205 | /* Enable Enhanced PowerSaver */ | 205 | /* Enable Enhanced PowerSaver */ |
| 206 | rdmsrl(MSR_IA32_MISC_ENABLE, val); | 206 | rdmsrl(MSR_IA32_MISC_ENABLE, val); |
| 207 | if (!(val & 1 << 16)) { | 207 | if (!(val & MSR_IA32_MISC_ENABLE_ENHANCED_SPEEDSTEP)) { |
| 208 | val |= 1 << 16; | 208 | val |= MSR_IA32_MISC_ENABLE_ENHANCED_SPEEDSTEP; |
| 209 | wrmsrl(MSR_IA32_MISC_ENABLE, val); | 209 | wrmsrl(MSR_IA32_MISC_ENABLE, val); |
| 210 | /* Can be locked at 0 */ | 210 | /* Can be locked at 0 */ |
| 211 | rdmsrl(MSR_IA32_MISC_ENABLE, val); | 211 | rdmsrl(MSR_IA32_MISC_ENABLE, val); |
| 212 | if (!(val & 1 << 16)) { | 212 | if (!(val & MSR_IA32_MISC_ENABLE_ENHANCED_SPEEDSTEP)) { |
| 213 | printk(KERN_INFO "eps: Can't enable Enhanced PowerSaver\n"); | 213 | printk(KERN_INFO "eps: Can't enable Enhanced PowerSaver\n"); |
| 214 | return -ENODEV; | 214 | return -ENODEV; |
| 215 | } | 215 | } |
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c b/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c index f08998278a3a..c9f1fdc02830 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-centrino.c | |||
| @@ -390,14 +390,14 @@ static int centrino_cpu_init(struct cpufreq_policy *policy) | |||
| 390 | enable it if not. */ | 390 | enable it if not. */ |
| 391 | rdmsr(MSR_IA32_MISC_ENABLE, l, h); | 391 | rdmsr(MSR_IA32_MISC_ENABLE, l, h); |
| 392 | 392 | ||
| 393 | if (!(l & (1<<16))) { | 393 | if (!(l & MSR_IA32_MISC_ENABLE_ENHANCED_SPEEDSTEP)) { |
| 394 | l |= (1<<16); | 394 | l |= MSR_IA32_MISC_ENABLE_ENHANCED_SPEEDSTEP; |
| 395 | dprintk("trying to enable Enhanced SpeedStep (%x)\n", l); | 395 | dprintk("trying to enable Enhanced SpeedStep (%x)\n", l); |
| 396 | wrmsr(MSR_IA32_MISC_ENABLE, l, h); | 396 | wrmsr(MSR_IA32_MISC_ENABLE, l, h); |
| 397 | 397 | ||
| 398 | /* check to see if it stuck */ | 398 | /* check to see if it stuck */ |
| 399 | rdmsr(MSR_IA32_MISC_ENABLE, l, h); | 399 | rdmsr(MSR_IA32_MISC_ENABLE, l, h); |
| 400 | if (!(l & (1<<16))) { | 400 | if (!(l & MSR_IA32_MISC_ENABLE_ENHANCED_SPEEDSTEP)) { |
| 401 | printk(KERN_INFO PFX | 401 | printk(KERN_INFO PFX |
| 402 | "couldn't enable Enhanced SpeedStep\n"); | 402 | "couldn't enable Enhanced SpeedStep\n"); |
| 403 | return -ENODEV; | 403 | return -ENODEV; |
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index 24ff26a38ade..25c559ba8d54 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
| @@ -24,7 +24,6 @@ | |||
| 24 | #ifdef CONFIG_X86_LOCAL_APIC | 24 | #ifdef CONFIG_X86_LOCAL_APIC |
| 25 | #include <asm/mpspec.h> | 25 | #include <asm/mpspec.h> |
| 26 | #include <asm/apic.h> | 26 | #include <asm/apic.h> |
| 27 | #include <mach_apic.h> | ||
| 28 | #endif | 27 | #endif |
| 29 | 28 | ||
| 30 | static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) | 29 | static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) |
| @@ -63,6 +62,18 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) | |||
| 63 | set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); | 62 | set_cpu_cap(c, X86_FEATURE_NONSTOP_TSC); |
| 64 | } | 63 | } |
| 65 | 64 | ||
| 65 | /* | ||
| 66 | * There is a known erratum on Pentium III and Core Solo | ||
| 67 | * and Core Duo CPUs. | ||
| 68 | * " Page with PAT set to WC while associated MTRR is UC | ||
| 69 | * may consolidate to UC " | ||
| 70 | * Because of this erratum, it is better to stick with | ||
| 71 | * setting WC in MTRR rather than using PAT on these CPUs. | ||
| 72 | * | ||
| 73 | * Enable PAT WC only on P4, Core 2 or later CPUs. | ||
| 74 | */ | ||
| 75 | if (c->x86 == 6 && c->x86_model < 15) | ||
| 76 | clear_cpu_cap(c, X86_FEATURE_PAT); | ||
| 66 | } | 77 | } |
| 67 | 78 | ||
| 68 | #ifdef CONFIG_X86_32 | 79 | #ifdef CONFIG_X86_32 |
| @@ -135,10 +146,10 @@ static void __cpuinit intel_workarounds(struct cpuinfo_x86 *c) | |||
| 135 | */ | 146 | */ |
| 136 | if ((c->x86 == 15) && (c->x86_model == 1) && (c->x86_mask == 1)) { | 147 | if ((c->x86 == 15) && (c->x86_model == 1) && (c->x86_mask == 1)) { |
| 137 | rdmsr(MSR_IA32_MISC_ENABLE, lo, hi); | 148 | rdmsr(MSR_IA32_MISC_ENABLE, lo, hi); |
| 138 | if ((lo & (1<<9)) == 0) { | 149 | if ((lo & MSR_IA32_MISC_ENABLE_PREFETCH_DISABLE) == 0) { |
| 139 | printk (KERN_INFO "CPU: C0 stepping P4 Xeon detected.\n"); | 150 | printk (KERN_INFO "CPU: C0 stepping P4 Xeon detected.\n"); |
| 140 | printk (KERN_INFO "CPU: Disabling hardware prefetching (Errata 037)\n"); | 151 | printk (KERN_INFO "CPU: Disabling hardware prefetching (Errata 037)\n"); |
| 141 | lo |= (1<<9); /* Disable hw prefetching */ | 152 | lo |= MSR_IA32_MISC_ENABLE_PREFETCH_DISABLE; |
| 142 | wrmsr (MSR_IA32_MISC_ENABLE, lo, hi); | 153 | wrmsr (MSR_IA32_MISC_ENABLE, lo, hi); |
| 143 | } | 154 | } |
| 144 | } | 155 | } |
diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index da299eb85fc0..7293508d8f5c 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c | |||
| @@ -147,7 +147,16 @@ struct _cpuid4_info { | |||
| 147 | union _cpuid4_leaf_ecx ecx; | 147 | union _cpuid4_leaf_ecx ecx; |
| 148 | unsigned long size; | 148 | unsigned long size; |
| 149 | unsigned long can_disable; | 149 | unsigned long can_disable; |
| 150 | cpumask_t shared_cpu_map; /* future?: only cpus/node is needed */ | 150 | DECLARE_BITMAP(shared_cpu_map, NR_CPUS); |
| 151 | }; | ||
| 152 | |||
| 153 | /* subset of above _cpuid4_info w/o shared_cpu_map */ | ||
| 154 | struct _cpuid4_info_regs { | ||
| 155 | union _cpuid4_leaf_eax eax; | ||
| 156 | union _cpuid4_leaf_ebx ebx; | ||
| 157 | union _cpuid4_leaf_ecx ecx; | ||
| 158 | unsigned long size; | ||
| 159 | unsigned long can_disable; | ||
| 151 | }; | 160 | }; |
| 152 | 161 | ||
| 153 | #ifdef CONFIG_PCI | 162 | #ifdef CONFIG_PCI |
| @@ -278,7 +287,7 @@ amd_cpuid4(int leaf, union _cpuid4_leaf_eax *eax, | |||
| 278 | } | 287 | } |
| 279 | 288 | ||
| 280 | static void __cpuinit | 289 | static void __cpuinit |
| 281 | amd_check_l3_disable(int index, struct _cpuid4_info *this_leaf) | 290 | amd_check_l3_disable(int index, struct _cpuid4_info_regs *this_leaf) |
| 282 | { | 291 | { |
| 283 | if (index < 3) | 292 | if (index < 3) |
| 284 | return; | 293 | return; |
| @@ -286,7 +295,8 @@ amd_check_l3_disable(int index, struct _cpuid4_info *this_leaf) | |||
| 286 | } | 295 | } |
| 287 | 296 | ||
| 288 | static int | 297 | static int |
| 289 | __cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf) | 298 | __cpuinit cpuid4_cache_lookup_regs(int index, |
| 299 | struct _cpuid4_info_regs *this_leaf) | ||
| 290 | { | 300 | { |
| 291 | union _cpuid4_leaf_eax eax; | 301 | union _cpuid4_leaf_eax eax; |
| 292 | union _cpuid4_leaf_ebx ebx; | 302 | union _cpuid4_leaf_ebx ebx; |
| @@ -314,6 +324,15 @@ __cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf) | |||
| 314 | return 0; | 324 | return 0; |
| 315 | } | 325 | } |
| 316 | 326 | ||
| 327 | static int | ||
| 328 | __cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf) | ||
| 329 | { | ||
| 330 | struct _cpuid4_info_regs *leaf_regs = | ||
| 331 | (struct _cpuid4_info_regs *)this_leaf; | ||
| 332 | |||
| 333 | return cpuid4_cache_lookup_regs(index, leaf_regs); | ||
| 334 | } | ||
| 335 | |||
| 317 | static int __cpuinit find_num_cache_leaves(void) | 336 | static int __cpuinit find_num_cache_leaves(void) |
| 318 | { | 337 | { |
| 319 | unsigned int eax, ebx, ecx, edx; | 338 | unsigned int eax, ebx, ecx, edx; |
| @@ -353,11 +372,10 @@ unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c) | |||
| 353 | * parameters cpuid leaf to find the cache details | 372 | * parameters cpuid leaf to find the cache details |
| 354 | */ | 373 | */ |
| 355 | for (i = 0; i < num_cache_leaves; i++) { | 374 | for (i = 0; i < num_cache_leaves; i++) { |
| 356 | struct _cpuid4_info this_leaf; | 375 | struct _cpuid4_info_regs this_leaf; |
| 357 | |||
| 358 | int retval; | 376 | int retval; |
| 359 | 377 | ||
| 360 | retval = cpuid4_cache_lookup(i, &this_leaf); | 378 | retval = cpuid4_cache_lookup_regs(i, &this_leaf); |
| 361 | if (retval >= 0) { | 379 | if (retval >= 0) { |
| 362 | switch(this_leaf.eax.split.level) { | 380 | switch(this_leaf.eax.split.level) { |
| 363 | case 1: | 381 | case 1: |
| @@ -506,17 +524,20 @@ static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index) | |||
| 506 | num_threads_sharing = 1 + this_leaf->eax.split.num_threads_sharing; | 524 | num_threads_sharing = 1 + this_leaf->eax.split.num_threads_sharing; |
| 507 | 525 | ||
| 508 | if (num_threads_sharing == 1) | 526 | if (num_threads_sharing == 1) |
| 509 | cpu_set(cpu, this_leaf->shared_cpu_map); | 527 | cpumask_set_cpu(cpu, to_cpumask(this_leaf->shared_cpu_map)); |
| 510 | else { | 528 | else { |
| 511 | index_msb = get_count_order(num_threads_sharing); | 529 | index_msb = get_count_order(num_threads_sharing); |
| 512 | 530 | ||
| 513 | for_each_online_cpu(i) { | 531 | for_each_online_cpu(i) { |
| 514 | if (cpu_data(i).apicid >> index_msb == | 532 | if (cpu_data(i).apicid >> index_msb == |
| 515 | c->apicid >> index_msb) { | 533 | c->apicid >> index_msb) { |
| 516 | cpu_set(i, this_leaf->shared_cpu_map); | 534 | cpumask_set_cpu(i, |
| 535 | to_cpumask(this_leaf->shared_cpu_map)); | ||
| 517 | if (i != cpu && per_cpu(cpuid4_info, i)) { | 536 | if (i != cpu && per_cpu(cpuid4_info, i)) { |
| 518 | sibling_leaf = CPUID4_INFO_IDX(i, index); | 537 | sibling_leaf = |
| 519 | cpu_set(cpu, sibling_leaf->shared_cpu_map); | 538 | CPUID4_INFO_IDX(i, index); |
| 539 | cpumask_set_cpu(cpu, to_cpumask( | ||
| 540 | sibling_leaf->shared_cpu_map)); | ||
| 520 | } | 541 | } |
| 521 | } | 542 | } |
| 522 | } | 543 | } |
| @@ -528,9 +549,10 @@ static void __cpuinit cache_remove_shared_cpu_map(unsigned int cpu, int index) | |||
| 528 | int sibling; | 549 | int sibling; |
| 529 | 550 | ||
| 530 | this_leaf = CPUID4_INFO_IDX(cpu, index); | 551 | this_leaf = CPUID4_INFO_IDX(cpu, index); |
| 531 | for_each_cpu_mask_nr(sibling, this_leaf->shared_cpu_map) { | 552 | for_each_cpu(sibling, to_cpumask(this_leaf->shared_cpu_map)) { |
| 532 | sibling_leaf = CPUID4_INFO_IDX(sibling, index); | 553 | sibling_leaf = CPUID4_INFO_IDX(sibling, index); |
| 533 | cpu_clear(cpu, sibling_leaf->shared_cpu_map); | 554 | cpumask_clear_cpu(cpu, |
| 555 | to_cpumask(sibling_leaf->shared_cpu_map)); | ||
| 534 | } | 556 | } |
| 535 | } | 557 | } |
| 536 | #else | 558 | #else |
| @@ -635,8 +657,9 @@ static ssize_t show_shared_cpu_map_func(struct _cpuid4_info *this_leaf, | |||
| 635 | int n = 0; | 657 | int n = 0; |
| 636 | 658 | ||
| 637 | if (len > 1) { | 659 | if (len > 1) { |
| 638 | cpumask_t *mask = &this_leaf->shared_cpu_map; | 660 | const struct cpumask *mask; |
| 639 | 661 | ||
| 662 | mask = to_cpumask(this_leaf->shared_cpu_map); | ||
| 640 | n = type? | 663 | n = type? |
| 641 | cpulist_scnprintf(buf, len-2, mask) : | 664 | cpulist_scnprintf(buf, len-2, mask) : |
| 642 | cpumask_scnprintf(buf, len-2, mask); | 665 | cpumask_scnprintf(buf, len-2, mask); |
| @@ -699,7 +722,8 @@ static struct pci_dev *get_k8_northbridge(int node) | |||
| 699 | 722 | ||
| 700 | static ssize_t show_cache_disable(struct _cpuid4_info *this_leaf, char *buf) | 723 | static ssize_t show_cache_disable(struct _cpuid4_info *this_leaf, char *buf) |
| 701 | { | 724 | { |
| 702 | int node = cpu_to_node(first_cpu(this_leaf->shared_cpu_map)); | 725 | const struct cpumask *mask = to_cpumask(this_leaf->shared_cpu_map); |
| 726 | int node = cpu_to_node(cpumask_first(mask)); | ||
| 703 | struct pci_dev *dev = NULL; | 727 | struct pci_dev *dev = NULL; |
| 704 | ssize_t ret = 0; | 728 | ssize_t ret = 0; |
| 705 | int i; | 729 | int i; |
| @@ -733,7 +757,8 @@ static ssize_t | |||
| 733 | store_cache_disable(struct _cpuid4_info *this_leaf, const char *buf, | 757 | store_cache_disable(struct _cpuid4_info *this_leaf, const char *buf, |
| 734 | size_t count) | 758 | size_t count) |
| 735 | { | 759 | { |
| 736 | int node = cpu_to_node(first_cpu(this_leaf->shared_cpu_map)); | 760 | const struct cpumask *mask = to_cpumask(this_leaf->shared_cpu_map); |
| 761 | int node = cpu_to_node(cpumask_first(mask)); | ||
| 737 | struct pci_dev *dev = NULL; | 762 | struct pci_dev *dev = NULL; |
| 738 | unsigned int ret, index, val; | 763 | unsigned int ret, index, val; |
| 739 | 764 | ||
| @@ -878,7 +903,7 @@ err_out: | |||
| 878 | return -ENOMEM; | 903 | return -ENOMEM; |
| 879 | } | 904 | } |
| 880 | 905 | ||
| 881 | static cpumask_t cache_dev_map = CPU_MASK_NONE; | 906 | static DECLARE_BITMAP(cache_dev_map, NR_CPUS); |
| 882 | 907 | ||
| 883 | /* Add/Remove cache interface for CPU device */ | 908 | /* Add/Remove cache interface for CPU device */ |
| 884 | static int __cpuinit cache_add_dev(struct sys_device * sys_dev) | 909 | static int __cpuinit cache_add_dev(struct sys_device * sys_dev) |
| @@ -918,7 +943,7 @@ static int __cpuinit cache_add_dev(struct sys_device * sys_dev) | |||
| 918 | } | 943 | } |
| 919 | kobject_uevent(&(this_object->kobj), KOBJ_ADD); | 944 | kobject_uevent(&(this_object->kobj), KOBJ_ADD); |
| 920 | } | 945 | } |
| 921 | cpu_set(cpu, cache_dev_map); | 946 | cpumask_set_cpu(cpu, to_cpumask(cache_dev_map)); |
| 922 | 947 | ||
| 923 | kobject_uevent(per_cpu(cache_kobject, cpu), KOBJ_ADD); | 948 | kobject_uevent(per_cpu(cache_kobject, cpu), KOBJ_ADD); |
| 924 | return 0; | 949 | return 0; |
| @@ -931,9 +956,9 @@ static void __cpuinit cache_remove_dev(struct sys_device * sys_dev) | |||
| 931 | 956 | ||
| 932 | if (per_cpu(cpuid4_info, cpu) == NULL) | 957 | if (per_cpu(cpuid4_info, cpu) == NULL) |
| 933 | return; | 958 | return; |
| 934 | if (!cpu_isset(cpu, cache_dev_map)) | 959 | if (!cpumask_test_cpu(cpu, to_cpumask(cache_dev_map))) |
| 935 | return; | 960 | return; |
| 936 | cpu_clear(cpu, cache_dev_map); | 961 | cpumask_clear_cpu(cpu, to_cpumask(cache_dev_map)); |
| 937 | 962 | ||
| 938 | for (i = 0; i < num_cache_leaves; i++) | 963 | for (i = 0; i < num_cache_leaves; i++) |
| 939 | kobject_put(&(INDEX_KOBJECT_PTR(cpu,i)->kobj)); | 964 | kobject_put(&(INDEX_KOBJECT_PTR(cpu,i)->kobj)); |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c index 8ae8c4ff094d..4772e91e8246 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd_64.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd_64.c | |||
| @@ -67,7 +67,7 @@ static struct threshold_block threshold_defaults = { | |||
| 67 | struct threshold_bank { | 67 | struct threshold_bank { |
| 68 | struct kobject *kobj; | 68 | struct kobject *kobj; |
| 69 | struct threshold_block *blocks; | 69 | struct threshold_block *blocks; |
| 70 | cpumask_t cpus; | 70 | cpumask_var_t cpus; |
| 71 | }; | 71 | }; |
| 72 | static DEFINE_PER_CPU(struct threshold_bank *, threshold_banks[NR_BANKS]); | 72 | static DEFINE_PER_CPU(struct threshold_bank *, threshold_banks[NR_BANKS]); |
| 73 | 73 | ||
| @@ -481,7 +481,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
| 481 | 481 | ||
| 482 | #ifdef CONFIG_SMP | 482 | #ifdef CONFIG_SMP |
| 483 | if (cpu_data(cpu).cpu_core_id && shared_bank[bank]) { /* symlink */ | 483 | if (cpu_data(cpu).cpu_core_id && shared_bank[bank]) { /* symlink */ |
| 484 | i = first_cpu(per_cpu(cpu_core_map, cpu)); | 484 | i = cpumask_first(&per_cpu(cpu_core_map, cpu)); |
| 485 | 485 | ||
| 486 | /* first core not up yet */ | 486 | /* first core not up yet */ |
| 487 | if (cpu_data(i).cpu_core_id) | 487 | if (cpu_data(i).cpu_core_id) |
| @@ -501,7 +501,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
| 501 | if (err) | 501 | if (err) |
| 502 | goto out; | 502 | goto out; |
| 503 | 503 | ||
| 504 | b->cpus = per_cpu(cpu_core_map, cpu); | 504 | cpumask_copy(b->cpus, &per_cpu(cpu_core_map, cpu)); |
| 505 | per_cpu(threshold_banks, cpu)[bank] = b; | 505 | per_cpu(threshold_banks, cpu)[bank] = b; |
| 506 | goto out; | 506 | goto out; |
| 507 | } | 507 | } |
| @@ -512,15 +512,20 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
| 512 | err = -ENOMEM; | 512 | err = -ENOMEM; |
| 513 | goto out; | 513 | goto out; |
| 514 | } | 514 | } |
| 515 | if (!alloc_cpumask_var(&b->cpus, GFP_KERNEL)) { | ||
| 516 | kfree(b); | ||
| 517 | err = -ENOMEM; | ||
| 518 | goto out; | ||
| 519 | } | ||
| 515 | 520 | ||
| 516 | b->kobj = kobject_create_and_add(name, &per_cpu(device_mce, cpu).kobj); | 521 | b->kobj = kobject_create_and_add(name, &per_cpu(device_mce, cpu).kobj); |
| 517 | if (!b->kobj) | 522 | if (!b->kobj) |
| 518 | goto out_free; | 523 | goto out_free; |
| 519 | 524 | ||
| 520 | #ifndef CONFIG_SMP | 525 | #ifndef CONFIG_SMP |
| 521 | b->cpus = CPU_MASK_ALL; | 526 | cpumask_setall(b->cpus); |
| 522 | #else | 527 | #else |
| 523 | b->cpus = per_cpu(cpu_core_map, cpu); | 528 | cpumask_copy(b->cpus, &per_cpu(cpu_core_map, cpu)); |
| 524 | #endif | 529 | #endif |
| 525 | 530 | ||
| 526 | per_cpu(threshold_banks, cpu)[bank] = b; | 531 | per_cpu(threshold_banks, cpu)[bank] = b; |
| @@ -529,7 +534,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
| 529 | if (err) | 534 | if (err) |
| 530 | goto out_free; | 535 | goto out_free; |
| 531 | 536 | ||
| 532 | for_each_cpu_mask_nr(i, b->cpus) { | 537 | for_each_cpu(i, b->cpus) { |
| 533 | if (i == cpu) | 538 | if (i == cpu) |
| 534 | continue; | 539 | continue; |
| 535 | 540 | ||
| @@ -545,6 +550,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank) | |||
| 545 | 550 | ||
| 546 | out_free: | 551 | out_free: |
| 547 | per_cpu(threshold_banks, cpu)[bank] = NULL; | 552 | per_cpu(threshold_banks, cpu)[bank] = NULL; |
| 553 | free_cpumask_var(b->cpus); | ||
| 548 | kfree(b); | 554 | kfree(b); |
| 549 | out: | 555 | out: |
| 550 | return err; | 556 | return err; |
| @@ -619,7 +625,7 @@ static void threshold_remove_bank(unsigned int cpu, int bank) | |||
| 619 | #endif | 625 | #endif |
| 620 | 626 | ||
| 621 | /* remove all sibling symlinks before unregistering */ | 627 | /* remove all sibling symlinks before unregistering */ |
| 622 | for_each_cpu_mask_nr(i, b->cpus) { | 628 | for_each_cpu(i, b->cpus) { |
| 623 | if (i == cpu) | 629 | if (i == cpu) |
| 624 | continue; | 630 | continue; |
| 625 | 631 | ||
| @@ -632,6 +638,7 @@ static void threshold_remove_bank(unsigned int cpu, int bank) | |||
| 632 | free_out: | 638 | free_out: |
| 633 | kobject_del(b->kobj); | 639 | kobject_del(b->kobj); |
| 634 | kobject_put(b->kobj); | 640 | kobject_put(b->kobj); |
| 641 | free_cpumask_var(b->cpus); | ||
| 635 | kfree(b); | 642 | kfree(b); |
| 636 | per_cpu(threshold_banks, cpu)[bank] = NULL; | 643 | per_cpu(threshold_banks, cpu)[bank] = NULL; |
| 637 | } | 644 | } |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_intel_64.c b/arch/x86/kernel/cpu/mcheck/mce_intel_64.c index 4b48f251fd39..ae00938ea50b 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_intel_64.c +++ b/arch/x86/kernel/cpu/mcheck/mce_intel_64.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <linux/interrupt.h> | 7 | #include <linux/interrupt.h> |
| 8 | #include <linux/percpu.h> | 8 | #include <linux/percpu.h> |
| 9 | #include <asm/processor.h> | 9 | #include <asm/processor.h> |
| 10 | #include <asm/apic.h> | ||
| 10 | #include <asm/msr.h> | 11 | #include <asm/msr.h> |
| 11 | #include <asm/mce.h> | 12 | #include <asm/mce.h> |
| 12 | #include <asm/hw_irq.h> | 13 | #include <asm/hw_irq.h> |
| @@ -48,13 +49,13 @@ static void __cpuinit intel_init_thermal(struct cpuinfo_x86 *c) | |||
| 48 | */ | 49 | */ |
| 49 | rdmsr(MSR_IA32_MISC_ENABLE, l, h); | 50 | rdmsr(MSR_IA32_MISC_ENABLE, l, h); |
| 50 | h = apic_read(APIC_LVTTHMR); | 51 | h = apic_read(APIC_LVTTHMR); |
| 51 | if ((l & (1 << 3)) && (h & APIC_DM_SMI)) { | 52 | if ((l & MSR_IA32_MISC_ENABLE_TM1) && (h & APIC_DM_SMI)) { |
| 52 | printk(KERN_DEBUG | 53 | printk(KERN_DEBUG |
| 53 | "CPU%d: Thermal monitoring handled by SMI\n", cpu); | 54 | "CPU%d: Thermal monitoring handled by SMI\n", cpu); |
| 54 | return; | 55 | return; |
| 55 | } | 56 | } |
| 56 | 57 | ||
| 57 | if (cpu_has(c, X86_FEATURE_TM2) && (l & (1 << 13))) | 58 | if (cpu_has(c, X86_FEATURE_TM2) && (l & MSR_IA32_MISC_ENABLE_TM2)) |
| 58 | tm2 = 1; | 59 | tm2 = 1; |
| 59 | 60 | ||
| 60 | if (h & APIC_VECTOR_MASK) { | 61 | if (h & APIC_VECTOR_MASK) { |
| @@ -72,7 +73,7 @@ static void __cpuinit intel_init_thermal(struct cpuinfo_x86 *c) | |||
| 72 | wrmsr(MSR_IA32_THERM_INTERRUPT, l | 0x03, h); | 73 | wrmsr(MSR_IA32_THERM_INTERRUPT, l | 0x03, h); |
| 73 | 74 | ||
| 74 | rdmsr(MSR_IA32_MISC_ENABLE, l, h); | 75 | rdmsr(MSR_IA32_MISC_ENABLE, l, h); |
| 75 | wrmsr(MSR_IA32_MISC_ENABLE, l | (1 << 3), h); | 76 | wrmsr(MSR_IA32_MISC_ENABLE, l | MSR_IA32_MISC_ENABLE_TM1, h); |
| 76 | 77 | ||
| 77 | l = apic_read(APIC_LVTTHMR); | 78 | l = apic_read(APIC_LVTTHMR); |
| 78 | apic_write(APIC_LVTTHMR, l & ~APIC_LVT_MASKED); | 79 | apic_write(APIC_LVTTHMR, l & ~APIC_LVT_MASKED); |
diff --git a/arch/x86/kernel/cpu/mcheck/p4.c b/arch/x86/kernel/cpu/mcheck/p4.c index 9b60fce09f75..f53bdcbaf382 100644 --- a/arch/x86/kernel/cpu/mcheck/p4.c +++ b/arch/x86/kernel/cpu/mcheck/p4.c | |||
| @@ -85,7 +85,7 @@ static void intel_init_thermal(struct cpuinfo_x86 *c) | |||
| 85 | */ | 85 | */ |
| 86 | rdmsr(MSR_IA32_MISC_ENABLE, l, h); | 86 | rdmsr(MSR_IA32_MISC_ENABLE, l, h); |
| 87 | h = apic_read(APIC_LVTTHMR); | 87 | h = apic_read(APIC_LVTTHMR); |
| 88 | if ((l & (1<<3)) && (h & APIC_DM_SMI)) { | 88 | if ((l & MSR_IA32_MISC_ENABLE_TM1) && (h & APIC_DM_SMI)) { |
| 89 | printk(KERN_DEBUG "CPU%d: Thermal monitoring handled by SMI\n", | 89 | printk(KERN_DEBUG "CPU%d: Thermal monitoring handled by SMI\n", |
| 90 | cpu); | 90 | cpu); |
| 91 | return; /* -EBUSY */ | 91 | return; /* -EBUSY */ |
| @@ -111,7 +111,7 @@ static void intel_init_thermal(struct cpuinfo_x86 *c) | |||
| 111 | vendor_thermal_interrupt = intel_thermal_interrupt; | 111 | vendor_thermal_interrupt = intel_thermal_interrupt; |
| 112 | 112 | ||
| 113 | rdmsr(MSR_IA32_MISC_ENABLE, l, h); | 113 | rdmsr(MSR_IA32_MISC_ENABLE, l, h); |
| 114 | wrmsr(MSR_IA32_MISC_ENABLE, l | (1<<3), h); | 114 | wrmsr(MSR_IA32_MISC_ENABLE, l | MSR_IA32_MISC_ENABLE_TM1, h); |
| 115 | 115 | ||
| 116 | l = apic_read(APIC_LVTTHMR); | 116 | l = apic_read(APIC_LVTTHMR); |
| 117 | apic_write(APIC_LVTTHMR, l & ~APIC_LVT_MASKED); | 117 | apic_write(APIC_LVTTHMR, l & ~APIC_LVT_MASKED); |
diff --git a/arch/x86/kernel/cpu/perfctr-watchdog.c b/arch/x86/kernel/cpu/perfctr-watchdog.c index 9abd48b22674..f6c70a164e32 100644 --- a/arch/x86/kernel/cpu/perfctr-watchdog.c +++ b/arch/x86/kernel/cpu/perfctr-watchdog.c | |||
| @@ -19,7 +19,7 @@ | |||
| 19 | #include <linux/nmi.h> | 19 | #include <linux/nmi.h> |
| 20 | #include <linux/kprobes.h> | 20 | #include <linux/kprobes.h> |
| 21 | 21 | ||
| 22 | #include <asm/apic.h> | 22 | #include <asm/genapic.h> |
| 23 | #include <asm/intel_arch_perfmon.h> | 23 | #include <asm/intel_arch_perfmon.h> |
| 24 | 24 | ||
| 25 | struct nmi_watchdog_ctlblk { | 25 | struct nmi_watchdog_ctlblk { |
diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c index c689d19e35ab..ff958248e61d 100644 --- a/arch/x86/kernel/crash.c +++ b/arch/x86/kernel/crash.c | |||
| @@ -24,12 +24,10 @@ | |||
| 24 | #include <asm/apic.h> | 24 | #include <asm/apic.h> |
| 25 | #include <asm/hpet.h> | 25 | #include <asm/hpet.h> |
| 26 | #include <linux/kdebug.h> | 26 | #include <linux/kdebug.h> |
| 27 | #include <asm/smp.h> | 27 | #include <asm/cpu.h> |
| 28 | #include <asm/reboot.h> | 28 | #include <asm/reboot.h> |
| 29 | #include <asm/virtext.h> | 29 | #include <asm/virtext.h> |
| 30 | 30 | ||
| 31 | #include <mach_ipi.h> | ||
| 32 | |||
| 33 | 31 | ||
| 34 | #if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC) | 32 | #if defined(CONFIG_SMP) && defined(CONFIG_X86_LOCAL_APIC) |
| 35 | 33 | ||
diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c index 6b1f6f6f8661..87d103ded1c3 100644 --- a/arch/x86/kernel/dumpstack.c +++ b/arch/x86/kernel/dumpstack.c | |||
| @@ -99,7 +99,7 @@ print_context_stack(struct thread_info *tinfo, | |||
| 99 | frame = frame->next_frame; | 99 | frame = frame->next_frame; |
| 100 | bp = (unsigned long) frame; | 100 | bp = (unsigned long) frame; |
| 101 | } else { | 101 | } else { |
| 102 | ops->address(data, addr, bp == 0); | 102 | ops->address(data, addr, 0); |
| 103 | } | 103 | } |
| 104 | print_ftrace_graph_addr(addr, data, ops, tinfo, graph); | 104 | print_ftrace_graph_addr(addr, data, ops, tinfo, graph); |
| 105 | } | 105 | } |
diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c index c302d0707048..d35db5993fd6 100644 --- a/arch/x86/kernel/dumpstack_64.c +++ b/arch/x86/kernel/dumpstack_64.c | |||
| @@ -106,7 +106,8 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, | |||
| 106 | const struct stacktrace_ops *ops, void *data) | 106 | const struct stacktrace_ops *ops, void *data) |
| 107 | { | 107 | { |
| 108 | const unsigned cpu = get_cpu(); | 108 | const unsigned cpu = get_cpu(); |
| 109 | unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr; | 109 | unsigned long *irq_stack_end = |
| 110 | (unsigned long *)per_cpu(irq_stack_ptr, cpu); | ||
| 110 | unsigned used = 0; | 111 | unsigned used = 0; |
| 111 | struct thread_info *tinfo; | 112 | struct thread_info *tinfo; |
| 112 | int graph = 0; | 113 | int graph = 0; |
| @@ -160,23 +161,23 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs, | |||
| 160 | stack = (unsigned long *) estack_end[-2]; | 161 | stack = (unsigned long *) estack_end[-2]; |
| 161 | continue; | 162 | continue; |
| 162 | } | 163 | } |
| 163 | if (irqstack_end) { | 164 | if (irq_stack_end) { |
| 164 | unsigned long *irqstack; | 165 | unsigned long *irq_stack; |
| 165 | irqstack = irqstack_end - | 166 | irq_stack = irq_stack_end - |
| 166 | (IRQSTACKSIZE - 64) / sizeof(*irqstack); | 167 | (IRQ_STACK_SIZE - 64) / sizeof(*irq_stack); |
| 167 | 168 | ||
| 168 | if (stack >= irqstack && stack < irqstack_end) { | 169 | if (stack >= irq_stack && stack < irq_stack_end) { |
| 169 | if (ops->stack(data, "IRQ") < 0) | 170 | if (ops->stack(data, "IRQ") < 0) |
| 170 | break; | 171 | break; |
| 171 | bp = print_context_stack(tinfo, stack, bp, | 172 | bp = print_context_stack(tinfo, stack, bp, |
| 172 | ops, data, irqstack_end, &graph); | 173 | ops, data, irq_stack_end, &graph); |
| 173 | /* | 174 | /* |
| 174 | * We link to the next stack (which would be | 175 | * We link to the next stack (which would be |
| 175 | * the process stack normally) the last | 176 | * the process stack normally) the last |
| 176 | * pointer (index -1 to end) in the IRQ stack: | 177 | * pointer (index -1 to end) in the IRQ stack: |
| 177 | */ | 178 | */ |
| 178 | stack = (unsigned long *) (irqstack_end[-1]); | 179 | stack = (unsigned long *) (irq_stack_end[-1]); |
| 179 | irqstack_end = NULL; | 180 | irq_stack_end = NULL; |
| 180 | ops->stack(data, "EOI"); | 181 | ops->stack(data, "EOI"); |
| 181 | continue; | 182 | continue; |
| 182 | } | 183 | } |
| @@ -199,10 +200,10 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | |||
| 199 | unsigned long *stack; | 200 | unsigned long *stack; |
| 200 | int i; | 201 | int i; |
| 201 | const int cpu = smp_processor_id(); | 202 | const int cpu = smp_processor_id(); |
| 202 | unsigned long *irqstack_end = | 203 | unsigned long *irq_stack_end = |
| 203 | (unsigned long *) (cpu_pda(cpu)->irqstackptr); | 204 | (unsigned long *)(per_cpu(irq_stack_ptr, cpu)); |
| 204 | unsigned long *irqstack = | 205 | unsigned long *irq_stack = |
| 205 | (unsigned long *) (cpu_pda(cpu)->irqstackptr - IRQSTACKSIZE); | 206 | (unsigned long *)(per_cpu(irq_stack_ptr, cpu) - IRQ_STACK_SIZE); |
| 206 | 207 | ||
| 207 | /* | 208 | /* |
| 208 | * debugging aid: "show_stack(NULL, NULL);" prints the | 209 | * debugging aid: "show_stack(NULL, NULL);" prints the |
| @@ -218,9 +219,9 @@ show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs, | |||
| 218 | 219 | ||
| 219 | stack = sp; | 220 | stack = sp; |
| 220 | for (i = 0; i < kstack_depth_to_print; i++) { | 221 | for (i = 0; i < kstack_depth_to_print; i++) { |
| 221 | if (stack >= irqstack && stack <= irqstack_end) { | 222 | if (stack >= irq_stack && stack <= irq_stack_end) { |
| 222 | if (stack == irqstack_end) { | 223 | if (stack == irq_stack_end) { |
| 223 | stack = (unsigned long *) (irqstack_end[-1]); | 224 | stack = (unsigned long *) (irq_stack_end[-1]); |
| 224 | printk(" <EOI> "); | 225 | printk(" <EOI> "); |
| 225 | } | 226 | } |
| 226 | } else { | 227 | } else { |
| @@ -241,7 +242,7 @@ void show_registers(struct pt_regs *regs) | |||
| 241 | int i; | 242 | int i; |
| 242 | unsigned long sp; | 243 | unsigned long sp; |
| 243 | const int cpu = smp_processor_id(); | 244 | const int cpu = smp_processor_id(); |
| 244 | struct task_struct *cur = cpu_pda(cpu)->pcurrent; | 245 | struct task_struct *cur = current; |
| 245 | 246 | ||
| 246 | sp = regs->sp; | 247 | sp = regs->sp; |
| 247 | printk("CPU %d ", cpu); | 248 | printk("CPU %d ", cpu); |
diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c index 504ad198e4ad..639ad98238a2 100644 --- a/arch/x86/kernel/early_printk.c +++ b/arch/x86/kernel/early_printk.c | |||
| @@ -13,8 +13,8 @@ | |||
| 13 | #include <asm/setup.h> | 13 | #include <asm/setup.h> |
| 14 | #include <xen/hvc-console.h> | 14 | #include <xen/hvc-console.h> |
| 15 | #include <asm/pci-direct.h> | 15 | #include <asm/pci-direct.h> |
| 16 | #include <asm/pgtable.h> | ||
| 17 | #include <asm/fixmap.h> | 16 | #include <asm/fixmap.h> |
| 17 | #include <asm/pgtable.h> | ||
| 18 | #include <linux/usb/ehci_def.h> | 18 | #include <linux/usb/ehci_def.h> |
| 19 | 19 | ||
| 20 | /* Simple VGA output */ | 20 | /* Simple VGA output */ |
diff --git a/arch/x86/kernel/efi.c b/arch/x86/kernel/efi.c index 1119d247fe11..b205272ad394 100644 --- a/arch/x86/kernel/efi.c +++ b/arch/x86/kernel/efi.c | |||
| @@ -366,10 +366,12 @@ void __init efi_init(void) | |||
| 366 | SMBIOS_TABLE_GUID)) { | 366 | SMBIOS_TABLE_GUID)) { |
| 367 | efi.smbios = config_tables[i].table; | 367 | efi.smbios = config_tables[i].table; |
| 368 | printk(" SMBIOS=0x%lx ", config_tables[i].table); | 368 | printk(" SMBIOS=0x%lx ", config_tables[i].table); |
| 369 | #ifdef CONFIG_X86_UV | ||
| 369 | } else if (!efi_guidcmp(config_tables[i].guid, | 370 | } else if (!efi_guidcmp(config_tables[i].guid, |
| 370 | UV_SYSTEM_TABLE_GUID)) { | 371 | UV_SYSTEM_TABLE_GUID)) { |
| 371 | efi.uv_systab = config_tables[i].table; | 372 | efi.uv_systab = config_tables[i].table; |
| 372 | printk(" UVsystab=0x%lx ", config_tables[i].table); | 373 | printk(" UVsystab=0x%lx ", config_tables[i].table); |
| 374 | #endif | ||
| 373 | } else if (!efi_guidcmp(config_tables[i].guid, | 375 | } else if (!efi_guidcmp(config_tables[i].guid, |
| 374 | HCDP_TABLE_GUID)) { | 376 | HCDP_TABLE_GUID)) { |
| 375 | efi.hcdp = config_tables[i].table; | 377 | efi.hcdp = config_tables[i].table; |
diff --git a/arch/x86/kernel/efi_64.c b/arch/x86/kernel/efi_64.c index 652c5287215f..a4ee29127fdf 100644 --- a/arch/x86/kernel/efi_64.c +++ b/arch/x86/kernel/efi_64.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <asm/proto.h> | 36 | #include <asm/proto.h> |
| 37 | #include <asm/efi.h> | 37 | #include <asm/efi.h> |
| 38 | #include <asm/cacheflush.h> | 38 | #include <asm/cacheflush.h> |
| 39 | #include <asm/fixmap.h> | ||
| 39 | 40 | ||
| 40 | static pgd_t save_pgd __initdata; | 41 | static pgd_t save_pgd __initdata; |
| 41 | static unsigned long efi_flags __initdata; | 42 | static unsigned long efi_flags __initdata; |
diff --git a/arch/x86/kernel/efi_stub_32.S b/arch/x86/kernel/efi_stub_32.S index ef00bb77d7e4..8b9171b9cbd2 100644 --- a/arch/x86/kernel/efi_stub_32.S +++ b/arch/x86/kernel/efi_stub_32.S | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | #include <linux/linkage.h> | 8 | #include <linux/linkage.h> |
| 9 | #include <asm/page.h> | 9 | #include <asm/page_types.h> |
| 10 | 10 | ||
| 11 | /* | 11 | /* |
| 12 | * efi_call_phys(void *, ...) is a function with variable parameters. | 12 | * efi_call_phys(void *, ...) is a function with variable parameters. |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index 46469029e9d3..999e827ef9c7 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
| @@ -30,12 +30,13 @@ | |||
| 30 | * 1C(%esp) - %ds | 30 | * 1C(%esp) - %ds |
| 31 | * 20(%esp) - %es | 31 | * 20(%esp) - %es |
| 32 | * 24(%esp) - %fs | 32 | * 24(%esp) - %fs |
| 33 | * 28(%esp) - orig_eax | 33 | * 28(%esp) - %gs saved iff !CONFIG_X86_32_LAZY_GS |
| 34 | * 2C(%esp) - %eip | 34 | * 2C(%esp) - orig_eax |
| 35 | * 30(%esp) - %cs | 35 | * 30(%esp) - %eip |
| 36 | * 34(%esp) - %eflags | 36 | * 34(%esp) - %cs |
| 37 | * 38(%esp) - %oldesp | 37 | * 38(%esp) - %eflags |
| 38 | * 3C(%esp) - %oldss | 38 | * 3C(%esp) - %oldesp |
| 39 | * 40(%esp) - %oldss | ||
| 39 | * | 40 | * |
| 40 | * "current" is in register %ebx during any slow entries. | 41 | * "current" is in register %ebx during any slow entries. |
| 41 | */ | 42 | */ |
| @@ -46,7 +47,7 @@ | |||
| 46 | #include <asm/errno.h> | 47 | #include <asm/errno.h> |
| 47 | #include <asm/segment.h> | 48 | #include <asm/segment.h> |
| 48 | #include <asm/smp.h> | 49 | #include <asm/smp.h> |
| 49 | #include <asm/page.h> | 50 | #include <asm/page_types.h> |
| 50 | #include <asm/desc.h> | 51 | #include <asm/desc.h> |
| 51 | #include <asm/percpu.h> | 52 | #include <asm/percpu.h> |
| 52 | #include <asm/dwarf2.h> | 53 | #include <asm/dwarf2.h> |
| @@ -101,121 +102,221 @@ | |||
| 101 | #define resume_userspace_sig resume_userspace | 102 | #define resume_userspace_sig resume_userspace |
| 102 | #endif | 103 | #endif |
| 103 | 104 | ||
| 104 | #define SAVE_ALL \ | 105 | /* |
| 105 | cld; \ | 106 | * User gs save/restore |
| 106 | pushl %fs; \ | 107 | * |
| 107 | CFI_ADJUST_CFA_OFFSET 4;\ | 108 | * %gs is used for userland TLS and kernel only uses it for stack |
| 108 | /*CFI_REL_OFFSET fs, 0;*/\ | 109 | * canary which is required to be at %gs:20 by gcc. Read the comment |
| 109 | pushl %es; \ | 110 | * at the top of stackprotector.h for more info. |
| 110 | CFI_ADJUST_CFA_OFFSET 4;\ | 111 | * |
| 111 | /*CFI_REL_OFFSET es, 0;*/\ | 112 | * Local labels 98 and 99 are used. |
| 112 | pushl %ds; \ | 113 | */ |
| 113 | CFI_ADJUST_CFA_OFFSET 4;\ | 114 | #ifdef CONFIG_X86_32_LAZY_GS |
| 114 | /*CFI_REL_OFFSET ds, 0;*/\ | 115 | |
| 115 | pushl %eax; \ | 116 | /* unfortunately push/pop can't be no-op */ |
| 116 | CFI_ADJUST_CFA_OFFSET 4;\ | 117 | .macro PUSH_GS |
| 117 | CFI_REL_OFFSET eax, 0;\ | 118 | pushl $0 |
| 118 | pushl %ebp; \ | 119 | CFI_ADJUST_CFA_OFFSET 4 |
| 119 | CFI_ADJUST_CFA_OFFSET 4;\ | 120 | .endm |
| 120 | CFI_REL_OFFSET ebp, 0;\ | 121 | .macro POP_GS pop=0 |
| 121 | pushl %edi; \ | 122 | addl $(4 + \pop), %esp |
| 122 | CFI_ADJUST_CFA_OFFSET 4;\ | 123 | CFI_ADJUST_CFA_OFFSET -(4 + \pop) |
| 123 | CFI_REL_OFFSET edi, 0;\ | 124 | .endm |
| 124 | pushl %esi; \ | 125 | .macro POP_GS_EX |
| 125 | CFI_ADJUST_CFA_OFFSET 4;\ | 126 | .endm |
| 126 | CFI_REL_OFFSET esi, 0;\ | 127 | |
| 127 | pushl %edx; \ | 128 | /* all the rest are no-op */ |
| 128 | CFI_ADJUST_CFA_OFFSET 4;\ | 129 | .macro PTGS_TO_GS |
| 129 | CFI_REL_OFFSET edx, 0;\ | 130 | .endm |
| 130 | pushl %ecx; \ | 131 | .macro PTGS_TO_GS_EX |
| 131 | CFI_ADJUST_CFA_OFFSET 4;\ | 132 | .endm |
| 132 | CFI_REL_OFFSET ecx, 0;\ | 133 | .macro GS_TO_REG reg |
| 133 | pushl %ebx; \ | 134 | .endm |
| 134 | CFI_ADJUST_CFA_OFFSET 4;\ | 135 | .macro REG_TO_PTGS reg |
| 135 | CFI_REL_OFFSET ebx, 0;\ | 136 | .endm |
| 136 | movl $(__USER_DS), %edx; \ | 137 | .macro SET_KERNEL_GS reg |
| 137 | movl %edx, %ds; \ | 138 | .endm |
| 138 | movl %edx, %es; \ | 139 | |
| 139 | movl $(__KERNEL_PERCPU), %edx; \ | 140 | #else /* CONFIG_X86_32_LAZY_GS */ |
| 141 | |||
| 142 | .macro PUSH_GS | ||
| 143 | pushl %gs | ||
| 144 | CFI_ADJUST_CFA_OFFSET 4 | ||
| 145 | /*CFI_REL_OFFSET gs, 0*/ | ||
| 146 | .endm | ||
| 147 | |||
| 148 | .macro POP_GS pop=0 | ||
| 149 | 98: popl %gs | ||
| 150 | CFI_ADJUST_CFA_OFFSET -4 | ||
| 151 | /*CFI_RESTORE gs*/ | ||
| 152 | .if \pop <> 0 | ||
| 153 | add $\pop, %esp | ||
| 154 | CFI_ADJUST_CFA_OFFSET -\pop | ||
| 155 | .endif | ||
| 156 | .endm | ||
| 157 | .macro POP_GS_EX | ||
| 158 | .pushsection .fixup, "ax" | ||
| 159 | 99: movl $0, (%esp) | ||
| 160 | jmp 98b | ||
| 161 | .section __ex_table, "a" | ||
| 162 | .align 4 | ||
| 163 | .long 98b, 99b | ||
| 164 | .popsection | ||
| 165 | .endm | ||
| 166 | |||
| 167 | .macro PTGS_TO_GS | ||
| 168 | 98: mov PT_GS(%esp), %gs | ||
| 169 | .endm | ||
| 170 | .macro PTGS_TO_GS_EX | ||
| 171 | .pushsection .fixup, "ax" | ||
| 172 | 99: movl $0, PT_GS(%esp) | ||
| 173 | jmp 98b | ||
| 174 | .section __ex_table, "a" | ||
| 175 | .align 4 | ||
| 176 | .long 98b, 99b | ||
| 177 | .popsection | ||
| 178 | .endm | ||
| 179 | |||
| 180 | .macro GS_TO_REG reg | ||
| 181 | movl %gs, \reg | ||
| 182 | /*CFI_REGISTER gs, \reg*/ | ||
| 183 | .endm | ||
| 184 | .macro REG_TO_PTGS reg | ||
| 185 | movl \reg, PT_GS(%esp) | ||
| 186 | /*CFI_REL_OFFSET gs, PT_GS*/ | ||
| 187 | .endm | ||
| 188 | .macro SET_KERNEL_GS reg | ||
| 189 | movl $(__KERNEL_STACK_CANARY), \reg | ||
| 190 | movl \reg, %gs | ||
| 191 | .endm | ||
| 192 | |||
| 193 | #endif /* CONFIG_X86_32_LAZY_GS */ | ||
| 194 | |||
| 195 | .macro SAVE_ALL | ||
| 196 | cld | ||
| 197 | PUSH_GS | ||
| 198 | pushl %fs | ||
| 199 | CFI_ADJUST_CFA_OFFSET 4 | ||
| 200 | /*CFI_REL_OFFSET fs, 0;*/ | ||
| 201 | pushl %es | ||
| 202 | CFI_ADJUST_CFA_OFFSET 4 | ||
| 203 | /*CFI_REL_OFFSET es, 0;*/ | ||
| 204 | pushl %ds | ||
| 205 | CFI_ADJUST_CFA_OFFSET 4 | ||
| 206 | /*CFI_REL_OFFSET ds, 0;*/ | ||
| 207 | pushl %eax | ||
| 208 | CFI_ADJUST_CFA_OFFSET 4 | ||
| 209 | CFI_REL_OFFSET eax, 0 | ||
| 210 | pushl %ebp | ||
| 211 | CFI_ADJUST_CFA_OFFSET 4 | ||
| 212 | CFI_REL_OFFSET ebp, 0 | ||
| 213 | pushl %edi | ||
| 214 | CFI_ADJUST_CFA_OFFSET 4 | ||
| 215 | CFI_REL_OFFSET edi, 0 | ||
| 216 | pushl %esi | ||
| 217 | CFI_ADJUST_CFA_OFFSET 4 | ||
| 218 | CFI_REL_OFFSET esi, 0 | ||
| 219 | pushl %edx | ||
| 220 | CFI_ADJUST_CFA_OFFSET 4 | ||
| 221 | CFI_REL_OFFSET edx, 0 | ||
| 222 | pushl %ecx | ||
| 223 | CFI_ADJUST_CFA_OFFSET 4 | ||
| 224 | CFI_REL_OFFSET ecx, 0 | ||
| 225 | pushl %ebx | ||
| 226 | CFI_ADJUST_CFA_OFFSET 4 | ||
| 227 | CFI_REL_OFFSET ebx, 0 | ||
| 228 | movl $(__USER_DS), %edx | ||
| 229 | movl %edx, %ds | ||
| 230 | movl %edx, %es | ||
| 231 | movl $(__KERNEL_PERCPU), %edx | ||
| 140 | movl %edx, %fs | 232 | movl %edx, %fs |
| 233 | SET_KERNEL_GS %edx | ||
| 234 | .endm | ||
| 141 | 235 | ||
| 142 | #define RESTORE_INT_REGS \ | 236 | .macro RESTORE_INT_REGS |
| 143 | popl %ebx; \ | 237 | popl %ebx |
| 144 | CFI_ADJUST_CFA_OFFSET -4;\ | 238 | CFI_ADJUST_CFA_OFFSET -4 |
| 145 | CFI_RESTORE ebx;\ | 239 | CFI_RESTORE ebx |
| 146 | popl %ecx; \ | 240 | popl %ecx |
| 147 | CFI_ADJUST_CFA_OFFSET -4;\ | 241 | CFI_ADJUST_CFA_OFFSET -4 |
| 148 | CFI_RESTORE ecx;\ | 242 | CFI_RESTORE ecx |
| 149 | popl %edx; \ | 243 | popl %edx |
| 150 | CFI_ADJUST_CFA_OFFSET -4;\ | 244 | CFI_ADJUST_CFA_OFFSET -4 |
| 151 | CFI_RESTORE edx;\ | 245 | CFI_RESTORE edx |
| 152 | popl %esi; \ | 246 | popl %esi |
| 153 | CFI_ADJUST_CFA_OFFSET -4;\ | 247 | CFI_ADJUST_CFA_OFFSET -4 |
| 154 | CFI_RESTORE esi;\ | 248 | CFI_RESTORE esi |
| 155 | popl %edi; \ | 249 | popl %edi |
| 156 | CFI_ADJUST_CFA_OFFSET -4;\ | 250 | CFI_ADJUST_CFA_OFFSET -4 |
| 157 | CFI_RESTORE edi;\ | 251 | CFI_RESTORE edi |
| 158 | popl %ebp; \ | 252 | popl %ebp |
| 159 | CFI_ADJUST_CFA_OFFSET -4;\ | 253 | CFI_ADJUST_CFA_OFFSET -4 |
| 160 | CFI_RESTORE ebp;\ | 254 | CFI_RESTORE ebp |
| 161 | popl %eax; \ | 255 | popl %eax |
| 162 | CFI_ADJUST_CFA_OFFSET -4;\ | 256 | CFI_ADJUST_CFA_OFFSET -4 |
| 163 | CFI_RESTORE eax | 257 | CFI_RESTORE eax |
| 258 | .endm | ||
| 164 | 259 | ||
| 165 | #define RESTORE_REGS \ | 260 | .macro RESTORE_REGS pop=0 |
| 166 | RESTORE_INT_REGS; \ | 261 | RESTORE_INT_REGS |
| 167 | 1: popl %ds; \ | 262 | 1: popl %ds |
| 168 | CFI_ADJUST_CFA_OFFSET -4;\ | 263 | CFI_ADJUST_CFA_OFFSET -4 |
| 169 | /*CFI_RESTORE ds;*/\ | 264 | /*CFI_RESTORE ds;*/ |
| 170 | 2: popl %es; \ | 265 | 2: popl %es |
| 171 | CFI_ADJUST_CFA_OFFSET -4;\ | 266 | CFI_ADJUST_CFA_OFFSET -4 |
| 172 | /*CFI_RESTORE es;*/\ | 267 | /*CFI_RESTORE es;*/ |
| 173 | 3: popl %fs; \ | 268 | 3: popl %fs |
| 174 | CFI_ADJUST_CFA_OFFSET -4;\ | 269 | CFI_ADJUST_CFA_OFFSET -4 |
| 175 | /*CFI_RESTORE fs;*/\ | 270 | /*CFI_RESTORE fs;*/ |
| 176 | .pushsection .fixup,"ax"; \ | 271 | POP_GS \pop |
| 177 | 4: movl $0,(%esp); \ | 272 | .pushsection .fixup, "ax" |
| 178 | jmp 1b; \ | 273 | 4: movl $0, (%esp) |
| 179 | 5: movl $0,(%esp); \ | 274 | jmp 1b |
| 180 | jmp 2b; \ | 275 | 5: movl $0, (%esp) |
| 181 | 6: movl $0,(%esp); \ | 276 | jmp 2b |
| 182 | jmp 3b; \ | 277 | 6: movl $0, (%esp) |
| 183 | .section __ex_table,"a";\ | 278 | jmp 3b |
| 184 | .align 4; \ | 279 | .section __ex_table, "a" |
| 185 | .long 1b,4b; \ | 280 | .align 4 |
| 186 | .long 2b,5b; \ | 281 | .long 1b, 4b |
| 187 | .long 3b,6b; \ | 282 | .long 2b, 5b |
| 283 | .long 3b, 6b | ||
| 188 | .popsection | 284 | .popsection |
| 285 | POP_GS_EX | ||
| 286 | .endm | ||
| 189 | 287 | ||
| 190 | #define RING0_INT_FRAME \ | 288 | .macro RING0_INT_FRAME |
| 191 | CFI_STARTPROC simple;\ | 289 | CFI_STARTPROC simple |
| 192 | CFI_SIGNAL_FRAME;\ | 290 | CFI_SIGNAL_FRAME |
| 193 | CFI_DEF_CFA esp, 3*4;\ | 291 | CFI_DEF_CFA esp, 3*4 |
| 194 | /*CFI_OFFSET cs, -2*4;*/\ | 292 | /*CFI_OFFSET cs, -2*4;*/ |
| 195 | CFI_OFFSET eip, -3*4 | 293 | CFI_OFFSET eip, -3*4 |
| 294 | .endm | ||
| 196 | 295 | ||
| 197 | #define RING0_EC_FRAME \ | 296 | .macro RING0_EC_FRAME |
| 198 | CFI_STARTPROC simple;\ | 297 | CFI_STARTPROC simple |
| 199 | CFI_SIGNAL_FRAME;\ | 298 | CFI_SIGNAL_FRAME |
| 200 | CFI_DEF_CFA esp, 4*4;\ | 299 | CFI_DEF_CFA esp, 4*4 |
| 201 | /*CFI_OFFSET cs, -2*4;*/\ | 300 | /*CFI_OFFSET cs, -2*4;*/ |
| 202 | CFI_OFFSET eip, -3*4 | 301 | CFI_OFFSET eip, -3*4 |
| 302 | .endm | ||
| 203 | 303 | ||
| 204 | #define RING0_PTREGS_FRAME \ | 304 | .macro RING0_PTREGS_FRAME |
| 205 | CFI_STARTPROC simple;\ | 305 | CFI_STARTPROC simple |
| 206 | CFI_SIGNAL_FRAME;\ | 306 | CFI_SIGNAL_FRAME |
| 207 | CFI_DEF_CFA esp, PT_OLDESP-PT_EBX;\ | 307 | CFI_DEF_CFA esp, PT_OLDESP-PT_EBX |
| 208 | /*CFI_OFFSET cs, PT_CS-PT_OLDESP;*/\ | 308 | /*CFI_OFFSET cs, PT_CS-PT_OLDESP;*/ |
| 209 | CFI_OFFSET eip, PT_EIP-PT_OLDESP;\ | 309 | CFI_OFFSET eip, PT_EIP-PT_OLDESP |
| 210 | /*CFI_OFFSET es, PT_ES-PT_OLDESP;*/\ | 310 | /*CFI_OFFSET es, PT_ES-PT_OLDESP;*/ |
| 211 | /*CFI_OFFSET ds, PT_DS-PT_OLDESP;*/\ | 311 | /*CFI_OFFSET ds, PT_DS-PT_OLDESP;*/ |
| 212 | CFI_OFFSET eax, PT_EAX-PT_OLDESP;\ | 312 | CFI_OFFSET eax, PT_EAX-PT_OLDESP |
| 213 | CFI_OFFSET ebp, PT_EBP-PT_OLDESP;\ | 313 | CFI_OFFSET ebp, PT_EBP-PT_OLDESP |
| 214 | CFI_OFFSET edi, PT_EDI-PT_OLDESP;\ | 314 | CFI_OFFSET edi, PT_EDI-PT_OLDESP |
| 215 | CFI_OFFSET esi, PT_ESI-PT_OLDESP;\ | 315 | CFI_OFFSET esi, PT_ESI-PT_OLDESP |
| 216 | CFI_OFFSET edx, PT_EDX-PT_OLDESP;\ | 316 | CFI_OFFSET edx, PT_EDX-PT_OLDESP |
| 217 | CFI_OFFSET ecx, PT_ECX-PT_OLDESP;\ | 317 | CFI_OFFSET ecx, PT_ECX-PT_OLDESP |
| 218 | CFI_OFFSET ebx, PT_EBX-PT_OLDESP | 318 | CFI_OFFSET ebx, PT_EBX-PT_OLDESP |
| 319 | .endm | ||
| 219 | 320 | ||
| 220 | ENTRY(ret_from_fork) | 321 | ENTRY(ret_from_fork) |
| 221 | CFI_STARTPROC | 322 | CFI_STARTPROC |
| @@ -362,6 +463,7 @@ sysenter_exit: | |||
| 362 | xorl %ebp,%ebp | 463 | xorl %ebp,%ebp |
| 363 | TRACE_IRQS_ON | 464 | TRACE_IRQS_ON |
| 364 | 1: mov PT_FS(%esp), %fs | 465 | 1: mov PT_FS(%esp), %fs |
| 466 | PTGS_TO_GS | ||
| 365 | ENABLE_INTERRUPTS_SYSEXIT | 467 | ENABLE_INTERRUPTS_SYSEXIT |
| 366 | 468 | ||
| 367 | #ifdef CONFIG_AUDITSYSCALL | 469 | #ifdef CONFIG_AUDITSYSCALL |
| @@ -410,6 +512,7 @@ sysexit_audit: | |||
| 410 | .align 4 | 512 | .align 4 |
| 411 | .long 1b,2b | 513 | .long 1b,2b |
| 412 | .popsection | 514 | .popsection |
| 515 | PTGS_TO_GS_EX | ||
| 413 | ENDPROC(ia32_sysenter_target) | 516 | ENDPROC(ia32_sysenter_target) |
| 414 | 517 | ||
| 415 | # system call handler stub | 518 | # system call handler stub |
| @@ -452,8 +555,7 @@ restore_all: | |||
| 452 | restore_nocheck: | 555 | restore_nocheck: |
| 453 | TRACE_IRQS_IRET | 556 | TRACE_IRQS_IRET |
| 454 | restore_nocheck_notrace: | 557 | restore_nocheck_notrace: |
| 455 | RESTORE_REGS | 558 | RESTORE_REGS 4 # skip orig_eax/error_code |
| 456 | addl $4, %esp # skip orig_eax/error_code | ||
| 457 | CFI_ADJUST_CFA_OFFSET -4 | 559 | CFI_ADJUST_CFA_OFFSET -4 |
| 458 | irq_return: | 560 | irq_return: |
| 459 | INTERRUPT_RETURN | 561 | INTERRUPT_RETURN |
| @@ -595,28 +697,50 @@ syscall_badsys: | |||
| 595 | END(syscall_badsys) | 697 | END(syscall_badsys) |
| 596 | CFI_ENDPROC | 698 | CFI_ENDPROC |
| 597 | 699 | ||
| 598 | #define FIXUP_ESPFIX_STACK \ | 700 | /* |
| 599 | /* since we are on a wrong stack, we cant make it a C code :( */ \ | 701 | * System calls that need a pt_regs pointer. |
| 600 | PER_CPU(gdt_page, %ebx); \ | 702 | */ |
| 601 | GET_DESC_BASE(GDT_ENTRY_ESPFIX_SS, %ebx, %eax, %ax, %al, %ah); \ | 703 | #define PTREGSCALL(name) \ |
| 602 | addl %esp, %eax; \ | 704 | ALIGN; \ |
| 603 | pushl $__KERNEL_DS; \ | 705 | ptregs_##name: \ |
| 604 | CFI_ADJUST_CFA_OFFSET 4; \ | 706 | leal 4(%esp),%eax; \ |
| 605 | pushl %eax; \ | 707 | jmp sys_##name; |
| 606 | CFI_ADJUST_CFA_OFFSET 4; \ | 708 | |
| 607 | lss (%esp), %esp; \ | 709 | PTREGSCALL(iopl) |
| 608 | CFI_ADJUST_CFA_OFFSET -8; | 710 | PTREGSCALL(fork) |
| 609 | #define UNWIND_ESPFIX_STACK \ | 711 | PTREGSCALL(clone) |
| 610 | movl %ss, %eax; \ | 712 | PTREGSCALL(vfork) |
| 611 | /* see if on espfix stack */ \ | 713 | PTREGSCALL(execve) |
| 612 | cmpw $__ESPFIX_SS, %ax; \ | 714 | PTREGSCALL(sigaltstack) |
| 613 | jne 27f; \ | 715 | PTREGSCALL(sigreturn) |
| 614 | movl $__KERNEL_DS, %eax; \ | 716 | PTREGSCALL(rt_sigreturn) |
| 615 | movl %eax, %ds; \ | 717 | PTREGSCALL(vm86) |
| 616 | movl %eax, %es; \ | 718 | PTREGSCALL(vm86old) |
| 617 | /* switch to normal stack */ \ | 719 | |
| 618 | FIXUP_ESPFIX_STACK; \ | 720 | .macro FIXUP_ESPFIX_STACK |
| 619 | 27:; | 721 | /* since we are on a wrong stack, we cant make it a C code :( */ |
| 722 | PER_CPU(gdt_page, %ebx) | ||
| 723 | GET_DESC_BASE(GDT_ENTRY_ESPFIX_SS, %ebx, %eax, %ax, %al, %ah) | ||
| 724 | addl %esp, %eax | ||
| 725 | pushl $__KERNEL_DS | ||
| 726 | CFI_ADJUST_CFA_OFFSET 4 | ||
| 727 | pushl %eax | ||
| 728 | CFI_ADJUST_CFA_OFFSET 4 | ||
| 729 | lss (%esp), %esp | ||
| 730 | CFI_ADJUST_CFA_OFFSET -8 | ||
| 731 | .endm | ||
| 732 | .macro UNWIND_ESPFIX_STACK | ||
| 733 | movl %ss, %eax | ||
| 734 | /* see if on espfix stack */ | ||
| 735 | cmpw $__ESPFIX_SS, %ax | ||
| 736 | jne 27f | ||
| 737 | movl $__KERNEL_DS, %eax | ||
| 738 | movl %eax, %ds | ||
| 739 | movl %eax, %es | ||
| 740 | /* switch to normal stack */ | ||
| 741 | FIXUP_ESPFIX_STACK | ||
| 742 | 27: | ||
| 743 | .endm | ||
| 620 | 744 | ||
| 621 | /* | 745 | /* |
| 622 | * Build the entry stubs and pointer table with some assembler magic. | 746 | * Build the entry stubs and pointer table with some assembler magic. |
| @@ -672,7 +796,7 @@ common_interrupt: | |||
| 672 | ENDPROC(common_interrupt) | 796 | ENDPROC(common_interrupt) |
| 673 | CFI_ENDPROC | 797 | CFI_ENDPROC |
| 674 | 798 | ||
| 675 | #define BUILD_INTERRUPT(name, nr) \ | 799 | #define BUILD_INTERRUPT3(name, nr, fn) \ |
| 676 | ENTRY(name) \ | 800 | ENTRY(name) \ |
| 677 | RING0_INT_FRAME; \ | 801 | RING0_INT_FRAME; \ |
| 678 | pushl $~(nr); \ | 802 | pushl $~(nr); \ |
| @@ -680,13 +804,15 @@ ENTRY(name) \ | |||
| 680 | SAVE_ALL; \ | 804 | SAVE_ALL; \ |
| 681 | TRACE_IRQS_OFF \ | 805 | TRACE_IRQS_OFF \ |
| 682 | movl %esp,%eax; \ | 806 | movl %esp,%eax; \ |
| 683 | call smp_##name; \ | 807 | call fn; \ |
| 684 | jmp ret_from_intr; \ | 808 | jmp ret_from_intr; \ |
| 685 | CFI_ENDPROC; \ | 809 | CFI_ENDPROC; \ |
| 686 | ENDPROC(name) | 810 | ENDPROC(name) |
| 687 | 811 | ||
| 812 | #define BUILD_INTERRUPT(name, nr) BUILD_INTERRUPT3(name, nr, smp_##name) | ||
| 813 | |||
| 688 | /* The include is where all of the SMP etc. interrupts come from */ | 814 | /* The include is where all of the SMP etc. interrupts come from */ |
| 689 | #include "entry_arch.h" | 815 | #include <asm/entry_arch.h> |
| 690 | 816 | ||
| 691 | ENTRY(coprocessor_error) | 817 | ENTRY(coprocessor_error) |
| 692 | RING0_INT_FRAME | 818 | RING0_INT_FRAME |
| @@ -1068,7 +1194,10 @@ ENTRY(page_fault) | |||
| 1068 | CFI_ADJUST_CFA_OFFSET 4 | 1194 | CFI_ADJUST_CFA_OFFSET 4 |
| 1069 | ALIGN | 1195 | ALIGN |
| 1070 | error_code: | 1196 | error_code: |
| 1071 | /* the function address is in %fs's slot on the stack */ | 1197 | /* the function address is in %gs's slot on the stack */ |
| 1198 | pushl %fs | ||
| 1199 | CFI_ADJUST_CFA_OFFSET 4 | ||
| 1200 | /*CFI_REL_OFFSET fs, 0*/ | ||
| 1072 | pushl %es | 1201 | pushl %es |
| 1073 | CFI_ADJUST_CFA_OFFSET 4 | 1202 | CFI_ADJUST_CFA_OFFSET 4 |
| 1074 | /*CFI_REL_OFFSET es, 0*/ | 1203 | /*CFI_REL_OFFSET es, 0*/ |
| @@ -1097,20 +1226,15 @@ error_code: | |||
| 1097 | CFI_ADJUST_CFA_OFFSET 4 | 1226 | CFI_ADJUST_CFA_OFFSET 4 |
| 1098 | CFI_REL_OFFSET ebx, 0 | 1227 | CFI_REL_OFFSET ebx, 0 |
| 1099 | cld | 1228 | cld |
| 1100 | pushl %fs | ||
| 1101 | CFI_ADJUST_CFA_OFFSET 4 | ||
| 1102 | /*CFI_REL_OFFSET fs, 0*/ | ||
| 1103 | movl $(__KERNEL_PERCPU), %ecx | 1229 | movl $(__KERNEL_PERCPU), %ecx |
| 1104 | movl %ecx, %fs | 1230 | movl %ecx, %fs |
| 1105 | UNWIND_ESPFIX_STACK | 1231 | UNWIND_ESPFIX_STACK |
| 1106 | popl %ecx | 1232 | GS_TO_REG %ecx |
| 1107 | CFI_ADJUST_CFA_OFFSET -4 | 1233 | movl PT_GS(%esp), %edi # get the function address |
| 1108 | /*CFI_REGISTER es, ecx*/ | ||
| 1109 | movl PT_FS(%esp), %edi # get the function address | ||
| 1110 | movl PT_ORIG_EAX(%esp), %edx # get the error code | 1234 | movl PT_ORIG_EAX(%esp), %edx # get the error code |
| 1111 | movl $-1, PT_ORIG_EAX(%esp) # no syscall to restart | 1235 | movl $-1, PT_ORIG_EAX(%esp) # no syscall to restart |
| 1112 | mov %ecx, PT_FS(%esp) | 1236 | REG_TO_PTGS %ecx |
| 1113 | /*CFI_REL_OFFSET fs, ES*/ | 1237 | SET_KERNEL_GS %ecx |
| 1114 | movl $(__USER_DS), %ecx | 1238 | movl $(__USER_DS), %ecx |
| 1115 | movl %ecx, %ds | 1239 | movl %ecx, %ds |
| 1116 | movl %ecx, %es | 1240 | movl %ecx, %es |
| @@ -1134,26 +1258,27 @@ END(page_fault) | |||
| 1134 | * by hand onto the new stack - while updating the return eip past | 1258 | * by hand onto the new stack - while updating the return eip past |
| 1135 | * the instruction that would have done it for sysenter. | 1259 | * the instruction that would have done it for sysenter. |
| 1136 | */ | 1260 | */ |
| 1137 | #define FIX_STACK(offset, ok, label) \ | 1261 | .macro FIX_STACK offset ok label |
| 1138 | cmpw $__KERNEL_CS,4(%esp); \ | 1262 | cmpw $__KERNEL_CS, 4(%esp) |
| 1139 | jne ok; \ | 1263 | jne \ok |
| 1140 | label: \ | 1264 | \label: |
| 1141 | movl TSS_sysenter_sp0+offset(%esp),%esp; \ | 1265 | movl TSS_sysenter_sp0 + \offset(%esp), %esp |
| 1142 | CFI_DEF_CFA esp, 0; \ | 1266 | CFI_DEF_CFA esp, 0 |
| 1143 | CFI_UNDEFINED eip; \ | 1267 | CFI_UNDEFINED eip |
| 1144 | pushfl; \ | 1268 | pushfl |
| 1145 | CFI_ADJUST_CFA_OFFSET 4; \ | 1269 | CFI_ADJUST_CFA_OFFSET 4 |
| 1146 | pushl $__KERNEL_CS; \ | 1270 | pushl $__KERNEL_CS |
| 1147 | CFI_ADJUST_CFA_OFFSET 4; \ | 1271 | CFI_ADJUST_CFA_OFFSET 4 |
| 1148 | pushl $sysenter_past_esp; \ | 1272 | pushl $sysenter_past_esp |
| 1149 | CFI_ADJUST_CFA_OFFSET 4; \ | 1273 | CFI_ADJUST_CFA_OFFSET 4 |
| 1150 | CFI_REL_OFFSET eip, 0 | 1274 | CFI_REL_OFFSET eip, 0 |
| 1275 | .endm | ||
| 1151 | 1276 | ||
| 1152 | ENTRY(debug) | 1277 | ENTRY(debug) |
| 1153 | RING0_INT_FRAME | 1278 | RING0_INT_FRAME |
| 1154 | cmpl $ia32_sysenter_target,(%esp) | 1279 | cmpl $ia32_sysenter_target,(%esp) |
| 1155 | jne debug_stack_correct | 1280 | jne debug_stack_correct |
| 1156 | FIX_STACK(12, debug_stack_correct, debug_esp_fix_insn) | 1281 | FIX_STACK 12, debug_stack_correct, debug_esp_fix_insn |
| 1157 | debug_stack_correct: | 1282 | debug_stack_correct: |
| 1158 | pushl $-1 # mark this as an int | 1283 | pushl $-1 # mark this as an int |
| 1159 | CFI_ADJUST_CFA_OFFSET 4 | 1284 | CFI_ADJUST_CFA_OFFSET 4 |
| @@ -1211,7 +1336,7 @@ nmi_stack_correct: | |||
| 1211 | 1336 | ||
| 1212 | nmi_stack_fixup: | 1337 | nmi_stack_fixup: |
| 1213 | RING0_INT_FRAME | 1338 | RING0_INT_FRAME |
| 1214 | FIX_STACK(12,nmi_stack_correct, 1) | 1339 | FIX_STACK 12, nmi_stack_correct, 1 |
| 1215 | jmp nmi_stack_correct | 1340 | jmp nmi_stack_correct |
| 1216 | 1341 | ||
| 1217 | nmi_debug_stack_check: | 1342 | nmi_debug_stack_check: |
| @@ -1222,7 +1347,7 @@ nmi_debug_stack_check: | |||
| 1222 | jb nmi_stack_correct | 1347 | jb nmi_stack_correct |
| 1223 | cmpl $debug_esp_fix_insn,(%esp) | 1348 | cmpl $debug_esp_fix_insn,(%esp) |
| 1224 | ja nmi_stack_correct | 1349 | ja nmi_stack_correct |
| 1225 | FIX_STACK(24,nmi_stack_correct, 1) | 1350 | FIX_STACK 24, nmi_stack_correct, 1 |
| 1226 | jmp nmi_stack_correct | 1351 | jmp nmi_stack_correct |
| 1227 | 1352 | ||
| 1228 | nmi_espfix_stack: | 1353 | nmi_espfix_stack: |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index a1346217e43c..dcf31283f949 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
| @@ -48,10 +48,11 @@ | |||
| 48 | #include <asm/unistd.h> | 48 | #include <asm/unistd.h> |
| 49 | #include <asm/thread_info.h> | 49 | #include <asm/thread_info.h> |
| 50 | #include <asm/hw_irq.h> | 50 | #include <asm/hw_irq.h> |
| 51 | #include <asm/page.h> | 51 | #include <asm/page_types.h> |
| 52 | #include <asm/irqflags.h> | 52 | #include <asm/irqflags.h> |
| 53 | #include <asm/paravirt.h> | 53 | #include <asm/paravirt.h> |
| 54 | #include <asm/ftrace.h> | 54 | #include <asm/ftrace.h> |
| 55 | #include <asm/percpu.h> | ||
| 55 | 56 | ||
| 56 | /* Avoid __ASSEMBLER__'ifying <linux/audit.h> just for this. */ | 57 | /* Avoid __ASSEMBLER__'ifying <linux/audit.h> just for this. */ |
| 57 | #include <linux/elf-em.h> | 58 | #include <linux/elf-em.h> |
| @@ -209,7 +210,7 @@ ENTRY(native_usergs_sysret64) | |||
| 209 | 210 | ||
| 210 | /* %rsp:at FRAMEEND */ | 211 | /* %rsp:at FRAMEEND */ |
| 211 | .macro FIXUP_TOP_OF_STACK tmp offset=0 | 212 | .macro FIXUP_TOP_OF_STACK tmp offset=0 |
| 212 | movq %gs:pda_oldrsp,\tmp | 213 | movq PER_CPU_VAR(old_rsp),\tmp |
| 213 | movq \tmp,RSP+\offset(%rsp) | 214 | movq \tmp,RSP+\offset(%rsp) |
| 214 | movq $__USER_DS,SS+\offset(%rsp) | 215 | movq $__USER_DS,SS+\offset(%rsp) |
| 215 | movq $__USER_CS,CS+\offset(%rsp) | 216 | movq $__USER_CS,CS+\offset(%rsp) |
| @@ -220,7 +221,7 @@ ENTRY(native_usergs_sysret64) | |||
| 220 | 221 | ||
| 221 | .macro RESTORE_TOP_OF_STACK tmp offset=0 | 222 | .macro RESTORE_TOP_OF_STACK tmp offset=0 |
| 222 | movq RSP+\offset(%rsp),\tmp | 223 | movq RSP+\offset(%rsp),\tmp |
| 223 | movq \tmp,%gs:pda_oldrsp | 224 | movq \tmp,PER_CPU_VAR(old_rsp) |
| 224 | movq EFLAGS+\offset(%rsp),\tmp | 225 | movq EFLAGS+\offset(%rsp),\tmp |
| 225 | movq \tmp,R11+\offset(%rsp) | 226 | movq \tmp,R11+\offset(%rsp) |
| 226 | .endm | 227 | .endm |
| @@ -336,15 +337,15 @@ ENTRY(save_args) | |||
| 336 | je 1f | 337 | je 1f |
| 337 | SWAPGS | 338 | SWAPGS |
| 338 | /* | 339 | /* |
| 339 | * irqcount is used to check if a CPU is already on an interrupt stack | 340 | * irq_count is used to check if a CPU is already on an interrupt stack |
| 340 | * or not. While this is essentially redundant with preempt_count it is | 341 | * or not. While this is essentially redundant with preempt_count it is |
| 341 | * a little cheaper to use a separate counter in the PDA (short of | 342 | * a little cheaper to use a separate counter in the PDA (short of |
| 342 | * moving irq_enter into assembly, which would be too much work) | 343 | * moving irq_enter into assembly, which would be too much work) |
| 343 | */ | 344 | */ |
| 344 | 1: incl %gs:pda_irqcount | 345 | 1: incl PER_CPU_VAR(irq_count) |
| 345 | jne 2f | 346 | jne 2f |
| 346 | popq_cfi %rax /* move return address... */ | 347 | popq_cfi %rax /* move return address... */ |
| 347 | mov %gs:pda_irqstackptr,%rsp | 348 | mov PER_CPU_VAR(irq_stack_ptr),%rsp |
| 348 | EMPTY_FRAME 0 | 349 | EMPTY_FRAME 0 |
| 349 | pushq_cfi %rbp /* backlink for unwinder */ | 350 | pushq_cfi %rbp /* backlink for unwinder */ |
| 350 | pushq_cfi %rax /* ... to the new stack */ | 351 | pushq_cfi %rax /* ... to the new stack */ |
| @@ -409,6 +410,8 @@ END(save_paranoid) | |||
| 409 | ENTRY(ret_from_fork) | 410 | ENTRY(ret_from_fork) |
| 410 | DEFAULT_FRAME | 411 | DEFAULT_FRAME |
| 411 | 412 | ||
| 413 | LOCK ; btr $TIF_FORK,TI_flags(%r8) | ||
| 414 | |||
| 412 | push kernel_eflags(%rip) | 415 | push kernel_eflags(%rip) |
| 413 | CFI_ADJUST_CFA_OFFSET 8 | 416 | CFI_ADJUST_CFA_OFFSET 8 |
| 414 | popf # reset kernel eflags | 417 | popf # reset kernel eflags |
| @@ -468,7 +471,7 @@ END(ret_from_fork) | |||
| 468 | ENTRY(system_call) | 471 | ENTRY(system_call) |
| 469 | CFI_STARTPROC simple | 472 | CFI_STARTPROC simple |
| 470 | CFI_SIGNAL_FRAME | 473 | CFI_SIGNAL_FRAME |
| 471 | CFI_DEF_CFA rsp,PDA_STACKOFFSET | 474 | CFI_DEF_CFA rsp,KERNEL_STACK_OFFSET |
| 472 | CFI_REGISTER rip,rcx | 475 | CFI_REGISTER rip,rcx |
| 473 | /*CFI_REGISTER rflags,r11*/ | 476 | /*CFI_REGISTER rflags,r11*/ |
| 474 | SWAPGS_UNSAFE_STACK | 477 | SWAPGS_UNSAFE_STACK |
| @@ -479,8 +482,8 @@ ENTRY(system_call) | |||
| 479 | */ | 482 | */ |
| 480 | ENTRY(system_call_after_swapgs) | 483 | ENTRY(system_call_after_swapgs) |
| 481 | 484 | ||
| 482 | movq %rsp,%gs:pda_oldrsp | 485 | movq %rsp,PER_CPU_VAR(old_rsp) |
| 483 | movq %gs:pda_kernelstack,%rsp | 486 | movq PER_CPU_VAR(kernel_stack),%rsp |
| 484 | /* | 487 | /* |
| 485 | * No need to follow this irqs off/on section - it's straight | 488 | * No need to follow this irqs off/on section - it's straight |
| 486 | * and short: | 489 | * and short: |
| @@ -523,7 +526,7 @@ sysret_check: | |||
| 523 | CFI_REGISTER rip,rcx | 526 | CFI_REGISTER rip,rcx |
| 524 | RESTORE_ARGS 0,-ARG_SKIP,1 | 527 | RESTORE_ARGS 0,-ARG_SKIP,1 |
| 525 | /*CFI_REGISTER rflags,r11*/ | 528 | /*CFI_REGISTER rflags,r11*/ |
| 526 | movq %gs:pda_oldrsp, %rsp | 529 | movq PER_CPU_VAR(old_rsp), %rsp |
| 527 | USERGS_SYSRET64 | 530 | USERGS_SYSRET64 |
| 528 | 531 | ||
| 529 | CFI_RESTORE_STATE | 532 | CFI_RESTORE_STATE |
| @@ -833,11 +836,11 @@ common_interrupt: | |||
| 833 | XCPT_FRAME | 836 | XCPT_FRAME |
| 834 | addq $-0x80,(%rsp) /* Adjust vector to [-256,-1] range */ | 837 | addq $-0x80,(%rsp) /* Adjust vector to [-256,-1] range */ |
| 835 | interrupt do_IRQ | 838 | interrupt do_IRQ |
| 836 | /* 0(%rsp): oldrsp-ARGOFFSET */ | 839 | /* 0(%rsp): old_rsp-ARGOFFSET */ |
| 837 | ret_from_intr: | 840 | ret_from_intr: |
| 838 | DISABLE_INTERRUPTS(CLBR_NONE) | 841 | DISABLE_INTERRUPTS(CLBR_NONE) |
| 839 | TRACE_IRQS_OFF | 842 | TRACE_IRQS_OFF |
| 840 | decl %gs:pda_irqcount | 843 | decl PER_CPU_VAR(irq_count) |
| 841 | leaveq | 844 | leaveq |
| 842 | CFI_DEF_CFA_REGISTER rsp | 845 | CFI_DEF_CFA_REGISTER rsp |
| 843 | CFI_ADJUST_CFA_OFFSET -8 | 846 | CFI_ADJUST_CFA_OFFSET -8 |
| @@ -982,8 +985,10 @@ apicinterrupt IRQ_MOVE_CLEANUP_VECTOR \ | |||
| 982 | irq_move_cleanup_interrupt smp_irq_move_cleanup_interrupt | 985 | irq_move_cleanup_interrupt smp_irq_move_cleanup_interrupt |
| 983 | #endif | 986 | #endif |
| 984 | 987 | ||
| 988 | #ifdef CONFIG_X86_UV | ||
| 985 | apicinterrupt UV_BAU_MESSAGE \ | 989 | apicinterrupt UV_BAU_MESSAGE \ |
| 986 | uv_bau_message_intr1 uv_bau_message_interrupt | 990 | uv_bau_message_intr1 uv_bau_message_interrupt |
| 991 | #endif | ||
| 987 | apicinterrupt LOCAL_TIMER_VECTOR \ | 992 | apicinterrupt LOCAL_TIMER_VECTOR \ |
| 988 | apic_timer_interrupt smp_apic_timer_interrupt | 993 | apic_timer_interrupt smp_apic_timer_interrupt |
| 989 | 994 | ||
| @@ -1073,10 +1078,10 @@ ENTRY(\sym) | |||
| 1073 | TRACE_IRQS_OFF | 1078 | TRACE_IRQS_OFF |
| 1074 | movq %rsp,%rdi /* pt_regs pointer */ | 1079 | movq %rsp,%rdi /* pt_regs pointer */ |
| 1075 | xorl %esi,%esi /* no error code */ | 1080 | xorl %esi,%esi /* no error code */ |
| 1076 | movq %gs:pda_data_offset, %rbp | 1081 | PER_CPU(init_tss, %rbp) |
| 1077 | subq $EXCEPTION_STKSZ, per_cpu__init_tss + TSS_ist + (\ist - 1) * 8(%rbp) | 1082 | subq $EXCEPTION_STKSZ, TSS_ist + (\ist - 1) * 8(%rbp) |
| 1078 | call \do_sym | 1083 | call \do_sym |
| 1079 | addq $EXCEPTION_STKSZ, per_cpu__init_tss + TSS_ist + (\ist - 1) * 8(%rbp) | 1084 | addq $EXCEPTION_STKSZ, TSS_ist + (\ist - 1) * 8(%rbp) |
| 1080 | jmp paranoid_exit /* %ebx: no swapgs flag */ | 1085 | jmp paranoid_exit /* %ebx: no swapgs flag */ |
| 1081 | CFI_ENDPROC | 1086 | CFI_ENDPROC |
| 1082 | END(\sym) | 1087 | END(\sym) |
| @@ -1138,7 +1143,7 @@ ENTRY(native_load_gs_index) | |||
| 1138 | CFI_STARTPROC | 1143 | CFI_STARTPROC |
| 1139 | pushf | 1144 | pushf |
| 1140 | CFI_ADJUST_CFA_OFFSET 8 | 1145 | CFI_ADJUST_CFA_OFFSET 8 |
| 1141 | DISABLE_INTERRUPTS(CLBR_ANY | ~(CLBR_RDI)) | 1146 | DISABLE_INTERRUPTS(CLBR_ANY & ~CLBR_RDI) |
| 1142 | SWAPGS | 1147 | SWAPGS |
| 1143 | gs_change: | 1148 | gs_change: |
| 1144 | movl %edi,%gs | 1149 | movl %edi,%gs |
| @@ -1260,14 +1265,14 @@ ENTRY(call_softirq) | |||
| 1260 | CFI_REL_OFFSET rbp,0 | 1265 | CFI_REL_OFFSET rbp,0 |
| 1261 | mov %rsp,%rbp | 1266 | mov %rsp,%rbp |
| 1262 | CFI_DEF_CFA_REGISTER rbp | 1267 | CFI_DEF_CFA_REGISTER rbp |
| 1263 | incl %gs:pda_irqcount | 1268 | incl PER_CPU_VAR(irq_count) |
| 1264 | cmove %gs:pda_irqstackptr,%rsp | 1269 | cmove PER_CPU_VAR(irq_stack_ptr),%rsp |
| 1265 | push %rbp # backlink for old unwinder | 1270 | push %rbp # backlink for old unwinder |
| 1266 | call __do_softirq | 1271 | call __do_softirq |
| 1267 | leaveq | 1272 | leaveq |
| 1268 | CFI_DEF_CFA_REGISTER rsp | 1273 | CFI_DEF_CFA_REGISTER rsp |
| 1269 | CFI_ADJUST_CFA_OFFSET -8 | 1274 | CFI_ADJUST_CFA_OFFSET -8 |
| 1270 | decl %gs:pda_irqcount | 1275 | decl PER_CPU_VAR(irq_count) |
| 1271 | ret | 1276 | ret |
| 1272 | CFI_ENDPROC | 1277 | CFI_ENDPROC |
| 1273 | END(call_softirq) | 1278 | END(call_softirq) |
| @@ -1297,15 +1302,15 @@ ENTRY(xen_do_hypervisor_callback) # do_hypervisor_callback(struct *pt_regs) | |||
| 1297 | movq %rdi, %rsp # we don't return, adjust the stack frame | 1302 | movq %rdi, %rsp # we don't return, adjust the stack frame |
| 1298 | CFI_ENDPROC | 1303 | CFI_ENDPROC |
| 1299 | DEFAULT_FRAME | 1304 | DEFAULT_FRAME |
| 1300 | 11: incl %gs:pda_irqcount | 1305 | 11: incl PER_CPU_VAR(irq_count) |
| 1301 | movq %rsp,%rbp | 1306 | movq %rsp,%rbp |
| 1302 | CFI_DEF_CFA_REGISTER rbp | 1307 | CFI_DEF_CFA_REGISTER rbp |
| 1303 | cmovzq %gs:pda_irqstackptr,%rsp | 1308 | cmovzq PER_CPU_VAR(irq_stack_ptr),%rsp |
| 1304 | pushq %rbp # backlink for old unwinder | 1309 | pushq %rbp # backlink for old unwinder |
| 1305 | call xen_evtchn_do_upcall | 1310 | call xen_evtchn_do_upcall |
| 1306 | popq %rsp | 1311 | popq %rsp |
| 1307 | CFI_DEF_CFA_REGISTER rsp | 1312 | CFI_DEF_CFA_REGISTER rsp |
| 1308 | decl %gs:pda_irqcount | 1313 | decl PER_CPU_VAR(irq_count) |
| 1309 | jmp error_exit | 1314 | jmp error_exit |
| 1310 | CFI_ENDPROC | 1315 | CFI_ENDPROC |
| 1311 | END(do_hypervisor_callback) | 1316 | END(do_hypervisor_callback) |
diff --git a/arch/x86/kernel/es7000_32.c b/arch/x86/kernel/es7000_32.c deleted file mode 100644 index 53699c931ad4..000000000000 --- a/arch/x86/kernel/es7000_32.c +++ /dev/null | |||
| @@ -1,378 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Written by: Garry Forsgren, Unisys Corporation | ||
| 3 | * Natalie Protasevich, Unisys Corporation | ||
| 4 | * This file contains the code to configure and interface | ||
| 5 | * with Unisys ES7000 series hardware system manager. | ||
| 6 | * | ||
| 7 | * Copyright (c) 2003 Unisys Corporation. All Rights Reserved. | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify it | ||
| 10 | * under the terms of version 2 of the GNU General Public License as | ||
| 11 | * published by the Free Software Foundation. | ||
| 12 | * | ||
| 13 | * This program is distributed in the hope that it would be useful, but | ||
| 14 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License along | ||
| 18 | * with this program; if not, write the Free Software Foundation, Inc., 59 | ||
| 19 | * Temple Place - Suite 330, Boston MA 02111-1307, USA. | ||
| 20 | * | ||
| 21 | * Contact information: Unisys Corporation, Township Line & Union Meeting | ||
| 22 | * Roads-A, Unisys Way, Blue Bell, Pennsylvania, 19424, or: | ||
| 23 | * | ||
| 24 | * http://www.unisys.com | ||
| 25 | */ | ||
| 26 | |||
| 27 | #include <linux/module.h> | ||
| 28 | #include <linux/types.h> | ||
| 29 | #include <linux/kernel.h> | ||
| 30 | #include <linux/smp.h> | ||
| 31 | #include <linux/string.h> | ||
| 32 | #include <linux/spinlock.h> | ||
| 33 | #include <linux/errno.h> | ||
| 34 | #include <linux/notifier.h> | ||
| 35 | #include <linux/reboot.h> | ||
| 36 | #include <linux/init.h> | ||
| 37 | #include <linux/acpi.h> | ||
| 38 | #include <asm/io.h> | ||
| 39 | #include <asm/nmi.h> | ||
| 40 | #include <asm/smp.h> | ||
| 41 | #include <asm/atomic.h> | ||
| 42 | #include <asm/apicdef.h> | ||
| 43 | #include <mach_mpparse.h> | ||
| 44 | #include <asm/genapic.h> | ||
| 45 | #include <asm/setup.h> | ||
| 46 | |||
| 47 | /* | ||
| 48 | * ES7000 chipsets | ||
| 49 | */ | ||
| 50 | |||
| 51 | #define NON_UNISYS 0 | ||
| 52 | #define ES7000_CLASSIC 1 | ||
| 53 | #define ES7000_ZORRO 2 | ||
| 54 | |||
| 55 | |||
| 56 | #define MIP_REG 1 | ||
| 57 | #define MIP_PSAI_REG 4 | ||
| 58 | |||
| 59 | #define MIP_BUSY 1 | ||
| 60 | #define MIP_SPIN 0xf0000 | ||
| 61 | #define MIP_VALID 0x0100000000000000ULL | ||
| 62 | #define MIP_PORT(VALUE) ((VALUE >> 32) & 0xffff) | ||
| 63 | |||
| 64 | #define MIP_RD_LO(VALUE) (VALUE & 0xffffffff) | ||
| 65 | |||
| 66 | struct mip_reg_info { | ||
| 67 | unsigned long long mip_info; | ||
| 68 | unsigned long long delivery_info; | ||
| 69 | unsigned long long host_reg; | ||
| 70 | unsigned long long mip_reg; | ||
| 71 | }; | ||
| 72 | |||
| 73 | struct part_info { | ||
| 74 | unsigned char type; | ||
| 75 | unsigned char length; | ||
| 76 | unsigned char part_id; | ||
| 77 | unsigned char apic_mode; | ||
| 78 | unsigned long snum; | ||
| 79 | char ptype[16]; | ||
| 80 | char sname[64]; | ||
| 81 | char pname[64]; | ||
| 82 | }; | ||
| 83 | |||
| 84 | struct psai { | ||
| 85 | unsigned long long entry_type; | ||
| 86 | unsigned long long addr; | ||
| 87 | unsigned long long bep_addr; | ||
| 88 | }; | ||
| 89 | |||
| 90 | struct es7000_mem_info { | ||
| 91 | unsigned char type; | ||
| 92 | unsigned char length; | ||
| 93 | unsigned char resv[6]; | ||
| 94 | unsigned long long start; | ||
| 95 | unsigned long long size; | ||
| 96 | }; | ||
| 97 | |||
| 98 | struct es7000_oem_table { | ||
| 99 | unsigned long long hdr; | ||
| 100 | struct mip_reg_info mip; | ||
| 101 | struct part_info pif; | ||
| 102 | struct es7000_mem_info shm; | ||
| 103 | struct psai psai; | ||
| 104 | }; | ||
| 105 | |||
| 106 | #ifdef CONFIG_ACPI | ||
| 107 | |||
| 108 | struct oem_table { | ||
| 109 | struct acpi_table_header Header; | ||
| 110 | u32 OEMTableAddr; | ||
| 111 | u32 OEMTableSize; | ||
| 112 | }; | ||
| 113 | |||
| 114 | extern int find_unisys_acpi_oem_table(unsigned long *oem_addr); | ||
| 115 | extern void unmap_unisys_acpi_oem_table(unsigned long oem_addr); | ||
| 116 | #endif | ||
| 117 | |||
| 118 | struct mip_reg { | ||
| 119 | unsigned long long off_0; | ||
| 120 | unsigned long long off_8; | ||
| 121 | unsigned long long off_10; | ||
| 122 | unsigned long long off_18; | ||
| 123 | unsigned long long off_20; | ||
| 124 | unsigned long long off_28; | ||
| 125 | unsigned long long off_30; | ||
| 126 | unsigned long long off_38; | ||
| 127 | }; | ||
| 128 | |||
| 129 | #define MIP_SW_APIC 0x1020b | ||
| 130 | #define MIP_FUNC(VALUE) (VALUE & 0xff) | ||
| 131 | |||
| 132 | /* | ||
| 133 | * ES7000 Globals | ||
| 134 | */ | ||
| 135 | |||
| 136 | static volatile unsigned long *psai = NULL; | ||
| 137 | static struct mip_reg *mip_reg; | ||
| 138 | static struct mip_reg *host_reg; | ||
| 139 | static int mip_port; | ||
| 140 | static unsigned long mip_addr, host_addr; | ||
| 141 | |||
| 142 | int es7000_plat; | ||
| 143 | |||
| 144 | /* | ||
| 145 | * GSI override for ES7000 platforms. | ||
| 146 | */ | ||
| 147 | |||
| 148 | static unsigned int base; | ||
| 149 | |||
| 150 | static int | ||
| 151 | es7000_rename_gsi(int ioapic, int gsi) | ||
| 152 | { | ||
| 153 | if (es7000_plat == ES7000_ZORRO) | ||
| 154 | return gsi; | ||
| 155 | |||
| 156 | if (!base) { | ||
| 157 | int i; | ||
| 158 | for (i = 0; i < nr_ioapics; i++) | ||
| 159 | base += nr_ioapic_registers[i]; | ||
| 160 | } | ||
| 161 | |||
| 162 | if (!ioapic && (gsi < 16)) | ||
| 163 | gsi += base; | ||
| 164 | return gsi; | ||
| 165 | } | ||
| 166 | |||
| 167 | static int wakeup_secondary_cpu_via_mip(int cpu, unsigned long eip) | ||
| 168 | { | ||
| 169 | unsigned long vect = 0, psaival = 0; | ||
| 170 | |||
| 171 | if (psai == NULL) | ||
| 172 | return -1; | ||
| 173 | |||
| 174 | vect = ((unsigned long)__pa(eip)/0x1000) << 16; | ||
| 175 | psaival = (0x1000000 | vect | cpu); | ||
| 176 | |||
| 177 | while (*psai & 0x1000000) | ||
| 178 | ; | ||
| 179 | |||
| 180 | *psai = psaival; | ||
| 181 | |||
| 182 | return 0; | ||
| 183 | } | ||
| 184 | |||
| 185 | static void noop_wait_for_deassert(atomic_t *deassert_not_used) | ||
| 186 | { | ||
| 187 | } | ||
| 188 | |||
| 189 | static int __init es7000_update_genapic(void) | ||
| 190 | { | ||
| 191 | genapic->wakeup_cpu = wakeup_secondary_cpu_via_mip; | ||
| 192 | |||
| 193 | /* MPENTIUMIII */ | ||
| 194 | if (boot_cpu_data.x86 == 6 && | ||
| 195 | (boot_cpu_data.x86_model >= 7 || boot_cpu_data.x86_model <= 11)) { | ||
| 196 | es7000_update_genapic_to_cluster(); | ||
| 197 | genapic->wait_for_init_deassert = noop_wait_for_deassert; | ||
| 198 | genapic->wakeup_cpu = wakeup_secondary_cpu_via_mip; | ||
| 199 | } | ||
| 200 | |||
| 201 | return 0; | ||
| 202 | } | ||
| 203 | |||
| 204 | void __init | ||
| 205 | setup_unisys(void) | ||
| 206 | { | ||
| 207 | /* | ||
| 208 | * Determine the generation of the ES7000 currently running. | ||
| 209 | * | ||
| 210 | * es7000_plat = 1 if the machine is a 5xx ES7000 box | ||
| 211 | * es7000_plat = 2 if the machine is a x86_64 ES7000 box | ||
| 212 | * | ||
| 213 | */ | ||
| 214 | if (!(boot_cpu_data.x86 <= 15 && boot_cpu_data.x86_model <= 2)) | ||
| 215 | es7000_plat = ES7000_ZORRO; | ||
| 216 | else | ||
| 217 | es7000_plat = ES7000_CLASSIC; | ||
| 218 | ioapic_renumber_irq = es7000_rename_gsi; | ||
| 219 | |||
| 220 | x86_quirks->update_genapic = es7000_update_genapic; | ||
| 221 | } | ||
| 222 | |||
| 223 | /* | ||
| 224 | * Parse the OEM Table | ||
| 225 | */ | ||
| 226 | |||
| 227 | int __init | ||
| 228 | parse_unisys_oem (char *oemptr) | ||
| 229 | { | ||
| 230 | int i; | ||
| 231 | int success = 0; | ||
| 232 | unsigned char type, size; | ||
| 233 | unsigned long val; | ||
| 234 | char *tp = NULL; | ||
| 235 | struct psai *psaip = NULL; | ||
| 236 | struct mip_reg_info *mi; | ||
| 237 | struct mip_reg *host, *mip; | ||
| 238 | |||
| 239 | tp = oemptr; | ||
| 240 | |||
| 241 | tp += 8; | ||
| 242 | |||
| 243 | for (i=0; i <= 6; i++) { | ||
| 244 | type = *tp++; | ||
| 245 | size = *tp++; | ||
| 246 | tp -= 2; | ||
| 247 | switch (type) { | ||
| 248 | case MIP_REG: | ||
| 249 | mi = (struct mip_reg_info *)tp; | ||
| 250 | val = MIP_RD_LO(mi->host_reg); | ||
| 251 | host_addr = val; | ||
| 252 | host = (struct mip_reg *)val; | ||
| 253 | host_reg = __va(host); | ||
| 254 | val = MIP_RD_LO(mi->mip_reg); | ||
| 255 | mip_port = MIP_PORT(mi->mip_info); | ||
| 256 | mip_addr = val; | ||
| 257 | mip = (struct mip_reg *)val; | ||
| 258 | mip_reg = __va(mip); | ||
| 259 | pr_debug("es7000_mipcfg: host_reg = 0x%lx \n", | ||
| 260 | (unsigned long)host_reg); | ||
| 261 | pr_debug("es7000_mipcfg: mip_reg = 0x%lx \n", | ||
| 262 | (unsigned long)mip_reg); | ||
| 263 | success++; | ||
| 264 | break; | ||
| 265 | case MIP_PSAI_REG: | ||
| 266 | psaip = (struct psai *)tp; | ||
| 267 | if (tp != NULL) { | ||
| 268 | if (psaip->addr) | ||
| 269 | psai = __va(psaip->addr); | ||
| 270 | else | ||
| 271 | psai = NULL; | ||
| 272 | success++; | ||
| 273 | } | ||
| 274 | break; | ||
| 275 | default: | ||
| 276 | break; | ||
| 277 | } | ||
| 278 | tp += size; | ||
| 279 | } | ||
| 280 | |||
| 281 | if (success < 2) { | ||
| 282 | es7000_plat = NON_UNISYS; | ||
| 283 | } else | ||
| 284 | setup_unisys(); | ||
| 285 | return es7000_plat; | ||
| 286 | } | ||
| 287 | |||
| 288 | #ifdef CONFIG_ACPI | ||
| 289 | static unsigned long oem_addrX; | ||
| 290 | static unsigned long oem_size; | ||
| 291 | int __init find_unisys_acpi_oem_table(unsigned long *oem_addr) | ||
| 292 | { | ||
| 293 | struct acpi_table_header *header = NULL; | ||
| 294 | int i = 0; | ||
| 295 | |||
| 296 | while (ACPI_SUCCESS(acpi_get_table("OEM1", i++, &header))) { | ||
| 297 | if (!memcmp((char *) &header->oem_id, "UNISYS", 6)) { | ||
| 298 | struct oem_table *t = (struct oem_table *)header; | ||
| 299 | |||
| 300 | oem_addrX = t->OEMTableAddr; | ||
| 301 | oem_size = t->OEMTableSize; | ||
| 302 | |||
| 303 | *oem_addr = (unsigned long)__acpi_map_table(oem_addrX, | ||
| 304 | oem_size); | ||
| 305 | return 0; | ||
| 306 | } | ||
| 307 | } | ||
| 308 | return -1; | ||
| 309 | } | ||
| 310 | |||
| 311 | void __init unmap_unisys_acpi_oem_table(unsigned long oem_addr) | ||
| 312 | { | ||
| 313 | } | ||
| 314 | #endif | ||
| 315 | |||
| 316 | static void | ||
| 317 | es7000_spin(int n) | ||
| 318 | { | ||
| 319 | int i = 0; | ||
| 320 | |||
| 321 | while (i++ < n) | ||
| 322 | rep_nop(); | ||
| 323 | } | ||
| 324 | |||
| 325 | static int __init | ||
| 326 | es7000_mip_write(struct mip_reg *mip_reg) | ||
| 327 | { | ||
| 328 | int status = 0; | ||
| 329 | int spin; | ||
| 330 | |||
| 331 | spin = MIP_SPIN; | ||
| 332 | while (((unsigned long long)host_reg->off_38 & | ||
| 333 | (unsigned long long)MIP_VALID) != 0) { | ||
| 334 | if (--spin <= 0) { | ||
| 335 | printk("es7000_mip_write: Timeout waiting for Host Valid Flag"); | ||
| 336 | return -1; | ||
| 337 | } | ||
| 338 | es7000_spin(MIP_SPIN); | ||
| 339 | } | ||
| 340 | |||
| 341 | memcpy(host_reg, mip_reg, sizeof(struct mip_reg)); | ||
| 342 | outb(1, mip_port); | ||
| 343 | |||
| 344 | spin = MIP_SPIN; | ||
| 345 | |||
| 346 | while (((unsigned long long)mip_reg->off_38 & | ||
| 347 | (unsigned long long)MIP_VALID) == 0) { | ||
| 348 | if (--spin <= 0) { | ||
| 349 | printk("es7000_mip_write: Timeout waiting for MIP Valid Flag"); | ||
| 350 | return -1; | ||
| 351 | } | ||
| 352 | es7000_spin(MIP_SPIN); | ||
| 353 | } | ||
| 354 | |||
| 355 | status = ((unsigned long long)mip_reg->off_0 & | ||
| 356 | (unsigned long long)0xffff0000000000ULL) >> 48; | ||
| 357 | mip_reg->off_38 = ((unsigned long long)mip_reg->off_38 & | ||
| 358 | (unsigned long long)~MIP_VALID); | ||
| 359 | return status; | ||
| 360 | } | ||
| 361 | |||
| 362 | void __init | ||
| 363 | es7000_sw_apic(void) | ||
| 364 | { | ||
| 365 | if (es7000_plat) { | ||
| 366 | int mip_status; | ||
| 367 | struct mip_reg es7000_mip_reg; | ||
| 368 | |||
| 369 | printk("ES7000: Enabling APIC mode.\n"); | ||
| 370 | memset(&es7000_mip_reg, 0, sizeof(struct mip_reg)); | ||
| 371 | es7000_mip_reg.off_0 = MIP_SW_APIC; | ||
| 372 | es7000_mip_reg.off_38 = (MIP_VALID); | ||
| 373 | while ((mip_status = es7000_mip_write(&es7000_mip_reg)) != 0) | ||
| 374 | printk("es7000_sw_apic: command failed, status = %x\n", | ||
| 375 | mip_status); | ||
| 376 | return; | ||
| 377 | } | ||
| 378 | } | ||
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index b9a4d8c4b935..f5b272247690 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c | |||
| @@ -26,27 +26,6 @@ | |||
| 26 | #include <asm/bios_ebda.h> | 26 | #include <asm/bios_ebda.h> |
| 27 | #include <asm/trampoline.h> | 27 | #include <asm/trampoline.h> |
| 28 | 28 | ||
| 29 | /* boot cpu pda */ | ||
| 30 | static struct x8664_pda _boot_cpu_pda; | ||
| 31 | |||
| 32 | #ifdef CONFIG_SMP | ||
| 33 | /* | ||
| 34 | * We install an empty cpu_pda pointer table to indicate to early users | ||
| 35 | * (numa_set_node) that the cpu_pda pointer table for cpus other than | ||
| 36 | * the boot cpu is not yet setup. | ||
| 37 | */ | ||
| 38 | static struct x8664_pda *__cpu_pda[NR_CPUS] __initdata; | ||
| 39 | #else | ||
| 40 | static struct x8664_pda *__cpu_pda[NR_CPUS] __read_mostly; | ||
| 41 | #endif | ||
| 42 | |||
| 43 | void __init x86_64_init_pda(void) | ||
| 44 | { | ||
| 45 | _cpu_pda = __cpu_pda; | ||
| 46 | cpu_pda(0) = &_boot_cpu_pda; | ||
| 47 | pda_init(0); | ||
| 48 | } | ||
| 49 | |||
| 50 | static void __init zap_identity_mappings(void) | 29 | static void __init zap_identity_mappings(void) |
| 51 | { | 30 | { |
| 52 | pgd_t *pgd = pgd_offset_k(0UL); | 31 | pgd_t *pgd = pgd_offset_k(0UL); |
| @@ -112,8 +91,6 @@ void __init x86_64_start_kernel(char * real_mode_data) | |||
| 112 | if (console_loglevel == 10) | 91 | if (console_loglevel == 10) |
| 113 | early_printk("Kernel alive\n"); | 92 | early_printk("Kernel alive\n"); |
| 114 | 93 | ||
| 115 | x86_64_init_pda(); | ||
| 116 | |||
| 117 | x86_64_start_reservations(real_mode_data); | 94 | x86_64_start_reservations(real_mode_data); |
| 118 | } | 95 | } |
| 119 | 96 | ||
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S index e835b4eea70b..c32ca19d591a 100644 --- a/arch/x86/kernel/head_32.S +++ b/arch/x86/kernel/head_32.S | |||
| @@ -11,14 +11,15 @@ | |||
| 11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
| 12 | #include <linux/linkage.h> | 12 | #include <linux/linkage.h> |
| 13 | #include <asm/segment.h> | 13 | #include <asm/segment.h> |
| 14 | #include <asm/page.h> | 14 | #include <asm/page_types.h> |
| 15 | #include <asm/pgtable.h> | 15 | #include <asm/pgtable_types.h> |
| 16 | #include <asm/desc.h> | 16 | #include <asm/desc.h> |
| 17 | #include <asm/cache.h> | 17 | #include <asm/cache.h> |
| 18 | #include <asm/thread_info.h> | 18 | #include <asm/thread_info.h> |
| 19 | #include <asm/asm-offsets.h> | 19 | #include <asm/asm-offsets.h> |
| 20 | #include <asm/setup.h> | 20 | #include <asm/setup.h> |
| 21 | #include <asm/processor-flags.h> | 21 | #include <asm/processor-flags.h> |
| 22 | #include <asm/percpu.h> | ||
| 22 | 23 | ||
| 23 | /* Physical address */ | 24 | /* Physical address */ |
| 24 | #define pa(X) ((X) - __PAGE_OFFSET) | 25 | #define pa(X) ((X) - __PAGE_OFFSET) |
| @@ -429,14 +430,34 @@ is386: movl $2,%ecx # set MP | |||
| 429 | ljmp $(__KERNEL_CS),$1f | 430 | ljmp $(__KERNEL_CS),$1f |
| 430 | 1: movl $(__KERNEL_DS),%eax # reload all the segment registers | 431 | 1: movl $(__KERNEL_DS),%eax # reload all the segment registers |
| 431 | movl %eax,%ss # after changing gdt. | 432 | movl %eax,%ss # after changing gdt. |
| 432 | movl %eax,%fs # gets reset once there's real percpu | ||
| 433 | 433 | ||
| 434 | movl $(__USER_DS),%eax # DS/ES contains default USER segment | 434 | movl $(__USER_DS),%eax # DS/ES contains default USER segment |
| 435 | movl %eax,%ds | 435 | movl %eax,%ds |
| 436 | movl %eax,%es | 436 | movl %eax,%es |
| 437 | 437 | ||
| 438 | xorl %eax,%eax # Clear GS and LDT | 438 | movl $(__KERNEL_PERCPU), %eax |
| 439 | movl %eax,%fs # set this cpu's percpu | ||
| 440 | |||
| 441 | #ifdef CONFIG_CC_STACKPROTECTOR | ||
| 442 | /* | ||
| 443 | * The linker can't handle this by relocation. Manually set | ||
| 444 | * base address in stack canary segment descriptor. | ||
| 445 | */ | ||
| 446 | cmpb $0,ready | ||
| 447 | jne 1f | ||
| 448 | movl $per_cpu__gdt_page,%eax | ||
| 449 | movl $per_cpu__stack_canary,%ecx | ||
| 450 | subl $20, %ecx | ||
| 451 | movw %cx, 8 * GDT_ENTRY_STACK_CANARY + 2(%eax) | ||
| 452 | shrl $16, %ecx | ||
| 453 | movb %cl, 8 * GDT_ENTRY_STACK_CANARY + 4(%eax) | ||
| 454 | movb %ch, 8 * GDT_ENTRY_STACK_CANARY + 7(%eax) | ||
| 455 | 1: | ||
| 456 | #endif | ||
| 457 | movl $(__KERNEL_STACK_CANARY),%eax | ||
| 439 | movl %eax,%gs | 458 | movl %eax,%gs |
| 459 | |||
| 460 | xorl %eax,%eax # Clear LDT | ||
| 440 | lldt %ax | 461 | lldt %ax |
| 441 | 462 | ||
| 442 | cld # gcc2 wants the direction flag cleared at all times | 463 | cld # gcc2 wants the direction flag cleared at all times |
| @@ -446,8 +467,6 @@ is386: movl $2,%ecx # set MP | |||
| 446 | movb $1, ready | 467 | movb $1, ready |
| 447 | cmpb $0,%cl # the first CPU calls start_kernel | 468 | cmpb $0,%cl # the first CPU calls start_kernel |
| 448 | je 1f | 469 | je 1f |
| 449 | movl $(__KERNEL_PERCPU), %eax | ||
| 450 | movl %eax,%fs # set this cpu's percpu | ||
| 451 | movl (stack_start), %esp | 470 | movl (stack_start), %esp |
| 452 | 1: | 471 | 1: |
| 453 | #endif /* CONFIG_SMP */ | 472 | #endif /* CONFIG_SMP */ |
| @@ -548,12 +567,8 @@ early_fault: | |||
| 548 | pushl %eax | 567 | pushl %eax |
| 549 | pushl %edx /* trapno */ | 568 | pushl %edx /* trapno */ |
| 550 | pushl $fault_msg | 569 | pushl $fault_msg |
| 551 | #ifdef CONFIG_EARLY_PRINTK | ||
| 552 | call early_printk | ||
| 553 | #else | ||
| 554 | call printk | 570 | call printk |
| 555 | #endif | 571 | #endif |
| 556 | #endif | ||
| 557 | call dump_stack | 572 | call dump_stack |
| 558 | hlt_loop: | 573 | hlt_loop: |
| 559 | hlt | 574 | hlt |
| @@ -580,11 +595,10 @@ ignore_int: | |||
| 580 | pushl 32(%esp) | 595 | pushl 32(%esp) |
| 581 | pushl 40(%esp) | 596 | pushl 40(%esp) |
| 582 | pushl $int_msg | 597 | pushl $int_msg |
| 583 | #ifdef CONFIG_EARLY_PRINTK | ||
| 584 | call early_printk | ||
| 585 | #else | ||
| 586 | call printk | 598 | call printk |
| 587 | #endif | 599 | |
| 600 | call dump_stack | ||
| 601 | |||
| 588 | addl $(5*4),%esp | 602 | addl $(5*4),%esp |
| 589 | popl %ds | 603 | popl %ds |
| 590 | popl %es | 604 | popl %es |
| @@ -660,7 +674,7 @@ early_recursion_flag: | |||
| 660 | .long 0 | 674 | .long 0 |
| 661 | 675 | ||
| 662 | int_msg: | 676 | int_msg: |
| 663 | .asciz "Unknown interrupt or fault at EIP %p %p %p\n" | 677 | .asciz "Unknown interrupt or fault at: %p %p %p\n" |
| 664 | 678 | ||
| 665 | fault_msg: | 679 | fault_msg: |
| 666 | /* fault info: */ | 680 | /* fault info: */ |
diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S index 0e275d495563..2e648e3a5ea4 100644 --- a/arch/x86/kernel/head_64.S +++ b/arch/x86/kernel/head_64.S | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <asm/msr.h> | 19 | #include <asm/msr.h> |
| 20 | #include <asm/cache.h> | 20 | #include <asm/cache.h> |
| 21 | #include <asm/processor-flags.h> | 21 | #include <asm/processor-flags.h> |
| 22 | #include <asm/percpu.h> | ||
| 22 | 23 | ||
| 23 | #ifdef CONFIG_PARAVIRT | 24 | #ifdef CONFIG_PARAVIRT |
| 24 | #include <asm/asm-offsets.h> | 25 | #include <asm/asm-offsets.h> |
| @@ -226,12 +227,15 @@ ENTRY(secondary_startup_64) | |||
| 226 | movl %eax,%fs | 227 | movl %eax,%fs |
| 227 | movl %eax,%gs | 228 | movl %eax,%gs |
| 228 | 229 | ||
| 229 | /* | 230 | /* Set up %gs. |
| 230 | * Setup up a dummy PDA. this is just for some early bootup code | 231 | * |
| 231 | * that does in_interrupt() | 232 | * The base of %gs always points to the bottom of the irqstack |
| 232 | */ | 233 | * union. If the stack protector canary is enabled, it is |
| 234 | * located at %gs:40. Note that, on SMP, the boot cpu uses | ||
| 235 | * init data section till per cpu areas are set up. | ||
| 236 | */ | ||
| 233 | movl $MSR_GS_BASE,%ecx | 237 | movl $MSR_GS_BASE,%ecx |
| 234 | movq $empty_zero_page,%rax | 238 | movq initial_gs(%rip),%rax |
| 235 | movq %rax,%rdx | 239 | movq %rax,%rdx |
| 236 | shrq $32,%rdx | 240 | shrq $32,%rdx |
| 237 | wrmsr | 241 | wrmsr |
| @@ -257,6 +261,8 @@ ENTRY(secondary_startup_64) | |||
| 257 | .align 8 | 261 | .align 8 |
| 258 | ENTRY(initial_code) | 262 | ENTRY(initial_code) |
| 259 | .quad x86_64_start_kernel | 263 | .quad x86_64_start_kernel |
| 264 | ENTRY(initial_gs) | ||
| 265 | .quad INIT_PER_CPU_VAR(irq_stack_union) | ||
| 260 | __FINITDATA | 266 | __FINITDATA |
| 261 | 267 | ||
| 262 | ENTRY(stack_start) | 268 | ENTRY(stack_start) |
| @@ -401,7 +407,8 @@ NEXT_PAGE(level2_spare_pgt) | |||
| 401 | .globl early_gdt_descr | 407 | .globl early_gdt_descr |
| 402 | early_gdt_descr: | 408 | early_gdt_descr: |
| 403 | .word GDT_ENTRIES*8-1 | 409 | .word GDT_ENTRIES*8-1 |
| 404 | .quad per_cpu__gdt_page | 410 | early_gdt_descr_base: |
| 411 | .quad INIT_PER_CPU_VAR(gdt_page) | ||
| 405 | 412 | ||
| 406 | ENTRY(phys_base) | 413 | ENTRY(phys_base) |
| 407 | /* This must match the first entry in level2_kernel_pgt */ | 414 | /* This must match the first entry in level2_kernel_pgt */ |
diff --git a/arch/x86/kernel/ioport.c b/arch/x86/kernel/ioport.c index b12208f4dfee..e41980a373ab 100644 --- a/arch/x86/kernel/ioport.c +++ b/arch/x86/kernel/ioport.c | |||
| @@ -131,9 +131,8 @@ static int do_iopl(unsigned int level, struct pt_regs *regs) | |||
| 131 | } | 131 | } |
| 132 | 132 | ||
| 133 | #ifdef CONFIG_X86_32 | 133 | #ifdef CONFIG_X86_32 |
| 134 | asmlinkage long sys_iopl(unsigned long regsp) | 134 | long sys_iopl(struct pt_regs *regs) |
| 135 | { | 135 | { |
| 136 | struct pt_regs *regs = (struct pt_regs *)®sp; | ||
| 137 | unsigned int level = regs->bx; | 136 | unsigned int level = regs->bx; |
| 138 | struct thread_struct *t = ¤t->thread; | 137 | struct thread_struct *t = ¤t->thread; |
| 139 | int rc; | 138 | int rc; |
diff --git a/arch/x86/kernel/ipi.c b/arch/x86/kernel/ipi.c deleted file mode 100644 index 285bbf8831fa..000000000000 --- a/arch/x86/kernel/ipi.c +++ /dev/null | |||
| @@ -1,190 +0,0 @@ | |||
| 1 | #include <linux/cpumask.h> | ||
| 2 | #include <linux/interrupt.h> | ||
| 3 | #include <linux/init.h> | ||
| 4 | |||
| 5 | #include <linux/mm.h> | ||
| 6 | #include <linux/delay.h> | ||
| 7 | #include <linux/spinlock.h> | ||
| 8 | #include <linux/kernel_stat.h> | ||
| 9 | #include <linux/mc146818rtc.h> | ||
| 10 | #include <linux/cache.h> | ||
| 11 | #include <linux/cpu.h> | ||
| 12 | #include <linux/module.h> | ||
| 13 | |||
| 14 | #include <asm/smp.h> | ||
| 15 | #include <asm/mtrr.h> | ||
| 16 | #include <asm/tlbflush.h> | ||
| 17 | #include <asm/mmu_context.h> | ||
| 18 | #include <asm/apic.h> | ||
| 19 | #include <asm/proto.h> | ||
| 20 | |||
| 21 | #ifdef CONFIG_X86_32 | ||
| 22 | #include <mach_apic.h> | ||
| 23 | #include <mach_ipi.h> | ||
| 24 | |||
| 25 | /* | ||
| 26 | * the following functions deal with sending IPIs between CPUs. | ||
| 27 | * | ||
| 28 | * We use 'broadcast', CPU->CPU IPIs and self-IPIs too. | ||
| 29 | */ | ||
| 30 | |||
| 31 | static inline int __prepare_ICR(unsigned int shortcut, int vector) | ||
| 32 | { | ||
| 33 | unsigned int icr = shortcut | APIC_DEST_LOGICAL; | ||
| 34 | |||
| 35 | switch (vector) { | ||
| 36 | default: | ||
| 37 | icr |= APIC_DM_FIXED | vector; | ||
| 38 | break; | ||
| 39 | case NMI_VECTOR: | ||
| 40 | icr |= APIC_DM_NMI; | ||
| 41 | break; | ||
| 42 | } | ||
| 43 | return icr; | ||
| 44 | } | ||
| 45 | |||
| 46 | static inline int __prepare_ICR2(unsigned int mask) | ||
| 47 | { | ||
| 48 | return SET_APIC_DEST_FIELD(mask); | ||
| 49 | } | ||
| 50 | |||
| 51 | void __send_IPI_shortcut(unsigned int shortcut, int vector) | ||
| 52 | { | ||
| 53 | /* | ||
| 54 | * Subtle. In the case of the 'never do double writes' workaround | ||
| 55 | * we have to lock out interrupts to be safe. As we don't care | ||
| 56 | * of the value read we use an atomic rmw access to avoid costly | ||
| 57 | * cli/sti. Otherwise we use an even cheaper single atomic write | ||
| 58 | * to the APIC. | ||
| 59 | */ | ||
| 60 | unsigned int cfg; | ||
| 61 | |||
| 62 | /* | ||
| 63 | * Wait for idle. | ||
| 64 | */ | ||
| 65 | apic_wait_icr_idle(); | ||
| 66 | |||
| 67 | /* | ||
| 68 | * No need to touch the target chip field | ||
| 69 | */ | ||
| 70 | cfg = __prepare_ICR(shortcut, vector); | ||
| 71 | |||
| 72 | /* | ||
| 73 | * Send the IPI. The write to APIC_ICR fires this off. | ||
| 74 | */ | ||
| 75 | apic_write(APIC_ICR, cfg); | ||
| 76 | } | ||
| 77 | |||
| 78 | void send_IPI_self(int vector) | ||
| 79 | { | ||
| 80 | __send_IPI_shortcut(APIC_DEST_SELF, vector); | ||
| 81 | } | ||
| 82 | |||
| 83 | /* | ||
| 84 | * This is used to send an IPI with no shorthand notation (the destination is | ||
| 85 | * specified in bits 56 to 63 of the ICR). | ||
| 86 | */ | ||
| 87 | static inline void __send_IPI_dest_field(unsigned long mask, int vector) | ||
| 88 | { | ||
| 89 | unsigned long cfg; | ||
| 90 | |||
| 91 | /* | ||
| 92 | * Wait for idle. | ||
| 93 | */ | ||
| 94 | if (unlikely(vector == NMI_VECTOR)) | ||
| 95 | safe_apic_wait_icr_idle(); | ||
| 96 | else | ||
| 97 | apic_wait_icr_idle(); | ||
| 98 | |||
| 99 | /* | ||
| 100 | * prepare target chip field | ||
| 101 | */ | ||
| 102 | cfg = __prepare_ICR2(mask); | ||
| 103 | apic_write(APIC_ICR2, cfg); | ||
| 104 | |||
| 105 | /* | ||
| 106 | * program the ICR | ||
| 107 | */ | ||
| 108 | cfg = __prepare_ICR(0, vector); | ||
| 109 | |||
| 110 | /* | ||
| 111 | * Send the IPI. The write to APIC_ICR fires this off. | ||
| 112 | */ | ||
| 113 | apic_write(APIC_ICR, cfg); | ||
| 114 | } | ||
| 115 | |||
| 116 | /* | ||
| 117 | * This is only used on smaller machines. | ||
| 118 | */ | ||
| 119 | void send_IPI_mask_bitmask(const struct cpumask *cpumask, int vector) | ||
| 120 | { | ||
| 121 | unsigned long mask = cpumask_bits(cpumask)[0]; | ||
| 122 | unsigned long flags; | ||
| 123 | |||
| 124 | local_irq_save(flags); | ||
| 125 | WARN_ON(mask & ~cpumask_bits(cpu_online_mask)[0]); | ||
| 126 | __send_IPI_dest_field(mask, vector); | ||
| 127 | local_irq_restore(flags); | ||
| 128 | } | ||
| 129 | |||
| 130 | void send_IPI_mask_sequence(const struct cpumask *mask, int vector) | ||
| 131 | { | ||
| 132 | unsigned long flags; | ||
| 133 | unsigned int query_cpu; | ||
| 134 | |||
| 135 | /* | ||
| 136 | * Hack. The clustered APIC addressing mode doesn't allow us to send | ||
| 137 | * to an arbitrary mask, so I do a unicasts to each CPU instead. This | ||
| 138 | * should be modified to do 1 message per cluster ID - mbligh | ||
| 139 | */ | ||
| 140 | |||
| 141 | local_irq_save(flags); | ||
| 142 | for_each_cpu(query_cpu, mask) | ||
| 143 | __send_IPI_dest_field(cpu_to_logical_apicid(query_cpu), vector); | ||
| 144 | local_irq_restore(flags); | ||
| 145 | } | ||
| 146 | |||
| 147 | void send_IPI_mask_allbutself(const struct cpumask *mask, int vector) | ||
| 148 | { | ||
| 149 | unsigned long flags; | ||
| 150 | unsigned int query_cpu; | ||
| 151 | unsigned int this_cpu = smp_processor_id(); | ||
| 152 | |||
| 153 | /* See Hack comment above */ | ||
| 154 | |||
| 155 | local_irq_save(flags); | ||
| 156 | for_each_cpu(query_cpu, mask) | ||
| 157 | if (query_cpu != this_cpu) | ||
| 158 | __send_IPI_dest_field(cpu_to_logical_apicid(query_cpu), | ||
| 159 | vector); | ||
| 160 | local_irq_restore(flags); | ||
| 161 | } | ||
| 162 | |||
| 163 | /* must come after the send_IPI functions above for inlining */ | ||
| 164 | static int convert_apicid_to_cpu(int apic_id) | ||
| 165 | { | ||
| 166 | int i; | ||
| 167 | |||
| 168 | for_each_possible_cpu(i) { | ||
| 169 | if (per_cpu(x86_cpu_to_apicid, i) == apic_id) | ||
| 170 | return i; | ||
| 171 | } | ||
| 172 | return -1; | ||
| 173 | } | ||
| 174 | |||
| 175 | int safe_smp_processor_id(void) | ||
| 176 | { | ||
| 177 | int apicid, cpuid; | ||
| 178 | |||
| 179 | if (!boot_cpu_has(X86_FEATURE_APIC)) | ||
| 180 | return 0; | ||
| 181 | |||
| 182 | apicid = hard_smp_processor_id(); | ||
| 183 | if (apicid == BAD_APICID) | ||
| 184 | return 0; | ||
| 185 | |||
| 186 | cpuid = convert_apicid_to_cpu(apicid); | ||
| 187 | |||
| 188 | return cpuid >= 0 ? cpuid : 0; | ||
| 189 | } | ||
| 190 | #endif | ||
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 3973e2df7f87..f13ca1650aaf 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
| @@ -6,10 +6,12 @@ | |||
| 6 | #include <linux/kernel_stat.h> | 6 | #include <linux/kernel_stat.h> |
| 7 | #include <linux/seq_file.h> | 7 | #include <linux/seq_file.h> |
| 8 | #include <linux/smp.h> | 8 | #include <linux/smp.h> |
| 9 | #include <linux/ftrace.h> | ||
| 9 | 10 | ||
| 10 | #include <asm/apic.h> | 11 | #include <asm/apic.h> |
| 11 | #include <asm/io_apic.h> | 12 | #include <asm/io_apic.h> |
| 12 | #include <asm/irq.h> | 13 | #include <asm/irq.h> |
| 14 | #include <asm/idle.h> | ||
| 13 | 15 | ||
| 14 | atomic_t irq_err_count; | 16 | atomic_t irq_err_count; |
| 15 | 17 | ||
| @@ -36,11 +38,7 @@ void ack_bad_irq(unsigned int irq) | |||
| 36 | #endif | 38 | #endif |
| 37 | } | 39 | } |
| 38 | 40 | ||
| 39 | #ifdef CONFIG_X86_32 | 41 | #define irq_stats(x) (&per_cpu(irq_stat, x)) |
| 40 | # define irq_stats(x) (&per_cpu(irq_stat, x)) | ||
| 41 | #else | ||
| 42 | # define irq_stats(x) cpu_pda(x) | ||
| 43 | #endif | ||
| 44 | /* | 42 | /* |
| 45 | * /proc/interrupts printing: | 43 | * /proc/interrupts printing: |
| 46 | */ | 44 | */ |
| @@ -192,4 +190,40 @@ u64 arch_irq_stat(void) | |||
| 192 | return sum; | 190 | return sum; |
| 193 | } | 191 | } |
| 194 | 192 | ||
| 193 | |||
| 194 | /* | ||
| 195 | * do_IRQ handles all normal device IRQ's (the special | ||
| 196 | * SMP cross-CPU interrupts have their own specific | ||
| 197 | * handlers). | ||
| 198 | */ | ||
| 199 | unsigned int __irq_entry do_IRQ(struct pt_regs *regs) | ||
| 200 | { | ||
| 201 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
| 202 | |||
| 203 | /* high bit used in ret_from_ code */ | ||
| 204 | unsigned vector = ~regs->orig_ax; | ||
| 205 | unsigned irq; | ||
| 206 | |||
| 207 | exit_idle(); | ||
| 208 | irq_enter(); | ||
| 209 | |||
| 210 | irq = __get_cpu_var(vector_irq)[vector]; | ||
| 211 | |||
| 212 | if (!handle_irq(irq, regs)) { | ||
| 213 | #ifdef CONFIG_X86_64 | ||
| 214 | if (!disable_apic) | ||
| 215 | ack_APIC_irq(); | ||
| 216 | #endif | ||
| 217 | |||
| 218 | if (printk_ratelimit()) | ||
| 219 | printk(KERN_EMERG "%s: %d.%d No irq handler for vector (irq %d)\n", | ||
| 220 | __func__, smp_processor_id(), vector, irq); | ||
| 221 | } | ||
| 222 | |||
| 223 | irq_exit(); | ||
| 224 | |||
| 225 | set_irq_regs(old_regs); | ||
| 226 | return 1; | ||
| 227 | } | ||
| 228 | |||
| 195 | EXPORT_SYMBOL_GPL(vector_used_by_percpu_irq); | 229 | EXPORT_SYMBOL_GPL(vector_used_by_percpu_irq); |
diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c index 74b9ff7341e9..9dc6b2b24275 100644 --- a/arch/x86/kernel/irq_32.c +++ b/arch/x86/kernel/irq_32.c | |||
| @@ -191,33 +191,16 @@ static inline int | |||
| 191 | execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq) { return 0; } | 191 | execute_on_irq_stack(int overflow, struct irq_desc *desc, int irq) { return 0; } |
| 192 | #endif | 192 | #endif |
| 193 | 193 | ||
| 194 | /* | 194 | bool handle_irq(unsigned irq, struct pt_regs *regs) |
| 195 | * do_IRQ handles all normal device IRQ's (the special | ||
| 196 | * SMP cross-CPU interrupts have their own specific | ||
| 197 | * handlers). | ||
| 198 | */ | ||
| 199 | unsigned int do_IRQ(struct pt_regs *regs) | ||
| 200 | { | 195 | { |
| 201 | struct pt_regs *old_regs; | ||
| 202 | /* high bit used in ret_from_ code */ | ||
| 203 | int overflow; | ||
| 204 | unsigned vector = ~regs->orig_ax; | ||
| 205 | struct irq_desc *desc; | 196 | struct irq_desc *desc; |
| 206 | unsigned irq; | 197 | int overflow; |
| 207 | |||
| 208 | |||
| 209 | old_regs = set_irq_regs(regs); | ||
| 210 | irq_enter(); | ||
| 211 | irq = __get_cpu_var(vector_irq)[vector]; | ||
| 212 | 198 | ||
| 213 | overflow = check_stack_overflow(); | 199 | overflow = check_stack_overflow(); |
| 214 | 200 | ||
| 215 | desc = irq_to_desc(irq); | 201 | desc = irq_to_desc(irq); |
| 216 | if (unlikely(!desc)) { | 202 | if (unlikely(!desc)) |
| 217 | printk(KERN_EMERG "%s: cannot handle IRQ %d vector %#x cpu %d\n", | 203 | return false; |
| 218 | __func__, irq, vector, smp_processor_id()); | ||
| 219 | BUG(); | ||
| 220 | } | ||
| 221 | 204 | ||
| 222 | if (!execute_on_irq_stack(overflow, desc, irq)) { | 205 | if (!execute_on_irq_stack(overflow, desc, irq)) { |
| 223 | if (unlikely(overflow)) | 206 | if (unlikely(overflow)) |
| @@ -225,13 +208,10 @@ unsigned int do_IRQ(struct pt_regs *regs) | |||
| 225 | desc->handle_irq(irq, desc); | 208 | desc->handle_irq(irq, desc); |
| 226 | } | 209 | } |
| 227 | 210 | ||
| 228 | irq_exit(); | 211 | return true; |
| 229 | set_irq_regs(old_regs); | ||
| 230 | return 1; | ||
| 231 | } | 212 | } |
| 232 | 213 | ||
| 233 | #ifdef CONFIG_HOTPLUG_CPU | 214 | #ifdef CONFIG_HOTPLUG_CPU |
| 234 | #include <mach_apic.h> | ||
| 235 | 215 | ||
| 236 | /* A cpu has been removed from cpu_online_mask. Reset irq affinities. */ | 216 | /* A cpu has been removed from cpu_online_mask. Reset irq affinities. */ |
| 237 | void fixup_irqs(void) | 217 | void fixup_irqs(void) |
| @@ -248,7 +228,7 @@ void fixup_irqs(void) | |||
| 248 | if (irq == 2) | 228 | if (irq == 2) |
| 249 | continue; | 229 | continue; |
| 250 | 230 | ||
| 251 | affinity = &desc->affinity; | 231 | affinity = desc->affinity; |
| 252 | if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) { | 232 | if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) { |
| 253 | printk("Breaking affinity for irq %i\n", irq); | 233 | printk("Breaking affinity for irq %i\n", irq); |
| 254 | affinity = cpu_all_mask; | 234 | affinity = cpu_all_mask; |
diff --git a/arch/x86/kernel/irq_64.c b/arch/x86/kernel/irq_64.c index 63c88e6ec025..977d8b43a0dd 100644 --- a/arch/x86/kernel/irq_64.c +++ b/arch/x86/kernel/irq_64.c | |||
| @@ -18,6 +18,13 @@ | |||
| 18 | #include <linux/smp.h> | 18 | #include <linux/smp.h> |
| 19 | #include <asm/io_apic.h> | 19 | #include <asm/io_apic.h> |
| 20 | #include <asm/idle.h> | 20 | #include <asm/idle.h> |
| 21 | #include <asm/apic.h> | ||
| 22 | |||
| 23 | DEFINE_PER_CPU_SHARED_ALIGNED(irq_cpustat_t, irq_stat); | ||
| 24 | EXPORT_PER_CPU_SYMBOL(irq_stat); | ||
| 25 | |||
| 26 | DEFINE_PER_CPU(struct pt_regs *, irq_regs); | ||
| 27 | EXPORT_PER_CPU_SYMBOL(irq_regs); | ||
| 21 | 28 | ||
| 22 | /* | 29 | /* |
| 23 | * Probabilistic stack overflow check: | 30 | * Probabilistic stack overflow check: |
| @@ -41,42 +48,18 @@ static inline void stack_overflow_check(struct pt_regs *regs) | |||
| 41 | #endif | 48 | #endif |
| 42 | } | 49 | } |
| 43 | 50 | ||
| 44 | /* | 51 | bool handle_irq(unsigned irq, struct pt_regs *regs) |
| 45 | * do_IRQ handles all normal device IRQ's (the special | ||
| 46 | * SMP cross-CPU interrupts have their own specific | ||
| 47 | * handlers). | ||
| 48 | */ | ||
| 49 | asmlinkage unsigned int __irq_entry do_IRQ(struct pt_regs *regs) | ||
| 50 | { | 52 | { |
| 51 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
| 52 | struct irq_desc *desc; | 53 | struct irq_desc *desc; |
| 53 | 54 | ||
| 54 | /* high bit used in ret_from_ code */ | ||
| 55 | unsigned vector = ~regs->orig_ax; | ||
| 56 | unsigned irq; | ||
| 57 | |||
| 58 | exit_idle(); | ||
| 59 | irq_enter(); | ||
| 60 | irq = __get_cpu_var(vector_irq)[vector]; | ||
| 61 | |||
| 62 | stack_overflow_check(regs); | 55 | stack_overflow_check(regs); |
| 63 | 56 | ||
| 64 | desc = irq_to_desc(irq); | 57 | desc = irq_to_desc(irq); |
| 65 | if (likely(desc)) | 58 | if (unlikely(!desc)) |
| 66 | generic_handle_irq_desc(irq, desc); | 59 | return false; |
| 67 | else { | ||
| 68 | if (!disable_apic) | ||
| 69 | ack_APIC_irq(); | ||
| 70 | |||
| 71 | if (printk_ratelimit()) | ||
| 72 | printk(KERN_EMERG "%s: %d.%d No irq handler for vector\n", | ||
| 73 | __func__, smp_processor_id(), vector); | ||
| 74 | } | ||
| 75 | |||
| 76 | irq_exit(); | ||
| 77 | 60 | ||
| 78 | set_irq_regs(old_regs); | 61 | generic_handle_irq_desc(irq, desc); |
| 79 | return 1; | 62 | return true; |
| 80 | } | 63 | } |
| 81 | 64 | ||
| 82 | #ifdef CONFIG_HOTPLUG_CPU | 65 | #ifdef CONFIG_HOTPLUG_CPU |
| @@ -100,7 +83,7 @@ void fixup_irqs(void) | |||
| 100 | /* interrupt's are disabled at this point */ | 83 | /* interrupt's are disabled at this point */ |
| 101 | spin_lock(&desc->lock); | 84 | spin_lock(&desc->lock); |
| 102 | 85 | ||
| 103 | affinity = &desc->affinity; | 86 | affinity = desc->affinity; |
| 104 | if (!irq_has_action(irq) || | 87 | if (!irq_has_action(irq) || |
| 105 | cpumask_equal(affinity, cpu_online_mask)) { | 88 | cpumask_equal(affinity, cpu_online_mask)) { |
| 106 | spin_unlock(&desc->lock); | 89 | spin_unlock(&desc->lock); |
diff --git a/arch/x86/kernel/irqinit_32.c b/arch/x86/kernel/irqinit_32.c index 10a09c2f1828..bf629cadec1a 100644 --- a/arch/x86/kernel/irqinit_32.c +++ b/arch/x86/kernel/irqinit_32.c | |||
| @@ -78,6 +78,15 @@ void __init init_ISA_irqs(void) | |||
| 78 | } | 78 | } |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | /* | ||
| 82 | * IRQ2 is cascade interrupt to second interrupt controller | ||
| 83 | */ | ||
| 84 | static struct irqaction irq2 = { | ||
| 85 | .handler = no_action, | ||
| 86 | .mask = CPU_MASK_NONE, | ||
| 87 | .name = "cascade", | ||
| 88 | }; | ||
| 89 | |||
| 81 | DEFINE_PER_CPU(vector_irq_t, vector_irq) = { | 90 | DEFINE_PER_CPU(vector_irq_t, vector_irq) = { |
| 82 | [0 ... IRQ0_VECTOR - 1] = -1, | 91 | [0 ... IRQ0_VECTOR - 1] = -1, |
| 83 | [IRQ0_VECTOR] = 0, | 92 | [IRQ0_VECTOR] = 0, |
| @@ -140,8 +149,15 @@ void __init native_init_IRQ(void) | |||
| 140 | */ | 149 | */ |
| 141 | alloc_intr_gate(RESCHEDULE_VECTOR, reschedule_interrupt); | 150 | alloc_intr_gate(RESCHEDULE_VECTOR, reschedule_interrupt); |
| 142 | 151 | ||
| 143 | /* IPI for invalidation */ | 152 | /* IPIs for invalidation */ |
| 144 | alloc_intr_gate(INVALIDATE_TLB_VECTOR, invalidate_interrupt); | 153 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+0, invalidate_interrupt0); |
| 154 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+1, invalidate_interrupt1); | ||
| 155 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+2, invalidate_interrupt2); | ||
| 156 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+3, invalidate_interrupt3); | ||
| 157 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+4, invalidate_interrupt4); | ||
| 158 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+5, invalidate_interrupt5); | ||
| 159 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+6, invalidate_interrupt6); | ||
| 160 | alloc_intr_gate(INVALIDATE_TLB_VECTOR_START+7, invalidate_interrupt7); | ||
| 145 | 161 | ||
| 146 | /* IPI for generic function call */ | 162 | /* IPI for generic function call */ |
| 147 | alloc_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt); | 163 | alloc_intr_gate(CALL_FUNCTION_VECTOR, call_function_interrupt); |
| @@ -169,6 +185,9 @@ void __init native_init_IRQ(void) | |||
| 169 | alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt); | 185 | alloc_intr_gate(THERMAL_APIC_VECTOR, thermal_interrupt); |
| 170 | #endif | 186 | #endif |
| 171 | 187 | ||
| 188 | if (!acpi_ioapic) | ||
| 189 | setup_irq(2, &irq2); | ||
| 190 | |||
| 172 | /* setup after call gates are initialised (usually add in | 191 | /* setup after call gates are initialised (usually add in |
| 173 | * the architecture specific gates) | 192 | * the architecture specific gates) |
| 174 | */ | 193 | */ |
diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c index 10435a120d22..eedfaebe1063 100644 --- a/arch/x86/kernel/kgdb.c +++ b/arch/x86/kernel/kgdb.c | |||
| @@ -46,7 +46,7 @@ | |||
| 46 | #include <asm/apicdef.h> | 46 | #include <asm/apicdef.h> |
| 47 | #include <asm/system.h> | 47 | #include <asm/system.h> |
| 48 | 48 | ||
| 49 | #include <mach_ipi.h> | 49 | #include <asm/apic.h> |
| 50 | 50 | ||
| 51 | /* | 51 | /* |
| 52 | * Put the error code here just in case the user cares: | 52 | * Put the error code here just in case the user cares: |
| @@ -347,7 +347,7 @@ void kgdb_post_primary_code(struct pt_regs *regs, int e_vector, int err_code) | |||
| 347 | */ | 347 | */ |
| 348 | void kgdb_roundup_cpus(unsigned long flags) | 348 | void kgdb_roundup_cpus(unsigned long flags) |
| 349 | { | 349 | { |
| 350 | send_IPI_allbutself(APIC_DM_NMI); | 350 | apic->send_IPI_allbutself(APIC_DM_NMI); |
| 351 | } | 351 | } |
| 352 | #endif | 352 | #endif |
| 353 | 353 | ||
diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c index c43caa3a91f3..6993d51b7fd8 100644 --- a/arch/x86/kernel/machine_kexec_64.c +++ b/arch/x86/kernel/machine_kexec_64.c | |||
| @@ -18,15 +18,6 @@ | |||
| 18 | #include <asm/mmu_context.h> | 18 | #include <asm/mmu_context.h> |
| 19 | #include <asm/io.h> | 19 | #include <asm/io.h> |
| 20 | 20 | ||
| 21 | #define PAGE_ALIGNED __attribute__ ((__aligned__(PAGE_SIZE))) | ||
| 22 | static u64 kexec_pgd[512] PAGE_ALIGNED; | ||
| 23 | static u64 kexec_pud0[512] PAGE_ALIGNED; | ||
| 24 | static u64 kexec_pmd0[512] PAGE_ALIGNED; | ||
| 25 | static u64 kexec_pte0[512] PAGE_ALIGNED; | ||
| 26 | static u64 kexec_pud1[512] PAGE_ALIGNED; | ||
| 27 | static u64 kexec_pmd1[512] PAGE_ALIGNED; | ||
| 28 | static u64 kexec_pte1[512] PAGE_ALIGNED; | ||
| 29 | |||
| 30 | static void init_level2_page(pmd_t *level2p, unsigned long addr) | 21 | static void init_level2_page(pmd_t *level2p, unsigned long addr) |
| 31 | { | 22 | { |
| 32 | unsigned long end_addr; | 23 | unsigned long end_addr; |
| @@ -107,12 +98,65 @@ out: | |||
| 107 | return result; | 98 | return result; |
| 108 | } | 99 | } |
| 109 | 100 | ||
| 101 | static void free_transition_pgtable(struct kimage *image) | ||
| 102 | { | ||
| 103 | free_page((unsigned long)image->arch.pud); | ||
| 104 | free_page((unsigned long)image->arch.pmd); | ||
| 105 | free_page((unsigned long)image->arch.pte); | ||
| 106 | } | ||
| 107 | |||
| 108 | static int init_transition_pgtable(struct kimage *image, pgd_t *pgd) | ||
| 109 | { | ||
| 110 | pud_t *pud; | ||
| 111 | pmd_t *pmd; | ||
| 112 | pte_t *pte; | ||
| 113 | unsigned long vaddr, paddr; | ||
| 114 | int result = -ENOMEM; | ||
| 115 | |||
| 116 | vaddr = (unsigned long)relocate_kernel; | ||
| 117 | paddr = __pa(page_address(image->control_code_page)+PAGE_SIZE); | ||
| 118 | pgd += pgd_index(vaddr); | ||
| 119 | if (!pgd_present(*pgd)) { | ||
| 120 | pud = (pud_t *)get_zeroed_page(GFP_KERNEL); | ||
| 121 | if (!pud) | ||
| 122 | goto err; | ||
| 123 | image->arch.pud = pud; | ||
| 124 | set_pgd(pgd, __pgd(__pa(pud) | _KERNPG_TABLE)); | ||
| 125 | } | ||
| 126 | pud = pud_offset(pgd, vaddr); | ||
| 127 | if (!pud_present(*pud)) { | ||
| 128 | pmd = (pmd_t *)get_zeroed_page(GFP_KERNEL); | ||
| 129 | if (!pmd) | ||
| 130 | goto err; | ||
| 131 | image->arch.pmd = pmd; | ||
| 132 | set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE)); | ||
| 133 | } | ||
| 134 | pmd = pmd_offset(pud, vaddr); | ||
| 135 | if (!pmd_present(*pmd)) { | ||
| 136 | pte = (pte_t *)get_zeroed_page(GFP_KERNEL); | ||
| 137 | if (!pte) | ||
| 138 | goto err; | ||
| 139 | image->arch.pte = pte; | ||
| 140 | set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE)); | ||
| 141 | } | ||
| 142 | pte = pte_offset_kernel(pmd, vaddr); | ||
| 143 | set_pte(pte, pfn_pte(paddr >> PAGE_SHIFT, PAGE_KERNEL_EXEC)); | ||
| 144 | return 0; | ||
| 145 | err: | ||
| 146 | free_transition_pgtable(image); | ||
| 147 | return result; | ||
| 148 | } | ||
| 149 | |||
| 110 | 150 | ||
| 111 | static int init_pgtable(struct kimage *image, unsigned long start_pgtable) | 151 | static int init_pgtable(struct kimage *image, unsigned long start_pgtable) |
| 112 | { | 152 | { |
| 113 | pgd_t *level4p; | 153 | pgd_t *level4p; |
| 154 | int result; | ||
| 114 | level4p = (pgd_t *)__va(start_pgtable); | 155 | level4p = (pgd_t *)__va(start_pgtable); |
| 115 | return init_level4_page(image, level4p, 0, max_pfn << PAGE_SHIFT); | 156 | result = init_level4_page(image, level4p, 0, max_pfn << PAGE_SHIFT); |
| 157 | if (result) | ||
| 158 | return result; | ||
| 159 | return init_transition_pgtable(image, level4p); | ||
| 116 | } | 160 | } |
| 117 | 161 | ||
| 118 | static void set_idt(void *newidt, u16 limit) | 162 | static void set_idt(void *newidt, u16 limit) |
| @@ -174,7 +218,7 @@ int machine_kexec_prepare(struct kimage *image) | |||
| 174 | 218 | ||
| 175 | void machine_kexec_cleanup(struct kimage *image) | 219 | void machine_kexec_cleanup(struct kimage *image) |
| 176 | { | 220 | { |
| 177 | return; | 221 | free_transition_pgtable(image); |
| 178 | } | 222 | } |
| 179 | 223 | ||
| 180 | /* | 224 | /* |
| @@ -195,22 +239,6 @@ void machine_kexec(struct kimage *image) | |||
| 195 | memcpy(control_page, relocate_kernel, PAGE_SIZE); | 239 | memcpy(control_page, relocate_kernel, PAGE_SIZE); |
| 196 | 240 | ||
| 197 | page_list[PA_CONTROL_PAGE] = virt_to_phys(control_page); | 241 | page_list[PA_CONTROL_PAGE] = virt_to_phys(control_page); |
| 198 | page_list[VA_CONTROL_PAGE] = (unsigned long)relocate_kernel; | ||
| 199 | page_list[PA_PGD] = virt_to_phys(&kexec_pgd); | ||
| 200 | page_list[VA_PGD] = (unsigned long)kexec_pgd; | ||
| 201 | page_list[PA_PUD_0] = virt_to_phys(&kexec_pud0); | ||
| 202 | page_list[VA_PUD_0] = (unsigned long)kexec_pud0; | ||
| 203 | page_list[PA_PMD_0] = virt_to_phys(&kexec_pmd0); | ||
| 204 | page_list[VA_PMD_0] = (unsigned long)kexec_pmd0; | ||
| 205 | page_list[PA_PTE_0] = virt_to_phys(&kexec_pte0); | ||
| 206 | page_list[VA_PTE_0] = (unsigned long)kexec_pte0; | ||
| 207 | page_list[PA_PUD_1] = virt_to_phys(&kexec_pud1); | ||
| 208 | page_list[VA_PUD_1] = (unsigned long)kexec_pud1; | ||
| 209 | page_list[PA_PMD_1] = virt_to_phys(&kexec_pmd1); | ||
| 210 | page_list[VA_PMD_1] = (unsigned long)kexec_pmd1; | ||
| 211 | page_list[PA_PTE_1] = virt_to_phys(&kexec_pte1); | ||
| 212 | page_list[VA_PTE_1] = (unsigned long)kexec_pte1; | ||
| 213 | |||
| 214 | page_list[PA_TABLE_PAGE] = | 242 | page_list[PA_TABLE_PAGE] = |
| 215 | (unsigned long)__pa(page_address(image->control_code_page)); | 243 | (unsigned long)__pa(page_address(image->control_code_page)); |
| 216 | 244 | ||
diff --git a/arch/x86/kernel/microcode_intel.c b/arch/x86/kernel/microcode_intel.c index b7f4c929e615..5e9f4fc51385 100644 --- a/arch/x86/kernel/microcode_intel.c +++ b/arch/x86/kernel/microcode_intel.c | |||
| @@ -87,9 +87,9 @@ | |||
| 87 | #include <linux/cpu.h> | 87 | #include <linux/cpu.h> |
| 88 | #include <linux/firmware.h> | 88 | #include <linux/firmware.h> |
| 89 | #include <linux/platform_device.h> | 89 | #include <linux/platform_device.h> |
| 90 | #include <linux/uaccess.h> | ||
| 90 | 91 | ||
| 91 | #include <asm/msr.h> | 92 | #include <asm/msr.h> |
| 92 | #include <asm/uaccess.h> | ||
| 93 | #include <asm/processor.h> | 93 | #include <asm/processor.h> |
| 94 | #include <asm/microcode.h> | 94 | #include <asm/microcode.h> |
| 95 | 95 | ||
| @@ -196,7 +196,7 @@ static inline int update_match_cpu(struct cpu_signature *csig, int sig, int pf) | |||
| 196 | return (!sigmatch(sig, csig->sig, pf, csig->pf)) ? 0 : 1; | 196 | return (!sigmatch(sig, csig->sig, pf, csig->pf)) ? 0 : 1; |
| 197 | } | 197 | } |
| 198 | 198 | ||
| 199 | static inline int | 199 | static inline int |
| 200 | update_match_revision(struct microcode_header_intel *mc_header, int rev) | 200 | update_match_revision(struct microcode_header_intel *mc_header, int rev) |
| 201 | { | 201 | { |
| 202 | return (mc_header->rev <= rev) ? 0 : 1; | 202 | return (mc_header->rev <= rev) ? 0 : 1; |
| @@ -442,8 +442,8 @@ static int request_microcode_fw(int cpu, struct device *device) | |||
| 442 | return ret; | 442 | return ret; |
| 443 | } | 443 | } |
| 444 | 444 | ||
| 445 | ret = generic_load_microcode(cpu, (void*)firmware->data, firmware->size, | 445 | ret = generic_load_microcode(cpu, (void *)firmware->data, |
| 446 | &get_ucode_fw); | 446 | firmware->size, &get_ucode_fw); |
| 447 | 447 | ||
| 448 | release_firmware(firmware); | 448 | release_firmware(firmware); |
| 449 | 449 | ||
| @@ -460,7 +460,7 @@ static int request_microcode_user(int cpu, const void __user *buf, size_t size) | |||
| 460 | /* We should bind the task to the CPU */ | 460 | /* We should bind the task to the CPU */ |
| 461 | BUG_ON(cpu != raw_smp_processor_id()); | 461 | BUG_ON(cpu != raw_smp_processor_id()); |
| 462 | 462 | ||
| 463 | return generic_load_microcode(cpu, (void*)buf, size, &get_ucode_user); | 463 | return generic_load_microcode(cpu, (void *)buf, size, &get_ucode_user); |
| 464 | } | 464 | } |
| 465 | 465 | ||
| 466 | static void microcode_fini_cpu(int cpu) | 466 | static void microcode_fini_cpu(int cpu) |
diff --git a/arch/x86/kernel/module_32.c b/arch/x86/kernel/module_32.c index 3db0a5442eb1..0edd819050e7 100644 --- a/arch/x86/kernel/module_32.c +++ b/arch/x86/kernel/module_32.c | |||
| @@ -42,7 +42,7 @@ void module_free(struct module *mod, void *module_region) | |||
| 42 | { | 42 | { |
| 43 | vfree(module_region); | 43 | vfree(module_region); |
| 44 | /* FIXME: If module_region == mod->init_region, trim exception | 44 | /* FIXME: If module_region == mod->init_region, trim exception |
| 45 | table entries. */ | 45 | table entries. */ |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | /* We don't need anything special. */ | 48 | /* We don't need anything special. */ |
| @@ -113,13 +113,13 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
| 113 | *para = NULL; | 113 | *para = NULL; |
| 114 | char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | 114 | char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; |
| 115 | 115 | ||
| 116 | for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) { | 116 | for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) { |
| 117 | if (!strcmp(".text", secstrings + s->sh_name)) | 117 | if (!strcmp(".text", secstrings + s->sh_name)) |
| 118 | text = s; | 118 | text = s; |
| 119 | if (!strcmp(".altinstructions", secstrings + s->sh_name)) | 119 | if (!strcmp(".altinstructions", secstrings + s->sh_name)) |
| 120 | alt = s; | 120 | alt = s; |
| 121 | if (!strcmp(".smp_locks", secstrings + s->sh_name)) | 121 | if (!strcmp(".smp_locks", secstrings + s->sh_name)) |
| 122 | locks= s; | 122 | locks = s; |
| 123 | if (!strcmp(".parainstructions", secstrings + s->sh_name)) | 123 | if (!strcmp(".parainstructions", secstrings + s->sh_name)) |
| 124 | para = s; | 124 | para = s; |
| 125 | } | 125 | } |
diff --git a/arch/x86/kernel/module_64.c b/arch/x86/kernel/module_64.c index 6ba87830d4b1..c23880b90b5c 100644 --- a/arch/x86/kernel/module_64.c +++ b/arch/x86/kernel/module_64.c | |||
| @@ -30,14 +30,14 @@ | |||
| 30 | #include <asm/page.h> | 30 | #include <asm/page.h> |
| 31 | #include <asm/pgtable.h> | 31 | #include <asm/pgtable.h> |
| 32 | 32 | ||
| 33 | #define DEBUGP(fmt...) | 33 | #define DEBUGP(fmt...) |
| 34 | 34 | ||
| 35 | #ifndef CONFIG_UML | 35 | #ifndef CONFIG_UML |
| 36 | void module_free(struct module *mod, void *module_region) | 36 | void module_free(struct module *mod, void *module_region) |
| 37 | { | 37 | { |
| 38 | vfree(module_region); | 38 | vfree(module_region); |
| 39 | /* FIXME: If module_region == mod->init_region, trim exception | 39 | /* FIXME: If module_region == mod->init_region, trim exception |
| 40 | table entries. */ | 40 | table entries. */ |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | void *module_alloc(unsigned long size) | 43 | void *module_alloc(unsigned long size) |
| @@ -77,7 +77,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
| 77 | Elf64_Rela *rel = (void *)sechdrs[relsec].sh_addr; | 77 | Elf64_Rela *rel = (void *)sechdrs[relsec].sh_addr; |
| 78 | Elf64_Sym *sym; | 78 | Elf64_Sym *sym; |
| 79 | void *loc; | 79 | void *loc; |
| 80 | u64 val; | 80 | u64 val; |
| 81 | 81 | ||
| 82 | DEBUGP("Applying relocate section %u to %u\n", relsec, | 82 | DEBUGP("Applying relocate section %u to %u\n", relsec, |
| 83 | sechdrs[relsec].sh_info); | 83 | sechdrs[relsec].sh_info); |
| @@ -91,11 +91,11 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
| 91 | sym = (Elf64_Sym *)sechdrs[symindex].sh_addr | 91 | sym = (Elf64_Sym *)sechdrs[symindex].sh_addr |
| 92 | + ELF64_R_SYM(rel[i].r_info); | 92 | + ELF64_R_SYM(rel[i].r_info); |
| 93 | 93 | ||
| 94 | DEBUGP("type %d st_value %Lx r_addend %Lx loc %Lx\n", | 94 | DEBUGP("type %d st_value %Lx r_addend %Lx loc %Lx\n", |
| 95 | (int)ELF64_R_TYPE(rel[i].r_info), | 95 | (int)ELF64_R_TYPE(rel[i].r_info), |
| 96 | sym->st_value, rel[i].r_addend, (u64)loc); | 96 | sym->st_value, rel[i].r_addend, (u64)loc); |
| 97 | 97 | ||
| 98 | val = sym->st_value + rel[i].r_addend; | 98 | val = sym->st_value + rel[i].r_addend; |
| 99 | 99 | ||
| 100 | switch (ELF64_R_TYPE(rel[i].r_info)) { | 100 | switch (ELF64_R_TYPE(rel[i].r_info)) { |
| 101 | case R_X86_64_NONE: | 101 | case R_X86_64_NONE: |
| @@ -113,16 +113,16 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
| 113 | if ((s64)val != *(s32 *)loc) | 113 | if ((s64)val != *(s32 *)loc) |
| 114 | goto overflow; | 114 | goto overflow; |
| 115 | break; | 115 | break; |
| 116 | case R_X86_64_PC32: | 116 | case R_X86_64_PC32: |
| 117 | val -= (u64)loc; | 117 | val -= (u64)loc; |
| 118 | *(u32 *)loc = val; | 118 | *(u32 *)loc = val; |
| 119 | #if 0 | 119 | #if 0 |
| 120 | if ((s64)val != *(s32 *)loc) | 120 | if ((s64)val != *(s32 *)loc) |
| 121 | goto overflow; | 121 | goto overflow; |
| 122 | #endif | 122 | #endif |
| 123 | break; | 123 | break; |
| 124 | default: | 124 | default: |
| 125 | printk(KERN_ERR "module %s: Unknown rela relocation: %Lu\n", | 125 | printk(KERN_ERR "module %s: Unknown rela relocation: %llu\n", |
| 126 | me->name, ELF64_R_TYPE(rel[i].r_info)); | 126 | me->name, ELF64_R_TYPE(rel[i].r_info)); |
| 127 | return -ENOEXEC; | 127 | return -ENOEXEC; |
| 128 | } | 128 | } |
| @@ -130,7 +130,7 @@ int apply_relocate_add(Elf64_Shdr *sechdrs, | |||
| 130 | return 0; | 130 | return 0; |
| 131 | 131 | ||
| 132 | overflow: | 132 | overflow: |
| 133 | printk(KERN_ERR "overflow in relocation type %d val %Lx\n", | 133 | printk(KERN_ERR "overflow in relocation type %d val %Lx\n", |
| 134 | (int)ELF64_R_TYPE(rel[i].r_info), val); | 134 | (int)ELF64_R_TYPE(rel[i].r_info), val); |
| 135 | printk(KERN_ERR "`%s' likely not compiled with -mcmodel=kernel\n", | 135 | printk(KERN_ERR "`%s' likely not compiled with -mcmodel=kernel\n", |
| 136 | me->name); | 136 | me->name); |
| @@ -143,13 +143,13 @@ int apply_relocate(Elf_Shdr *sechdrs, | |||
| 143 | unsigned int relsec, | 143 | unsigned int relsec, |
| 144 | struct module *me) | 144 | struct module *me) |
| 145 | { | 145 | { |
| 146 | printk("non add relocation not supported\n"); | 146 | printk(KERN_ERR "non add relocation not supported\n"); |
| 147 | return -ENOSYS; | 147 | return -ENOSYS; |
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | int module_finalize(const Elf_Ehdr *hdr, | 150 | int module_finalize(const Elf_Ehdr *hdr, |
| 151 | const Elf_Shdr *sechdrs, | 151 | const Elf_Shdr *sechdrs, |
| 152 | struct module *me) | 152 | struct module *me) |
| 153 | { | 153 | { |
| 154 | const Elf_Shdr *s, *text = NULL, *alt = NULL, *locks = NULL, | 154 | const Elf_Shdr *s, *text = NULL, *alt = NULL, *locks = NULL, |
| 155 | *para = NULL; | 155 | *para = NULL; |
| @@ -161,7 +161,7 @@ int module_finalize(const Elf_Ehdr *hdr, | |||
| 161 | if (!strcmp(".altinstructions", secstrings + s->sh_name)) | 161 | if (!strcmp(".altinstructions", secstrings + s->sh_name)) |
| 162 | alt = s; | 162 | alt = s; |
| 163 | if (!strcmp(".smp_locks", secstrings + s->sh_name)) | 163 | if (!strcmp(".smp_locks", secstrings + s->sh_name)) |
| 164 | locks= s; | 164 | locks = s; |
| 165 | if (!strcmp(".parainstructions", secstrings + s->sh_name)) | 165 | if (!strcmp(".parainstructions", secstrings + s->sh_name)) |
| 166 | para = s; | 166 | para = s; |
| 167 | } | 167 | } |
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index a649a4ccad43..7f4d2586972e 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * compliant MP-table parsing routines. | 3 | * compliant MP-table parsing routines. |
| 4 | * | 4 | * |
| 5 | * (c) 1995 Alan Cox, Building #3 <alan@lxorguk.ukuu.org.uk> | 5 | * (c) 1995 Alan Cox, Building #3 <alan@lxorguk.ukuu.org.uk> |
| 6 | * (c) 1998, 1999, 2000 Ingo Molnar <mingo@redhat.com> | 6 | * (c) 1998, 1999, 2000, 2009 Ingo Molnar <mingo@redhat.com> |
| 7 | * (c) 2008 Alexey Starikovskiy <astarikovskiy@suse.de> | 7 | * (c) 2008 Alexey Starikovskiy <astarikovskiy@suse.de> |
| 8 | */ | 8 | */ |
| 9 | 9 | ||
| @@ -29,12 +29,7 @@ | |||
| 29 | #include <asm/setup.h> | 29 | #include <asm/setup.h> |
| 30 | #include <asm/smp.h> | 30 | #include <asm/smp.h> |
| 31 | 31 | ||
| 32 | #include <mach_apic.h> | 32 | #include <asm/apic.h> |
| 33 | #ifdef CONFIG_X86_32 | ||
| 34 | #include <mach_apicdef.h> | ||
| 35 | #include <mach_mpparse.h> | ||
| 36 | #endif | ||
| 37 | |||
| 38 | /* | 33 | /* |
| 39 | * Checksum an MP configuration block. | 34 | * Checksum an MP configuration block. |
| 40 | */ | 35 | */ |
| @@ -144,11 +139,11 @@ static void __init MP_ioapic_info(struct mpc_ioapic *m) | |||
| 144 | if (bad_ioapic(m->apicaddr)) | 139 | if (bad_ioapic(m->apicaddr)) |
| 145 | return; | 140 | return; |
| 146 | 141 | ||
| 147 | mp_ioapics[nr_ioapics].mp_apicaddr = m->apicaddr; | 142 | mp_ioapics[nr_ioapics].apicaddr = m->apicaddr; |
| 148 | mp_ioapics[nr_ioapics].mp_apicid = m->apicid; | 143 | mp_ioapics[nr_ioapics].apicid = m->apicid; |
| 149 | mp_ioapics[nr_ioapics].mp_type = m->type; | 144 | mp_ioapics[nr_ioapics].type = m->type; |
| 150 | mp_ioapics[nr_ioapics].mp_apicver = m->apicver; | 145 | mp_ioapics[nr_ioapics].apicver = m->apicver; |
| 151 | mp_ioapics[nr_ioapics].mp_flags = m->flags; | 146 | mp_ioapics[nr_ioapics].flags = m->flags; |
| 152 | nr_ioapics++; | 147 | nr_ioapics++; |
| 153 | } | 148 | } |
| 154 | 149 | ||
| @@ -160,55 +155,55 @@ static void print_MP_intsrc_info(struct mpc_intsrc *m) | |||
| 160 | m->srcbusirq, m->dstapic, m->dstirq); | 155 | m->srcbusirq, m->dstapic, m->dstirq); |
| 161 | } | 156 | } |
| 162 | 157 | ||
| 163 | static void __init print_mp_irq_info(struct mp_config_intsrc *mp_irq) | 158 | static void __init print_mp_irq_info(struct mpc_intsrc *mp_irq) |
| 164 | { | 159 | { |
| 165 | apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x," | 160 | apic_printk(APIC_VERBOSE, "Int: type %d, pol %d, trig %d, bus %02x," |
| 166 | " IRQ %02x, APIC ID %x, APIC INT %02x\n", | 161 | " IRQ %02x, APIC ID %x, APIC INT %02x\n", |
| 167 | mp_irq->mp_irqtype, mp_irq->mp_irqflag & 3, | 162 | mp_irq->irqtype, mp_irq->irqflag & 3, |
| 168 | (mp_irq->mp_irqflag >> 2) & 3, mp_irq->mp_srcbus, | 163 | (mp_irq->irqflag >> 2) & 3, mp_irq->srcbus, |
| 169 | mp_irq->mp_srcbusirq, mp_irq->mp_dstapic, mp_irq->mp_dstirq); | 164 | mp_irq->srcbusirq, mp_irq->dstapic, mp_irq->dstirq); |
| 170 | } | 165 | } |
| 171 | 166 | ||
| 172 | static void __init assign_to_mp_irq(struct mpc_intsrc *m, | 167 | static void __init assign_to_mp_irq(struct mpc_intsrc *m, |
| 173 | struct mp_config_intsrc *mp_irq) | 168 | struct mpc_intsrc *mp_irq) |
| 174 | { | 169 | { |
| 175 | mp_irq->mp_dstapic = m->dstapic; | 170 | mp_irq->dstapic = m->dstapic; |
| 176 | mp_irq->mp_type = m->type; | 171 | mp_irq->type = m->type; |
| 177 | mp_irq->mp_irqtype = m->irqtype; | 172 | mp_irq->irqtype = m->irqtype; |
| 178 | mp_irq->mp_irqflag = m->irqflag; | 173 | mp_irq->irqflag = m->irqflag; |
| 179 | mp_irq->mp_srcbus = m->srcbus; | 174 | mp_irq->srcbus = m->srcbus; |
| 180 | mp_irq->mp_srcbusirq = m->srcbusirq; | 175 | mp_irq->srcbusirq = m->srcbusirq; |
| 181 | mp_irq->mp_dstirq = m->dstirq; | 176 | mp_irq->dstirq = m->dstirq; |
| 182 | } | 177 | } |
| 183 | 178 | ||
| 184 | static void __init assign_to_mpc_intsrc(struct mp_config_intsrc *mp_irq, | 179 | static void __init assign_to_mpc_intsrc(struct mpc_intsrc *mp_irq, |
| 185 | struct mpc_intsrc *m) | 180 | struct mpc_intsrc *m) |
| 186 | { | 181 | { |
| 187 | m->dstapic = mp_irq->mp_dstapic; | 182 | m->dstapic = mp_irq->dstapic; |
| 188 | m->type = mp_irq->mp_type; | 183 | m->type = mp_irq->type; |
| 189 | m->irqtype = mp_irq->mp_irqtype; | 184 | m->irqtype = mp_irq->irqtype; |
| 190 | m->irqflag = mp_irq->mp_irqflag; | 185 | m->irqflag = mp_irq->irqflag; |
| 191 | m->srcbus = mp_irq->mp_srcbus; | 186 | m->srcbus = mp_irq->srcbus; |
| 192 | m->srcbusirq = mp_irq->mp_srcbusirq; | 187 | m->srcbusirq = mp_irq->srcbusirq; |
| 193 | m->dstirq = mp_irq->mp_dstirq; | 188 | m->dstirq = mp_irq->dstirq; |
| 194 | } | 189 | } |
| 195 | 190 | ||
| 196 | static int __init mp_irq_mpc_intsrc_cmp(struct mp_config_intsrc *mp_irq, | 191 | static int __init mp_irq_mpc_intsrc_cmp(struct mpc_intsrc *mp_irq, |
| 197 | struct mpc_intsrc *m) | 192 | struct mpc_intsrc *m) |
| 198 | { | 193 | { |
| 199 | if (mp_irq->mp_dstapic != m->dstapic) | 194 | if (mp_irq->dstapic != m->dstapic) |
| 200 | return 1; | 195 | return 1; |
| 201 | if (mp_irq->mp_type != m->type) | 196 | if (mp_irq->type != m->type) |
| 202 | return 2; | 197 | return 2; |
| 203 | if (mp_irq->mp_irqtype != m->irqtype) | 198 | if (mp_irq->irqtype != m->irqtype) |
| 204 | return 3; | 199 | return 3; |
| 205 | if (mp_irq->mp_irqflag != m->irqflag) | 200 | if (mp_irq->irqflag != m->irqflag) |
| 206 | return 4; | 201 | return 4; |
| 207 | if (mp_irq->mp_srcbus != m->srcbus) | 202 | if (mp_irq->srcbus != m->srcbus) |
| 208 | return 5; | 203 | return 5; |
| 209 | if (mp_irq->mp_srcbusirq != m->srcbusirq) | 204 | if (mp_irq->srcbusirq != m->srcbusirq) |
| 210 | return 6; | 205 | return 6; |
| 211 | if (mp_irq->mp_dstirq != m->dstirq) | 206 | if (mp_irq->dstirq != m->dstirq) |
| 212 | return 7; | 207 | return 7; |
| 213 | 208 | ||
| 214 | return 0; | 209 | return 0; |
| @@ -292,16 +287,7 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) | |||
| 292 | return 0; | 287 | return 0; |
| 293 | 288 | ||
| 294 | #ifdef CONFIG_X86_32 | 289 | #ifdef CONFIG_X86_32 |
| 295 | /* | 290 | generic_mps_oem_check(mpc, oem, str); |
| 296 | * need to make sure summit and es7000's mps_oem_check is safe to be | ||
| 297 | * called early via genericarch 's mps_oem_check | ||
| 298 | */ | ||
| 299 | if (early) { | ||
| 300 | #ifdef CONFIG_X86_NUMAQ | ||
| 301 | numaq_mps_oem_check(mpc, oem, str); | ||
| 302 | #endif | ||
| 303 | } else | ||
| 304 | mps_oem_check(mpc, oem, str); | ||
| 305 | #endif | 291 | #endif |
| 306 | /* save the local APIC address, it might be non-default */ | 292 | /* save the local APIC address, it might be non-default */ |
| 307 | if (!acpi_lapic) | 293 | if (!acpi_lapic) |
| @@ -386,13 +372,13 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) | |||
| 386 | (*x86_quirks->mpc_record)++; | 372 | (*x86_quirks->mpc_record)++; |
| 387 | } | 373 | } |
| 388 | 374 | ||
| 389 | #ifdef CONFIG_X86_GENERICARCH | 375 | #ifdef CONFIG_X86_BIGSMP |
| 390 | generic_bigsmp_probe(); | 376 | generic_bigsmp_probe(); |
| 391 | #endif | 377 | #endif |
| 392 | 378 | ||
| 393 | #ifdef CONFIG_X86_32 | 379 | if (apic->setup_apic_routing) |
| 394 | setup_apic_routing(); | 380 | apic->setup_apic_routing(); |
| 395 | #endif | 381 | |
| 396 | if (!num_processors) | 382 | if (!num_processors) |
| 397 | printk(KERN_ERR "MPTABLE: no processors registered!\n"); | 383 | printk(KERN_ERR "MPTABLE: no processors registered!\n"); |
| 398 | return num_processors; | 384 | return num_processors; |
| @@ -417,7 +403,7 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type) | |||
| 417 | intsrc.type = MP_INTSRC; | 403 | intsrc.type = MP_INTSRC; |
| 418 | intsrc.irqflag = 0; /* conforming */ | 404 | intsrc.irqflag = 0; /* conforming */ |
| 419 | intsrc.srcbus = 0; | 405 | intsrc.srcbus = 0; |
| 420 | intsrc.dstapic = mp_ioapics[0].mp_apicid; | 406 | intsrc.dstapic = mp_ioapics[0].apicid; |
| 421 | 407 | ||
| 422 | intsrc.irqtype = mp_INT; | 408 | intsrc.irqtype = mp_INT; |
| 423 | 409 | ||
| @@ -570,14 +556,14 @@ static inline void __init construct_default_ISA_mptable(int mpc_default_type) | |||
| 570 | } | 556 | } |
| 571 | } | 557 | } |
| 572 | 558 | ||
| 573 | static struct intel_mp_floating *mpf_found; | 559 | static struct mpf_intel *mpf_found; |
| 574 | 560 | ||
| 575 | /* | 561 | /* |
| 576 | * Scan the memory blocks for an SMP configuration block. | 562 | * Scan the memory blocks for an SMP configuration block. |
| 577 | */ | 563 | */ |
| 578 | static void __init __get_smp_config(unsigned int early) | 564 | static void __init __get_smp_config(unsigned int early) |
| 579 | { | 565 | { |
| 580 | struct intel_mp_floating *mpf = mpf_found; | 566 | struct mpf_intel *mpf = mpf_found; |
| 581 | 567 | ||
| 582 | if (!mpf) | 568 | if (!mpf) |
| 583 | return; | 569 | return; |
| @@ -598,9 +584,9 @@ static void __init __get_smp_config(unsigned int early) | |||
| 598 | } | 584 | } |
| 599 | 585 | ||
| 600 | printk(KERN_INFO "Intel MultiProcessor Specification v1.%d\n", | 586 | printk(KERN_INFO "Intel MultiProcessor Specification v1.%d\n", |
| 601 | mpf->mpf_specification); | 587 | mpf->specification); |
| 602 | #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_32) | 588 | #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_32) |
| 603 | if (mpf->mpf_feature2 & (1 << 7)) { | 589 | if (mpf->feature2 & (1 << 7)) { |
| 604 | printk(KERN_INFO " IMCR and PIC compatibility mode.\n"); | 590 | printk(KERN_INFO " IMCR and PIC compatibility mode.\n"); |
| 605 | pic_mode = 1; | 591 | pic_mode = 1; |
| 606 | } else { | 592 | } else { |
| @@ -611,7 +597,7 @@ static void __init __get_smp_config(unsigned int early) | |||
| 611 | /* | 597 | /* |
| 612 | * Now see if we need to read further. | 598 | * Now see if we need to read further. |
| 613 | */ | 599 | */ |
| 614 | if (mpf->mpf_feature1 != 0) { | 600 | if (mpf->feature1 != 0) { |
| 615 | if (early) { | 601 | if (early) { |
| 616 | /* | 602 | /* |
| 617 | * local APIC has default address | 603 | * local APIC has default address |
| @@ -621,16 +607,16 @@ static void __init __get_smp_config(unsigned int early) | |||
| 621 | } | 607 | } |
| 622 | 608 | ||
| 623 | printk(KERN_INFO "Default MP configuration #%d\n", | 609 | printk(KERN_INFO "Default MP configuration #%d\n", |
| 624 | mpf->mpf_feature1); | 610 | mpf->feature1); |
| 625 | construct_default_ISA_mptable(mpf->mpf_feature1); | 611 | construct_default_ISA_mptable(mpf->feature1); |
| 626 | 612 | ||
| 627 | } else if (mpf->mpf_physptr) { | 613 | } else if (mpf->physptr) { |
| 628 | 614 | ||
| 629 | /* | 615 | /* |
| 630 | * Read the physical hardware table. Anything here will | 616 | * Read the physical hardware table. Anything here will |
| 631 | * override the defaults. | 617 | * override the defaults. |
| 632 | */ | 618 | */ |
| 633 | if (!smp_read_mpc(phys_to_virt(mpf->mpf_physptr), early)) { | 619 | if (!smp_read_mpc(phys_to_virt(mpf->physptr), early)) { |
| 634 | #ifdef CONFIG_X86_LOCAL_APIC | 620 | #ifdef CONFIG_X86_LOCAL_APIC |
| 635 | smp_found_config = 0; | 621 | smp_found_config = 0; |
| 636 | #endif | 622 | #endif |
| @@ -688,32 +674,32 @@ static int __init smp_scan_config(unsigned long base, unsigned long length, | |||
| 688 | unsigned reserve) | 674 | unsigned reserve) |
| 689 | { | 675 | { |
| 690 | unsigned int *bp = phys_to_virt(base); | 676 | unsigned int *bp = phys_to_virt(base); |
| 691 | struct intel_mp_floating *mpf; | 677 | struct mpf_intel *mpf; |
| 692 | 678 | ||
| 693 | apic_printk(APIC_VERBOSE, "Scan SMP from %p for %ld bytes.\n", | 679 | apic_printk(APIC_VERBOSE, "Scan SMP from %p for %ld bytes.\n", |
| 694 | bp, length); | 680 | bp, length); |
| 695 | BUILD_BUG_ON(sizeof(*mpf) != 16); | 681 | BUILD_BUG_ON(sizeof(*mpf) != 16); |
| 696 | 682 | ||
| 697 | while (length > 0) { | 683 | while (length > 0) { |
| 698 | mpf = (struct intel_mp_floating *)bp; | 684 | mpf = (struct mpf_intel *)bp; |
| 699 | if ((*bp == SMP_MAGIC_IDENT) && | 685 | if ((*bp == SMP_MAGIC_IDENT) && |
| 700 | (mpf->mpf_length == 1) && | 686 | (mpf->length == 1) && |
| 701 | !mpf_checksum((unsigned char *)bp, 16) && | 687 | !mpf_checksum((unsigned char *)bp, 16) && |
| 702 | ((mpf->mpf_specification == 1) | 688 | ((mpf->specification == 1) |
| 703 | || (mpf->mpf_specification == 4))) { | 689 | || (mpf->specification == 4))) { |
| 704 | #ifdef CONFIG_X86_LOCAL_APIC | 690 | #ifdef CONFIG_X86_LOCAL_APIC |
| 705 | smp_found_config = 1; | 691 | smp_found_config = 1; |
| 706 | #endif | 692 | #endif |
| 707 | mpf_found = mpf; | 693 | mpf_found = mpf; |
| 708 | 694 | ||
| 709 | printk(KERN_INFO "found SMP MP-table at [%p] %08lx\n", | 695 | printk(KERN_INFO "found SMP MP-table at [%p] %llx\n", |
| 710 | mpf, virt_to_phys(mpf)); | 696 | mpf, (u64)virt_to_phys(mpf)); |
| 711 | 697 | ||
| 712 | if (!reserve) | 698 | if (!reserve) |
| 713 | return 1; | 699 | return 1; |
| 714 | reserve_bootmem_generic(virt_to_phys(mpf), PAGE_SIZE, | 700 | reserve_bootmem_generic(virt_to_phys(mpf), PAGE_SIZE, |
| 715 | BOOTMEM_DEFAULT); | 701 | BOOTMEM_DEFAULT); |
| 716 | if (mpf->mpf_physptr) { | 702 | if (mpf->physptr) { |
| 717 | unsigned long size = PAGE_SIZE; | 703 | unsigned long size = PAGE_SIZE; |
| 718 | #ifdef CONFIG_X86_32 | 704 | #ifdef CONFIG_X86_32 |
| 719 | /* | 705 | /* |
| @@ -722,14 +708,14 @@ static int __init smp_scan_config(unsigned long base, unsigned long length, | |||
| 722 | * the bottom is mapped now. | 708 | * the bottom is mapped now. |
| 723 | * PC-9800's MPC table places on the very last | 709 | * PC-9800's MPC table places on the very last |
| 724 | * of physical memory; so that simply reserving | 710 | * of physical memory; so that simply reserving |
| 725 | * PAGE_SIZE from mpg->mpf_physptr yields BUG() | 711 | * PAGE_SIZE from mpf->physptr yields BUG() |
| 726 | * in reserve_bootmem. | 712 | * in reserve_bootmem. |
| 727 | */ | 713 | */ |
| 728 | unsigned long end = max_low_pfn * PAGE_SIZE; | 714 | unsigned long end = max_low_pfn * PAGE_SIZE; |
| 729 | if (mpf->mpf_physptr + size > end) | 715 | if (mpf->physptr + size > end) |
| 730 | size = end - mpf->mpf_physptr; | 716 | size = end - mpf->physptr; |
| 731 | #endif | 717 | #endif |
| 732 | reserve_bootmem_generic(mpf->mpf_physptr, size, | 718 | reserve_bootmem_generic(mpf->physptr, size, |
| 733 | BOOTMEM_DEFAULT); | 719 | BOOTMEM_DEFAULT); |
| 734 | } | 720 | } |
| 735 | 721 | ||
| @@ -809,15 +795,15 @@ static int __init get_MP_intsrc_index(struct mpc_intsrc *m) | |||
| 809 | /* not legacy */ | 795 | /* not legacy */ |
| 810 | 796 | ||
| 811 | for (i = 0; i < mp_irq_entries; i++) { | 797 | for (i = 0; i < mp_irq_entries; i++) { |
| 812 | if (mp_irqs[i].mp_irqtype != mp_INT) | 798 | if (mp_irqs[i].irqtype != mp_INT) |
| 813 | continue; | 799 | continue; |
| 814 | 800 | ||
| 815 | if (mp_irqs[i].mp_irqflag != 0x0f) | 801 | if (mp_irqs[i].irqflag != 0x0f) |
| 816 | continue; | 802 | continue; |
| 817 | 803 | ||
| 818 | if (mp_irqs[i].mp_srcbus != m->srcbus) | 804 | if (mp_irqs[i].srcbus != m->srcbus) |
| 819 | continue; | 805 | continue; |
| 820 | if (mp_irqs[i].mp_srcbusirq != m->srcbusirq) | 806 | if (mp_irqs[i].srcbusirq != m->srcbusirq) |
| 821 | continue; | 807 | continue; |
| 822 | if (irq_used[i]) { | 808 | if (irq_used[i]) { |
| 823 | /* already claimed */ | 809 | /* already claimed */ |
| @@ -922,10 +908,10 @@ static int __init replace_intsrc_all(struct mpc_table *mpc, | |||
| 922 | if (irq_used[i]) | 908 | if (irq_used[i]) |
| 923 | continue; | 909 | continue; |
| 924 | 910 | ||
| 925 | if (mp_irqs[i].mp_irqtype != mp_INT) | 911 | if (mp_irqs[i].irqtype != mp_INT) |
| 926 | continue; | 912 | continue; |
| 927 | 913 | ||
| 928 | if (mp_irqs[i].mp_irqflag != 0x0f) | 914 | if (mp_irqs[i].irqflag != 0x0f) |
| 929 | continue; | 915 | continue; |
| 930 | 916 | ||
| 931 | if (nr_m_spare > 0) { | 917 | if (nr_m_spare > 0) { |
| @@ -1001,7 +987,7 @@ static int __init update_mp_table(void) | |||
| 1001 | { | 987 | { |
| 1002 | char str[16]; | 988 | char str[16]; |
| 1003 | char oem[10]; | 989 | char oem[10]; |
| 1004 | struct intel_mp_floating *mpf; | 990 | struct mpf_intel *mpf; |
| 1005 | struct mpc_table *mpc, *mpc_new; | 991 | struct mpc_table *mpc, *mpc_new; |
| 1006 | 992 | ||
| 1007 | if (!enable_update_mptable) | 993 | if (!enable_update_mptable) |
| @@ -1014,19 +1000,19 @@ static int __init update_mp_table(void) | |||
| 1014 | /* | 1000 | /* |
| 1015 | * Now see if we need to go further. | 1001 | * Now see if we need to go further. |
| 1016 | */ | 1002 | */ |
| 1017 | if (mpf->mpf_feature1 != 0) | 1003 | if (mpf->feature1 != 0) |
| 1018 | return 0; | 1004 | return 0; |
| 1019 | 1005 | ||
| 1020 | if (!mpf->mpf_physptr) | 1006 | if (!mpf->physptr) |
| 1021 | return 0; | 1007 | return 0; |
| 1022 | 1008 | ||
| 1023 | mpc = phys_to_virt(mpf->mpf_physptr); | 1009 | mpc = phys_to_virt(mpf->physptr); |
| 1024 | 1010 | ||
| 1025 | if (!smp_check_mpc(mpc, oem, str)) | 1011 | if (!smp_check_mpc(mpc, oem, str)) |
| 1026 | return 0; | 1012 | return 0; |
| 1027 | 1013 | ||
| 1028 | printk(KERN_INFO "mpf: %lx\n", virt_to_phys(mpf)); | 1014 | printk(KERN_INFO "mpf: %llx\n", (u64)virt_to_phys(mpf)); |
| 1029 | printk(KERN_INFO "mpf_physptr: %x\n", mpf->mpf_physptr); | 1015 | printk(KERN_INFO "physptr: %x\n", mpf->physptr); |
| 1030 | 1016 | ||
| 1031 | if (mpc_new_phys && mpc->length > mpc_new_length) { | 1017 | if (mpc_new_phys && mpc->length > mpc_new_length) { |
| 1032 | mpc_new_phys = 0; | 1018 | mpc_new_phys = 0; |
| @@ -1047,23 +1033,23 @@ static int __init update_mp_table(void) | |||
| 1047 | } | 1033 | } |
| 1048 | printk(KERN_INFO "use in-positon replacing\n"); | 1034 | printk(KERN_INFO "use in-positon replacing\n"); |
| 1049 | } else { | 1035 | } else { |
| 1050 | mpf->mpf_physptr = mpc_new_phys; | 1036 | mpf->physptr = mpc_new_phys; |
| 1051 | mpc_new = phys_to_virt(mpc_new_phys); | 1037 | mpc_new = phys_to_virt(mpc_new_phys); |
| 1052 | memcpy(mpc_new, mpc, mpc->length); | 1038 | memcpy(mpc_new, mpc, mpc->length); |
| 1053 | mpc = mpc_new; | 1039 | mpc = mpc_new; |
| 1054 | /* check if we can modify that */ | 1040 | /* check if we can modify that */ |
| 1055 | if (mpc_new_phys - mpf->mpf_physptr) { | 1041 | if (mpc_new_phys - mpf->physptr) { |
| 1056 | struct intel_mp_floating *mpf_new; | 1042 | struct mpf_intel *mpf_new; |
| 1057 | /* steal 16 bytes from [0, 1k) */ | 1043 | /* steal 16 bytes from [0, 1k) */ |
| 1058 | printk(KERN_INFO "mpf new: %x\n", 0x400 - 16); | 1044 | printk(KERN_INFO "mpf new: %x\n", 0x400 - 16); |
| 1059 | mpf_new = phys_to_virt(0x400 - 16); | 1045 | mpf_new = phys_to_virt(0x400 - 16); |
| 1060 | memcpy(mpf_new, mpf, 16); | 1046 | memcpy(mpf_new, mpf, 16); |
| 1061 | mpf = mpf_new; | 1047 | mpf = mpf_new; |
| 1062 | mpf->mpf_physptr = mpc_new_phys; | 1048 | mpf->physptr = mpc_new_phys; |
| 1063 | } | 1049 | } |
| 1064 | mpf->mpf_checksum = 0; | 1050 | mpf->checksum = 0; |
| 1065 | mpf->mpf_checksum -= mpf_checksum((unsigned char *)mpf, 16); | 1051 | mpf->checksum -= mpf_checksum((unsigned char *)mpf, 16); |
| 1066 | printk(KERN_INFO "mpf_physptr new: %x\n", mpf->mpf_physptr); | 1052 | printk(KERN_INFO "physptr new: %x\n", mpf->physptr); |
| 1067 | } | 1053 | } |
| 1068 | 1054 | ||
| 1069 | /* | 1055 | /* |
diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c index 726266695b2c..3cf3413ec626 100644 --- a/arch/x86/kernel/msr.c +++ b/arch/x86/kernel/msr.c | |||
| @@ -35,10 +35,10 @@ | |||
| 35 | #include <linux/device.h> | 35 | #include <linux/device.h> |
| 36 | #include <linux/cpu.h> | 36 | #include <linux/cpu.h> |
| 37 | #include <linux/notifier.h> | 37 | #include <linux/notifier.h> |
| 38 | #include <linux/uaccess.h> | ||
| 38 | 39 | ||
| 39 | #include <asm/processor.h> | 40 | #include <asm/processor.h> |
| 40 | #include <asm/msr.h> | 41 | #include <asm/msr.h> |
| 41 | #include <asm/uaccess.h> | ||
| 42 | #include <asm/system.h> | 42 | #include <asm/system.h> |
| 43 | 43 | ||
| 44 | static struct class *msr_class; | 44 | static struct class *msr_class; |
diff --git a/arch/x86/kernel/numaq_32.c b/arch/x86/kernel/numaq_32.c deleted file mode 100644 index f2191d4f2717..000000000000 --- a/arch/x86/kernel/numaq_32.c +++ /dev/null | |||
| @@ -1,293 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Written by: Patricia Gaughen, IBM Corporation | ||
| 3 | * | ||
| 4 | * Copyright (C) 2002, IBM Corp. | ||
| 5 | * | ||
| 6 | * All rights reserved. | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License as published by | ||
| 10 | * the Free Software Foundation; either version 2 of the License, or | ||
| 11 | * (at your option) any later version. | ||
| 12 | * | ||
| 13 | * This program is distributed in the hope that it will be useful, but | ||
| 14 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 15 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
| 16 | * NON INFRINGEMENT. See the GNU General Public License for more | ||
| 17 | * details. | ||
| 18 | * | ||
| 19 | * You should have received a copy of the GNU General Public License | ||
| 20 | * along with this program; if not, write to the Free Software | ||
| 21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 22 | * | ||
| 23 | * Send feedback to <gone@us.ibm.com> | ||
| 24 | */ | ||
| 25 | |||
| 26 | #include <linux/mm.h> | ||
| 27 | #include <linux/bootmem.h> | ||
| 28 | #include <linux/mmzone.h> | ||
| 29 | #include <linux/module.h> | ||
| 30 | #include <linux/nodemask.h> | ||
| 31 | #include <asm/numaq.h> | ||
| 32 | #include <asm/topology.h> | ||
| 33 | #include <asm/processor.h> | ||
| 34 | #include <asm/genapic.h> | ||
| 35 | #include <asm/e820.h> | ||
| 36 | #include <asm/setup.h> | ||
| 37 | |||
| 38 | #define MB_TO_PAGES(addr) ((addr) << (20 - PAGE_SHIFT)) | ||
| 39 | |||
| 40 | /* | ||
| 41 | * Function: smp_dump_qct() | ||
| 42 | * | ||
| 43 | * Description: gets memory layout from the quad config table. This | ||
| 44 | * function also updates node_online_map with the nodes (quads) present. | ||
| 45 | */ | ||
| 46 | static void __init smp_dump_qct(void) | ||
| 47 | { | ||
| 48 | int node; | ||
| 49 | struct eachquadmem *eq; | ||
| 50 | struct sys_cfg_data *scd = | ||
| 51 | (struct sys_cfg_data *)__va(SYS_CFG_DATA_PRIV_ADDR); | ||
| 52 | |||
| 53 | nodes_clear(node_online_map); | ||
| 54 | for_each_node(node) { | ||
| 55 | if (scd->quads_present31_0 & (1 << node)) { | ||
| 56 | node_set_online(node); | ||
| 57 | eq = &scd->eq[node]; | ||
| 58 | /* Convert to pages */ | ||
| 59 | node_start_pfn[node] = MB_TO_PAGES( | ||
| 60 | eq->hi_shrd_mem_start - eq->priv_mem_size); | ||
| 61 | node_end_pfn[node] = MB_TO_PAGES( | ||
| 62 | eq->hi_shrd_mem_start + eq->hi_shrd_mem_size); | ||
| 63 | |||
| 64 | e820_register_active_regions(node, node_start_pfn[node], | ||
| 65 | node_end_pfn[node]); | ||
| 66 | memory_present(node, | ||
| 67 | node_start_pfn[node], node_end_pfn[node]); | ||
| 68 | node_remap_size[node] = node_memmap_size_bytes(node, | ||
| 69 | node_start_pfn[node], | ||
| 70 | node_end_pfn[node]); | ||
| 71 | } | ||
| 72 | } | ||
| 73 | } | ||
| 74 | |||
| 75 | |||
| 76 | void __cpuinit numaq_tsc_disable(void) | ||
| 77 | { | ||
| 78 | if (!found_numaq) | ||
| 79 | return; | ||
| 80 | |||
| 81 | if (num_online_nodes() > 1) { | ||
| 82 | printk(KERN_DEBUG "NUMAQ: disabling TSC\n"); | ||
| 83 | setup_clear_cpu_cap(X86_FEATURE_TSC); | ||
| 84 | } | ||
| 85 | } | ||
| 86 | |||
| 87 | static int __init numaq_pre_time_init(void) | ||
| 88 | { | ||
| 89 | numaq_tsc_disable(); | ||
| 90 | return 0; | ||
| 91 | } | ||
| 92 | |||
| 93 | int found_numaq; | ||
| 94 | /* | ||
| 95 | * Have to match translation table entries to main table entries by counter | ||
| 96 | * hence the mpc_record variable .... can't see a less disgusting way of | ||
| 97 | * doing this .... | ||
| 98 | */ | ||
| 99 | struct mpc_config_translation { | ||
| 100 | unsigned char mpc_type; | ||
| 101 | unsigned char trans_len; | ||
| 102 | unsigned char trans_type; | ||
| 103 | unsigned char trans_quad; | ||
| 104 | unsigned char trans_global; | ||
| 105 | unsigned char trans_local; | ||
| 106 | unsigned short trans_reserved; | ||
| 107 | }; | ||
| 108 | |||
| 109 | /* x86_quirks member */ | ||
| 110 | static int mpc_record; | ||
| 111 | static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] | ||
| 112 | __cpuinitdata; | ||
| 113 | |||
| 114 | static inline int generate_logical_apicid(int quad, int phys_apicid) | ||
| 115 | { | ||
| 116 | return (quad << 4) + (phys_apicid ? phys_apicid << 1 : 1); | ||
| 117 | } | ||
| 118 | |||
| 119 | /* x86_quirks member */ | ||
| 120 | static int mpc_apic_id(struct mpc_cpu *m) | ||
| 121 | { | ||
| 122 | int quad = translation_table[mpc_record]->trans_quad; | ||
| 123 | int logical_apicid = generate_logical_apicid(quad, m->apicid); | ||
| 124 | |||
| 125 | printk(KERN_DEBUG "Processor #%d %u:%u APIC version %d (quad %d, apic %d)\n", | ||
| 126 | m->apicid, (m->cpufeature & CPU_FAMILY_MASK) >> 8, | ||
| 127 | (m->cpufeature & CPU_MODEL_MASK) >> 4, | ||
| 128 | m->apicver, quad, logical_apicid); | ||
| 129 | return logical_apicid; | ||
| 130 | } | ||
| 131 | |||
| 132 | int mp_bus_id_to_node[MAX_MP_BUSSES]; | ||
| 133 | |||
| 134 | int mp_bus_id_to_local[MAX_MP_BUSSES]; | ||
| 135 | |||
| 136 | /* x86_quirks member */ | ||
| 137 | static void mpc_oem_bus_info(struct mpc_bus *m, char *name) | ||
| 138 | { | ||
| 139 | int quad = translation_table[mpc_record]->trans_quad; | ||
| 140 | int local = translation_table[mpc_record]->trans_local; | ||
| 141 | |||
| 142 | mp_bus_id_to_node[m->busid] = quad; | ||
| 143 | mp_bus_id_to_local[m->busid] = local; | ||
| 144 | printk(KERN_INFO "Bus #%d is %s (node %d)\n", | ||
| 145 | m->busid, name, quad); | ||
| 146 | } | ||
| 147 | |||
| 148 | int quad_local_to_mp_bus_id [NR_CPUS/4][4]; | ||
| 149 | |||
| 150 | /* x86_quirks member */ | ||
| 151 | static void mpc_oem_pci_bus(struct mpc_bus *m) | ||
| 152 | { | ||
| 153 | int quad = translation_table[mpc_record]->trans_quad; | ||
| 154 | int local = translation_table[mpc_record]->trans_local; | ||
| 155 | |||
| 156 | quad_local_to_mp_bus_id[quad][local] = m->busid; | ||
| 157 | } | ||
| 158 | |||
| 159 | static void __init MP_translation_info(struct mpc_config_translation *m) | ||
| 160 | { | ||
| 161 | printk(KERN_INFO | ||
| 162 | "Translation: record %d, type %d, quad %d, global %d, local %d\n", | ||
| 163 | mpc_record, m->trans_type, m->trans_quad, m->trans_global, | ||
| 164 | m->trans_local); | ||
| 165 | |||
| 166 | if (mpc_record >= MAX_MPC_ENTRY) | ||
| 167 | printk(KERN_ERR "MAX_MPC_ENTRY exceeded!\n"); | ||
| 168 | else | ||
| 169 | translation_table[mpc_record] = m; /* stash this for later */ | ||
| 170 | if (m->trans_quad < MAX_NUMNODES && !node_online(m->trans_quad)) | ||
| 171 | node_set_online(m->trans_quad); | ||
| 172 | } | ||
| 173 | |||
| 174 | static int __init mpf_checksum(unsigned char *mp, int len) | ||
| 175 | { | ||
| 176 | int sum = 0; | ||
| 177 | |||
| 178 | while (len--) | ||
| 179 | sum += *mp++; | ||
| 180 | |||
| 181 | return sum & 0xFF; | ||
| 182 | } | ||
| 183 | |||
| 184 | /* | ||
| 185 | * Read/parse the MPC oem tables | ||
| 186 | */ | ||
| 187 | |||
| 188 | static void __init smp_read_mpc_oem(struct mpc_oemtable *oemtable, | ||
| 189 | unsigned short oemsize) | ||
| 190 | { | ||
| 191 | int count = sizeof(*oemtable); /* the header size */ | ||
| 192 | unsigned char *oemptr = ((unsigned char *)oemtable) + count; | ||
| 193 | |||
| 194 | mpc_record = 0; | ||
| 195 | printk(KERN_INFO "Found an OEM MPC table at %8p - parsing it ... \n", | ||
| 196 | oemtable); | ||
| 197 | if (memcmp(oemtable->signature, MPC_OEM_SIGNATURE, 4)) { | ||
| 198 | printk(KERN_WARNING | ||
| 199 | "SMP mpc oemtable: bad signature [%c%c%c%c]!\n", | ||
| 200 | oemtable->signature[0], oemtable->signature[1], | ||
| 201 | oemtable->signature[2], oemtable->signature[3]); | ||
| 202 | return; | ||
| 203 | } | ||
| 204 | if (mpf_checksum((unsigned char *)oemtable, oemtable->length)) { | ||
| 205 | printk(KERN_WARNING "SMP oem mptable: checksum error!\n"); | ||
| 206 | return; | ||
| 207 | } | ||
| 208 | while (count < oemtable->length) { | ||
| 209 | switch (*oemptr) { | ||
| 210 | case MP_TRANSLATION: | ||
| 211 | { | ||
| 212 | struct mpc_config_translation *m = | ||
| 213 | (struct mpc_config_translation *)oemptr; | ||
| 214 | MP_translation_info(m); | ||
| 215 | oemptr += sizeof(*m); | ||
| 216 | count += sizeof(*m); | ||
| 217 | ++mpc_record; | ||
| 218 | break; | ||
| 219 | } | ||
| 220 | default: | ||
| 221 | { | ||
| 222 | printk(KERN_WARNING | ||
| 223 | "Unrecognised OEM table entry type! - %d\n", | ||
| 224 | (int)*oemptr); | ||
| 225 | return; | ||
| 226 | } | ||
| 227 | } | ||
| 228 | } | ||
| 229 | } | ||
| 230 | |||
| 231 | static int __init numaq_setup_ioapic_ids(void) | ||
| 232 | { | ||
| 233 | /* so can skip it */ | ||
| 234 | return 1; | ||
| 235 | } | ||
| 236 | |||
| 237 | static int __init numaq_update_genapic(void) | ||
| 238 | { | ||
| 239 | genapic->wakeup_cpu = wakeup_secondary_cpu_via_nmi; | ||
| 240 | |||
| 241 | return 0; | ||
| 242 | } | ||
| 243 | |||
| 244 | static struct x86_quirks numaq_x86_quirks __initdata = { | ||
| 245 | .arch_pre_time_init = numaq_pre_time_init, | ||
| 246 | .arch_time_init = NULL, | ||
| 247 | .arch_pre_intr_init = NULL, | ||
| 248 | .arch_memory_setup = NULL, | ||
| 249 | .arch_intr_init = NULL, | ||
| 250 | .arch_trap_init = NULL, | ||
| 251 | .mach_get_smp_config = NULL, | ||
| 252 | .mach_find_smp_config = NULL, | ||
| 253 | .mpc_record = &mpc_record, | ||
| 254 | .mpc_apic_id = mpc_apic_id, | ||
| 255 | .mpc_oem_bus_info = mpc_oem_bus_info, | ||
| 256 | .mpc_oem_pci_bus = mpc_oem_pci_bus, | ||
| 257 | .smp_read_mpc_oem = smp_read_mpc_oem, | ||
| 258 | .setup_ioapic_ids = numaq_setup_ioapic_ids, | ||
| 259 | .update_genapic = numaq_update_genapic, | ||
| 260 | }; | ||
| 261 | |||
| 262 | void numaq_mps_oem_check(struct mpc_table *mpc, char *oem, char *productid) | ||
| 263 | { | ||
| 264 | if (strncmp(oem, "IBM NUMA", 8)) | ||
| 265 | printk("Warning! Not a NUMA-Q system!\n"); | ||
| 266 | else | ||
| 267 | found_numaq = 1; | ||
| 268 | } | ||
| 269 | |||
| 270 | static __init void early_check_numaq(void) | ||
| 271 | { | ||
| 272 | /* | ||
| 273 | * Find possible boot-time SMP configuration: | ||
| 274 | */ | ||
| 275 | early_find_smp_config(); | ||
| 276 | /* | ||
| 277 | * get boot-time SMP configuration: | ||
| 278 | */ | ||
| 279 | if (smp_found_config) | ||
| 280 | early_get_smp_config(); | ||
| 281 | |||
| 282 | if (found_numaq) | ||
| 283 | x86_quirks = &numaq_x86_quirks; | ||
| 284 | } | ||
| 285 | |||
| 286 | int __init get_memcfg_numaq(void) | ||
| 287 | { | ||
| 288 | early_check_numaq(); | ||
| 289 | if (!found_numaq) | ||
| 290 | return 0; | ||
| 291 | smp_dump_qct(); | ||
| 292 | return 1; | ||
| 293 | } | ||
diff --git a/arch/x86/kernel/paravirt-spinlocks.c b/arch/x86/kernel/paravirt-spinlocks.c index 95777b0faa73..3a7c5a44082e 100644 --- a/arch/x86/kernel/paravirt-spinlocks.c +++ b/arch/x86/kernel/paravirt-spinlocks.c | |||
| @@ -26,13 +26,3 @@ struct pv_lock_ops pv_lock_ops = { | |||
| 26 | }; | 26 | }; |
| 27 | EXPORT_SYMBOL(pv_lock_ops); | 27 | EXPORT_SYMBOL(pv_lock_ops); |
| 28 | 28 | ||
| 29 | void __init paravirt_use_bytelocks(void) | ||
| 30 | { | ||
| 31 | #ifdef CONFIG_SMP | ||
| 32 | pv_lock_ops.spin_is_locked = __byte_spin_is_locked; | ||
| 33 | pv_lock_ops.spin_is_contended = __byte_spin_is_contended; | ||
| 34 | pv_lock_ops.spin_lock = __byte_spin_lock; | ||
| 35 | pv_lock_ops.spin_trylock = __byte_spin_trylock; | ||
| 36 | pv_lock_ops.spin_unlock = __byte_spin_unlock; | ||
| 37 | #endif | ||
| 38 | } | ||
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index c6520a4e85d4..6dc4dca255e4 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c | |||
| @@ -44,6 +44,17 @@ void _paravirt_nop(void) | |||
| 44 | { | 44 | { |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | /* identity function, which can be inlined */ | ||
| 48 | u32 _paravirt_ident_32(u32 x) | ||
| 49 | { | ||
| 50 | return x; | ||
| 51 | } | ||
| 52 | |||
| 53 | u64 _paravirt_ident_64(u64 x) | ||
| 54 | { | ||
| 55 | return x; | ||
| 56 | } | ||
| 57 | |||
| 47 | static void __init default_banner(void) | 58 | static void __init default_banner(void) |
| 48 | { | 59 | { |
| 49 | printk(KERN_INFO "Booting paravirtualized kernel on %s\n", | 60 | printk(KERN_INFO "Booting paravirtualized kernel on %s\n", |
| @@ -138,9 +149,16 @@ unsigned paravirt_patch_default(u8 type, u16 clobbers, void *insnbuf, | |||
| 138 | if (opfunc == NULL) | 149 | if (opfunc == NULL) |
| 139 | /* If there's no function, patch it with a ud2a (BUG) */ | 150 | /* If there's no function, patch it with a ud2a (BUG) */ |
| 140 | ret = paravirt_patch_insns(insnbuf, len, ud2a, ud2a+sizeof(ud2a)); | 151 | ret = paravirt_patch_insns(insnbuf, len, ud2a, ud2a+sizeof(ud2a)); |
| 141 | else if (opfunc == paravirt_nop) | 152 | else if (opfunc == _paravirt_nop) |
| 142 | /* If the operation is a nop, then nop the callsite */ | 153 | /* If the operation is a nop, then nop the callsite */ |
| 143 | ret = paravirt_patch_nop(); | 154 | ret = paravirt_patch_nop(); |
| 155 | |||
| 156 | /* identity functions just return their single argument */ | ||
| 157 | else if (opfunc == _paravirt_ident_32) | ||
| 158 | ret = paravirt_patch_ident_32(insnbuf, len); | ||
| 159 | else if (opfunc == _paravirt_ident_64) | ||
| 160 | ret = paravirt_patch_ident_64(insnbuf, len); | ||
| 161 | |||
| 144 | else if (type == PARAVIRT_PATCH(pv_cpu_ops.iret) || | 162 | else if (type == PARAVIRT_PATCH(pv_cpu_ops.iret) || |
| 145 | type == PARAVIRT_PATCH(pv_cpu_ops.irq_enable_sysexit) || | 163 | type == PARAVIRT_PATCH(pv_cpu_ops.irq_enable_sysexit) || |
| 146 | type == PARAVIRT_PATCH(pv_cpu_ops.usergs_sysret32) || | 164 | type == PARAVIRT_PATCH(pv_cpu_ops.usergs_sysret32) || |
| @@ -318,10 +336,10 @@ struct pv_time_ops pv_time_ops = { | |||
| 318 | 336 | ||
| 319 | struct pv_irq_ops pv_irq_ops = { | 337 | struct pv_irq_ops pv_irq_ops = { |
| 320 | .init_IRQ = native_init_IRQ, | 338 | .init_IRQ = native_init_IRQ, |
| 321 | .save_fl = native_save_fl, | 339 | .save_fl = __PV_IS_CALLEE_SAVE(native_save_fl), |
| 322 | .restore_fl = native_restore_fl, | 340 | .restore_fl = __PV_IS_CALLEE_SAVE(native_restore_fl), |
| 323 | .irq_disable = native_irq_disable, | 341 | .irq_disable = __PV_IS_CALLEE_SAVE(native_irq_disable), |
| 324 | .irq_enable = native_irq_enable, | 342 | .irq_enable = __PV_IS_CALLEE_SAVE(native_irq_enable), |
| 325 | .safe_halt = native_safe_halt, | 343 | .safe_halt = native_safe_halt, |
| 326 | .halt = native_halt, | 344 | .halt = native_halt, |
| 327 | #ifdef CONFIG_X86_64 | 345 | #ifdef CONFIG_X86_64 |
| @@ -399,6 +417,14 @@ struct pv_apic_ops pv_apic_ops = { | |||
| 399 | #endif | 417 | #endif |
| 400 | }; | 418 | }; |
| 401 | 419 | ||
| 420 | #if defined(CONFIG_X86_32) && !defined(CONFIG_X86_PAE) | ||
| 421 | /* 32-bit pagetable entries */ | ||
| 422 | #define PTE_IDENT __PV_IS_CALLEE_SAVE(_paravirt_ident_32) | ||
| 423 | #else | ||
| 424 | /* 64-bit pagetable entries */ | ||
| 425 | #define PTE_IDENT __PV_IS_CALLEE_SAVE(_paravirt_ident_64) | ||
| 426 | #endif | ||
| 427 | |||
| 402 | struct pv_mmu_ops pv_mmu_ops = { | 428 | struct pv_mmu_ops pv_mmu_ops = { |
| 403 | #ifndef CONFIG_X86_64 | 429 | #ifndef CONFIG_X86_64 |
| 404 | .pagetable_setup_start = native_pagetable_setup_start, | 430 | .pagetable_setup_start = native_pagetable_setup_start, |
| @@ -450,22 +476,23 @@ struct pv_mmu_ops pv_mmu_ops = { | |||
| 450 | .pmd_clear = native_pmd_clear, | 476 | .pmd_clear = native_pmd_clear, |
| 451 | #endif | 477 | #endif |
| 452 | .set_pud = native_set_pud, | 478 | .set_pud = native_set_pud, |
| 453 | .pmd_val = native_pmd_val, | 479 | |
| 454 | .make_pmd = native_make_pmd, | 480 | .pmd_val = PTE_IDENT, |
| 481 | .make_pmd = PTE_IDENT, | ||
| 455 | 482 | ||
| 456 | #if PAGETABLE_LEVELS == 4 | 483 | #if PAGETABLE_LEVELS == 4 |
| 457 | .pud_val = native_pud_val, | 484 | .pud_val = PTE_IDENT, |
| 458 | .make_pud = native_make_pud, | 485 | .make_pud = PTE_IDENT, |
| 486 | |||
| 459 | .set_pgd = native_set_pgd, | 487 | .set_pgd = native_set_pgd, |
| 460 | #endif | 488 | #endif |
| 461 | #endif /* PAGETABLE_LEVELS >= 3 */ | 489 | #endif /* PAGETABLE_LEVELS >= 3 */ |
| 462 | 490 | ||
| 463 | .pte_val = native_pte_val, | 491 | .pte_val = PTE_IDENT, |
| 464 | .pte_flags = native_pte_flags, | 492 | .pgd_val = PTE_IDENT, |
| 465 | .pgd_val = native_pgd_val, | ||
| 466 | 493 | ||
| 467 | .make_pte = native_make_pte, | 494 | .make_pte = PTE_IDENT, |
| 468 | .make_pgd = native_make_pgd, | 495 | .make_pgd = PTE_IDENT, |
| 469 | 496 | ||
| 470 | .dup_mmap = paravirt_nop, | 497 | .dup_mmap = paravirt_nop, |
| 471 | .exit_mmap = paravirt_nop, | 498 | .exit_mmap = paravirt_nop, |
diff --git a/arch/x86/kernel/paravirt_patch_32.c b/arch/x86/kernel/paravirt_patch_32.c index 9fe644f4861d..d9f32e6d6ab6 100644 --- a/arch/x86/kernel/paravirt_patch_32.c +++ b/arch/x86/kernel/paravirt_patch_32.c | |||
| @@ -12,6 +12,18 @@ DEF_NATIVE(pv_mmu_ops, read_cr3, "mov %cr3, %eax"); | |||
| 12 | DEF_NATIVE(pv_cpu_ops, clts, "clts"); | 12 | DEF_NATIVE(pv_cpu_ops, clts, "clts"); |
| 13 | DEF_NATIVE(pv_cpu_ops, read_tsc, "rdtsc"); | 13 | DEF_NATIVE(pv_cpu_ops, read_tsc, "rdtsc"); |
| 14 | 14 | ||
| 15 | unsigned paravirt_patch_ident_32(void *insnbuf, unsigned len) | ||
| 16 | { | ||
| 17 | /* arg in %eax, return in %eax */ | ||
| 18 | return 0; | ||
| 19 | } | ||
| 20 | |||
| 21 | unsigned paravirt_patch_ident_64(void *insnbuf, unsigned len) | ||
| 22 | { | ||
| 23 | /* arg in %edx:%eax, return in %edx:%eax */ | ||
| 24 | return 0; | ||
| 25 | } | ||
| 26 | |||
| 15 | unsigned native_patch(u8 type, u16 clobbers, void *ibuf, | 27 | unsigned native_patch(u8 type, u16 clobbers, void *ibuf, |
| 16 | unsigned long addr, unsigned len) | 28 | unsigned long addr, unsigned len) |
| 17 | { | 29 | { |
diff --git a/arch/x86/kernel/paravirt_patch_64.c b/arch/x86/kernel/paravirt_patch_64.c index 061d01df9ae6..3f08f34f93eb 100644 --- a/arch/x86/kernel/paravirt_patch_64.c +++ b/arch/x86/kernel/paravirt_patch_64.c | |||
| @@ -19,6 +19,21 @@ DEF_NATIVE(pv_cpu_ops, usergs_sysret64, "swapgs; sysretq"); | |||
| 19 | DEF_NATIVE(pv_cpu_ops, usergs_sysret32, "swapgs; sysretl"); | 19 | DEF_NATIVE(pv_cpu_ops, usergs_sysret32, "swapgs; sysretl"); |
| 20 | DEF_NATIVE(pv_cpu_ops, swapgs, "swapgs"); | 20 | DEF_NATIVE(pv_cpu_ops, swapgs, "swapgs"); |
| 21 | 21 | ||
| 22 | DEF_NATIVE(, mov32, "mov %edi, %eax"); | ||
| 23 | DEF_NATIVE(, mov64, "mov %rdi, %rax"); | ||
| 24 | |||
| 25 | unsigned paravirt_patch_ident_32(void *insnbuf, unsigned len) | ||
| 26 | { | ||
| 27 | return paravirt_patch_insns(insnbuf, len, | ||
| 28 | start__mov32, end__mov32); | ||
| 29 | } | ||
| 30 | |||
| 31 | unsigned paravirt_patch_ident_64(void *insnbuf, unsigned len) | ||
| 32 | { | ||
| 33 | return paravirt_patch_insns(insnbuf, len, | ||
| 34 | start__mov64, end__mov64); | ||
| 35 | } | ||
| 36 | |||
| 22 | unsigned native_patch(u8 type, u16 clobbers, void *ibuf, | 37 | unsigned native_patch(u8 type, u16 clobbers, void *ibuf, |
| 23 | unsigned long addr, unsigned len) | 38 | unsigned long addr, unsigned len) |
| 24 | { | 39 | { |
diff --git a/arch/x86/kernel/probe_roms_32.c b/arch/x86/kernel/probe_roms_32.c index 675a48c404a5..071e7fea42e5 100644 --- a/arch/x86/kernel/probe_roms_32.c +++ b/arch/x86/kernel/probe_roms_32.c | |||
| @@ -18,7 +18,7 @@ | |||
| 18 | #include <asm/setup.h> | 18 | #include <asm/setup.h> |
| 19 | #include <asm/sections.h> | 19 | #include <asm/sections.h> |
| 20 | #include <asm/io.h> | 20 | #include <asm/io.h> |
| 21 | #include <setup_arch.h> | 21 | #include <asm/setup_arch.h> |
| 22 | 22 | ||
| 23 | static struct resource system_rom_resource = { | 23 | static struct resource system_rom_resource = { |
| 24 | .name = "System ROM", | 24 | .name = "System ROM", |
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 6d12f7e37f8c..87b69d4fac16 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
| @@ -350,7 +350,7 @@ static void c1e_idle(void) | |||
| 350 | 350 | ||
| 351 | void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) | 351 | void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) |
| 352 | { | 352 | { |
| 353 | #ifdef CONFIG_X86_SMP | 353 | #ifdef CONFIG_SMP |
| 354 | if (pm_idle == poll_idle && smp_num_siblings > 1) { | 354 | if (pm_idle == poll_idle && smp_num_siblings > 1) { |
| 355 | printk(KERN_WARNING "WARNING: polling idle and HT enabled," | 355 | printk(KERN_WARNING "WARNING: polling idle and HT enabled," |
| 356 | " performance may degrade.\n"); | 356 | " performance may degrade.\n"); |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index bd4da2af08ae..646da41a620a 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | #include <stdarg.h> | 12 | #include <stdarg.h> |
| 13 | 13 | ||
| 14 | #include <linux/stackprotector.h> | ||
| 14 | #include <linux/cpu.h> | 15 | #include <linux/cpu.h> |
| 15 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
| 16 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
| @@ -66,9 +67,6 @@ asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); | |||
| 66 | DEFINE_PER_CPU(struct task_struct *, current_task) = &init_task; | 67 | DEFINE_PER_CPU(struct task_struct *, current_task) = &init_task; |
| 67 | EXPORT_PER_CPU_SYMBOL(current_task); | 68 | EXPORT_PER_CPU_SYMBOL(current_task); |
| 68 | 69 | ||
| 69 | DEFINE_PER_CPU(int, cpu_number); | ||
| 70 | EXPORT_PER_CPU_SYMBOL(cpu_number); | ||
| 71 | |||
| 72 | /* | 70 | /* |
| 73 | * Return saved PC of a blocked thread. | 71 | * Return saved PC of a blocked thread. |
| 74 | */ | 72 | */ |
| @@ -94,6 +92,15 @@ void cpu_idle(void) | |||
| 94 | { | 92 | { |
| 95 | int cpu = smp_processor_id(); | 93 | int cpu = smp_processor_id(); |
| 96 | 94 | ||
| 95 | /* | ||
| 96 | * If we're the non-boot CPU, nothing set the stack canary up | ||
| 97 | * for us. CPU0 already has it initialized but no harm in | ||
| 98 | * doing it again. This is a good place for updating it, as | ||
| 99 | * we wont ever return from this function (so the invalid | ||
| 100 | * canaries already on the stack wont ever trigger). | ||
| 101 | */ | ||
| 102 | boot_init_stack_canary(); | ||
| 103 | |||
| 97 | current_thread_info()->status |= TS_POLLING; | 104 | current_thread_info()->status |= TS_POLLING; |
| 98 | 105 | ||
| 99 | /* endless idle loop with no priority at all */ | 106 | /* endless idle loop with no priority at all */ |
| @@ -108,7 +115,6 @@ void cpu_idle(void) | |||
| 108 | play_dead(); | 115 | play_dead(); |
| 109 | 116 | ||
| 110 | local_irq_disable(); | 117 | local_irq_disable(); |
| 111 | __get_cpu_var(irq_stat).idle_timestamp = jiffies; | ||
| 112 | /* Don't trace irqs off for idle */ | 118 | /* Don't trace irqs off for idle */ |
| 113 | stop_critical_timings(); | 119 | stop_critical_timings(); |
| 114 | pm_idle(); | 120 | pm_idle(); |
| @@ -132,7 +138,7 @@ void __show_regs(struct pt_regs *regs, int all) | |||
| 132 | if (user_mode_vm(regs)) { | 138 | if (user_mode_vm(regs)) { |
| 133 | sp = regs->sp; | 139 | sp = regs->sp; |
| 134 | ss = regs->ss & 0xffff; | 140 | ss = regs->ss & 0xffff; |
| 135 | savesegment(gs, gs); | 141 | gs = get_user_gs(regs); |
| 136 | } else { | 142 | } else { |
| 137 | sp = (unsigned long) (®s->sp); | 143 | sp = (unsigned long) (®s->sp); |
| 138 | savesegment(ss, ss); | 144 | savesegment(ss, ss); |
| @@ -213,6 +219,7 @@ int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) | |||
| 213 | regs.ds = __USER_DS; | 219 | regs.ds = __USER_DS; |
| 214 | regs.es = __USER_DS; | 220 | regs.es = __USER_DS; |
| 215 | regs.fs = __KERNEL_PERCPU; | 221 | regs.fs = __KERNEL_PERCPU; |
| 222 | regs.gs = __KERNEL_STACK_CANARY; | ||
| 216 | regs.orig_ax = -1; | 223 | regs.orig_ax = -1; |
| 217 | regs.ip = (unsigned long) kernel_thread_helper; | 224 | regs.ip = (unsigned long) kernel_thread_helper; |
| 218 | regs.cs = __KERNEL_CS | get_kernel_rpl(); | 225 | regs.cs = __KERNEL_CS | get_kernel_rpl(); |
| @@ -305,7 +312,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, | |||
| 305 | 312 | ||
| 306 | p->thread.ip = (unsigned long) ret_from_fork; | 313 | p->thread.ip = (unsigned long) ret_from_fork; |
| 307 | 314 | ||
| 308 | savesegment(gs, p->thread.gs); | 315 | task_user_gs(p) = get_user_gs(regs); |
| 309 | 316 | ||
| 310 | tsk = current; | 317 | tsk = current; |
| 311 | if (unlikely(test_tsk_thread_flag(tsk, TIF_IO_BITMAP))) { | 318 | if (unlikely(test_tsk_thread_flag(tsk, TIF_IO_BITMAP))) { |
| @@ -343,7 +350,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, | |||
| 343 | void | 350 | void |
| 344 | start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) | 351 | start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) |
| 345 | { | 352 | { |
| 346 | __asm__("movl %0, %%gs" : : "r"(0)); | 353 | set_user_gs(regs, 0); |
| 347 | regs->fs = 0; | 354 | regs->fs = 0; |
| 348 | set_fs(USER_DS); | 355 | set_fs(USER_DS); |
| 349 | regs->ds = __USER_DS; | 356 | regs->ds = __USER_DS; |
| @@ -540,7 +547,7 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 540 | * used %fs or %gs (it does not today), or if the kernel is | 547 | * used %fs or %gs (it does not today), or if the kernel is |
| 541 | * running inside of a hypervisor layer. | 548 | * running inside of a hypervisor layer. |
| 542 | */ | 549 | */ |
| 543 | savesegment(gs, prev->gs); | 550 | lazy_save_gs(prev->gs); |
| 544 | 551 | ||
| 545 | /* | 552 | /* |
| 546 | * Load the per-thread Thread-Local Storage descriptor. | 553 | * Load the per-thread Thread-Local Storage descriptor. |
| @@ -586,31 +593,31 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 586 | * Restore %gs if needed (which is common) | 593 | * Restore %gs if needed (which is common) |
| 587 | */ | 594 | */ |
| 588 | if (prev->gs | next->gs) | 595 | if (prev->gs | next->gs) |
| 589 | loadsegment(gs, next->gs); | 596 | lazy_load_gs(next->gs); |
| 590 | 597 | ||
| 591 | x86_write_percpu(current_task, next_p); | 598 | percpu_write(current_task, next_p); |
| 592 | 599 | ||
| 593 | return prev_p; | 600 | return prev_p; |
| 594 | } | 601 | } |
| 595 | 602 | ||
| 596 | asmlinkage int sys_fork(struct pt_regs regs) | 603 | int sys_fork(struct pt_regs *regs) |
| 597 | { | 604 | { |
| 598 | return do_fork(SIGCHLD, regs.sp, ®s, 0, NULL, NULL); | 605 | return do_fork(SIGCHLD, regs->sp, regs, 0, NULL, NULL); |
| 599 | } | 606 | } |
| 600 | 607 | ||
| 601 | asmlinkage int sys_clone(struct pt_regs regs) | 608 | int sys_clone(struct pt_regs *regs) |
| 602 | { | 609 | { |
| 603 | unsigned long clone_flags; | 610 | unsigned long clone_flags; |
| 604 | unsigned long newsp; | 611 | unsigned long newsp; |
| 605 | int __user *parent_tidptr, *child_tidptr; | 612 | int __user *parent_tidptr, *child_tidptr; |
| 606 | 613 | ||
| 607 | clone_flags = regs.bx; | 614 | clone_flags = regs->bx; |
| 608 | newsp = regs.cx; | 615 | newsp = regs->cx; |
| 609 | parent_tidptr = (int __user *)regs.dx; | 616 | parent_tidptr = (int __user *)regs->dx; |
| 610 | child_tidptr = (int __user *)regs.di; | 617 | child_tidptr = (int __user *)regs->di; |
| 611 | if (!newsp) | 618 | if (!newsp) |
| 612 | newsp = regs.sp; | 619 | newsp = regs->sp; |
| 613 | return do_fork(clone_flags, newsp, ®s, 0, parent_tidptr, child_tidptr); | 620 | return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr); |
| 614 | } | 621 | } |
| 615 | 622 | ||
| 616 | /* | 623 | /* |
| @@ -623,27 +630,27 @@ asmlinkage int sys_clone(struct pt_regs regs) | |||
| 623 | * do not have enough call-clobbered registers to hold all | 630 | * do not have enough call-clobbered registers to hold all |
| 624 | * the information you need. | 631 | * the information you need. |
| 625 | */ | 632 | */ |
| 626 | asmlinkage int sys_vfork(struct pt_regs regs) | 633 | int sys_vfork(struct pt_regs *regs) |
| 627 | { | 634 | { |
| 628 | return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs.sp, ®s, 0, NULL, NULL); | 635 | return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->sp, regs, 0, NULL, NULL); |
| 629 | } | 636 | } |
| 630 | 637 | ||
| 631 | /* | 638 | /* |
| 632 | * sys_execve() executes a new program. | 639 | * sys_execve() executes a new program. |
| 633 | */ | 640 | */ |
| 634 | asmlinkage int sys_execve(struct pt_regs regs) | 641 | int sys_execve(struct pt_regs *regs) |
| 635 | { | 642 | { |
| 636 | int error; | 643 | int error; |
| 637 | char *filename; | 644 | char *filename; |
| 638 | 645 | ||
| 639 | filename = getname((char __user *) regs.bx); | 646 | filename = getname((char __user *) regs->bx); |
| 640 | error = PTR_ERR(filename); | 647 | error = PTR_ERR(filename); |
| 641 | if (IS_ERR(filename)) | 648 | if (IS_ERR(filename)) |
| 642 | goto out; | 649 | goto out; |
| 643 | error = do_execve(filename, | 650 | error = do_execve(filename, |
| 644 | (char __user * __user *) regs.cx, | 651 | (char __user * __user *) regs->cx, |
| 645 | (char __user * __user *) regs.dx, | 652 | (char __user * __user *) regs->dx, |
| 646 | ®s); | 653 | regs); |
| 647 | if (error == 0) { | 654 | if (error == 0) { |
| 648 | /* Make sure we don't return using sysenter.. */ | 655 | /* Make sure we don't return using sysenter.. */ |
| 649 | set_thread_flag(TIF_IRET); | 656 | set_thread_flag(TIF_IRET); |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 85b4cb5c1980..836ef6575f01 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | 16 | ||
| 17 | #include <stdarg.h> | 17 | #include <stdarg.h> |
| 18 | 18 | ||
| 19 | #include <linux/stackprotector.h> | ||
| 19 | #include <linux/cpu.h> | 20 | #include <linux/cpu.h> |
| 20 | #include <linux/errno.h> | 21 | #include <linux/errno.h> |
| 21 | #include <linux/sched.h> | 22 | #include <linux/sched.h> |
| @@ -47,7 +48,6 @@ | |||
| 47 | #include <asm/processor.h> | 48 | #include <asm/processor.h> |
| 48 | #include <asm/i387.h> | 49 | #include <asm/i387.h> |
| 49 | #include <asm/mmu_context.h> | 50 | #include <asm/mmu_context.h> |
| 50 | #include <asm/pda.h> | ||
| 51 | #include <asm/prctl.h> | 51 | #include <asm/prctl.h> |
| 52 | #include <asm/desc.h> | 52 | #include <asm/desc.h> |
| 53 | #include <asm/proto.h> | 53 | #include <asm/proto.h> |
| @@ -58,6 +58,12 @@ | |||
| 58 | 58 | ||
| 59 | asmlinkage extern void ret_from_fork(void); | 59 | asmlinkage extern void ret_from_fork(void); |
| 60 | 60 | ||
| 61 | DEFINE_PER_CPU(struct task_struct *, current_task) = &init_task; | ||
| 62 | EXPORT_PER_CPU_SYMBOL(current_task); | ||
| 63 | |||
| 64 | DEFINE_PER_CPU(unsigned long, old_rsp); | ||
| 65 | static DEFINE_PER_CPU(unsigned char, is_idle); | ||
| 66 | |||
| 61 | unsigned long kernel_thread_flags = CLONE_VM | CLONE_UNTRACED; | 67 | unsigned long kernel_thread_flags = CLONE_VM | CLONE_UNTRACED; |
| 62 | 68 | ||
| 63 | static ATOMIC_NOTIFIER_HEAD(idle_notifier); | 69 | static ATOMIC_NOTIFIER_HEAD(idle_notifier); |
| @@ -76,13 +82,13 @@ EXPORT_SYMBOL_GPL(idle_notifier_unregister); | |||
| 76 | 82 | ||
| 77 | void enter_idle(void) | 83 | void enter_idle(void) |
| 78 | { | 84 | { |
| 79 | write_pda(isidle, 1); | 85 | percpu_write(is_idle, 1); |
| 80 | atomic_notifier_call_chain(&idle_notifier, IDLE_START, NULL); | 86 | atomic_notifier_call_chain(&idle_notifier, IDLE_START, NULL); |
| 81 | } | 87 | } |
| 82 | 88 | ||
| 83 | static void __exit_idle(void) | 89 | static void __exit_idle(void) |
| 84 | { | 90 | { |
| 85 | if (test_and_clear_bit_pda(0, isidle) == 0) | 91 | if (x86_test_and_clear_bit_percpu(0, is_idle) == 0) |
| 86 | return; | 92 | return; |
| 87 | atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL); | 93 | atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL); |
| 88 | } | 94 | } |
| @@ -112,6 +118,16 @@ static inline void play_dead(void) | |||
| 112 | void cpu_idle(void) | 118 | void cpu_idle(void) |
| 113 | { | 119 | { |
| 114 | current_thread_info()->status |= TS_POLLING; | 120 | current_thread_info()->status |= TS_POLLING; |
| 121 | |||
| 122 | /* | ||
| 123 | * If we're the non-boot CPU, nothing set the stack canary up | ||
| 124 | * for us. CPU0 already has it initialized but no harm in | ||
| 125 | * doing it again. This is a good place for updating it, as | ||
| 126 | * we wont ever return from this function (so the invalid | ||
| 127 | * canaries already on the stack wont ever trigger). | ||
| 128 | */ | ||
| 129 | boot_init_stack_canary(); | ||
| 130 | |||
| 115 | /* endless idle loop with no priority at all */ | 131 | /* endless idle loop with no priority at all */ |
| 116 | while (1) { | 132 | while (1) { |
| 117 | tick_nohz_stop_sched_tick(1); | 133 | tick_nohz_stop_sched_tick(1); |
| @@ -397,7 +413,7 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) | |||
| 397 | load_gs_index(0); | 413 | load_gs_index(0); |
| 398 | regs->ip = new_ip; | 414 | regs->ip = new_ip; |
| 399 | regs->sp = new_sp; | 415 | regs->sp = new_sp; |
| 400 | write_pda(oldrsp, new_sp); | 416 | percpu_write(old_rsp, new_sp); |
| 401 | regs->cs = __USER_CS; | 417 | regs->cs = __USER_CS; |
| 402 | regs->ss = __USER_DS; | 418 | regs->ss = __USER_DS; |
| 403 | regs->flags = 0x200; | 419 | regs->flags = 0x200; |
| @@ -618,21 +634,13 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p) | |||
| 618 | /* | 634 | /* |
| 619 | * Switch the PDA and FPU contexts. | 635 | * Switch the PDA and FPU contexts. |
| 620 | */ | 636 | */ |
| 621 | prev->usersp = read_pda(oldrsp); | 637 | prev->usersp = percpu_read(old_rsp); |
| 622 | write_pda(oldrsp, next->usersp); | 638 | percpu_write(old_rsp, next->usersp); |
| 623 | write_pda(pcurrent, next_p); | 639 | percpu_write(current_task, next_p); |
| 624 | 640 | ||
| 625 | write_pda(kernelstack, | 641 | percpu_write(kernel_stack, |
| 626 | (unsigned long)task_stack_page(next_p) + | 642 | (unsigned long)task_stack_page(next_p) + |
| 627 | THREAD_SIZE - PDA_STACKOFFSET); | 643 | THREAD_SIZE - KERNEL_STACK_OFFSET); |
| 628 | #ifdef CONFIG_CC_STACKPROTECTOR | ||
| 629 | write_pda(stack_canary, next_p->stack_canary); | ||
| 630 | /* | ||
| 631 | * Build time only check to make sure the stack_canary is at | ||
| 632 | * offset 40 in the pda; this is a gcc ABI requirement | ||
| 633 | */ | ||
| 634 | BUILD_BUG_ON(offsetof(struct x8664_pda, stack_canary) != 40); | ||
| 635 | #endif | ||
| 636 | 644 | ||
| 637 | /* | 645 | /* |
| 638 | * Now maybe reload the debug registers and handle I/O bitmaps | 646 | * Now maybe reload the debug registers and handle I/O bitmaps |
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index 5a4c23d89892..d2f7cd5b2c83 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c | |||
| @@ -75,10 +75,7 @@ static inline bool invalid_selector(u16 value) | |||
| 75 | static unsigned long *pt_regs_access(struct pt_regs *regs, unsigned long regno) | 75 | static unsigned long *pt_regs_access(struct pt_regs *regs, unsigned long regno) |
| 76 | { | 76 | { |
| 77 | BUILD_BUG_ON(offsetof(struct pt_regs, bx) != 0); | 77 | BUILD_BUG_ON(offsetof(struct pt_regs, bx) != 0); |
| 78 | regno >>= 2; | 78 | return ®s->bx + (regno >> 2); |
| 79 | if (regno > FS) | ||
| 80 | --regno; | ||
| 81 | return ®s->bx + regno; | ||
| 82 | } | 79 | } |
| 83 | 80 | ||
| 84 | static u16 get_segment_reg(struct task_struct *task, unsigned long offset) | 81 | static u16 get_segment_reg(struct task_struct *task, unsigned long offset) |
| @@ -90,9 +87,10 @@ static u16 get_segment_reg(struct task_struct *task, unsigned long offset) | |||
| 90 | if (offset != offsetof(struct user_regs_struct, gs)) | 87 | if (offset != offsetof(struct user_regs_struct, gs)) |
| 91 | retval = *pt_regs_access(task_pt_regs(task), offset); | 88 | retval = *pt_regs_access(task_pt_regs(task), offset); |
| 92 | else { | 89 | else { |
| 93 | retval = task->thread.gs; | ||
| 94 | if (task == current) | 90 | if (task == current) |
| 95 | savesegment(gs, retval); | 91 | retval = get_user_gs(task_pt_regs(task)); |
| 92 | else | ||
| 93 | retval = task_user_gs(task); | ||
| 96 | } | 94 | } |
| 97 | return retval; | 95 | return retval; |
| 98 | } | 96 | } |
| @@ -126,13 +124,10 @@ static int set_segment_reg(struct task_struct *task, | |||
| 126 | break; | 124 | break; |
| 127 | 125 | ||
| 128 | case offsetof(struct user_regs_struct, gs): | 126 | case offsetof(struct user_regs_struct, gs): |
| 129 | task->thread.gs = value; | ||
| 130 | if (task == current) | 127 | if (task == current) |
| 131 | /* | 128 | set_user_gs(task_pt_regs(task), value); |
| 132 | * The user-mode %gs is not affected by | 129 | else |
| 133 | * kernel entry, so we must update the CPU. | 130 | task_user_gs(task) = value; |
| 134 | */ | ||
| 135 | loadsegment(gs, value); | ||
| 136 | } | 131 | } |
| 137 | 132 | ||
| 138 | return 0; | 133 | return 0; |
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index 2b46eb41643b..1cc18d439bbb 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <asm/reboot.h> | 14 | #include <asm/reboot.h> |
| 15 | #include <asm/pci_x86.h> | 15 | #include <asm/pci_x86.h> |
| 16 | #include <asm/virtext.h> | 16 | #include <asm/virtext.h> |
| 17 | #include <asm/cpu.h> | ||
| 17 | 18 | ||
| 18 | #ifdef CONFIG_X86_32 | 19 | #ifdef CONFIG_X86_32 |
| 19 | # include <linux/dmi.h> | 20 | # include <linux/dmi.h> |
| @@ -23,8 +24,6 @@ | |||
| 23 | # include <asm/iommu.h> | 24 | # include <asm/iommu.h> |
| 24 | #endif | 25 | #endif |
| 25 | 26 | ||
| 26 | #include <mach_ipi.h> | ||
| 27 | |||
| 28 | /* | 27 | /* |
| 29 | * Power off function, if any | 28 | * Power off function, if any |
| 30 | */ | 29 | */ |
| @@ -650,7 +649,7 @@ static int crash_nmi_callback(struct notifier_block *self, | |||
| 650 | 649 | ||
| 651 | static void smp_send_nmi_allbutself(void) | 650 | static void smp_send_nmi_allbutself(void) |
| 652 | { | 651 | { |
| 653 | send_IPI_allbutself(NMI_VECTOR); | 652 | apic->send_IPI_allbutself(NMI_VECTOR); |
| 654 | } | 653 | } |
| 655 | 654 | ||
| 656 | static struct notifier_block crash_nmi_nb = { | 655 | static struct notifier_block crash_nmi_nb = { |
diff --git a/arch/x86/kernel/relocate_kernel_32.S b/arch/x86/kernel/relocate_kernel_32.S index a160f3119725..2064d0aa8d28 100644 --- a/arch/x86/kernel/relocate_kernel_32.S +++ b/arch/x86/kernel/relocate_kernel_32.S | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #include <linux/linkage.h> | 9 | #include <linux/linkage.h> |
| 10 | #include <asm/page.h> | 10 | #include <asm/page_types.h> |
| 11 | #include <asm/kexec.h> | 11 | #include <asm/kexec.h> |
| 12 | #include <asm/processor-flags.h> | 12 | #include <asm/processor-flags.h> |
| 13 | 13 | ||
diff --git a/arch/x86/kernel/relocate_kernel_64.S b/arch/x86/kernel/relocate_kernel_64.S index f5afe665a82b..d32cfb27a479 100644 --- a/arch/x86/kernel/relocate_kernel_64.S +++ b/arch/x86/kernel/relocate_kernel_64.S | |||
| @@ -7,10 +7,10 @@ | |||
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #include <linux/linkage.h> | 9 | #include <linux/linkage.h> |
| 10 | #include <asm/page.h> | 10 | #include <asm/page_types.h> |
| 11 | #include <asm/kexec.h> | 11 | #include <asm/kexec.h> |
| 12 | #include <asm/processor-flags.h> | 12 | #include <asm/processor-flags.h> |
| 13 | #include <asm/pgtable.h> | 13 | #include <asm/pgtable_types.h> |
| 14 | 14 | ||
| 15 | /* | 15 | /* |
| 16 | * Must be relocatable PIC code callable as a C function | 16 | * Must be relocatable PIC code callable as a C function |
| @@ -29,122 +29,6 @@ relocate_kernel: | |||
| 29 | * %rdx start address | 29 | * %rdx start address |
| 30 | */ | 30 | */ |
| 31 | 31 | ||
| 32 | /* map the control page at its virtual address */ | ||
| 33 | |||
| 34 | movq $0x0000ff8000000000, %r10 /* mask */ | ||
| 35 | mov $(39 - 3), %cl /* bits to shift */ | ||
| 36 | movq PTR(VA_CONTROL_PAGE)(%rsi), %r11 /* address to map */ | ||
| 37 | |||
| 38 | movq %r11, %r9 | ||
| 39 | andq %r10, %r9 | ||
| 40 | shrq %cl, %r9 | ||
| 41 | |||
| 42 | movq PTR(VA_PGD)(%rsi), %r8 | ||
| 43 | addq %r8, %r9 | ||
| 44 | movq PTR(PA_PUD_0)(%rsi), %r8 | ||
| 45 | orq $PAGE_ATTR, %r8 | ||
| 46 | movq %r8, (%r9) | ||
| 47 | |||
| 48 | shrq $9, %r10 | ||
| 49 | sub $9, %cl | ||
| 50 | |||
| 51 | movq %r11, %r9 | ||
| 52 | andq %r10, %r9 | ||
| 53 | shrq %cl, %r9 | ||
| 54 | |||
| 55 | movq PTR(VA_PUD_0)(%rsi), %r8 | ||
| 56 | addq %r8, %r9 | ||
| 57 | movq PTR(PA_PMD_0)(%rsi), %r8 | ||
| 58 | orq $PAGE_ATTR, %r8 | ||
| 59 | movq %r8, (%r9) | ||
| 60 | |||
| 61 | shrq $9, %r10 | ||
| 62 | sub $9, %cl | ||
| 63 | |||
| 64 | movq %r11, %r9 | ||
| 65 | andq %r10, %r9 | ||
| 66 | shrq %cl, %r9 | ||
| 67 | |||
| 68 | movq PTR(VA_PMD_0)(%rsi), %r8 | ||
| 69 | addq %r8, %r9 | ||
| 70 | movq PTR(PA_PTE_0)(%rsi), %r8 | ||
| 71 | orq $PAGE_ATTR, %r8 | ||
| 72 | movq %r8, (%r9) | ||
| 73 | |||
| 74 | shrq $9, %r10 | ||
| 75 | sub $9, %cl | ||
| 76 | |||
| 77 | movq %r11, %r9 | ||
| 78 | andq %r10, %r9 | ||
| 79 | shrq %cl, %r9 | ||
| 80 | |||
| 81 | movq PTR(VA_PTE_0)(%rsi), %r8 | ||
| 82 | addq %r8, %r9 | ||
| 83 | movq PTR(PA_CONTROL_PAGE)(%rsi), %r8 | ||
| 84 | orq $PAGE_ATTR, %r8 | ||
| 85 | movq %r8, (%r9) | ||
| 86 | |||
| 87 | /* identity map the control page at its physical address */ | ||
| 88 | |||
| 89 | movq $0x0000ff8000000000, %r10 /* mask */ | ||
| 90 | mov $(39 - 3), %cl /* bits to shift */ | ||
| 91 | movq PTR(PA_CONTROL_PAGE)(%rsi), %r11 /* address to map */ | ||
| 92 | |||
| 93 | movq %r11, %r9 | ||
| 94 | andq %r10, %r9 | ||
| 95 | shrq %cl, %r9 | ||
| 96 | |||
| 97 | movq PTR(VA_PGD)(%rsi), %r8 | ||
| 98 | addq %r8, %r9 | ||
| 99 | movq PTR(PA_PUD_1)(%rsi), %r8 | ||
| 100 | orq $PAGE_ATTR, %r8 | ||
| 101 | movq %r8, (%r9) | ||
| 102 | |||
| 103 | shrq $9, %r10 | ||
| 104 | sub $9, %cl | ||
| 105 | |||
| 106 | movq %r11, %r9 | ||
| 107 | andq %r10, %r9 | ||
| 108 | shrq %cl, %r9 | ||
| 109 | |||
| 110 | movq PTR(VA_PUD_1)(%rsi), %r8 | ||
| 111 | addq %r8, %r9 | ||
| 112 | movq PTR(PA_PMD_1)(%rsi), %r8 | ||
| 113 | orq $PAGE_ATTR, %r8 | ||
| 114 | movq %r8, (%r9) | ||
| 115 | |||
| 116 | shrq $9, %r10 | ||
| 117 | sub $9, %cl | ||
| 118 | |||
| 119 | movq %r11, %r9 | ||
| 120 | andq %r10, %r9 | ||
| 121 | shrq %cl, %r9 | ||
| 122 | |||
| 123 | movq PTR(VA_PMD_1)(%rsi), %r8 | ||
| 124 | addq %r8, %r9 | ||
| 125 | movq PTR(PA_PTE_1)(%rsi), %r8 | ||
| 126 | orq $PAGE_ATTR, %r8 | ||
| 127 | movq %r8, (%r9) | ||
| 128 | |||
| 129 | shrq $9, %r10 | ||
| 130 | sub $9, %cl | ||
| 131 | |||
| 132 | movq %r11, %r9 | ||
| 133 | andq %r10, %r9 | ||
| 134 | shrq %cl, %r9 | ||
| 135 | |||
| 136 | movq PTR(VA_PTE_1)(%rsi), %r8 | ||
| 137 | addq %r8, %r9 | ||
| 138 | movq PTR(PA_CONTROL_PAGE)(%rsi), %r8 | ||
| 139 | orq $PAGE_ATTR, %r8 | ||
| 140 | movq %r8, (%r9) | ||
| 141 | |||
| 142 | relocate_new_kernel: | ||
| 143 | /* %rdi indirection_page | ||
| 144 | * %rsi page_list | ||
| 145 | * %rdx start address | ||
| 146 | */ | ||
| 147 | |||
| 148 | /* zero out flags, and disable interrupts */ | 32 | /* zero out flags, and disable interrupts */ |
| 149 | pushq $0 | 33 | pushq $0 |
| 150 | popfq | 34 | popfq |
| @@ -156,9 +40,8 @@ relocate_new_kernel: | |||
| 156 | /* get physical address of page table now too */ | 40 | /* get physical address of page table now too */ |
| 157 | movq PTR(PA_TABLE_PAGE)(%rsi), %rcx | 41 | movq PTR(PA_TABLE_PAGE)(%rsi), %rcx |
| 158 | 42 | ||
| 159 | /* switch to new set of page tables */ | 43 | /* Switch to the identity mapped page tables */ |
| 160 | movq PTR(PA_PGD)(%rsi), %r9 | 44 | movq %rcx, %cr3 |
| 161 | movq %r9, %cr3 | ||
| 162 | 45 | ||
| 163 | /* setup a new stack at the end of the physical control page */ | 46 | /* setup a new stack at the end of the physical control page */ |
| 164 | lea PAGE_SIZE(%r8), %rsp | 47 | lea PAGE_SIZE(%r8), %rsp |
| @@ -194,9 +77,7 @@ identity_mapped: | |||
| 194 | jmp 1f | 77 | jmp 1f |
| 195 | 1: | 78 | 1: |
| 196 | 79 | ||
| 197 | /* Switch to the identity mapped page tables, | 80 | /* Flush the TLB (needed?) */ |
| 198 | * and flush the TLB. | ||
| 199 | */ | ||
| 200 | movq %rcx, %cr3 | 81 | movq %rcx, %cr3 |
| 201 | 82 | ||
| 202 | /* Do the copies */ | 83 | /* Do the copies */ |
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index c461f6d69074..ebef80055795 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
| @@ -81,7 +81,7 @@ | |||
| 81 | #include <asm/io_apic.h> | 81 | #include <asm/io_apic.h> |
| 82 | #include <asm/ist.h> | 82 | #include <asm/ist.h> |
| 83 | #include <asm/vmi.h> | 83 | #include <asm/vmi.h> |
| 84 | #include <setup_arch.h> | 84 | #include <asm/setup_arch.h> |
| 85 | #include <asm/bios_ebda.h> | 85 | #include <asm/bios_ebda.h> |
| 86 | #include <asm/cacheflush.h> | 86 | #include <asm/cacheflush.h> |
| 87 | #include <asm/processor.h> | 87 | #include <asm/processor.h> |
| @@ -89,7 +89,7 @@ | |||
| 89 | 89 | ||
| 90 | #include <asm/system.h> | 90 | #include <asm/system.h> |
| 91 | #include <asm/vsyscall.h> | 91 | #include <asm/vsyscall.h> |
| 92 | #include <asm/smp.h> | 92 | #include <asm/cpu.h> |
| 93 | #include <asm/desc.h> | 93 | #include <asm/desc.h> |
| 94 | #include <asm/dma.h> | 94 | #include <asm/dma.h> |
| 95 | #include <asm/iommu.h> | 95 | #include <asm/iommu.h> |
| @@ -97,7 +97,6 @@ | |||
| 97 | #include <asm/mmu_context.h> | 97 | #include <asm/mmu_context.h> |
| 98 | #include <asm/proto.h> | 98 | #include <asm/proto.h> |
| 99 | 99 | ||
| 100 | #include <mach_apic.h> | ||
| 101 | #include <asm/paravirt.h> | 100 | #include <asm/paravirt.h> |
| 102 | #include <asm/hypervisor.h> | 101 | #include <asm/hypervisor.h> |
| 103 | 102 | ||
| @@ -112,6 +111,20 @@ | |||
| 112 | #define ARCH_SETUP | 111 | #define ARCH_SETUP |
| 113 | #endif | 112 | #endif |
| 114 | 113 | ||
| 114 | unsigned int boot_cpu_id __read_mostly; | ||
| 115 | |||
| 116 | #ifdef CONFIG_X86_64 | ||
| 117 | int default_cpu_present_to_apicid(int mps_cpu) | ||
| 118 | { | ||
| 119 | return __default_cpu_present_to_apicid(mps_cpu); | ||
| 120 | } | ||
| 121 | |||
| 122 | int default_check_phys_apicid_present(int boot_cpu_physical_apicid) | ||
| 123 | { | ||
| 124 | return __default_check_phys_apicid_present(boot_cpu_physical_apicid); | ||
| 125 | } | ||
| 126 | #endif | ||
| 127 | |||
| 115 | #ifndef CONFIG_DEBUG_BOOT_PARAMS | 128 | #ifndef CONFIG_DEBUG_BOOT_PARAMS |
| 116 | struct boot_params __initdata boot_params; | 129 | struct boot_params __initdata boot_params; |
| 117 | #else | 130 | #else |
| @@ -586,19 +599,18 @@ static int __init setup_elfcorehdr(char *arg) | |||
| 586 | early_param("elfcorehdr", setup_elfcorehdr); | 599 | early_param("elfcorehdr", setup_elfcorehdr); |
| 587 | #endif | 600 | #endif |
| 588 | 601 | ||
| 589 | static int __init default_update_genapic(void) | 602 | static int __init default_update_apic(void) |
| 590 | { | 603 | { |
| 591 | #ifdef CONFIG_X86_SMP | 604 | #ifdef CONFIG_SMP |
| 592 | # if defined(CONFIG_X86_GENERICARCH) || defined(CONFIG_X86_64) | 605 | if (!apic->wakeup_cpu) |
| 593 | genapic->wakeup_cpu = wakeup_secondary_cpu_via_init; | 606 | apic->wakeup_cpu = wakeup_secondary_cpu_via_init; |
| 594 | # endif | ||
| 595 | #endif | 607 | #endif |
| 596 | 608 | ||
| 597 | return 0; | 609 | return 0; |
| 598 | } | 610 | } |
| 599 | 611 | ||
| 600 | static struct x86_quirks default_x86_quirks __initdata = { | 612 | static struct x86_quirks default_x86_quirks __initdata = { |
| 601 | .update_genapic = default_update_genapic, | 613 | .update_apic = default_update_apic, |
| 602 | }; | 614 | }; |
| 603 | 615 | ||
| 604 | struct x86_quirks *x86_quirks __initdata = &default_x86_quirks; | 616 | struct x86_quirks *x86_quirks __initdata = &default_x86_quirks; |
| @@ -823,8 +835,7 @@ void __init setup_arch(char **cmdline_p) | |||
| 823 | #else | 835 | #else |
| 824 | num_physpages = max_pfn; | 836 | num_physpages = max_pfn; |
| 825 | 837 | ||
| 826 | if (cpu_has_x2apic) | 838 | check_x2apic(); |
| 827 | check_x2apic(); | ||
| 828 | 839 | ||
| 829 | /* How many end-of-memory variables you have, grandma! */ | 840 | /* How many end-of-memory variables you have, grandma! */ |
| 830 | /* need this before calling reserve_initrd */ | 841 | /* need this before calling reserve_initrd */ |
| @@ -892,12 +903,11 @@ void __init setup_arch(char **cmdline_p) | |||
| 892 | */ | 903 | */ |
| 893 | acpi_reserve_bootmem(); | 904 | acpi_reserve_bootmem(); |
| 894 | #endif | 905 | #endif |
| 895 | #ifdef CONFIG_X86_FIND_SMP_CONFIG | ||
| 896 | /* | 906 | /* |
| 897 | * Find and reserve possible boot-time SMP configuration: | 907 | * Find and reserve possible boot-time SMP configuration: |
| 898 | */ | 908 | */ |
| 899 | find_smp_config(); | 909 | find_smp_config(); |
| 900 | #endif | 910 | |
| 901 | reserve_crashkernel(); | 911 | reserve_crashkernel(); |
| 902 | 912 | ||
| 903 | #ifdef CONFIG_X86_64 | 913 | #ifdef CONFIG_X86_64 |
| @@ -924,9 +934,7 @@ void __init setup_arch(char **cmdline_p) | |||
| 924 | map_vsyscall(); | 934 | map_vsyscall(); |
| 925 | #endif | 935 | #endif |
| 926 | 936 | ||
| 927 | #ifdef CONFIG_X86_GENERICARCH | ||
| 928 | generic_apic_probe(); | 937 | generic_apic_probe(); |
| 929 | #endif | ||
| 930 | 938 | ||
| 931 | early_quirks(); | 939 | early_quirks(); |
| 932 | 940 | ||
| @@ -977,4 +985,128 @@ void __init setup_arch(char **cmdline_p) | |||
| 977 | #endif | 985 | #endif |
| 978 | } | 986 | } |
| 979 | 987 | ||
| 988 | #ifdef CONFIG_X86_32 | ||
| 989 | |||
| 990 | /** | ||
| 991 | * pre_intr_init_hook - initialisation prior to setting up interrupt vectors | ||
| 992 | * | ||
| 993 | * Description: | ||
| 994 | * Perform any necessary interrupt initialisation prior to setting up | ||
| 995 | * the "ordinary" interrupt call gates. For legacy reasons, the ISA | ||
| 996 | * interrupts should be initialised here if the machine emulates a PC | ||
| 997 | * in any way. | ||
| 998 | **/ | ||
| 999 | void __init pre_intr_init_hook(void) | ||
| 1000 | { | ||
| 1001 | if (x86_quirks->arch_pre_intr_init) { | ||
| 1002 | if (x86_quirks->arch_pre_intr_init()) | ||
| 1003 | return; | ||
| 1004 | } | ||
| 1005 | init_ISA_irqs(); | ||
| 1006 | } | ||
| 1007 | |||
| 1008 | /** | ||
| 1009 | * intr_init_hook - post gate setup interrupt initialisation | ||
| 1010 | * | ||
| 1011 | * Description: | ||
| 1012 | * Fill in any interrupts that may have been left out by the general | ||
| 1013 | * init_IRQ() routine. interrupts having to do with the machine rather | ||
| 1014 | * than the devices on the I/O bus (like APIC interrupts in intel MP | ||
| 1015 | * systems) are started here. | ||
| 1016 | **/ | ||
| 1017 | void __init intr_init_hook(void) | ||
| 1018 | { | ||
| 1019 | if (x86_quirks->arch_intr_init) { | ||
| 1020 | if (x86_quirks->arch_intr_init()) | ||
| 1021 | return; | ||
| 1022 | } | ||
| 1023 | } | ||
| 1024 | |||
| 1025 | /** | ||
| 1026 | * pre_setup_arch_hook - hook called prior to any setup_arch() execution | ||
| 1027 | * | ||
| 1028 | * Description: | ||
| 1029 | * generally used to activate any machine specific identification | ||
| 1030 | * routines that may be needed before setup_arch() runs. On Voyager | ||
| 1031 | * this is used to get the board revision and type. | ||
| 1032 | **/ | ||
| 1033 | void __init pre_setup_arch_hook(void) | ||
| 1034 | { | ||
| 1035 | } | ||
| 1036 | |||
| 1037 | /** | ||
| 1038 | * trap_init_hook - initialise system specific traps | ||
| 1039 | * | ||
| 1040 | * Description: | ||
| 1041 | * Called as the final act of trap_init(). Used in VISWS to initialise | ||
| 1042 | * the various board specific APIC traps. | ||
| 1043 | **/ | ||
| 1044 | void __init trap_init_hook(void) | ||
| 1045 | { | ||
| 1046 | if (x86_quirks->arch_trap_init) { | ||
| 1047 | if (x86_quirks->arch_trap_init()) | ||
| 1048 | return; | ||
| 1049 | } | ||
| 1050 | } | ||
| 1051 | |||
| 1052 | static struct irqaction irq0 = { | ||
| 1053 | .handler = timer_interrupt, | ||
| 1054 | .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL, | ||
| 1055 | .mask = CPU_MASK_NONE, | ||
| 1056 | .name = "timer" | ||
| 1057 | }; | ||
| 1058 | |||
| 1059 | /** | ||
| 1060 | * pre_time_init_hook - do any specific initialisations before. | ||
| 1061 | * | ||
| 1062 | **/ | ||
| 1063 | void __init pre_time_init_hook(void) | ||
| 1064 | { | ||
| 1065 | if (x86_quirks->arch_pre_time_init) | ||
| 1066 | x86_quirks->arch_pre_time_init(); | ||
| 1067 | } | ||
| 1068 | |||
| 1069 | /** | ||
| 1070 | * time_init_hook - do any specific initialisations for the system timer. | ||
| 1071 | * | ||
| 1072 | * Description: | ||
| 1073 | * Must plug the system timer interrupt source at HZ into the IRQ listed | ||
| 1074 | * in irq_vectors.h:TIMER_IRQ | ||
| 1075 | **/ | ||
| 1076 | void __init time_init_hook(void) | ||
| 1077 | { | ||
| 1078 | if (x86_quirks->arch_time_init) { | ||
| 1079 | /* | ||
| 1080 | * A nonzero return code does not mean failure, it means | ||
| 1081 | * that the architecture quirk does not want any | ||
| 1082 | * generic (timer) setup to be performed after this: | ||
| 1083 | */ | ||
| 1084 | if (x86_quirks->arch_time_init()) | ||
| 1085 | return; | ||
| 1086 | } | ||
| 1087 | |||
| 1088 | irq0.mask = cpumask_of_cpu(0); | ||
| 1089 | setup_irq(0, &irq0); | ||
| 1090 | } | ||
| 1091 | |||
| 1092 | #ifdef CONFIG_MCA | ||
| 1093 | /** | ||
| 1094 | * mca_nmi_hook - hook into MCA specific NMI chain | ||
| 1095 | * | ||
| 1096 | * Description: | ||
| 1097 | * The MCA (Microchannel Architecture) has an NMI chain for NMI sources | ||
| 1098 | * along the MCA bus. Use this to hook into that chain if you will need | ||
| 1099 | * it. | ||
| 1100 | **/ | ||
| 1101 | void mca_nmi_hook(void) | ||
| 1102 | { | ||
| 1103 | /* | ||
| 1104 | * If I recall correctly, there's a whole bunch of other things that | ||
| 1105 | * we can do to check for NMI problems, but that's all I know about | ||
| 1106 | * at the moment. | ||
| 1107 | */ | ||
| 1108 | pr_warning("NMI generated from unknown source!\n"); | ||
| 1109 | } | ||
| 1110 | #endif /* CONFIG_MCA */ | ||
| 980 | 1111 | ||
| 1112 | #endif /* CONFIG_X86_32 */ | ||
diff --git a/arch/x86/kernel/setup_percpu.c b/arch/x86/kernel/setup_percpu.c index 01161077a49c..d992e6cff730 100644 --- a/arch/x86/kernel/setup_percpu.c +++ b/arch/x86/kernel/setup_percpu.c | |||
| @@ -13,145 +13,47 @@ | |||
| 13 | #include <asm/mpspec.h> | 13 | #include <asm/mpspec.h> |
| 14 | #include <asm/apicdef.h> | 14 | #include <asm/apicdef.h> |
| 15 | #include <asm/highmem.h> | 15 | #include <asm/highmem.h> |
| 16 | #include <asm/proto.h> | ||
| 17 | #include <asm/cpumask.h> | ||
| 18 | #include <asm/cpu.h> | ||
| 19 | #include <asm/stackprotector.h> | ||
| 16 | 20 | ||
| 17 | #ifdef CONFIG_X86_LOCAL_APIC | 21 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS |
| 18 | unsigned int num_processors; | 22 | # define DBG(x...) printk(KERN_DEBUG x) |
| 19 | unsigned disabled_cpus __cpuinitdata; | ||
| 20 | /* Processor that is doing the boot up */ | ||
| 21 | unsigned int boot_cpu_physical_apicid = -1U; | ||
| 22 | EXPORT_SYMBOL(boot_cpu_physical_apicid); | ||
| 23 | unsigned int max_physical_apicid; | ||
| 24 | |||
| 25 | /* Bitmask of physically existing CPUs */ | ||
| 26 | physid_mask_t phys_cpu_present_map; | ||
| 27 | #endif | ||
| 28 | |||
| 29 | /* map cpu index to physical APIC ID */ | ||
| 30 | DEFINE_EARLY_PER_CPU(u16, x86_cpu_to_apicid, BAD_APICID); | ||
| 31 | DEFINE_EARLY_PER_CPU(u16, x86_bios_cpu_apicid, BAD_APICID); | ||
| 32 | EXPORT_EARLY_PER_CPU_SYMBOL(x86_cpu_to_apicid); | ||
| 33 | EXPORT_EARLY_PER_CPU_SYMBOL(x86_bios_cpu_apicid); | ||
| 34 | |||
| 35 | #if defined(CONFIG_NUMA) && defined(CONFIG_X86_64) | ||
| 36 | #define X86_64_NUMA 1 | ||
| 37 | |||
| 38 | /* map cpu index to node index */ | ||
| 39 | DEFINE_EARLY_PER_CPU(int, x86_cpu_to_node_map, NUMA_NO_NODE); | ||
| 40 | EXPORT_EARLY_PER_CPU_SYMBOL(x86_cpu_to_node_map); | ||
| 41 | |||
| 42 | /* which logical CPUs are on which nodes */ | ||
| 43 | cpumask_t *node_to_cpumask_map; | ||
| 44 | EXPORT_SYMBOL(node_to_cpumask_map); | ||
| 45 | |||
| 46 | /* setup node_to_cpumask_map */ | ||
| 47 | static void __init setup_node_to_cpumask_map(void); | ||
| 48 | |||
| 49 | #else | 23 | #else |
| 50 | static inline void setup_node_to_cpumask_map(void) { } | 24 | # define DBG(x...) |
| 51 | #endif | 25 | #endif |
| 52 | 26 | ||
| 53 | #if defined(CONFIG_HAVE_SETUP_PER_CPU_AREA) && defined(CONFIG_X86_SMP) | 27 | DEFINE_PER_CPU(int, cpu_number); |
| 54 | /* | 28 | EXPORT_PER_CPU_SYMBOL(cpu_number); |
| 55 | * Copy data used in early init routines from the initial arrays to the | ||
| 56 | * per cpu data areas. These arrays then become expendable and the | ||
| 57 | * *_early_ptr's are zeroed indicating that the static arrays are gone. | ||
| 58 | */ | ||
| 59 | static void __init setup_per_cpu_maps(void) | ||
| 60 | { | ||
| 61 | int cpu; | ||
| 62 | 29 | ||
| 63 | for_each_possible_cpu(cpu) { | 30 | #ifdef CONFIG_X86_64 |
| 64 | per_cpu(x86_cpu_to_apicid, cpu) = | 31 | #define BOOT_PERCPU_OFFSET ((unsigned long)__per_cpu_load) |
| 65 | early_per_cpu_map(x86_cpu_to_apicid, cpu); | 32 | #else |
| 66 | per_cpu(x86_bios_cpu_apicid, cpu) = | 33 | #define BOOT_PERCPU_OFFSET 0 |
| 67 | early_per_cpu_map(x86_bios_cpu_apicid, cpu); | ||
| 68 | #ifdef X86_64_NUMA | ||
| 69 | per_cpu(x86_cpu_to_node_map, cpu) = | ||
| 70 | early_per_cpu_map(x86_cpu_to_node_map, cpu); | ||
| 71 | #endif | 34 | #endif |
| 72 | } | ||
| 73 | 35 | ||
| 74 | /* indicate the early static arrays will soon be gone */ | 36 | DEFINE_PER_CPU(unsigned long, this_cpu_off) = BOOT_PERCPU_OFFSET; |
| 75 | early_per_cpu_ptr(x86_cpu_to_apicid) = NULL; | 37 | EXPORT_PER_CPU_SYMBOL(this_cpu_off); |
| 76 | early_per_cpu_ptr(x86_bios_cpu_apicid) = NULL; | ||
| 77 | #ifdef X86_64_NUMA | ||
| 78 | early_per_cpu_ptr(x86_cpu_to_node_map) = NULL; | ||
| 79 | #endif | ||
| 80 | } | ||
| 81 | 38 | ||
| 82 | #ifdef CONFIG_X86_32 | 39 | unsigned long __per_cpu_offset[NR_CPUS] __read_mostly = { |
| 83 | /* | 40 | [0 ... NR_CPUS-1] = BOOT_PERCPU_OFFSET, |
| 84 | * Great future not-so-futuristic plan: make i386 and x86_64 do it | 41 | }; |
| 85 | * the same way | ||
| 86 | */ | ||
| 87 | unsigned long __per_cpu_offset[NR_CPUS] __read_mostly; | ||
| 88 | EXPORT_SYMBOL(__per_cpu_offset); | 42 | EXPORT_SYMBOL(__per_cpu_offset); |
| 89 | static inline void setup_cpu_pda_map(void) { } | ||
| 90 | |||
| 91 | #elif !defined(CONFIG_SMP) | ||
| 92 | static inline void setup_cpu_pda_map(void) { } | ||
| 93 | |||
| 94 | #else /* CONFIG_SMP && CONFIG_X86_64 */ | ||
| 95 | |||
| 96 | /* | ||
| 97 | * Allocate cpu_pda pointer table and array via alloc_bootmem. | ||
| 98 | */ | ||
| 99 | static void __init setup_cpu_pda_map(void) | ||
| 100 | { | ||
| 101 | char *pda; | ||
| 102 | struct x8664_pda **new_cpu_pda; | ||
| 103 | unsigned long size; | ||
| 104 | int cpu; | ||
| 105 | |||
| 106 | size = roundup(sizeof(struct x8664_pda), cache_line_size()); | ||
| 107 | |||
| 108 | /* allocate cpu_pda array and pointer table */ | ||
| 109 | { | ||
| 110 | unsigned long tsize = nr_cpu_ids * sizeof(void *); | ||
| 111 | unsigned long asize = size * (nr_cpu_ids - 1); | ||
| 112 | 43 | ||
| 113 | tsize = roundup(tsize, cache_line_size()); | 44 | static inline void setup_percpu_segment(int cpu) |
| 114 | new_cpu_pda = alloc_bootmem(tsize + asize); | ||
| 115 | pda = (char *)new_cpu_pda + tsize; | ||
| 116 | } | ||
| 117 | |||
| 118 | /* initialize pointer table to static pda's */ | ||
| 119 | for_each_possible_cpu(cpu) { | ||
| 120 | if (cpu == 0) { | ||
| 121 | /* leave boot cpu pda in place */ | ||
| 122 | new_cpu_pda[0] = cpu_pda(0); | ||
| 123 | continue; | ||
| 124 | } | ||
| 125 | new_cpu_pda[cpu] = (struct x8664_pda *)pda; | ||
| 126 | new_cpu_pda[cpu]->in_bootmem = 1; | ||
| 127 | pda += size; | ||
| 128 | } | ||
| 129 | |||
| 130 | /* point to new pointer table */ | ||
| 131 | _cpu_pda = new_cpu_pda; | ||
| 132 | } | ||
| 133 | |||
| 134 | #endif /* CONFIG_SMP && CONFIG_X86_64 */ | ||
| 135 | |||
| 136 | #ifdef CONFIG_X86_64 | ||
| 137 | |||
| 138 | /* correctly size the local cpu masks */ | ||
| 139 | static void __init setup_cpu_local_masks(void) | ||
| 140 | { | 45 | { |
| 141 | alloc_bootmem_cpumask_var(&cpu_initialized_mask); | 46 | #ifdef CONFIG_X86_32 |
| 142 | alloc_bootmem_cpumask_var(&cpu_callin_mask); | 47 | struct desc_struct gdt; |
| 143 | alloc_bootmem_cpumask_var(&cpu_callout_mask); | ||
| 144 | alloc_bootmem_cpumask_var(&cpu_sibling_setup_mask); | ||
| 145 | } | ||
| 146 | |||
| 147 | #else /* CONFIG_X86_32 */ | ||
| 148 | 48 | ||
| 149 | static inline void setup_cpu_local_masks(void) | 49 | pack_descriptor(&gdt, per_cpu_offset(cpu), 0xFFFFF, |
| 150 | { | 50 | 0x2 | DESCTYPE_S, 0x8); |
| 51 | gdt.s = 1; | ||
| 52 | write_gdt_entry(get_cpu_gdt_table(cpu), | ||
| 53 | GDT_ENTRY_PERCPU, &gdt, DESCTYPE_S); | ||
| 54 | #endif | ||
| 151 | } | 55 | } |
| 152 | 56 | ||
| 153 | #endif /* CONFIG_X86_32 */ | ||
| 154 | |||
| 155 | /* | 57 | /* |
| 156 | * Great future plan: | 58 | * Great future plan: |
| 157 | * Declare PDA itself and support (irqstack,tss,pgd) as per cpu data. | 59 | * Declare PDA itself and support (irqstack,tss,pgd) as per cpu data. |
| @@ -159,18 +61,12 @@ static inline void setup_cpu_local_masks(void) | |||
| 159 | */ | 61 | */ |
| 160 | void __init setup_per_cpu_areas(void) | 62 | void __init setup_per_cpu_areas(void) |
| 161 | { | 63 | { |
| 162 | ssize_t size, old_size; | 64 | ssize_t size; |
| 163 | char *ptr; | 65 | char *ptr; |
| 164 | int cpu; | 66 | int cpu; |
| 165 | unsigned long align = 1; | ||
| 166 | |||
| 167 | /* Setup cpu_pda map */ | ||
| 168 | setup_cpu_pda_map(); | ||
| 169 | 67 | ||
| 170 | /* Copy section for each CPU (we discard the original) */ | 68 | /* Copy section for each CPU (we discard the original) */ |
| 171 | old_size = PERCPU_ENOUGH_ROOM; | 69 | size = roundup(PERCPU_ENOUGH_ROOM, PAGE_SIZE); |
| 172 | align = max_t(unsigned long, PAGE_SIZE, align); | ||
| 173 | size = roundup(old_size, align); | ||
| 174 | 70 | ||
| 175 | pr_info("NR_CPUS:%d nr_cpumask_bits:%d nr_cpu_ids:%d nr_node_ids:%d\n", | 71 | pr_info("NR_CPUS:%d nr_cpumask_bits:%d nr_cpu_ids:%d nr_node_ids:%d\n", |
| 176 | NR_CPUS, nr_cpumask_bits, nr_cpu_ids, nr_node_ids); | 72 | NR_CPUS, nr_cpumask_bits, nr_cpu_ids, nr_node_ids); |
| @@ -179,30 +75,68 @@ void __init setup_per_cpu_areas(void) | |||
| 179 | 75 | ||
| 180 | for_each_possible_cpu(cpu) { | 76 | for_each_possible_cpu(cpu) { |
| 181 | #ifndef CONFIG_NEED_MULTIPLE_NODES | 77 | #ifndef CONFIG_NEED_MULTIPLE_NODES |
| 182 | ptr = __alloc_bootmem(size, align, | 78 | ptr = alloc_bootmem_pages(size); |
| 183 | __pa(MAX_DMA_ADDRESS)); | ||
| 184 | #else | 79 | #else |
| 185 | int node = early_cpu_to_node(cpu); | 80 | int node = early_cpu_to_node(cpu); |
| 186 | if (!node_online(node) || !NODE_DATA(node)) { | 81 | if (!node_online(node) || !NODE_DATA(node)) { |
| 187 | ptr = __alloc_bootmem(size, align, | 82 | ptr = alloc_bootmem_pages(size); |
| 188 | __pa(MAX_DMA_ADDRESS)); | ||
| 189 | pr_info("cpu %d has no node %d or node-local memory\n", | 83 | pr_info("cpu %d has no node %d or node-local memory\n", |
| 190 | cpu, node); | 84 | cpu, node); |
| 191 | pr_debug("per cpu data for cpu%d at %016lx\n", | 85 | pr_debug("per cpu data for cpu%d at %016lx\n", |
| 192 | cpu, __pa(ptr)); | 86 | cpu, __pa(ptr)); |
| 193 | } else { | 87 | } else { |
| 194 | ptr = __alloc_bootmem_node(NODE_DATA(node), size, align, | 88 | ptr = alloc_bootmem_pages_node(NODE_DATA(node), size); |
| 195 | __pa(MAX_DMA_ADDRESS)); | ||
| 196 | pr_debug("per cpu data for cpu%d on node%d at %016lx\n", | 89 | pr_debug("per cpu data for cpu%d on node%d at %016lx\n", |
| 197 | cpu, node, __pa(ptr)); | 90 | cpu, node, __pa(ptr)); |
| 198 | } | 91 | } |
| 199 | #endif | 92 | #endif |
| 93 | |||
| 94 | memcpy(ptr, __per_cpu_load, __per_cpu_end - __per_cpu_start); | ||
| 200 | per_cpu_offset(cpu) = ptr - __per_cpu_start; | 95 | per_cpu_offset(cpu) = ptr - __per_cpu_start; |
| 201 | memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); | 96 | per_cpu(this_cpu_off, cpu) = per_cpu_offset(cpu); |
| 97 | per_cpu(cpu_number, cpu) = cpu; | ||
| 98 | setup_percpu_segment(cpu); | ||
| 99 | setup_stack_canary_segment(cpu); | ||
| 100 | /* | ||
| 101 | * Copy data used in early init routines from the | ||
| 102 | * initial arrays to the per cpu data areas. These | ||
| 103 | * arrays then become expendable and the *_early_ptr's | ||
| 104 | * are zeroed indicating that the static arrays are | ||
| 105 | * gone. | ||
| 106 | */ | ||
| 107 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 108 | per_cpu(x86_cpu_to_apicid, cpu) = | ||
| 109 | early_per_cpu_map(x86_cpu_to_apicid, cpu); | ||
| 110 | per_cpu(x86_bios_cpu_apicid, cpu) = | ||
| 111 | early_per_cpu_map(x86_bios_cpu_apicid, cpu); | ||
| 112 | #endif | ||
| 113 | #ifdef CONFIG_X86_64 | ||
| 114 | per_cpu(irq_stack_ptr, cpu) = | ||
| 115 | per_cpu(irq_stack_union.irq_stack, cpu) + | ||
| 116 | IRQ_STACK_SIZE - 64; | ||
| 117 | #ifdef CONFIG_NUMA | ||
| 118 | per_cpu(x86_cpu_to_node_map, cpu) = | ||
| 119 | early_per_cpu_map(x86_cpu_to_node_map, cpu); | ||
| 120 | #endif | ||
| 121 | #endif | ||
| 122 | /* | ||
| 123 | * Up to this point, the boot CPU has been using .data.init | ||
| 124 | * area. Reload any changed state for the boot CPU. | ||
| 125 | */ | ||
| 126 | if (cpu == boot_cpu_id) | ||
| 127 | switch_to_new_gdt(cpu); | ||
| 128 | |||
| 129 | DBG("PERCPU: cpu %4d %p\n", cpu, ptr); | ||
| 202 | } | 130 | } |
| 203 | 131 | ||
| 204 | /* Setup percpu data maps */ | 132 | /* indicate the early static arrays will soon be gone */ |
| 205 | setup_per_cpu_maps(); | 133 | #ifdef CONFIG_X86_LOCAL_APIC |
| 134 | early_per_cpu_ptr(x86_cpu_to_apicid) = NULL; | ||
| 135 | early_per_cpu_ptr(x86_bios_cpu_apicid) = NULL; | ||
| 136 | #endif | ||
| 137 | #if defined(CONFIG_X86_64) && defined(CONFIG_NUMA) | ||
| 138 | early_per_cpu_ptr(x86_cpu_to_node_map) = NULL; | ||
| 139 | #endif | ||
| 206 | 140 | ||
| 207 | /* Setup node to cpumask map */ | 141 | /* Setup node to cpumask map */ |
| 208 | setup_node_to_cpumask_map(); | 142 | setup_node_to_cpumask_map(); |
| @@ -210,199 +144,3 @@ void __init setup_per_cpu_areas(void) | |||
| 210 | /* Setup cpu initialized, callin, callout masks */ | 144 | /* Setup cpu initialized, callin, callout masks */ |
| 211 | setup_cpu_local_masks(); | 145 | setup_cpu_local_masks(); |
| 212 | } | 146 | } |
| 213 | |||
| 214 | #endif | ||
| 215 | |||
| 216 | #ifdef X86_64_NUMA | ||
| 217 | |||
| 218 | /* | ||
| 219 | * Allocate node_to_cpumask_map based on number of available nodes | ||
| 220 | * Requires node_possible_map to be valid. | ||
| 221 | * | ||
| 222 | * Note: node_to_cpumask() is not valid until after this is done. | ||
| 223 | */ | ||
| 224 | static void __init setup_node_to_cpumask_map(void) | ||
| 225 | { | ||
| 226 | unsigned int node, num = 0; | ||
| 227 | cpumask_t *map; | ||
| 228 | |||
| 229 | /* setup nr_node_ids if not done yet */ | ||
| 230 | if (nr_node_ids == MAX_NUMNODES) { | ||
| 231 | for_each_node_mask(node, node_possible_map) | ||
| 232 | num = node; | ||
| 233 | nr_node_ids = num + 1; | ||
| 234 | } | ||
| 235 | |||
| 236 | /* allocate the map */ | ||
| 237 | map = alloc_bootmem_low(nr_node_ids * sizeof(cpumask_t)); | ||
| 238 | |||
| 239 | pr_debug("Node to cpumask map at %p for %d nodes\n", | ||
| 240 | map, nr_node_ids); | ||
| 241 | |||
| 242 | /* node_to_cpumask() will now work */ | ||
| 243 | node_to_cpumask_map = map; | ||
| 244 | } | ||
| 245 | |||
| 246 | void __cpuinit numa_set_node(int cpu, int node) | ||
| 247 | { | ||
| 248 | int *cpu_to_node_map = early_per_cpu_ptr(x86_cpu_to_node_map); | ||
| 249 | |||
| 250 | if (cpu_pda(cpu) && node != NUMA_NO_NODE) | ||
| 251 | cpu_pda(cpu)->nodenumber = node; | ||
| 252 | |||
| 253 | if (cpu_to_node_map) | ||
| 254 | cpu_to_node_map[cpu] = node; | ||
| 255 | |||
| 256 | else if (per_cpu_offset(cpu)) | ||
| 257 | per_cpu(x86_cpu_to_node_map, cpu) = node; | ||
| 258 | |||
| 259 | else | ||
| 260 | pr_debug("Setting node for non-present cpu %d\n", cpu); | ||
| 261 | } | ||
| 262 | |||
| 263 | void __cpuinit numa_clear_node(int cpu) | ||
| 264 | { | ||
| 265 | numa_set_node(cpu, NUMA_NO_NODE); | ||
| 266 | } | ||
| 267 | |||
| 268 | #ifndef CONFIG_DEBUG_PER_CPU_MAPS | ||
| 269 | |||
| 270 | void __cpuinit numa_add_cpu(int cpu) | ||
| 271 | { | ||
| 272 | cpu_set(cpu, node_to_cpumask_map[early_cpu_to_node(cpu)]); | ||
| 273 | } | ||
| 274 | |||
| 275 | void __cpuinit numa_remove_cpu(int cpu) | ||
| 276 | { | ||
| 277 | cpu_clear(cpu, node_to_cpumask_map[cpu_to_node(cpu)]); | ||
| 278 | } | ||
| 279 | |||
| 280 | #else /* CONFIG_DEBUG_PER_CPU_MAPS */ | ||
| 281 | |||
| 282 | /* | ||
| 283 | * --------- debug versions of the numa functions --------- | ||
| 284 | */ | ||
| 285 | static void __cpuinit numa_set_cpumask(int cpu, int enable) | ||
| 286 | { | ||
| 287 | int node = cpu_to_node(cpu); | ||
| 288 | cpumask_t *mask; | ||
| 289 | char buf[64]; | ||
| 290 | |||
| 291 | if (node_to_cpumask_map == NULL) { | ||
| 292 | printk(KERN_ERR "node_to_cpumask_map NULL\n"); | ||
| 293 | dump_stack(); | ||
| 294 | return; | ||
| 295 | } | ||
| 296 | |||
| 297 | mask = &node_to_cpumask_map[node]; | ||
| 298 | if (enable) | ||
| 299 | cpu_set(cpu, *mask); | ||
| 300 | else | ||
| 301 | cpu_clear(cpu, *mask); | ||
| 302 | |||
| 303 | cpulist_scnprintf(buf, sizeof(buf), mask); | ||
| 304 | printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n", | ||
| 305 | enable ? "numa_add_cpu" : "numa_remove_cpu", cpu, node, buf); | ||
| 306 | } | ||
| 307 | |||
| 308 | void __cpuinit numa_add_cpu(int cpu) | ||
| 309 | { | ||
| 310 | numa_set_cpumask(cpu, 1); | ||
| 311 | } | ||
| 312 | |||
| 313 | void __cpuinit numa_remove_cpu(int cpu) | ||
| 314 | { | ||
| 315 | numa_set_cpumask(cpu, 0); | ||
| 316 | } | ||
| 317 | |||
| 318 | int cpu_to_node(int cpu) | ||
| 319 | { | ||
| 320 | if (early_per_cpu_ptr(x86_cpu_to_node_map)) { | ||
| 321 | printk(KERN_WARNING | ||
| 322 | "cpu_to_node(%d): usage too early!\n", cpu); | ||
| 323 | dump_stack(); | ||
| 324 | return early_per_cpu_ptr(x86_cpu_to_node_map)[cpu]; | ||
| 325 | } | ||
| 326 | return per_cpu(x86_cpu_to_node_map, cpu); | ||
| 327 | } | ||
| 328 | EXPORT_SYMBOL(cpu_to_node); | ||
| 329 | |||
| 330 | /* | ||
| 331 | * Same function as cpu_to_node() but used if called before the | ||
| 332 | * per_cpu areas are setup. | ||
| 333 | */ | ||
| 334 | int early_cpu_to_node(int cpu) | ||
| 335 | { | ||
| 336 | if (early_per_cpu_ptr(x86_cpu_to_node_map)) | ||
| 337 | return early_per_cpu_ptr(x86_cpu_to_node_map)[cpu]; | ||
| 338 | |||
| 339 | if (!per_cpu_offset(cpu)) { | ||
| 340 | printk(KERN_WARNING | ||
| 341 | "early_cpu_to_node(%d): no per_cpu area!\n", cpu); | ||
| 342 | dump_stack(); | ||
| 343 | return NUMA_NO_NODE; | ||
| 344 | } | ||
| 345 | return per_cpu(x86_cpu_to_node_map, cpu); | ||
| 346 | } | ||
| 347 | |||
| 348 | |||
| 349 | /* empty cpumask */ | ||
| 350 | static const cpumask_t cpu_mask_none; | ||
| 351 | |||
| 352 | /* | ||
| 353 | * Returns a pointer to the bitmask of CPUs on Node 'node'. | ||
| 354 | */ | ||
| 355 | const cpumask_t *cpumask_of_node(int node) | ||
| 356 | { | ||
| 357 | if (node_to_cpumask_map == NULL) { | ||
| 358 | printk(KERN_WARNING | ||
| 359 | "cpumask_of_node(%d): no node_to_cpumask_map!\n", | ||
| 360 | node); | ||
| 361 | dump_stack(); | ||
| 362 | return (const cpumask_t *)&cpu_online_map; | ||
| 363 | } | ||
| 364 | if (node >= nr_node_ids) { | ||
| 365 | printk(KERN_WARNING | ||
| 366 | "cpumask_of_node(%d): node > nr_node_ids(%d)\n", | ||
| 367 | node, nr_node_ids); | ||
| 368 | dump_stack(); | ||
| 369 | return &cpu_mask_none; | ||
| 370 | } | ||
| 371 | return &node_to_cpumask_map[node]; | ||
| 372 | } | ||
| 373 | EXPORT_SYMBOL(cpumask_of_node); | ||
| 374 | |||
| 375 | /* | ||
| 376 | * Returns a bitmask of CPUs on Node 'node'. | ||
| 377 | * | ||
| 378 | * Side note: this function creates the returned cpumask on the stack | ||
| 379 | * so with a high NR_CPUS count, excessive stack space is used. The | ||
| 380 | * node_to_cpumask_ptr function should be used whenever possible. | ||
| 381 | */ | ||
| 382 | cpumask_t node_to_cpumask(int node) | ||
| 383 | { | ||
| 384 | if (node_to_cpumask_map == NULL) { | ||
| 385 | printk(KERN_WARNING | ||
| 386 | "node_to_cpumask(%d): no node_to_cpumask_map!\n", node); | ||
| 387 | dump_stack(); | ||
| 388 | return cpu_online_map; | ||
| 389 | } | ||
| 390 | if (node >= nr_node_ids) { | ||
| 391 | printk(KERN_WARNING | ||
| 392 | "node_to_cpumask(%d): node > nr_node_ids(%d)\n", | ||
| 393 | node, nr_node_ids); | ||
| 394 | dump_stack(); | ||
| 395 | return cpu_mask_none; | ||
| 396 | } | ||
| 397 | return node_to_cpumask_map[node]; | ||
| 398 | } | ||
| 399 | EXPORT_SYMBOL(node_to_cpumask); | ||
| 400 | |||
| 401 | /* | ||
| 402 | * --------- end of debug versions of the numa functions --------- | ||
| 403 | */ | ||
| 404 | |||
| 405 | #endif /* CONFIG_DEBUG_PER_CPU_MAPS */ | ||
| 406 | |||
| 407 | #endif /* X86_64_NUMA */ | ||
| 408 | |||
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c index df0587f24c54..7cdcd16885ed 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c | |||
| @@ -50,27 +50,23 @@ | |||
| 50 | # define FIX_EFLAGS __FIX_EFLAGS | 50 | # define FIX_EFLAGS __FIX_EFLAGS |
| 51 | #endif | 51 | #endif |
| 52 | 52 | ||
| 53 | #define COPY(x) { \ | 53 | #define COPY(x) do { \ |
| 54 | err |= __get_user(regs->x, &sc->x); \ | 54 | get_user_ex(regs->x, &sc->x); \ |
| 55 | } | 55 | } while (0) |
| 56 | 56 | ||
| 57 | #define COPY_SEG(seg) { \ | 57 | #define GET_SEG(seg) ({ \ |
| 58 | unsigned short tmp; \ | 58 | unsigned short tmp; \ |
| 59 | err |= __get_user(tmp, &sc->seg); \ | 59 | get_user_ex(tmp, &sc->seg); \ |
| 60 | regs->seg = tmp; \ | 60 | tmp; \ |
| 61 | } | 61 | }) |
| 62 | 62 | ||
| 63 | #define COPY_SEG_CPL3(seg) { \ | 63 | #define COPY_SEG(seg) do { \ |
| 64 | unsigned short tmp; \ | 64 | regs->seg = GET_SEG(seg); \ |
| 65 | err |= __get_user(tmp, &sc->seg); \ | 65 | } while (0) |
| 66 | regs->seg = tmp | 3; \ | ||
| 67 | } | ||
| 68 | 66 | ||
| 69 | #define GET_SEG(seg) { \ | 67 | #define COPY_SEG_CPL3(seg) do { \ |
| 70 | unsigned short tmp; \ | 68 | regs->seg = GET_SEG(seg) | 3; \ |
| 71 | err |= __get_user(tmp, &sc->seg); \ | 69 | } while (0) |
| 72 | loadsegment(seg, tmp); \ | ||
| 73 | } | ||
| 74 | 70 | ||
| 75 | static int | 71 | static int |
| 76 | restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, | 72 | restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, |
| @@ -83,45 +79,49 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, | |||
| 83 | /* Always make any pending restarted system calls return -EINTR */ | 79 | /* Always make any pending restarted system calls return -EINTR */ |
| 84 | current_thread_info()->restart_block.fn = do_no_restart_syscall; | 80 | current_thread_info()->restart_block.fn = do_no_restart_syscall; |
| 85 | 81 | ||
| 82 | get_user_try { | ||
| 83 | |||
| 86 | #ifdef CONFIG_X86_32 | 84 | #ifdef CONFIG_X86_32 |
| 87 | GET_SEG(gs); | 85 | set_user_gs(regs, GET_SEG(gs)); |
| 88 | COPY_SEG(fs); | 86 | COPY_SEG(fs); |
| 89 | COPY_SEG(es); | 87 | COPY_SEG(es); |
| 90 | COPY_SEG(ds); | 88 | COPY_SEG(ds); |
| 91 | #endif /* CONFIG_X86_32 */ | 89 | #endif /* CONFIG_X86_32 */ |
| 92 | 90 | ||
| 93 | COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx); | 91 | COPY(di); COPY(si); COPY(bp); COPY(sp); COPY(bx); |
| 94 | COPY(dx); COPY(cx); COPY(ip); | 92 | COPY(dx); COPY(cx); COPY(ip); |
| 95 | 93 | ||
| 96 | #ifdef CONFIG_X86_64 | 94 | #ifdef CONFIG_X86_64 |
| 97 | COPY(r8); | 95 | COPY(r8); |
| 98 | COPY(r9); | 96 | COPY(r9); |
| 99 | COPY(r10); | 97 | COPY(r10); |
| 100 | COPY(r11); | 98 | COPY(r11); |
| 101 | COPY(r12); | 99 | COPY(r12); |
| 102 | COPY(r13); | 100 | COPY(r13); |
| 103 | COPY(r14); | 101 | COPY(r14); |
| 104 | COPY(r15); | 102 | COPY(r15); |
| 105 | #endif /* CONFIG_X86_64 */ | 103 | #endif /* CONFIG_X86_64 */ |
| 106 | 104 | ||
| 107 | #ifdef CONFIG_X86_32 | 105 | #ifdef CONFIG_X86_32 |
| 108 | COPY_SEG_CPL3(cs); | 106 | COPY_SEG_CPL3(cs); |
| 109 | COPY_SEG_CPL3(ss); | 107 | COPY_SEG_CPL3(ss); |
| 110 | #else /* !CONFIG_X86_32 */ | 108 | #else /* !CONFIG_X86_32 */ |
| 111 | /* Kernel saves and restores only the CS segment register on signals, | 109 | /* Kernel saves and restores only the CS segment register on signals, |
| 112 | * which is the bare minimum needed to allow mixed 32/64-bit code. | 110 | * which is the bare minimum needed to allow mixed 32/64-bit code. |
| 113 | * App's signal handler can save/restore other segments if needed. */ | 111 | * App's signal handler can save/restore other segments if needed. */ |
| 114 | COPY_SEG_CPL3(cs); | 112 | COPY_SEG_CPL3(cs); |
| 115 | #endif /* CONFIG_X86_32 */ | 113 | #endif /* CONFIG_X86_32 */ |
| 116 | 114 | ||
| 117 | err |= __get_user(tmpflags, &sc->flags); | 115 | get_user_ex(tmpflags, &sc->flags); |
| 118 | regs->flags = (regs->flags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS); | 116 | regs->flags = (regs->flags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS); |
| 119 | regs->orig_ax = -1; /* disable syscall checks */ | 117 | regs->orig_ax = -1; /* disable syscall checks */ |
| 118 | |||
| 119 | get_user_ex(buf, &sc->fpstate); | ||
| 120 | err |= restore_i387_xstate(buf); | ||
| 120 | 121 | ||
| 121 | err |= __get_user(buf, &sc->fpstate); | 122 | get_user_ex(*pax, &sc->ax); |
| 122 | err |= restore_i387_xstate(buf); | 123 | } get_user_catch(err); |
| 123 | 124 | ||
| 124 | err |= __get_user(*pax, &sc->ax); | ||
| 125 | return err; | 125 | return err; |
| 126 | } | 126 | } |
| 127 | 127 | ||
| @@ -131,57 +131,55 @@ setup_sigcontext(struct sigcontext __user *sc, void __user *fpstate, | |||
| 131 | { | 131 | { |
| 132 | int err = 0; | 132 | int err = 0; |
| 133 | 133 | ||
| 134 | #ifdef CONFIG_X86_32 | 134 | put_user_try { |
| 135 | { | ||
| 136 | unsigned int tmp; | ||
| 137 | 135 | ||
| 138 | savesegment(gs, tmp); | 136 | #ifdef CONFIG_X86_32 |
| 139 | err |= __put_user(tmp, (unsigned int __user *)&sc->gs); | 137 | put_user_ex(get_user_gs(regs), (unsigned int __user *)&sc->gs); |
| 140 | } | 138 | put_user_ex(regs->fs, (unsigned int __user *)&sc->fs); |
| 141 | err |= __put_user(regs->fs, (unsigned int __user *)&sc->fs); | 139 | put_user_ex(regs->es, (unsigned int __user *)&sc->es); |
| 142 | err |= __put_user(regs->es, (unsigned int __user *)&sc->es); | 140 | put_user_ex(regs->ds, (unsigned int __user *)&sc->ds); |
| 143 | err |= __put_user(regs->ds, (unsigned int __user *)&sc->ds); | ||
| 144 | #endif /* CONFIG_X86_32 */ | 141 | #endif /* CONFIG_X86_32 */ |
| 145 | 142 | ||
| 146 | err |= __put_user(regs->di, &sc->di); | 143 | put_user_ex(regs->di, &sc->di); |
| 147 | err |= __put_user(regs->si, &sc->si); | 144 | put_user_ex(regs->si, &sc->si); |
| 148 | err |= __put_user(regs->bp, &sc->bp); | 145 | put_user_ex(regs->bp, &sc->bp); |
| 149 | err |= __put_user(regs->sp, &sc->sp); | 146 | put_user_ex(regs->sp, &sc->sp); |
| 150 | err |= __put_user(regs->bx, &sc->bx); | 147 | put_user_ex(regs->bx, &sc->bx); |
| 151 | err |= __put_user(regs->dx, &sc->dx); | 148 | put_user_ex(regs->dx, &sc->dx); |
| 152 | err |= __put_user(regs->cx, &sc->cx); | 149 | put_user_ex(regs->cx, &sc->cx); |
| 153 | err |= __put_user(regs->ax, &sc->ax); | 150 | put_user_ex(regs->ax, &sc->ax); |
| 154 | #ifdef CONFIG_X86_64 | 151 | #ifdef CONFIG_X86_64 |
| 155 | err |= __put_user(regs->r8, &sc->r8); | 152 | put_user_ex(regs->r8, &sc->r8); |
| 156 | err |= __put_user(regs->r9, &sc->r9); | 153 | put_user_ex(regs->r9, &sc->r9); |
| 157 | err |= __put_user(regs->r10, &sc->r10); | 154 | put_user_ex(regs->r10, &sc->r10); |
| 158 | err |= __put_user(regs->r11, &sc->r11); | 155 | put_user_ex(regs->r11, &sc->r11); |
| 159 | err |= __put_user(regs->r12, &sc->r12); | 156 | put_user_ex(regs->r12, &sc->r12); |
| 160 | err |= __put_user(regs->r13, &sc->r13); | 157 | put_user_ex(regs->r13, &sc->r13); |
| 161 | err |= __put_user(regs->r14, &sc->r14); | 158 | put_user_ex(regs->r14, &sc->r14); |
| 162 | err |= __put_user(regs->r15, &sc->r15); | 159 | put_user_ex(regs->r15, &sc->r15); |
| 163 | #endif /* CONFIG_X86_64 */ | 160 | #endif /* CONFIG_X86_64 */ |
| 164 | 161 | ||
| 165 | err |= __put_user(current->thread.trap_no, &sc->trapno); | 162 | put_user_ex(current->thread.trap_no, &sc->trapno); |
| 166 | err |= __put_user(current->thread.error_code, &sc->err); | 163 | put_user_ex(current->thread.error_code, &sc->err); |
| 167 | err |= __put_user(regs->ip, &sc->ip); | 164 | put_user_ex(regs->ip, &sc->ip); |
| 168 | #ifdef CONFIG_X86_32 | 165 | #ifdef CONFIG_X86_32 |
| 169 | err |= __put_user(regs->cs, (unsigned int __user *)&sc->cs); | 166 | put_user_ex(regs->cs, (unsigned int __user *)&sc->cs); |
| 170 | err |= __put_user(regs->flags, &sc->flags); | 167 | put_user_ex(regs->flags, &sc->flags); |
| 171 | err |= __put_user(regs->sp, &sc->sp_at_signal); | 168 | put_user_ex(regs->sp, &sc->sp_at_signal); |
| 172 | err |= __put_user(regs->ss, (unsigned int __user *)&sc->ss); | 169 | put_user_ex(regs->ss, (unsigned int __user *)&sc->ss); |
| 173 | #else /* !CONFIG_X86_32 */ | 170 | #else /* !CONFIG_X86_32 */ |
| 174 | err |= __put_user(regs->flags, &sc->flags); | 171 | put_user_ex(regs->flags, &sc->flags); |
| 175 | err |= __put_user(regs->cs, &sc->cs); | 172 | put_user_ex(regs->cs, &sc->cs); |
| 176 | err |= __put_user(0, &sc->gs); | 173 | put_user_ex(0, &sc->gs); |
| 177 | err |= __put_user(0, &sc->fs); | 174 | put_user_ex(0, &sc->fs); |
| 178 | #endif /* CONFIG_X86_32 */ | 175 | #endif /* CONFIG_X86_32 */ |
| 179 | 176 | ||
| 180 | err |= __put_user(fpstate, &sc->fpstate); | 177 | put_user_ex(fpstate, &sc->fpstate); |
| 181 | 178 | ||
| 182 | /* non-iBCS2 extensions.. */ | 179 | /* non-iBCS2 extensions.. */ |
| 183 | err |= __put_user(mask, &sc->oldmask); | 180 | put_user_ex(mask, &sc->oldmask); |
| 184 | err |= __put_user(current->thread.cr2, &sc->cr2); | 181 | put_user_ex(current->thread.cr2, &sc->cr2); |
| 182 | } put_user_catch(err); | ||
| 185 | 183 | ||
| 186 | return err; | 184 | return err; |
| 187 | } | 185 | } |
| @@ -336,43 +334,41 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 336 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) | 334 | if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame))) |
| 337 | return -EFAULT; | 335 | return -EFAULT; |
| 338 | 336 | ||
| 339 | err |= __put_user(sig, &frame->sig); | 337 | put_user_try { |
| 340 | err |= __put_user(&frame->info, &frame->pinfo); | 338 | put_user_ex(sig, &frame->sig); |
| 341 | err |= __put_user(&frame->uc, &frame->puc); | 339 | put_user_ex(&frame->info, &frame->pinfo); |
| 342 | err |= copy_siginfo_to_user(&frame->info, info); | 340 | put_user_ex(&frame->uc, &frame->puc); |
| 343 | if (err) | 341 | err |= copy_siginfo_to_user(&frame->info, info); |
| 344 | return -EFAULT; | ||
| 345 | |||
| 346 | /* Create the ucontext. */ | ||
| 347 | if (cpu_has_xsave) | ||
| 348 | err |= __put_user(UC_FP_XSTATE, &frame->uc.uc_flags); | ||
| 349 | else | ||
| 350 | err |= __put_user(0, &frame->uc.uc_flags); | ||
| 351 | err |= __put_user(0, &frame->uc.uc_link); | ||
| 352 | err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | ||
| 353 | err |= __put_user(sas_ss_flags(regs->sp), | ||
| 354 | &frame->uc.uc_stack.ss_flags); | ||
| 355 | err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 356 | err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate, | ||
| 357 | regs, set->sig[0]); | ||
| 358 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | ||
| 359 | if (err) | ||
| 360 | return -EFAULT; | ||
| 361 | 342 | ||
| 362 | /* Set up to return from userspace. */ | 343 | /* Create the ucontext. */ |
| 363 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn); | 344 | if (cpu_has_xsave) |
| 364 | if (ka->sa.sa_flags & SA_RESTORER) | 345 | put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags); |
| 365 | restorer = ka->sa.sa_restorer; | 346 | else |
| 366 | err |= __put_user(restorer, &frame->pretcode); | 347 | put_user_ex(0, &frame->uc.uc_flags); |
| 348 | put_user_ex(0, &frame->uc.uc_link); | ||
| 349 | put_user_ex(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | ||
| 350 | put_user_ex(sas_ss_flags(regs->sp), | ||
| 351 | &frame->uc.uc_stack.ss_flags); | ||
| 352 | put_user_ex(current->sas_ss_size, &frame->uc.uc_stack.ss_size); | ||
| 353 | err |= setup_sigcontext(&frame->uc.uc_mcontext, fpstate, | ||
| 354 | regs, set->sig[0]); | ||
| 355 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | ||
| 356 | |||
| 357 | /* Set up to return from userspace. */ | ||
| 358 | restorer = VDSO32_SYMBOL(current->mm->context.vdso, rt_sigreturn); | ||
| 359 | if (ka->sa.sa_flags & SA_RESTORER) | ||
| 360 | restorer = ka->sa.sa_restorer; | ||
| 361 | put_user_ex(restorer, &frame->pretcode); | ||
| 367 | 362 | ||
| 368 | /* | 363 | /* |
| 369 | * This is movl $__NR_rt_sigreturn, %ax ; int $0x80 | 364 | * This is movl $__NR_rt_sigreturn, %ax ; int $0x80 |
| 370 | * | 365 | * |
| 371 | * WE DO NOT USE IT ANY MORE! It's only left here for historical | 366 | * WE DO NOT USE IT ANY MORE! It's only left here for historical |
| 372 | * reasons and because gdb uses it as a signature to notice | 367 | * reasons and because gdb uses it as a signature to notice |
| 373 | * signal handler stack frames. | 368 | * signal handler stack frames. |
| 374 | */ | 369 | */ |
| 375 | err |= __put_user(*((u64 *)&rt_retcode), (u64 *)frame->retcode); | 370 | put_user_ex(*((u64 *)&rt_retcode), (u64 *)frame->retcode); |
| 371 | } put_user_catch(err); | ||
| 376 | 372 | ||
| 377 | if (err) | 373 | if (err) |
| 378 | return -EFAULT; | 374 | return -EFAULT; |
| @@ -436,28 +432,30 @@ static int __setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
| 436 | return -EFAULT; | 432 | return -EFAULT; |
| 437 | } | 433 | } |
| 438 | 434 | ||
| 439 | /* Create the ucontext. */ | 435 | put_user_try { |
| 440 | if (cpu_has_xsave) | 436 | /* Create the ucontext. */ |
| 441 | err |= __put_user(UC_FP_XSTATE, &frame->uc.uc_flags); | 437 | if (cpu_has_xsave) |
| 442 | else | 438 | put_user_ex(UC_FP_XSTATE, &frame->uc.uc_flags); |
| 443 | err |= __put_user(0, &frame->uc.uc_flags); | 439 | else |
| 444 | err |= __put_user(0, &frame->uc.uc_link); | 440 | put_user_ex(0, &frame->uc.uc_flags); |
| 445 | err |= __put_user(me->sas_ss_sp, &frame->uc.uc_stack.ss_sp); | 441 | put_user_ex(0, &frame->uc.uc_link); |
| 446 | err |= __put_user(sas_ss_flags(regs->sp), | 442 | put_user_ex(me->sas_ss_sp, &frame->uc.uc_stack.ss_sp); |
| 447 | &frame->uc.uc_stack.ss_flags); | 443 | put_user_ex(sas_ss_flags(regs->sp), |
| 448 | err |= __put_user(me->sas_ss_size, &frame->uc.uc_stack.ss_size); | 444 | &frame->uc.uc_stack.ss_flags); |
| 449 | err |= setup_sigcontext(&frame->uc.uc_mcontext, fp, regs, set->sig[0]); | 445 | put_user_ex(me->sas_ss_size, &frame->uc.uc_stack.ss_size); |
| 450 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | 446 | err |= setup_sigcontext(&frame->uc.uc_mcontext, fp, regs, set->sig[0]); |
| 451 | 447 | err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)); | |
| 452 | /* Set up to return from userspace. If provided, use a stub | 448 | |
| 453 | already in userspace. */ | 449 | /* Set up to return from userspace. If provided, use a stub |
| 454 | /* x86-64 should always use SA_RESTORER. */ | 450 | already in userspace. */ |
| 455 | if (ka->sa.sa_flags & SA_RESTORER) { | 451 | /* x86-64 should always use SA_RESTORER. */ |
| 456 | err |= __put_user(ka->sa.sa_restorer, &frame->pretcode); | 452 | if (ka->sa.sa_flags & SA_RESTORER) { |
| 457 | } else { | 453 | put_user_ex(ka->sa.sa_restorer, &frame->pretcode); |
| 458 | /* could use a vstub here */ | 454 | } else { |
| 459 | return -EFAULT; | 455 | /* could use a vstub here */ |
| 460 | } | 456 | err |= -EFAULT; |
| 457 | } | ||
| 458 | } put_user_catch(err); | ||
| 461 | 459 | ||
| 462 | if (err) | 460 | if (err) |
| 463 | return -EFAULT; | 461 | return -EFAULT; |
| @@ -509,31 +507,41 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
| 509 | struct old_sigaction __user *oact) | 507 | struct old_sigaction __user *oact) |
| 510 | { | 508 | { |
| 511 | struct k_sigaction new_ka, old_ka; | 509 | struct k_sigaction new_ka, old_ka; |
| 512 | int ret; | 510 | int ret = 0; |
| 513 | 511 | ||
| 514 | if (act) { | 512 | if (act) { |
| 515 | old_sigset_t mask; | 513 | old_sigset_t mask; |
| 516 | 514 | ||
| 517 | if (!access_ok(VERIFY_READ, act, sizeof(*act)) || | 515 | if (!access_ok(VERIFY_READ, act, sizeof(*act))) |
| 518 | __get_user(new_ka.sa.sa_handler, &act->sa_handler) || | ||
| 519 | __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) | ||
| 520 | return -EFAULT; | 516 | return -EFAULT; |
| 521 | 517 | ||
| 522 | __get_user(new_ka.sa.sa_flags, &act->sa_flags); | 518 | get_user_try { |
| 523 | __get_user(mask, &act->sa_mask); | 519 | get_user_ex(new_ka.sa.sa_handler, &act->sa_handler); |
| 520 | get_user_ex(new_ka.sa.sa_flags, &act->sa_flags); | ||
| 521 | get_user_ex(mask, &act->sa_mask); | ||
| 522 | get_user_ex(new_ka.sa.sa_restorer, &act->sa_restorer); | ||
| 523 | } get_user_catch(ret); | ||
| 524 | |||
| 525 | if (ret) | ||
| 526 | return -EFAULT; | ||
| 524 | siginitset(&new_ka.sa.sa_mask, mask); | 527 | siginitset(&new_ka.sa.sa_mask, mask); |
| 525 | } | 528 | } |
| 526 | 529 | ||
| 527 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); | 530 | ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); |
| 528 | 531 | ||
| 529 | if (!ret && oact) { | 532 | if (!ret && oact) { |
| 530 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || | 533 | if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact))) |
| 531 | __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || | ||
| 532 | __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) | ||
| 533 | return -EFAULT; | 534 | return -EFAULT; |
| 534 | 535 | ||
| 535 | __put_user(old_ka.sa.sa_flags, &oact->sa_flags); | 536 | put_user_try { |
| 536 | __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | 537 | put_user_ex(old_ka.sa.sa_handler, &oact->sa_handler); |
| 538 | put_user_ex(old_ka.sa.sa_flags, &oact->sa_flags); | ||
| 539 | put_user_ex(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); | ||
| 540 | put_user_ex(old_ka.sa.sa_restorer, &oact->sa_restorer); | ||
| 541 | } put_user_catch(ret); | ||
| 542 | |||
| 543 | if (ret) | ||
| 544 | return -EFAULT; | ||
| 537 | } | 545 | } |
| 538 | 546 | ||
| 539 | return ret; | 547 | return ret; |
| @@ -541,14 +549,9 @@ sys_sigaction(int sig, const struct old_sigaction __user *act, | |||
| 541 | #endif /* CONFIG_X86_32 */ | 549 | #endif /* CONFIG_X86_32 */ |
| 542 | 550 | ||
| 543 | #ifdef CONFIG_X86_32 | 551 | #ifdef CONFIG_X86_32 |
| 544 | asmlinkage int sys_sigaltstack(unsigned long bx) | 552 | int sys_sigaltstack(struct pt_regs *regs) |
| 545 | { | 553 | { |
| 546 | /* | 554 | const stack_t __user *uss = (const stack_t __user *)regs->bx; |
| 547 | * This is needed to make gcc realize it doesn't own the | ||
| 548 | * "struct pt_regs" | ||
| 549 | */ | ||
| 550 | struct pt_regs *regs = (struct pt_regs *)&bx; | ||
| 551 | const stack_t __user *uss = (const stack_t __user *)bx; | ||
| 552 | stack_t __user *uoss = (stack_t __user *)regs->cx; | 555 | stack_t __user *uoss = (stack_t __user *)regs->cx; |
| 553 | 556 | ||
| 554 | return do_sigaltstack(uss, uoss, regs->sp); | 557 | return do_sigaltstack(uss, uoss, regs->sp); |
| @@ -566,14 +569,12 @@ sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, | |||
| 566 | * Do a signal return; undo the signal stack. | 569 | * Do a signal return; undo the signal stack. |
| 567 | */ | 570 | */ |
| 568 | #ifdef CONFIG_X86_32 | 571 | #ifdef CONFIG_X86_32 |
| 569 | asmlinkage unsigned long sys_sigreturn(unsigned long __unused) | 572 | unsigned long sys_sigreturn(struct pt_regs *regs) |
| 570 | { | 573 | { |
| 571 | struct sigframe __user *frame; | 574 | struct sigframe __user *frame; |
| 572 | struct pt_regs *regs; | ||
| 573 | unsigned long ax; | 575 | unsigned long ax; |
| 574 | sigset_t set; | 576 | sigset_t set; |
| 575 | 577 | ||
| 576 | regs = (struct pt_regs *) &__unused; | ||
| 577 | frame = (struct sigframe __user *)(regs->sp - 8); | 578 | frame = (struct sigframe __user *)(regs->sp - 8); |
| 578 | 579 | ||
| 579 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) | 580 | if (!access_ok(VERIFY_READ, frame, sizeof(*frame))) |
| @@ -600,7 +601,7 @@ badframe: | |||
| 600 | } | 601 | } |
| 601 | #endif /* CONFIG_X86_32 */ | 602 | #endif /* CONFIG_X86_32 */ |
| 602 | 603 | ||
| 603 | static long do_rt_sigreturn(struct pt_regs *regs) | 604 | long sys_rt_sigreturn(struct pt_regs *regs) |
| 604 | { | 605 | { |
| 605 | struct rt_sigframe __user *frame; | 606 | struct rt_sigframe __user *frame; |
| 606 | unsigned long ax; | 607 | unsigned long ax; |
| @@ -631,25 +632,6 @@ badframe: | |||
| 631 | return 0; | 632 | return 0; |
| 632 | } | 633 | } |
| 633 | 634 | ||
| 634 | #ifdef CONFIG_X86_32 | ||
| 635 | /* | ||
| 636 | * Note: do not pass in pt_regs directly as with tail-call optimization | ||
| 637 | * GCC will incorrectly stomp on the caller's frame and corrupt user-space | ||
| 638 | * register state: | ||
| 639 | */ | ||
| 640 | asmlinkage int sys_rt_sigreturn(unsigned long __unused) | ||
| 641 | { | ||
| 642 | struct pt_regs *regs = (struct pt_regs *)&__unused; | ||
| 643 | |||
| 644 | return do_rt_sigreturn(regs); | ||
| 645 | } | ||
| 646 | #else /* !CONFIG_X86_32 */ | ||
| 647 | asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) | ||
| 648 | { | ||
| 649 | return do_rt_sigreturn(regs); | ||
| 650 | } | ||
| 651 | #endif /* CONFIG_X86_32 */ | ||
| 652 | |||
| 653 | /* | 635 | /* |
| 654 | * OK, we're invoking a handler: | 636 | * OK, we're invoking a handler: |
| 655 | */ | 637 | */ |
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index e6faa3316bd2..13f33ea8ccaa 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * Intel SMP support routines. | 2 | * Intel SMP support routines. |
| 3 | * | 3 | * |
| 4 | * (c) 1995 Alan Cox, Building #3 <alan@lxorguk.ukuu.org.uk> | 4 | * (c) 1995 Alan Cox, Building #3 <alan@lxorguk.ukuu.org.uk> |
| 5 | * (c) 1998-99, 2000 Ingo Molnar <mingo@redhat.com> | 5 | * (c) 1998-99, 2000, 2009 Ingo Molnar <mingo@redhat.com> |
| 6 | * (c) 2002,2003 Andi Kleen, SuSE Labs. | 6 | * (c) 2002,2003 Andi Kleen, SuSE Labs. |
| 7 | * | 7 | * |
| 8 | * i386 and x86_64 integration by Glauber Costa <gcosta@redhat.com> | 8 | * i386 and x86_64 integration by Glauber Costa <gcosta@redhat.com> |
| @@ -26,8 +26,7 @@ | |||
| 26 | #include <asm/tlbflush.h> | 26 | #include <asm/tlbflush.h> |
| 27 | #include <asm/mmu_context.h> | 27 | #include <asm/mmu_context.h> |
| 28 | #include <asm/proto.h> | 28 | #include <asm/proto.h> |
| 29 | #include <mach_ipi.h> | 29 | #include <asm/apic.h> |
| 30 | #include <mach_apic.h> | ||
| 31 | /* | 30 | /* |
| 32 | * Some notes on x86 processor bugs affecting SMP operation: | 31 | * Some notes on x86 processor bugs affecting SMP operation: |
| 33 | * | 32 | * |
| @@ -118,12 +117,12 @@ static void native_smp_send_reschedule(int cpu) | |||
| 118 | WARN_ON(1); | 117 | WARN_ON(1); |
| 119 | return; | 118 | return; |
| 120 | } | 119 | } |
| 121 | send_IPI_mask(cpumask_of(cpu), RESCHEDULE_VECTOR); | 120 | apic->send_IPI_mask(cpumask_of(cpu), RESCHEDULE_VECTOR); |
| 122 | } | 121 | } |
| 123 | 122 | ||
| 124 | void native_send_call_func_single_ipi(int cpu) | 123 | void native_send_call_func_single_ipi(int cpu) |
| 125 | { | 124 | { |
| 126 | send_IPI_mask(cpumask_of(cpu), CALL_FUNCTION_SINGLE_VECTOR); | 125 | apic->send_IPI_mask(cpumask_of(cpu), CALL_FUNCTION_SINGLE_VECTOR); |
| 127 | } | 126 | } |
| 128 | 127 | ||
| 129 | void native_send_call_func_ipi(const struct cpumask *mask) | 128 | void native_send_call_func_ipi(const struct cpumask *mask) |
| @@ -131,7 +130,7 @@ void native_send_call_func_ipi(const struct cpumask *mask) | |||
| 131 | cpumask_var_t allbutself; | 130 | cpumask_var_t allbutself; |
| 132 | 131 | ||
| 133 | if (!alloc_cpumask_var(&allbutself, GFP_ATOMIC)) { | 132 | if (!alloc_cpumask_var(&allbutself, GFP_ATOMIC)) { |
| 134 | send_IPI_mask(mask, CALL_FUNCTION_VECTOR); | 133 | apic->send_IPI_mask(mask, CALL_FUNCTION_VECTOR); |
| 135 | return; | 134 | return; |
| 136 | } | 135 | } |
| 137 | 136 | ||
| @@ -140,9 +139,9 @@ void native_send_call_func_ipi(const struct cpumask *mask) | |||
| 140 | 139 | ||
| 141 | if (cpumask_equal(mask, allbutself) && | 140 | if (cpumask_equal(mask, allbutself) && |
| 142 | cpumask_equal(cpu_online_mask, cpu_callout_mask)) | 141 | cpumask_equal(cpu_online_mask, cpu_callout_mask)) |
| 143 | send_IPI_allbutself(CALL_FUNCTION_VECTOR); | 142 | apic->send_IPI_allbutself(CALL_FUNCTION_VECTOR); |
| 144 | else | 143 | else |
| 145 | send_IPI_mask(mask, CALL_FUNCTION_VECTOR); | 144 | apic->send_IPI_mask(mask, CALL_FUNCTION_VECTOR); |
| 146 | 145 | ||
| 147 | free_cpumask_var(allbutself); | 146 | free_cpumask_var(allbutself); |
| 148 | } | 147 | } |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index bb1a3b1fc87f..9ce666387f37 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * x86 SMP booting functions | 2 | * x86 SMP booting functions |
| 3 | * | 3 | * |
| 4 | * (c) 1995 Alan Cox, Building #3 <alan@lxorguk.ukuu.org.uk> | 4 | * (c) 1995 Alan Cox, Building #3 <alan@lxorguk.ukuu.org.uk> |
| 5 | * (c) 1998, 1999, 2000 Ingo Molnar <mingo@redhat.com> | 5 | * (c) 1998, 1999, 2000, 2009 Ingo Molnar <mingo@redhat.com> |
| 6 | * Copyright 2001 Andi Kleen, SuSE Labs. | 6 | * Copyright 2001 Andi Kleen, SuSE Labs. |
| 7 | * | 7 | * |
| 8 | * Much of the core SMP work is based on previous work by Thomas Radke, to | 8 | * Much of the core SMP work is based on previous work by Thomas Radke, to |
| @@ -53,7 +53,6 @@ | |||
| 53 | #include <asm/nmi.h> | 53 | #include <asm/nmi.h> |
| 54 | #include <asm/irq.h> | 54 | #include <asm/irq.h> |
| 55 | #include <asm/idle.h> | 55 | #include <asm/idle.h> |
| 56 | #include <asm/smp.h> | ||
| 57 | #include <asm/trampoline.h> | 56 | #include <asm/trampoline.h> |
| 58 | #include <asm/cpu.h> | 57 | #include <asm/cpu.h> |
| 59 | #include <asm/numa.h> | 58 | #include <asm/numa.h> |
| @@ -61,13 +60,12 @@ | |||
| 61 | #include <asm/tlbflush.h> | 60 | #include <asm/tlbflush.h> |
| 62 | #include <asm/mtrr.h> | 61 | #include <asm/mtrr.h> |
| 63 | #include <asm/vmi.h> | 62 | #include <asm/vmi.h> |
| 64 | #include <asm/genapic.h> | 63 | #include <asm/apic.h> |
| 65 | #include <asm/setup.h> | 64 | #include <asm/setup.h> |
| 65 | #include <asm/uv/uv.h> | ||
| 66 | #include <linux/mc146818rtc.h> | 66 | #include <linux/mc146818rtc.h> |
| 67 | 67 | ||
| 68 | #include <mach_apic.h> | 68 | #include <asm/smpboot_hooks.h> |
| 69 | #include <mach_wakecpu.h> | ||
| 70 | #include <smpboot_hooks.h> | ||
| 71 | 69 | ||
| 72 | #ifdef CONFIG_X86_32 | 70 | #ifdef CONFIG_X86_32 |
| 73 | u8 apicid_2_node[MAX_APICID]; | 71 | u8 apicid_2_node[MAX_APICID]; |
| @@ -163,7 +161,7 @@ static void map_cpu_to_logical_apicid(void) | |||
| 163 | { | 161 | { |
| 164 | int cpu = smp_processor_id(); | 162 | int cpu = smp_processor_id(); |
| 165 | int apicid = logical_smp_processor_id(); | 163 | int apicid = logical_smp_processor_id(); |
| 166 | int node = apicid_to_node(apicid); | 164 | int node = apic->apicid_to_node(apicid); |
| 167 | 165 | ||
| 168 | if (!node_online(node)) | 166 | if (!node_online(node)) |
| 169 | node = first_online_node; | 167 | node = first_online_node; |
| @@ -196,7 +194,8 @@ static void __cpuinit smp_callin(void) | |||
| 196 | * our local APIC. We have to wait for the IPI or we'll | 194 | * our local APIC. We have to wait for the IPI or we'll |
| 197 | * lock up on an APIC access. | 195 | * lock up on an APIC access. |
| 198 | */ | 196 | */ |
| 199 | wait_for_init_deassert(&init_deasserted); | 197 | if (apic->wait_for_init_deassert) |
| 198 | apic->wait_for_init_deassert(&init_deasserted); | ||
| 200 | 199 | ||
| 201 | /* | 200 | /* |
| 202 | * (This works even if the APIC is not enabled.) | 201 | * (This works even if the APIC is not enabled.) |
| @@ -243,7 +242,8 @@ static void __cpuinit smp_callin(void) | |||
| 243 | */ | 242 | */ |
| 244 | 243 | ||
| 245 | pr_debug("CALLIN, before setup_local_APIC().\n"); | 244 | pr_debug("CALLIN, before setup_local_APIC().\n"); |
| 246 | smp_callin_clear_local_apic(); | 245 | if (apic->smp_callin_clear_local_apic) |
| 246 | apic->smp_callin_clear_local_apic(); | ||
| 247 | setup_local_APIC(); | 247 | setup_local_APIC(); |
| 248 | end_local_APIC_setup(); | 248 | end_local_APIC_setup(); |
| 249 | map_cpu_to_logical_apicid(); | 249 | map_cpu_to_logical_apicid(); |
| @@ -583,7 +583,7 @@ wakeup_secondary_cpu_via_nmi(int logical_apicid, unsigned long start_eip) | |||
| 583 | /* Target chip */ | 583 | /* Target chip */ |
| 584 | /* Boot on the stack */ | 584 | /* Boot on the stack */ |
| 585 | /* Kick the second */ | 585 | /* Kick the second */ |
| 586 | apic_icr_write(APIC_DM_NMI | APIC_DEST_LOGICAL, logical_apicid); | 586 | apic_icr_write(APIC_DM_NMI | apic->dest_logical, logical_apicid); |
| 587 | 587 | ||
| 588 | pr_debug("Waiting for send to finish...\n"); | 588 | pr_debug("Waiting for send to finish...\n"); |
| 589 | send_status = safe_apic_wait_icr_idle(); | 589 | send_status = safe_apic_wait_icr_idle(); |
| @@ -745,78 +745,22 @@ static void __cpuinit do_fork_idle(struct work_struct *work) | |||
| 745 | complete(&c_idle->done); | 745 | complete(&c_idle->done); |
| 746 | } | 746 | } |
| 747 | 747 | ||
| 748 | #ifdef CONFIG_X86_64 | ||
| 749 | |||
| 750 | /* __ref because it's safe to call free_bootmem when after_bootmem == 0. */ | ||
| 751 | static void __ref free_bootmem_pda(struct x8664_pda *oldpda) | ||
| 752 | { | ||
| 753 | if (!after_bootmem) | ||
| 754 | free_bootmem((unsigned long)oldpda, sizeof(*oldpda)); | ||
| 755 | } | ||
| 756 | |||
| 757 | /* | ||
| 758 | * Allocate node local memory for the AP pda. | ||
| 759 | * | ||
| 760 | * Must be called after the _cpu_pda pointer table is initialized. | ||
| 761 | */ | ||
| 762 | int __cpuinit get_local_pda(int cpu) | ||
| 763 | { | ||
| 764 | struct x8664_pda *oldpda, *newpda; | ||
| 765 | unsigned long size = sizeof(struct x8664_pda); | ||
| 766 | int node = cpu_to_node(cpu); | ||
| 767 | |||
| 768 | if (cpu_pda(cpu) && !cpu_pda(cpu)->in_bootmem) | ||
| 769 | return 0; | ||
| 770 | |||
| 771 | oldpda = cpu_pda(cpu); | ||
| 772 | newpda = kmalloc_node(size, GFP_ATOMIC, node); | ||
| 773 | if (!newpda) { | ||
| 774 | printk(KERN_ERR "Could not allocate node local PDA " | ||
| 775 | "for CPU %d on node %d\n", cpu, node); | ||
| 776 | |||
| 777 | if (oldpda) | ||
| 778 | return 0; /* have a usable pda */ | ||
| 779 | else | ||
| 780 | return -1; | ||
| 781 | } | ||
| 782 | |||
| 783 | if (oldpda) { | ||
| 784 | memcpy(newpda, oldpda, size); | ||
| 785 | free_bootmem_pda(oldpda); | ||
| 786 | } | ||
| 787 | |||
| 788 | newpda->in_bootmem = 0; | ||
| 789 | cpu_pda(cpu) = newpda; | ||
| 790 | return 0; | ||
| 791 | } | ||
| 792 | #endif /* CONFIG_X86_64 */ | ||
| 793 | |||
| 794 | static int __cpuinit do_boot_cpu(int apicid, int cpu) | ||
| 795 | /* | 748 | /* |
| 796 | * NOTE - on most systems this is a PHYSICAL apic ID, but on multiquad | 749 | * NOTE - on most systems this is a PHYSICAL apic ID, but on multiquad |
| 797 | * (ie clustered apic addressing mode), this is a LOGICAL apic ID. | 750 | * (ie clustered apic addressing mode), this is a LOGICAL apic ID. |
| 798 | * Returns zero if CPU booted OK, else error code from wakeup_secondary_cpu. | 751 | * Returns zero if CPU booted OK, else error code from ->wakeup_cpu. |
| 799 | */ | 752 | */ |
| 753 | static int __cpuinit do_boot_cpu(int apicid, int cpu) | ||
| 800 | { | 754 | { |
| 801 | unsigned long boot_error = 0; | 755 | unsigned long boot_error = 0; |
| 802 | int timeout; | ||
| 803 | unsigned long start_ip; | 756 | unsigned long start_ip; |
| 804 | unsigned short nmi_high = 0, nmi_low = 0; | 757 | int timeout; |
| 805 | struct create_idle c_idle = { | 758 | struct create_idle c_idle = { |
| 806 | .cpu = cpu, | 759 | .cpu = cpu, |
| 807 | .done = COMPLETION_INITIALIZER_ONSTACK(c_idle.done), | 760 | .done = COMPLETION_INITIALIZER_ONSTACK(c_idle.done), |
| 808 | }; | 761 | }; |
| 809 | INIT_WORK(&c_idle.work, do_fork_idle); | ||
| 810 | 762 | ||
| 811 | #ifdef CONFIG_X86_64 | 763 | INIT_WORK(&c_idle.work, do_fork_idle); |
| 812 | /* Allocate node local memory for AP pdas */ | ||
| 813 | if (cpu > 0) { | ||
| 814 | boot_error = get_local_pda(cpu); | ||
| 815 | if (boot_error) | ||
| 816 | goto restore_state; | ||
| 817 | /* if can't get pda memory, can't start cpu */ | ||
| 818 | } | ||
| 819 | #endif | ||
| 820 | 764 | ||
| 821 | alternatives_smp_switch(1); | 765 | alternatives_smp_switch(1); |
| 822 | 766 | ||
| @@ -847,14 +791,16 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu) | |||
| 847 | 791 | ||
| 848 | set_idle_for_cpu(cpu, c_idle.idle); | 792 | set_idle_for_cpu(cpu, c_idle.idle); |
| 849 | do_rest: | 793 | do_rest: |
| 850 | #ifdef CONFIG_X86_32 | ||
| 851 | per_cpu(current_task, cpu) = c_idle.idle; | 794 | per_cpu(current_task, cpu) = c_idle.idle; |
| 852 | init_gdt(cpu); | 795 | #ifdef CONFIG_X86_32 |
| 853 | /* Stack for startup_32 can be just as for start_secondary onwards */ | 796 | /* Stack for startup_32 can be just as for start_secondary onwards */ |
| 854 | irq_ctx_init(cpu); | 797 | irq_ctx_init(cpu); |
| 855 | #else | 798 | #else |
| 856 | cpu_pda(cpu)->pcurrent = c_idle.idle; | ||
| 857 | clear_tsk_thread_flag(c_idle.idle, TIF_FORK); | 799 | clear_tsk_thread_flag(c_idle.idle, TIF_FORK); |
| 800 | initial_gs = per_cpu_offset(cpu); | ||
| 801 | per_cpu(kernel_stack, cpu) = | ||
| 802 | (unsigned long)task_stack_page(c_idle.idle) - | ||
| 803 | KERNEL_STACK_OFFSET + THREAD_SIZE; | ||
| 858 | #endif | 804 | #endif |
| 859 | early_gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu); | 805 | early_gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu); |
| 860 | initial_code = (unsigned long)start_secondary; | 806 | initial_code = (unsigned long)start_secondary; |
| @@ -878,8 +824,6 @@ do_rest: | |||
| 878 | 824 | ||
| 879 | pr_debug("Setting warm reset code and vector.\n"); | 825 | pr_debug("Setting warm reset code and vector.\n"); |
| 880 | 826 | ||
| 881 | store_NMI_vector(&nmi_high, &nmi_low); | ||
| 882 | |||
| 883 | smpboot_setup_warm_reset_vector(start_ip); | 827 | smpboot_setup_warm_reset_vector(start_ip); |
| 884 | /* | 828 | /* |
| 885 | * Be paranoid about clearing APIC errors. | 829 | * Be paranoid about clearing APIC errors. |
| @@ -893,7 +837,7 @@ do_rest: | |||
| 893 | /* | 837 | /* |
| 894 | * Starting actual IPI sequence... | 838 | * Starting actual IPI sequence... |
| 895 | */ | 839 | */ |
| 896 | boot_error = wakeup_secondary_cpu(apicid, start_ip); | 840 | boot_error = apic->wakeup_cpu(apicid, start_ip); |
| 897 | 841 | ||
| 898 | if (!boot_error) { | 842 | if (!boot_error) { |
| 899 | /* | 843 | /* |
| @@ -927,13 +871,11 @@ do_rest: | |||
| 927 | else | 871 | else |
| 928 | /* trampoline code not run */ | 872 | /* trampoline code not run */ |
| 929 | printk(KERN_ERR "Not responding.\n"); | 873 | printk(KERN_ERR "Not responding.\n"); |
| 930 | if (get_uv_system_type() != UV_NON_UNIQUE_APIC) | 874 | if (apic->inquire_remote_apic) |
| 931 | inquire_remote_apic(apicid); | 875 | apic->inquire_remote_apic(apicid); |
| 932 | } | 876 | } |
| 933 | } | 877 | } |
| 934 | #ifdef CONFIG_X86_64 | 878 | |
| 935 | restore_state: | ||
| 936 | #endif | ||
| 937 | if (boot_error) { | 879 | if (boot_error) { |
| 938 | /* Try to put things back the way they were before ... */ | 880 | /* Try to put things back the way they were before ... */ |
| 939 | numa_remove_cpu(cpu); /* was set by numa_add_cpu */ | 881 | numa_remove_cpu(cpu); /* was set by numa_add_cpu */ |
| @@ -961,7 +903,7 @@ restore_state: | |||
| 961 | 903 | ||
| 962 | int __cpuinit native_cpu_up(unsigned int cpu) | 904 | int __cpuinit native_cpu_up(unsigned int cpu) |
| 963 | { | 905 | { |
| 964 | int apicid = cpu_present_to_apicid(cpu); | 906 | int apicid = apic->cpu_present_to_apicid(cpu); |
| 965 | unsigned long flags; | 907 | unsigned long flags; |
| 966 | int err; | 908 | int err; |
| 967 | 909 | ||
| @@ -1054,14 +996,14 @@ static int __init smp_sanity_check(unsigned max_cpus) | |||
| 1054 | { | 996 | { |
| 1055 | preempt_disable(); | 997 | preempt_disable(); |
| 1056 | 998 | ||
| 1057 | #if defined(CONFIG_X86_PC) && defined(CONFIG_X86_32) | 999 | #if !defined(CONFIG_X86_BIGSMP) && defined(CONFIG_X86_32) |
| 1058 | if (def_to_bigsmp && nr_cpu_ids > 8) { | 1000 | if (def_to_bigsmp && nr_cpu_ids > 8) { |
| 1059 | unsigned int cpu; | 1001 | unsigned int cpu; |
| 1060 | unsigned nr; | 1002 | unsigned nr; |
| 1061 | 1003 | ||
| 1062 | printk(KERN_WARNING | 1004 | printk(KERN_WARNING |
| 1063 | "More than 8 CPUs detected - skipping them.\n" | 1005 | "More than 8 CPUs detected - skipping them.\n" |
| 1064 | "Use CONFIG_X86_GENERICARCH and CONFIG_X86_BIGSMP.\n"); | 1006 | "Use CONFIG_X86_BIGSMP.\n"); |
| 1065 | 1007 | ||
| 1066 | nr = 0; | 1008 | nr = 0; |
| 1067 | for_each_present_cpu(cpu) { | 1009 | for_each_present_cpu(cpu) { |
| @@ -1107,7 +1049,7 @@ static int __init smp_sanity_check(unsigned max_cpus) | |||
| 1107 | * Should not be necessary because the MP table should list the boot | 1049 | * Should not be necessary because the MP table should list the boot |
| 1108 | * CPU too, but we do it for the sake of robustness anyway. | 1050 | * CPU too, but we do it for the sake of robustness anyway. |
| 1109 | */ | 1051 | */ |
| 1110 | if (!check_phys_apicid_present(boot_cpu_physical_apicid)) { | 1052 | if (!apic->check_phys_apicid_present(boot_cpu_physical_apicid)) { |
| 1111 | printk(KERN_NOTICE | 1053 | printk(KERN_NOTICE |
| 1112 | "weird, boot CPU (#%d) not listed by the BIOS.\n", | 1054 | "weird, boot CPU (#%d) not listed by the BIOS.\n", |
| 1113 | boot_cpu_physical_apicid); | 1055 | boot_cpu_physical_apicid); |
| @@ -1125,6 +1067,7 @@ static int __init smp_sanity_check(unsigned max_cpus) | |||
| 1125 | printk(KERN_ERR "... forcing use of dummy APIC emulation." | 1067 | printk(KERN_ERR "... forcing use of dummy APIC emulation." |
| 1126 | "(tell your hw vendor)\n"); | 1068 | "(tell your hw vendor)\n"); |
| 1127 | smpboot_clear_io_apic(); | 1069 | smpboot_clear_io_apic(); |
| 1070 | arch_disable_smp_support(); | ||
| 1128 | return -1; | 1071 | return -1; |
| 1129 | } | 1072 | } |
| 1130 | 1073 | ||
| @@ -1181,9 +1124,9 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus) | |||
| 1181 | current_thread_info()->cpu = 0; /* needed? */ | 1124 | current_thread_info()->cpu = 0; /* needed? */ |
| 1182 | set_cpu_sibling_map(0); | 1125 | set_cpu_sibling_map(0); |
| 1183 | 1126 | ||
| 1184 | #ifdef CONFIG_X86_64 | ||
| 1185 | enable_IR_x2apic(); | 1127 | enable_IR_x2apic(); |
| 1186 | setup_apic_routing(); | 1128 | #ifdef CONFIG_X86_64 |
| 1129 | default_setup_apic_routing(); | ||
| 1187 | #endif | 1130 | #endif |
| 1188 | 1131 | ||
| 1189 | if (smp_sanity_check(max_cpus) < 0) { | 1132 | if (smp_sanity_check(max_cpus) < 0) { |
| @@ -1207,18 +1150,18 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus) | |||
| 1207 | */ | 1150 | */ |
| 1208 | setup_local_APIC(); | 1151 | setup_local_APIC(); |
| 1209 | 1152 | ||
| 1210 | #ifdef CONFIG_X86_64 | ||
| 1211 | /* | 1153 | /* |
| 1212 | * Enable IO APIC before setting up error vector | 1154 | * Enable IO APIC before setting up error vector |
| 1213 | */ | 1155 | */ |
| 1214 | if (!skip_ioapic_setup && nr_ioapics) | 1156 | if (!skip_ioapic_setup && nr_ioapics) |
| 1215 | enable_IO_APIC(); | 1157 | enable_IO_APIC(); |
| 1216 | #endif | 1158 | |
| 1217 | end_local_APIC_setup(); | 1159 | end_local_APIC_setup(); |
| 1218 | 1160 | ||
| 1219 | map_cpu_to_logical_apicid(); | 1161 | map_cpu_to_logical_apicid(); |
| 1220 | 1162 | ||
| 1221 | setup_portio_remap(); | 1163 | if (apic->setup_portio_remap) |
| 1164 | apic->setup_portio_remap(); | ||
| 1222 | 1165 | ||
| 1223 | smpboot_setup_io_apic(); | 1166 | smpboot_setup_io_apic(); |
| 1224 | /* | 1167 | /* |
| @@ -1240,10 +1183,7 @@ out: | |||
| 1240 | void __init native_smp_prepare_boot_cpu(void) | 1183 | void __init native_smp_prepare_boot_cpu(void) |
| 1241 | { | 1184 | { |
| 1242 | int me = smp_processor_id(); | 1185 | int me = smp_processor_id(); |
| 1243 | #ifdef CONFIG_X86_32 | 1186 | switch_to_new_gdt(me); |
| 1244 | init_gdt(me); | ||
| 1245 | #endif | ||
| 1246 | switch_to_new_gdt(); | ||
| 1247 | /* already set me in cpu_online_mask in boot_cpu_init() */ | 1187 | /* already set me in cpu_online_mask in boot_cpu_init() */ |
| 1248 | cpumask_set_cpu(me, cpu_callout_mask); | 1188 | cpumask_set_cpu(me, cpu_callout_mask); |
| 1249 | per_cpu(cpu_state, me) = CPU_ONLINE; | 1189 | per_cpu(cpu_state, me) = CPU_ONLINE; |
diff --git a/arch/x86/kernel/smpcommon.c b/arch/x86/kernel/smpcommon.c deleted file mode 100644 index 397e309839dd..000000000000 --- a/arch/x86/kernel/smpcommon.c +++ /dev/null | |||
| @@ -1,30 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * SMP stuff which is common to all sub-architectures. | ||
| 3 | */ | ||
| 4 | #include <linux/module.h> | ||
| 5 | #include <asm/smp.h> | ||
| 6 | |||
| 7 | #ifdef CONFIG_X86_32 | ||
| 8 | DEFINE_PER_CPU(unsigned long, this_cpu_off); | ||
| 9 | EXPORT_PER_CPU_SYMBOL(this_cpu_off); | ||
| 10 | |||
| 11 | /* | ||
| 12 | * Initialize the CPU's GDT. This is either the boot CPU doing itself | ||
| 13 | * (still using the master per-cpu area), or a CPU doing it for a | ||
| 14 | * secondary which will soon come up. | ||
| 15 | */ | ||
| 16 | __cpuinit void init_gdt(int cpu) | ||
| 17 | { | ||
| 18 | struct desc_struct gdt; | ||
| 19 | |||
| 20 | pack_descriptor(&gdt, __per_cpu_offset[cpu], 0xFFFFF, | ||
| 21 | 0x2 | DESCTYPE_S, 0x8); | ||
| 22 | gdt.s = 1; | ||
| 23 | |||
| 24 | write_gdt_entry(get_cpu_gdt_table(cpu), | ||
| 25 | GDT_ENTRY_PERCPU, &gdt, DESCTYPE_S); | ||
| 26 | |||
| 27 | per_cpu(this_cpu_off, cpu) = __per_cpu_offset[cpu]; | ||
| 28 | per_cpu(cpu_number, cpu) = cpu; | ||
| 29 | } | ||
| 30 | #endif | ||
diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c index 10786af95545..f7bddc2e37d1 100644 --- a/arch/x86/kernel/stacktrace.c +++ b/arch/x86/kernel/stacktrace.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Stack trace management functions | 2 | * Stack trace management functions |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2006 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> | 4 | * Copyright (C) 2006-2009 Red Hat, Inc., Ingo Molnar <mingo@redhat.com> |
| 5 | */ | 5 | */ |
| 6 | #include <linux/sched.h> | 6 | #include <linux/sched.h> |
| 7 | #include <linux/stacktrace.h> | 7 | #include <linux/stacktrace.h> |
diff --git a/arch/x86/kernel/summit_32.c b/arch/x86/kernel/summit_32.c deleted file mode 100644 index 7b987852e876..000000000000 --- a/arch/x86/kernel/summit_32.c +++ /dev/null | |||
| @@ -1,188 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * IBM Summit-Specific Code | ||
| 3 | * | ||
| 4 | * Written By: Matthew Dobson, IBM Corporation | ||
| 5 | * | ||
| 6 | * Copyright (c) 2003 IBM Corp. | ||
| 7 | * | ||
| 8 | * All rights reserved. | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License as published by | ||
| 12 | * the Free Software Foundation; either version 2 of the License, or (at | ||
| 13 | * your option) any later version. | ||
| 14 | * | ||
| 15 | * This program is distributed in the hope that it will be useful, but | ||
| 16 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 17 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
| 18 | * NON INFRINGEMENT. See the GNU General Public License for more | ||
| 19 | * details. | ||
| 20 | * | ||
| 21 | * You should have received a copy of the GNU General Public License | ||
| 22 | * along with this program; if not, write to the Free Software | ||
| 23 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 24 | * | ||
| 25 | * Send feedback to <colpatch@us.ibm.com> | ||
| 26 | * | ||
| 27 | */ | ||
| 28 | |||
| 29 | #include <linux/mm.h> | ||
| 30 | #include <linux/init.h> | ||
| 31 | #include <asm/io.h> | ||
| 32 | #include <asm/bios_ebda.h> | ||
| 33 | #include <asm/summit/mpparse.h> | ||
| 34 | |||
| 35 | static struct rio_table_hdr *rio_table_hdr __initdata; | ||
| 36 | static struct scal_detail *scal_devs[MAX_NUMNODES] __initdata; | ||
| 37 | static struct rio_detail *rio_devs[MAX_NUMNODES*4] __initdata; | ||
| 38 | |||
| 39 | #ifndef CONFIG_X86_NUMAQ | ||
| 40 | static int mp_bus_id_to_node[MAX_MP_BUSSES] __initdata; | ||
| 41 | #endif | ||
| 42 | |||
| 43 | static int __init setup_pci_node_map_for_wpeg(int wpeg_num, int last_bus) | ||
| 44 | { | ||
| 45 | int twister = 0, node = 0; | ||
| 46 | int i, bus, num_buses; | ||
| 47 | |||
| 48 | for (i = 0; i < rio_table_hdr->num_rio_dev; i++) { | ||
| 49 | if (rio_devs[i]->node_id == rio_devs[wpeg_num]->owner_id) { | ||
| 50 | twister = rio_devs[i]->owner_id; | ||
| 51 | break; | ||
| 52 | } | ||
| 53 | } | ||
| 54 | if (i == rio_table_hdr->num_rio_dev) { | ||
| 55 | printk(KERN_ERR "%s: Couldn't find owner Cyclone for Winnipeg!\n", __func__); | ||
| 56 | return last_bus; | ||
| 57 | } | ||
| 58 | |||
| 59 | for (i = 0; i < rio_table_hdr->num_scal_dev; i++) { | ||
| 60 | if (scal_devs[i]->node_id == twister) { | ||
| 61 | node = scal_devs[i]->node_id; | ||
| 62 | break; | ||
| 63 | } | ||
| 64 | } | ||
| 65 | if (i == rio_table_hdr->num_scal_dev) { | ||
| 66 | printk(KERN_ERR "%s: Couldn't find owner Twister for Cyclone!\n", __func__); | ||
| 67 | return last_bus; | ||
| 68 | } | ||
| 69 | |||
| 70 | switch (rio_devs[wpeg_num]->type) { | ||
| 71 | case CompatWPEG: | ||
| 72 | /* | ||
| 73 | * The Compatibility Winnipeg controls the 2 legacy buses, | ||
| 74 | * the 66MHz PCI bus [2 slots] and the 2 "extra" buses in case | ||
| 75 | * a PCI-PCI bridge card is used in either slot: total 5 buses. | ||
| 76 | */ | ||
| 77 | num_buses = 5; | ||
| 78 | break; | ||
| 79 | case AltWPEG: | ||
| 80 | /* | ||
| 81 | * The Alternate Winnipeg controls the 2 133MHz buses [1 slot | ||
| 82 | * each], their 2 "extra" buses, the 100MHz bus [2 slots] and | ||
| 83 | * the "extra" buses for each of those slots: total 7 buses. | ||
| 84 | */ | ||
| 85 | num_buses = 7; | ||
| 86 | break; | ||
| 87 | case LookOutAWPEG: | ||
| 88 | case LookOutBWPEG: | ||
| 89 | /* | ||
| 90 | * A Lookout Winnipeg controls 3 100MHz buses [2 slots each] | ||
| 91 | * & the "extra" buses for each of those slots: total 9 buses. | ||
| 92 | */ | ||
| 93 | num_buses = 9; | ||
| 94 | break; | ||
| 95 | default: | ||
| 96 | printk(KERN_INFO "%s: Unsupported Winnipeg type!\n", __func__); | ||
| 97 | return last_bus; | ||
| 98 | } | ||
| 99 | |||
| 100 | for (bus = last_bus; bus < last_bus + num_buses; bus++) | ||
| 101 | mp_bus_id_to_node[bus] = node; | ||
| 102 | return bus; | ||
| 103 | } | ||
| 104 | |||
| 105 | static int __init build_detail_arrays(void) | ||
| 106 | { | ||
| 107 | unsigned long ptr; | ||
| 108 | int i, scal_detail_size, rio_detail_size; | ||
| 109 | |||
| 110 | if (rio_table_hdr->num_scal_dev > MAX_NUMNODES) { | ||
| 111 | printk(KERN_WARNING "%s: MAX_NUMNODES too low! Defined as %d, but system has %d nodes.\n", __func__, MAX_NUMNODES, rio_table_hdr->num_scal_dev); | ||
| 112 | return 0; | ||
| 113 | } | ||
| 114 | |||
| 115 | switch (rio_table_hdr->version) { | ||
| 116 | default: | ||
| 117 | printk(KERN_WARNING "%s: Invalid Rio Grande Table Version: %d\n", __func__, rio_table_hdr->version); | ||
| 118 | return 0; | ||
| 119 | case 2: | ||
| 120 | scal_detail_size = 11; | ||
| 121 | rio_detail_size = 13; | ||
| 122 | break; | ||
| 123 | case 3: | ||
| 124 | scal_detail_size = 12; | ||
| 125 | rio_detail_size = 15; | ||
| 126 | break; | ||
| 127 | } | ||
| 128 | |||
| 129 | ptr = (unsigned long)rio_table_hdr + 3; | ||
| 130 | for (i = 0; i < rio_table_hdr->num_scal_dev; i++, ptr += scal_detail_size) | ||
| 131 | scal_devs[i] = (struct scal_detail *)ptr; | ||
| 132 | |||
| 133 | for (i = 0; i < rio_table_hdr->num_rio_dev; i++, ptr += rio_detail_size) | ||
| 134 | rio_devs[i] = (struct rio_detail *)ptr; | ||
| 135 | |||
| 136 | return 1; | ||
| 137 | } | ||
| 138 | |||
| 139 | void __init setup_summit(void) | ||
| 140 | { | ||
| 141 | unsigned long ptr; | ||
| 142 | unsigned short offset; | ||
| 143 | int i, next_wpeg, next_bus = 0; | ||
| 144 | |||
| 145 | /* The pointer to the EBDA is stored in the word @ phys 0x40E(40:0E) */ | ||
| 146 | ptr = get_bios_ebda(); | ||
| 147 | ptr = (unsigned long)phys_to_virt(ptr); | ||
| 148 | |||
| 149 | rio_table_hdr = NULL; | ||
| 150 | offset = 0x180; | ||
| 151 | while (offset) { | ||
| 152 | /* The block id is stored in the 2nd word */ | ||
| 153 | if (*((unsigned short *)(ptr + offset + 2)) == 0x4752) { | ||
| 154 | /* set the pointer past the offset & block id */ | ||
| 155 | rio_table_hdr = (struct rio_table_hdr *)(ptr + offset + 4); | ||
| 156 | break; | ||
| 157 | } | ||
| 158 | /* The next offset is stored in the 1st word. 0 means no more */ | ||
| 159 | offset = *((unsigned short *)(ptr + offset)); | ||
| 160 | } | ||
| 161 | if (!rio_table_hdr) { | ||
| 162 | printk(KERN_ERR "%s: Unable to locate Rio Grande Table in EBDA - bailing!\n", __func__); | ||
| 163 | return; | ||
| 164 | } | ||
| 165 | |||
| 166 | if (!build_detail_arrays()) | ||
| 167 | return; | ||
| 168 | |||
| 169 | /* The first Winnipeg we're looking for has an index of 0 */ | ||
| 170 | next_wpeg = 0; | ||
| 171 | do { | ||
| 172 | for (i = 0; i < rio_table_hdr->num_rio_dev; i++) { | ||
| 173 | if (is_WPEG(rio_devs[i]) && rio_devs[i]->WP_index == next_wpeg) { | ||
| 174 | /* It's the Winnipeg we're looking for! */ | ||
| 175 | next_bus = setup_pci_node_map_for_wpeg(i, next_bus); | ||
| 176 | next_wpeg++; | ||
| 177 | break; | ||
| 178 | } | ||
| 179 | } | ||
| 180 | /* | ||
| 181 | * If we go through all Rio devices and don't find one with | ||
| 182 | * the next index, it means we've found all the Winnipegs, | ||
| 183 | * and thus all the PCI buses. | ||
| 184 | */ | ||
| 185 | if (i == rio_table_hdr->num_rio_dev) | ||
| 186 | next_wpeg = 0; | ||
| 187 | } while (next_wpeg != 0); | ||
| 188 | } | ||
diff --git a/arch/x86/kernel/syscall_table_32.S b/arch/x86/kernel/syscall_table_32.S index e2e86a08f31d..3bdb64829b82 100644 --- a/arch/x86/kernel/syscall_table_32.S +++ b/arch/x86/kernel/syscall_table_32.S | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | ENTRY(sys_call_table) | 1 | ENTRY(sys_call_table) |
| 2 | .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */ | 2 | .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */ |
| 3 | .long sys_exit | 3 | .long sys_exit |
| 4 | .long sys_fork | 4 | .long ptregs_fork |
| 5 | .long sys_read | 5 | .long sys_read |
| 6 | .long sys_write | 6 | .long sys_write |
| 7 | .long sys_open /* 5 */ | 7 | .long sys_open /* 5 */ |
| @@ -10,7 +10,7 @@ ENTRY(sys_call_table) | |||
| 10 | .long sys_creat | 10 | .long sys_creat |
| 11 | .long sys_link | 11 | .long sys_link |
| 12 | .long sys_unlink /* 10 */ | 12 | .long sys_unlink /* 10 */ |
| 13 | .long sys_execve | 13 | .long ptregs_execve |
| 14 | .long sys_chdir | 14 | .long sys_chdir |
| 15 | .long sys_time | 15 | .long sys_time |
| 16 | .long sys_mknod | 16 | .long sys_mknod |
| @@ -109,17 +109,17 @@ ENTRY(sys_call_table) | |||
| 109 | .long sys_newlstat | 109 | .long sys_newlstat |
| 110 | .long sys_newfstat | 110 | .long sys_newfstat |
| 111 | .long sys_uname | 111 | .long sys_uname |
| 112 | .long sys_iopl /* 110 */ | 112 | .long ptregs_iopl /* 110 */ |
| 113 | .long sys_vhangup | 113 | .long sys_vhangup |
| 114 | .long sys_ni_syscall /* old "idle" system call */ | 114 | .long sys_ni_syscall /* old "idle" system call */ |
| 115 | .long sys_vm86old | 115 | .long ptregs_vm86old |
| 116 | .long sys_wait4 | 116 | .long sys_wait4 |
| 117 | .long sys_swapoff /* 115 */ | 117 | .long sys_swapoff /* 115 */ |
| 118 | .long sys_sysinfo | 118 | .long sys_sysinfo |
| 119 | .long sys_ipc | 119 | .long sys_ipc |
| 120 | .long sys_fsync | 120 | .long sys_fsync |
| 121 | .long sys_sigreturn | 121 | .long ptregs_sigreturn |
| 122 | .long sys_clone /* 120 */ | 122 | .long ptregs_clone /* 120 */ |
| 123 | .long sys_setdomainname | 123 | .long sys_setdomainname |
| 124 | .long sys_newuname | 124 | .long sys_newuname |
| 125 | .long sys_modify_ldt | 125 | .long sys_modify_ldt |
| @@ -165,14 +165,14 @@ ENTRY(sys_call_table) | |||
| 165 | .long sys_mremap | 165 | .long sys_mremap |
| 166 | .long sys_setresuid16 | 166 | .long sys_setresuid16 |
| 167 | .long sys_getresuid16 /* 165 */ | 167 | .long sys_getresuid16 /* 165 */ |
| 168 | .long sys_vm86 | 168 | .long ptregs_vm86 |
| 169 | .long sys_ni_syscall /* Old sys_query_module */ | 169 | .long sys_ni_syscall /* Old sys_query_module */ |
| 170 | .long sys_poll | 170 | .long sys_poll |
| 171 | .long sys_nfsservctl | 171 | .long sys_nfsservctl |
| 172 | .long sys_setresgid16 /* 170 */ | 172 | .long sys_setresgid16 /* 170 */ |
| 173 | .long sys_getresgid16 | 173 | .long sys_getresgid16 |
| 174 | .long sys_prctl | 174 | .long sys_prctl |
| 175 | .long sys_rt_sigreturn | 175 | .long ptregs_rt_sigreturn |
| 176 | .long sys_rt_sigaction | 176 | .long sys_rt_sigaction |
| 177 | .long sys_rt_sigprocmask /* 175 */ | 177 | .long sys_rt_sigprocmask /* 175 */ |
| 178 | .long sys_rt_sigpending | 178 | .long sys_rt_sigpending |
| @@ -185,11 +185,11 @@ ENTRY(sys_call_table) | |||
| 185 | .long sys_getcwd | 185 | .long sys_getcwd |
| 186 | .long sys_capget | 186 | .long sys_capget |
| 187 | .long sys_capset /* 185 */ | 187 | .long sys_capset /* 185 */ |
| 188 | .long sys_sigaltstack | 188 | .long ptregs_sigaltstack |
| 189 | .long sys_sendfile | 189 | .long sys_sendfile |
| 190 | .long sys_ni_syscall /* reserved for streams1 */ | 190 | .long sys_ni_syscall /* reserved for streams1 */ |
| 191 | .long sys_ni_syscall /* reserved for streams2 */ | 191 | .long sys_ni_syscall /* reserved for streams2 */ |
| 192 | .long sys_vfork /* 190 */ | 192 | .long ptregs_vfork /* 190 */ |
| 193 | .long sys_getrlimit | 193 | .long sys_getrlimit |
| 194 | .long sys_mmap2 | 194 | .long sys_mmap2 |
| 195 | .long sys_truncate64 | 195 | .long sys_truncate64 |
diff --git a/arch/x86/kernel/time_32.c b/arch/x86/kernel/time_32.c index 3985cac0ed47..764c74e871f2 100644 --- a/arch/x86/kernel/time_32.c +++ b/arch/x86/kernel/time_32.c | |||
| @@ -38,7 +38,7 @@ | |||
| 38 | #include <asm/time.h> | 38 | #include <asm/time.h> |
| 39 | #include <asm/timer.h> | 39 | #include <asm/timer.h> |
| 40 | 40 | ||
| 41 | #include "do_timer.h" | 41 | #include <asm/do_timer.h> |
| 42 | 42 | ||
| 43 | int timer_ack; | 43 | int timer_ack; |
| 44 | 44 | ||
diff --git a/arch/x86/kernel/tlb_32.c b/arch/x86/kernel/tlb_32.c deleted file mode 100644 index ce5054642247..000000000000 --- a/arch/x86/kernel/tlb_32.c +++ /dev/null | |||
| @@ -1,256 +0,0 @@ | |||
| 1 | #include <linux/spinlock.h> | ||
| 2 | #include <linux/cpu.h> | ||
| 3 | #include <linux/interrupt.h> | ||
| 4 | |||
| 5 | #include <asm/tlbflush.h> | ||
| 6 | |||
| 7 | DEFINE_PER_CPU(struct tlb_state, cpu_tlbstate) | ||
| 8 | ____cacheline_aligned = { &init_mm, 0, }; | ||
| 9 | |||
| 10 | /* must come after the send_IPI functions above for inlining */ | ||
| 11 | #include <mach_ipi.h> | ||
| 12 | |||
| 13 | /* | ||
| 14 | * Smarter SMP flushing macros. | ||
| 15 | * c/o Linus Torvalds. | ||
| 16 | * | ||
| 17 | * These mean you can really definitely utterly forget about | ||
| 18 | * writing to user space from interrupts. (Its not allowed anyway). | ||
| 19 | * | ||
| 20 | * Optimizations Manfred Spraul <manfred@colorfullife.com> | ||
| 21 | */ | ||
| 22 | |||
| 23 | static cpumask_t flush_cpumask; | ||
| 24 | static struct mm_struct *flush_mm; | ||
| 25 | static unsigned long flush_va; | ||
| 26 | static DEFINE_SPINLOCK(tlbstate_lock); | ||
| 27 | |||
| 28 | /* | ||
| 29 | * We cannot call mmdrop() because we are in interrupt context, | ||
| 30 | * instead update mm->cpu_vm_mask. | ||
| 31 | * | ||
| 32 | * We need to reload %cr3 since the page tables may be going | ||
| 33 | * away from under us.. | ||
| 34 | */ | ||
| 35 | void leave_mm(int cpu) | ||
| 36 | { | ||
| 37 | BUG_ON(x86_read_percpu(cpu_tlbstate.state) == TLBSTATE_OK); | ||
| 38 | cpu_clear(cpu, x86_read_percpu(cpu_tlbstate.active_mm)->cpu_vm_mask); | ||
| 39 | load_cr3(swapper_pg_dir); | ||
| 40 | } | ||
| 41 | EXPORT_SYMBOL_GPL(leave_mm); | ||
| 42 | |||
| 43 | /* | ||
| 44 | * | ||
| 45 | * The flush IPI assumes that a thread switch happens in this order: | ||
| 46 | * [cpu0: the cpu that switches] | ||
| 47 | * 1) switch_mm() either 1a) or 1b) | ||
| 48 | * 1a) thread switch to a different mm | ||
| 49 | * 1a1) cpu_clear(cpu, old_mm->cpu_vm_mask); | ||
| 50 | * Stop ipi delivery for the old mm. This is not synchronized with | ||
| 51 | * the other cpus, but smp_invalidate_interrupt ignore flush ipis | ||
| 52 | * for the wrong mm, and in the worst case we perform a superfluous | ||
| 53 | * tlb flush. | ||
| 54 | * 1a2) set cpu_tlbstate to TLBSTATE_OK | ||
| 55 | * Now the smp_invalidate_interrupt won't call leave_mm if cpu0 | ||
| 56 | * was in lazy tlb mode. | ||
| 57 | * 1a3) update cpu_tlbstate[].active_mm | ||
| 58 | * Now cpu0 accepts tlb flushes for the new mm. | ||
| 59 | * 1a4) cpu_set(cpu, new_mm->cpu_vm_mask); | ||
| 60 | * Now the other cpus will send tlb flush ipis. | ||
| 61 | * 1a4) change cr3. | ||
| 62 | * 1b) thread switch without mm change | ||
| 63 | * cpu_tlbstate[].active_mm is correct, cpu0 already handles | ||
| 64 | * flush ipis. | ||
| 65 | * 1b1) set cpu_tlbstate to TLBSTATE_OK | ||
| 66 | * 1b2) test_and_set the cpu bit in cpu_vm_mask. | ||
| 67 | * Atomically set the bit [other cpus will start sending flush ipis], | ||
| 68 | * and test the bit. | ||
| 69 | * 1b3) if the bit was 0: leave_mm was called, flush the tlb. | ||
| 70 | * 2) switch %%esp, ie current | ||
| 71 | * | ||
| 72 | * The interrupt must handle 2 special cases: | ||
| 73 | * - cr3 is changed before %%esp, ie. it cannot use current->{active_,}mm. | ||
| 74 | * - the cpu performs speculative tlb reads, i.e. even if the cpu only | ||
| 75 | * runs in kernel space, the cpu could load tlb entries for user space | ||
| 76 | * pages. | ||
| 77 | * | ||
| 78 | * The good news is that cpu_tlbstate is local to each cpu, no | ||
| 79 | * write/read ordering problems. | ||
| 80 | */ | ||
| 81 | |||
| 82 | /* | ||
| 83 | * TLB flush IPI: | ||
| 84 | * | ||
| 85 | * 1) Flush the tlb entries if the cpu uses the mm that's being flushed. | ||
| 86 | * 2) Leave the mm if we are in the lazy tlb mode. | ||
| 87 | */ | ||
| 88 | |||
| 89 | void smp_invalidate_interrupt(struct pt_regs *regs) | ||
| 90 | { | ||
| 91 | unsigned long cpu; | ||
| 92 | |||
| 93 | cpu = get_cpu(); | ||
| 94 | |||
| 95 | if (!cpu_isset(cpu, flush_cpumask)) | ||
| 96 | goto out; | ||
| 97 | /* | ||
| 98 | * This was a BUG() but until someone can quote me the | ||
| 99 | * line from the intel manual that guarantees an IPI to | ||
| 100 | * multiple CPUs is retried _only_ on the erroring CPUs | ||
| 101 | * its staying as a return | ||
| 102 | * | ||
| 103 | * BUG(); | ||
| 104 | */ | ||
| 105 | |||
| 106 | if (flush_mm == x86_read_percpu(cpu_tlbstate.active_mm)) { | ||
| 107 | if (x86_read_percpu(cpu_tlbstate.state) == TLBSTATE_OK) { | ||
| 108 | if (flush_va == TLB_FLUSH_ALL) | ||
| 109 | local_flush_tlb(); | ||
| 110 | else | ||
| 111 | __flush_tlb_one(flush_va); | ||
| 112 | } else | ||
| 113 | leave_mm(cpu); | ||
| 114 | } | ||
| 115 | ack_APIC_irq(); | ||
| 116 | smp_mb__before_clear_bit(); | ||
| 117 | cpu_clear(cpu, flush_cpumask); | ||
| 118 | smp_mb__after_clear_bit(); | ||
| 119 | out: | ||
| 120 | put_cpu_no_resched(); | ||
| 121 | inc_irq_stat(irq_tlb_count); | ||
| 122 | } | ||
| 123 | |||
| 124 | void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm, | ||
| 125 | unsigned long va) | ||
| 126 | { | ||
| 127 | cpumask_t cpumask = *cpumaskp; | ||
| 128 | |||
| 129 | /* | ||
| 130 | * A couple of (to be removed) sanity checks: | ||
| 131 | * | ||
| 132 | * - current CPU must not be in mask | ||
| 133 | * - mask must exist :) | ||
| 134 | */ | ||
| 135 | BUG_ON(cpus_empty(cpumask)); | ||
| 136 | BUG_ON(cpu_isset(smp_processor_id(), cpumask)); | ||
| 137 | BUG_ON(!mm); | ||
| 138 | |||
| 139 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 140 | /* If a CPU which we ran on has gone down, OK. */ | ||
| 141 | cpus_and(cpumask, cpumask, cpu_online_map); | ||
| 142 | if (unlikely(cpus_empty(cpumask))) | ||
| 143 | return; | ||
| 144 | #endif | ||
| 145 | |||
| 146 | /* | ||
| 147 | * i'm not happy about this global shared spinlock in the | ||
| 148 | * MM hot path, but we'll see how contended it is. | ||
| 149 | * AK: x86-64 has a faster method that could be ported. | ||
| 150 | */ | ||
| 151 | spin_lock(&tlbstate_lock); | ||
| 152 | |||
| 153 | flush_mm = mm; | ||
| 154 | flush_va = va; | ||
| 155 | cpus_or(flush_cpumask, cpumask, flush_cpumask); | ||
| 156 | |||
| 157 | /* | ||
| 158 | * Make the above memory operations globally visible before | ||
| 159 | * sending the IPI. | ||
| 160 | */ | ||
| 161 | smp_mb(); | ||
| 162 | /* | ||
| 163 | * We have to send the IPI only to | ||
| 164 | * CPUs affected. | ||
| 165 | */ | ||
| 166 | send_IPI_mask(&cpumask, INVALIDATE_TLB_VECTOR); | ||
| 167 | |||
| 168 | while (!cpus_empty(flush_cpumask)) | ||
| 169 | /* nothing. lockup detection does not belong here */ | ||
| 170 | cpu_relax(); | ||
| 171 | |||
| 172 | flush_mm = NULL; | ||
| 173 | flush_va = 0; | ||
| 174 | spin_unlock(&tlbstate_lock); | ||
| 175 | } | ||
| 176 | |||
| 177 | void flush_tlb_current_task(void) | ||
| 178 | { | ||
| 179 | struct mm_struct *mm = current->mm; | ||
| 180 | cpumask_t cpu_mask; | ||
| 181 | |||
| 182 | preempt_disable(); | ||
| 183 | cpu_mask = mm->cpu_vm_mask; | ||
| 184 | cpu_clear(smp_processor_id(), cpu_mask); | ||
| 185 | |||
| 186 | local_flush_tlb(); | ||
| 187 | if (!cpus_empty(cpu_mask)) | ||
| 188 | flush_tlb_others(cpu_mask, mm, TLB_FLUSH_ALL); | ||
| 189 | preempt_enable(); | ||
| 190 | } | ||
| 191 | |||
| 192 | void flush_tlb_mm(struct mm_struct *mm) | ||
| 193 | { | ||
| 194 | cpumask_t cpu_mask; | ||
| 195 | |||
| 196 | preempt_disable(); | ||
| 197 | cpu_mask = mm->cpu_vm_mask; | ||
| 198 | cpu_clear(smp_processor_id(), cpu_mask); | ||
| 199 | |||
| 200 | if (current->active_mm == mm) { | ||
| 201 | if (current->mm) | ||
| 202 | local_flush_tlb(); | ||
| 203 | else | ||
| 204 | leave_mm(smp_processor_id()); | ||
| 205 | } | ||
| 206 | if (!cpus_empty(cpu_mask)) | ||
| 207 | flush_tlb_others(cpu_mask, mm, TLB_FLUSH_ALL); | ||
| 208 | |||
| 209 | preempt_enable(); | ||
| 210 | } | ||
| 211 | |||
| 212 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long va) | ||
| 213 | { | ||
| 214 | struct mm_struct *mm = vma->vm_mm; | ||
| 215 | cpumask_t cpu_mask; | ||
| 216 | |||
| 217 | preempt_disable(); | ||
| 218 | cpu_mask = mm->cpu_vm_mask; | ||
| 219 | cpu_clear(smp_processor_id(), cpu_mask); | ||
| 220 | |||
| 221 | if (current->active_mm == mm) { | ||
| 222 | if (current->mm) | ||
| 223 | __flush_tlb_one(va); | ||
| 224 | else | ||
| 225 | leave_mm(smp_processor_id()); | ||
| 226 | } | ||
| 227 | |||
| 228 | if (!cpus_empty(cpu_mask)) | ||
| 229 | flush_tlb_others(cpu_mask, mm, va); | ||
| 230 | |||
| 231 | preempt_enable(); | ||
| 232 | } | ||
| 233 | EXPORT_SYMBOL(flush_tlb_page); | ||
| 234 | |||
| 235 | static void do_flush_tlb_all(void *info) | ||
| 236 | { | ||
| 237 | unsigned long cpu = smp_processor_id(); | ||
| 238 | |||
| 239 | __flush_tlb_all(); | ||
| 240 | if (x86_read_percpu(cpu_tlbstate.state) == TLBSTATE_LAZY) | ||
| 241 | leave_mm(cpu); | ||
| 242 | } | ||
| 243 | |||
| 244 | void flush_tlb_all(void) | ||
| 245 | { | ||
| 246 | on_each_cpu(do_flush_tlb_all, NULL, 1); | ||
| 247 | } | ||
| 248 | |||
| 249 | void reset_lazy_tlbstate(void) | ||
| 250 | { | ||
| 251 | int cpu = raw_smp_processor_id(); | ||
| 252 | |||
| 253 | per_cpu(cpu_tlbstate, cpu).state = 0; | ||
| 254 | per_cpu(cpu_tlbstate, cpu).active_mm = &init_mm; | ||
| 255 | } | ||
| 256 | |||
diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c index 6812b829ed83..f04549afcfe9 100644 --- a/arch/x86/kernel/tlb_uv.c +++ b/arch/x86/kernel/tlb_uv.c | |||
| @@ -11,16 +11,15 @@ | |||
| 11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
| 12 | 12 | ||
| 13 | #include <asm/mmu_context.h> | 13 | #include <asm/mmu_context.h> |
| 14 | #include <asm/uv/uv.h> | ||
| 14 | #include <asm/uv/uv_mmrs.h> | 15 | #include <asm/uv/uv_mmrs.h> |
| 15 | #include <asm/uv/uv_hub.h> | 16 | #include <asm/uv/uv_hub.h> |
| 16 | #include <asm/uv/uv_bau.h> | 17 | #include <asm/uv/uv_bau.h> |
| 17 | #include <asm/genapic.h> | 18 | #include <asm/apic.h> |
| 18 | #include <asm/idle.h> | 19 | #include <asm/idle.h> |
| 19 | #include <asm/tsc.h> | 20 | #include <asm/tsc.h> |
| 20 | #include <asm/irq_vectors.h> | 21 | #include <asm/irq_vectors.h> |
| 21 | 22 | ||
| 22 | #include <mach_apic.h> | ||
| 23 | |||
| 24 | static struct bau_control **uv_bau_table_bases __read_mostly; | 23 | static struct bau_control **uv_bau_table_bases __read_mostly; |
| 25 | static int uv_bau_retry_limit __read_mostly; | 24 | static int uv_bau_retry_limit __read_mostly; |
| 26 | 25 | ||
| @@ -210,14 +209,15 @@ static int uv_wait_completion(struct bau_desc *bau_desc, | |||
| 210 | * | 209 | * |
| 211 | * Send a broadcast and wait for a broadcast message to complete. | 210 | * Send a broadcast and wait for a broadcast message to complete. |
| 212 | * | 211 | * |
| 213 | * The cpumaskp mask contains the cpus the broadcast was sent to. | 212 | * The flush_mask contains the cpus the broadcast was sent to. |
| 214 | * | 213 | * |
| 215 | * Returns 1 if all remote flushing was done. The mask is zeroed. | 214 | * Returns NULL if all remote flushing was done. The mask is zeroed. |
| 216 | * Returns 0 if some remote flushing remains to be done. The mask is left | 215 | * Returns @flush_mask if some remote flushing remains to be done. The |
| 217 | * unchanged. | 216 | * mask will have some bits still set. |
| 218 | */ | 217 | */ |
| 219 | int uv_flush_send_and_wait(int cpu, int this_blade, struct bau_desc *bau_desc, | 218 | const struct cpumask *uv_flush_send_and_wait(int cpu, int this_blade, |
| 220 | cpumask_t *cpumaskp) | 219 | struct bau_desc *bau_desc, |
| 220 | struct cpumask *flush_mask) | ||
| 221 | { | 221 | { |
| 222 | int completion_status = 0; | 222 | int completion_status = 0; |
| 223 | int right_shift; | 223 | int right_shift; |
| @@ -257,66 +257,76 @@ int uv_flush_send_and_wait(int cpu, int this_blade, struct bau_desc *bau_desc, | |||
| 257 | * the cpu's, all of which are still in the mask. | 257 | * the cpu's, all of which are still in the mask. |
| 258 | */ | 258 | */ |
| 259 | __get_cpu_var(ptcstats).ptc_i++; | 259 | __get_cpu_var(ptcstats).ptc_i++; |
| 260 | return 0; | 260 | return flush_mask; |
| 261 | } | 261 | } |
| 262 | 262 | ||
| 263 | /* | 263 | /* |
| 264 | * Success, so clear the remote cpu's from the mask so we don't | 264 | * Success, so clear the remote cpu's from the mask so we don't |
| 265 | * use the IPI method of shootdown on them. | 265 | * use the IPI method of shootdown on them. |
| 266 | */ | 266 | */ |
| 267 | for_each_cpu_mask(bit, *cpumaskp) { | 267 | for_each_cpu(bit, flush_mask) { |
| 268 | blade = uv_cpu_to_blade_id(bit); | 268 | blade = uv_cpu_to_blade_id(bit); |
| 269 | if (blade == this_blade) | 269 | if (blade == this_blade) |
| 270 | continue; | 270 | continue; |
| 271 | cpu_clear(bit, *cpumaskp); | 271 | cpumask_clear_cpu(bit, flush_mask); |
| 272 | } | 272 | } |
| 273 | if (!cpus_empty(*cpumaskp)) | 273 | if (!cpumask_empty(flush_mask)) |
| 274 | return 0; | 274 | return flush_mask; |
| 275 | return 1; | 275 | return NULL; |
| 276 | } | 276 | } |
| 277 | 277 | ||
| 278 | /** | 278 | /** |
| 279 | * uv_flush_tlb_others - globally purge translation cache of a virtual | 279 | * uv_flush_tlb_others - globally purge translation cache of a virtual |
| 280 | * address or all TLB's | 280 | * address or all TLB's |
| 281 | * @cpumaskp: mask of all cpu's in which the address is to be removed | 281 | * @cpumask: mask of all cpu's in which the address is to be removed |
| 282 | * @mm: mm_struct containing virtual address range | 282 | * @mm: mm_struct containing virtual address range |
| 283 | * @va: virtual address to be removed (or TLB_FLUSH_ALL for all TLB's on cpu) | 283 | * @va: virtual address to be removed (or TLB_FLUSH_ALL for all TLB's on cpu) |
| 284 | * @cpu: the current cpu | ||
| 284 | * | 285 | * |
| 285 | * This is the entry point for initiating any UV global TLB shootdown. | 286 | * This is the entry point for initiating any UV global TLB shootdown. |
| 286 | * | 287 | * |
| 287 | * Purges the translation caches of all specified processors of the given | 288 | * Purges the translation caches of all specified processors of the given |
| 288 | * virtual address, or purges all TLB's on specified processors. | 289 | * virtual address, or purges all TLB's on specified processors. |
| 289 | * | 290 | * |
| 290 | * The caller has derived the cpumaskp from the mm_struct and has subtracted | 291 | * The caller has derived the cpumask from the mm_struct. This function |
| 291 | * the local cpu from the mask. This function is called only if there | 292 | * is called only if there are bits set in the mask. (e.g. flush_tlb_page()) |
| 292 | * are bits set in the mask. (e.g. flush_tlb_page()) | ||
| 293 | * | 293 | * |
| 294 | * The cpumaskp is converted into a nodemask of the nodes containing | 294 | * The cpumask is converted into a nodemask of the nodes containing |
| 295 | * the cpus. | 295 | * the cpus. |
| 296 | * | 296 | * |
| 297 | * Returns 1 if all remote flushing was done. | 297 | * Note that this function should be called with preemption disabled. |
| 298 | * Returns 0 if some remote flushing remains to be done. | 298 | * |
| 299 | * Returns NULL if all remote flushing was done. | ||
| 300 | * Returns pointer to cpumask if some remote flushing remains to be | ||
| 301 | * done. The returned pointer is valid till preemption is re-enabled. | ||
| 299 | */ | 302 | */ |
| 300 | int uv_flush_tlb_others(cpumask_t *cpumaskp, struct mm_struct *mm, | 303 | const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, |
| 301 | unsigned long va) | 304 | struct mm_struct *mm, |
| 305 | unsigned long va, unsigned int cpu) | ||
| 302 | { | 306 | { |
| 307 | static DEFINE_PER_CPU(cpumask_t, flush_tlb_mask); | ||
| 308 | struct cpumask *flush_mask = &__get_cpu_var(flush_tlb_mask); | ||
| 303 | int i; | 309 | int i; |
| 304 | int bit; | 310 | int bit; |
| 305 | int blade; | 311 | int blade; |
| 306 | int cpu; | 312 | int uv_cpu; |
| 307 | int this_blade; | 313 | int this_blade; |
| 308 | int locals = 0; | 314 | int locals = 0; |
| 309 | struct bau_desc *bau_desc; | 315 | struct bau_desc *bau_desc; |
| 310 | 316 | ||
| 311 | cpu = uv_blade_processor_id(); | 317 | WARN_ON(!in_atomic()); |
| 318 | |||
| 319 | cpumask_andnot(flush_mask, cpumask, cpumask_of(cpu)); | ||
| 320 | |||
| 321 | uv_cpu = uv_blade_processor_id(); | ||
| 312 | this_blade = uv_numa_blade_id(); | 322 | this_blade = uv_numa_blade_id(); |
| 313 | bau_desc = __get_cpu_var(bau_control).descriptor_base; | 323 | bau_desc = __get_cpu_var(bau_control).descriptor_base; |
| 314 | bau_desc += UV_ITEMS_PER_DESCRIPTOR * cpu; | 324 | bau_desc += UV_ITEMS_PER_DESCRIPTOR * uv_cpu; |
| 315 | 325 | ||
| 316 | bau_nodes_clear(&bau_desc->distribution, UV_DISTRIBUTION_SIZE); | 326 | bau_nodes_clear(&bau_desc->distribution, UV_DISTRIBUTION_SIZE); |
| 317 | 327 | ||
| 318 | i = 0; | 328 | i = 0; |
| 319 | for_each_cpu_mask(bit, *cpumaskp) { | 329 | for_each_cpu(bit, flush_mask) { |
| 320 | blade = uv_cpu_to_blade_id(bit); | 330 | blade = uv_cpu_to_blade_id(bit); |
| 321 | BUG_ON(blade > (UV_DISTRIBUTION_SIZE - 1)); | 331 | BUG_ON(blade > (UV_DISTRIBUTION_SIZE - 1)); |
| 322 | if (blade == this_blade) { | 332 | if (blade == this_blade) { |
| @@ -331,17 +341,17 @@ int uv_flush_tlb_others(cpumask_t *cpumaskp, struct mm_struct *mm, | |||
| 331 | * no off_node flushing; return status for local node | 341 | * no off_node flushing; return status for local node |
| 332 | */ | 342 | */ |
| 333 | if (locals) | 343 | if (locals) |
| 334 | return 0; | 344 | return flush_mask; |
| 335 | else | 345 | else |
| 336 | return 1; | 346 | return NULL; |
| 337 | } | 347 | } |
| 338 | __get_cpu_var(ptcstats).requestor++; | 348 | __get_cpu_var(ptcstats).requestor++; |
| 339 | __get_cpu_var(ptcstats).ntargeted += i; | 349 | __get_cpu_var(ptcstats).ntargeted += i; |
| 340 | 350 | ||
| 341 | bau_desc->payload.address = va; | 351 | bau_desc->payload.address = va; |
| 342 | bau_desc->payload.sending_cpu = smp_processor_id(); | 352 | bau_desc->payload.sending_cpu = cpu; |
| 343 | 353 | ||
| 344 | return uv_flush_send_and_wait(cpu, this_blade, bau_desc, cpumaskp); | 354 | return uv_flush_send_and_wait(uv_cpu, this_blade, bau_desc, flush_mask); |
| 345 | } | 355 | } |
| 346 | 356 | ||
| 347 | /* | 357 | /* |
diff --git a/arch/x86/kernel/trampoline_32.S b/arch/x86/kernel/trampoline_32.S index d8ccc3c6552f..66d874e5404c 100644 --- a/arch/x86/kernel/trampoline_32.S +++ b/arch/x86/kernel/trampoline_32.S | |||
| @@ -29,7 +29,7 @@ | |||
| 29 | 29 | ||
| 30 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
| 31 | #include <asm/segment.h> | 31 | #include <asm/segment.h> |
| 32 | #include <asm/page.h> | 32 | #include <asm/page_types.h> |
| 33 | 33 | ||
| 34 | /* We can free up trampoline after bootup if cpu hotplug is not supported. */ | 34 | /* We can free up trampoline after bootup if cpu hotplug is not supported. */ |
| 35 | #ifndef CONFIG_HOTPLUG_CPU | 35 | #ifndef CONFIG_HOTPLUG_CPU |
diff --git a/arch/x86/kernel/trampoline_64.S b/arch/x86/kernel/trampoline_64.S index 894293c598db..cddfb8d386b9 100644 --- a/arch/x86/kernel/trampoline_64.S +++ b/arch/x86/kernel/trampoline_64.S | |||
| @@ -25,10 +25,11 @@ | |||
| 25 | */ | 25 | */ |
| 26 | 26 | ||
| 27 | #include <linux/linkage.h> | 27 | #include <linux/linkage.h> |
| 28 | #include <asm/pgtable.h> | 28 | #include <asm/pgtable_types.h> |
| 29 | #include <asm/page.h> | 29 | #include <asm/page_types.h> |
| 30 | #include <asm/msr.h> | 30 | #include <asm/msr.h> |
| 31 | #include <asm/segment.h> | 31 | #include <asm/segment.h> |
| 32 | #include <asm/processor-flags.h> | ||
| 32 | 33 | ||
| 33 | .section .rodata, "a", @progbits | 34 | .section .rodata, "a", @progbits |
| 34 | 35 | ||
| @@ -37,7 +38,7 @@ | |||
| 37 | ENTRY(trampoline_data) | 38 | ENTRY(trampoline_data) |
| 38 | r_base = . | 39 | r_base = . |
| 39 | cli # We should be safe anyway | 40 | cli # We should be safe anyway |
| 40 | wbinvd | 41 | wbinvd |
| 41 | mov %cs, %ax # Code and data in the same place | 42 | mov %cs, %ax # Code and data in the same place |
| 42 | mov %ax, %ds | 43 | mov %ax, %ds |
| 43 | mov %ax, %es | 44 | mov %ax, %es |
| @@ -73,9 +74,8 @@ r_base = . | |||
| 73 | lidtl tidt - r_base # load idt with 0, 0 | 74 | lidtl tidt - r_base # load idt with 0, 0 |
| 74 | lgdtl tgdt - r_base # load gdt with whatever is appropriate | 75 | lgdtl tgdt - r_base # load gdt with whatever is appropriate |
| 75 | 76 | ||
| 76 | xor %ax, %ax | 77 | mov $X86_CR0_PE, %ax # protected mode (PE) bit |
| 77 | inc %ax # protected mode (PE) bit | 78 | lmsw %ax # into protected mode |
| 78 | lmsw %ax # into protected mode | ||
| 79 | 79 | ||
| 80 | # flush prefetch and jump to startup_32 | 80 | # flush prefetch and jump to startup_32 |
| 81 | ljmpl *(startup_32_vector - r_base) | 81 | ljmpl *(startup_32_vector - r_base) |
| @@ -86,9 +86,8 @@ startup_32: | |||
| 86 | movl $__KERNEL_DS, %eax # Initialize the %ds segment register | 86 | movl $__KERNEL_DS, %eax # Initialize the %ds segment register |
| 87 | movl %eax, %ds | 87 | movl %eax, %ds |
| 88 | 88 | ||
| 89 | xorl %eax, %eax | 89 | movl $X86_CR4_PAE, %eax |
| 90 | btsl $5, %eax # Enable PAE mode | 90 | movl %eax, %cr4 # Enable PAE mode |
| 91 | movl %eax, %cr4 | ||
| 92 | 91 | ||
| 93 | # Setup trampoline 4 level pagetables | 92 | # Setup trampoline 4 level pagetables |
| 94 | leal (trampoline_level4_pgt - r_base)(%esi), %eax | 93 | leal (trampoline_level4_pgt - r_base)(%esi), %eax |
| @@ -99,9 +98,9 @@ startup_32: | |||
| 99 | xorl %edx, %edx | 98 | xorl %edx, %edx |
| 100 | wrmsr | 99 | wrmsr |
| 101 | 100 | ||
| 102 | xorl %eax, %eax | 101 | # Enable paging and in turn activate Long Mode |
| 103 | btsl $31, %eax # Enable paging and in turn activate Long Mode | 102 | # Enable protected mode |
| 104 | btsl $0, %eax # Enable protected mode | 103 | movl $(X86_CR0_PG | X86_CR0_PE), %eax |
| 105 | movl %eax, %cr0 | 104 | movl %eax, %cr0 |
| 106 | 105 | ||
| 107 | /* | 106 | /* |
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index a9e7548e1790..acb8c0585ab9 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
| @@ -54,12 +54,11 @@ | |||
| 54 | #include <asm/desc.h> | 54 | #include <asm/desc.h> |
| 55 | #include <asm/i387.h> | 55 | #include <asm/i387.h> |
| 56 | 56 | ||
| 57 | #include <mach_traps.h> | 57 | #include <asm/mach_traps.h> |
| 58 | 58 | ||
| 59 | #ifdef CONFIG_X86_64 | 59 | #ifdef CONFIG_X86_64 |
| 60 | #include <asm/pgalloc.h> | 60 | #include <asm/pgalloc.h> |
| 61 | #include <asm/proto.h> | 61 | #include <asm/proto.h> |
| 62 | #include <asm/pda.h> | ||
| 63 | #else | 62 | #else |
| 64 | #include <asm/processor-flags.h> | 63 | #include <asm/processor-flags.h> |
| 65 | #include <asm/arch_hooks.h> | 64 | #include <asm/arch_hooks.h> |
| @@ -914,19 +913,20 @@ void math_emulate(struct math_emu_info *info) | |||
| 914 | } | 913 | } |
| 915 | #endif /* CONFIG_MATH_EMULATION */ | 914 | #endif /* CONFIG_MATH_EMULATION */ |
| 916 | 915 | ||
| 917 | dotraplinkage void __kprobes do_device_not_available(struct pt_regs regs) | 916 | dotraplinkage void __kprobes |
| 917 | do_device_not_available(struct pt_regs *regs, long error_code) | ||
| 918 | { | 918 | { |
| 919 | #ifdef CONFIG_X86_32 | 919 | #ifdef CONFIG_X86_32 |
| 920 | if (read_cr0() & X86_CR0_EM) { | 920 | if (read_cr0() & X86_CR0_EM) { |
| 921 | struct math_emu_info info = { }; | 921 | struct math_emu_info info = { }; |
| 922 | 922 | ||
| 923 | conditional_sti(®s); | 923 | conditional_sti(regs); |
| 924 | 924 | ||
| 925 | info.regs = ®s; | 925 | info.regs = regs; |
| 926 | math_emulate(&info); | 926 | math_emulate(&info); |
| 927 | } else { | 927 | } else { |
| 928 | math_state_restore(); /* interrupts still off */ | 928 | math_state_restore(); /* interrupts still off */ |
| 929 | conditional_sti(®s); | 929 | conditional_sti(regs); |
| 930 | } | 930 | } |
| 931 | #else | 931 | #else |
| 932 | math_state_restore(); | 932 | math_state_restore(); |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 599e58168631..83d53ce5d4c4 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
| @@ -773,7 +773,7 @@ __cpuinit int unsynchronized_tsc(void) | |||
| 773 | if (!cpu_has_tsc || tsc_unstable) | 773 | if (!cpu_has_tsc || tsc_unstable) |
| 774 | return 1; | 774 | return 1; |
| 775 | 775 | ||
| 776 | #ifdef CONFIG_X86_SMP | 776 | #ifdef CONFIG_SMP |
| 777 | if (apic_is_clustered_box()) | 777 | if (apic_is_clustered_box()) |
| 778 | return 1; | 778 | return 1; |
| 779 | #endif | 779 | #endif |
diff --git a/arch/x86/kernel/visws_quirks.c b/arch/x86/kernel/visws_quirks.c index d801d06af068..34199d30ff46 100644 --- a/arch/x86/kernel/visws_quirks.c +++ b/arch/x86/kernel/visws_quirks.c | |||
| @@ -29,13 +29,10 @@ | |||
| 29 | #include <asm/fixmap.h> | 29 | #include <asm/fixmap.h> |
| 30 | #include <asm/reboot.h> | 30 | #include <asm/reboot.h> |
| 31 | #include <asm/setup.h> | 31 | #include <asm/setup.h> |
| 32 | #include <asm/apic.h> | ||
| 32 | #include <asm/e820.h> | 33 | #include <asm/e820.h> |
| 33 | #include <asm/io.h> | 34 | #include <asm/io.h> |
| 34 | 35 | ||
| 35 | #include <mach_ipi.h> | ||
| 36 | |||
| 37 | #include "mach_apic.h" | ||
| 38 | |||
| 39 | #include <linux/kernel_stat.h> | 36 | #include <linux/kernel_stat.h> |
| 40 | 37 | ||
| 41 | #include <asm/i8259.h> | 38 | #include <asm/i8259.h> |
| @@ -49,8 +46,6 @@ | |||
| 49 | 46 | ||
| 50 | extern int no_broadcast; | 47 | extern int no_broadcast; |
| 51 | 48 | ||
| 52 | #include <asm/apic.h> | ||
| 53 | |||
| 54 | char visws_board_type = -1; | 49 | char visws_board_type = -1; |
| 55 | char visws_board_rev = -1; | 50 | char visws_board_rev = -1; |
| 56 | 51 | ||
| @@ -200,7 +195,7 @@ static void __init MP_processor_info(struct mpc_cpu *m) | |||
| 200 | return; | 195 | return; |
| 201 | } | 196 | } |
| 202 | 197 | ||
| 203 | apic_cpus = apicid_to_cpu_present(m->apicid); | 198 | apic_cpus = apic->apicid_to_cpu_present(m->apicid); |
| 204 | physids_or(phys_cpu_present_map, phys_cpu_present_map, apic_cpus); | 199 | physids_or(phys_cpu_present_map, phys_cpu_present_map, apic_cpus); |
| 205 | /* | 200 | /* |
| 206 | * Validate version | 201 | * Validate version |
diff --git a/arch/x86/kernel/vm86_32.c b/arch/x86/kernel/vm86_32.c index 4eeb5cf9720d..d7ac84e7fc1c 100644 --- a/arch/x86/kernel/vm86_32.c +++ b/arch/x86/kernel/vm86_32.c | |||
| @@ -158,7 +158,7 @@ struct pt_regs *save_v86_state(struct kernel_vm86_regs *regs) | |||
| 158 | ret = KVM86->regs32; | 158 | ret = KVM86->regs32; |
| 159 | 159 | ||
| 160 | ret->fs = current->thread.saved_fs; | 160 | ret->fs = current->thread.saved_fs; |
| 161 | loadsegment(gs, current->thread.saved_gs); | 161 | set_user_gs(ret, current->thread.saved_gs); |
| 162 | 162 | ||
| 163 | return ret; | 163 | return ret; |
| 164 | } | 164 | } |
| @@ -197,9 +197,9 @@ out: | |||
| 197 | static int do_vm86_irq_handling(int subfunction, int irqnumber); | 197 | static int do_vm86_irq_handling(int subfunction, int irqnumber); |
| 198 | static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk); | 198 | static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk); |
| 199 | 199 | ||
| 200 | asmlinkage int sys_vm86old(struct pt_regs regs) | 200 | int sys_vm86old(struct pt_regs *regs) |
| 201 | { | 201 | { |
| 202 | struct vm86_struct __user *v86 = (struct vm86_struct __user *)regs.bx; | 202 | struct vm86_struct __user *v86 = (struct vm86_struct __user *)regs->bx; |
| 203 | struct kernel_vm86_struct info; /* declare this _on top_, | 203 | struct kernel_vm86_struct info; /* declare this _on top_, |
| 204 | * this avoids wasting of stack space. | 204 | * this avoids wasting of stack space. |
| 205 | * This remains on the stack until we | 205 | * This remains on the stack until we |
| @@ -218,7 +218,7 @@ asmlinkage int sys_vm86old(struct pt_regs regs) | |||
| 218 | if (tmp) | 218 | if (tmp) |
| 219 | goto out; | 219 | goto out; |
| 220 | memset(&info.vm86plus, 0, (int)&info.regs32 - (int)&info.vm86plus); | 220 | memset(&info.vm86plus, 0, (int)&info.regs32 - (int)&info.vm86plus); |
| 221 | info.regs32 = ®s; | 221 | info.regs32 = regs; |
| 222 | tsk->thread.vm86_info = v86; | 222 | tsk->thread.vm86_info = v86; |
| 223 | do_sys_vm86(&info, tsk); | 223 | do_sys_vm86(&info, tsk); |
| 224 | ret = 0; /* we never return here */ | 224 | ret = 0; /* we never return here */ |
| @@ -227,7 +227,7 @@ out: | |||
| 227 | } | 227 | } |
| 228 | 228 | ||
| 229 | 229 | ||
| 230 | asmlinkage int sys_vm86(struct pt_regs regs) | 230 | int sys_vm86(struct pt_regs *regs) |
| 231 | { | 231 | { |
| 232 | struct kernel_vm86_struct info; /* declare this _on top_, | 232 | struct kernel_vm86_struct info; /* declare this _on top_, |
| 233 | * this avoids wasting of stack space. | 233 | * this avoids wasting of stack space. |
| @@ -239,12 +239,12 @@ asmlinkage int sys_vm86(struct pt_regs regs) | |||
| 239 | struct vm86plus_struct __user *v86; | 239 | struct vm86plus_struct __user *v86; |
| 240 | 240 | ||
| 241 | tsk = current; | 241 | tsk = current; |
| 242 | switch (regs.bx) { | 242 | switch (regs->bx) { |
| 243 | case VM86_REQUEST_IRQ: | 243 | case VM86_REQUEST_IRQ: |
| 244 | case VM86_FREE_IRQ: | 244 | case VM86_FREE_IRQ: |
| 245 | case VM86_GET_IRQ_BITS: | 245 | case VM86_GET_IRQ_BITS: |
| 246 | case VM86_GET_AND_RESET_IRQ: | 246 | case VM86_GET_AND_RESET_IRQ: |
| 247 | ret = do_vm86_irq_handling(regs.bx, (int)regs.cx); | 247 | ret = do_vm86_irq_handling(regs->bx, (int)regs->cx); |
| 248 | goto out; | 248 | goto out; |
| 249 | case VM86_PLUS_INSTALL_CHECK: | 249 | case VM86_PLUS_INSTALL_CHECK: |
| 250 | /* | 250 | /* |
| @@ -261,14 +261,14 @@ asmlinkage int sys_vm86(struct pt_regs regs) | |||
| 261 | ret = -EPERM; | 261 | ret = -EPERM; |
| 262 | if (tsk->thread.saved_sp0) | 262 | if (tsk->thread.saved_sp0) |
| 263 | goto out; | 263 | goto out; |
| 264 | v86 = (struct vm86plus_struct __user *)regs.cx; | 264 | v86 = (struct vm86plus_struct __user *)regs->cx; |
| 265 | tmp = copy_vm86_regs_from_user(&info.regs, &v86->regs, | 265 | tmp = copy_vm86_regs_from_user(&info.regs, &v86->regs, |
| 266 | offsetof(struct kernel_vm86_struct, regs32) - | 266 | offsetof(struct kernel_vm86_struct, regs32) - |
| 267 | sizeof(info.regs)); | 267 | sizeof(info.regs)); |
| 268 | ret = -EFAULT; | 268 | ret = -EFAULT; |
| 269 | if (tmp) | 269 | if (tmp) |
| 270 | goto out; | 270 | goto out; |
| 271 | info.regs32 = ®s; | 271 | info.regs32 = regs; |
| 272 | info.vm86plus.is_vm86pus = 1; | 272 | info.vm86plus.is_vm86pus = 1; |
| 273 | tsk->thread.vm86_info = (struct vm86_struct __user *)v86; | 273 | tsk->thread.vm86_info = (struct vm86_struct __user *)v86; |
| 274 | do_sys_vm86(&info, tsk); | 274 | do_sys_vm86(&info, tsk); |
| @@ -323,7 +323,7 @@ static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk | |||
| 323 | info->regs32->ax = 0; | 323 | info->regs32->ax = 0; |
| 324 | tsk->thread.saved_sp0 = tsk->thread.sp0; | 324 | tsk->thread.saved_sp0 = tsk->thread.sp0; |
| 325 | tsk->thread.saved_fs = info->regs32->fs; | 325 | tsk->thread.saved_fs = info->regs32->fs; |
| 326 | savesegment(gs, tsk->thread.saved_gs); | 326 | tsk->thread.saved_gs = get_user_gs(info->regs32); |
| 327 | 327 | ||
| 328 | tss = &per_cpu(init_tss, get_cpu()); | 328 | tss = &per_cpu(init_tss, get_cpu()); |
| 329 | tsk->thread.sp0 = (unsigned long) &info->VM86_TSS_ESP0; | 329 | tsk->thread.sp0 = (unsigned long) &info->VM86_TSS_ESP0; |
diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c index bef58b4982db..2cc4a90e2cb3 100644 --- a/arch/x86/kernel/vmi_32.c +++ b/arch/x86/kernel/vmi_32.c | |||
| @@ -680,10 +680,11 @@ static inline int __init activate_vmi(void) | |||
| 680 | para_fill(pv_mmu_ops.write_cr2, SetCR2); | 680 | para_fill(pv_mmu_ops.write_cr2, SetCR2); |
| 681 | para_fill(pv_mmu_ops.write_cr3, SetCR3); | 681 | para_fill(pv_mmu_ops.write_cr3, SetCR3); |
| 682 | para_fill(pv_cpu_ops.write_cr4, SetCR4); | 682 | para_fill(pv_cpu_ops.write_cr4, SetCR4); |
| 683 | para_fill(pv_irq_ops.save_fl, GetInterruptMask); | 683 | |
| 684 | para_fill(pv_irq_ops.restore_fl, SetInterruptMask); | 684 | para_fill(pv_irq_ops.save_fl.func, GetInterruptMask); |
| 685 | para_fill(pv_irq_ops.irq_disable, DisableInterrupts); | 685 | para_fill(pv_irq_ops.restore_fl.func, SetInterruptMask); |
| 686 | para_fill(pv_irq_ops.irq_enable, EnableInterrupts); | 686 | para_fill(pv_irq_ops.irq_disable.func, DisableInterrupts); |
| 687 | para_fill(pv_irq_ops.irq_enable.func, EnableInterrupts); | ||
| 687 | 688 | ||
| 688 | para_fill(pv_cpu_ops.wbinvd, WBINVD); | 689 | para_fill(pv_cpu_ops.wbinvd, WBINVD); |
| 689 | para_fill(pv_cpu_ops.read_tsc, RDTSC); | 690 | para_fill(pv_cpu_ops.read_tsc, RDTSC); |
| @@ -797,8 +798,8 @@ static inline int __init activate_vmi(void) | |||
| 797 | #endif | 798 | #endif |
| 798 | 799 | ||
| 799 | #ifdef CONFIG_X86_LOCAL_APIC | 800 | #ifdef CONFIG_X86_LOCAL_APIC |
| 800 | para_fill(apic_ops->read, APICRead); | 801 | para_fill(apic->read, APICRead); |
| 801 | para_fill(apic_ops->write, APICWrite); | 802 | para_fill(apic->write, APICWrite); |
| 802 | #endif | 803 | #endif |
| 803 | 804 | ||
| 804 | /* | 805 | /* |
diff --git a/arch/x86/kernel/vmiclock_32.c b/arch/x86/kernel/vmiclock_32.c index bde106cae0a9..9cd28c04952a 100644 --- a/arch/x86/kernel/vmiclock_32.c +++ b/arch/x86/kernel/vmiclock_32.c | |||
| @@ -256,7 +256,7 @@ void __devinit vmi_time_bsp_init(void) | |||
| 256 | */ | 256 | */ |
| 257 | clockevents_notify(CLOCK_EVT_NOTIFY_SUSPEND, NULL); | 257 | clockevents_notify(CLOCK_EVT_NOTIFY_SUSPEND, NULL); |
| 258 | local_irq_disable(); | 258 | local_irq_disable(); |
| 259 | #ifdef CONFIG_X86_SMP | 259 | #ifdef CONFIG_SMP |
| 260 | /* | 260 | /* |
| 261 | * XXX handle_percpu_irq only defined for SMP; we need to switch over | 261 | * XXX handle_percpu_irq only defined for SMP; we need to switch over |
| 262 | * to using it, since this is a local interrupt, which each CPU must | 262 | * to using it, since this is a local interrupt, which each CPU must |
diff --git a/arch/x86/kernel/vmlinux_32.lds.S b/arch/x86/kernel/vmlinux_32.lds.S index 82c67559dde7..0d860963f268 100644 --- a/arch/x86/kernel/vmlinux_32.lds.S +++ b/arch/x86/kernel/vmlinux_32.lds.S | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | #include <asm-generic/vmlinux.lds.h> | 13 | #include <asm-generic/vmlinux.lds.h> |
| 14 | #include <asm/thread_info.h> | 14 | #include <asm/thread_info.h> |
| 15 | #include <asm/page.h> | 15 | #include <asm/page_types.h> |
| 16 | #include <asm/cache.h> | 16 | #include <asm/cache.h> |
| 17 | #include <asm/boot.h> | 17 | #include <asm/boot.h> |
| 18 | 18 | ||
| @@ -178,14 +178,7 @@ SECTIONS | |||
| 178 | __initramfs_end = .; | 178 | __initramfs_end = .; |
| 179 | } | 179 | } |
| 180 | #endif | 180 | #endif |
| 181 | . = ALIGN(PAGE_SIZE); | 181 | PERCPU(PAGE_SIZE) |
| 182 | .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { | ||
| 183 | __per_cpu_start = .; | ||
| 184 | *(.data.percpu.page_aligned) | ||
| 185 | *(.data.percpu) | ||
| 186 | *(.data.percpu.shared_aligned) | ||
| 187 | __per_cpu_end = .; | ||
| 188 | } | ||
| 189 | . = ALIGN(PAGE_SIZE); | 182 | . = ALIGN(PAGE_SIZE); |
| 190 | /* freed after init ends here */ | 183 | /* freed after init ends here */ |
| 191 | 184 | ||
diff --git a/arch/x86/kernel/vmlinux_64.lds.S b/arch/x86/kernel/vmlinux_64.lds.S index 1a614c0e6bef..fbfced6f6800 100644 --- a/arch/x86/kernel/vmlinux_64.lds.S +++ b/arch/x86/kernel/vmlinux_64.lds.S | |||
| @@ -5,7 +5,8 @@ | |||
| 5 | #define LOAD_OFFSET __START_KERNEL_map | 5 | #define LOAD_OFFSET __START_KERNEL_map |
| 6 | 6 | ||
| 7 | #include <asm-generic/vmlinux.lds.h> | 7 | #include <asm-generic/vmlinux.lds.h> |
| 8 | #include <asm/page.h> | 8 | #include <asm/asm-offsets.h> |
| 9 | #include <asm/page_types.h> | ||
| 9 | 10 | ||
| 10 | #undef i386 /* in case the preprocessor is a 32bit one */ | 11 | #undef i386 /* in case the preprocessor is a 32bit one */ |
| 11 | 12 | ||
| @@ -13,12 +14,15 @@ OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") | |||
| 13 | OUTPUT_ARCH(i386:x86-64) | 14 | OUTPUT_ARCH(i386:x86-64) |
| 14 | ENTRY(phys_startup_64) | 15 | ENTRY(phys_startup_64) |
| 15 | jiffies_64 = jiffies; | 16 | jiffies_64 = jiffies; |
| 16 | _proxy_pda = 1; | ||
| 17 | PHDRS { | 17 | PHDRS { |
| 18 | text PT_LOAD FLAGS(5); /* R_E */ | 18 | text PT_LOAD FLAGS(5); /* R_E */ |
| 19 | data PT_LOAD FLAGS(7); /* RWE */ | 19 | data PT_LOAD FLAGS(7); /* RWE */ |
| 20 | user PT_LOAD FLAGS(7); /* RWE */ | 20 | user PT_LOAD FLAGS(7); /* RWE */ |
| 21 | data.init PT_LOAD FLAGS(7); /* RWE */ | 21 | data.init PT_LOAD FLAGS(7); /* RWE */ |
| 22 | #ifdef CONFIG_SMP | ||
| 23 | percpu PT_LOAD FLAGS(7); /* RWE */ | ||
| 24 | #endif | ||
| 25 | data.init2 PT_LOAD FLAGS(7); /* RWE */ | ||
| 22 | note PT_NOTE FLAGS(0); /* ___ */ | 26 | note PT_NOTE FLAGS(0); /* ___ */ |
| 23 | } | 27 | } |
| 24 | SECTIONS | 28 | SECTIONS |
| @@ -208,14 +212,28 @@ SECTIONS | |||
| 208 | __initramfs_end = .; | 212 | __initramfs_end = .; |
| 209 | #endif | 213 | #endif |
| 210 | 214 | ||
| 215 | #ifdef CONFIG_SMP | ||
| 216 | /* | ||
| 217 | * percpu offsets are zero-based on SMP. PERCPU_VADDR() changes the | ||
| 218 | * output PHDR, so the next output section - __data_nosave - should | ||
| 219 | * start another section data.init2. Also, pda should be at the head of | ||
| 220 | * percpu area. Preallocate it and define the percpu offset symbol | ||
| 221 | * so that it can be accessed as a percpu variable. | ||
| 222 | */ | ||
| 223 | . = ALIGN(PAGE_SIZE); | ||
| 224 | PERCPU_VADDR(0, :percpu) | ||
| 225 | #else | ||
| 211 | PERCPU(PAGE_SIZE) | 226 | PERCPU(PAGE_SIZE) |
| 227 | #endif | ||
| 212 | 228 | ||
| 213 | . = ALIGN(PAGE_SIZE); | 229 | . = ALIGN(PAGE_SIZE); |
| 214 | __init_end = .; | 230 | __init_end = .; |
| 215 | 231 | ||
| 216 | . = ALIGN(PAGE_SIZE); | 232 | . = ALIGN(PAGE_SIZE); |
| 217 | __nosave_begin = .; | 233 | __nosave_begin = .; |
| 218 | .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { *(.data.nosave) } | 234 | .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { |
| 235 | *(.data.nosave) | ||
| 236 | } :data.init2 /* use another section data.init2, see PERCPU_VADDR() above */ | ||
| 219 | . = ALIGN(PAGE_SIZE); | 237 | . = ALIGN(PAGE_SIZE); |
| 220 | __nosave_end = .; | 238 | __nosave_end = .; |
| 221 | 239 | ||
| @@ -239,8 +257,21 @@ SECTIONS | |||
| 239 | DWARF_DEBUG | 257 | DWARF_DEBUG |
| 240 | } | 258 | } |
| 241 | 259 | ||
| 260 | /* | ||
| 261 | * Per-cpu symbols which need to be offset from __per_cpu_load | ||
| 262 | * for the boot processor. | ||
| 263 | */ | ||
| 264 | #define INIT_PER_CPU(x) init_per_cpu__##x = per_cpu__##x + __per_cpu_load | ||
| 265 | INIT_PER_CPU(gdt_page); | ||
| 266 | INIT_PER_CPU(irq_stack_union); | ||
| 267 | |||
| 242 | /* | 268 | /* |
| 243 | * Build-time check on the image size: | 269 | * Build-time check on the image size: |
| 244 | */ | 270 | */ |
| 245 | ASSERT((_end - _text <= KERNEL_IMAGE_SIZE), | 271 | ASSERT((_end - _text <= KERNEL_IMAGE_SIZE), |
| 246 | "kernel image bigger than KERNEL_IMAGE_SIZE") | 272 | "kernel image bigger than KERNEL_IMAGE_SIZE") |
| 273 | |||
| 274 | #ifdef CONFIG_SMP | ||
| 275 | ASSERT((per_cpu__irq_stack_union == 0), | ||
| 276 | "irq_stack_union is not at start of per-cpu area"); | ||
| 277 | #endif | ||
diff --git a/arch/x86/kernel/vsmp_64.c b/arch/x86/kernel/vsmp_64.c index a688f3bfaec2..c609205df594 100644 --- a/arch/x86/kernel/vsmp_64.c +++ b/arch/x86/kernel/vsmp_64.c | |||
| @@ -37,6 +37,7 @@ static unsigned long vsmp_save_fl(void) | |||
| 37 | flags &= ~X86_EFLAGS_IF; | 37 | flags &= ~X86_EFLAGS_IF; |
| 38 | return flags; | 38 | return flags; |
| 39 | } | 39 | } |
| 40 | PV_CALLEE_SAVE_REGS_THUNK(vsmp_save_fl); | ||
| 40 | 41 | ||
| 41 | static void vsmp_restore_fl(unsigned long flags) | 42 | static void vsmp_restore_fl(unsigned long flags) |
| 42 | { | 43 | { |
| @@ -46,6 +47,7 @@ static void vsmp_restore_fl(unsigned long flags) | |||
| 46 | flags |= X86_EFLAGS_AC; | 47 | flags |= X86_EFLAGS_AC; |
| 47 | native_restore_fl(flags); | 48 | native_restore_fl(flags); |
| 48 | } | 49 | } |
| 50 | PV_CALLEE_SAVE_REGS_THUNK(vsmp_restore_fl); | ||
| 49 | 51 | ||
| 50 | static void vsmp_irq_disable(void) | 52 | static void vsmp_irq_disable(void) |
| 51 | { | 53 | { |
| @@ -53,6 +55,7 @@ static void vsmp_irq_disable(void) | |||
| 53 | 55 | ||
| 54 | native_restore_fl((flags & ~X86_EFLAGS_IF) | X86_EFLAGS_AC); | 56 | native_restore_fl((flags & ~X86_EFLAGS_IF) | X86_EFLAGS_AC); |
| 55 | } | 57 | } |
| 58 | PV_CALLEE_SAVE_REGS_THUNK(vsmp_irq_disable); | ||
| 56 | 59 | ||
| 57 | static void vsmp_irq_enable(void) | 60 | static void vsmp_irq_enable(void) |
| 58 | { | 61 | { |
| @@ -60,6 +63,7 @@ static void vsmp_irq_enable(void) | |||
| 60 | 63 | ||
| 61 | native_restore_fl((flags | X86_EFLAGS_IF) & (~X86_EFLAGS_AC)); | 64 | native_restore_fl((flags | X86_EFLAGS_IF) & (~X86_EFLAGS_AC)); |
| 62 | } | 65 | } |
| 66 | PV_CALLEE_SAVE_REGS_THUNK(vsmp_irq_enable); | ||
| 63 | 67 | ||
| 64 | static unsigned __init_or_module vsmp_patch(u8 type, u16 clobbers, void *ibuf, | 68 | static unsigned __init_or_module vsmp_patch(u8 type, u16 clobbers, void *ibuf, |
| 65 | unsigned long addr, unsigned len) | 69 | unsigned long addr, unsigned len) |
| @@ -90,10 +94,10 @@ static void __init set_vsmp_pv_ops(void) | |||
| 90 | cap, ctl); | 94 | cap, ctl); |
| 91 | if (cap & ctl & (1 << 4)) { | 95 | if (cap & ctl & (1 << 4)) { |
| 92 | /* Setup irq ops and turn on vSMP IRQ fastpath handling */ | 96 | /* Setup irq ops and turn on vSMP IRQ fastpath handling */ |
| 93 | pv_irq_ops.irq_disable = vsmp_irq_disable; | 97 | pv_irq_ops.irq_disable = PV_CALLEE_SAVE(vsmp_irq_disable); |
| 94 | pv_irq_ops.irq_enable = vsmp_irq_enable; | 98 | pv_irq_ops.irq_enable = PV_CALLEE_SAVE(vsmp_irq_enable); |
| 95 | pv_irq_ops.save_fl = vsmp_save_fl; | 99 | pv_irq_ops.save_fl = PV_CALLEE_SAVE(vsmp_save_fl); |
| 96 | pv_irq_ops.restore_fl = vsmp_restore_fl; | 100 | pv_irq_ops.restore_fl = PV_CALLEE_SAVE(vsmp_restore_fl); |
| 97 | pv_init_ops.patch = vsmp_patch; | 101 | pv_init_ops.patch = vsmp_patch; |
| 98 | 102 | ||
| 99 | ctl &= ~(1 << 4); | 103 | ctl &= ~(1 << 4); |
diff --git a/arch/x86/kernel/x8664_ksyms_64.c b/arch/x86/kernel/x8664_ksyms_64.c index 695e426aa354..3909e3ba5ce3 100644 --- a/arch/x86/kernel/x8664_ksyms_64.c +++ b/arch/x86/kernel/x8664_ksyms_64.c | |||
| @@ -58,5 +58,3 @@ EXPORT_SYMBOL(__memcpy); | |||
| 58 | EXPORT_SYMBOL(empty_zero_page); | 58 | EXPORT_SYMBOL(empty_zero_page); |
| 59 | EXPORT_SYMBOL(init_level4_pgt); | 59 | EXPORT_SYMBOL(init_level4_pgt); |
| 60 | EXPORT_SYMBOL(load_gs_index); | 60 | EXPORT_SYMBOL(load_gs_index); |
| 61 | |||
| 62 | EXPORT_SYMBOL(_proxy_pda); | ||
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c index 92f1c6f3e19d..f3a5305b8adf 100644 --- a/arch/x86/lguest/boot.c +++ b/arch/x86/lguest/boot.c | |||
| @@ -173,24 +173,29 @@ static unsigned long save_fl(void) | |||
| 173 | { | 173 | { |
| 174 | return lguest_data.irq_enabled; | 174 | return lguest_data.irq_enabled; |
| 175 | } | 175 | } |
| 176 | PV_CALLEE_SAVE_REGS_THUNK(save_fl); | ||
| 176 | 177 | ||
| 177 | /* restore_flags() just sets the flags back to the value given. */ | 178 | /* restore_flags() just sets the flags back to the value given. */ |
| 178 | static void restore_fl(unsigned long flags) | 179 | static void restore_fl(unsigned long flags) |
| 179 | { | 180 | { |
| 180 | lguest_data.irq_enabled = flags; | 181 | lguest_data.irq_enabled = flags; |
| 181 | } | 182 | } |
| 183 | PV_CALLEE_SAVE_REGS_THUNK(restore_fl); | ||
| 182 | 184 | ||
| 183 | /* Interrupts go off... */ | 185 | /* Interrupts go off... */ |
| 184 | static void irq_disable(void) | 186 | static void irq_disable(void) |
| 185 | { | 187 | { |
| 186 | lguest_data.irq_enabled = 0; | 188 | lguest_data.irq_enabled = 0; |
| 187 | } | 189 | } |
| 190 | PV_CALLEE_SAVE_REGS_THUNK(irq_disable); | ||
| 188 | 191 | ||
| 189 | /* Interrupts go on... */ | 192 | /* Interrupts go on... */ |
| 190 | static void irq_enable(void) | 193 | static void irq_enable(void) |
| 191 | { | 194 | { |
| 192 | lguest_data.irq_enabled = X86_EFLAGS_IF; | 195 | lguest_data.irq_enabled = X86_EFLAGS_IF; |
| 193 | } | 196 | } |
| 197 | PV_CALLEE_SAVE_REGS_THUNK(irq_enable); | ||
| 198 | |||
| 194 | /*:*/ | 199 | /*:*/ |
| 195 | /*M:003 Note that we don't check for outstanding interrupts when we re-enable | 200 | /*M:003 Note that we don't check for outstanding interrupts when we re-enable |
| 196 | * them (or when we unmask an interrupt). This seems to work for the moment, | 201 | * them (or when we unmask an interrupt). This seems to work for the moment, |
| @@ -278,7 +283,7 @@ static void lguest_load_tls(struct thread_struct *t, unsigned int cpu) | |||
| 278 | /* There's one problem which normal hardware doesn't have: the Host | 283 | /* There's one problem which normal hardware doesn't have: the Host |
| 279 | * can't handle us removing entries we're currently using. So we clear | 284 | * can't handle us removing entries we're currently using. So we clear |
| 280 | * the GS register here: if it's needed it'll be reloaded anyway. */ | 285 | * the GS register here: if it's needed it'll be reloaded anyway. */ |
| 281 | loadsegment(gs, 0); | 286 | lazy_load_gs(0); |
| 282 | lazy_hcall(LHCALL_LOAD_TLS, __pa(&t->tls_array), cpu, 0); | 287 | lazy_hcall(LHCALL_LOAD_TLS, __pa(&t->tls_array), cpu, 0); |
| 283 | } | 288 | } |
| 284 | 289 | ||
| @@ -823,13 +828,14 @@ static u32 lguest_apic_safe_wait_icr_idle(void) | |||
| 823 | return 0; | 828 | return 0; |
| 824 | } | 829 | } |
| 825 | 830 | ||
| 826 | static struct apic_ops lguest_basic_apic_ops = { | 831 | static void set_lguest_basic_apic_ops(void) |
| 827 | .read = lguest_apic_read, | 832 | { |
| 828 | .write = lguest_apic_write, | 833 | apic->read = lguest_apic_read; |
| 829 | .icr_read = lguest_apic_icr_read, | 834 | apic->write = lguest_apic_write; |
| 830 | .icr_write = lguest_apic_icr_write, | 835 | apic->icr_read = lguest_apic_icr_read; |
| 831 | .wait_icr_idle = lguest_apic_wait_icr_idle, | 836 | apic->icr_write = lguest_apic_icr_write; |
| 832 | .safe_wait_icr_idle = lguest_apic_safe_wait_icr_idle, | 837 | apic->wait_icr_idle = lguest_apic_wait_icr_idle; |
| 838 | apic->safe_wait_icr_idle = lguest_apic_safe_wait_icr_idle; | ||
| 833 | }; | 839 | }; |
| 834 | #endif | 840 | #endif |
| 835 | 841 | ||
| @@ -984,10 +990,10 @@ __init void lguest_init(void) | |||
| 984 | 990 | ||
| 985 | /* interrupt-related operations */ | 991 | /* interrupt-related operations */ |
| 986 | pv_irq_ops.init_IRQ = lguest_init_IRQ; | 992 | pv_irq_ops.init_IRQ = lguest_init_IRQ; |
| 987 | pv_irq_ops.save_fl = save_fl; | 993 | pv_irq_ops.save_fl = PV_CALLEE_SAVE(save_fl); |
| 988 | pv_irq_ops.restore_fl = restore_fl; | 994 | pv_irq_ops.restore_fl = PV_CALLEE_SAVE(restore_fl); |
| 989 | pv_irq_ops.irq_disable = irq_disable; | 995 | pv_irq_ops.irq_disable = PV_CALLEE_SAVE(irq_disable); |
| 990 | pv_irq_ops.irq_enable = irq_enable; | 996 | pv_irq_ops.irq_enable = PV_CALLEE_SAVE(irq_enable); |
| 991 | pv_irq_ops.safe_halt = lguest_safe_halt; | 997 | pv_irq_ops.safe_halt = lguest_safe_halt; |
| 992 | 998 | ||
| 993 | /* init-time operations */ | 999 | /* init-time operations */ |
| @@ -1030,7 +1036,7 @@ __init void lguest_init(void) | |||
| 1030 | 1036 | ||
| 1031 | #ifdef CONFIG_X86_LOCAL_APIC | 1037 | #ifdef CONFIG_X86_LOCAL_APIC |
| 1032 | /* apic read/write intercepts */ | 1038 | /* apic read/write intercepts */ |
| 1033 | apic_ops = &lguest_basic_apic_ops; | 1039 | set_lguest_basic_apic_ops(); |
| 1034 | #endif | 1040 | #endif |
| 1035 | 1041 | ||
| 1036 | /* time operations */ | 1042 | /* time operations */ |
diff --git a/arch/x86/lib/getuser.S b/arch/x86/lib/getuser.S index ad374003742f..51f1504cddd9 100644 --- a/arch/x86/lib/getuser.S +++ b/arch/x86/lib/getuser.S | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | 28 | ||
| 29 | #include <linux/linkage.h> | 29 | #include <linux/linkage.h> |
| 30 | #include <asm/dwarf2.h> | 30 | #include <asm/dwarf2.h> |
| 31 | #include <asm/page.h> | 31 | #include <asm/page_types.h> |
| 32 | #include <asm/errno.h> | 32 | #include <asm/errno.h> |
| 33 | #include <asm/asm-offsets.h> | 33 | #include <asm/asm-offsets.h> |
| 34 | #include <asm/thread_info.h> | 34 | #include <asm/thread_info.h> |
diff --git a/arch/x86/mach-default/Makefile b/arch/x86/mach-default/Makefile deleted file mode 100644 index 012fe34459e6..000000000000 --- a/arch/x86/mach-default/Makefile +++ /dev/null | |||
| @@ -1,5 +0,0 @@ | |||
| 1 | # | ||
| 2 | # Makefile for the linux kernel. | ||
| 3 | # | ||
| 4 | |||
| 5 | obj-y := setup.o | ||
diff --git a/arch/x86/mach-default/setup.c b/arch/x86/mach-default/setup.c deleted file mode 100644 index a265a7c63190..000000000000 --- a/arch/x86/mach-default/setup.c +++ /dev/null | |||
| @@ -1,174 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Machine specific setup for generic | ||
| 3 | */ | ||
| 4 | |||
| 5 | #include <linux/smp.h> | ||
| 6 | #include <linux/init.h> | ||
| 7 | #include <linux/interrupt.h> | ||
| 8 | #include <asm/acpi.h> | ||
| 9 | #include <asm/arch_hooks.h> | ||
| 10 | #include <asm/e820.h> | ||
| 11 | #include <asm/setup.h> | ||
| 12 | |||
| 13 | #include <mach_ipi.h> | ||
| 14 | |||
| 15 | #ifdef CONFIG_HOTPLUG_CPU | ||
| 16 | #define DEFAULT_SEND_IPI (1) | ||
| 17 | #else | ||
| 18 | #define DEFAULT_SEND_IPI (0) | ||
| 19 | #endif | ||
| 20 | |||
| 21 | int no_broadcast = DEFAULT_SEND_IPI; | ||
| 22 | |||
| 23 | /** | ||
| 24 | * pre_intr_init_hook - initialisation prior to setting up interrupt vectors | ||
| 25 | * | ||
| 26 | * Description: | ||
| 27 | * Perform any necessary interrupt initialisation prior to setting up | ||
| 28 | * the "ordinary" interrupt call gates. For legacy reasons, the ISA | ||
| 29 | * interrupts should be initialised here if the machine emulates a PC | ||
| 30 | * in any way. | ||
| 31 | **/ | ||
| 32 | void __init pre_intr_init_hook(void) | ||
| 33 | { | ||
| 34 | if (x86_quirks->arch_pre_intr_init) { | ||
| 35 | if (x86_quirks->arch_pre_intr_init()) | ||
| 36 | return; | ||
| 37 | } | ||
| 38 | init_ISA_irqs(); | ||
| 39 | } | ||
| 40 | |||
| 41 | /* | ||
| 42 | * IRQ2 is cascade interrupt to second interrupt controller | ||
| 43 | */ | ||
| 44 | static struct irqaction irq2 = { | ||
| 45 | .handler = no_action, | ||
| 46 | .mask = CPU_MASK_NONE, | ||
| 47 | .name = "cascade", | ||
| 48 | }; | ||
| 49 | |||
| 50 | /** | ||
| 51 | * intr_init_hook - post gate setup interrupt initialisation | ||
| 52 | * | ||
| 53 | * Description: | ||
| 54 | * Fill in any interrupts that may have been left out by the general | ||
| 55 | * init_IRQ() routine. interrupts having to do with the machine rather | ||
| 56 | * than the devices on the I/O bus (like APIC interrupts in intel MP | ||
| 57 | * systems) are started here. | ||
| 58 | **/ | ||
| 59 | void __init intr_init_hook(void) | ||
| 60 | { | ||
| 61 | if (x86_quirks->arch_intr_init) { | ||
| 62 | if (x86_quirks->arch_intr_init()) | ||
| 63 | return; | ||
| 64 | } | ||
| 65 | if (!acpi_ioapic) | ||
| 66 | setup_irq(2, &irq2); | ||
| 67 | |||
| 68 | } | ||
| 69 | |||
| 70 | /** | ||
| 71 | * pre_setup_arch_hook - hook called prior to any setup_arch() execution | ||
| 72 | * | ||
| 73 | * Description: | ||
| 74 | * generally used to activate any machine specific identification | ||
| 75 | * routines that may be needed before setup_arch() runs. On Voyager | ||
| 76 | * this is used to get the board revision and type. | ||
| 77 | **/ | ||
| 78 | void __init pre_setup_arch_hook(void) | ||
| 79 | { | ||
| 80 | } | ||
| 81 | |||
| 82 | /** | ||
| 83 | * trap_init_hook - initialise system specific traps | ||
| 84 | * | ||
| 85 | * Description: | ||
| 86 | * Called as the final act of trap_init(). Used in VISWS to initialise | ||
| 87 | * the various board specific APIC traps. | ||
| 88 | **/ | ||
| 89 | void __init trap_init_hook(void) | ||
| 90 | { | ||
| 91 | if (x86_quirks->arch_trap_init) { | ||
| 92 | if (x86_quirks->arch_trap_init()) | ||
| 93 | return; | ||
| 94 | } | ||
| 95 | } | ||
| 96 | |||
| 97 | static struct irqaction irq0 = { | ||
| 98 | .handler = timer_interrupt, | ||
| 99 | .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL, | ||
| 100 | .mask = CPU_MASK_NONE, | ||
| 101 | .name = "timer" | ||
| 102 | }; | ||
| 103 | |||
| 104 | /** | ||
| 105 | * pre_time_init_hook - do any specific initialisations before. | ||
| 106 | * | ||
| 107 | **/ | ||
| 108 | void __init pre_time_init_hook(void) | ||
| 109 | { | ||
| 110 | if (x86_quirks->arch_pre_time_init) | ||
| 111 | x86_quirks->arch_pre_time_init(); | ||
| 112 | } | ||
| 113 | |||
| 114 | /** | ||
| 115 | * time_init_hook - do any specific initialisations for the system timer. | ||
| 116 | * | ||
| 117 | * Description: | ||
| 118 | * Must plug the system timer interrupt source at HZ into the IRQ listed | ||
| 119 | * in irq_vectors.h:TIMER_IRQ | ||
| 120 | **/ | ||
| 121 | void __init time_init_hook(void) | ||
| 122 | { | ||
| 123 | if (x86_quirks->arch_time_init) { | ||
| 124 | /* | ||
| 125 | * A nonzero return code does not mean failure, it means | ||
| 126 | * that the architecture quirk does not want any | ||
| 127 | * generic (timer) setup to be performed after this: | ||
| 128 | */ | ||
| 129 | if (x86_quirks->arch_time_init()) | ||
| 130 | return; | ||
| 131 | } | ||
| 132 | |||
| 133 | irq0.mask = cpumask_of_cpu(0); | ||
| 134 | setup_irq(0, &irq0); | ||
| 135 | } | ||
| 136 | |||
| 137 | #ifdef CONFIG_MCA | ||
| 138 | /** | ||
| 139 | * mca_nmi_hook - hook into MCA specific NMI chain | ||
| 140 | * | ||
| 141 | * Description: | ||
| 142 | * The MCA (Microchannel Architecture) has an NMI chain for NMI sources | ||
| 143 | * along the MCA bus. Use this to hook into that chain if you will need | ||
| 144 | * it. | ||
| 145 | **/ | ||
| 146 | void mca_nmi_hook(void) | ||
| 147 | { | ||
| 148 | /* | ||
| 149 | * If I recall correctly, there's a whole bunch of other things that | ||
| 150 | * we can do to check for NMI problems, but that's all I know about | ||
| 151 | * at the moment. | ||
| 152 | */ | ||
| 153 | pr_warning("NMI generated from unknown source!\n"); | ||
| 154 | } | ||
| 155 | #endif | ||
| 156 | |||
| 157 | static __init int no_ipi_broadcast(char *str) | ||
| 158 | { | ||
| 159 | get_option(&str, &no_broadcast); | ||
| 160 | pr_info("Using %s mode\n", | ||
| 161 | no_broadcast ? "No IPI Broadcast" : "IPI Broadcast"); | ||
| 162 | return 1; | ||
| 163 | } | ||
| 164 | __setup("no_ipi_broadcast=", no_ipi_broadcast); | ||
| 165 | |||
| 166 | static int __init print_ipi_mode(void) | ||
| 167 | { | ||
| 168 | pr_info("Using IPI %s mode\n", | ||
| 169 | no_broadcast ? "No-Shortcut" : "Shortcut"); | ||
| 170 | return 0; | ||
| 171 | } | ||
| 172 | |||
| 173 | late_initcall(print_ipi_mode); | ||
| 174 | |||
diff --git a/arch/x86/mach-generic/Makefile b/arch/x86/mach-generic/Makefile deleted file mode 100644 index 6730f4e7c744..000000000000 --- a/arch/x86/mach-generic/Makefile +++ /dev/null | |||
| @@ -1,11 +0,0 @@ | |||
| 1 | # | ||
| 2 | # Makefile for the generic architecture | ||
| 3 | # | ||
| 4 | |||
| 5 | EXTRA_CFLAGS := -Iarch/x86/kernel | ||
| 6 | |||
| 7 | obj-y := probe.o default.o | ||
| 8 | obj-$(CONFIG_X86_NUMAQ) += numaq.o | ||
| 9 | obj-$(CONFIG_X86_SUMMIT) += summit.o | ||
| 10 | obj-$(CONFIG_X86_BIGSMP) += bigsmp.o | ||
| 11 | obj-$(CONFIG_X86_ES7000) += es7000.o | ||
diff --git a/arch/x86/mach-generic/bigsmp.c b/arch/x86/mach-generic/bigsmp.c deleted file mode 100644 index bc4c7840b2a8..000000000000 --- a/arch/x86/mach-generic/bigsmp.c +++ /dev/null | |||
| @@ -1,60 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * APIC driver for "bigsmp" XAPIC machines with more than 8 virtual CPUs. | ||
| 3 | * Drives the local APIC in "clustered mode". | ||
| 4 | */ | ||
| 5 | #define APIC_DEFINITION 1 | ||
| 6 | #include <linux/threads.h> | ||
| 7 | #include <linux/cpumask.h> | ||
| 8 | #include <asm/mpspec.h> | ||
| 9 | #include <asm/genapic.h> | ||
| 10 | #include <asm/fixmap.h> | ||
| 11 | #include <asm/apicdef.h> | ||
| 12 | #include <linux/kernel.h> | ||
| 13 | #include <linux/init.h> | ||
| 14 | #include <linux/dmi.h> | ||
| 15 | #include <asm/bigsmp/apicdef.h> | ||
| 16 | #include <linux/smp.h> | ||
| 17 | #include <asm/bigsmp/apic.h> | ||
| 18 | #include <asm/bigsmp/ipi.h> | ||
| 19 | #include <asm/mach-default/mach_mpparse.h> | ||
| 20 | #include <asm/mach-default/mach_wakecpu.h> | ||
| 21 | |||
| 22 | static int dmi_bigsmp; /* can be set by dmi scanners */ | ||
| 23 | |||
| 24 | static int hp_ht_bigsmp(const struct dmi_system_id *d) | ||
| 25 | { | ||
| 26 | printk(KERN_NOTICE "%s detected: force use of apic=bigsmp\n", d->ident); | ||
| 27 | dmi_bigsmp = 1; | ||
| 28 | return 0; | ||
| 29 | } | ||
| 30 | |||
| 31 | |||
| 32 | static const struct dmi_system_id bigsmp_dmi_table[] = { | ||
| 33 | { hp_ht_bigsmp, "HP ProLiant DL760 G2", | ||
| 34 | { DMI_MATCH(DMI_BIOS_VENDOR, "HP"), | ||
| 35 | DMI_MATCH(DMI_BIOS_VERSION, "P44-"),} | ||
| 36 | }, | ||
| 37 | |||
| 38 | { hp_ht_bigsmp, "HP ProLiant DL740", | ||
| 39 | { DMI_MATCH(DMI_BIOS_VENDOR, "HP"), | ||
| 40 | DMI_MATCH(DMI_BIOS_VERSION, "P47-"),} | ||
| 41 | }, | ||
| 42 | { } | ||
| 43 | }; | ||
| 44 | |||
| 45 | static void vector_allocation_domain(int cpu, cpumask_t *retmask) | ||
| 46 | { | ||
| 47 | cpus_clear(*retmask); | ||
| 48 | cpu_set(cpu, *retmask); | ||
| 49 | } | ||
| 50 | |||
| 51 | static int probe_bigsmp(void) | ||
| 52 | { | ||
| 53 | if (def_to_bigsmp) | ||
| 54 | dmi_bigsmp = 1; | ||
| 55 | else | ||
| 56 | dmi_check_system(bigsmp_dmi_table); | ||
| 57 | return dmi_bigsmp; | ||
| 58 | } | ||
| 59 | |||
| 60 | struct genapic apic_bigsmp = APIC_INIT("bigsmp", probe_bigsmp); | ||
diff --git a/arch/x86/mach-generic/default.c b/arch/x86/mach-generic/default.c deleted file mode 100644 index e63a4a76d8cd..000000000000 --- a/arch/x86/mach-generic/default.c +++ /dev/null | |||
| @@ -1,27 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Default generic APIC driver. This handles up to 8 CPUs. | ||
| 3 | */ | ||
| 4 | #define APIC_DEFINITION 1 | ||
| 5 | #include <linux/threads.h> | ||
| 6 | #include <linux/cpumask.h> | ||
| 7 | #include <asm/mpspec.h> | ||
| 8 | #include <asm/mach-default/mach_apicdef.h> | ||
| 9 | #include <asm/genapic.h> | ||
| 10 | #include <asm/fixmap.h> | ||
| 11 | #include <asm/apicdef.h> | ||
| 12 | #include <linux/kernel.h> | ||
| 13 | #include <linux/string.h> | ||
| 14 | #include <linux/smp.h> | ||
| 15 | #include <linux/init.h> | ||
| 16 | #include <asm/mach-default/mach_apic.h> | ||
| 17 | #include <asm/mach-default/mach_ipi.h> | ||
| 18 | #include <asm/mach-default/mach_mpparse.h> | ||
| 19 | #include <asm/mach-default/mach_wakecpu.h> | ||
| 20 | |||
| 21 | /* should be called last. */ | ||
| 22 | static int probe_default(void) | ||
| 23 | { | ||
| 24 | return 1; | ||
| 25 | } | ||
| 26 | |||
| 27 | struct genapic apic_default = APIC_INIT("default", probe_default); | ||
diff --git a/arch/x86/mach-generic/es7000.c b/arch/x86/mach-generic/es7000.c deleted file mode 100644 index c2ded1448024..000000000000 --- a/arch/x86/mach-generic/es7000.c +++ /dev/null | |||
| @@ -1,103 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * APIC driver for the Unisys ES7000 chipset. | ||
| 3 | */ | ||
| 4 | #define APIC_DEFINITION 1 | ||
| 5 | #include <linux/threads.h> | ||
| 6 | #include <linux/cpumask.h> | ||
| 7 | #include <asm/mpspec.h> | ||
| 8 | #include <asm/genapic.h> | ||
| 9 | #include <asm/fixmap.h> | ||
| 10 | #include <asm/apicdef.h> | ||
| 11 | #include <linux/kernel.h> | ||
| 12 | #include <linux/string.h> | ||
| 13 | #include <linux/init.h> | ||
| 14 | #include <asm/es7000/apicdef.h> | ||
| 15 | #include <linux/smp.h> | ||
| 16 | #include <asm/es7000/apic.h> | ||
| 17 | #include <asm/es7000/ipi.h> | ||
| 18 | #include <asm/es7000/mpparse.h> | ||
| 19 | #include <asm/mach-default/mach_wakecpu.h> | ||
| 20 | |||
| 21 | void __init es7000_update_genapic_to_cluster(void) | ||
| 22 | { | ||
| 23 | genapic->target_cpus = target_cpus_cluster; | ||
| 24 | genapic->int_delivery_mode = INT_DELIVERY_MODE_CLUSTER; | ||
| 25 | genapic->int_dest_mode = INT_DEST_MODE_CLUSTER; | ||
| 26 | genapic->no_balance_irq = NO_BALANCE_IRQ_CLUSTER; | ||
| 27 | |||
| 28 | genapic->init_apic_ldr = init_apic_ldr_cluster; | ||
| 29 | |||
| 30 | genapic->cpu_mask_to_apicid = cpu_mask_to_apicid_cluster; | ||
| 31 | } | ||
| 32 | |||
| 33 | static int probe_es7000(void) | ||
| 34 | { | ||
| 35 | /* probed later in mptable/ACPI hooks */ | ||
| 36 | return 0; | ||
| 37 | } | ||
| 38 | |||
| 39 | extern void es7000_sw_apic(void); | ||
| 40 | static void __init enable_apic_mode(void) | ||
| 41 | { | ||
| 42 | es7000_sw_apic(); | ||
| 43 | return; | ||
| 44 | } | ||
| 45 | |||
| 46 | static __init int | ||
| 47 | mps_oem_check(struct mpc_table *mpc, char *oem, char *productid) | ||
| 48 | { | ||
| 49 | if (mpc->oemptr) { | ||
| 50 | struct mpc_oemtable *oem_table = | ||
| 51 | (struct mpc_oemtable *)mpc->oemptr; | ||
| 52 | if (!strncmp(oem, "UNISYS", 6)) | ||
| 53 | return parse_unisys_oem((char *)oem_table); | ||
| 54 | } | ||
| 55 | return 0; | ||
| 56 | } | ||
| 57 | |||
| 58 | #ifdef CONFIG_ACPI | ||
| 59 | /* Hook from generic ACPI tables.c */ | ||
| 60 | static int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id) | ||
| 61 | { | ||
| 62 | unsigned long oem_addr = 0; | ||
| 63 | int check_dsdt; | ||
| 64 | int ret = 0; | ||
| 65 | |||
| 66 | /* check dsdt at first to avoid clear fix_map for oem_addr */ | ||
| 67 | check_dsdt = es7000_check_dsdt(); | ||
| 68 | |||
| 69 | if (!find_unisys_acpi_oem_table(&oem_addr)) { | ||
| 70 | if (check_dsdt) | ||
| 71 | ret = parse_unisys_oem((char *)oem_addr); | ||
| 72 | else { | ||
| 73 | setup_unisys(); | ||
| 74 | ret = 1; | ||
| 75 | } | ||
| 76 | /* | ||
| 77 | * we need to unmap it | ||
| 78 | */ | ||
| 79 | unmap_unisys_acpi_oem_table(oem_addr); | ||
| 80 | } | ||
| 81 | return ret; | ||
| 82 | } | ||
| 83 | #else | ||
| 84 | static int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id) | ||
| 85 | { | ||
| 86 | return 0; | ||
| 87 | } | ||
| 88 | #endif | ||
| 89 | |||
| 90 | static void vector_allocation_domain(int cpu, cpumask_t *retmask) | ||
| 91 | { | ||
| 92 | /* Careful. Some cpus do not strictly honor the set of cpus | ||
| 93 | * specified in the interrupt destination when using lowest | ||
| 94 | * priority interrupt delivery mode. | ||
| 95 | * | ||
| 96 | * In particular there was a hyperthreading cpu observed to | ||
| 97 | * deliver interrupts to the wrong hyperthread when only one | ||
| 98 | * hyperthread was specified in the interrupt desitination. | ||
| 99 | */ | ||
| 100 | *retmask = (cpumask_t){ { [0] = APIC_ALL_CPUS, } }; | ||
| 101 | } | ||
| 102 | |||
| 103 | struct genapic __initdata_refok apic_es7000 = APIC_INIT("es7000", probe_es7000); | ||
diff --git a/arch/x86/mach-generic/numaq.c b/arch/x86/mach-generic/numaq.c deleted file mode 100644 index 3679e2255645..000000000000 --- a/arch/x86/mach-generic/numaq.c +++ /dev/null | |||
| @@ -1,53 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * APIC driver for the IBM NUMAQ chipset. | ||
| 3 | */ | ||
| 4 | #define APIC_DEFINITION 1 | ||
| 5 | #include <linux/threads.h> | ||
| 6 | #include <linux/cpumask.h> | ||
| 7 | #include <asm/mpspec.h> | ||
| 8 | #include <asm/genapic.h> | ||
| 9 | #include <asm/fixmap.h> | ||
| 10 | #include <asm/apicdef.h> | ||
| 11 | #include <linux/kernel.h> | ||
| 12 | #include <linux/string.h> | ||
| 13 | #include <linux/init.h> | ||
| 14 | #include <asm/numaq/apicdef.h> | ||
| 15 | #include <linux/smp.h> | ||
| 16 | #include <asm/numaq/apic.h> | ||
| 17 | #include <asm/numaq/ipi.h> | ||
| 18 | #include <asm/numaq/mpparse.h> | ||
| 19 | #include <asm/numaq/wakecpu.h> | ||
| 20 | #include <asm/numaq.h> | ||
| 21 | |||
| 22 | static int mps_oem_check(struct mpc_table *mpc, char *oem, char *productid) | ||
| 23 | { | ||
| 24 | numaq_mps_oem_check(mpc, oem, productid); | ||
| 25 | return found_numaq; | ||
| 26 | } | ||
| 27 | |||
| 28 | static int probe_numaq(void) | ||
| 29 | { | ||
| 30 | /* already know from get_memcfg_numaq() */ | ||
| 31 | return found_numaq; | ||
| 32 | } | ||
| 33 | |||
| 34 | /* Hook from generic ACPI tables.c */ | ||
| 35 | static int acpi_madt_oem_check(char *oem_id, char *oem_table_id) | ||
| 36 | { | ||
| 37 | return 0; | ||
| 38 | } | ||
| 39 | |||
| 40 | static void vector_allocation_domain(int cpu, cpumask_t *retmask) | ||
| 41 | { | ||
| 42 | /* Careful. Some cpus do not strictly honor the set of cpus | ||
| 43 | * specified in the interrupt destination when using lowest | ||
| 44 | * priority interrupt delivery mode. | ||
| 45 | * | ||
| 46 | * In particular there was a hyperthreading cpu observed to | ||
| 47 | * deliver interrupts to the wrong hyperthread when only one | ||
| 48 | * hyperthread was specified in the interrupt desitination. | ||
| 49 | */ | ||
| 50 | *retmask = (cpumask_t){ { [0] = APIC_ALL_CPUS, } }; | ||
| 51 | } | ||
| 52 | |||
| 53 | struct genapic apic_numaq = APIC_INIT("NUMAQ", probe_numaq); | ||
diff --git a/arch/x86/mach-generic/probe.c b/arch/x86/mach-generic/probe.c deleted file mode 100644 index 15a38daef1a8..000000000000 --- a/arch/x86/mach-generic/probe.c +++ /dev/null | |||
| @@ -1,152 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2003 Andi Kleen, SuSE Labs. | ||
| 3 | * Subject to the GNU Public License, v.2 | ||
| 4 | * | ||
| 5 | * Generic x86 APIC driver probe layer. | ||
| 6 | */ | ||
| 7 | #include <linux/threads.h> | ||
| 8 | #include <linux/cpumask.h> | ||
| 9 | #include <linux/string.h> | ||
| 10 | #include <linux/kernel.h> | ||
| 11 | #include <linux/ctype.h> | ||
| 12 | #include <linux/init.h> | ||
| 13 | #include <linux/errno.h> | ||
| 14 | #include <asm/fixmap.h> | ||
| 15 | #include <asm/mpspec.h> | ||
| 16 | #include <asm/apicdef.h> | ||
| 17 | #include <asm/genapic.h> | ||
| 18 | #include <asm/setup.h> | ||
| 19 | |||
| 20 | extern struct genapic apic_numaq; | ||
| 21 | extern struct genapic apic_summit; | ||
| 22 | extern struct genapic apic_bigsmp; | ||
| 23 | extern struct genapic apic_es7000; | ||
| 24 | extern struct genapic apic_default; | ||
| 25 | |||
| 26 | struct genapic *genapic = &apic_default; | ||
| 27 | |||
| 28 | static struct genapic *apic_probe[] __initdata = { | ||
| 29 | #ifdef CONFIG_X86_NUMAQ | ||
| 30 | &apic_numaq, | ||
| 31 | #endif | ||
| 32 | #ifdef CONFIG_X86_SUMMIT | ||
| 33 | &apic_summit, | ||
| 34 | #endif | ||
| 35 | #ifdef CONFIG_X86_BIGSMP | ||
| 36 | &apic_bigsmp, | ||
| 37 | #endif | ||
| 38 | #ifdef CONFIG_X86_ES7000 | ||
| 39 | &apic_es7000, | ||
| 40 | #endif | ||
| 41 | &apic_default, /* must be last */ | ||
| 42 | NULL, | ||
| 43 | }; | ||
| 44 | |||
| 45 | static int cmdline_apic __initdata; | ||
| 46 | static int __init parse_apic(char *arg) | ||
| 47 | { | ||
| 48 | int i; | ||
| 49 | |||
| 50 | if (!arg) | ||
| 51 | return -EINVAL; | ||
| 52 | |||
| 53 | for (i = 0; apic_probe[i]; i++) { | ||
| 54 | if (!strcmp(apic_probe[i]->name, arg)) { | ||
| 55 | genapic = apic_probe[i]; | ||
| 56 | cmdline_apic = 1; | ||
| 57 | return 0; | ||
| 58 | } | ||
| 59 | } | ||
| 60 | |||
| 61 | if (x86_quirks->update_genapic) | ||
| 62 | x86_quirks->update_genapic(); | ||
| 63 | |||
| 64 | /* Parsed again by __setup for debug/verbose */ | ||
| 65 | return 0; | ||
| 66 | } | ||
| 67 | early_param("apic", parse_apic); | ||
| 68 | |||
| 69 | void __init generic_bigsmp_probe(void) | ||
| 70 | { | ||
| 71 | #ifdef CONFIG_X86_BIGSMP | ||
| 72 | /* | ||
| 73 | * This routine is used to switch to bigsmp mode when | ||
| 74 | * - There is no apic= option specified by the user | ||
| 75 | * - generic_apic_probe() has chosen apic_default as the sub_arch | ||
| 76 | * - we find more than 8 CPUs in acpi LAPIC listing with xAPIC support | ||
| 77 | */ | ||
| 78 | |||
| 79 | if (!cmdline_apic && genapic == &apic_default) { | ||
| 80 | if (apic_bigsmp.probe()) { | ||
| 81 | genapic = &apic_bigsmp; | ||
| 82 | if (x86_quirks->update_genapic) | ||
| 83 | x86_quirks->update_genapic(); | ||
| 84 | printk(KERN_INFO "Overriding APIC driver with %s\n", | ||
| 85 | genapic->name); | ||
| 86 | } | ||
| 87 | } | ||
| 88 | #endif | ||
| 89 | } | ||
| 90 | |||
| 91 | void __init generic_apic_probe(void) | ||
| 92 | { | ||
| 93 | if (!cmdline_apic) { | ||
| 94 | int i; | ||
| 95 | for (i = 0; apic_probe[i]; i++) { | ||
| 96 | if (apic_probe[i]->probe()) { | ||
| 97 | genapic = apic_probe[i]; | ||
| 98 | break; | ||
| 99 | } | ||
| 100 | } | ||
| 101 | /* Not visible without early console */ | ||
| 102 | if (!apic_probe[i]) | ||
| 103 | panic("Didn't find an APIC driver"); | ||
| 104 | |||
| 105 | if (x86_quirks->update_genapic) | ||
| 106 | x86_quirks->update_genapic(); | ||
| 107 | } | ||
| 108 | printk(KERN_INFO "Using APIC driver %s\n", genapic->name); | ||
| 109 | } | ||
| 110 | |||
| 111 | /* These functions can switch the APIC even after the initial ->probe() */ | ||
| 112 | |||
| 113 | int __init mps_oem_check(struct mpc_table *mpc, char *oem, char *productid) | ||
| 114 | { | ||
| 115 | int i; | ||
| 116 | for (i = 0; apic_probe[i]; ++i) { | ||
| 117 | if (apic_probe[i]->mps_oem_check(mpc, oem, productid)) { | ||
| 118 | if (!cmdline_apic) { | ||
| 119 | genapic = apic_probe[i]; | ||
| 120 | if (x86_quirks->update_genapic) | ||
| 121 | x86_quirks->update_genapic(); | ||
| 122 | printk(KERN_INFO "Switched to APIC driver `%s'.\n", | ||
| 123 | genapic->name); | ||
| 124 | } | ||
| 125 | return 1; | ||
| 126 | } | ||
| 127 | } | ||
| 128 | return 0; | ||
| 129 | } | ||
| 130 | |||
| 131 | int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id) | ||
| 132 | { | ||
| 133 | int i; | ||
| 134 | for (i = 0; apic_probe[i]; ++i) { | ||
| 135 | if (apic_probe[i]->acpi_madt_oem_check(oem_id, oem_table_id)) { | ||
| 136 | if (!cmdline_apic) { | ||
| 137 | genapic = apic_probe[i]; | ||
| 138 | if (x86_quirks->update_genapic) | ||
| 139 | x86_quirks->update_genapic(); | ||
| 140 | printk(KERN_INFO "Switched to APIC driver `%s'.\n", | ||
| 141 | genapic->name); | ||
| 142 | } | ||
| 143 | return 1; | ||
| 144 | } | ||
| 145 | } | ||
| 146 | return 0; | ||
| 147 | } | ||
| 148 | |||
| 149 | int hard_smp_processor_id(void) | ||
| 150 | { | ||
| 151 | return genapic->get_apic_id(*(unsigned long *)(APIC_BASE+APIC_ID)); | ||
| 152 | } | ||
diff --git a/arch/x86/mach-generic/summit.c b/arch/x86/mach-generic/summit.c deleted file mode 100644 index 2821ffc188b5..000000000000 --- a/arch/x86/mach-generic/summit.c +++ /dev/null | |||
| @@ -1,40 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * APIC driver for the IBM "Summit" chipset. | ||
| 3 | */ | ||
| 4 | #define APIC_DEFINITION 1 | ||
| 5 | #include <linux/threads.h> | ||
| 6 | #include <linux/cpumask.h> | ||
| 7 | #include <asm/mpspec.h> | ||
| 8 | #include <asm/genapic.h> | ||
| 9 | #include <asm/fixmap.h> | ||
| 10 | #include <asm/apicdef.h> | ||
| 11 | #include <linux/kernel.h> | ||
| 12 | #include <linux/string.h> | ||
| 13 | #include <linux/init.h> | ||
| 14 | #include <asm/summit/apicdef.h> | ||
| 15 | #include <linux/smp.h> | ||
| 16 | #include <asm/summit/apic.h> | ||
| 17 | #include <asm/summit/ipi.h> | ||
| 18 | #include <asm/summit/mpparse.h> | ||
| 19 | #include <asm/mach-default/mach_wakecpu.h> | ||
| 20 | |||
| 21 | static int probe_summit(void) | ||
| 22 | { | ||
| 23 | /* probed later in mptable/ACPI hooks */ | ||
| 24 | return 0; | ||
| 25 | } | ||
| 26 | |||
| 27 | static void vector_allocation_domain(int cpu, cpumask_t *retmask) | ||
| 28 | { | ||
| 29 | /* Careful. Some cpus do not strictly honor the set of cpus | ||
| 30 | * specified in the interrupt destination when using lowest | ||
| 31 | * priority interrupt delivery mode. | ||
| 32 | * | ||
| 33 | * In particular there was a hyperthreading cpu observed to | ||
| 34 | * deliver interrupts to the wrong hyperthread when only one | ||
| 35 | * hyperthread was specified in the interrupt desitination. | ||
| 36 | */ | ||
| 37 | *retmask = (cpumask_t){ { [0] = APIC_ALL_CPUS, } }; | ||
| 38 | } | ||
| 39 | |||
| 40 | struct genapic apic_summit = APIC_INIT("summit", probe_summit); | ||
diff --git a/arch/x86/mach-rdc321x/Makefile b/arch/x86/mach-rdc321x/Makefile deleted file mode 100644 index 8325b4ca431c..000000000000 --- a/arch/x86/mach-rdc321x/Makefile +++ /dev/null | |||
| @@ -1,5 +0,0 @@ | |||
| 1 | # | ||
| 2 | # Makefile for the RDC321x specific parts of the kernel | ||
| 3 | # | ||
| 4 | obj-$(CONFIG_X86_RDC321X) := gpio.o platform.o | ||
| 5 | |||
diff --git a/arch/x86/mach-rdc321x/gpio.c b/arch/x86/mach-rdc321x/gpio.c deleted file mode 100644 index 247f33d3a407..000000000000 --- a/arch/x86/mach-rdc321x/gpio.c +++ /dev/null | |||
| @@ -1,194 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * GPIO support for RDC SoC R3210/R8610 | ||
| 3 | * | ||
| 4 | * Copyright (C) 2007, Florian Fainelli <florian@openwrt.org> | ||
| 5 | * Copyright (C) 2008, Volker Weiss <dev@tintuc.de> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 20 | * | ||
| 21 | */ | ||
| 22 | |||
| 23 | |||
| 24 | #include <linux/spinlock.h> | ||
| 25 | #include <linux/io.h> | ||
| 26 | #include <linux/types.h> | ||
| 27 | #include <linux/module.h> | ||
| 28 | |||
| 29 | #include <asm/gpio.h> | ||
| 30 | #include <asm/mach-rdc321x/rdc321x_defs.h> | ||
| 31 | |||
| 32 | |||
| 33 | /* spin lock to protect our private copy of GPIO data register plus | ||
| 34 | the access to PCI conf registers. */ | ||
| 35 | static DEFINE_SPINLOCK(gpio_lock); | ||
| 36 | |||
| 37 | /* copy of GPIO data registers */ | ||
| 38 | static u32 gpio_data_reg1; | ||
| 39 | static u32 gpio_data_reg2; | ||
| 40 | |||
| 41 | static u32 gpio_request_data[2]; | ||
| 42 | |||
| 43 | |||
| 44 | static inline void rdc321x_conf_write(unsigned addr, u32 value) | ||
| 45 | { | ||
| 46 | outl((1 << 31) | (7 << 11) | addr, RDC3210_CFGREG_ADDR); | ||
| 47 | outl(value, RDC3210_CFGREG_DATA); | ||
| 48 | } | ||
| 49 | |||
| 50 | static inline void rdc321x_conf_or(unsigned addr, u32 value) | ||
| 51 | { | ||
| 52 | outl((1 << 31) | (7 << 11) | addr, RDC3210_CFGREG_ADDR); | ||
| 53 | value |= inl(RDC3210_CFGREG_DATA); | ||
| 54 | outl(value, RDC3210_CFGREG_DATA); | ||
| 55 | } | ||
| 56 | |||
| 57 | static inline u32 rdc321x_conf_read(unsigned addr) | ||
| 58 | { | ||
| 59 | outl((1 << 31) | (7 << 11) | addr, RDC3210_CFGREG_ADDR); | ||
| 60 | |||
| 61 | return inl(RDC3210_CFGREG_DATA); | ||
| 62 | } | ||
| 63 | |||
| 64 | /* configure pin as GPIO */ | ||
| 65 | static void rdc321x_configure_gpio(unsigned gpio) | ||
| 66 | { | ||
| 67 | unsigned long flags; | ||
| 68 | |||
| 69 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 70 | rdc321x_conf_or(gpio < 32 | ||
| 71 | ? RDC321X_GPIO_CTRL_REG1 : RDC321X_GPIO_CTRL_REG2, | ||
| 72 | 1 << (gpio & 0x1f)); | ||
| 73 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 74 | } | ||
| 75 | |||
| 76 | /* initially setup the 2 copies of the gpio data registers. | ||
| 77 | This function must be called by the platform setup code. */ | ||
| 78 | void __init rdc321x_gpio_setup() | ||
| 79 | { | ||
| 80 | /* this might not be, what others (BIOS, bootloader, etc.) | ||
| 81 | wrote to these registers before, but it's a good guess. Still | ||
| 82 | better than just using 0xffffffff. */ | ||
| 83 | |||
| 84 | gpio_data_reg1 = rdc321x_conf_read(RDC321X_GPIO_DATA_REG1); | ||
| 85 | gpio_data_reg2 = rdc321x_conf_read(RDC321X_GPIO_DATA_REG2); | ||
| 86 | } | ||
| 87 | |||
| 88 | /* determine, if gpio number is valid */ | ||
| 89 | static inline int rdc321x_is_gpio(unsigned gpio) | ||
| 90 | { | ||
| 91 | return gpio <= RDC321X_MAX_GPIO; | ||
| 92 | } | ||
| 93 | |||
| 94 | /* request GPIO */ | ||
| 95 | int rdc_gpio_request(unsigned gpio, const char *label) | ||
| 96 | { | ||
| 97 | unsigned long flags; | ||
| 98 | |||
| 99 | if (!rdc321x_is_gpio(gpio)) | ||
| 100 | return -EINVAL; | ||
| 101 | |||
| 102 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 103 | if (gpio_request_data[(gpio & 0x20) ? 1 : 0] & (1 << (gpio & 0x1f))) | ||
| 104 | goto inuse; | ||
| 105 | gpio_request_data[(gpio & 0x20) ? 1 : 0] |= (1 << (gpio & 0x1f)); | ||
| 106 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 107 | |||
| 108 | return 0; | ||
| 109 | inuse: | ||
| 110 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 111 | return -EINVAL; | ||
| 112 | } | ||
| 113 | EXPORT_SYMBOL(rdc_gpio_request); | ||
| 114 | |||
| 115 | /* release previously-claimed GPIO */ | ||
| 116 | void rdc_gpio_free(unsigned gpio) | ||
| 117 | { | ||
| 118 | unsigned long flags; | ||
| 119 | |||
| 120 | if (!rdc321x_is_gpio(gpio)) | ||
| 121 | return; | ||
| 122 | |||
| 123 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 124 | gpio_request_data[(gpio & 0x20) ? 1 : 0] &= ~(1 << (gpio & 0x1f)); | ||
| 125 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 126 | } | ||
| 127 | EXPORT_SYMBOL(rdc_gpio_free); | ||
| 128 | |||
| 129 | /* read GPIO pin */ | ||
| 130 | int rdc_gpio_get_value(unsigned gpio) | ||
| 131 | { | ||
| 132 | u32 reg; | ||
| 133 | unsigned long flags; | ||
| 134 | |||
| 135 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 136 | reg = rdc321x_conf_read(gpio < 32 | ||
| 137 | ? RDC321X_GPIO_DATA_REG1 : RDC321X_GPIO_DATA_REG2); | ||
| 138 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 139 | |||
| 140 | return (1 << (gpio & 0x1f)) & reg ? 1 : 0; | ||
| 141 | } | ||
| 142 | EXPORT_SYMBOL(rdc_gpio_get_value); | ||
| 143 | |||
| 144 | /* set GPIO pin to value */ | ||
| 145 | void rdc_gpio_set_value(unsigned gpio, int value) | ||
| 146 | { | ||
| 147 | unsigned long flags; | ||
| 148 | u32 reg; | ||
| 149 | |||
| 150 | reg = 1 << (gpio & 0x1f); | ||
| 151 | if (gpio < 32) { | ||
| 152 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 153 | if (value) | ||
| 154 | gpio_data_reg1 |= reg; | ||
| 155 | else | ||
| 156 | gpio_data_reg1 &= ~reg; | ||
| 157 | rdc321x_conf_write(RDC321X_GPIO_DATA_REG1, gpio_data_reg1); | ||
| 158 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 159 | } else { | ||
| 160 | spin_lock_irqsave(&gpio_lock, flags); | ||
| 161 | if (value) | ||
| 162 | gpio_data_reg2 |= reg; | ||
| 163 | else | ||
| 164 | gpio_data_reg2 &= ~reg; | ||
| 165 | rdc321x_conf_write(RDC321X_GPIO_DATA_REG2, gpio_data_reg2); | ||
| 166 | spin_unlock_irqrestore(&gpio_lock, flags); | ||
| 167 | } | ||
| 168 | } | ||
| 169 | EXPORT_SYMBOL(rdc_gpio_set_value); | ||
| 170 | |||
| 171 | /* configure GPIO pin as input */ | ||
| 172 | int rdc_gpio_direction_input(unsigned gpio) | ||
| 173 | { | ||
| 174 | if (!rdc321x_is_gpio(gpio)) | ||
| 175 | return -EINVAL; | ||
| 176 | |||
| 177 | rdc321x_configure_gpio(gpio); | ||
| 178 | |||
| 179 | return 0; | ||
| 180 | } | ||
| 181 | EXPORT_SYMBOL(rdc_gpio_direction_input); | ||
| 182 | |||
| 183 | /* configure GPIO pin as output and set value */ | ||
| 184 | int rdc_gpio_direction_output(unsigned gpio, int value) | ||
| 185 | { | ||
| 186 | if (!rdc321x_is_gpio(gpio)) | ||
| 187 | return -EINVAL; | ||
| 188 | |||
| 189 | gpio_set_value(gpio, value); | ||
| 190 | rdc321x_configure_gpio(gpio); | ||
| 191 | |||
| 192 | return 0; | ||
| 193 | } | ||
| 194 | EXPORT_SYMBOL(rdc_gpio_direction_output); | ||
diff --git a/arch/x86/mach-rdc321x/platform.c b/arch/x86/mach-rdc321x/platform.c deleted file mode 100644 index 4f4e50c3ad3b..000000000000 --- a/arch/x86/mach-rdc321x/platform.c +++ /dev/null | |||
| @@ -1,69 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Generic RDC321x platform devices | ||
| 3 | * | ||
| 4 | * Copyright (C) 2007 Florian Fainelli <florian@openwrt.org> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License | ||
| 8 | * as published by the Free Software Foundation; either version 2 | ||
| 9 | * of the License, or (at your option) any later version. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; if not, write to the | ||
| 18 | * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||
| 19 | * Boston, MA 02110-1301, USA. | ||
| 20 | * | ||
| 21 | */ | ||
| 22 | |||
| 23 | #include <linux/init.h> | ||
| 24 | #include <linux/kernel.h> | ||
| 25 | #include <linux/list.h> | ||
| 26 | #include <linux/device.h> | ||
| 27 | #include <linux/platform_device.h> | ||
| 28 | #include <linux/leds.h> | ||
| 29 | |||
| 30 | #include <asm/gpio.h> | ||
| 31 | |||
| 32 | /* LEDS */ | ||
| 33 | static struct gpio_led default_leds[] = { | ||
| 34 | { .name = "rdc:dmz", .gpio = 1, }, | ||
| 35 | }; | ||
| 36 | |||
| 37 | static struct gpio_led_platform_data rdc321x_led_data = { | ||
| 38 | .num_leds = ARRAY_SIZE(default_leds), | ||
| 39 | .leds = default_leds, | ||
| 40 | }; | ||
| 41 | |||
| 42 | static struct platform_device rdc321x_leds = { | ||
| 43 | .name = "leds-gpio", | ||
| 44 | .id = -1, | ||
| 45 | .dev = { | ||
| 46 | .platform_data = &rdc321x_led_data, | ||
| 47 | } | ||
| 48 | }; | ||
| 49 | |||
| 50 | /* Watchdog */ | ||
| 51 | static struct platform_device rdc321x_wdt = { | ||
| 52 | .name = "rdc321x-wdt", | ||
| 53 | .id = -1, | ||
| 54 | .num_resources = 0, | ||
| 55 | }; | ||
| 56 | |||
| 57 | static struct platform_device *rdc321x_devs[] = { | ||
| 58 | &rdc321x_leds, | ||
| 59 | &rdc321x_wdt | ||
| 60 | }; | ||
| 61 | |||
| 62 | static int __init rdc_board_setup(void) | ||
| 63 | { | ||
| 64 | rdc321x_gpio_setup(); | ||
| 65 | |||
| 66 | return platform_add_devices(rdc321x_devs, ARRAY_SIZE(rdc321x_devs)); | ||
| 67 | } | ||
| 68 | |||
| 69 | arch_initcall(rdc_board_setup); | ||
diff --git a/arch/x86/mach-voyager/setup.c b/arch/x86/mach-voyager/setup.c index d914a7996a66..66b7eb57d8e4 100644 --- a/arch/x86/mach-voyager/setup.c +++ b/arch/x86/mach-voyager/setup.c | |||
| @@ -9,6 +9,7 @@ | |||
| 9 | #include <asm/e820.h> | 9 | #include <asm/e820.h> |
| 10 | #include <asm/io.h> | 10 | #include <asm/io.h> |
| 11 | #include <asm/setup.h> | 11 | #include <asm/setup.h> |
| 12 | #include <asm/cpu.h> | ||
| 12 | 13 | ||
| 13 | void __init pre_intr_init_hook(void) | 14 | void __init pre_intr_init_hook(void) |
| 14 | { | 15 | { |
diff --git a/arch/x86/mach-voyager/voyager_smp.c b/arch/x86/mach-voyager/voyager_smp.c index 7ffcdeec4631..98e3c2bc7563 100644 --- a/arch/x86/mach-voyager/voyager_smp.c +++ b/arch/x86/mach-voyager/voyager_smp.c | |||
| @@ -400,7 +400,7 @@ void __init find_smp_config(void) | |||
| 400 | VOYAGER_SUS_IN_CONTROL_PORT); | 400 | VOYAGER_SUS_IN_CONTROL_PORT); |
| 401 | 401 | ||
| 402 | current_thread_info()->cpu = boot_cpu_id; | 402 | current_thread_info()->cpu = boot_cpu_id; |
| 403 | x86_write_percpu(cpu_number, boot_cpu_id); | 403 | percpu_write(cpu_number, boot_cpu_id); |
| 404 | } | 404 | } |
| 405 | 405 | ||
| 406 | /* | 406 | /* |
| @@ -528,7 +528,6 @@ static void __init do_boot_cpu(__u8 cpu) | |||
| 528 | /* init_tasks (in sched.c) is indexed logically */ | 528 | /* init_tasks (in sched.c) is indexed logically */ |
| 529 | stack_start.sp = (void *)idle->thread.sp; | 529 | stack_start.sp = (void *)idle->thread.sp; |
| 530 | 530 | ||
| 531 | init_gdt(cpu); | ||
| 532 | per_cpu(current_task, cpu) = idle; | 531 | per_cpu(current_task, cpu) = idle; |
| 533 | early_gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu); | 532 | early_gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu); |
| 534 | irq_ctx_init(cpu); | 533 | irq_ctx_init(cpu); |
| @@ -1745,13 +1744,13 @@ static void __init voyager_smp_prepare_cpus(unsigned int max_cpus) | |||
| 1745 | 1744 | ||
| 1746 | static void __cpuinit voyager_smp_prepare_boot_cpu(void) | 1745 | static void __cpuinit voyager_smp_prepare_boot_cpu(void) |
| 1747 | { | 1746 | { |
| 1748 | init_gdt(smp_processor_id()); | 1747 | int cpu = smp_processor_id(); |
| 1749 | switch_to_new_gdt(); | 1748 | switch_to_new_gdt(cpu); |
| 1750 | 1749 | ||
| 1751 | cpu_online_map = cpumask_of_cpu(smp_processor_id()); | 1750 | cpu_set(cpu, cpu_online_map); |
| 1752 | cpu_callout_map = cpumask_of_cpu(smp_processor_id()); | 1751 | cpu_set(cpu, cpu_callout_map); |
| 1753 | cpu_callin_map = CPU_MASK_NONE; | 1752 | cpu_set(cpu, cpu_possible_map); |
| 1754 | cpu_present_map = cpumask_of_cpu(smp_processor_id()); | 1753 | cpu_set(cpu, cpu_present_map); |
| 1755 | 1754 | ||
| 1756 | } | 1755 | } |
| 1757 | 1756 | ||
| @@ -1779,7 +1778,6 @@ static void __init voyager_smp_cpus_done(unsigned int max_cpus) | |||
| 1779 | void __init smp_setup_processor_id(void) | 1778 | void __init smp_setup_processor_id(void) |
| 1780 | { | 1779 | { |
| 1781 | current_thread_info()->cpu = hard_smp_processor_id(); | 1780 | current_thread_info()->cpu = hard_smp_processor_id(); |
| 1782 | x86_write_percpu(cpu_number, hard_smp_processor_id()); | ||
| 1783 | } | 1781 | } |
| 1784 | 1782 | ||
| 1785 | static void voyager_send_call_func(const struct cpumask *callmask) | 1783 | static void voyager_send_call_func(const struct cpumask *callmask) |
diff --git a/arch/x86/math-emu/get_address.c b/arch/x86/math-emu/get_address.c index 420b3b6e3915..6ef5e99380f9 100644 --- a/arch/x86/math-emu/get_address.c +++ b/arch/x86/math-emu/get_address.c | |||
| @@ -150,11 +150,9 @@ static long pm_address(u_char FPU_modrm, u_char segment, | |||
| 150 | #endif /* PARANOID */ | 150 | #endif /* PARANOID */ |
| 151 | 151 | ||
| 152 | switch (segment) { | 152 | switch (segment) { |
| 153 | /* gs isn't used by the kernel, so it still has its | ||
| 154 | user-space value. */ | ||
| 155 | case PREFIX_GS_ - 1: | 153 | case PREFIX_GS_ - 1: |
| 156 | /* N.B. - movl %seg, mem is a 2 byte write regardless of prefix */ | 154 | /* user gs handling can be lazy, use special accessors */ |
| 157 | savesegment(gs, addr->selector); | 155 | addr->selector = get_user_gs(FPU_info->regs); |
| 158 | break; | 156 | break; |
| 159 | default: | 157 | default: |
| 160 | addr->selector = PM_REG_(segment); | 158 | addr->selector = PM_REG_(segment); |
diff --git a/arch/x86/mm/Makefile b/arch/x86/mm/Makefile index d8cc96a2738f..2b938a384910 100644 --- a/arch/x86/mm/Makefile +++ b/arch/x86/mm/Makefile | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | obj-y := init_$(BITS).o fault.o ioremap.o extable.o pageattr.o mmap.o \ | 1 | obj-y := init_$(BITS).o fault.o ioremap.o extable.o pageattr.o mmap.o \ |
| 2 | pat.o pgtable.o gup.o | 2 | pat.o pgtable.o gup.o |
| 3 | 3 | ||
| 4 | obj-$(CONFIG_SMP) += tlb.o | ||
| 5 | |||
| 4 | obj-$(CONFIG_X86_32) += pgtable_32.o iomap_32.o | 6 | obj-$(CONFIG_X86_32) += pgtable_32.o iomap_32.o |
| 5 | 7 | ||
| 6 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o | 8 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o |
diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c index 7e8db53528a7..61b41ca3b5a2 100644 --- a/arch/x86/mm/extable.c +++ b/arch/x86/mm/extable.c | |||
| @@ -23,6 +23,12 @@ int fixup_exception(struct pt_regs *regs) | |||
| 23 | 23 | ||
| 24 | fixup = search_exception_tables(regs->ip); | 24 | fixup = search_exception_tables(regs->ip); |
| 25 | if (fixup) { | 25 | if (fixup) { |
| 26 | /* If fixup is less than 16, it means uaccess error */ | ||
| 27 | if (fixup->fixup < 16) { | ||
| 28 | current_thread_info()->uaccess_err = -EFAULT; | ||
| 29 | regs->ip += fixup->fixup; | ||
| 30 | return 1; | ||
| 31 | } | ||
| 26 | regs->ip = fixup->fixup; | 32 | regs->ip = fixup->fixup; |
| 27 | return 1; | 33 | return 1; |
| 28 | } | 34 | } |
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 278d645d108a..e4b9fc5001c6 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/kprobes.h> | 26 | #include <linux/kprobes.h> |
| 27 | #include <linux/uaccess.h> | 27 | #include <linux/uaccess.h> |
| 28 | #include <linux/kdebug.h> | 28 | #include <linux/kdebug.h> |
| 29 | #include <linux/magic.h> | ||
| 29 | 30 | ||
| 30 | #include <asm/system.h> | 31 | #include <asm/system.h> |
| 31 | #include <asm/desc.h> | 32 | #include <asm/desc.h> |
| @@ -91,8 +92,8 @@ static inline int notify_page_fault(struct pt_regs *regs) | |||
| 91 | * | 92 | * |
| 92 | * Opcode checker based on code by Richard Brunner | 93 | * Opcode checker based on code by Richard Brunner |
| 93 | */ | 94 | */ |
| 94 | static int is_prefetch(struct pt_regs *regs, unsigned long addr, | 95 | static int is_prefetch(struct pt_regs *regs, unsigned long error_code, |
| 95 | unsigned long error_code) | 96 | unsigned long addr) |
| 96 | { | 97 | { |
| 97 | unsigned char *instr; | 98 | unsigned char *instr; |
| 98 | int scan_more = 1; | 99 | int scan_more = 1; |
| @@ -409,17 +410,16 @@ static void show_fault_oops(struct pt_regs *regs, unsigned long error_code, | |||
| 409 | } | 410 | } |
| 410 | 411 | ||
| 411 | #ifdef CONFIG_X86_64 | 412 | #ifdef CONFIG_X86_64 |
| 412 | static noinline void pgtable_bad(unsigned long address, struct pt_regs *regs, | 413 | static noinline void pgtable_bad(struct pt_regs *regs, |
| 413 | unsigned long error_code) | 414 | unsigned long error_code, unsigned long address) |
| 414 | { | 415 | { |
| 415 | unsigned long flags = oops_begin(); | 416 | unsigned long flags = oops_begin(); |
| 416 | int sig = SIGKILL; | 417 | int sig = SIGKILL; |
| 417 | struct task_struct *tsk; | 418 | struct task_struct *tsk = current; |
| 418 | 419 | ||
| 419 | printk(KERN_ALERT "%s: Corrupted page table at address %lx\n", | 420 | printk(KERN_ALERT "%s: Corrupted page table at address %lx\n", |
| 420 | current->comm, address); | 421 | tsk->comm, address); |
| 421 | dump_pagetable(address); | 422 | dump_pagetable(address); |
| 422 | tsk = current; | ||
| 423 | tsk->thread.cr2 = address; | 423 | tsk->thread.cr2 = address; |
| 424 | tsk->thread.trap_no = 14; | 424 | tsk->thread.trap_no = 14; |
| 425 | tsk->thread.error_code = error_code; | 425 | tsk->thread.error_code = error_code; |
| @@ -429,6 +429,196 @@ static noinline void pgtable_bad(unsigned long address, struct pt_regs *regs, | |||
| 429 | } | 429 | } |
| 430 | #endif | 430 | #endif |
| 431 | 431 | ||
| 432 | static noinline void no_context(struct pt_regs *regs, | ||
| 433 | unsigned long error_code, unsigned long address) | ||
| 434 | { | ||
| 435 | struct task_struct *tsk = current; | ||
| 436 | unsigned long *stackend; | ||
| 437 | |||
| 438 | #ifdef CONFIG_X86_64 | ||
| 439 | unsigned long flags; | ||
| 440 | int sig; | ||
| 441 | #endif | ||
| 442 | |||
| 443 | /* Are we prepared to handle this kernel fault? */ | ||
| 444 | if (fixup_exception(regs)) | ||
| 445 | return; | ||
| 446 | |||
| 447 | /* | ||
| 448 | * X86_32 | ||
| 449 | * Valid to do another page fault here, because if this fault | ||
| 450 | * had been triggered by is_prefetch fixup_exception would have | ||
| 451 | * handled it. | ||
| 452 | * | ||
| 453 | * X86_64 | ||
| 454 | * Hall of shame of CPU/BIOS bugs. | ||
| 455 | */ | ||
| 456 | if (is_prefetch(regs, error_code, address)) | ||
| 457 | return; | ||
| 458 | |||
| 459 | if (is_errata93(regs, address)) | ||
| 460 | return; | ||
| 461 | |||
| 462 | /* | ||
| 463 | * Oops. The kernel tried to access some bad page. We'll have to | ||
| 464 | * terminate things with extreme prejudice. | ||
| 465 | */ | ||
| 466 | #ifdef CONFIG_X86_32 | ||
| 467 | bust_spinlocks(1); | ||
| 468 | #else | ||
| 469 | flags = oops_begin(); | ||
| 470 | #endif | ||
| 471 | |||
| 472 | show_fault_oops(regs, error_code, address); | ||
| 473 | |||
| 474 | stackend = end_of_stack(tsk); | ||
| 475 | if (*stackend != STACK_END_MAGIC) | ||
| 476 | printk(KERN_ALERT "Thread overran stack, or stack corrupted\n"); | ||
| 477 | |||
| 478 | tsk->thread.cr2 = address; | ||
| 479 | tsk->thread.trap_no = 14; | ||
| 480 | tsk->thread.error_code = error_code; | ||
| 481 | |||
| 482 | #ifdef CONFIG_X86_32 | ||
| 483 | die("Oops", regs, error_code); | ||
| 484 | bust_spinlocks(0); | ||
| 485 | do_exit(SIGKILL); | ||
| 486 | #else | ||
| 487 | sig = SIGKILL; | ||
| 488 | if (__die("Oops", regs, error_code)) | ||
| 489 | sig = 0; | ||
| 490 | /* Executive summary in case the body of the oops scrolled away */ | ||
| 491 | printk(KERN_EMERG "CR2: %016lx\n", address); | ||
| 492 | oops_end(flags, regs, sig); | ||
| 493 | #endif | ||
| 494 | } | ||
| 495 | |||
| 496 | static void __bad_area_nosemaphore(struct pt_regs *regs, | ||
| 497 | unsigned long error_code, unsigned long address, | ||
| 498 | int si_code) | ||
| 499 | { | ||
| 500 | struct task_struct *tsk = current; | ||
| 501 | |||
| 502 | /* User mode accesses just cause a SIGSEGV */ | ||
| 503 | if (error_code & PF_USER) { | ||
| 504 | /* | ||
| 505 | * It's possible to have interrupts off here. | ||
| 506 | */ | ||
| 507 | local_irq_enable(); | ||
| 508 | |||
| 509 | /* | ||
| 510 | * Valid to do another page fault here because this one came | ||
| 511 | * from user space. | ||
| 512 | */ | ||
| 513 | if (is_prefetch(regs, error_code, address)) | ||
| 514 | return; | ||
| 515 | |||
| 516 | if (is_errata100(regs, address)) | ||
| 517 | return; | ||
| 518 | |||
| 519 | if (show_unhandled_signals && unhandled_signal(tsk, SIGSEGV) && | ||
| 520 | printk_ratelimit()) { | ||
| 521 | printk( | ||
| 522 | "%s%s[%d]: segfault at %lx ip %p sp %p error %lx", | ||
| 523 | task_pid_nr(tsk) > 1 ? KERN_INFO : KERN_EMERG, | ||
| 524 | tsk->comm, task_pid_nr(tsk), address, | ||
| 525 | (void *) regs->ip, (void *) regs->sp, error_code); | ||
| 526 | print_vma_addr(" in ", regs->ip); | ||
| 527 | printk("\n"); | ||
| 528 | } | ||
| 529 | |||
| 530 | tsk->thread.cr2 = address; | ||
| 531 | /* Kernel addresses are always protection faults */ | ||
| 532 | tsk->thread.error_code = error_code | (address >= TASK_SIZE); | ||
| 533 | tsk->thread.trap_no = 14; | ||
| 534 | force_sig_info_fault(SIGSEGV, si_code, address, tsk); | ||
| 535 | return; | ||
| 536 | } | ||
| 537 | |||
| 538 | if (is_f00f_bug(regs, address)) | ||
| 539 | return; | ||
| 540 | |||
| 541 | no_context(regs, error_code, address); | ||
| 542 | } | ||
| 543 | |||
| 544 | static noinline void bad_area_nosemaphore(struct pt_regs *regs, | ||
| 545 | unsigned long error_code, unsigned long address) | ||
| 546 | { | ||
| 547 | __bad_area_nosemaphore(regs, error_code, address, SEGV_MAPERR); | ||
| 548 | } | ||
| 549 | |||
| 550 | static void __bad_area(struct pt_regs *regs, | ||
| 551 | unsigned long error_code, unsigned long address, | ||
| 552 | int si_code) | ||
| 553 | { | ||
| 554 | struct mm_struct *mm = current->mm; | ||
| 555 | |||
| 556 | /* | ||
| 557 | * Something tried to access memory that isn't in our memory map.. | ||
| 558 | * Fix it, but check if it's kernel or user first.. | ||
| 559 | */ | ||
| 560 | up_read(&mm->mmap_sem); | ||
| 561 | |||
| 562 | __bad_area_nosemaphore(regs, error_code, address, si_code); | ||
| 563 | } | ||
| 564 | |||
| 565 | static noinline void bad_area(struct pt_regs *regs, | ||
| 566 | unsigned long error_code, unsigned long address) | ||
| 567 | { | ||
| 568 | __bad_area(regs, error_code, address, SEGV_MAPERR); | ||
| 569 | } | ||
| 570 | |||
| 571 | static noinline void bad_area_access_error(struct pt_regs *regs, | ||
| 572 | unsigned long error_code, unsigned long address) | ||
| 573 | { | ||
| 574 | __bad_area(regs, error_code, address, SEGV_ACCERR); | ||
| 575 | } | ||
| 576 | |||
| 577 | /* TODO: fixup for "mm-invoke-oom-killer-from-page-fault.patch" */ | ||
| 578 | static void out_of_memory(struct pt_regs *regs, | ||
| 579 | unsigned long error_code, unsigned long address) | ||
| 580 | { | ||
| 581 | /* | ||
| 582 | * We ran out of memory, call the OOM killer, and return the userspace | ||
| 583 | * (which will retry the fault, or kill us if we got oom-killed). | ||
| 584 | */ | ||
| 585 | up_read(¤t->mm->mmap_sem); | ||
| 586 | pagefault_out_of_memory(); | ||
| 587 | } | ||
| 588 | |||
| 589 | static void do_sigbus(struct pt_regs *regs, | ||
| 590 | unsigned long error_code, unsigned long address) | ||
| 591 | { | ||
| 592 | struct task_struct *tsk = current; | ||
| 593 | struct mm_struct *mm = tsk->mm; | ||
| 594 | |||
| 595 | up_read(&mm->mmap_sem); | ||
| 596 | |||
| 597 | /* Kernel mode? Handle exceptions or die */ | ||
| 598 | if (!(error_code & PF_USER)) | ||
| 599 | no_context(regs, error_code, address); | ||
| 600 | #ifdef CONFIG_X86_32 | ||
| 601 | /* User space => ok to do another page fault */ | ||
| 602 | if (is_prefetch(regs, error_code, address)) | ||
| 603 | return; | ||
| 604 | #endif | ||
| 605 | tsk->thread.cr2 = address; | ||
| 606 | tsk->thread.error_code = error_code; | ||
| 607 | tsk->thread.trap_no = 14; | ||
| 608 | force_sig_info_fault(SIGBUS, BUS_ADRERR, address, tsk); | ||
| 609 | } | ||
| 610 | |||
| 611 | static noinline void mm_fault_error(struct pt_regs *regs, | ||
| 612 | unsigned long error_code, unsigned long address, unsigned int fault) | ||
| 613 | { | ||
| 614 | if (fault & VM_FAULT_OOM) | ||
| 615 | out_of_memory(regs, error_code, address); | ||
| 616 | else if (fault & VM_FAULT_SIGBUS) | ||
| 617 | do_sigbus(regs, error_code, address); | ||
| 618 | else | ||
| 619 | BUG(); | ||
| 620 | } | ||
| 621 | |||
| 432 | static int spurious_fault_check(unsigned long error_code, pte_t *pte) | 622 | static int spurious_fault_check(unsigned long error_code, pte_t *pte) |
| 433 | { | 623 | { |
| 434 | if ((error_code & PF_WRITE) && !pte_write(*pte)) | 624 | if ((error_code & PF_WRITE) && !pte_write(*pte)) |
| @@ -448,8 +638,8 @@ static int spurious_fault_check(unsigned long error_code, pte_t *pte) | |||
| 448 | * There are no security implications to leaving a stale TLB when | 638 | * There are no security implications to leaving a stale TLB when |
| 449 | * increasing the permissions on a page. | 639 | * increasing the permissions on a page. |
| 450 | */ | 640 | */ |
| 451 | static int spurious_fault(unsigned long address, | 641 | static noinline int spurious_fault(unsigned long error_code, |
| 452 | unsigned long error_code) | 642 | unsigned long address) |
| 453 | { | 643 | { |
| 454 | pgd_t *pgd; | 644 | pgd_t *pgd; |
| 455 | pud_t *pud; | 645 | pud_t *pud; |
| @@ -505,7 +695,7 @@ static int spurious_fault(unsigned long address, | |||
| 505 | * | 695 | * |
| 506 | * This assumes no large pages in there. | 696 | * This assumes no large pages in there. |
| 507 | */ | 697 | */ |
| 508 | static int vmalloc_fault(unsigned long address) | 698 | static noinline int vmalloc_fault(unsigned long address) |
| 509 | { | 699 | { |
| 510 | #ifdef CONFIG_X86_32 | 700 | #ifdef CONFIG_X86_32 |
| 511 | unsigned long pgd_paddr; | 701 | unsigned long pgd_paddr; |
| @@ -584,6 +774,34 @@ static int vmalloc_fault(unsigned long address) | |||
| 584 | 774 | ||
| 585 | int show_unhandled_signals = 1; | 775 | int show_unhandled_signals = 1; |
| 586 | 776 | ||
| 777 | static inline int access_error(unsigned long error_code, int write, | ||
| 778 | struct vm_area_struct *vma) | ||
| 779 | { | ||
| 780 | if (write) { | ||
| 781 | /* write, present and write, not present */ | ||
| 782 | if (unlikely(!(vma->vm_flags & VM_WRITE))) | ||
| 783 | return 1; | ||
| 784 | } else if (unlikely(error_code & PF_PROT)) { | ||
| 785 | /* read, present */ | ||
| 786 | return 1; | ||
| 787 | } else { | ||
| 788 | /* read, not present */ | ||
| 789 | if (unlikely(!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE)))) | ||
| 790 | return 1; | ||
| 791 | } | ||
| 792 | |||
| 793 | return 0; | ||
| 794 | } | ||
| 795 | |||
| 796 | static int fault_in_kernel_space(unsigned long address) | ||
| 797 | { | ||
| 798 | #ifdef CONFIG_X86_32 | ||
| 799 | return address >= TASK_SIZE; | ||
| 800 | #else /* !CONFIG_X86_32 */ | ||
| 801 | return address >= TASK_SIZE64; | ||
| 802 | #endif /* CONFIG_X86_32 */ | ||
| 803 | } | ||
| 804 | |||
| 587 | /* | 805 | /* |
| 588 | * This routine handles page faults. It determines the address, | 806 | * This routine handles page faults. It determines the address, |
| 589 | * and the problem, and then passes it off to one of the appropriate | 807 | * and the problem, and then passes it off to one of the appropriate |
| @@ -594,16 +812,12 @@ asmlinkage | |||
| 594 | #endif | 812 | #endif |
| 595 | void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code) | 813 | void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code) |
| 596 | { | 814 | { |
| 815 | unsigned long address; | ||
| 597 | struct task_struct *tsk; | 816 | struct task_struct *tsk; |
| 598 | struct mm_struct *mm; | 817 | struct mm_struct *mm; |
| 599 | struct vm_area_struct *vma; | 818 | struct vm_area_struct *vma; |
| 600 | unsigned long address; | 819 | int write; |
| 601 | int write, si_code; | ||
| 602 | int fault; | 820 | int fault; |
| 603 | #ifdef CONFIG_X86_64 | ||
| 604 | unsigned long flags; | ||
| 605 | int sig; | ||
| 606 | #endif | ||
| 607 | 821 | ||
| 608 | tsk = current; | 822 | tsk = current; |
| 609 | mm = tsk->mm; | 823 | mm = tsk->mm; |
| @@ -612,8 +826,6 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code) | |||
| 612 | /* get the address */ | 826 | /* get the address */ |
| 613 | address = read_cr2(); | 827 | address = read_cr2(); |
| 614 | 828 | ||
| 615 | si_code = SEGV_MAPERR; | ||
| 616 | |||
| 617 | if (unlikely(kmmio_fault(regs, address))) | 829 | if (unlikely(kmmio_fault(regs, address))) |
| 618 | return; | 830 | return; |
| 619 | 831 | ||
| @@ -630,17 +842,13 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code) | |||
| 630 | * (error_code & 4) == 0, and that the fault was not a | 842 | * (error_code & 4) == 0, and that the fault was not a |
| 631 | * protection error (error_code & 9) == 0. | 843 | * protection error (error_code & 9) == 0. |
| 632 | */ | 844 | */ |
| 633 | #ifdef CONFIG_X86_32 | 845 | if (unlikely(fault_in_kernel_space(address))) { |
| 634 | if (unlikely(address >= TASK_SIZE)) { | ||
| 635 | #else | ||
| 636 | if (unlikely(address >= TASK_SIZE64)) { | ||
| 637 | #endif | ||
| 638 | if (!(error_code & (PF_RSVD|PF_USER|PF_PROT)) && | 846 | if (!(error_code & (PF_RSVD|PF_USER|PF_PROT)) && |
| 639 | vmalloc_fault(address) >= 0) | 847 | vmalloc_fault(address) >= 0) |
| 640 | return; | 848 | return; |
| 641 | 849 | ||
| 642 | /* Can handle a stale RO->RW TLB */ | 850 | /* Can handle a stale RO->RW TLB */ |
| 643 | if (spurious_fault(address, error_code)) | 851 | if (spurious_fault(error_code, address)) |
| 644 | return; | 852 | return; |
| 645 | 853 | ||
| 646 | /* kprobes don't want to hook the spurious faults. */ | 854 | /* kprobes don't want to hook the spurious faults. */ |
| @@ -650,13 +858,13 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code) | |||
| 650 | * Don't take the mm semaphore here. If we fixup a prefetch | 858 | * Don't take the mm semaphore here. If we fixup a prefetch |
| 651 | * fault we could otherwise deadlock. | 859 | * fault we could otherwise deadlock. |
| 652 | */ | 860 | */ |
| 653 | goto bad_area_nosemaphore; | 861 | bad_area_nosemaphore(regs, error_code, address); |
| 862 | return; | ||
| 654 | } | 863 | } |
| 655 | 864 | ||
| 656 | /* kprobes don't want to hook the spurious faults. */ | 865 | /* kprobes don't want to hook the spurious faults. */ |
| 657 | if (notify_page_fault(regs)) | 866 | if (unlikely(notify_page_fault(regs))) |
| 658 | return; | 867 | return; |
| 659 | |||
| 660 | /* | 868 | /* |
| 661 | * It's safe to allow irq's after cr2 has been saved and the | 869 | * It's safe to allow irq's after cr2 has been saved and the |
| 662 | * vmalloc fault has been handled. | 870 | * vmalloc fault has been handled. |
| @@ -672,15 +880,17 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code) | |||
| 672 | 880 | ||
| 673 | #ifdef CONFIG_X86_64 | 881 | #ifdef CONFIG_X86_64 |
| 674 | if (unlikely(error_code & PF_RSVD)) | 882 | if (unlikely(error_code & PF_RSVD)) |
| 675 | pgtable_bad(address, regs, error_code); | 883 | pgtable_bad(regs, error_code, address); |
| 676 | #endif | 884 | #endif |
| 677 | 885 | ||
| 678 | /* | 886 | /* |
| 679 | * If we're in an interrupt, have no user context or are running in an | 887 | * If we're in an interrupt, have no user context or are running in an |
| 680 | * atomic region then we must not take the fault. | 888 | * atomic region then we must not take the fault. |
| 681 | */ | 889 | */ |
| 682 | if (unlikely(in_atomic() || !mm)) | 890 | if (unlikely(in_atomic() || !mm)) { |
| 683 | goto bad_area_nosemaphore; | 891 | bad_area_nosemaphore(regs, error_code, address); |
| 892 | return; | ||
| 893 | } | ||
| 684 | 894 | ||
| 685 | /* | 895 | /* |
| 686 | * When running in the kernel we expect faults to occur only to | 896 | * When running in the kernel we expect faults to occur only to |
| @@ -698,20 +908,32 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code) | |||
| 698 | * source. If this is invalid we can skip the address space check, | 908 | * source. If this is invalid we can skip the address space check, |
| 699 | * thus avoiding the deadlock. | 909 | * thus avoiding the deadlock. |
| 700 | */ | 910 | */ |
| 701 | if (!down_read_trylock(&mm->mmap_sem)) { | 911 | if (unlikely(!down_read_trylock(&mm->mmap_sem))) { |
| 702 | if ((error_code & PF_USER) == 0 && | 912 | if ((error_code & PF_USER) == 0 && |
| 703 | !search_exception_tables(regs->ip)) | 913 | !search_exception_tables(regs->ip)) { |
| 704 | goto bad_area_nosemaphore; | 914 | bad_area_nosemaphore(regs, error_code, address); |
| 915 | return; | ||
| 916 | } | ||
| 705 | down_read(&mm->mmap_sem); | 917 | down_read(&mm->mmap_sem); |
| 918 | } else { | ||
| 919 | /* | ||
| 920 | * The above down_read_trylock() might have succeeded in which | ||
| 921 | * case we'll have missed the might_sleep() from down_read(). | ||
| 922 | */ | ||
| 923 | might_sleep(); | ||
| 706 | } | 924 | } |
| 707 | 925 | ||
| 708 | vma = find_vma(mm, address); | 926 | vma = find_vma(mm, address); |
| 709 | if (!vma) | 927 | if (unlikely(!vma)) { |
| 710 | goto bad_area; | 928 | bad_area(regs, error_code, address); |
| 711 | if (vma->vm_start <= address) | 929 | return; |
| 930 | } | ||
| 931 | if (likely(vma->vm_start <= address)) | ||
| 712 | goto good_area; | 932 | goto good_area; |
| 713 | if (!(vma->vm_flags & VM_GROWSDOWN)) | 933 | if (unlikely(!(vma->vm_flags & VM_GROWSDOWN))) { |
| 714 | goto bad_area; | 934 | bad_area(regs, error_code, address); |
| 935 | return; | ||
| 936 | } | ||
| 715 | if (error_code & PF_USER) { | 937 | if (error_code & PF_USER) { |
| 716 | /* | 938 | /* |
| 717 | * Accessing the stack below %sp is always a bug. | 939 | * Accessing the stack below %sp is always a bug. |
| @@ -719,31 +941,25 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code) | |||
| 719 | * and pusha to work. ("enter $65535,$31" pushes | 941 | * and pusha to work. ("enter $65535,$31" pushes |
| 720 | * 32 pointers and then decrements %sp by 65535.) | 942 | * 32 pointers and then decrements %sp by 65535.) |
| 721 | */ | 943 | */ |
| 722 | if (address + 65536 + 32 * sizeof(unsigned long) < regs->sp) | 944 | if (unlikely(address + 65536 + 32 * sizeof(unsigned long) < regs->sp)) { |
| 723 | goto bad_area; | 945 | bad_area(regs, error_code, address); |
| 946 | return; | ||
| 947 | } | ||
| 724 | } | 948 | } |
| 725 | if (expand_stack(vma, address)) | 949 | if (unlikely(expand_stack(vma, address))) { |
| 726 | goto bad_area; | 950 | bad_area(regs, error_code, address); |
| 727 | /* | 951 | return; |
| 728 | * Ok, we have a good vm_area for this memory access, so | 952 | } |
| 729 | * we can handle it.. | 953 | |
| 730 | */ | 954 | /* |
| 955 | * Ok, we have a good vm_area for this memory access, so | ||
| 956 | * we can handle it.. | ||
| 957 | */ | ||
| 731 | good_area: | 958 | good_area: |
| 732 | si_code = SEGV_ACCERR; | 959 | write = error_code & PF_WRITE; |
| 733 | write = 0; | 960 | if (unlikely(access_error(error_code, write, vma))) { |
| 734 | switch (error_code & (PF_PROT|PF_WRITE)) { | 961 | bad_area_access_error(regs, error_code, address); |
| 735 | default: /* 3: write, present */ | 962 | return; |
| 736 | /* fall through */ | ||
| 737 | case PF_WRITE: /* write, not present */ | ||
| 738 | if (!(vma->vm_flags & VM_WRITE)) | ||
| 739 | goto bad_area; | ||
| 740 | write++; | ||
| 741 | break; | ||
| 742 | case PF_PROT: /* read, present */ | ||
| 743 | goto bad_area; | ||
| 744 | case 0: /* read, not present */ | ||
| 745 | if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE))) | ||
| 746 | goto bad_area; | ||
| 747 | } | 963 | } |
| 748 | 964 | ||
| 749 | /* | 965 | /* |
| @@ -753,11 +969,8 @@ good_area: | |||
| 753 | */ | 969 | */ |
| 754 | fault = handle_mm_fault(mm, vma, address, write); | 970 | fault = handle_mm_fault(mm, vma, address, write); |
| 755 | if (unlikely(fault & VM_FAULT_ERROR)) { | 971 | if (unlikely(fault & VM_FAULT_ERROR)) { |
| 756 | if (fault & VM_FAULT_OOM) | 972 | mm_fault_error(regs, error_code, address, fault); |
| 757 | goto out_of_memory; | 973 | return; |
| 758 | else if (fault & VM_FAULT_SIGBUS) | ||
| 759 | goto do_sigbus; | ||
| 760 | BUG(); | ||
| 761 | } | 974 | } |
| 762 | if (fault & VM_FAULT_MAJOR) | 975 | if (fault & VM_FAULT_MAJOR) |
| 763 | tsk->maj_flt++; | 976 | tsk->maj_flt++; |
| @@ -775,128 +988,6 @@ good_area: | |||
| 775 | } | 988 | } |
| 776 | #endif | 989 | #endif |
| 777 | up_read(&mm->mmap_sem); | 990 | up_read(&mm->mmap_sem); |
| 778 | return; | ||
| 779 | |||
| 780 | /* | ||
| 781 | * Something tried to access memory that isn't in our memory map.. | ||
| 782 | * Fix it, but check if it's kernel or user first.. | ||
| 783 | */ | ||
| 784 | bad_area: | ||
| 785 | up_read(&mm->mmap_sem); | ||
| 786 | |||
| 787 | bad_area_nosemaphore: | ||
| 788 | /* User mode accesses just cause a SIGSEGV */ | ||
| 789 | if (error_code & PF_USER) { | ||
| 790 | /* | ||
| 791 | * It's possible to have interrupts off here. | ||
| 792 | */ | ||
| 793 | local_irq_enable(); | ||
| 794 | |||
| 795 | /* | ||
| 796 | * Valid to do another page fault here because this one came | ||
| 797 | * from user space. | ||
| 798 | */ | ||
| 799 | if (is_prefetch(regs, address, error_code)) | ||
| 800 | return; | ||
| 801 | |||
| 802 | if (is_errata100(regs, address)) | ||
| 803 | return; | ||
| 804 | |||
| 805 | if (show_unhandled_signals && unhandled_signal(tsk, SIGSEGV) && | ||
| 806 | printk_ratelimit()) { | ||
| 807 | printk( | ||
| 808 | "%s%s[%d]: segfault at %lx ip %p sp %p error %lx", | ||
| 809 | task_pid_nr(tsk) > 1 ? KERN_INFO : KERN_EMERG, | ||
| 810 | tsk->comm, task_pid_nr(tsk), address, | ||
| 811 | (void *) regs->ip, (void *) regs->sp, error_code); | ||
| 812 | print_vma_addr(" in ", regs->ip); | ||
| 813 | printk("\n"); | ||
| 814 | } | ||
| 815 | |||
| 816 | tsk->thread.cr2 = address; | ||
| 817 | /* Kernel addresses are always protection faults */ | ||
| 818 | tsk->thread.error_code = error_code | (address >= TASK_SIZE); | ||
| 819 | tsk->thread.trap_no = 14; | ||
| 820 | force_sig_info_fault(SIGSEGV, si_code, address, tsk); | ||
| 821 | return; | ||
| 822 | } | ||
| 823 | |||
| 824 | if (is_f00f_bug(regs, address)) | ||
| 825 | return; | ||
| 826 | |||
| 827 | no_context: | ||
| 828 | /* Are we prepared to handle this kernel fault? */ | ||
| 829 | if (fixup_exception(regs)) | ||
| 830 | return; | ||
| 831 | |||
| 832 | /* | ||
| 833 | * X86_32 | ||
| 834 | * Valid to do another page fault here, because if this fault | ||
| 835 | * had been triggered by is_prefetch fixup_exception would have | ||
| 836 | * handled it. | ||
| 837 | * | ||
| 838 | * X86_64 | ||
| 839 | * Hall of shame of CPU/BIOS bugs. | ||
| 840 | */ | ||
| 841 | if (is_prefetch(regs, address, error_code)) | ||
| 842 | return; | ||
| 843 | |||
| 844 | if (is_errata93(regs, address)) | ||
| 845 | return; | ||
| 846 | |||
| 847 | /* | ||
| 848 | * Oops. The kernel tried to access some bad page. We'll have to | ||
| 849 | * terminate things with extreme prejudice. | ||
| 850 | */ | ||
| 851 | #ifdef CONFIG_X86_32 | ||
| 852 | bust_spinlocks(1); | ||
| 853 | #else | ||
| 854 | flags = oops_begin(); | ||
| 855 | #endif | ||
| 856 | |||
| 857 | show_fault_oops(regs, error_code, address); | ||
| 858 | |||
| 859 | tsk->thread.cr2 = address; | ||
| 860 | tsk->thread.trap_no = 14; | ||
| 861 | tsk->thread.error_code = error_code; | ||
| 862 | |||
| 863 | #ifdef CONFIG_X86_32 | ||
| 864 | die("Oops", regs, error_code); | ||
| 865 | bust_spinlocks(0); | ||
| 866 | do_exit(SIGKILL); | ||
| 867 | #else | ||
| 868 | sig = SIGKILL; | ||
| 869 | if (__die("Oops", regs, error_code)) | ||
| 870 | sig = 0; | ||
| 871 | /* Executive summary in case the body of the oops scrolled away */ | ||
| 872 | printk(KERN_EMERG "CR2: %016lx\n", address); | ||
| 873 | oops_end(flags, regs, sig); | ||
| 874 | #endif | ||
| 875 | |||
| 876 | out_of_memory: | ||
| 877 | /* | ||
| 878 | * We ran out of memory, call the OOM killer, and return the userspace | ||
| 879 | * (which will retry the fault, or kill us if we got oom-killed). | ||
| 880 | */ | ||
| 881 | up_read(&mm->mmap_sem); | ||
| 882 | pagefault_out_of_memory(); | ||
| 883 | return; | ||
| 884 | |||
| 885 | do_sigbus: | ||
| 886 | up_read(&mm->mmap_sem); | ||
| 887 | |||
| 888 | /* Kernel mode? Handle exceptions or die */ | ||
| 889 | if (!(error_code & PF_USER)) | ||
| 890 | goto no_context; | ||
| 891 | #ifdef CONFIG_X86_32 | ||
| 892 | /* User space => ok to do another page fault */ | ||
| 893 | if (is_prefetch(regs, address, error_code)) | ||
| 894 | return; | ||
| 895 | #endif | ||
| 896 | tsk->thread.cr2 = address; | ||
| 897 | tsk->thread.error_code = error_code; | ||
| 898 | tsk->thread.trap_no = 14; | ||
| 899 | force_sig_info_fault(SIGBUS, BUS_ADRERR, address, tsk); | ||
| 900 | } | 991 | } |
| 901 | 992 | ||
| 902 | DEFINE_SPINLOCK(pgd_lock); | 993 | DEFINE_SPINLOCK(pgd_lock); |
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 2cef05074413..06708ee94aa4 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
| @@ -49,7 +49,6 @@ | |||
| 49 | #include <asm/paravirt.h> | 49 | #include <asm/paravirt.h> |
| 50 | #include <asm/setup.h> | 50 | #include <asm/setup.h> |
| 51 | #include <asm/cacheflush.h> | 51 | #include <asm/cacheflush.h> |
| 52 | #include <asm/smp.h> | ||
| 53 | 52 | ||
| 54 | unsigned int __VMALLOC_RESERVE = 128 << 20; | 53 | unsigned int __VMALLOC_RESERVE = 128 << 20; |
| 55 | 54 | ||
| @@ -675,75 +674,97 @@ static int __init parse_highmem(char *arg) | |||
| 675 | } | 674 | } |
| 676 | early_param("highmem", parse_highmem); | 675 | early_param("highmem", parse_highmem); |
| 677 | 676 | ||
| 677 | #define MSG_HIGHMEM_TOO_BIG \ | ||
| 678 | "highmem size (%luMB) is bigger than pages available (%luMB)!\n" | ||
| 679 | |||
| 680 | #define MSG_LOWMEM_TOO_SMALL \ | ||
| 681 | "highmem size (%luMB) results in <64MB lowmem, ignoring it!\n" | ||
| 678 | /* | 682 | /* |
| 679 | * Determine low and high memory ranges: | 683 | * All of RAM fits into lowmem - but if user wants highmem |
| 684 | * artificially via the highmem=x boot parameter then create | ||
| 685 | * it: | ||
| 680 | */ | 686 | */ |
| 681 | void __init find_low_pfn_range(void) | 687 | void __init lowmem_pfn_init(void) |
| 682 | { | 688 | { |
| 683 | /* it could update max_pfn */ | ||
| 684 | |||
| 685 | /* max_low_pfn is 0, we already have early_res support */ | 689 | /* max_low_pfn is 0, we already have early_res support */ |
| 686 | |||
| 687 | max_low_pfn = max_pfn; | 690 | max_low_pfn = max_pfn; |
| 688 | if (max_low_pfn > MAXMEM_PFN) { | 691 | |
| 689 | if (highmem_pages == -1) | 692 | if (highmem_pages == -1) |
| 690 | highmem_pages = max_pfn - MAXMEM_PFN; | 693 | highmem_pages = 0; |
| 691 | if (highmem_pages + MAXMEM_PFN < max_pfn) | 694 | #ifdef CONFIG_HIGHMEM |
| 692 | max_pfn = MAXMEM_PFN + highmem_pages; | 695 | if (highmem_pages >= max_pfn) { |
| 693 | if (highmem_pages + MAXMEM_PFN > max_pfn) { | 696 | printk(KERN_ERR MSG_HIGHMEM_TOO_BIG, |
| 694 | printk(KERN_WARNING "only %luMB highmem pages " | 697 | pages_to_mb(highmem_pages), pages_to_mb(max_pfn)); |
| 695 | "available, ignoring highmem size of %uMB.\n", | 698 | highmem_pages = 0; |
| 696 | pages_to_mb(max_pfn - MAXMEM_PFN), | 699 | } |
| 700 | if (highmem_pages) { | ||
| 701 | if (max_low_pfn - highmem_pages < 64*1024*1024/PAGE_SIZE) { | ||
| 702 | printk(KERN_ERR MSG_LOWMEM_TOO_SMALL, | ||
| 697 | pages_to_mb(highmem_pages)); | 703 | pages_to_mb(highmem_pages)); |
| 698 | highmem_pages = 0; | 704 | highmem_pages = 0; |
| 699 | } | 705 | } |
| 700 | max_low_pfn = MAXMEM_PFN; | 706 | max_low_pfn -= highmem_pages; |
| 707 | } | ||
| 708 | #else | ||
| 709 | if (highmem_pages) | ||
| 710 | printk(KERN_ERR "ignoring highmem size on non-highmem kernel!\n"); | ||
| 711 | #endif | ||
| 712 | } | ||
| 713 | |||
| 714 | #define MSG_HIGHMEM_TOO_SMALL \ | ||
| 715 | "only %luMB highmem pages available, ignoring highmem size of %luMB!\n" | ||
| 716 | |||
| 717 | #define MSG_HIGHMEM_TRIMMED \ | ||
| 718 | "Warning: only 4GB will be used. Use a HIGHMEM64G enabled kernel!\n" | ||
| 719 | /* | ||
| 720 | * We have more RAM than fits into lowmem - we try to put it into | ||
| 721 | * highmem, also taking the highmem=x boot parameter into account: | ||
| 722 | */ | ||
| 723 | void __init highmem_pfn_init(void) | ||
| 724 | { | ||
| 725 | max_low_pfn = MAXMEM_PFN; | ||
| 726 | |||
| 727 | if (highmem_pages == -1) | ||
| 728 | highmem_pages = max_pfn - MAXMEM_PFN; | ||
| 729 | |||
| 730 | if (highmem_pages + MAXMEM_PFN < max_pfn) | ||
| 731 | max_pfn = MAXMEM_PFN + highmem_pages; | ||
| 732 | |||
| 733 | if (highmem_pages + MAXMEM_PFN > max_pfn) { | ||
| 734 | printk(KERN_WARNING MSG_HIGHMEM_TOO_SMALL, | ||
| 735 | pages_to_mb(max_pfn - MAXMEM_PFN), | ||
| 736 | pages_to_mb(highmem_pages)); | ||
| 737 | highmem_pages = 0; | ||
| 738 | } | ||
| 701 | #ifndef CONFIG_HIGHMEM | 739 | #ifndef CONFIG_HIGHMEM |
| 702 | /* Maximum memory usable is what is directly addressable */ | 740 | /* Maximum memory usable is what is directly addressable */ |
| 703 | printk(KERN_WARNING "Warning only %ldMB will be used.\n", | 741 | printk(KERN_WARNING "Warning only %ldMB will be used.\n", MAXMEM>>20); |
| 704 | MAXMEM>>20); | 742 | if (max_pfn > MAX_NONPAE_PFN) |
| 705 | if (max_pfn > MAX_NONPAE_PFN) | 743 | printk(KERN_WARNING "Use a HIGHMEM64G enabled kernel.\n"); |
| 706 | printk(KERN_WARNING | 744 | else |
| 707 | "Use a HIGHMEM64G enabled kernel.\n"); | 745 | printk(KERN_WARNING "Use a HIGHMEM enabled kernel.\n"); |
| 708 | else | 746 | max_pfn = MAXMEM_PFN; |
| 709 | printk(KERN_WARNING "Use a HIGHMEM enabled kernel.\n"); | ||
| 710 | max_pfn = MAXMEM_PFN; | ||
| 711 | #else /* !CONFIG_HIGHMEM */ | 747 | #else /* !CONFIG_HIGHMEM */ |
| 712 | #ifndef CONFIG_HIGHMEM64G | 748 | #ifndef CONFIG_HIGHMEM64G |
| 713 | if (max_pfn > MAX_NONPAE_PFN) { | 749 | if (max_pfn > MAX_NONPAE_PFN) { |
| 714 | max_pfn = MAX_NONPAE_PFN; | 750 | max_pfn = MAX_NONPAE_PFN; |
| 715 | printk(KERN_WARNING "Warning only 4GB will be used." | 751 | printk(KERN_WARNING MSG_HIGHMEM_TRIMMED); |
| 716 | "Use a HIGHMEM64G enabled kernel.\n"); | 752 | } |
| 717 | } | ||
| 718 | #endif /* !CONFIG_HIGHMEM64G */ | 753 | #endif /* !CONFIG_HIGHMEM64G */ |
| 719 | #endif /* !CONFIG_HIGHMEM */ | 754 | #endif /* !CONFIG_HIGHMEM */ |
| 720 | } else { | 755 | } |
| 721 | if (highmem_pages == -1) | 756 | |
| 722 | highmem_pages = 0; | 757 | /* |
| 723 | #ifdef CONFIG_HIGHMEM | 758 | * Determine low and high memory ranges: |
| 724 | if (highmem_pages >= max_pfn) { | 759 | */ |
| 725 | printk(KERN_ERR "highmem size specified (%uMB) is " | 760 | void __init find_low_pfn_range(void) |
| 726 | "bigger than pages available (%luMB)!.\n", | 761 | { |
| 727 | pages_to_mb(highmem_pages), | 762 | /* it could update max_pfn */ |
| 728 | pages_to_mb(max_pfn)); | 763 | |
| 729 | highmem_pages = 0; | 764 | if (max_pfn <= MAXMEM_PFN) |
| 730 | } | 765 | lowmem_pfn_init(); |
| 731 | if (highmem_pages) { | 766 | else |
| 732 | if (max_low_pfn - highmem_pages < | 767 | highmem_pfn_init(); |
| 733 | 64*1024*1024/PAGE_SIZE){ | ||
| 734 | printk(KERN_ERR "highmem size %uMB results in " | ||
| 735 | "smaller than 64MB lowmem, ignoring it.\n" | ||
| 736 | , pages_to_mb(highmem_pages)); | ||
| 737 | highmem_pages = 0; | ||
| 738 | } | ||
| 739 | max_low_pfn -= highmem_pages; | ||
| 740 | } | ||
| 741 | #else | ||
| 742 | if (highmem_pages) | ||
| 743 | printk(KERN_ERR "ignoring highmem size on non-highmem" | ||
| 744 | " kernel!\n"); | ||
| 745 | #endif | ||
| 746 | } | ||
| 747 | } | 768 | } |
| 748 | 769 | ||
| 749 | #ifndef CONFIG_NEED_MULTIPLE_NODES | 770 | #ifndef CONFIG_NEED_MULTIPLE_NODES |
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index f45d5e29a72e..433f7bd4648a 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c | |||
| @@ -348,7 +348,7 @@ EXPORT_SYMBOL(ioremap_nocache); | |||
| 348 | * | 348 | * |
| 349 | * Must be freed with iounmap. | 349 | * Must be freed with iounmap. |
| 350 | */ | 350 | */ |
| 351 | void __iomem *ioremap_wc(unsigned long phys_addr, unsigned long size) | 351 | void __iomem *ioremap_wc(resource_size_t phys_addr, unsigned long size) |
| 352 | { | 352 | { |
| 353 | if (pat_enabled) | 353 | if (pat_enabled) |
| 354 | return __ioremap_caller(phys_addr, size, _PAGE_CACHE_WC, | 354 | return __ioremap_caller(phys_addr, size, _PAGE_CACHE_WC, |
diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c index 56fe7124fbec..165829600566 100644 --- a/arch/x86/mm/mmap.c +++ b/arch/x86/mm/mmap.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | * Based on code by Ingo Molnar and Andi Kleen, copyrighted | 4 | * Based on code by Ingo Molnar and Andi Kleen, copyrighted |
| 5 | * as follows: | 5 | * as follows: |
| 6 | * | 6 | * |
| 7 | * Copyright 2003-2004 Red Hat Inc., Durham, North Carolina. | 7 | * Copyright 2003-2009 Red Hat Inc. |
| 8 | * All Rights Reserved. | 8 | * All Rights Reserved. |
| 9 | * Copyright 2005 Andi Kleen, SUSE Labs. | 9 | * Copyright 2005 Andi Kleen, SUSE Labs. |
| 10 | * Copyright 2007 Jiri Kosina, SUSE Labs. | 10 | * Copyright 2007 Jiri Kosina, SUSE Labs. |
diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c index f3516da035d1..64c9cf043cdd 100644 --- a/arch/x86/mm/numa_64.c +++ b/arch/x86/mm/numa_64.c | |||
| @@ -20,6 +20,12 @@ | |||
| 20 | #include <asm/acpi.h> | 20 | #include <asm/acpi.h> |
| 21 | #include <asm/k8.h> | 21 | #include <asm/k8.h> |
| 22 | 22 | ||
| 23 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS | ||
| 24 | # define DBG(x...) printk(KERN_DEBUG x) | ||
| 25 | #else | ||
| 26 | # define DBG(x...) | ||
| 27 | #endif | ||
| 28 | |||
| 23 | struct pglist_data *node_data[MAX_NUMNODES] __read_mostly; | 29 | struct pglist_data *node_data[MAX_NUMNODES] __read_mostly; |
| 24 | EXPORT_SYMBOL(node_data); | 30 | EXPORT_SYMBOL(node_data); |
| 25 | 31 | ||
| @@ -33,6 +39,21 @@ int numa_off __initdata; | |||
| 33 | static unsigned long __initdata nodemap_addr; | 39 | static unsigned long __initdata nodemap_addr; |
| 34 | static unsigned long __initdata nodemap_size; | 40 | static unsigned long __initdata nodemap_size; |
| 35 | 41 | ||
| 42 | DEFINE_PER_CPU(int, node_number) = 0; | ||
| 43 | EXPORT_PER_CPU_SYMBOL(node_number); | ||
| 44 | |||
| 45 | /* | ||
| 46 | * Map cpu index to node index | ||
| 47 | */ | ||
| 48 | DEFINE_EARLY_PER_CPU(int, x86_cpu_to_node_map, NUMA_NO_NODE); | ||
| 49 | EXPORT_EARLY_PER_CPU_SYMBOL(x86_cpu_to_node_map); | ||
| 50 | |||
| 51 | /* | ||
| 52 | * Which logical CPUs are on which nodes | ||
| 53 | */ | ||
| 54 | cpumask_t *node_to_cpumask_map; | ||
| 55 | EXPORT_SYMBOL(node_to_cpumask_map); | ||
| 56 | |||
| 36 | /* | 57 | /* |
| 37 | * Given a shift value, try to populate memnodemap[] | 58 | * Given a shift value, try to populate memnodemap[] |
| 38 | * Returns : | 59 | * Returns : |
| @@ -640,3 +661,199 @@ void __init init_cpu_to_node(void) | |||
| 640 | #endif | 661 | #endif |
| 641 | 662 | ||
| 642 | 663 | ||
| 664 | /* | ||
| 665 | * Allocate node_to_cpumask_map based on number of available nodes | ||
| 666 | * Requires node_possible_map to be valid. | ||
| 667 | * | ||
| 668 | * Note: node_to_cpumask() is not valid until after this is done. | ||
| 669 | * (Use CONFIG_DEBUG_PER_CPU_MAPS to check this.) | ||
| 670 | */ | ||
| 671 | void __init setup_node_to_cpumask_map(void) | ||
| 672 | { | ||
| 673 | unsigned int node, num = 0; | ||
| 674 | cpumask_t *map; | ||
| 675 | |||
| 676 | /* setup nr_node_ids if not done yet */ | ||
| 677 | if (nr_node_ids == MAX_NUMNODES) { | ||
| 678 | for_each_node_mask(node, node_possible_map) | ||
| 679 | num = node; | ||
| 680 | nr_node_ids = num + 1; | ||
| 681 | } | ||
| 682 | |||
| 683 | /* allocate the map */ | ||
| 684 | map = alloc_bootmem_low(nr_node_ids * sizeof(cpumask_t)); | ||
| 685 | DBG("node_to_cpumask_map at %p for %d nodes\n", map, nr_node_ids); | ||
| 686 | |||
| 687 | pr_debug("Node to cpumask map at %p for %d nodes\n", | ||
| 688 | map, nr_node_ids); | ||
| 689 | |||
| 690 | /* node_to_cpumask() will now work */ | ||
| 691 | node_to_cpumask_map = map; | ||
| 692 | } | ||
| 693 | |||
| 694 | void __cpuinit numa_set_node(int cpu, int node) | ||
| 695 | { | ||
| 696 | int *cpu_to_node_map = early_per_cpu_ptr(x86_cpu_to_node_map); | ||
| 697 | |||
| 698 | /* early setting, no percpu area yet */ | ||
| 699 | if (cpu_to_node_map) { | ||
| 700 | cpu_to_node_map[cpu] = node; | ||
| 701 | return; | ||
| 702 | } | ||
| 703 | |||
| 704 | #ifdef CONFIG_DEBUG_PER_CPU_MAPS | ||
| 705 | if (cpu >= nr_cpu_ids || !cpu_possible(cpu)) { | ||
| 706 | printk(KERN_ERR "numa_set_node: invalid cpu# (%d)\n", cpu); | ||
| 707 | dump_stack(); | ||
| 708 | return; | ||
| 709 | } | ||
| 710 | #endif | ||
| 711 | per_cpu(x86_cpu_to_node_map, cpu) = node; | ||
| 712 | |||
| 713 | if (node != NUMA_NO_NODE) | ||
| 714 | per_cpu(node_number, cpu) = node; | ||
| 715 | } | ||
| 716 | |||
| 717 | void __cpuinit numa_clear_node(int cpu) | ||
| 718 | { | ||
| 719 | numa_set_node(cpu, NUMA_NO_NODE); | ||
| 720 | } | ||
| 721 | |||
| 722 | #ifndef CONFIG_DEBUG_PER_CPU_MAPS | ||
| 723 | |||
| 724 | void __cpuinit numa_add_cpu(int cpu) | ||
| 725 | { | ||
| 726 | cpu_set(cpu, node_to_cpumask_map[early_cpu_to_node(cpu)]); | ||
| 727 | } | ||
| 728 | |||
| 729 | void __cpuinit numa_remove_cpu(int cpu) | ||
| 730 | { | ||
| 731 | cpu_clear(cpu, node_to_cpumask_map[early_cpu_to_node(cpu)]); | ||
| 732 | } | ||
| 733 | |||
| 734 | #else /* CONFIG_DEBUG_PER_CPU_MAPS */ | ||
| 735 | |||
| 736 | /* | ||
| 737 | * --------- debug versions of the numa functions --------- | ||
| 738 | */ | ||
| 739 | static void __cpuinit numa_set_cpumask(int cpu, int enable) | ||
| 740 | { | ||
| 741 | int node = early_cpu_to_node(cpu); | ||
| 742 | cpumask_t *mask; | ||
| 743 | char buf[64]; | ||
| 744 | |||
| 745 | if (node_to_cpumask_map == NULL) { | ||
| 746 | printk(KERN_ERR "node_to_cpumask_map NULL\n"); | ||
| 747 | dump_stack(); | ||
| 748 | return; | ||
| 749 | } | ||
| 750 | |||
| 751 | mask = &node_to_cpumask_map[node]; | ||
| 752 | if (enable) | ||
| 753 | cpu_set(cpu, *mask); | ||
| 754 | else | ||
| 755 | cpu_clear(cpu, *mask); | ||
| 756 | |||
| 757 | cpulist_scnprintf(buf, sizeof(buf), mask); | ||
| 758 | printk(KERN_DEBUG "%s cpu %d node %d: mask now %s\n", | ||
| 759 | enable ? "numa_add_cpu" : "numa_remove_cpu", cpu, node, buf); | ||
| 760 | } | ||
| 761 | |||
| 762 | void __cpuinit numa_add_cpu(int cpu) | ||
| 763 | { | ||
| 764 | numa_set_cpumask(cpu, 1); | ||
| 765 | } | ||
| 766 | |||
| 767 | void __cpuinit numa_remove_cpu(int cpu) | ||
| 768 | { | ||
| 769 | numa_set_cpumask(cpu, 0); | ||
| 770 | } | ||
| 771 | |||
| 772 | int cpu_to_node(int cpu) | ||
| 773 | { | ||
| 774 | if (early_per_cpu_ptr(x86_cpu_to_node_map)) { | ||
| 775 | printk(KERN_WARNING | ||
| 776 | "cpu_to_node(%d): usage too early!\n", cpu); | ||
| 777 | dump_stack(); | ||
| 778 | return early_per_cpu_ptr(x86_cpu_to_node_map)[cpu]; | ||
| 779 | } | ||
| 780 | return per_cpu(x86_cpu_to_node_map, cpu); | ||
| 781 | } | ||
| 782 | EXPORT_SYMBOL(cpu_to_node); | ||
| 783 | |||
| 784 | /* | ||
| 785 | * Same function as cpu_to_node() but used if called before the | ||
| 786 | * per_cpu areas are setup. | ||
| 787 | */ | ||
| 788 | int early_cpu_to_node(int cpu) | ||
| 789 | { | ||
| 790 | if (early_per_cpu_ptr(x86_cpu_to_node_map)) | ||
| 791 | return early_per_cpu_ptr(x86_cpu_to_node_map)[cpu]; | ||
| 792 | |||
| 793 | if (!cpu_possible(cpu)) { | ||
| 794 | printk(KERN_WARNING | ||
| 795 | "early_cpu_to_node(%d): no per_cpu area!\n", cpu); | ||
| 796 | dump_stack(); | ||
| 797 | return NUMA_NO_NODE; | ||
| 798 | } | ||
| 799 | return per_cpu(x86_cpu_to_node_map, cpu); | ||
| 800 | } | ||
| 801 | |||
| 802 | |||
| 803 | /* empty cpumask */ | ||
| 804 | static const cpumask_t cpu_mask_none; | ||
| 805 | |||
| 806 | /* | ||
| 807 | * Returns a pointer to the bitmask of CPUs on Node 'node'. | ||
| 808 | */ | ||
| 809 | const cpumask_t *cpumask_of_node(int node) | ||
| 810 | { | ||
| 811 | if (node_to_cpumask_map == NULL) { | ||
| 812 | printk(KERN_WARNING | ||
| 813 | "cpumask_of_node(%d): no node_to_cpumask_map!\n", | ||
| 814 | node); | ||
| 815 | dump_stack(); | ||
| 816 | return (const cpumask_t *)&cpu_online_map; | ||
| 817 | } | ||
| 818 | if (node >= nr_node_ids) { | ||
| 819 | printk(KERN_WARNING | ||
| 820 | "cpumask_of_node(%d): node > nr_node_ids(%d)\n", | ||
| 821 | node, nr_node_ids); | ||
| 822 | dump_stack(); | ||
| 823 | return &cpu_mask_none; | ||
| 824 | } | ||
| 825 | return &node_to_cpumask_map[node]; | ||
| 826 | } | ||
| 827 | EXPORT_SYMBOL(cpumask_of_node); | ||
| 828 | |||
| 829 | /* | ||
| 830 | * Returns a bitmask of CPUs on Node 'node'. | ||
| 831 | * | ||
| 832 | * Side note: this function creates the returned cpumask on the stack | ||
| 833 | * so with a high NR_CPUS count, excessive stack space is used. The | ||
| 834 | * node_to_cpumask_ptr function should be used whenever possible. | ||
| 835 | */ | ||
| 836 | cpumask_t node_to_cpumask(int node) | ||
| 837 | { | ||
| 838 | if (node_to_cpumask_map == NULL) { | ||
| 839 | printk(KERN_WARNING | ||
| 840 | "node_to_cpumask(%d): no node_to_cpumask_map!\n", node); | ||
| 841 | dump_stack(); | ||
| 842 | return cpu_online_map; | ||
| 843 | } | ||
| 844 | if (node >= nr_node_ids) { | ||
| 845 | printk(KERN_WARNING | ||
| 846 | "node_to_cpumask(%d): node > nr_node_ids(%d)\n", | ||
| 847 | node, nr_node_ids); | ||
| 848 | dump_stack(); | ||
| 849 | return cpu_mask_none; | ||
| 850 | } | ||
| 851 | return node_to_cpumask_map[node]; | ||
| 852 | } | ||
| 853 | EXPORT_SYMBOL(node_to_cpumask); | ||
| 854 | |||
| 855 | /* | ||
| 856 | * --------- end of debug versions of the numa functions --------- | ||
| 857 | */ | ||
| 858 | |||
| 859 | #endif /* CONFIG_DEBUG_PER_CPU_MAPS */ | ||
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 7be47d1a97e4..8253bc97587e 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
| @@ -482,6 +482,13 @@ static int split_large_page(pte_t *kpte, unsigned long address) | |||
| 482 | pbase = (pte_t *)page_address(base); | 482 | pbase = (pte_t *)page_address(base); |
| 483 | paravirt_alloc_pte(&init_mm, page_to_pfn(base)); | 483 | paravirt_alloc_pte(&init_mm, page_to_pfn(base)); |
| 484 | ref_prot = pte_pgprot(pte_clrhuge(*kpte)); | 484 | ref_prot = pte_pgprot(pte_clrhuge(*kpte)); |
| 485 | /* | ||
| 486 | * If we ever want to utilize the PAT bit, we need to | ||
| 487 | * update this function to make sure it's converted from | ||
| 488 | * bit 12 to bit 7 when we cross from the 2MB level to | ||
| 489 | * the 4K level: | ||
| 490 | */ | ||
| 491 | WARN_ON_ONCE(pgprot_val(ref_prot) & _PAGE_PAT_LARGE); | ||
| 485 | 492 | ||
| 486 | #ifdef CONFIG_X86_64 | 493 | #ifdef CONFIG_X86_64 |
| 487 | if (level == PG_LEVEL_1G) { | 494 | if (level == PG_LEVEL_1G) { |
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index aebbf67a79d0..05f9aef6818a 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
| @@ -30,7 +30,7 @@ | |||
| 30 | #ifdef CONFIG_X86_PAT | 30 | #ifdef CONFIG_X86_PAT |
| 31 | int __read_mostly pat_enabled = 1; | 31 | int __read_mostly pat_enabled = 1; |
| 32 | 32 | ||
| 33 | void __cpuinit pat_disable(char *reason) | 33 | void __cpuinit pat_disable(const char *reason) |
| 34 | { | 34 | { |
| 35 | pat_enabled = 0; | 35 | pat_enabled = 0; |
| 36 | printk(KERN_INFO "%s\n", reason); | 36 | printk(KERN_INFO "%s\n", reason); |
| @@ -42,6 +42,11 @@ static int __init nopat(char *str) | |||
| 42 | return 0; | 42 | return 0; |
| 43 | } | 43 | } |
| 44 | early_param("nopat", nopat); | 44 | early_param("nopat", nopat); |
| 45 | #else | ||
| 46 | static inline void pat_disable(const char *reason) | ||
| 47 | { | ||
| 48 | (void)reason; | ||
| 49 | } | ||
| 45 | #endif | 50 | #endif |
| 46 | 51 | ||
| 47 | 52 | ||
| @@ -78,16 +83,20 @@ void pat_init(void) | |||
| 78 | if (!pat_enabled) | 83 | if (!pat_enabled) |
| 79 | return; | 84 | return; |
| 80 | 85 | ||
| 81 | /* Paranoia check. */ | 86 | if (!cpu_has_pat) { |
| 82 | if (!cpu_has_pat && boot_pat_state) { | 87 | if (!boot_pat_state) { |
| 83 | /* | 88 | pat_disable("PAT not supported by CPU."); |
| 84 | * If this happens we are on a secondary CPU, but | 89 | return; |
| 85 | * switched to PAT on the boot CPU. We have no way to | 90 | } else { |
| 86 | * undo PAT. | 91 | /* |
| 87 | */ | 92 | * If this happens we are on a secondary CPU, but |
| 88 | printk(KERN_ERR "PAT enabled, " | 93 | * switched to PAT on the boot CPU. We have no way to |
| 89 | "but not supported by secondary CPU\n"); | 94 | * undo PAT. |
| 90 | BUG(); | 95 | */ |
| 96 | printk(KERN_ERR "PAT enabled, " | ||
| 97 | "but not supported by secondary CPU\n"); | ||
| 98 | BUG(); | ||
| 99 | } | ||
| 91 | } | 100 | } |
| 92 | 101 | ||
| 93 | /* Set PWT to Write-Combining. All other bits stay the same */ | 102 | /* Set PWT to Write-Combining. All other bits stay the same */ |
diff --git a/arch/x86/mm/srat_64.c b/arch/x86/mm/srat_64.c index 09737c8af074..574c8bc95ef0 100644 --- a/arch/x86/mm/srat_64.c +++ b/arch/x86/mm/srat_64.c | |||
| @@ -20,7 +20,8 @@ | |||
| 20 | #include <asm/proto.h> | 20 | #include <asm/proto.h> |
| 21 | #include <asm/numa.h> | 21 | #include <asm/numa.h> |
| 22 | #include <asm/e820.h> | 22 | #include <asm/e820.h> |
| 23 | #include <asm/genapic.h> | 23 | #include <asm/apic.h> |
| 24 | #include <asm/uv/uv.h> | ||
| 24 | 25 | ||
| 25 | int acpi_numa __initdata; | 26 | int acpi_numa __initdata; |
| 26 | 27 | ||
diff --git a/arch/x86/kernel/tlb_64.c b/arch/x86/mm/tlb.c index f8be6f1d2e48..a654d59e4483 100644 --- a/arch/x86/kernel/tlb_64.c +++ b/arch/x86/mm/tlb.c | |||
| @@ -1,24 +1,19 @@ | |||
| 1 | #include <linux/init.h> | 1 | #include <linux/init.h> |
| 2 | 2 | ||
| 3 | #include <linux/mm.h> | 3 | #include <linux/mm.h> |
| 4 | #include <linux/delay.h> | ||
| 5 | #include <linux/spinlock.h> | 4 | #include <linux/spinlock.h> |
| 6 | #include <linux/smp.h> | 5 | #include <linux/smp.h> |
| 7 | #include <linux/kernel_stat.h> | ||
| 8 | #include <linux/mc146818rtc.h> | ||
| 9 | #include <linux/interrupt.h> | 6 | #include <linux/interrupt.h> |
| 7 | #include <linux/module.h> | ||
| 10 | 8 | ||
| 11 | #include <asm/mtrr.h> | ||
| 12 | #include <asm/pgalloc.h> | ||
| 13 | #include <asm/tlbflush.h> | 9 | #include <asm/tlbflush.h> |
| 14 | #include <asm/mmu_context.h> | 10 | #include <asm/mmu_context.h> |
| 15 | #include <asm/proto.h> | 11 | #include <asm/apic.h> |
| 16 | #include <asm/apicdef.h> | 12 | #include <asm/uv/uv.h> |
| 17 | #include <asm/idle.h> | 13 | |
| 18 | #include <asm/uv/uv_hub.h> | 14 | DEFINE_PER_CPU_SHARED_ALIGNED(struct tlb_state, cpu_tlbstate) |
| 19 | #include <asm/uv/uv_bau.h> | 15 | = { &init_mm, 0, }; |
| 20 | 16 | ||
| 21 | #include <mach_ipi.h> | ||
| 22 | /* | 17 | /* |
| 23 | * Smarter SMP flushing macros. | 18 | * Smarter SMP flushing macros. |
| 24 | * c/o Linus Torvalds. | 19 | * c/o Linus Torvalds. |
| @@ -33,7 +28,7 @@ | |||
| 33 | * To avoid global state use 8 different call vectors. | 28 | * To avoid global state use 8 different call vectors. |
| 34 | * Each CPU uses a specific vector to trigger flushes on other | 29 | * Each CPU uses a specific vector to trigger flushes on other |
| 35 | * CPUs. Depending on the received vector the target CPUs look into | 30 | * CPUs. Depending on the received vector the target CPUs look into |
| 36 | * the right per cpu variable for the flush data. | 31 | * the right array slot for the flush data. |
| 37 | * | 32 | * |
| 38 | * With more than 8 CPUs they are hashed to the 8 available | 33 | * With more than 8 CPUs they are hashed to the 8 available |
| 39 | * vectors. The limited global vector space forces us to this right now. | 34 | * vectors. The limited global vector space forces us to this right now. |
| @@ -43,18 +38,18 @@ | |||
| 43 | 38 | ||
| 44 | union smp_flush_state { | 39 | union smp_flush_state { |
| 45 | struct { | 40 | struct { |
| 46 | cpumask_t flush_cpumask; | ||
| 47 | struct mm_struct *flush_mm; | 41 | struct mm_struct *flush_mm; |
| 48 | unsigned long flush_va; | 42 | unsigned long flush_va; |
| 49 | spinlock_t tlbstate_lock; | 43 | spinlock_t tlbstate_lock; |
| 44 | DECLARE_BITMAP(flush_cpumask, NR_CPUS); | ||
| 50 | }; | 45 | }; |
| 51 | char pad[SMP_CACHE_BYTES]; | 46 | char pad[CONFIG_X86_INTERNODE_CACHE_BYTES]; |
| 52 | } ____cacheline_aligned; | 47 | } ____cacheline_internodealigned_in_smp; |
| 53 | 48 | ||
| 54 | /* State is put into the per CPU data section, but padded | 49 | /* State is put into the per CPU data section, but padded |
| 55 | to a full cache line because other CPUs can access it and we don't | 50 | to a full cache line because other CPUs can access it and we don't |
| 56 | want false sharing in the per cpu data segment. */ | 51 | want false sharing in the per cpu data segment. */ |
| 57 | static DEFINE_PER_CPU(union smp_flush_state, flush_state); | 52 | static union smp_flush_state flush_state[NUM_INVALIDATE_TLB_VECTORS]; |
| 58 | 53 | ||
| 59 | /* | 54 | /* |
| 60 | * We cannot call mmdrop() because we are in interrupt context, | 55 | * We cannot call mmdrop() because we are in interrupt context, |
| @@ -62,9 +57,9 @@ static DEFINE_PER_CPU(union smp_flush_state, flush_state); | |||
| 62 | */ | 57 | */ |
| 63 | void leave_mm(int cpu) | 58 | void leave_mm(int cpu) |
| 64 | { | 59 | { |
| 65 | if (read_pda(mmu_state) == TLBSTATE_OK) | 60 | if (percpu_read(cpu_tlbstate.state) == TLBSTATE_OK) |
| 66 | BUG(); | 61 | BUG(); |
| 67 | cpu_clear(cpu, read_pda(active_mm)->cpu_vm_mask); | 62 | cpu_clear(cpu, percpu_read(cpu_tlbstate.active_mm)->cpu_vm_mask); |
| 68 | load_cr3(swapper_pg_dir); | 63 | load_cr3(swapper_pg_dir); |
| 69 | } | 64 | } |
| 70 | EXPORT_SYMBOL_GPL(leave_mm); | 65 | EXPORT_SYMBOL_GPL(leave_mm); |
| @@ -117,10 +112,20 @@ EXPORT_SYMBOL_GPL(leave_mm); | |||
| 117 | * Interrupts are disabled. | 112 | * Interrupts are disabled. |
| 118 | */ | 113 | */ |
| 119 | 114 | ||
| 120 | asmlinkage void smp_invalidate_interrupt(struct pt_regs *regs) | 115 | /* |
| 116 | * FIXME: use of asmlinkage is not consistent. On x86_64 it's noop | ||
| 117 | * but still used for documentation purpose but the usage is slightly | ||
| 118 | * inconsistent. On x86_32, asmlinkage is regparm(0) but interrupt | ||
| 119 | * entry calls in with the first parameter in %eax. Maybe define | ||
| 120 | * intrlinkage? | ||
| 121 | */ | ||
| 122 | #ifdef CONFIG_X86_64 | ||
| 123 | asmlinkage | ||
| 124 | #endif | ||
| 125 | void smp_invalidate_interrupt(struct pt_regs *regs) | ||
| 121 | { | 126 | { |
| 122 | int cpu; | 127 | unsigned int cpu; |
| 123 | int sender; | 128 | unsigned int sender; |
| 124 | union smp_flush_state *f; | 129 | union smp_flush_state *f; |
| 125 | 130 | ||
| 126 | cpu = smp_processor_id(); | 131 | cpu = smp_processor_id(); |
| @@ -129,9 +134,9 @@ asmlinkage void smp_invalidate_interrupt(struct pt_regs *regs) | |||
| 129 | * Use that to determine where the sender put the data. | 134 | * Use that to determine where the sender put the data. |
| 130 | */ | 135 | */ |
| 131 | sender = ~regs->orig_ax - INVALIDATE_TLB_VECTOR_START; | 136 | sender = ~regs->orig_ax - INVALIDATE_TLB_VECTOR_START; |
| 132 | f = &per_cpu(flush_state, sender); | 137 | f = &flush_state[sender]; |
| 133 | 138 | ||
| 134 | if (!cpu_isset(cpu, f->flush_cpumask)) | 139 | if (!cpumask_test_cpu(cpu, to_cpumask(f->flush_cpumask))) |
| 135 | goto out; | 140 | goto out; |
| 136 | /* | 141 | /* |
| 137 | * This was a BUG() but until someone can quote me the | 142 | * This was a BUG() but until someone can quote me the |
| @@ -142,8 +147,8 @@ asmlinkage void smp_invalidate_interrupt(struct pt_regs *regs) | |||
| 142 | * BUG(); | 147 | * BUG(); |
| 143 | */ | 148 | */ |
| 144 | 149 | ||
| 145 | if (f->flush_mm == read_pda(active_mm)) { | 150 | if (f->flush_mm == percpu_read(cpu_tlbstate.active_mm)) { |
| 146 | if (read_pda(mmu_state) == TLBSTATE_OK) { | 151 | if (percpu_read(cpu_tlbstate.state) == TLBSTATE_OK) { |
| 147 | if (f->flush_va == TLB_FLUSH_ALL) | 152 | if (f->flush_va == TLB_FLUSH_ALL) |
| 148 | local_flush_tlb(); | 153 | local_flush_tlb(); |
| 149 | else | 154 | else |
| @@ -153,23 +158,21 @@ asmlinkage void smp_invalidate_interrupt(struct pt_regs *regs) | |||
| 153 | } | 158 | } |
| 154 | out: | 159 | out: |
| 155 | ack_APIC_irq(); | 160 | ack_APIC_irq(); |
| 156 | cpu_clear(cpu, f->flush_cpumask); | 161 | smp_mb__before_clear_bit(); |
| 162 | cpumask_clear_cpu(cpu, to_cpumask(f->flush_cpumask)); | ||
| 163 | smp_mb__after_clear_bit(); | ||
| 157 | inc_irq_stat(irq_tlb_count); | 164 | inc_irq_stat(irq_tlb_count); |
| 158 | } | 165 | } |
| 159 | 166 | ||
| 160 | void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm, | 167 | static void flush_tlb_others_ipi(const struct cpumask *cpumask, |
| 161 | unsigned long va) | 168 | struct mm_struct *mm, unsigned long va) |
| 162 | { | 169 | { |
| 163 | int sender; | 170 | unsigned int sender; |
| 164 | union smp_flush_state *f; | 171 | union smp_flush_state *f; |
| 165 | cpumask_t cpumask = *cpumaskp; | ||
| 166 | |||
| 167 | if (is_uv_system() && uv_flush_tlb_others(&cpumask, mm, va)) | ||
| 168 | return; | ||
| 169 | 172 | ||
| 170 | /* Caller has disabled preemption */ | 173 | /* Caller has disabled preemption */ |
| 171 | sender = smp_processor_id() % NUM_INVALIDATE_TLB_VECTORS; | 174 | sender = smp_processor_id() % NUM_INVALIDATE_TLB_VECTORS; |
| 172 | f = &per_cpu(flush_state, sender); | 175 | f = &flush_state[sender]; |
| 173 | 176 | ||
| 174 | /* | 177 | /* |
| 175 | * Could avoid this lock when | 178 | * Could avoid this lock when |
| @@ -180,7 +183,8 @@ void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm, | |||
| 180 | 183 | ||
| 181 | f->flush_mm = mm; | 184 | f->flush_mm = mm; |
| 182 | f->flush_va = va; | 185 | f->flush_va = va; |
| 183 | cpus_or(f->flush_cpumask, cpumask, f->flush_cpumask); | 186 | cpumask_andnot(to_cpumask(f->flush_cpumask), |
| 187 | cpumask, cpumask_of(smp_processor_id())); | ||
| 184 | 188 | ||
| 185 | /* | 189 | /* |
| 186 | * Make the above memory operations globally visible before | 190 | * Make the above memory operations globally visible before |
| @@ -191,9 +195,10 @@ void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm, | |||
| 191 | * We have to send the IPI only to | 195 | * We have to send the IPI only to |
| 192 | * CPUs affected. | 196 | * CPUs affected. |
| 193 | */ | 197 | */ |
| 194 | send_IPI_mask(&cpumask, INVALIDATE_TLB_VECTOR_START + sender); | 198 | apic->send_IPI_mask(to_cpumask(f->flush_cpumask), |
| 199 | INVALIDATE_TLB_VECTOR_START + sender); | ||
| 195 | 200 | ||
| 196 | while (!cpus_empty(f->flush_cpumask)) | 201 | while (!cpumask_empty(to_cpumask(f->flush_cpumask))) |
| 197 | cpu_relax(); | 202 | cpu_relax(); |
| 198 | 203 | ||
| 199 | f->flush_mm = NULL; | 204 | f->flush_mm = NULL; |
| @@ -201,12 +206,28 @@ void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm, | |||
| 201 | spin_unlock(&f->tlbstate_lock); | 206 | spin_unlock(&f->tlbstate_lock); |
| 202 | } | 207 | } |
| 203 | 208 | ||
| 209 | void native_flush_tlb_others(const struct cpumask *cpumask, | ||
| 210 | struct mm_struct *mm, unsigned long va) | ||
| 211 | { | ||
| 212 | if (is_uv_system()) { | ||
| 213 | unsigned int cpu; | ||
| 214 | |||
| 215 | cpu = get_cpu(); | ||
| 216 | cpumask = uv_flush_tlb_others(cpumask, mm, va, cpu); | ||
| 217 | if (cpumask) | ||
| 218 | flush_tlb_others_ipi(cpumask, mm, va); | ||
| 219 | put_cpu(); | ||
| 220 | return; | ||
| 221 | } | ||
| 222 | flush_tlb_others_ipi(cpumask, mm, va); | ||
| 223 | } | ||
| 224 | |||
| 204 | static int __cpuinit init_smp_flush(void) | 225 | static int __cpuinit init_smp_flush(void) |
| 205 | { | 226 | { |
| 206 | int i; | 227 | int i; |
| 207 | 228 | ||
| 208 | for_each_possible_cpu(i) | 229 | for (i = 0; i < ARRAY_SIZE(flush_state); i++) |
| 209 | spin_lock_init(&per_cpu(flush_state, i).tlbstate_lock); | 230 | spin_lock_init(&flush_state[i].tlbstate_lock); |
| 210 | 231 | ||
| 211 | return 0; | 232 | return 0; |
| 212 | } | 233 | } |
| @@ -215,25 +236,18 @@ core_initcall(init_smp_flush); | |||
| 215 | void flush_tlb_current_task(void) | 236 | void flush_tlb_current_task(void) |
| 216 | { | 237 | { |
| 217 | struct mm_struct *mm = current->mm; | 238 | struct mm_struct *mm = current->mm; |
| 218 | cpumask_t cpu_mask; | ||
| 219 | 239 | ||
| 220 | preempt_disable(); | 240 | preempt_disable(); |
| 221 | cpu_mask = mm->cpu_vm_mask; | ||
| 222 | cpu_clear(smp_processor_id(), cpu_mask); | ||
| 223 | 241 | ||
| 224 | local_flush_tlb(); | 242 | local_flush_tlb(); |
| 225 | if (!cpus_empty(cpu_mask)) | 243 | if (cpumask_any_but(&mm->cpu_vm_mask, smp_processor_id()) < nr_cpu_ids) |
| 226 | flush_tlb_others(cpu_mask, mm, TLB_FLUSH_ALL); | 244 | flush_tlb_others(&mm->cpu_vm_mask, mm, TLB_FLUSH_ALL); |
| 227 | preempt_enable(); | 245 | preempt_enable(); |
| 228 | } | 246 | } |
| 229 | 247 | ||
| 230 | void flush_tlb_mm(struct mm_struct *mm) | 248 | void flush_tlb_mm(struct mm_struct *mm) |
| 231 | { | 249 | { |
| 232 | cpumask_t cpu_mask; | ||
| 233 | |||
| 234 | preempt_disable(); | 250 | preempt_disable(); |
| 235 | cpu_mask = mm->cpu_vm_mask; | ||
| 236 | cpu_clear(smp_processor_id(), cpu_mask); | ||
| 237 | 251 | ||
| 238 | if (current->active_mm == mm) { | 252 | if (current->active_mm == mm) { |
| 239 | if (current->mm) | 253 | if (current->mm) |
| @@ -241,8 +255,8 @@ void flush_tlb_mm(struct mm_struct *mm) | |||
| 241 | else | 255 | else |
| 242 | leave_mm(smp_processor_id()); | 256 | leave_mm(smp_processor_id()); |
| 243 | } | 257 | } |
| 244 | if (!cpus_empty(cpu_mask)) | 258 | if (cpumask_any_but(&mm->cpu_vm_mask, smp_processor_id()) < nr_cpu_ids) |
| 245 | flush_tlb_others(cpu_mask, mm, TLB_FLUSH_ALL); | 259 | flush_tlb_others(&mm->cpu_vm_mask, mm, TLB_FLUSH_ALL); |
| 246 | 260 | ||
| 247 | preempt_enable(); | 261 | preempt_enable(); |
| 248 | } | 262 | } |
| @@ -250,11 +264,8 @@ void flush_tlb_mm(struct mm_struct *mm) | |||
| 250 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long va) | 264 | void flush_tlb_page(struct vm_area_struct *vma, unsigned long va) |
| 251 | { | 265 | { |
| 252 | struct mm_struct *mm = vma->vm_mm; | 266 | struct mm_struct *mm = vma->vm_mm; |
| 253 | cpumask_t cpu_mask; | ||
| 254 | 267 | ||
| 255 | preempt_disable(); | 268 | preempt_disable(); |
| 256 | cpu_mask = mm->cpu_vm_mask; | ||
| 257 | cpu_clear(smp_processor_id(), cpu_mask); | ||
| 258 | 269 | ||
| 259 | if (current->active_mm == mm) { | 270 | if (current->active_mm == mm) { |
| 260 | if (current->mm) | 271 | if (current->mm) |
| @@ -263,8 +274,8 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long va) | |||
| 263 | leave_mm(smp_processor_id()); | 274 | leave_mm(smp_processor_id()); |
| 264 | } | 275 | } |
| 265 | 276 | ||
| 266 | if (!cpus_empty(cpu_mask)) | 277 | if (cpumask_any_but(&mm->cpu_vm_mask, smp_processor_id()) < nr_cpu_ids) |
| 267 | flush_tlb_others(cpu_mask, mm, va); | 278 | flush_tlb_others(&mm->cpu_vm_mask, mm, va); |
| 268 | 279 | ||
| 269 | preempt_enable(); | 280 | preempt_enable(); |
| 270 | } | 281 | } |
| @@ -274,7 +285,7 @@ static void do_flush_tlb_all(void *info) | |||
| 274 | unsigned long cpu = smp_processor_id(); | 285 | unsigned long cpu = smp_processor_id(); |
| 275 | 286 | ||
| 276 | __flush_tlb_all(); | 287 | __flush_tlb_all(); |
| 277 | if (read_pda(mmu_state) == TLBSTATE_LAZY) | 288 | if (percpu_read(cpu_tlbstate.state) == TLBSTATE_LAZY) |
| 278 | leave_mm(cpu); | 289 | leave_mm(cpu); |
| 279 | } | 290 | } |
| 280 | 291 | ||
diff --git a/arch/x86/pci/numaq_32.c b/arch/x86/pci/numaq_32.c index 2089354968a2..8eb295e116f6 100644 --- a/arch/x86/pci/numaq_32.c +++ b/arch/x86/pci/numaq_32.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | #include <linux/pci.h> | 5 | #include <linux/pci.h> |
| 6 | #include <linux/init.h> | 6 | #include <linux/init.h> |
| 7 | #include <linux/nodemask.h> | 7 | #include <linux/nodemask.h> |
| 8 | #include <mach_apic.h> | 8 | #include <asm/apic.h> |
| 9 | #include <asm/mpspec.h> | 9 | #include <asm/mpspec.h> |
| 10 | #include <asm/pci_x86.h> | 10 | #include <asm/pci_x86.h> |
| 11 | 11 | ||
| @@ -18,10 +18,6 @@ | |||
| 18 | 18 | ||
| 19 | #define QUADLOCAL2BUS(quad,local) (quad_local_to_mp_bus_id[quad][local]) | 19 | #define QUADLOCAL2BUS(quad,local) (quad_local_to_mp_bus_id[quad][local]) |
| 20 | 20 | ||
| 21 | /* Where the IO area was mapped on multiquad, always 0 otherwise */ | ||
| 22 | void *xquad_portio; | ||
| 23 | EXPORT_SYMBOL(xquad_portio); | ||
| 24 | |||
| 25 | #define XQUAD_PORT_ADDR(port, quad) (xquad_portio + (XQUAD_PORTIO_QUAD*quad) + port) | 21 | #define XQUAD_PORT_ADDR(port, quad) (xquad_portio + (XQUAD_PORTIO_QUAD*quad) + port) |
| 26 | 22 | ||
| 27 | #define PCI_CONF1_MQ_ADDRESS(bus, devfn, reg) \ | 23 | #define PCI_CONF1_MQ_ADDRESS(bus, devfn, reg) \ |
diff --git a/arch/x86/pci/pcbios.c b/arch/x86/pci/pcbios.c index b82cae970dfd..1c975cc9839e 100644 --- a/arch/x86/pci/pcbios.c +++ b/arch/x86/pci/pcbios.c | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | #include <linux/module.h> | 7 | #include <linux/module.h> |
| 8 | #include <linux/uaccess.h> | 8 | #include <linux/uaccess.h> |
| 9 | #include <asm/pci_x86.h> | 9 | #include <asm/pci_x86.h> |
| 10 | #include <asm/mach-default/pci-functions.h> | 10 | #include <asm/pci-functions.h> |
| 11 | 11 | ||
| 12 | /* BIOS32 signature: "_32_" */ | 12 | /* BIOS32 signature: "_32_" */ |
| 13 | #define BIOS32_SIGNATURE (('_' << 0) + ('3' << 8) + ('2' << 16) + ('_' << 24)) | 13 | #define BIOS32_SIGNATURE (('_' << 0) + ('3' << 8) + ('2' << 16) + ('_' << 24)) |
diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S index d1e9b53f9d33..b641388d8286 100644 --- a/arch/x86/power/hibernate_asm_32.S +++ b/arch/x86/power/hibernate_asm_32.S | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | 8 | ||
| 9 | #include <linux/linkage.h> | 9 | #include <linux/linkage.h> |
| 10 | #include <asm/segment.h> | 10 | #include <asm/segment.h> |
| 11 | #include <asm/page.h> | 11 | #include <asm/page_types.h> |
| 12 | #include <asm/asm-offsets.h> | 12 | #include <asm/asm-offsets.h> |
| 13 | #include <asm/processor-flags.h> | 13 | #include <asm/processor-flags.h> |
| 14 | 14 | ||
diff --git a/arch/x86/power/hibernate_asm_64.S b/arch/x86/power/hibernate_asm_64.S index 000415947d93..9356547d8c01 100644 --- a/arch/x86/power/hibernate_asm_64.S +++ b/arch/x86/power/hibernate_asm_64.S | |||
| @@ -18,7 +18,7 @@ | |||
| 18 | .text | 18 | .text |
| 19 | #include <linux/linkage.h> | 19 | #include <linux/linkage.h> |
| 20 | #include <asm/segment.h> | 20 | #include <asm/segment.h> |
| 21 | #include <asm/page.h> | 21 | #include <asm/page_types.h> |
| 22 | #include <asm/asm-offsets.h> | 22 | #include <asm/asm-offsets.h> |
| 23 | #include <asm/processor-flags.h> | 23 | #include <asm/processor-flags.h> |
| 24 | 24 | ||
diff --git a/arch/x86/vdso/Makefile b/arch/x86/vdso/Makefile index 4d6ef0a336d6..16a9020c8f11 100644 --- a/arch/x86/vdso/Makefile +++ b/arch/x86/vdso/Makefile | |||
| @@ -38,7 +38,7 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE | |||
| 38 | $(call if_changed,objcopy) | 38 | $(call if_changed,objcopy) |
| 39 | 39 | ||
| 40 | CFL := $(PROFILING) -mcmodel=small -fPIC -O2 -fasynchronous-unwind-tables -m64 \ | 40 | CFL := $(PROFILING) -mcmodel=small -fPIC -O2 -fasynchronous-unwind-tables -m64 \ |
| 41 | $(filter -g%,$(KBUILD_CFLAGS)) | 41 | $(filter -g%,$(KBUILD_CFLAGS)) $(call cc-option, -fno-stack-protector) |
| 42 | 42 | ||
| 43 | $(vobjs): KBUILD_CFLAGS += $(CFL) | 43 | $(vobjs): KBUILD_CFLAGS += $(CFL) |
| 44 | 44 | ||
diff --git a/arch/x86/xen/Makefile b/arch/x86/xen/Makefile index 6dcefba7836f..3b767d03fd6a 100644 --- a/arch/x86/xen/Makefile +++ b/arch/x86/xen/Makefile | |||
| @@ -6,7 +6,8 @@ CFLAGS_REMOVE_irq.o = -pg | |||
| 6 | endif | 6 | endif |
| 7 | 7 | ||
| 8 | obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \ | 8 | obj-y := enlighten.o setup.o multicalls.o mmu.o irq.o \ |
| 9 | time.o xen-asm_$(BITS).o grant-table.o suspend.o | 9 | time.o xen-asm.o xen-asm_$(BITS).o \ |
| 10 | grant-table.o suspend.o | ||
| 10 | 11 | ||
| 11 | obj-$(CONFIG_SMP) += smp.o spinlock.o | 12 | obj-$(CONFIG_SMP) += smp.o spinlock.o |
| 12 | obj-$(CONFIG_XEN_DEBUG_FS) += debugfs.o \ No newline at end of file | 13 | obj-$(CONFIG_XEN_DEBUG_FS) += debugfs.o \ No newline at end of file |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index bea215230b20..86497d5f44cd 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -61,40 +61,13 @@ DEFINE_PER_CPU(struct vcpu_info, xen_vcpu_info); | |||
| 61 | enum xen_domain_type xen_domain_type = XEN_NATIVE; | 61 | enum xen_domain_type xen_domain_type = XEN_NATIVE; |
| 62 | EXPORT_SYMBOL_GPL(xen_domain_type); | 62 | EXPORT_SYMBOL_GPL(xen_domain_type); |
| 63 | 63 | ||
| 64 | /* | ||
| 65 | * Identity map, in addition to plain kernel map. This needs to be | ||
| 66 | * large enough to allocate page table pages to allocate the rest. | ||
| 67 | * Each page can map 2MB. | ||
| 68 | */ | ||
| 69 | static pte_t level1_ident_pgt[PTRS_PER_PTE * 4] __page_aligned_bss; | ||
| 70 | |||
| 71 | #ifdef CONFIG_X86_64 | ||
| 72 | /* l3 pud for userspace vsyscall mapping */ | ||
| 73 | static pud_t level3_user_vsyscall[PTRS_PER_PUD] __page_aligned_bss; | ||
| 74 | #endif /* CONFIG_X86_64 */ | ||
| 75 | |||
| 76 | /* | ||
| 77 | * Note about cr3 (pagetable base) values: | ||
| 78 | * | ||
| 79 | * xen_cr3 contains the current logical cr3 value; it contains the | ||
| 80 | * last set cr3. This may not be the current effective cr3, because | ||
| 81 | * its update may be being lazily deferred. However, a vcpu looking | ||
| 82 | * at its own cr3 can use this value knowing that it everything will | ||
| 83 | * be self-consistent. | ||
| 84 | * | ||
| 85 | * xen_current_cr3 contains the actual vcpu cr3; it is set once the | ||
| 86 | * hypercall to set the vcpu cr3 is complete (so it may be a little | ||
| 87 | * out of date, but it will never be set early). If one vcpu is | ||
| 88 | * looking at another vcpu's cr3 value, it should use this variable. | ||
| 89 | */ | ||
| 90 | DEFINE_PER_CPU(unsigned long, xen_cr3); /* cr3 stored as physaddr */ | ||
| 91 | DEFINE_PER_CPU(unsigned long, xen_current_cr3); /* actual vcpu cr3 */ | ||
| 92 | |||
| 93 | struct start_info *xen_start_info; | 64 | struct start_info *xen_start_info; |
| 94 | EXPORT_SYMBOL_GPL(xen_start_info); | 65 | EXPORT_SYMBOL_GPL(xen_start_info); |
| 95 | 66 | ||
| 96 | struct shared_info xen_dummy_shared_info; | 67 | struct shared_info xen_dummy_shared_info; |
| 97 | 68 | ||
| 69 | void *xen_initial_gdt; | ||
| 70 | |||
| 98 | /* | 71 | /* |
| 99 | * Point at some empty memory to start with. We map the real shared_info | 72 | * Point at some empty memory to start with. We map the real shared_info |
| 100 | * page as soon as fixmap is up and running. | 73 | * page as soon as fixmap is up and running. |
| @@ -114,14 +87,7 @@ struct shared_info *HYPERVISOR_shared_info = (void *)&xen_dummy_shared_info; | |||
| 114 | * | 87 | * |
| 115 | * 0: not available, 1: available | 88 | * 0: not available, 1: available |
| 116 | */ | 89 | */ |
| 117 | static int have_vcpu_info_placement = | 90 | static int have_vcpu_info_placement = 1; |
| 118 | #ifdef CONFIG_X86_32 | ||
| 119 | 1 | ||
| 120 | #else | ||
| 121 | 0 | ||
| 122 | #endif | ||
| 123 | ; | ||
| 124 | |||
| 125 | 91 | ||
| 126 | static void xen_vcpu_setup(int cpu) | 92 | static void xen_vcpu_setup(int cpu) |
| 127 | { | 93 | { |
| @@ -237,7 +203,7 @@ static unsigned long xen_get_debugreg(int reg) | |||
| 237 | return HYPERVISOR_get_debugreg(reg); | 203 | return HYPERVISOR_get_debugreg(reg); |
| 238 | } | 204 | } |
| 239 | 205 | ||
| 240 | static void xen_leave_lazy(void) | 206 | void xen_leave_lazy(void) |
| 241 | { | 207 | { |
| 242 | paravirt_leave_lazy(paravirt_get_lazy_mode()); | 208 | paravirt_leave_lazy(paravirt_get_lazy_mode()); |
| 243 | xen_mc_flush(); | 209 | xen_mc_flush(); |
| @@ -357,13 +323,14 @@ static void load_TLS_descriptor(struct thread_struct *t, | |||
| 357 | static void xen_load_tls(struct thread_struct *t, unsigned int cpu) | 323 | static void xen_load_tls(struct thread_struct *t, unsigned int cpu) |
| 358 | { | 324 | { |
| 359 | /* | 325 | /* |
| 360 | * XXX sleazy hack: If we're being called in a lazy-cpu zone, | 326 | * XXX sleazy hack: If we're being called in a lazy-cpu zone |
| 361 | * it means we're in a context switch, and %gs has just been | 327 | * and lazy gs handling is enabled, it means we're in a |
| 362 | * saved. This means we can zero it out to prevent faults on | 328 | * context switch, and %gs has just been saved. This means we |
| 363 | * exit from the hypervisor if the next process has no %gs. | 329 | * can zero it out to prevent faults on exit from the |
| 364 | * Either way, it has been saved, and the new value will get | 330 | * hypervisor if the next process has no %gs. Either way, it |
| 365 | * loaded properly. This will go away as soon as Xen has been | 331 | * has been saved, and the new value will get loaded properly. |
| 366 | * modified to not save/restore %gs for normal hypercalls. | 332 | * This will go away as soon as Xen has been modified to not |
| 333 | * save/restore %gs for normal hypercalls. | ||
| 367 | * | 334 | * |
| 368 | * On x86_64, this hack is not used for %gs, because gs points | 335 | * On x86_64, this hack is not used for %gs, because gs points |
| 369 | * to KERNEL_GS_BASE (and uses it for PDA references), so we | 336 | * to KERNEL_GS_BASE (and uses it for PDA references), so we |
| @@ -375,7 +342,7 @@ static void xen_load_tls(struct thread_struct *t, unsigned int cpu) | |||
| 375 | */ | 342 | */ |
| 376 | if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_CPU) { | 343 | if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_CPU) { |
| 377 | #ifdef CONFIG_X86_32 | 344 | #ifdef CONFIG_X86_32 |
| 378 | loadsegment(gs, 0); | 345 | lazy_load_gs(0); |
| 379 | #else | 346 | #else |
| 380 | loadsegment(fs, 0); | 347 | loadsegment(fs, 0); |
| 381 | #endif | 348 | #endif |
| @@ -587,94 +554,18 @@ static u32 xen_safe_apic_wait_icr_idle(void) | |||
| 587 | return 0; | 554 | return 0; |
| 588 | } | 555 | } |
| 589 | 556 | ||
| 590 | static struct apic_ops xen_basic_apic_ops = { | 557 | static void set_xen_basic_apic_ops(void) |
| 591 | .read = xen_apic_read, | ||
| 592 | .write = xen_apic_write, | ||
| 593 | .icr_read = xen_apic_icr_read, | ||
| 594 | .icr_write = xen_apic_icr_write, | ||
| 595 | .wait_icr_idle = xen_apic_wait_icr_idle, | ||
| 596 | .safe_wait_icr_idle = xen_safe_apic_wait_icr_idle, | ||
| 597 | }; | ||
| 598 | |||
| 599 | #endif | ||
| 600 | |||
| 601 | static void xen_flush_tlb(void) | ||
| 602 | { | 558 | { |
| 603 | struct mmuext_op *op; | 559 | apic->read = xen_apic_read; |
| 604 | struct multicall_space mcs; | 560 | apic->write = xen_apic_write; |
| 605 | 561 | apic->icr_read = xen_apic_icr_read; | |
| 606 | preempt_disable(); | 562 | apic->icr_write = xen_apic_icr_write; |
| 607 | 563 | apic->wait_icr_idle = xen_apic_wait_icr_idle; | |
| 608 | mcs = xen_mc_entry(sizeof(*op)); | 564 | apic->safe_wait_icr_idle = xen_safe_apic_wait_icr_idle; |
| 609 | |||
| 610 | op = mcs.args; | ||
| 611 | op->cmd = MMUEXT_TLB_FLUSH_LOCAL; | ||
| 612 | MULTI_mmuext_op(mcs.mc, op, 1, NULL, DOMID_SELF); | ||
| 613 | |||
| 614 | xen_mc_issue(PARAVIRT_LAZY_MMU); | ||
| 615 | |||
| 616 | preempt_enable(); | ||
| 617 | } | 565 | } |
| 618 | 566 | ||
| 619 | static void xen_flush_tlb_single(unsigned long addr) | 567 | #endif |
| 620 | { | ||
| 621 | struct mmuext_op *op; | ||
| 622 | struct multicall_space mcs; | ||
| 623 | |||
| 624 | preempt_disable(); | ||
| 625 | |||
| 626 | mcs = xen_mc_entry(sizeof(*op)); | ||
| 627 | op = mcs.args; | ||
| 628 | op->cmd = MMUEXT_INVLPG_LOCAL; | ||
| 629 | op->arg1.linear_addr = addr & PAGE_MASK; | ||
| 630 | MULTI_mmuext_op(mcs.mc, op, 1, NULL, DOMID_SELF); | ||
| 631 | |||
| 632 | xen_mc_issue(PARAVIRT_LAZY_MMU); | ||
| 633 | |||
| 634 | preempt_enable(); | ||
| 635 | } | ||
| 636 | |||
| 637 | static void xen_flush_tlb_others(const cpumask_t *cpus, struct mm_struct *mm, | ||
| 638 | unsigned long va) | ||
| 639 | { | ||
| 640 | struct { | ||
| 641 | struct mmuext_op op; | ||
| 642 | cpumask_t mask; | ||
| 643 | } *args; | ||
| 644 | cpumask_t cpumask = *cpus; | ||
| 645 | struct multicall_space mcs; | ||
| 646 | |||
| 647 | /* | ||
| 648 | * A couple of (to be removed) sanity checks: | ||
| 649 | * | ||
| 650 | * - current CPU must not be in mask | ||
| 651 | * - mask must exist :) | ||
| 652 | */ | ||
| 653 | BUG_ON(cpus_empty(cpumask)); | ||
| 654 | BUG_ON(cpu_isset(smp_processor_id(), cpumask)); | ||
| 655 | BUG_ON(!mm); | ||
| 656 | |||
| 657 | /* If a CPU which we ran on has gone down, OK. */ | ||
| 658 | cpus_and(cpumask, cpumask, cpu_online_map); | ||
| 659 | if (cpus_empty(cpumask)) | ||
| 660 | return; | ||
| 661 | |||
| 662 | mcs = xen_mc_entry(sizeof(*args)); | ||
| 663 | args = mcs.args; | ||
| 664 | args->mask = cpumask; | ||
| 665 | args->op.arg2.vcpumask = &args->mask; | ||
| 666 | |||
| 667 | if (va == TLB_FLUSH_ALL) { | ||
| 668 | args->op.cmd = MMUEXT_TLB_FLUSH_MULTI; | ||
| 669 | } else { | ||
| 670 | args->op.cmd = MMUEXT_INVLPG_MULTI; | ||
| 671 | args->op.arg1.linear_addr = va; | ||
| 672 | } | ||
| 673 | |||
| 674 | MULTI_mmuext_op(mcs.mc, &args->op, 1, NULL, DOMID_SELF); | ||
| 675 | 568 | ||
| 676 | xen_mc_issue(PARAVIRT_LAZY_MMU); | ||
| 677 | } | ||
| 678 | 569 | ||
| 679 | static void xen_clts(void) | 570 | static void xen_clts(void) |
| 680 | { | 571 | { |
| @@ -700,21 +591,6 @@ static void xen_write_cr0(unsigned long cr0) | |||
| 700 | xen_mc_issue(PARAVIRT_LAZY_CPU); | 591 | xen_mc_issue(PARAVIRT_LAZY_CPU); |
| 701 | } | 592 | } |
| 702 | 593 | ||
| 703 | static void xen_write_cr2(unsigned long cr2) | ||
| 704 | { | ||
| 705 | x86_read_percpu(xen_vcpu)->arch.cr2 = cr2; | ||
| 706 | } | ||
| 707 | |||
| 708 | static unsigned long xen_read_cr2(void) | ||
| 709 | { | ||
| 710 | return x86_read_percpu(xen_vcpu)->arch.cr2; | ||
| 711 | } | ||
| 712 | |||
| 713 | static unsigned long xen_read_cr2_direct(void) | ||
| 714 | { | ||
| 715 | return x86_read_percpu(xen_vcpu_info.arch.cr2); | ||
| 716 | } | ||
| 717 | |||
| 718 | static void xen_write_cr4(unsigned long cr4) | 594 | static void xen_write_cr4(unsigned long cr4) |
| 719 | { | 595 | { |
| 720 | cr4 &= ~X86_CR4_PGE; | 596 | cr4 &= ~X86_CR4_PGE; |
| @@ -723,71 +599,6 @@ static void xen_write_cr4(unsigned long cr4) | |||
| 723 | native_write_cr4(cr4); | 599 | native_write_cr4(cr4); |
| 724 | } | 600 | } |
| 725 | 601 | ||
| 726 | static unsigned long xen_read_cr3(void) | ||
| 727 | { | ||
| 728 | return x86_read_percpu(xen_cr3); | ||
| 729 | } | ||
| 730 | |||
| 731 | static void set_current_cr3(void *v) | ||
| 732 | { | ||
| 733 | x86_write_percpu(xen_current_cr3, (unsigned long)v); | ||
| 734 | } | ||
| 735 | |||
| 736 | static void __xen_write_cr3(bool kernel, unsigned long cr3) | ||
| 737 | { | ||
| 738 | struct mmuext_op *op; | ||
| 739 | struct multicall_space mcs; | ||
| 740 | unsigned long mfn; | ||
| 741 | |||
| 742 | if (cr3) | ||
| 743 | mfn = pfn_to_mfn(PFN_DOWN(cr3)); | ||
| 744 | else | ||
| 745 | mfn = 0; | ||
| 746 | |||
| 747 | WARN_ON(mfn == 0 && kernel); | ||
| 748 | |||
| 749 | mcs = __xen_mc_entry(sizeof(*op)); | ||
| 750 | |||
| 751 | op = mcs.args; | ||
| 752 | op->cmd = kernel ? MMUEXT_NEW_BASEPTR : MMUEXT_NEW_USER_BASEPTR; | ||
| 753 | op->arg1.mfn = mfn; | ||
| 754 | |||
| 755 | MULTI_mmuext_op(mcs.mc, op, 1, NULL, DOMID_SELF); | ||
| 756 | |||
| 757 | if (kernel) { | ||
| 758 | x86_write_percpu(xen_cr3, cr3); | ||
| 759 | |||
| 760 | /* Update xen_current_cr3 once the batch has actually | ||
| 761 | been submitted. */ | ||
| 762 | xen_mc_callback(set_current_cr3, (void *)cr3); | ||
| 763 | } | ||
| 764 | } | ||
| 765 | |||
| 766 | static void xen_write_cr3(unsigned long cr3) | ||
| 767 | { | ||
| 768 | BUG_ON(preemptible()); | ||
| 769 | |||
| 770 | xen_mc_batch(); /* disables interrupts */ | ||
| 771 | |||
| 772 | /* Update while interrupts are disabled, so its atomic with | ||
| 773 | respect to ipis */ | ||
| 774 | x86_write_percpu(xen_cr3, cr3); | ||
| 775 | |||
| 776 | __xen_write_cr3(true, cr3); | ||
| 777 | |||
| 778 | #ifdef CONFIG_X86_64 | ||
| 779 | { | ||
| 780 | pgd_t *user_pgd = xen_get_user_pgd(__va(cr3)); | ||
| 781 | if (user_pgd) | ||
| 782 | __xen_write_cr3(false, __pa(user_pgd)); | ||
| 783 | else | ||
| 784 | __xen_write_cr3(false, 0); | ||
| 785 | } | ||
| 786 | #endif | ||
| 787 | |||
| 788 | xen_mc_issue(PARAVIRT_LAZY_CPU); /* interrupts restored */ | ||
| 789 | } | ||
| 790 | |||
| 791 | static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high) | 602 | static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high) |
| 792 | { | 603 | { |
| 793 | int ret; | 604 | int ret; |
| @@ -829,185 +640,6 @@ static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high) | |||
| 829 | return ret; | 640 | return ret; |
| 830 | } | 641 | } |
| 831 | 642 | ||
| 832 | /* Early in boot, while setting up the initial pagetable, assume | ||
| 833 | everything is pinned. */ | ||
| 834 | static __init void xen_alloc_pte_init(struct mm_struct *mm, unsigned long pfn) | ||
| 835 | { | ||
| 836 | #ifdef CONFIG_FLATMEM | ||
| 837 | BUG_ON(mem_map); /* should only be used early */ | ||
| 838 | #endif | ||
| 839 | make_lowmem_page_readonly(__va(PFN_PHYS(pfn))); | ||
| 840 | } | ||
| 841 | |||
| 842 | /* Early release_pte assumes that all pts are pinned, since there's | ||
| 843 | only init_mm and anything attached to that is pinned. */ | ||
| 844 | static void xen_release_pte_init(unsigned long pfn) | ||
| 845 | { | ||
| 846 | make_lowmem_page_readwrite(__va(PFN_PHYS(pfn))); | ||
| 847 | } | ||
| 848 | |||
| 849 | static void pin_pagetable_pfn(unsigned cmd, unsigned long pfn) | ||
| 850 | { | ||
| 851 | struct mmuext_op op; | ||
| 852 | op.cmd = cmd; | ||
| 853 | op.arg1.mfn = pfn_to_mfn(pfn); | ||
| 854 | if (HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF)) | ||
| 855 | BUG(); | ||
| 856 | } | ||
| 857 | |||
| 858 | /* This needs to make sure the new pte page is pinned iff its being | ||
| 859 | attached to a pinned pagetable. */ | ||
| 860 | static void xen_alloc_ptpage(struct mm_struct *mm, unsigned long pfn, unsigned level) | ||
| 861 | { | ||
| 862 | struct page *page = pfn_to_page(pfn); | ||
| 863 | |||
| 864 | if (PagePinned(virt_to_page(mm->pgd))) { | ||
| 865 | SetPagePinned(page); | ||
| 866 | |||
| 867 | vm_unmap_aliases(); | ||
| 868 | if (!PageHighMem(page)) { | ||
| 869 | make_lowmem_page_readonly(__va(PFN_PHYS((unsigned long)pfn))); | ||
| 870 | if (level == PT_PTE && USE_SPLIT_PTLOCKS) | ||
| 871 | pin_pagetable_pfn(MMUEXT_PIN_L1_TABLE, pfn); | ||
| 872 | } else { | ||
| 873 | /* make sure there are no stray mappings of | ||
| 874 | this page */ | ||
| 875 | kmap_flush_unused(); | ||
| 876 | } | ||
| 877 | } | ||
| 878 | } | ||
| 879 | |||
| 880 | static void xen_alloc_pte(struct mm_struct *mm, unsigned long pfn) | ||
| 881 | { | ||
| 882 | xen_alloc_ptpage(mm, pfn, PT_PTE); | ||
| 883 | } | ||
| 884 | |||
| 885 | static void xen_alloc_pmd(struct mm_struct *mm, unsigned long pfn) | ||
| 886 | { | ||
| 887 | xen_alloc_ptpage(mm, pfn, PT_PMD); | ||
| 888 | } | ||
| 889 | |||
| 890 | static int xen_pgd_alloc(struct mm_struct *mm) | ||
| 891 | { | ||
| 892 | pgd_t *pgd = mm->pgd; | ||
| 893 | int ret = 0; | ||
| 894 | |||
| 895 | BUG_ON(PagePinned(virt_to_page(pgd))); | ||
| 896 | |||
| 897 | #ifdef CONFIG_X86_64 | ||
| 898 | { | ||
| 899 | struct page *page = virt_to_page(pgd); | ||
| 900 | pgd_t *user_pgd; | ||
| 901 | |||
| 902 | BUG_ON(page->private != 0); | ||
| 903 | |||
| 904 | ret = -ENOMEM; | ||
| 905 | |||
| 906 | user_pgd = (pgd_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO); | ||
| 907 | page->private = (unsigned long)user_pgd; | ||
| 908 | |||
| 909 | if (user_pgd != NULL) { | ||
| 910 | user_pgd[pgd_index(VSYSCALL_START)] = | ||
| 911 | __pgd(__pa(level3_user_vsyscall) | _PAGE_TABLE); | ||
| 912 | ret = 0; | ||
| 913 | } | ||
| 914 | |||
| 915 | BUG_ON(PagePinned(virt_to_page(xen_get_user_pgd(pgd)))); | ||
| 916 | } | ||
| 917 | #endif | ||
| 918 | |||
| 919 | return ret; | ||
| 920 | } | ||
| 921 | |||
| 922 | static void xen_pgd_free(struct mm_struct *mm, pgd_t *pgd) | ||
| 923 | { | ||
| 924 | #ifdef CONFIG_X86_64 | ||
| 925 | pgd_t *user_pgd = xen_get_user_pgd(pgd); | ||
| 926 | |||
| 927 | if (user_pgd) | ||
| 928 | free_page((unsigned long)user_pgd); | ||
| 929 | #endif | ||
| 930 | } | ||
| 931 | |||
| 932 | /* This should never happen until we're OK to use struct page */ | ||
| 933 | static void xen_release_ptpage(unsigned long pfn, unsigned level) | ||
| 934 | { | ||
| 935 | struct page *page = pfn_to_page(pfn); | ||
| 936 | |||
| 937 | if (PagePinned(page)) { | ||
| 938 | if (!PageHighMem(page)) { | ||
| 939 | if (level == PT_PTE && USE_SPLIT_PTLOCKS) | ||
| 940 | pin_pagetable_pfn(MMUEXT_UNPIN_TABLE, pfn); | ||
| 941 | make_lowmem_page_readwrite(__va(PFN_PHYS(pfn))); | ||
| 942 | } | ||
| 943 | ClearPagePinned(page); | ||
| 944 | } | ||
| 945 | } | ||
| 946 | |||
| 947 | static void xen_release_pte(unsigned long pfn) | ||
| 948 | { | ||
| 949 | xen_release_ptpage(pfn, PT_PTE); | ||
| 950 | } | ||
| 951 | |||
| 952 | static void xen_release_pmd(unsigned long pfn) | ||
| 953 | { | ||
| 954 | xen_release_ptpage(pfn, PT_PMD); | ||
| 955 | } | ||
| 956 | |||
| 957 | #if PAGETABLE_LEVELS == 4 | ||
| 958 | static void xen_alloc_pud(struct mm_struct *mm, unsigned long pfn) | ||
| 959 | { | ||
| 960 | xen_alloc_ptpage(mm, pfn, PT_PUD); | ||
| 961 | } | ||
| 962 | |||
| 963 | static void xen_release_pud(unsigned long pfn) | ||
| 964 | { | ||
| 965 | xen_release_ptpage(pfn, PT_PUD); | ||
| 966 | } | ||
| 967 | #endif | ||
| 968 | |||
| 969 | #ifdef CONFIG_HIGHPTE | ||
| 970 | static void *xen_kmap_atomic_pte(struct page *page, enum km_type type) | ||
| 971 | { | ||
| 972 | pgprot_t prot = PAGE_KERNEL; | ||
| 973 | |||
| 974 | if (PagePinned(page)) | ||
| 975 | prot = PAGE_KERNEL_RO; | ||
| 976 | |||
| 977 | if (0 && PageHighMem(page)) | ||
| 978 | printk("mapping highpte %lx type %d prot %s\n", | ||
| 979 | page_to_pfn(page), type, | ||
| 980 | (unsigned long)pgprot_val(prot) & _PAGE_RW ? "WRITE" : "READ"); | ||
| 981 | |||
| 982 | return kmap_atomic_prot(page, type, prot); | ||
| 983 | } | ||
| 984 | #endif | ||
| 985 | |||
| 986 | #ifdef CONFIG_X86_32 | ||
| 987 | static __init pte_t mask_rw_pte(pte_t *ptep, pte_t pte) | ||
| 988 | { | ||
| 989 | /* If there's an existing pte, then don't allow _PAGE_RW to be set */ | ||
| 990 | if (pte_val_ma(*ptep) & _PAGE_PRESENT) | ||
| 991 | pte = __pte_ma(((pte_val_ma(*ptep) & _PAGE_RW) | ~_PAGE_RW) & | ||
| 992 | pte_val_ma(pte)); | ||
| 993 | |||
| 994 | return pte; | ||
| 995 | } | ||
| 996 | |||
| 997 | /* Init-time set_pte while constructing initial pagetables, which | ||
| 998 | doesn't allow RO pagetable pages to be remapped RW */ | ||
| 999 | static __init void xen_set_pte_init(pte_t *ptep, pte_t pte) | ||
| 1000 | { | ||
| 1001 | pte = mask_rw_pte(ptep, pte); | ||
| 1002 | |||
| 1003 | xen_set_pte(ptep, pte); | ||
| 1004 | } | ||
| 1005 | #endif | ||
| 1006 | |||
| 1007 | static __init void xen_pagetable_setup_start(pgd_t *base) | ||
| 1008 | { | ||
| 1009 | } | ||
| 1010 | |||
| 1011 | void xen_setup_shared_info(void) | 643 | void xen_setup_shared_info(void) |
| 1012 | { | 644 | { |
| 1013 | if (!xen_feature(XENFEAT_auto_translated_physmap)) { | 645 | if (!xen_feature(XENFEAT_auto_translated_physmap)) { |
| @@ -1028,37 +660,6 @@ void xen_setup_shared_info(void) | |||
| 1028 | xen_setup_mfn_list_list(); | 660 | xen_setup_mfn_list_list(); |
| 1029 | } | 661 | } |
| 1030 | 662 | ||
| 1031 | static __init void xen_pagetable_setup_done(pgd_t *base) | ||
| 1032 | { | ||
| 1033 | xen_setup_shared_info(); | ||
| 1034 | } | ||
| 1035 | |||
| 1036 | static __init void xen_post_allocator_init(void) | ||
| 1037 | { | ||
| 1038 | pv_mmu_ops.set_pte = xen_set_pte; | ||
| 1039 | pv_mmu_ops.set_pmd = xen_set_pmd; | ||
| 1040 | pv_mmu_ops.set_pud = xen_set_pud; | ||
| 1041 | #if PAGETABLE_LEVELS == 4 | ||
| 1042 | pv_mmu_ops.set_pgd = xen_set_pgd; | ||
| 1043 | #endif | ||
| 1044 | |||
| 1045 | /* This will work as long as patching hasn't happened yet | ||
| 1046 | (which it hasn't) */ | ||
| 1047 | pv_mmu_ops.alloc_pte = xen_alloc_pte; | ||
| 1048 | pv_mmu_ops.alloc_pmd = xen_alloc_pmd; | ||
| 1049 | pv_mmu_ops.release_pte = xen_release_pte; | ||
| 1050 | pv_mmu_ops.release_pmd = xen_release_pmd; | ||
| 1051 | #if PAGETABLE_LEVELS == 4 | ||
| 1052 | pv_mmu_ops.alloc_pud = xen_alloc_pud; | ||
| 1053 | pv_mmu_ops.release_pud = xen_release_pud; | ||
| 1054 | #endif | ||
| 1055 | |||
| 1056 | #ifdef CONFIG_X86_64 | ||
| 1057 | SetPagePinned(virt_to_page(level3_user_vsyscall)); | ||
| 1058 | #endif | ||
| 1059 | xen_mark_init_mm_pinned(); | ||
| 1060 | } | ||
| 1061 | |||
| 1062 | /* This is called once we have the cpu_possible_map */ | 663 | /* This is called once we have the cpu_possible_map */ |
| 1063 | void xen_setup_vcpu_info_placement(void) | 664 | void xen_setup_vcpu_info_placement(void) |
| 1064 | { | 665 | { |
| @@ -1072,10 +673,10 @@ void xen_setup_vcpu_info_placement(void) | |||
| 1072 | if (have_vcpu_info_placement) { | 673 | if (have_vcpu_info_placement) { |
| 1073 | printk(KERN_INFO "Xen: using vcpu_info placement\n"); | 674 | printk(KERN_INFO "Xen: using vcpu_info placement\n"); |
| 1074 | 675 | ||
| 1075 | pv_irq_ops.save_fl = xen_save_fl_direct; | 676 | pv_irq_ops.save_fl = __PV_IS_CALLEE_SAVE(xen_save_fl_direct); |
| 1076 | pv_irq_ops.restore_fl = xen_restore_fl_direct; | 677 | pv_irq_ops.restore_fl = __PV_IS_CALLEE_SAVE(xen_restore_fl_direct); |
| 1077 | pv_irq_ops.irq_disable = xen_irq_disable_direct; | 678 | pv_irq_ops.irq_disable = __PV_IS_CALLEE_SAVE(xen_irq_disable_direct); |
| 1078 | pv_irq_ops.irq_enable = xen_irq_enable_direct; | 679 | pv_irq_ops.irq_enable = __PV_IS_CALLEE_SAVE(xen_irq_enable_direct); |
| 1079 | pv_mmu_ops.read_cr2 = xen_read_cr2_direct; | 680 | pv_mmu_ops.read_cr2 = xen_read_cr2_direct; |
| 1080 | } | 681 | } |
| 1081 | } | 682 | } |
| @@ -1133,49 +734,6 @@ static unsigned xen_patch(u8 type, u16 clobbers, void *insnbuf, | |||
| 1133 | return ret; | 734 | return ret; |
| 1134 | } | 735 | } |
| 1135 | 736 | ||
| 1136 | static void xen_set_fixmap(unsigned idx, unsigned long phys, pgprot_t prot) | ||
| 1137 | { | ||
| 1138 | pte_t pte; | ||
| 1139 | |||
| 1140 | phys >>= PAGE_SHIFT; | ||
| 1141 | |||
| 1142 | switch (idx) { | ||
| 1143 | case FIX_BTMAP_END ... FIX_BTMAP_BEGIN: | ||
| 1144 | #ifdef CONFIG_X86_F00F_BUG | ||
| 1145 | case FIX_F00F_IDT: | ||
| 1146 | #endif | ||
| 1147 | #ifdef CONFIG_X86_32 | ||
| 1148 | case FIX_WP_TEST: | ||
| 1149 | case FIX_VDSO: | ||
| 1150 | # ifdef CONFIG_HIGHMEM | ||
| 1151 | case FIX_KMAP_BEGIN ... FIX_KMAP_END: | ||
| 1152 | # endif | ||
| 1153 | #else | ||
| 1154 | case VSYSCALL_LAST_PAGE ... VSYSCALL_FIRST_PAGE: | ||
| 1155 | #endif | ||
| 1156 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 1157 | case FIX_APIC_BASE: /* maps dummy local APIC */ | ||
| 1158 | #endif | ||
| 1159 | pte = pfn_pte(phys, prot); | ||
| 1160 | break; | ||
| 1161 | |||
| 1162 | default: | ||
| 1163 | pte = mfn_pte(phys, prot); | ||
| 1164 | break; | ||
| 1165 | } | ||
| 1166 | |||
| 1167 | __native_set_fixmap(idx, pte); | ||
| 1168 | |||
| 1169 | #ifdef CONFIG_X86_64 | ||
| 1170 | /* Replicate changes to map the vsyscall page into the user | ||
| 1171 | pagetable vsyscall mapping. */ | ||
| 1172 | if (idx >= VSYSCALL_LAST_PAGE && idx <= VSYSCALL_FIRST_PAGE) { | ||
| 1173 | unsigned long vaddr = __fix_to_virt(idx); | ||
| 1174 | set_pte_vaddr_pud(level3_user_vsyscall, vaddr, pte); | ||
| 1175 | } | ||
| 1176 | #endif | ||
| 1177 | } | ||
| 1178 | |||
| 1179 | static const struct pv_info xen_info __initdata = { | 737 | static const struct pv_info xen_info __initdata = { |
| 1180 | .paravirt_enabled = 1, | 738 | .paravirt_enabled = 1, |
| 1181 | .shared_kernel_pmd = 0, | 739 | .shared_kernel_pmd = 0, |
| @@ -1271,87 +829,6 @@ static const struct pv_apic_ops xen_apic_ops __initdata = { | |||
| 1271 | #endif | 829 | #endif |
| 1272 | }; | 830 | }; |
| 1273 | 831 | ||
| 1274 | static const struct pv_mmu_ops xen_mmu_ops __initdata = { | ||
| 1275 | .pagetable_setup_start = xen_pagetable_setup_start, | ||
| 1276 | .pagetable_setup_done = xen_pagetable_setup_done, | ||
| 1277 | |||
| 1278 | .read_cr2 = xen_read_cr2, | ||
| 1279 | .write_cr2 = xen_write_cr2, | ||
| 1280 | |||
| 1281 | .read_cr3 = xen_read_cr3, | ||
| 1282 | .write_cr3 = xen_write_cr3, | ||
| 1283 | |||
| 1284 | .flush_tlb_user = xen_flush_tlb, | ||
| 1285 | .flush_tlb_kernel = xen_flush_tlb, | ||
| 1286 | .flush_tlb_single = xen_flush_tlb_single, | ||
| 1287 | .flush_tlb_others = xen_flush_tlb_others, | ||
| 1288 | |||
| 1289 | .pte_update = paravirt_nop, | ||
| 1290 | .pte_update_defer = paravirt_nop, | ||
| 1291 | |||
| 1292 | .pgd_alloc = xen_pgd_alloc, | ||
| 1293 | .pgd_free = xen_pgd_free, | ||
| 1294 | |||
| 1295 | .alloc_pte = xen_alloc_pte_init, | ||
| 1296 | .release_pte = xen_release_pte_init, | ||
| 1297 | .alloc_pmd = xen_alloc_pte_init, | ||
| 1298 | .alloc_pmd_clone = paravirt_nop, | ||
| 1299 | .release_pmd = xen_release_pte_init, | ||
| 1300 | |||
| 1301 | #ifdef CONFIG_HIGHPTE | ||
| 1302 | .kmap_atomic_pte = xen_kmap_atomic_pte, | ||
| 1303 | #endif | ||
| 1304 | |||
| 1305 | #ifdef CONFIG_X86_64 | ||
| 1306 | .set_pte = xen_set_pte, | ||
| 1307 | #else | ||
| 1308 | .set_pte = xen_set_pte_init, | ||
| 1309 | #endif | ||
| 1310 | .set_pte_at = xen_set_pte_at, | ||
| 1311 | .set_pmd = xen_set_pmd_hyper, | ||
| 1312 | |||
| 1313 | .ptep_modify_prot_start = __ptep_modify_prot_start, | ||
| 1314 | .ptep_modify_prot_commit = __ptep_modify_prot_commit, | ||
| 1315 | |||
| 1316 | .pte_val = xen_pte_val, | ||
| 1317 | .pte_flags = native_pte_flags, | ||
| 1318 | .pgd_val = xen_pgd_val, | ||
| 1319 | |||
| 1320 | .make_pte = xen_make_pte, | ||
| 1321 | .make_pgd = xen_make_pgd, | ||
| 1322 | |||
| 1323 | #ifdef CONFIG_X86_PAE | ||
| 1324 | .set_pte_atomic = xen_set_pte_atomic, | ||
| 1325 | .set_pte_present = xen_set_pte_at, | ||
| 1326 | .pte_clear = xen_pte_clear, | ||
| 1327 | .pmd_clear = xen_pmd_clear, | ||
| 1328 | #endif /* CONFIG_X86_PAE */ | ||
| 1329 | .set_pud = xen_set_pud_hyper, | ||
| 1330 | |||
| 1331 | .make_pmd = xen_make_pmd, | ||
| 1332 | .pmd_val = xen_pmd_val, | ||
| 1333 | |||
| 1334 | #if PAGETABLE_LEVELS == 4 | ||
| 1335 | .pud_val = xen_pud_val, | ||
| 1336 | .make_pud = xen_make_pud, | ||
| 1337 | .set_pgd = xen_set_pgd_hyper, | ||
| 1338 | |||
| 1339 | .alloc_pud = xen_alloc_pte_init, | ||
| 1340 | .release_pud = xen_release_pte_init, | ||
| 1341 | #endif /* PAGETABLE_LEVELS == 4 */ | ||
| 1342 | |||
| 1343 | .activate_mm = xen_activate_mm, | ||
| 1344 | .dup_mmap = xen_dup_mmap, | ||
| 1345 | .exit_mmap = xen_exit_mmap, | ||
| 1346 | |||
| 1347 | .lazy_mode = { | ||
| 1348 | .enter = paravirt_enter_lazy_mmu, | ||
| 1349 | .leave = xen_leave_lazy, | ||
| 1350 | }, | ||
| 1351 | |||
| 1352 | .set_fixmap = xen_set_fixmap, | ||
| 1353 | }; | ||
| 1354 | |||
| 1355 | static void xen_reboot(int reason) | 832 | static void xen_reboot(int reason) |
| 1356 | { | 833 | { |
| 1357 | struct sched_shutdown r = { .reason = reason }; | 834 | struct sched_shutdown r = { .reason = reason }; |
| @@ -1394,223 +871,6 @@ static const struct machine_ops __initdata xen_machine_ops = { | |||
| 1394 | }; | 871 | }; |
| 1395 | 872 | ||
| 1396 | 873 | ||
| 1397 | static void __init xen_reserve_top(void) | ||
| 1398 | { | ||
| 1399 | #ifdef CONFIG_X86_32 | ||
| 1400 | unsigned long top = HYPERVISOR_VIRT_START; | ||
| 1401 | struct xen_platform_parameters pp; | ||
| 1402 | |||
| 1403 | if (HYPERVISOR_xen_version(XENVER_platform_parameters, &pp) == 0) | ||
| 1404 | top = pp.virt_start; | ||
| 1405 | |||
| 1406 | reserve_top_address(-top); | ||
| 1407 | #endif /* CONFIG_X86_32 */ | ||
| 1408 | } | ||
| 1409 | |||
| 1410 | /* | ||
| 1411 | * Like __va(), but returns address in the kernel mapping (which is | ||
| 1412 | * all we have until the physical memory mapping has been set up. | ||
| 1413 | */ | ||
| 1414 | static void *__ka(phys_addr_t paddr) | ||
| 1415 | { | ||
| 1416 | #ifdef CONFIG_X86_64 | ||
| 1417 | return (void *)(paddr + __START_KERNEL_map); | ||
| 1418 | #else | ||
| 1419 | return __va(paddr); | ||
| 1420 | #endif | ||
| 1421 | } | ||
| 1422 | |||
| 1423 | /* Convert a machine address to physical address */ | ||
| 1424 | static unsigned long m2p(phys_addr_t maddr) | ||
| 1425 | { | ||
| 1426 | phys_addr_t paddr; | ||
| 1427 | |||
| 1428 | maddr &= PTE_PFN_MASK; | ||
| 1429 | paddr = mfn_to_pfn(maddr >> PAGE_SHIFT) << PAGE_SHIFT; | ||
| 1430 | |||
| 1431 | return paddr; | ||
| 1432 | } | ||
| 1433 | |||
| 1434 | /* Convert a machine address to kernel virtual */ | ||
| 1435 | static void *m2v(phys_addr_t maddr) | ||
| 1436 | { | ||
| 1437 | return __ka(m2p(maddr)); | ||
| 1438 | } | ||
| 1439 | |||
| 1440 | static void set_page_prot(void *addr, pgprot_t prot) | ||
| 1441 | { | ||
| 1442 | unsigned long pfn = __pa(addr) >> PAGE_SHIFT; | ||
| 1443 | pte_t pte = pfn_pte(pfn, prot); | ||
| 1444 | |||
| 1445 | if (HYPERVISOR_update_va_mapping((unsigned long)addr, pte, 0)) | ||
| 1446 | BUG(); | ||
| 1447 | } | ||
| 1448 | |||
| 1449 | static __init void xen_map_identity_early(pmd_t *pmd, unsigned long max_pfn) | ||
| 1450 | { | ||
| 1451 | unsigned pmdidx, pteidx; | ||
| 1452 | unsigned ident_pte; | ||
| 1453 | unsigned long pfn; | ||
| 1454 | |||
| 1455 | ident_pte = 0; | ||
| 1456 | pfn = 0; | ||
| 1457 | for (pmdidx = 0; pmdidx < PTRS_PER_PMD && pfn < max_pfn; pmdidx++) { | ||
| 1458 | pte_t *pte_page; | ||
| 1459 | |||
| 1460 | /* Reuse or allocate a page of ptes */ | ||
| 1461 | if (pmd_present(pmd[pmdidx])) | ||
| 1462 | pte_page = m2v(pmd[pmdidx].pmd); | ||
| 1463 | else { | ||
| 1464 | /* Check for free pte pages */ | ||
| 1465 | if (ident_pte == ARRAY_SIZE(level1_ident_pgt)) | ||
| 1466 | break; | ||
| 1467 | |||
| 1468 | pte_page = &level1_ident_pgt[ident_pte]; | ||
| 1469 | ident_pte += PTRS_PER_PTE; | ||
| 1470 | |||
| 1471 | pmd[pmdidx] = __pmd(__pa(pte_page) | _PAGE_TABLE); | ||
| 1472 | } | ||
| 1473 | |||
| 1474 | /* Install mappings */ | ||
| 1475 | for (pteidx = 0; pteidx < PTRS_PER_PTE; pteidx++, pfn++) { | ||
| 1476 | pte_t pte; | ||
| 1477 | |||
| 1478 | if (pfn > max_pfn_mapped) | ||
| 1479 | max_pfn_mapped = pfn; | ||
| 1480 | |||
| 1481 | if (!pte_none(pte_page[pteidx])) | ||
| 1482 | continue; | ||
| 1483 | |||
| 1484 | pte = pfn_pte(pfn, PAGE_KERNEL_EXEC); | ||
| 1485 | pte_page[pteidx] = pte; | ||
| 1486 | } | ||
| 1487 | } | ||
| 1488 | |||
| 1489 | for (pteidx = 0; pteidx < ident_pte; pteidx += PTRS_PER_PTE) | ||
| 1490 | set_page_prot(&level1_ident_pgt[pteidx], PAGE_KERNEL_RO); | ||
| 1491 | |||
| 1492 | set_page_prot(pmd, PAGE_KERNEL_RO); | ||
| 1493 | } | ||
| 1494 | |||
| 1495 | #ifdef CONFIG_X86_64 | ||
| 1496 | static void convert_pfn_mfn(void *v) | ||
| 1497 | { | ||
| 1498 | pte_t *pte = v; | ||
| 1499 | int i; | ||
| 1500 | |||
| 1501 | /* All levels are converted the same way, so just treat them | ||
| 1502 | as ptes. */ | ||
| 1503 | for (i = 0; i < PTRS_PER_PTE; i++) | ||
| 1504 | pte[i] = xen_make_pte(pte[i].pte); | ||
| 1505 | } | ||
| 1506 | |||
| 1507 | /* | ||
| 1508 | * Set up the inital kernel pagetable. | ||
| 1509 | * | ||
| 1510 | * We can construct this by grafting the Xen provided pagetable into | ||
| 1511 | * head_64.S's preconstructed pagetables. We copy the Xen L2's into | ||
| 1512 | * level2_ident_pgt, level2_kernel_pgt and level2_fixmap_pgt. This | ||
| 1513 | * means that only the kernel has a physical mapping to start with - | ||
| 1514 | * but that's enough to get __va working. We need to fill in the rest | ||
| 1515 | * of the physical mapping once some sort of allocator has been set | ||
| 1516 | * up. | ||
| 1517 | */ | ||
| 1518 | static __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, | ||
| 1519 | unsigned long max_pfn) | ||
| 1520 | { | ||
| 1521 | pud_t *l3; | ||
| 1522 | pmd_t *l2; | ||
| 1523 | |||
| 1524 | /* Zap identity mapping */ | ||
| 1525 | init_level4_pgt[0] = __pgd(0); | ||
| 1526 | |||
| 1527 | /* Pre-constructed entries are in pfn, so convert to mfn */ | ||
| 1528 | convert_pfn_mfn(init_level4_pgt); | ||
| 1529 | convert_pfn_mfn(level3_ident_pgt); | ||
| 1530 | convert_pfn_mfn(level3_kernel_pgt); | ||
| 1531 | |||
| 1532 | l3 = m2v(pgd[pgd_index(__START_KERNEL_map)].pgd); | ||
| 1533 | l2 = m2v(l3[pud_index(__START_KERNEL_map)].pud); | ||
| 1534 | |||
| 1535 | memcpy(level2_ident_pgt, l2, sizeof(pmd_t) * PTRS_PER_PMD); | ||
| 1536 | memcpy(level2_kernel_pgt, l2, sizeof(pmd_t) * PTRS_PER_PMD); | ||
| 1537 | |||
| 1538 | l3 = m2v(pgd[pgd_index(__START_KERNEL_map + PMD_SIZE)].pgd); | ||
| 1539 | l2 = m2v(l3[pud_index(__START_KERNEL_map + PMD_SIZE)].pud); | ||
| 1540 | memcpy(level2_fixmap_pgt, l2, sizeof(pmd_t) * PTRS_PER_PMD); | ||
| 1541 | |||
| 1542 | /* Set up identity map */ | ||
| 1543 | xen_map_identity_early(level2_ident_pgt, max_pfn); | ||
| 1544 | |||
| 1545 | /* Make pagetable pieces RO */ | ||
| 1546 | set_page_prot(init_level4_pgt, PAGE_KERNEL_RO); | ||
| 1547 | set_page_prot(level3_ident_pgt, PAGE_KERNEL_RO); | ||
| 1548 | set_page_prot(level3_kernel_pgt, PAGE_KERNEL_RO); | ||
| 1549 | set_page_prot(level3_user_vsyscall, PAGE_KERNEL_RO); | ||
| 1550 | set_page_prot(level2_kernel_pgt, PAGE_KERNEL_RO); | ||
| 1551 | set_page_prot(level2_fixmap_pgt, PAGE_KERNEL_RO); | ||
| 1552 | |||
| 1553 | /* Pin down new L4 */ | ||
| 1554 | pin_pagetable_pfn(MMUEXT_PIN_L4_TABLE, | ||
| 1555 | PFN_DOWN(__pa_symbol(init_level4_pgt))); | ||
| 1556 | |||
| 1557 | /* Unpin Xen-provided one */ | ||
| 1558 | pin_pagetable_pfn(MMUEXT_UNPIN_TABLE, PFN_DOWN(__pa(pgd))); | ||
| 1559 | |||
| 1560 | /* Switch over */ | ||
| 1561 | pgd = init_level4_pgt; | ||
| 1562 | |||
| 1563 | /* | ||
| 1564 | * At this stage there can be no user pgd, and no page | ||
| 1565 | * structure to attach it to, so make sure we just set kernel | ||
| 1566 | * pgd. | ||
| 1567 | */ | ||
| 1568 | xen_mc_batch(); | ||
| 1569 | __xen_write_cr3(true, __pa(pgd)); | ||
| 1570 | xen_mc_issue(PARAVIRT_LAZY_CPU); | ||
| 1571 | |||
| 1572 | reserve_early(__pa(xen_start_info->pt_base), | ||
| 1573 | __pa(xen_start_info->pt_base + | ||
| 1574 | xen_start_info->nr_pt_frames * PAGE_SIZE), | ||
| 1575 | "XEN PAGETABLES"); | ||
| 1576 | |||
| 1577 | return pgd; | ||
| 1578 | } | ||
| 1579 | #else /* !CONFIG_X86_64 */ | ||
| 1580 | static pmd_t level2_kernel_pgt[PTRS_PER_PMD] __page_aligned_bss; | ||
| 1581 | |||
| 1582 | static __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, | ||
| 1583 | unsigned long max_pfn) | ||
| 1584 | { | ||
| 1585 | pmd_t *kernel_pmd; | ||
| 1586 | |||
| 1587 | init_pg_tables_start = __pa(pgd); | ||
| 1588 | init_pg_tables_end = __pa(pgd) + xen_start_info->nr_pt_frames*PAGE_SIZE; | ||
| 1589 | max_pfn_mapped = PFN_DOWN(init_pg_tables_end + 512*1024); | ||
| 1590 | |||
| 1591 | kernel_pmd = m2v(pgd[KERNEL_PGD_BOUNDARY].pgd); | ||
| 1592 | memcpy(level2_kernel_pgt, kernel_pmd, sizeof(pmd_t) * PTRS_PER_PMD); | ||
| 1593 | |||
| 1594 | xen_map_identity_early(level2_kernel_pgt, max_pfn); | ||
| 1595 | |||
| 1596 | memcpy(swapper_pg_dir, pgd, sizeof(pgd_t) * PTRS_PER_PGD); | ||
| 1597 | set_pgd(&swapper_pg_dir[KERNEL_PGD_BOUNDARY], | ||
| 1598 | __pgd(__pa(level2_kernel_pgt) | _PAGE_PRESENT)); | ||
| 1599 | |||
| 1600 | set_page_prot(level2_kernel_pgt, PAGE_KERNEL_RO); | ||
| 1601 | set_page_prot(swapper_pg_dir, PAGE_KERNEL_RO); | ||
| 1602 | set_page_prot(empty_zero_page, PAGE_KERNEL_RO); | ||
| 1603 | |||
| 1604 | pin_pagetable_pfn(MMUEXT_UNPIN_TABLE, PFN_DOWN(__pa(pgd))); | ||
| 1605 | |||
| 1606 | xen_write_cr3(__pa(swapper_pg_dir)); | ||
| 1607 | |||
| 1608 | pin_pagetable_pfn(MMUEXT_PIN_L3_TABLE, PFN_DOWN(__pa(swapper_pg_dir))); | ||
| 1609 | |||
| 1610 | return swapper_pg_dir; | ||
| 1611 | } | ||
| 1612 | #endif /* CONFIG_X86_64 */ | ||
| 1613 | |||
| 1614 | /* First C function to be called on Xen boot */ | 874 | /* First C function to be called on Xen boot */ |
| 1615 | asmlinkage void __init xen_start_kernel(void) | 875 | asmlinkage void __init xen_start_kernel(void) |
| 1616 | { | 876 | { |
| @@ -1639,7 +899,7 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 1639 | /* | 899 | /* |
| 1640 | * set up the basic apic ops. | 900 | * set up the basic apic ops. |
| 1641 | */ | 901 | */ |
| 1642 | apic_ops = &xen_basic_apic_ops; | 902 | set_xen_basic_apic_ops(); |
| 1643 | #endif | 903 | #endif |
| 1644 | 904 | ||
| 1645 | if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { | 905 | if (xen_feature(XENFEAT_mmu_pt_update_preserve_ad)) { |
| @@ -1650,10 +910,18 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 1650 | machine_ops = xen_machine_ops; | 910 | machine_ops = xen_machine_ops; |
| 1651 | 911 | ||
| 1652 | #ifdef CONFIG_X86_64 | 912 | #ifdef CONFIG_X86_64 |
| 1653 | /* Disable until direct per-cpu data access. */ | 913 | /* |
| 1654 | have_vcpu_info_placement = 0; | 914 | * Setup percpu state. We only need to do this for 64-bit |
| 1655 | x86_64_init_pda(); | 915 | * because 32-bit already has %fs set properly. |
| 916 | */ | ||
| 917 | load_percpu_segment(0); | ||
| 1656 | #endif | 918 | #endif |
| 919 | /* | ||
| 920 | * The only reliable way to retain the initial address of the | ||
| 921 | * percpu gdt_page is to remember it here, so we can go and | ||
| 922 | * mark it RW later, when the initial percpu area is freed. | ||
| 923 | */ | ||
| 924 | xen_initial_gdt = &per_cpu(gdt_page, 0); | ||
| 1657 | 925 | ||
| 1658 | xen_smp_init(); | 926 | xen_smp_init(); |
| 1659 | 927 | ||
diff --git a/arch/x86/xen/irq.c b/arch/x86/xen/irq.c index bb042608c602..cfd17799bd6d 100644 --- a/arch/x86/xen/irq.c +++ b/arch/x86/xen/irq.c | |||
| @@ -19,27 +19,12 @@ void xen_force_evtchn_callback(void) | |||
| 19 | (void)HYPERVISOR_xen_version(0, NULL); | 19 | (void)HYPERVISOR_xen_version(0, NULL); |
| 20 | } | 20 | } |
| 21 | 21 | ||
| 22 | static void __init __xen_init_IRQ(void) | ||
| 23 | { | ||
| 24 | int i; | ||
| 25 | |||
| 26 | /* Create identity vector->irq map */ | ||
| 27 | for(i = 0; i < NR_VECTORS; i++) { | ||
| 28 | int cpu; | ||
| 29 | |||
| 30 | for_each_possible_cpu(cpu) | ||
| 31 | per_cpu(vector_irq, cpu)[i] = i; | ||
| 32 | } | ||
| 33 | |||
| 34 | xen_init_IRQ(); | ||
| 35 | } | ||
| 36 | |||
| 37 | static unsigned long xen_save_fl(void) | 22 | static unsigned long xen_save_fl(void) |
| 38 | { | 23 | { |
| 39 | struct vcpu_info *vcpu; | 24 | struct vcpu_info *vcpu; |
| 40 | unsigned long flags; | 25 | unsigned long flags; |
| 41 | 26 | ||
| 42 | vcpu = x86_read_percpu(xen_vcpu); | 27 | vcpu = percpu_read(xen_vcpu); |
| 43 | 28 | ||
| 44 | /* flag has opposite sense of mask */ | 29 | /* flag has opposite sense of mask */ |
| 45 | flags = !vcpu->evtchn_upcall_mask; | 30 | flags = !vcpu->evtchn_upcall_mask; |
| @@ -50,6 +35,7 @@ static unsigned long xen_save_fl(void) | |||
| 50 | */ | 35 | */ |
| 51 | return (-flags) & X86_EFLAGS_IF; | 36 | return (-flags) & X86_EFLAGS_IF; |
| 52 | } | 37 | } |
| 38 | PV_CALLEE_SAVE_REGS_THUNK(xen_save_fl); | ||
| 53 | 39 | ||
| 54 | static void xen_restore_fl(unsigned long flags) | 40 | static void xen_restore_fl(unsigned long flags) |
| 55 | { | 41 | { |
| @@ -62,7 +48,7 @@ static void xen_restore_fl(unsigned long flags) | |||
| 62 | make sure we're don't switch CPUs between getting the vcpu | 48 | make sure we're don't switch CPUs between getting the vcpu |
| 63 | pointer and updating the mask. */ | 49 | pointer and updating the mask. */ |
| 64 | preempt_disable(); | 50 | preempt_disable(); |
| 65 | vcpu = x86_read_percpu(xen_vcpu); | 51 | vcpu = percpu_read(xen_vcpu); |
| 66 | vcpu->evtchn_upcall_mask = flags; | 52 | vcpu->evtchn_upcall_mask = flags; |
| 67 | preempt_enable_no_resched(); | 53 | preempt_enable_no_resched(); |
| 68 | 54 | ||
| @@ -76,6 +62,7 @@ static void xen_restore_fl(unsigned long flags) | |||
| 76 | xen_force_evtchn_callback(); | 62 | xen_force_evtchn_callback(); |
| 77 | } | 63 | } |
| 78 | } | 64 | } |
| 65 | PV_CALLEE_SAVE_REGS_THUNK(xen_restore_fl); | ||
| 79 | 66 | ||
| 80 | static void xen_irq_disable(void) | 67 | static void xen_irq_disable(void) |
| 81 | { | 68 | { |
| @@ -83,9 +70,10 @@ static void xen_irq_disable(void) | |||
| 83 | make sure we're don't switch CPUs between getting the vcpu | 70 | make sure we're don't switch CPUs between getting the vcpu |
| 84 | pointer and updating the mask. */ | 71 | pointer and updating the mask. */ |
| 85 | preempt_disable(); | 72 | preempt_disable(); |
| 86 | x86_read_percpu(xen_vcpu)->evtchn_upcall_mask = 1; | 73 | percpu_read(xen_vcpu)->evtchn_upcall_mask = 1; |
| 87 | preempt_enable_no_resched(); | 74 | preempt_enable_no_resched(); |
| 88 | } | 75 | } |
| 76 | PV_CALLEE_SAVE_REGS_THUNK(xen_irq_disable); | ||
| 89 | 77 | ||
| 90 | static void xen_irq_enable(void) | 78 | static void xen_irq_enable(void) |
| 91 | { | 79 | { |
| @@ -96,7 +84,7 @@ static void xen_irq_enable(void) | |||
| 96 | the caller is confused and is trying to re-enable interrupts | 84 | the caller is confused and is trying to re-enable interrupts |
| 97 | on an indeterminate processor. */ | 85 | on an indeterminate processor. */ |
| 98 | 86 | ||
| 99 | vcpu = x86_read_percpu(xen_vcpu); | 87 | vcpu = percpu_read(xen_vcpu); |
| 100 | vcpu->evtchn_upcall_mask = 0; | 88 | vcpu->evtchn_upcall_mask = 0; |
| 101 | 89 | ||
| 102 | /* Doesn't matter if we get preempted here, because any | 90 | /* Doesn't matter if we get preempted here, because any |
| @@ -106,6 +94,7 @@ static void xen_irq_enable(void) | |||
| 106 | if (unlikely(vcpu->evtchn_upcall_pending)) | 94 | if (unlikely(vcpu->evtchn_upcall_pending)) |
| 107 | xen_force_evtchn_callback(); | 95 | xen_force_evtchn_callback(); |
| 108 | } | 96 | } |
| 97 | PV_CALLEE_SAVE_REGS_THUNK(xen_irq_enable); | ||
| 109 | 98 | ||
| 110 | static void xen_safe_halt(void) | 99 | static void xen_safe_halt(void) |
| 111 | { | 100 | { |
| @@ -123,11 +112,13 @@ static void xen_halt(void) | |||
| 123 | } | 112 | } |
| 124 | 113 | ||
| 125 | static const struct pv_irq_ops xen_irq_ops __initdata = { | 114 | static const struct pv_irq_ops xen_irq_ops __initdata = { |
| 126 | .init_IRQ = __xen_init_IRQ, | 115 | .init_IRQ = xen_init_IRQ, |
| 127 | .save_fl = xen_save_fl, | 116 | |
| 128 | .restore_fl = xen_restore_fl, | 117 | .save_fl = PV_CALLEE_SAVE(xen_save_fl), |
| 129 | .irq_disable = xen_irq_disable, | 118 | .restore_fl = PV_CALLEE_SAVE(xen_restore_fl), |
| 130 | .irq_enable = xen_irq_enable, | 119 | .irq_disable = PV_CALLEE_SAVE(xen_irq_disable), |
| 120 | .irq_enable = PV_CALLEE_SAVE(xen_irq_enable), | ||
| 121 | |||
| 131 | .safe_halt = xen_safe_halt, | 122 | .safe_halt = xen_safe_halt, |
| 132 | .halt = xen_halt, | 123 | .halt = xen_halt, |
| 133 | #ifdef CONFIG_X86_64 | 124 | #ifdef CONFIG_X86_64 |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 503c240e26c7..319bd40a57c2 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -47,6 +47,7 @@ | |||
| 47 | #include <asm/tlbflush.h> | 47 | #include <asm/tlbflush.h> |
| 48 | #include <asm/fixmap.h> | 48 | #include <asm/fixmap.h> |
| 49 | #include <asm/mmu_context.h> | 49 | #include <asm/mmu_context.h> |
| 50 | #include <asm/setup.h> | ||
| 50 | #include <asm/paravirt.h> | 51 | #include <asm/paravirt.h> |
| 51 | #include <asm/linkage.h> | 52 | #include <asm/linkage.h> |
| 52 | 53 | ||
| @@ -55,6 +56,8 @@ | |||
| 55 | 56 | ||
| 56 | #include <xen/page.h> | 57 | #include <xen/page.h> |
| 57 | #include <xen/interface/xen.h> | 58 | #include <xen/interface/xen.h> |
| 59 | #include <xen/interface/version.h> | ||
| 60 | #include <xen/hvc-console.h> | ||
| 58 | 61 | ||
| 59 | #include "multicalls.h" | 62 | #include "multicalls.h" |
| 60 | #include "mmu.h" | 63 | #include "mmu.h" |
| @@ -114,6 +117,37 @@ static inline void check_zero(void) | |||
| 114 | 117 | ||
| 115 | #endif /* CONFIG_XEN_DEBUG_FS */ | 118 | #endif /* CONFIG_XEN_DEBUG_FS */ |
| 116 | 119 | ||
| 120 | |||
| 121 | /* | ||
| 122 | * Identity map, in addition to plain kernel map. This needs to be | ||
| 123 | * large enough to allocate page table pages to allocate the rest. | ||
| 124 | * Each page can map 2MB. | ||
| 125 | */ | ||
| 126 | static pte_t level1_ident_pgt[PTRS_PER_PTE * 4] __page_aligned_bss; | ||
| 127 | |||
| 128 | #ifdef CONFIG_X86_64 | ||
| 129 | /* l3 pud for userspace vsyscall mapping */ | ||
| 130 | static pud_t level3_user_vsyscall[PTRS_PER_PUD] __page_aligned_bss; | ||
| 131 | #endif /* CONFIG_X86_64 */ | ||
| 132 | |||
| 133 | /* | ||
| 134 | * Note about cr3 (pagetable base) values: | ||
| 135 | * | ||
| 136 | * xen_cr3 contains the current logical cr3 value; it contains the | ||
| 137 | * last set cr3. This may not be the current effective cr3, because | ||
| 138 | * its update may be being lazily deferred. However, a vcpu looking | ||
| 139 | * at its own cr3 can use this value knowing that it everything will | ||
| 140 | * be self-consistent. | ||
| 141 | * | ||
| 142 | * xen_current_cr3 contains the actual vcpu cr3; it is set once the | ||
| 143 | * hypercall to set the vcpu cr3 is complete (so it may be a little | ||
| 144 | * out of date, but it will never be set early). If one vcpu is | ||
| 145 | * looking at another vcpu's cr3 value, it should use this variable. | ||
| 146 | */ | ||
| 147 | DEFINE_PER_CPU(unsigned long, xen_cr3); /* cr3 stored as physaddr */ | ||
| 148 | DEFINE_PER_CPU(unsigned long, xen_current_cr3); /* actual vcpu cr3 */ | ||
| 149 | |||
| 150 | |||
| 117 | /* | 151 | /* |
| 118 | * Just beyond the highest usermode address. STACK_TOP_MAX has a | 152 | * Just beyond the highest usermode address. STACK_TOP_MAX has a |
| 119 | * redzone above it, so round it up to a PGD boundary. | 153 | * redzone above it, so round it up to a PGD boundary. |
| @@ -458,28 +492,33 @@ pteval_t xen_pte_val(pte_t pte) | |||
| 458 | { | 492 | { |
| 459 | return pte_mfn_to_pfn(pte.pte); | 493 | return pte_mfn_to_pfn(pte.pte); |
| 460 | } | 494 | } |
| 495 | PV_CALLEE_SAVE_REGS_THUNK(xen_pte_val); | ||
| 461 | 496 | ||
| 462 | pgdval_t xen_pgd_val(pgd_t pgd) | 497 | pgdval_t xen_pgd_val(pgd_t pgd) |
| 463 | { | 498 | { |
| 464 | return pte_mfn_to_pfn(pgd.pgd); | 499 | return pte_mfn_to_pfn(pgd.pgd); |
| 465 | } | 500 | } |
| 501 | PV_CALLEE_SAVE_REGS_THUNK(xen_pgd_val); | ||
| 466 | 502 | ||
| 467 | pte_t xen_make_pte(pteval_t pte) | 503 | pte_t xen_make_pte(pteval_t pte) |
| 468 | { | 504 | { |
| 469 | pte = pte_pfn_to_mfn(pte); | 505 | pte = pte_pfn_to_mfn(pte); |
| 470 | return native_make_pte(pte); | 506 | return native_make_pte(pte); |
| 471 | } | 507 | } |
| 508 | PV_CALLEE_SAVE_REGS_THUNK(xen_make_pte); | ||
| 472 | 509 | ||
| 473 | pgd_t xen_make_pgd(pgdval_t pgd) | 510 | pgd_t xen_make_pgd(pgdval_t pgd) |
| 474 | { | 511 | { |
| 475 | pgd = pte_pfn_to_mfn(pgd); | 512 | pgd = pte_pfn_to_mfn(pgd); |
| 476 | return native_make_pgd(pgd); | 513 | return native_make_pgd(pgd); |
| 477 | } | 514 | } |
| 515 | PV_CALLEE_SAVE_REGS_THUNK(xen_make_pgd); | ||
| 478 | 516 | ||
| 479 | pmdval_t xen_pmd_val(pmd_t pmd) | 517 | pmdval_t xen_pmd_val(pmd_t pmd) |
| 480 | { | 518 | { |
| 481 | return pte_mfn_to_pfn(pmd.pmd); | 519 | return pte_mfn_to_pfn(pmd.pmd); |
| 482 | } | 520 | } |
| 521 | PV_CALLEE_SAVE_REGS_THUNK(xen_pmd_val); | ||
| 483 | 522 | ||
| 484 | void xen_set_pud_hyper(pud_t *ptr, pud_t val) | 523 | void xen_set_pud_hyper(pud_t *ptr, pud_t val) |
| 485 | { | 524 | { |
| @@ -556,12 +595,14 @@ pmd_t xen_make_pmd(pmdval_t pmd) | |||
| 556 | pmd = pte_pfn_to_mfn(pmd); | 595 | pmd = pte_pfn_to_mfn(pmd); |
| 557 | return native_make_pmd(pmd); | 596 | return native_make_pmd(pmd); |
| 558 | } | 597 | } |
| 598 | PV_CALLEE_SAVE_REGS_THUNK(xen_make_pmd); | ||
| 559 | 599 | ||
| 560 | #if PAGETABLE_LEVELS == 4 | 600 | #if PAGETABLE_LEVELS == 4 |
| 561 | pudval_t xen_pud_val(pud_t pud) | 601 | pudval_t xen_pud_val(pud_t pud) |
| 562 | { | 602 | { |
| 563 | return pte_mfn_to_pfn(pud.pud); | 603 | return pte_mfn_to_pfn(pud.pud); |
| 564 | } | 604 | } |
| 605 | PV_CALLEE_SAVE_REGS_THUNK(xen_pud_val); | ||
| 565 | 606 | ||
| 566 | pud_t xen_make_pud(pudval_t pud) | 607 | pud_t xen_make_pud(pudval_t pud) |
| 567 | { | 608 | { |
| @@ -569,6 +610,7 @@ pud_t xen_make_pud(pudval_t pud) | |||
| 569 | 610 | ||
| 570 | return native_make_pud(pud); | 611 | return native_make_pud(pud); |
| 571 | } | 612 | } |
| 613 | PV_CALLEE_SAVE_REGS_THUNK(xen_make_pud); | ||
| 572 | 614 | ||
| 573 | pgd_t *xen_get_user_pgd(pgd_t *pgd) | 615 | pgd_t *xen_get_user_pgd(pgd_t *pgd) |
| 574 | { | 616 | { |
| @@ -1063,18 +1105,14 @@ static void drop_other_mm_ref(void *info) | |||
| 1063 | struct mm_struct *mm = info; | 1105 | struct mm_struct *mm = info; |
| 1064 | struct mm_struct *active_mm; | 1106 | struct mm_struct *active_mm; |
| 1065 | 1107 | ||
| 1066 | #ifdef CONFIG_X86_64 | 1108 | active_mm = percpu_read(cpu_tlbstate.active_mm); |
| 1067 | active_mm = read_pda(active_mm); | ||
| 1068 | #else | ||
| 1069 | active_mm = __get_cpu_var(cpu_tlbstate).active_mm; | ||
| 1070 | #endif | ||
| 1071 | 1109 | ||
| 1072 | if (active_mm == mm) | 1110 | if (active_mm == mm) |
| 1073 | leave_mm(smp_processor_id()); | 1111 | leave_mm(smp_processor_id()); |
| 1074 | 1112 | ||
| 1075 | /* If this cpu still has a stale cr3 reference, then make sure | 1113 | /* If this cpu still has a stale cr3 reference, then make sure |
| 1076 | it has been flushed. */ | 1114 | it has been flushed. */ |
| 1077 | if (x86_read_percpu(xen_current_cr3) == __pa(mm->pgd)) { | 1115 | if (percpu_read(xen_current_cr3) == __pa(mm->pgd)) { |
| 1078 | load_cr3(swapper_pg_dir); | 1116 | load_cr3(swapper_pg_dir); |
| 1079 | arch_flush_lazy_cpu_mode(); | 1117 | arch_flush_lazy_cpu_mode(); |
| 1080 | } | 1118 | } |
| @@ -1156,6 +1194,706 @@ void xen_exit_mmap(struct mm_struct *mm) | |||
| 1156 | spin_unlock(&mm->page_table_lock); | 1194 | spin_unlock(&mm->page_table_lock); |
| 1157 | } | 1195 | } |
| 1158 | 1196 | ||
| 1197 | static __init void xen_pagetable_setup_start(pgd_t *base) | ||
| 1198 | { | ||
| 1199 | } | ||
| 1200 | |||
| 1201 | static __init void xen_pagetable_setup_done(pgd_t *base) | ||
| 1202 | { | ||
| 1203 | xen_setup_shared_info(); | ||
| 1204 | } | ||
| 1205 | |||
| 1206 | static void xen_write_cr2(unsigned long cr2) | ||
| 1207 | { | ||
| 1208 | percpu_read(xen_vcpu)->arch.cr2 = cr2; | ||
| 1209 | } | ||
| 1210 | |||
| 1211 | static unsigned long xen_read_cr2(void) | ||
| 1212 | { | ||
| 1213 | return percpu_read(xen_vcpu)->arch.cr2; | ||
| 1214 | } | ||
| 1215 | |||
| 1216 | unsigned long xen_read_cr2_direct(void) | ||
| 1217 | { | ||
| 1218 | return percpu_read(xen_vcpu_info.arch.cr2); | ||
| 1219 | } | ||
| 1220 | |||
| 1221 | static void xen_flush_tlb(void) | ||
| 1222 | { | ||
| 1223 | struct mmuext_op *op; | ||
| 1224 | struct multicall_space mcs; | ||
| 1225 | |||
| 1226 | preempt_disable(); | ||
| 1227 | |||
| 1228 | mcs = xen_mc_entry(sizeof(*op)); | ||
| 1229 | |||
| 1230 | op = mcs.args; | ||
| 1231 | op->cmd = MMUEXT_TLB_FLUSH_LOCAL; | ||
| 1232 | MULTI_mmuext_op(mcs.mc, op, 1, NULL, DOMID_SELF); | ||
| 1233 | |||
| 1234 | xen_mc_issue(PARAVIRT_LAZY_MMU); | ||
| 1235 | |||
| 1236 | preempt_enable(); | ||
| 1237 | } | ||
| 1238 | |||
| 1239 | static void xen_flush_tlb_single(unsigned long addr) | ||
| 1240 | { | ||
| 1241 | struct mmuext_op *op; | ||
| 1242 | struct multicall_space mcs; | ||
| 1243 | |||
| 1244 | preempt_disable(); | ||
| 1245 | |||
| 1246 | mcs = xen_mc_entry(sizeof(*op)); | ||
| 1247 | op = mcs.args; | ||
| 1248 | op->cmd = MMUEXT_INVLPG_LOCAL; | ||
| 1249 | op->arg1.linear_addr = addr & PAGE_MASK; | ||
| 1250 | MULTI_mmuext_op(mcs.mc, op, 1, NULL, DOMID_SELF); | ||
| 1251 | |||
| 1252 | xen_mc_issue(PARAVIRT_LAZY_MMU); | ||
| 1253 | |||
| 1254 | preempt_enable(); | ||
| 1255 | } | ||
| 1256 | |||
| 1257 | static void xen_flush_tlb_others(const struct cpumask *cpus, | ||
| 1258 | struct mm_struct *mm, unsigned long va) | ||
| 1259 | { | ||
| 1260 | struct { | ||
| 1261 | struct mmuext_op op; | ||
| 1262 | DECLARE_BITMAP(mask, NR_CPUS); | ||
| 1263 | } *args; | ||
| 1264 | struct multicall_space mcs; | ||
| 1265 | |||
| 1266 | BUG_ON(cpumask_empty(cpus)); | ||
| 1267 | BUG_ON(!mm); | ||
| 1268 | |||
| 1269 | mcs = xen_mc_entry(sizeof(*args)); | ||
| 1270 | args = mcs.args; | ||
| 1271 | args->op.arg2.vcpumask = to_cpumask(args->mask); | ||
| 1272 | |||
| 1273 | /* Remove us, and any offline CPUS. */ | ||
| 1274 | cpumask_and(to_cpumask(args->mask), cpus, cpu_online_mask); | ||
| 1275 | cpumask_clear_cpu(smp_processor_id(), to_cpumask(args->mask)); | ||
| 1276 | |||
| 1277 | if (va == TLB_FLUSH_ALL) { | ||
| 1278 | args->op.cmd = MMUEXT_TLB_FLUSH_MULTI; | ||
| 1279 | } else { | ||
| 1280 | args->op.cmd = MMUEXT_INVLPG_MULTI; | ||
| 1281 | args->op.arg1.linear_addr = va; | ||
| 1282 | } | ||
| 1283 | |||
| 1284 | MULTI_mmuext_op(mcs.mc, &args->op, 1, NULL, DOMID_SELF); | ||
| 1285 | |||
| 1286 | xen_mc_issue(PARAVIRT_LAZY_MMU); | ||
| 1287 | } | ||
| 1288 | |||
| 1289 | static unsigned long xen_read_cr3(void) | ||
| 1290 | { | ||
| 1291 | return percpu_read(xen_cr3); | ||
| 1292 | } | ||
| 1293 | |||
| 1294 | static void set_current_cr3(void *v) | ||
| 1295 | { | ||
| 1296 | percpu_write(xen_current_cr3, (unsigned long)v); | ||
| 1297 | } | ||
| 1298 | |||
| 1299 | static void __xen_write_cr3(bool kernel, unsigned long cr3) | ||
| 1300 | { | ||
| 1301 | struct mmuext_op *op; | ||
| 1302 | struct multicall_space mcs; | ||
| 1303 | unsigned long mfn; | ||
| 1304 | |||
| 1305 | if (cr3) | ||
| 1306 | mfn = pfn_to_mfn(PFN_DOWN(cr3)); | ||
| 1307 | else | ||
| 1308 | mfn = 0; | ||
| 1309 | |||
| 1310 | WARN_ON(mfn == 0 && kernel); | ||
| 1311 | |||
| 1312 | mcs = __xen_mc_entry(sizeof(*op)); | ||
| 1313 | |||
| 1314 | op = mcs.args; | ||
| 1315 | op->cmd = kernel ? MMUEXT_NEW_BASEPTR : MMUEXT_NEW_USER_BASEPTR; | ||
| 1316 | op->arg1.mfn = mfn; | ||
| 1317 | |||
| 1318 | MULTI_mmuext_op(mcs.mc, op, 1, NULL, DOMID_SELF); | ||
| 1319 | |||
| 1320 | if (kernel) { | ||
| 1321 | percpu_write(xen_cr3, cr3); | ||
| 1322 | |||
| 1323 | /* Update xen_current_cr3 once the batch has actually | ||
| 1324 | been submitted. */ | ||
| 1325 | xen_mc_callback(set_current_cr3, (void *)cr3); | ||
| 1326 | } | ||
| 1327 | } | ||
| 1328 | |||
| 1329 | static void xen_write_cr3(unsigned long cr3) | ||
| 1330 | { | ||
| 1331 | BUG_ON(preemptible()); | ||
| 1332 | |||
| 1333 | xen_mc_batch(); /* disables interrupts */ | ||
| 1334 | |||
| 1335 | /* Update while interrupts are disabled, so its atomic with | ||
| 1336 | respect to ipis */ | ||
| 1337 | percpu_write(xen_cr3, cr3); | ||
| 1338 | |||
| 1339 | __xen_write_cr3(true, cr3); | ||
| 1340 | |||
| 1341 | #ifdef CONFIG_X86_64 | ||
| 1342 | { | ||
| 1343 | pgd_t *user_pgd = xen_get_user_pgd(__va(cr3)); | ||
| 1344 | if (user_pgd) | ||
| 1345 | __xen_write_cr3(false, __pa(user_pgd)); | ||
| 1346 | else | ||
| 1347 | __xen_write_cr3(false, 0); | ||
| 1348 | } | ||
| 1349 | #endif | ||
| 1350 | |||
| 1351 | xen_mc_issue(PARAVIRT_LAZY_CPU); /* interrupts restored */ | ||
| 1352 | } | ||
| 1353 | |||
| 1354 | static int xen_pgd_alloc(struct mm_struct *mm) | ||
| 1355 | { | ||
| 1356 | pgd_t *pgd = mm->pgd; | ||
| 1357 | int ret = 0; | ||
| 1358 | |||
| 1359 | BUG_ON(PagePinned(virt_to_page(pgd))); | ||
| 1360 | |||
| 1361 | #ifdef CONFIG_X86_64 | ||
| 1362 | { | ||
| 1363 | struct page *page = virt_to_page(pgd); | ||
| 1364 | pgd_t *user_pgd; | ||
| 1365 | |||
| 1366 | BUG_ON(page->private != 0); | ||
| 1367 | |||
| 1368 | ret = -ENOMEM; | ||
| 1369 | |||
| 1370 | user_pgd = (pgd_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO); | ||
| 1371 | page->private = (unsigned long)user_pgd; | ||
| 1372 | |||
| 1373 | if (user_pgd != NULL) { | ||
| 1374 | user_pgd[pgd_index(VSYSCALL_START)] = | ||
| 1375 | __pgd(__pa(level3_user_vsyscall) | _PAGE_TABLE); | ||
| 1376 | ret = 0; | ||
| 1377 | } | ||
| 1378 | |||
| 1379 | BUG_ON(PagePinned(virt_to_page(xen_get_user_pgd(pgd)))); | ||
| 1380 | } | ||
| 1381 | #endif | ||
| 1382 | |||
| 1383 | return ret; | ||
| 1384 | } | ||
| 1385 | |||
| 1386 | static void xen_pgd_free(struct mm_struct *mm, pgd_t *pgd) | ||
| 1387 | { | ||
| 1388 | #ifdef CONFIG_X86_64 | ||
| 1389 | pgd_t *user_pgd = xen_get_user_pgd(pgd); | ||
| 1390 | |||
| 1391 | if (user_pgd) | ||
| 1392 | free_page((unsigned long)user_pgd); | ||
| 1393 | #endif | ||
| 1394 | } | ||
| 1395 | |||
| 1396 | #ifdef CONFIG_HIGHPTE | ||
| 1397 | static void *xen_kmap_atomic_pte(struct page *page, enum km_type type) | ||
| 1398 | { | ||
| 1399 | pgprot_t prot = PAGE_KERNEL; | ||
| 1400 | |||
| 1401 | if (PagePinned(page)) | ||
| 1402 | prot = PAGE_KERNEL_RO; | ||
| 1403 | |||
| 1404 | if (0 && PageHighMem(page)) | ||
| 1405 | printk("mapping highpte %lx type %d prot %s\n", | ||
| 1406 | page_to_pfn(page), type, | ||
| 1407 | (unsigned long)pgprot_val(prot) & _PAGE_RW ? "WRITE" : "READ"); | ||
| 1408 | |||
| 1409 | return kmap_atomic_prot(page, type, prot); | ||
| 1410 | } | ||
| 1411 | #endif | ||
| 1412 | |||
| 1413 | #ifdef CONFIG_X86_32 | ||
| 1414 | static __init pte_t mask_rw_pte(pte_t *ptep, pte_t pte) | ||
| 1415 | { | ||
| 1416 | /* If there's an existing pte, then don't allow _PAGE_RW to be set */ | ||
| 1417 | if (pte_val_ma(*ptep) & _PAGE_PRESENT) | ||
| 1418 | pte = __pte_ma(((pte_val_ma(*ptep) & _PAGE_RW) | ~_PAGE_RW) & | ||
| 1419 | pte_val_ma(pte)); | ||
| 1420 | |||
| 1421 | return pte; | ||
| 1422 | } | ||
| 1423 | |||
| 1424 | /* Init-time set_pte while constructing initial pagetables, which | ||
| 1425 | doesn't allow RO pagetable pages to be remapped RW */ | ||
| 1426 | static __init void xen_set_pte_init(pte_t *ptep, pte_t pte) | ||
| 1427 | { | ||
| 1428 | pte = mask_rw_pte(ptep, pte); | ||
| 1429 | |||
| 1430 | xen_set_pte(ptep, pte); | ||
| 1431 | } | ||
| 1432 | #endif | ||
| 1433 | |||
| 1434 | /* Early in boot, while setting up the initial pagetable, assume | ||
| 1435 | everything is pinned. */ | ||
| 1436 | static __init void xen_alloc_pte_init(struct mm_struct *mm, unsigned long pfn) | ||
| 1437 | { | ||
| 1438 | #ifdef CONFIG_FLATMEM | ||
| 1439 | BUG_ON(mem_map); /* should only be used early */ | ||
| 1440 | #endif | ||
| 1441 | make_lowmem_page_readonly(__va(PFN_PHYS(pfn))); | ||
| 1442 | } | ||
| 1443 | |||
| 1444 | /* Early release_pte assumes that all pts are pinned, since there's | ||
| 1445 | only init_mm and anything attached to that is pinned. */ | ||
| 1446 | static void xen_release_pte_init(unsigned long pfn) | ||
| 1447 | { | ||
| 1448 | make_lowmem_page_readwrite(__va(PFN_PHYS(pfn))); | ||
| 1449 | } | ||
| 1450 | |||
| 1451 | static void pin_pagetable_pfn(unsigned cmd, unsigned long pfn) | ||
| 1452 | { | ||
| 1453 | struct mmuext_op op; | ||
| 1454 | op.cmd = cmd; | ||
| 1455 | op.arg1.mfn = pfn_to_mfn(pfn); | ||
| 1456 | if (HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF)) | ||
| 1457 | BUG(); | ||
| 1458 | } | ||
| 1459 | |||
| 1460 | /* This needs to make sure the new pte page is pinned iff its being | ||
| 1461 | attached to a pinned pagetable. */ | ||
| 1462 | static void xen_alloc_ptpage(struct mm_struct *mm, unsigned long pfn, unsigned level) | ||
| 1463 | { | ||
| 1464 | struct page *page = pfn_to_page(pfn); | ||
| 1465 | |||
| 1466 | if (PagePinned(virt_to_page(mm->pgd))) { | ||
| 1467 | SetPagePinned(page); | ||
| 1468 | |||
| 1469 | vm_unmap_aliases(); | ||
| 1470 | if (!PageHighMem(page)) { | ||
| 1471 | make_lowmem_page_readonly(__va(PFN_PHYS((unsigned long)pfn))); | ||
| 1472 | if (level == PT_PTE && USE_SPLIT_PTLOCKS) | ||
| 1473 | pin_pagetable_pfn(MMUEXT_PIN_L1_TABLE, pfn); | ||
| 1474 | } else { | ||
| 1475 | /* make sure there are no stray mappings of | ||
| 1476 | this page */ | ||
| 1477 | kmap_flush_unused(); | ||
| 1478 | } | ||
| 1479 | } | ||
| 1480 | } | ||
| 1481 | |||
| 1482 | static void xen_alloc_pte(struct mm_struct *mm, unsigned long pfn) | ||
| 1483 | { | ||
| 1484 | xen_alloc_ptpage(mm, pfn, PT_PTE); | ||
| 1485 | } | ||
| 1486 | |||
| 1487 | static void xen_alloc_pmd(struct mm_struct *mm, unsigned long pfn) | ||
| 1488 | { | ||
| 1489 | xen_alloc_ptpage(mm, pfn, PT_PMD); | ||
| 1490 | } | ||
| 1491 | |||
| 1492 | /* This should never happen until we're OK to use struct page */ | ||
| 1493 | static void xen_release_ptpage(unsigned long pfn, unsigned level) | ||
| 1494 | { | ||
| 1495 | struct page *page = pfn_to_page(pfn); | ||
| 1496 | |||
| 1497 | if (PagePinned(page)) { | ||
| 1498 | if (!PageHighMem(page)) { | ||
| 1499 | if (level == PT_PTE && USE_SPLIT_PTLOCKS) | ||
| 1500 | pin_pagetable_pfn(MMUEXT_UNPIN_TABLE, pfn); | ||
| 1501 | make_lowmem_page_readwrite(__va(PFN_PHYS(pfn))); | ||
| 1502 | } | ||
| 1503 | ClearPagePinned(page); | ||
| 1504 | } | ||
| 1505 | } | ||
| 1506 | |||
| 1507 | static void xen_release_pte(unsigned long pfn) | ||
| 1508 | { | ||
| 1509 | xen_release_ptpage(pfn, PT_PTE); | ||
| 1510 | } | ||
| 1511 | |||
| 1512 | static void xen_release_pmd(unsigned long pfn) | ||
| 1513 | { | ||
| 1514 | xen_release_ptpage(pfn, PT_PMD); | ||
| 1515 | } | ||
| 1516 | |||
| 1517 | #if PAGETABLE_LEVELS == 4 | ||
| 1518 | static void xen_alloc_pud(struct mm_struct *mm, unsigned long pfn) | ||
| 1519 | { | ||
| 1520 | xen_alloc_ptpage(mm, pfn, PT_PUD); | ||
| 1521 | } | ||
| 1522 | |||
| 1523 | static void xen_release_pud(unsigned long pfn) | ||
| 1524 | { | ||
| 1525 | xen_release_ptpage(pfn, PT_PUD); | ||
| 1526 | } | ||
| 1527 | #endif | ||
| 1528 | |||
| 1529 | void __init xen_reserve_top(void) | ||
| 1530 | { | ||
| 1531 | #ifdef CONFIG_X86_32 | ||
| 1532 | unsigned long top = HYPERVISOR_VIRT_START; | ||
| 1533 | struct xen_platform_parameters pp; | ||
| 1534 | |||
| 1535 | if (HYPERVISOR_xen_version(XENVER_platform_parameters, &pp) == 0) | ||
| 1536 | top = pp.virt_start; | ||
| 1537 | |||
| 1538 | reserve_top_address(-top); | ||
| 1539 | #endif /* CONFIG_X86_32 */ | ||
| 1540 | } | ||
| 1541 | |||
| 1542 | /* | ||
| 1543 | * Like __va(), but returns address in the kernel mapping (which is | ||
| 1544 | * all we have until the physical memory mapping has been set up. | ||
| 1545 | */ | ||
| 1546 | static void *__ka(phys_addr_t paddr) | ||
| 1547 | { | ||
| 1548 | #ifdef CONFIG_X86_64 | ||
| 1549 | return (void *)(paddr + __START_KERNEL_map); | ||
| 1550 | #else | ||
| 1551 | return __va(paddr); | ||
| 1552 | #endif | ||
| 1553 | } | ||
| 1554 | |||
| 1555 | /* Convert a machine address to physical address */ | ||
| 1556 | static unsigned long m2p(phys_addr_t maddr) | ||
| 1557 | { | ||
| 1558 | phys_addr_t paddr; | ||
| 1559 | |||
| 1560 | maddr &= PTE_PFN_MASK; | ||
| 1561 | paddr = mfn_to_pfn(maddr >> PAGE_SHIFT) << PAGE_SHIFT; | ||
| 1562 | |||
| 1563 | return paddr; | ||
| 1564 | } | ||
| 1565 | |||
| 1566 | /* Convert a machine address to kernel virtual */ | ||
| 1567 | static void *m2v(phys_addr_t maddr) | ||
| 1568 | { | ||
| 1569 | return __ka(m2p(maddr)); | ||
| 1570 | } | ||
| 1571 | |||
| 1572 | static void set_page_prot(void *addr, pgprot_t prot) | ||
| 1573 | { | ||
| 1574 | unsigned long pfn = __pa(addr) >> PAGE_SHIFT; | ||
| 1575 | pte_t pte = pfn_pte(pfn, prot); | ||
| 1576 | |||
| 1577 | if (HYPERVISOR_update_va_mapping((unsigned long)addr, pte, 0)) | ||
| 1578 | BUG(); | ||
| 1579 | } | ||
| 1580 | |||
| 1581 | static __init void xen_map_identity_early(pmd_t *pmd, unsigned long max_pfn) | ||
| 1582 | { | ||
| 1583 | unsigned pmdidx, pteidx; | ||
| 1584 | unsigned ident_pte; | ||
| 1585 | unsigned long pfn; | ||
| 1586 | |||
| 1587 | ident_pte = 0; | ||
| 1588 | pfn = 0; | ||
| 1589 | for (pmdidx = 0; pmdidx < PTRS_PER_PMD && pfn < max_pfn; pmdidx++) { | ||
| 1590 | pte_t *pte_page; | ||
| 1591 | |||
| 1592 | /* Reuse or allocate a page of ptes */ | ||
| 1593 | if (pmd_present(pmd[pmdidx])) | ||
| 1594 | pte_page = m2v(pmd[pmdidx].pmd); | ||
| 1595 | else { | ||
| 1596 | /* Check for free pte pages */ | ||
| 1597 | if (ident_pte == ARRAY_SIZE(level1_ident_pgt)) | ||
| 1598 | break; | ||
| 1599 | |||
| 1600 | pte_page = &level1_ident_pgt[ident_pte]; | ||
| 1601 | ident_pte += PTRS_PER_PTE; | ||
| 1602 | |||
| 1603 | pmd[pmdidx] = __pmd(__pa(pte_page) | _PAGE_TABLE); | ||
| 1604 | } | ||
| 1605 | |||
| 1606 | /* Install mappings */ | ||
| 1607 | for (pteidx = 0; pteidx < PTRS_PER_PTE; pteidx++, pfn++) { | ||
| 1608 | pte_t pte; | ||
| 1609 | |||
| 1610 | if (pfn > max_pfn_mapped) | ||
| 1611 | max_pfn_mapped = pfn; | ||
| 1612 | |||
| 1613 | if (!pte_none(pte_page[pteidx])) | ||
| 1614 | continue; | ||
| 1615 | |||
| 1616 | pte = pfn_pte(pfn, PAGE_KERNEL_EXEC); | ||
| 1617 | pte_page[pteidx] = pte; | ||
| 1618 | } | ||
| 1619 | } | ||
| 1620 | |||
| 1621 | for (pteidx = 0; pteidx < ident_pte; pteidx += PTRS_PER_PTE) | ||
| 1622 | set_page_prot(&level1_ident_pgt[pteidx], PAGE_KERNEL_RO); | ||
| 1623 | |||
| 1624 | set_page_prot(pmd, PAGE_KERNEL_RO); | ||
| 1625 | } | ||
| 1626 | |||
| 1627 | #ifdef CONFIG_X86_64 | ||
| 1628 | static void convert_pfn_mfn(void *v) | ||
| 1629 | { | ||
| 1630 | pte_t *pte = v; | ||
| 1631 | int i; | ||
| 1632 | |||
| 1633 | /* All levels are converted the same way, so just treat them | ||
| 1634 | as ptes. */ | ||
| 1635 | for (i = 0; i < PTRS_PER_PTE; i++) | ||
| 1636 | pte[i] = xen_make_pte(pte[i].pte); | ||
| 1637 | } | ||
| 1638 | |||
| 1639 | /* | ||
| 1640 | * Set up the inital kernel pagetable. | ||
| 1641 | * | ||
| 1642 | * We can construct this by grafting the Xen provided pagetable into | ||
| 1643 | * head_64.S's preconstructed pagetables. We copy the Xen L2's into | ||
| 1644 | * level2_ident_pgt, level2_kernel_pgt and level2_fixmap_pgt. This | ||
| 1645 | * means that only the kernel has a physical mapping to start with - | ||
| 1646 | * but that's enough to get __va working. We need to fill in the rest | ||
| 1647 | * of the physical mapping once some sort of allocator has been set | ||
| 1648 | * up. | ||
| 1649 | */ | ||
| 1650 | __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, | ||
| 1651 | unsigned long max_pfn) | ||
| 1652 | { | ||
| 1653 | pud_t *l3; | ||
| 1654 | pmd_t *l2; | ||
| 1655 | |||
| 1656 | /* Zap identity mapping */ | ||
| 1657 | init_level4_pgt[0] = __pgd(0); | ||
| 1658 | |||
| 1659 | /* Pre-constructed entries are in pfn, so convert to mfn */ | ||
| 1660 | convert_pfn_mfn(init_level4_pgt); | ||
| 1661 | convert_pfn_mfn(level3_ident_pgt); | ||
| 1662 | convert_pfn_mfn(level3_kernel_pgt); | ||
| 1663 | |||
| 1664 | l3 = m2v(pgd[pgd_index(__START_KERNEL_map)].pgd); | ||
| 1665 | l2 = m2v(l3[pud_index(__START_KERNEL_map)].pud); | ||
| 1666 | |||
| 1667 | memcpy(level2_ident_pgt, l2, sizeof(pmd_t) * PTRS_PER_PMD); | ||
| 1668 | memcpy(level2_kernel_pgt, l2, sizeof(pmd_t) * PTRS_PER_PMD); | ||
| 1669 | |||
| 1670 | l3 = m2v(pgd[pgd_index(__START_KERNEL_map + PMD_SIZE)].pgd); | ||
| 1671 | l2 = m2v(l3[pud_index(__START_KERNEL_map + PMD_SIZE)].pud); | ||
| 1672 | memcpy(level2_fixmap_pgt, l2, sizeof(pmd_t) * PTRS_PER_PMD); | ||
| 1673 | |||
| 1674 | /* Set up identity map */ | ||
| 1675 | xen_map_identity_early(level2_ident_pgt, max_pfn); | ||
| 1676 | |||
| 1677 | /* Make pagetable pieces RO */ | ||
| 1678 | set_page_prot(init_level4_pgt, PAGE_KERNEL_RO); | ||
| 1679 | set_page_prot(level3_ident_pgt, PAGE_KERNEL_RO); | ||
| 1680 | set_page_prot(level3_kernel_pgt, PAGE_KERNEL_RO); | ||
| 1681 | set_page_prot(level3_user_vsyscall, PAGE_KERNEL_RO); | ||
| 1682 | set_page_prot(level2_kernel_pgt, PAGE_KERNEL_RO); | ||
| 1683 | set_page_prot(level2_fixmap_pgt, PAGE_KERNEL_RO); | ||
| 1684 | |||
| 1685 | /* Pin down new L4 */ | ||
| 1686 | pin_pagetable_pfn(MMUEXT_PIN_L4_TABLE, | ||
| 1687 | PFN_DOWN(__pa_symbol(init_level4_pgt))); | ||
| 1688 | |||
| 1689 | /* Unpin Xen-provided one */ | ||
| 1690 | pin_pagetable_pfn(MMUEXT_UNPIN_TABLE, PFN_DOWN(__pa(pgd))); | ||
| 1691 | |||
| 1692 | /* Switch over */ | ||
| 1693 | pgd = init_level4_pgt; | ||
| 1694 | |||
| 1695 | /* | ||
| 1696 | * At this stage there can be no user pgd, and no page | ||
| 1697 | * structure to attach it to, so make sure we just set kernel | ||
| 1698 | * pgd. | ||
| 1699 | */ | ||
| 1700 | xen_mc_batch(); | ||
| 1701 | __xen_write_cr3(true, __pa(pgd)); | ||
| 1702 | xen_mc_issue(PARAVIRT_LAZY_CPU); | ||
| 1703 | |||
| 1704 | reserve_early(__pa(xen_start_info->pt_base), | ||
| 1705 | __pa(xen_start_info->pt_base + | ||
| 1706 | xen_start_info->nr_pt_frames * PAGE_SIZE), | ||
| 1707 | "XEN PAGETABLES"); | ||
| 1708 | |||
| 1709 | return pgd; | ||
| 1710 | } | ||
| 1711 | #else /* !CONFIG_X86_64 */ | ||
| 1712 | static pmd_t level2_kernel_pgt[PTRS_PER_PMD] __page_aligned_bss; | ||
| 1713 | |||
| 1714 | __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, | ||
| 1715 | unsigned long max_pfn) | ||
| 1716 | { | ||
| 1717 | pmd_t *kernel_pmd; | ||
| 1718 | |||
| 1719 | init_pg_tables_start = __pa(pgd); | ||
| 1720 | init_pg_tables_end = __pa(pgd) + xen_start_info->nr_pt_frames*PAGE_SIZE; | ||
| 1721 | max_pfn_mapped = PFN_DOWN(init_pg_tables_end + 512*1024); | ||
| 1722 | |||
| 1723 | kernel_pmd = m2v(pgd[KERNEL_PGD_BOUNDARY].pgd); | ||
| 1724 | memcpy(level2_kernel_pgt, kernel_pmd, sizeof(pmd_t) * PTRS_PER_PMD); | ||
| 1725 | |||
| 1726 | xen_map_identity_early(level2_kernel_pgt, max_pfn); | ||
| 1727 | |||
| 1728 | memcpy(swapper_pg_dir, pgd, sizeof(pgd_t) * PTRS_PER_PGD); | ||
| 1729 | set_pgd(&swapper_pg_dir[KERNEL_PGD_BOUNDARY], | ||
| 1730 | __pgd(__pa(level2_kernel_pgt) | _PAGE_PRESENT)); | ||
| 1731 | |||
| 1732 | set_page_prot(level2_kernel_pgt, PAGE_KERNEL_RO); | ||
| 1733 | set_page_prot(swapper_pg_dir, PAGE_KERNEL_RO); | ||
| 1734 | set_page_prot(empty_zero_page, PAGE_KERNEL_RO); | ||
| 1735 | |||
| 1736 | pin_pagetable_pfn(MMUEXT_UNPIN_TABLE, PFN_DOWN(__pa(pgd))); | ||
| 1737 | |||
| 1738 | xen_write_cr3(__pa(swapper_pg_dir)); | ||
| 1739 | |||
| 1740 | pin_pagetable_pfn(MMUEXT_PIN_L3_TABLE, PFN_DOWN(__pa(swapper_pg_dir))); | ||
| 1741 | |||
| 1742 | return swapper_pg_dir; | ||
| 1743 | } | ||
| 1744 | #endif /* CONFIG_X86_64 */ | ||
| 1745 | |||
| 1746 | static void xen_set_fixmap(unsigned idx, unsigned long phys, pgprot_t prot) | ||
| 1747 | { | ||
| 1748 | pte_t pte; | ||
| 1749 | |||
| 1750 | phys >>= PAGE_SHIFT; | ||
| 1751 | |||
| 1752 | switch (idx) { | ||
| 1753 | case FIX_BTMAP_END ... FIX_BTMAP_BEGIN: | ||
| 1754 | #ifdef CONFIG_X86_F00F_BUG | ||
| 1755 | case FIX_F00F_IDT: | ||
| 1756 | #endif | ||
| 1757 | #ifdef CONFIG_X86_32 | ||
| 1758 | case FIX_WP_TEST: | ||
| 1759 | case FIX_VDSO: | ||
| 1760 | # ifdef CONFIG_HIGHMEM | ||
| 1761 | case FIX_KMAP_BEGIN ... FIX_KMAP_END: | ||
| 1762 | # endif | ||
| 1763 | #else | ||
| 1764 | case VSYSCALL_LAST_PAGE ... VSYSCALL_FIRST_PAGE: | ||
| 1765 | #endif | ||
| 1766 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 1767 | case FIX_APIC_BASE: /* maps dummy local APIC */ | ||
| 1768 | #endif | ||
| 1769 | pte = pfn_pte(phys, prot); | ||
| 1770 | break; | ||
| 1771 | |||
| 1772 | default: | ||
| 1773 | pte = mfn_pte(phys, prot); | ||
| 1774 | break; | ||
| 1775 | } | ||
| 1776 | |||
| 1777 | __native_set_fixmap(idx, pte); | ||
| 1778 | |||
| 1779 | #ifdef CONFIG_X86_64 | ||
| 1780 | /* Replicate changes to map the vsyscall page into the user | ||
| 1781 | pagetable vsyscall mapping. */ | ||
| 1782 | if (idx >= VSYSCALL_LAST_PAGE && idx <= VSYSCALL_FIRST_PAGE) { | ||
| 1783 | unsigned long vaddr = __fix_to_virt(idx); | ||
| 1784 | set_pte_vaddr_pud(level3_user_vsyscall, vaddr, pte); | ||
| 1785 | } | ||
| 1786 | #endif | ||
| 1787 | } | ||
| 1788 | |||
| 1789 | __init void xen_post_allocator_init(void) | ||
| 1790 | { | ||
| 1791 | pv_mmu_ops.set_pte = xen_set_pte; | ||
| 1792 | pv_mmu_ops.set_pmd = xen_set_pmd; | ||
| 1793 | pv_mmu_ops.set_pud = xen_set_pud; | ||
| 1794 | #if PAGETABLE_LEVELS == 4 | ||
| 1795 | pv_mmu_ops.set_pgd = xen_set_pgd; | ||
| 1796 | #endif | ||
| 1797 | |||
| 1798 | /* This will work as long as patching hasn't happened yet | ||
| 1799 | (which it hasn't) */ | ||
| 1800 | pv_mmu_ops.alloc_pte = xen_alloc_pte; | ||
| 1801 | pv_mmu_ops.alloc_pmd = xen_alloc_pmd; | ||
| 1802 | pv_mmu_ops.release_pte = xen_release_pte; | ||
| 1803 | pv_mmu_ops.release_pmd = xen_release_pmd; | ||
| 1804 | #if PAGETABLE_LEVELS == 4 | ||
| 1805 | pv_mmu_ops.alloc_pud = xen_alloc_pud; | ||
| 1806 | pv_mmu_ops.release_pud = xen_release_pud; | ||
| 1807 | #endif | ||
| 1808 | |||
| 1809 | #ifdef CONFIG_X86_64 | ||
| 1810 | SetPagePinned(virt_to_page(level3_user_vsyscall)); | ||
| 1811 | #endif | ||
| 1812 | xen_mark_init_mm_pinned(); | ||
| 1813 | } | ||
| 1814 | |||
| 1815 | |||
| 1816 | const struct pv_mmu_ops xen_mmu_ops __initdata = { | ||
| 1817 | .pagetable_setup_start = xen_pagetable_setup_start, | ||
| 1818 | .pagetable_setup_done = xen_pagetable_setup_done, | ||
| 1819 | |||
| 1820 | .read_cr2 = xen_read_cr2, | ||
| 1821 | .write_cr2 = xen_write_cr2, | ||
| 1822 | |||
| 1823 | .read_cr3 = xen_read_cr3, | ||
| 1824 | .write_cr3 = xen_write_cr3, | ||
| 1825 | |||
| 1826 | .flush_tlb_user = xen_flush_tlb, | ||
| 1827 | .flush_tlb_kernel = xen_flush_tlb, | ||
| 1828 | .flush_tlb_single = xen_flush_tlb_single, | ||
| 1829 | .flush_tlb_others = xen_flush_tlb_others, | ||
| 1830 | |||
| 1831 | .pte_update = paravirt_nop, | ||
| 1832 | .pte_update_defer = paravirt_nop, | ||
| 1833 | |||
| 1834 | .pgd_alloc = xen_pgd_alloc, | ||
| 1835 | .pgd_free = xen_pgd_free, | ||
| 1836 | |||
| 1837 | .alloc_pte = xen_alloc_pte_init, | ||
| 1838 | .release_pte = xen_release_pte_init, | ||
| 1839 | .alloc_pmd = xen_alloc_pte_init, | ||
| 1840 | .alloc_pmd_clone = paravirt_nop, | ||
| 1841 | .release_pmd = xen_release_pte_init, | ||
| 1842 | |||
| 1843 | #ifdef CONFIG_HIGHPTE | ||
| 1844 | .kmap_atomic_pte = xen_kmap_atomic_pte, | ||
| 1845 | #endif | ||
| 1846 | |||
| 1847 | #ifdef CONFIG_X86_64 | ||
| 1848 | .set_pte = xen_set_pte, | ||
| 1849 | #else | ||
| 1850 | .set_pte = xen_set_pte_init, | ||
| 1851 | #endif | ||
| 1852 | .set_pte_at = xen_set_pte_at, | ||
| 1853 | .set_pmd = xen_set_pmd_hyper, | ||
| 1854 | |||
| 1855 | .ptep_modify_prot_start = __ptep_modify_prot_start, | ||
| 1856 | .ptep_modify_prot_commit = __ptep_modify_prot_commit, | ||
| 1857 | |||
| 1858 | .pte_val = PV_CALLEE_SAVE(xen_pte_val), | ||
| 1859 | .pgd_val = PV_CALLEE_SAVE(xen_pgd_val), | ||
| 1860 | |||
| 1861 | .make_pte = PV_CALLEE_SAVE(xen_make_pte), | ||
| 1862 | .make_pgd = PV_CALLEE_SAVE(xen_make_pgd), | ||
| 1863 | |||
| 1864 | #ifdef CONFIG_X86_PAE | ||
| 1865 | .set_pte_atomic = xen_set_pte_atomic, | ||
| 1866 | .set_pte_present = xen_set_pte_at, | ||
| 1867 | .pte_clear = xen_pte_clear, | ||
| 1868 | .pmd_clear = xen_pmd_clear, | ||
| 1869 | #endif /* CONFIG_X86_PAE */ | ||
| 1870 | .set_pud = xen_set_pud_hyper, | ||
| 1871 | |||
| 1872 | .make_pmd = PV_CALLEE_SAVE(xen_make_pmd), | ||
| 1873 | .pmd_val = PV_CALLEE_SAVE(xen_pmd_val), | ||
| 1874 | |||
| 1875 | #if PAGETABLE_LEVELS == 4 | ||
| 1876 | .pud_val = PV_CALLEE_SAVE(xen_pud_val), | ||
| 1877 | .make_pud = PV_CALLEE_SAVE(xen_make_pud), | ||
| 1878 | .set_pgd = xen_set_pgd_hyper, | ||
| 1879 | |||
| 1880 | .alloc_pud = xen_alloc_pte_init, | ||
| 1881 | .release_pud = xen_release_pte_init, | ||
| 1882 | #endif /* PAGETABLE_LEVELS == 4 */ | ||
| 1883 | |||
| 1884 | .activate_mm = xen_activate_mm, | ||
| 1885 | .dup_mmap = xen_dup_mmap, | ||
| 1886 | .exit_mmap = xen_exit_mmap, | ||
| 1887 | |||
| 1888 | .lazy_mode = { | ||
| 1889 | .enter = paravirt_enter_lazy_mmu, | ||
| 1890 | .leave = xen_leave_lazy, | ||
| 1891 | }, | ||
| 1892 | |||
| 1893 | .set_fixmap = xen_set_fixmap, | ||
| 1894 | }; | ||
| 1895 | |||
| 1896 | |||
| 1159 | #ifdef CONFIG_XEN_DEBUG_FS | 1897 | #ifdef CONFIG_XEN_DEBUG_FS |
| 1160 | 1898 | ||
| 1161 | static struct dentry *d_mmu_debug; | 1899 | static struct dentry *d_mmu_debug; |
diff --git a/arch/x86/xen/mmu.h b/arch/x86/xen/mmu.h index 98d71659da5a..24d1b44a337d 100644 --- a/arch/x86/xen/mmu.h +++ b/arch/x86/xen/mmu.h | |||
| @@ -54,4 +54,7 @@ pte_t xen_ptep_modify_prot_start(struct mm_struct *mm, unsigned long addr, pte_t | |||
| 54 | void xen_ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr, | 54 | void xen_ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr, |
| 55 | pte_t *ptep, pte_t pte); | 55 | pte_t *ptep, pte_t pte); |
| 56 | 56 | ||
| 57 | unsigned long xen_read_cr2_direct(void); | ||
| 58 | |||
| 59 | extern const struct pv_mmu_ops xen_mmu_ops; | ||
| 57 | #endif /* _XEN_MMU_H */ | 60 | #endif /* _XEN_MMU_H */ |
diff --git a/arch/x86/xen/multicalls.c b/arch/x86/xen/multicalls.c index c738644b5435..8bff7e7c290b 100644 --- a/arch/x86/xen/multicalls.c +++ b/arch/x86/xen/multicalls.c | |||
| @@ -39,6 +39,7 @@ struct mc_buffer { | |||
| 39 | struct multicall_entry entries[MC_BATCH]; | 39 | struct multicall_entry entries[MC_BATCH]; |
| 40 | #if MC_DEBUG | 40 | #if MC_DEBUG |
| 41 | struct multicall_entry debug[MC_BATCH]; | 41 | struct multicall_entry debug[MC_BATCH]; |
| 42 | void *caller[MC_BATCH]; | ||
| 42 | #endif | 43 | #endif |
| 43 | unsigned char args[MC_ARGS]; | 44 | unsigned char args[MC_ARGS]; |
| 44 | struct callback { | 45 | struct callback { |
| @@ -154,11 +155,12 @@ void xen_mc_flush(void) | |||
| 154 | ret, smp_processor_id()); | 155 | ret, smp_processor_id()); |
| 155 | dump_stack(); | 156 | dump_stack(); |
| 156 | for (i = 0; i < b->mcidx; i++) { | 157 | for (i = 0; i < b->mcidx; i++) { |
| 157 | printk(KERN_DEBUG " call %2d/%d: op=%lu arg=[%lx] result=%ld\n", | 158 | printk(KERN_DEBUG " call %2d/%d: op=%lu arg=[%lx] result=%ld\t%pF\n", |
| 158 | i+1, b->mcidx, | 159 | i+1, b->mcidx, |
| 159 | b->debug[i].op, | 160 | b->debug[i].op, |
| 160 | b->debug[i].args[0], | 161 | b->debug[i].args[0], |
| 161 | b->entries[i].result); | 162 | b->entries[i].result, |
| 163 | b->caller[i]); | ||
| 162 | } | 164 | } |
| 163 | } | 165 | } |
| 164 | #endif | 166 | #endif |
| @@ -168,8 +170,6 @@ void xen_mc_flush(void) | |||
| 168 | } else | 170 | } else |
| 169 | BUG_ON(b->argidx != 0); | 171 | BUG_ON(b->argidx != 0); |
| 170 | 172 | ||
| 171 | local_irq_restore(flags); | ||
| 172 | |||
| 173 | for (i = 0; i < b->cbidx; i++) { | 173 | for (i = 0; i < b->cbidx; i++) { |
| 174 | struct callback *cb = &b->callbacks[i]; | 174 | struct callback *cb = &b->callbacks[i]; |
| 175 | 175 | ||
| @@ -177,7 +177,9 @@ void xen_mc_flush(void) | |||
| 177 | } | 177 | } |
| 178 | b->cbidx = 0; | 178 | b->cbidx = 0; |
| 179 | 179 | ||
| 180 | BUG_ON(ret); | 180 | local_irq_restore(flags); |
| 181 | |||
| 182 | WARN_ON(ret); | ||
| 181 | } | 183 | } |
| 182 | 184 | ||
| 183 | struct multicall_space __xen_mc_entry(size_t args) | 185 | struct multicall_space __xen_mc_entry(size_t args) |
| @@ -197,6 +199,9 @@ struct multicall_space __xen_mc_entry(size_t args) | |||
| 197 | } | 199 | } |
| 198 | 200 | ||
| 199 | ret.mc = &b->entries[b->mcidx]; | 201 | ret.mc = &b->entries[b->mcidx]; |
| 202 | #ifdef MC_DEBUG | ||
| 203 | b->caller[b->mcidx] = __builtin_return_address(0); | ||
| 204 | #endif | ||
| 200 | b->mcidx++; | 205 | b->mcidx++; |
| 201 | ret.args = &b->args[argidx]; | 206 | ret.args = &b->args[argidx]; |
| 202 | b->argidx = argidx + args; | 207 | b->argidx = argidx + args; |
diff --git a/arch/x86/xen/multicalls.h b/arch/x86/xen/multicalls.h index fa3e10725d98..9e565da5d1f7 100644 --- a/arch/x86/xen/multicalls.h +++ b/arch/x86/xen/multicalls.h | |||
| @@ -41,7 +41,7 @@ static inline void xen_mc_issue(unsigned mode) | |||
| 41 | xen_mc_flush(); | 41 | xen_mc_flush(); |
| 42 | 42 | ||
| 43 | /* restore flags saved in xen_mc_batch */ | 43 | /* restore flags saved in xen_mc_batch */ |
| 44 | local_irq_restore(x86_read_percpu(xen_mc_irq_flags)); | 44 | local_irq_restore(percpu_read(xen_mc_irq_flags)); |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | /* Set up a callback to be called when the current batch is flushed */ | 47 | /* Set up a callback to be called when the current batch is flushed */ |
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index c44e2069c7c7..035582ae815d 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
| @@ -50,11 +50,7 @@ static irqreturn_t xen_call_function_single_interrupt(int irq, void *dev_id); | |||
| 50 | */ | 50 | */ |
| 51 | static irqreturn_t xen_reschedule_interrupt(int irq, void *dev_id) | 51 | static irqreturn_t xen_reschedule_interrupt(int irq, void *dev_id) |
| 52 | { | 52 | { |
| 53 | #ifdef CONFIG_X86_32 | 53 | inc_irq_stat(irq_resched_count); |
| 54 | __get_cpu_var(irq_stat).irq_resched_count++; | ||
| 55 | #else | ||
| 56 | add_pda(irq_resched_count, 1); | ||
| 57 | #endif | ||
| 58 | 54 | ||
| 59 | return IRQ_HANDLED; | 55 | return IRQ_HANDLED; |
| 60 | } | 56 | } |
| @@ -78,7 +74,7 @@ static __cpuinit void cpu_bringup(void) | |||
| 78 | xen_setup_cpu_clockevents(); | 74 | xen_setup_cpu_clockevents(); |
| 79 | 75 | ||
| 80 | cpu_set(cpu, cpu_online_map); | 76 | cpu_set(cpu, cpu_online_map); |
| 81 | x86_write_percpu(cpu_state, CPU_ONLINE); | 77 | percpu_write(cpu_state, CPU_ONLINE); |
| 82 | wmb(); | 78 | wmb(); |
| 83 | 79 | ||
| 84 | /* We can take interrupts now: we're officially "up". */ | 80 | /* We can take interrupts now: we're officially "up". */ |
| @@ -174,7 +170,7 @@ static void __init xen_smp_prepare_boot_cpu(void) | |||
| 174 | 170 | ||
| 175 | /* We've switched to the "real" per-cpu gdt, so make sure the | 171 | /* We've switched to the "real" per-cpu gdt, so make sure the |
| 176 | old memory can be recycled */ | 172 | old memory can be recycled */ |
| 177 | make_lowmem_page_readwrite(&per_cpu_var(gdt_page)); | 173 | make_lowmem_page_readwrite(xen_initial_gdt); |
| 178 | 174 | ||
| 179 | xen_setup_vcpu_info_placement(); | 175 | xen_setup_vcpu_info_placement(); |
| 180 | } | 176 | } |
| @@ -239,6 +235,8 @@ cpu_initialize_context(unsigned int cpu, struct task_struct *idle) | |||
| 239 | ctxt->user_regs.ss = __KERNEL_DS; | 235 | ctxt->user_regs.ss = __KERNEL_DS; |
| 240 | #ifdef CONFIG_X86_32 | 236 | #ifdef CONFIG_X86_32 |
| 241 | ctxt->user_regs.fs = __KERNEL_PERCPU; | 237 | ctxt->user_regs.fs = __KERNEL_PERCPU; |
| 238 | #else | ||
| 239 | ctxt->gs_base_kernel = per_cpu_offset(cpu); | ||
| 242 | #endif | 240 | #endif |
| 243 | ctxt->user_regs.eip = (unsigned long)cpu_bringup_and_idle; | 241 | ctxt->user_regs.eip = (unsigned long)cpu_bringup_and_idle; |
| 244 | ctxt->user_regs.eflags = 0x1000; /* IOPL_RING1 */ | 242 | ctxt->user_regs.eflags = 0x1000; /* IOPL_RING1 */ |
| @@ -283,23 +281,14 @@ static int __cpuinit xen_cpu_up(unsigned int cpu) | |||
| 283 | struct task_struct *idle = idle_task(cpu); | 281 | struct task_struct *idle = idle_task(cpu); |
| 284 | int rc; | 282 | int rc; |
| 285 | 283 | ||
| 286 | #ifdef CONFIG_X86_64 | ||
| 287 | /* Allocate node local memory for AP pdas */ | ||
| 288 | WARN_ON(cpu == 0); | ||
| 289 | if (cpu > 0) { | ||
| 290 | rc = get_local_pda(cpu); | ||
| 291 | if (rc) | ||
| 292 | return rc; | ||
| 293 | } | ||
| 294 | #endif | ||
| 295 | |||
| 296 | #ifdef CONFIG_X86_32 | ||
| 297 | init_gdt(cpu); | ||
| 298 | per_cpu(current_task, cpu) = idle; | 284 | per_cpu(current_task, cpu) = idle; |
| 285 | #ifdef CONFIG_X86_32 | ||
| 299 | irq_ctx_init(cpu); | 286 | irq_ctx_init(cpu); |
| 300 | #else | 287 | #else |
| 301 | cpu_pda(cpu)->pcurrent = idle; | ||
| 302 | clear_tsk_thread_flag(idle, TIF_FORK); | 288 | clear_tsk_thread_flag(idle, TIF_FORK); |
| 289 | per_cpu(kernel_stack, cpu) = | ||
| 290 | (unsigned long)task_stack_page(idle) - | ||
| 291 | KERNEL_STACK_OFFSET + THREAD_SIZE; | ||
| 303 | #endif | 292 | #endif |
| 304 | xen_setup_timer(cpu); | 293 | xen_setup_timer(cpu); |
| 305 | xen_init_lock_cpu(cpu); | 294 | xen_init_lock_cpu(cpu); |
| @@ -445,11 +434,7 @@ static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id) | |||
| 445 | { | 434 | { |
| 446 | irq_enter(); | 435 | irq_enter(); |
| 447 | generic_smp_call_function_interrupt(); | 436 | generic_smp_call_function_interrupt(); |
| 448 | #ifdef CONFIG_X86_32 | 437 | inc_irq_stat(irq_call_count); |
| 449 | __get_cpu_var(irq_stat).irq_call_count++; | ||
| 450 | #else | ||
| 451 | add_pda(irq_call_count, 1); | ||
| 452 | #endif | ||
| 453 | irq_exit(); | 438 | irq_exit(); |
| 454 | 439 | ||
| 455 | return IRQ_HANDLED; | 440 | return IRQ_HANDLED; |
| @@ -459,11 +444,7 @@ static irqreturn_t xen_call_function_single_interrupt(int irq, void *dev_id) | |||
| 459 | { | 444 | { |
| 460 | irq_enter(); | 445 | irq_enter(); |
| 461 | generic_smp_call_function_single_interrupt(); | 446 | generic_smp_call_function_single_interrupt(); |
| 462 | #ifdef CONFIG_X86_32 | 447 | inc_irq_stat(irq_call_count); |
| 463 | __get_cpu_var(irq_stat).irq_call_count++; | ||
| 464 | #else | ||
| 465 | add_pda(irq_call_count, 1); | ||
| 466 | #endif | ||
| 467 | irq_exit(); | 448 | irq_exit(); |
| 468 | 449 | ||
| 469 | return IRQ_HANDLED; | 450 | return IRQ_HANDLED; |
diff --git a/arch/x86/xen/suspend.c b/arch/x86/xen/suspend.c index 212ffe012b76..95be7b434724 100644 --- a/arch/x86/xen/suspend.c +++ b/arch/x86/xen/suspend.c | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | 6 | ||
| 7 | #include <asm/xen/hypercall.h> | 7 | #include <asm/xen/hypercall.h> |
| 8 | #include <asm/xen/page.h> | 8 | #include <asm/xen/page.h> |
| 9 | #include <asm/fixmap.h> | ||
| 9 | 10 | ||
| 10 | #include "xen-ops.h" | 11 | #include "xen-ops.h" |
| 11 | #include "mmu.h" | 12 | #include "mmu.h" |
diff --git a/arch/x86/xen/xen-asm.S b/arch/x86/xen/xen-asm.S new file mode 100644 index 000000000000..79d7362ad6d1 --- /dev/null +++ b/arch/x86/xen/xen-asm.S | |||
| @@ -0,0 +1,142 @@ | |||
| 1 | /* | ||
| 2 | * Asm versions of Xen pv-ops, suitable for either direct use or | ||
| 3 | * inlining. The inline versions are the same as the direct-use | ||
| 4 | * versions, with the pre- and post-amble chopped off. | ||
| 5 | * | ||
| 6 | * This code is encoded for size rather than absolute efficiency, with | ||
| 7 | * a view to being able to inline as much as possible. | ||
| 8 | * | ||
| 9 | * We only bother with direct forms (ie, vcpu in percpu data) of the | ||
| 10 | * operations here; the indirect forms are better handled in C, since | ||
| 11 | * they're generally too large to inline anyway. | ||
| 12 | */ | ||
| 13 | |||
| 14 | #include <asm/asm-offsets.h> | ||
| 15 | #include <asm/percpu.h> | ||
| 16 | #include <asm/processor-flags.h> | ||
| 17 | |||
| 18 | #include "xen-asm.h" | ||
| 19 | |||
| 20 | /* | ||
| 21 | * Enable events. This clears the event mask and tests the pending | ||
| 22 | * event status with one and operation. If there are pending events, | ||
| 23 | * then enter the hypervisor to get them handled. | ||
| 24 | */ | ||
| 25 | ENTRY(xen_irq_enable_direct) | ||
| 26 | /* Unmask events */ | ||
| 27 | movb $0, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_mask | ||
| 28 | |||
| 29 | /* | ||
| 30 | * Preempt here doesn't matter because that will deal with any | ||
| 31 | * pending interrupts. The pending check may end up being run | ||
| 32 | * on the wrong CPU, but that doesn't hurt. | ||
| 33 | */ | ||
| 34 | |||
| 35 | /* Test for pending */ | ||
| 36 | testb $0xff, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_pending | ||
| 37 | jz 1f | ||
| 38 | |||
| 39 | 2: call check_events | ||
| 40 | 1: | ||
| 41 | ENDPATCH(xen_irq_enable_direct) | ||
| 42 | ret | ||
| 43 | ENDPROC(xen_irq_enable_direct) | ||
| 44 | RELOC(xen_irq_enable_direct, 2b+1) | ||
| 45 | |||
| 46 | |||
| 47 | /* | ||
| 48 | * Disabling events is simply a matter of making the event mask | ||
| 49 | * non-zero. | ||
| 50 | */ | ||
| 51 | ENTRY(xen_irq_disable_direct) | ||
| 52 | movb $1, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_mask | ||
| 53 | ENDPATCH(xen_irq_disable_direct) | ||
| 54 | ret | ||
| 55 | ENDPROC(xen_irq_disable_direct) | ||
| 56 | RELOC(xen_irq_disable_direct, 0) | ||
| 57 | |||
| 58 | /* | ||
| 59 | * (xen_)save_fl is used to get the current interrupt enable status. | ||
| 60 | * Callers expect the status to be in X86_EFLAGS_IF, and other bits | ||
| 61 | * may be set in the return value. We take advantage of this by | ||
| 62 | * making sure that X86_EFLAGS_IF has the right value (and other bits | ||
| 63 | * in that byte are 0), but other bits in the return value are | ||
| 64 | * undefined. We need to toggle the state of the bit, because Xen and | ||
| 65 | * x86 use opposite senses (mask vs enable). | ||
| 66 | */ | ||
| 67 | ENTRY(xen_save_fl_direct) | ||
| 68 | testb $0xff, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_mask | ||
| 69 | setz %ah | ||
| 70 | addb %ah, %ah | ||
| 71 | ENDPATCH(xen_save_fl_direct) | ||
| 72 | ret | ||
| 73 | ENDPROC(xen_save_fl_direct) | ||
| 74 | RELOC(xen_save_fl_direct, 0) | ||
| 75 | |||
| 76 | |||
| 77 | /* | ||
| 78 | * In principle the caller should be passing us a value return from | ||
| 79 | * xen_save_fl_direct, but for robustness sake we test only the | ||
| 80 | * X86_EFLAGS_IF flag rather than the whole byte. After setting the | ||
| 81 | * interrupt mask state, it checks for unmasked pending events and | ||
| 82 | * enters the hypervisor to get them delivered if so. | ||
| 83 | */ | ||
| 84 | ENTRY(xen_restore_fl_direct) | ||
| 85 | #ifdef CONFIG_X86_64 | ||
| 86 | testw $X86_EFLAGS_IF, %di | ||
| 87 | #else | ||
| 88 | testb $X86_EFLAGS_IF>>8, %ah | ||
| 89 | #endif | ||
| 90 | setz PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_mask | ||
| 91 | /* | ||
| 92 | * Preempt here doesn't matter because that will deal with any | ||
| 93 | * pending interrupts. The pending check may end up being run | ||
| 94 | * on the wrong CPU, but that doesn't hurt. | ||
| 95 | */ | ||
| 96 | |||
| 97 | /* check for unmasked and pending */ | ||
| 98 | cmpw $0x0001, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_pending | ||
| 99 | jz 1f | ||
| 100 | 2: call check_events | ||
| 101 | 1: | ||
| 102 | ENDPATCH(xen_restore_fl_direct) | ||
| 103 | ret | ||
| 104 | ENDPROC(xen_restore_fl_direct) | ||
| 105 | RELOC(xen_restore_fl_direct, 2b+1) | ||
| 106 | |||
| 107 | |||
| 108 | /* | ||
| 109 | * Force an event check by making a hypercall, but preserve regs | ||
| 110 | * before making the call. | ||
| 111 | */ | ||
| 112 | check_events: | ||
| 113 | #ifdef CONFIG_X86_32 | ||
| 114 | push %eax | ||
| 115 | push %ecx | ||
| 116 | push %edx | ||
| 117 | call xen_force_evtchn_callback | ||
| 118 | pop %edx | ||
| 119 | pop %ecx | ||
| 120 | pop %eax | ||
| 121 | #else | ||
| 122 | push %rax | ||
| 123 | push %rcx | ||
| 124 | push %rdx | ||
| 125 | push %rsi | ||
| 126 | push %rdi | ||
| 127 | push %r8 | ||
| 128 | push %r9 | ||
| 129 | push %r10 | ||
| 130 | push %r11 | ||
| 131 | call xen_force_evtchn_callback | ||
| 132 | pop %r11 | ||
| 133 | pop %r10 | ||
| 134 | pop %r9 | ||
| 135 | pop %r8 | ||
| 136 | pop %rdi | ||
| 137 | pop %rsi | ||
| 138 | pop %rdx | ||
| 139 | pop %rcx | ||
| 140 | pop %rax | ||
| 141 | #endif | ||
| 142 | ret | ||
diff --git a/arch/x86/xen/xen-asm.h b/arch/x86/xen/xen-asm.h new file mode 100644 index 000000000000..465276467a47 --- /dev/null +++ b/arch/x86/xen/xen-asm.h | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | #ifndef _XEN_XEN_ASM_H | ||
| 2 | #define _XEN_XEN_ASM_H | ||
| 3 | |||
| 4 | #include <linux/linkage.h> | ||
| 5 | |||
| 6 | #define RELOC(x, v) .globl x##_reloc; x##_reloc=v | ||
| 7 | #define ENDPATCH(x) .globl x##_end; x##_end=. | ||
| 8 | |||
| 9 | /* Pseudo-flag used for virtual NMI, which we don't implement yet */ | ||
| 10 | #define XEN_EFLAGS_NMI 0x80000000 | ||
| 11 | |||
| 12 | #endif | ||
diff --git a/arch/x86/xen/xen-asm_32.S b/arch/x86/xen/xen-asm_32.S index 42786f59d9c0..88e15deb8b82 100644 --- a/arch/x86/xen/xen-asm_32.S +++ b/arch/x86/xen/xen-asm_32.S | |||
| @@ -1,117 +1,43 @@ | |||
| 1 | /* | 1 | /* |
| 2 | Asm versions of Xen pv-ops, suitable for either direct use or inlining. | 2 | * Asm versions of Xen pv-ops, suitable for either direct use or |
| 3 | The inline versions are the same as the direct-use versions, with the | 3 | * inlining. The inline versions are the same as the direct-use |
| 4 | pre- and post-amble chopped off. | 4 | * versions, with the pre- and post-amble chopped off. |
| 5 | 5 | * | |
| 6 | This code is encoded for size rather than absolute efficiency, | 6 | * This code is encoded for size rather than absolute efficiency, with |
| 7 | with a view to being able to inline as much as possible. | 7 | * a view to being able to inline as much as possible. |
| 8 | 8 | * | |
| 9 | We only bother with direct forms (ie, vcpu in pda) of the operations | 9 | * We only bother with direct forms (ie, vcpu in pda) of the |
| 10 | here; the indirect forms are better handled in C, since they're | 10 | * operations here; the indirect forms are better handled in C, since |
| 11 | generally too large to inline anyway. | 11 | * they're generally too large to inline anyway. |
| 12 | */ | 12 | */ |
| 13 | 13 | ||
| 14 | #include <linux/linkage.h> | ||
| 15 | |||
| 16 | #include <asm/asm-offsets.h> | ||
| 17 | #include <asm/thread_info.h> | 14 | #include <asm/thread_info.h> |
| 18 | #include <asm/percpu.h> | ||
| 19 | #include <asm/processor-flags.h> | 15 | #include <asm/processor-flags.h> |
| 20 | #include <asm/segment.h> | 16 | #include <asm/segment.h> |
| 21 | 17 | ||
| 22 | #include <xen/interface/xen.h> | 18 | #include <xen/interface/xen.h> |
| 23 | 19 | ||
| 24 | #define RELOC(x, v) .globl x##_reloc; x##_reloc=v | 20 | #include "xen-asm.h" |
| 25 | #define ENDPATCH(x) .globl x##_end; x##_end=. | ||
| 26 | |||
| 27 | /* Pseudo-flag used for virtual NMI, which we don't implement yet */ | ||
| 28 | #define XEN_EFLAGS_NMI 0x80000000 | ||
| 29 | |||
| 30 | /* | ||
| 31 | Enable events. This clears the event mask and tests the pending | ||
| 32 | event status with one and operation. If there are pending | ||
| 33 | events, then enter the hypervisor to get them handled. | ||
| 34 | */ | ||
| 35 | ENTRY(xen_irq_enable_direct) | ||
| 36 | /* Unmask events */ | ||
| 37 | movb $0, PER_CPU_VAR(xen_vcpu_info)+XEN_vcpu_info_mask | ||
| 38 | |||
| 39 | /* Preempt here doesn't matter because that will deal with | ||
| 40 | any pending interrupts. The pending check may end up being | ||
| 41 | run on the wrong CPU, but that doesn't hurt. */ | ||
| 42 | |||
| 43 | /* Test for pending */ | ||
| 44 | testb $0xff, PER_CPU_VAR(xen_vcpu_info)+XEN_vcpu_info_pending | ||
| 45 | jz 1f | ||
| 46 | |||
| 47 | 2: call check_events | ||
| 48 | 1: | ||
| 49 | ENDPATCH(xen_irq_enable_direct) | ||
| 50 | ret | ||
| 51 | ENDPROC(xen_irq_enable_direct) | ||
| 52 | RELOC(xen_irq_enable_direct, 2b+1) | ||
| 53 | |||
| 54 | |||
| 55 | /* | ||
| 56 | Disabling events is simply a matter of making the event mask | ||
| 57 | non-zero. | ||
| 58 | */ | ||
| 59 | ENTRY(xen_irq_disable_direct) | ||
| 60 | movb $1, PER_CPU_VAR(xen_vcpu_info)+XEN_vcpu_info_mask | ||
| 61 | ENDPATCH(xen_irq_disable_direct) | ||
| 62 | ret | ||
| 63 | ENDPROC(xen_irq_disable_direct) | ||
| 64 | RELOC(xen_irq_disable_direct, 0) | ||
| 65 | 21 | ||
| 66 | /* | 22 | /* |
| 67 | (xen_)save_fl is used to get the current interrupt enable status. | 23 | * Force an event check by making a hypercall, but preserve regs |
| 68 | Callers expect the status to be in X86_EFLAGS_IF, and other bits | 24 | * before making the call. |
| 69 | may be set in the return value. We take advantage of this by | ||
| 70 | making sure that X86_EFLAGS_IF has the right value (and other bits | ||
| 71 | in that byte are 0), but other bits in the return value are | ||
| 72 | undefined. We need to toggle the state of the bit, because | ||
| 73 | Xen and x86 use opposite senses (mask vs enable). | ||
| 74 | */ | 25 | */ |
| 75 | ENTRY(xen_save_fl_direct) | 26 | check_events: |
| 76 | testb $0xff, PER_CPU_VAR(xen_vcpu_info)+XEN_vcpu_info_mask | 27 | push %eax |
| 77 | setz %ah | 28 | push %ecx |
| 78 | addb %ah,%ah | 29 | push %edx |
| 79 | ENDPATCH(xen_save_fl_direct) | 30 | call xen_force_evtchn_callback |
| 80 | ret | 31 | pop %edx |
| 81 | ENDPROC(xen_save_fl_direct) | 32 | pop %ecx |
| 82 | RELOC(xen_save_fl_direct, 0) | 33 | pop %eax |
| 83 | |||
| 84 | |||
| 85 | /* | ||
| 86 | In principle the caller should be passing us a value return | ||
| 87 | from xen_save_fl_direct, but for robustness sake we test only | ||
| 88 | the X86_EFLAGS_IF flag rather than the whole byte. After | ||
| 89 | setting the interrupt mask state, it checks for unmasked | ||
| 90 | pending events and enters the hypervisor to get them delivered | ||
| 91 | if so. | ||
| 92 | */ | ||
| 93 | ENTRY(xen_restore_fl_direct) | ||
| 94 | testb $X86_EFLAGS_IF>>8, %ah | ||
| 95 | setz PER_CPU_VAR(xen_vcpu_info)+XEN_vcpu_info_mask | ||
| 96 | /* Preempt here doesn't matter because that will deal with | ||
| 97 | any pending interrupts. The pending check may end up being | ||
| 98 | run on the wrong CPU, but that doesn't hurt. */ | ||
| 99 | |||
| 100 | /* check for unmasked and pending */ | ||
| 101 | cmpw $0x0001, PER_CPU_VAR(xen_vcpu_info)+XEN_vcpu_info_pending | ||
| 102 | jz 1f | ||
| 103 | 2: call check_events | ||
| 104 | 1: | ||
| 105 | ENDPATCH(xen_restore_fl_direct) | ||
| 106 | ret | 34 | ret |
| 107 | ENDPROC(xen_restore_fl_direct) | ||
| 108 | RELOC(xen_restore_fl_direct, 2b+1) | ||
| 109 | 35 | ||
| 110 | /* | 36 | /* |
| 111 | We can't use sysexit directly, because we're not running in ring0. | 37 | * We can't use sysexit directly, because we're not running in ring0. |
| 112 | But we can easily fake it up using iret. Assuming xen_sysexit | 38 | * But we can easily fake it up using iret. Assuming xen_sysexit is |
| 113 | is jumped to with a standard stack frame, we can just strip it | 39 | * jumped to with a standard stack frame, we can just strip it back to |
| 114 | back to a standard iret frame and use iret. | 40 | * a standard iret frame and use iret. |
| 115 | */ | 41 | */ |
| 116 | ENTRY(xen_sysexit) | 42 | ENTRY(xen_sysexit) |
| 117 | movl PT_EAX(%esp), %eax /* Shouldn't be necessary? */ | 43 | movl PT_EAX(%esp), %eax /* Shouldn't be necessary? */ |
| @@ -122,33 +48,31 @@ ENTRY(xen_sysexit) | |||
| 122 | ENDPROC(xen_sysexit) | 48 | ENDPROC(xen_sysexit) |
| 123 | 49 | ||
| 124 | /* | 50 | /* |
| 125 | This is run where a normal iret would be run, with the same stack setup: | 51 | * This is run where a normal iret would be run, with the same stack setup: |
| 126 | 8: eflags | 52 | * 8: eflags |
| 127 | 4: cs | 53 | * 4: cs |
| 128 | esp-> 0: eip | 54 | * esp-> 0: eip |
| 129 | 55 | * | |
| 130 | This attempts to make sure that any pending events are dealt | 56 | * This attempts to make sure that any pending events are dealt with |
| 131 | with on return to usermode, but there is a small window in | 57 | * on return to usermode, but there is a small window in which an |
| 132 | which an event can happen just before entering usermode. If | 58 | * event can happen just before entering usermode. If the nested |
| 133 | the nested interrupt ends up setting one of the TIF_WORK_MASK | 59 | * interrupt ends up setting one of the TIF_WORK_MASK pending work |
| 134 | pending work flags, they will not be tested again before | 60 | * flags, they will not be tested again before returning to |
| 135 | returning to usermode. This means that a process can end up | 61 | * usermode. This means that a process can end up with pending work, |
| 136 | with pending work, which will be unprocessed until the process | 62 | * which will be unprocessed until the process enters and leaves the |
| 137 | enters and leaves the kernel again, which could be an | 63 | * kernel again, which could be an unbounded amount of time. This |
| 138 | unbounded amount of time. This means that a pending signal or | 64 | * means that a pending signal or reschedule event could be |
| 139 | reschedule event could be indefinitely delayed. | 65 | * indefinitely delayed. |
| 140 | 66 | * | |
| 141 | The fix is to notice a nested interrupt in the critical | 67 | * The fix is to notice a nested interrupt in the critical window, and |
| 142 | window, and if one occurs, then fold the nested interrupt into | 68 | * if one occurs, then fold the nested interrupt into the current |
| 143 | the current interrupt stack frame, and re-process it | 69 | * interrupt stack frame, and re-process it iteratively rather than |
| 144 | iteratively rather than recursively. This means that it will | 70 | * recursively. This means that it will exit via the normal path, and |
| 145 | exit via the normal path, and all pending work will be dealt | 71 | * all pending work will be dealt with appropriately. |
| 146 | with appropriately. | 72 | * |
| 147 | 73 | * Because the nested interrupt handler needs to deal with the current | |
| 148 | Because the nested interrupt handler needs to deal with the | 74 | * stack state in whatever form its in, we keep things simple by only |
| 149 | current stack state in whatever form its in, we keep things | 75 | * using a single register which is pushed/popped on the stack. |
| 150 | simple by only using a single register which is pushed/popped | ||
| 151 | on the stack. | ||
| 152 | */ | 76 | */ |
| 153 | ENTRY(xen_iret) | 77 | ENTRY(xen_iret) |
| 154 | /* test eflags for special cases */ | 78 | /* test eflags for special cases */ |
| @@ -158,13 +82,15 @@ ENTRY(xen_iret) | |||
| 158 | push %eax | 82 | push %eax |
| 159 | ESP_OFFSET=4 # bytes pushed onto stack | 83 | ESP_OFFSET=4 # bytes pushed onto stack |
| 160 | 84 | ||
| 161 | /* Store vcpu_info pointer for easy access. Do it this | 85 | /* |
| 162 | way to avoid having to reload %fs */ | 86 | * Store vcpu_info pointer for easy access. Do it this way to |
| 87 | * avoid having to reload %fs | ||
| 88 | */ | ||
| 163 | #ifdef CONFIG_SMP | 89 | #ifdef CONFIG_SMP |
| 164 | GET_THREAD_INFO(%eax) | 90 | GET_THREAD_INFO(%eax) |
| 165 | movl TI_cpu(%eax),%eax | 91 | movl TI_cpu(%eax), %eax |
| 166 | movl __per_cpu_offset(,%eax,4),%eax | 92 | movl __per_cpu_offset(,%eax,4), %eax |
| 167 | mov per_cpu__xen_vcpu(%eax),%eax | 93 | mov per_cpu__xen_vcpu(%eax), %eax |
| 168 | #else | 94 | #else |
| 169 | movl per_cpu__xen_vcpu, %eax | 95 | movl per_cpu__xen_vcpu, %eax |
| 170 | #endif | 96 | #endif |
| @@ -172,37 +98,46 @@ ENTRY(xen_iret) | |||
| 172 | /* check IF state we're restoring */ | 98 | /* check IF state we're restoring */ |
| 173 | testb $X86_EFLAGS_IF>>8, 8+1+ESP_OFFSET(%esp) | 99 | testb $X86_EFLAGS_IF>>8, 8+1+ESP_OFFSET(%esp) |
| 174 | 100 | ||
| 175 | /* Maybe enable events. Once this happens we could get a | 101 | /* |
| 176 | recursive event, so the critical region starts immediately | 102 | * Maybe enable events. Once this happens we could get a |
| 177 | afterwards. However, if that happens we don't end up | 103 | * recursive event, so the critical region starts immediately |
| 178 | resuming the code, so we don't have to be worried about | 104 | * afterwards. However, if that happens we don't end up |
| 179 | being preempted to another CPU. */ | 105 | * resuming the code, so we don't have to be worried about |
| 106 | * being preempted to another CPU. | ||
| 107 | */ | ||
| 180 | setz XEN_vcpu_info_mask(%eax) | 108 | setz XEN_vcpu_info_mask(%eax) |
| 181 | xen_iret_start_crit: | 109 | xen_iret_start_crit: |
| 182 | 110 | ||
| 183 | /* check for unmasked and pending */ | 111 | /* check for unmasked and pending */ |
| 184 | cmpw $0x0001, XEN_vcpu_info_pending(%eax) | 112 | cmpw $0x0001, XEN_vcpu_info_pending(%eax) |
| 185 | 113 | ||
| 186 | /* If there's something pending, mask events again so we | 114 | /* |
| 187 | can jump back into xen_hypervisor_callback */ | 115 | * If there's something pending, mask events again so we can |
| 116 | * jump back into xen_hypervisor_callback | ||
| 117 | */ | ||
| 188 | sete XEN_vcpu_info_mask(%eax) | 118 | sete XEN_vcpu_info_mask(%eax) |
| 189 | 119 | ||
| 190 | popl %eax | 120 | popl %eax |
| 191 | 121 | ||
| 192 | /* From this point on the registers are restored and the stack | 122 | /* |
| 193 | updated, so we don't need to worry about it if we're preempted */ | 123 | * From this point on the registers are restored and the stack |
| 124 | * updated, so we don't need to worry about it if we're | ||
| 125 | * preempted | ||
| 126 | */ | ||
| 194 | iret_restore_end: | 127 | iret_restore_end: |
| 195 | 128 | ||
| 196 | /* Jump to hypervisor_callback after fixing up the stack. | 129 | /* |
| 197 | Events are masked, so jumping out of the critical | 130 | * Jump to hypervisor_callback after fixing up the stack. |
| 198 | region is OK. */ | 131 | * Events are masked, so jumping out of the critical region is |
| 132 | * OK. | ||
| 133 | */ | ||
| 199 | je xen_hypervisor_callback | 134 | je xen_hypervisor_callback |
| 200 | 135 | ||
| 201 | 1: iret | 136 | 1: iret |
| 202 | xen_iret_end_crit: | 137 | xen_iret_end_crit: |
| 203 | .section __ex_table,"a" | 138 | .section __ex_table, "a" |
| 204 | .align 4 | 139 | .align 4 |
| 205 | .long 1b,iret_exc | 140 | .long 1b, iret_exc |
| 206 | .previous | 141 | .previous |
| 207 | 142 | ||
| 208 | hyper_iret: | 143 | hyper_iret: |
| @@ -212,55 +147,55 @@ hyper_iret: | |||
| 212 | .globl xen_iret_start_crit, xen_iret_end_crit | 147 | .globl xen_iret_start_crit, xen_iret_end_crit |
| 213 | 148 | ||
| 214 | /* | 149 | /* |
| 215 | This is called by xen_hypervisor_callback in entry.S when it sees | 150 | * This is called by xen_hypervisor_callback in entry.S when it sees |
| 216 | that the EIP at the time of interrupt was between xen_iret_start_crit | 151 | * that the EIP at the time of interrupt was between |
| 217 | and xen_iret_end_crit. We're passed the EIP in %eax so we can do | 152 | * xen_iret_start_crit and xen_iret_end_crit. We're passed the EIP in |
| 218 | a more refined determination of what to do. | 153 | * %eax so we can do a more refined determination of what to do. |
| 219 | 154 | * | |
| 220 | The stack format at this point is: | 155 | * The stack format at this point is: |
| 221 | ---------------- | 156 | * ---------------- |
| 222 | ss : (ss/esp may be present if we came from usermode) | 157 | * ss : (ss/esp may be present if we came from usermode) |
| 223 | esp : | 158 | * esp : |
| 224 | eflags } outer exception info | 159 | * eflags } outer exception info |
| 225 | cs } | 160 | * cs } |
| 226 | eip } | 161 | * eip } |
| 227 | ---------------- <- edi (copy dest) | 162 | * ---------------- <- edi (copy dest) |
| 228 | eax : outer eax if it hasn't been restored | 163 | * eax : outer eax if it hasn't been restored |
| 229 | ---------------- | 164 | * ---------------- |
| 230 | eflags } nested exception info | 165 | * eflags } nested exception info |
| 231 | cs } (no ss/esp because we're nested | 166 | * cs } (no ss/esp because we're nested |
| 232 | eip } from the same ring) | 167 | * eip } from the same ring) |
| 233 | orig_eax }<- esi (copy src) | 168 | * orig_eax }<- esi (copy src) |
| 234 | - - - - - - - - | 169 | * - - - - - - - - |
| 235 | fs } | 170 | * fs } |
| 236 | es } | 171 | * es } |
| 237 | ds } SAVE_ALL state | 172 | * ds } SAVE_ALL state |
| 238 | eax } | 173 | * eax } |
| 239 | : : | 174 | * : : |
| 240 | ebx }<- esp | 175 | * ebx }<- esp |
| 241 | ---------------- | 176 | * ---------------- |
| 242 | 177 | * | |
| 243 | In order to deliver the nested exception properly, we need to shift | 178 | * In order to deliver the nested exception properly, we need to shift |
| 244 | everything from the return addr up to the error code so it | 179 | * everything from the return addr up to the error code so it sits |
| 245 | sits just under the outer exception info. This means that when we | 180 | * just under the outer exception info. This means that when we |
| 246 | handle the exception, we do it in the context of the outer exception | 181 | * handle the exception, we do it in the context of the outer |
| 247 | rather than starting a new one. | 182 | * exception rather than starting a new one. |
| 248 | 183 | * | |
| 249 | The only caveat is that if the outer eax hasn't been | 184 | * The only caveat is that if the outer eax hasn't been restored yet |
| 250 | restored yet (ie, it's still on stack), we need to insert | 185 | * (ie, it's still on stack), we need to insert its value into the |
| 251 | its value into the SAVE_ALL state before going on, since | 186 | * SAVE_ALL state before going on, since it's usermode state which we |
| 252 | it's usermode state which we eventually need to restore. | 187 | * eventually need to restore. |
| 253 | */ | 188 | */ |
| 254 | ENTRY(xen_iret_crit_fixup) | 189 | ENTRY(xen_iret_crit_fixup) |
| 255 | /* | 190 | /* |
| 256 | Paranoia: Make sure we're really coming from kernel space. | 191 | * Paranoia: Make sure we're really coming from kernel space. |
| 257 | One could imagine a case where userspace jumps into the | 192 | * One could imagine a case where userspace jumps into the |
| 258 | critical range address, but just before the CPU delivers a GP, | 193 | * critical range address, but just before the CPU delivers a |
| 259 | it decides to deliver an interrupt instead. Unlikely? | 194 | * GP, it decides to deliver an interrupt instead. Unlikely? |
| 260 | Definitely. Easy to avoid? Yes. The Intel documents | 195 | * Definitely. Easy to avoid? Yes. The Intel documents |
| 261 | explicitly say that the reported EIP for a bad jump is the | 196 | * explicitly say that the reported EIP for a bad jump is the |
| 262 | jump instruction itself, not the destination, but some virtual | 197 | * jump instruction itself, not the destination, but some |
| 263 | environments get this wrong. | 198 | * virtual environments get this wrong. |
| 264 | */ | 199 | */ |
| 265 | movl PT_CS(%esp), %ecx | 200 | movl PT_CS(%esp), %ecx |
| 266 | andl $SEGMENT_RPL_MASK, %ecx | 201 | andl $SEGMENT_RPL_MASK, %ecx |
| @@ -270,15 +205,17 @@ ENTRY(xen_iret_crit_fixup) | |||
| 270 | lea PT_ORIG_EAX(%esp), %esi | 205 | lea PT_ORIG_EAX(%esp), %esi |
| 271 | lea PT_EFLAGS(%esp), %edi | 206 | lea PT_EFLAGS(%esp), %edi |
| 272 | 207 | ||
| 273 | /* If eip is before iret_restore_end then stack | 208 | /* |
| 274 | hasn't been restored yet. */ | 209 | * If eip is before iret_restore_end then stack |
| 210 | * hasn't been restored yet. | ||
| 211 | */ | ||
| 275 | cmp $iret_restore_end, %eax | 212 | cmp $iret_restore_end, %eax |
| 276 | jae 1f | 213 | jae 1f |
| 277 | 214 | ||
| 278 | movl 0+4(%edi),%eax /* copy EAX (just above top of frame) */ | 215 | movl 0+4(%edi), %eax /* copy EAX (just above top of frame) */ |
| 279 | movl %eax, PT_EAX(%esp) | 216 | movl %eax, PT_EAX(%esp) |
| 280 | 217 | ||
| 281 | lea ESP_OFFSET(%edi),%edi /* move dest up over saved regs */ | 218 | lea ESP_OFFSET(%edi), %edi /* move dest up over saved regs */ |
| 282 | 219 | ||
| 283 | /* set up the copy */ | 220 | /* set up the copy */ |
| 284 | 1: std | 221 | 1: std |
| @@ -286,20 +223,6 @@ ENTRY(xen_iret_crit_fixup) | |||
| 286 | rep movsl | 223 | rep movsl |
| 287 | cld | 224 | cld |
| 288 | 225 | ||
| 289 | lea 4(%edi),%esp /* point esp to new frame */ | 226 | lea 4(%edi), %esp /* point esp to new frame */ |
| 290 | 2: jmp xen_do_upcall | 227 | 2: jmp xen_do_upcall |
| 291 | 228 | ||
| 292 | |||
| 293 | /* | ||
| 294 | Force an event check by making a hypercall, | ||
| 295 | but preserve regs before making the call. | ||
| 296 | */ | ||
| 297 | check_events: | ||
| 298 | push %eax | ||
| 299 | push %ecx | ||
| 300 | push %edx | ||
| 301 | call xen_force_evtchn_callback | ||
| 302 | pop %edx | ||
| 303 | pop %ecx | ||
| 304 | pop %eax | ||
| 305 | ret | ||
diff --git a/arch/x86/xen/xen-asm_64.S b/arch/x86/xen/xen-asm_64.S index 05794c566e87..02f496a8dbaa 100644 --- a/arch/x86/xen/xen-asm_64.S +++ b/arch/x86/xen/xen-asm_64.S | |||
| @@ -1,174 +1,45 @@ | |||
| 1 | /* | 1 | /* |
| 2 | Asm versions of Xen pv-ops, suitable for either direct use or inlining. | 2 | * Asm versions of Xen pv-ops, suitable for either direct use or |
| 3 | The inline versions are the same as the direct-use versions, with the | 3 | * inlining. The inline versions are the same as the direct-use |
| 4 | pre- and post-amble chopped off. | 4 | * versions, with the pre- and post-amble chopped off. |
| 5 | 5 | * | |
| 6 | This code is encoded for size rather than absolute efficiency, | 6 | * This code is encoded for size rather than absolute efficiency, with |
| 7 | with a view to being able to inline as much as possible. | 7 | * a view to being able to inline as much as possible. |
| 8 | 8 | * | |
| 9 | We only bother with direct forms (ie, vcpu in pda) of the operations | 9 | * We only bother with direct forms (ie, vcpu in pda) of the |
| 10 | here; the indirect forms are better handled in C, since they're | 10 | * operations here; the indirect forms are better handled in C, since |
| 11 | generally too large to inline anyway. | 11 | * they're generally too large to inline anyway. |
| 12 | */ | 12 | */ |
| 13 | 13 | ||
| 14 | #include <linux/linkage.h> | ||
| 15 | |||
| 16 | #include <asm/asm-offsets.h> | ||
| 17 | #include <asm/processor-flags.h> | ||
| 18 | #include <asm/errno.h> | 14 | #include <asm/errno.h> |
| 15 | #include <asm/percpu.h> | ||
| 16 | #include <asm/processor-flags.h> | ||
| 19 | #include <asm/segment.h> | 17 | #include <asm/segment.h> |
| 20 | 18 | ||
| 21 | #include <xen/interface/xen.h> | 19 | #include <xen/interface/xen.h> |
| 22 | 20 | ||
| 23 | #define RELOC(x, v) .globl x##_reloc; x##_reloc=v | 21 | #include "xen-asm.h" |
| 24 | #define ENDPATCH(x) .globl x##_end; x##_end=. | ||
| 25 | |||
| 26 | /* Pseudo-flag used for virtual NMI, which we don't implement yet */ | ||
| 27 | #define XEN_EFLAGS_NMI 0x80000000 | ||
| 28 | |||
| 29 | #if 1 | ||
| 30 | /* | ||
| 31 | x86-64 does not yet support direct access to percpu variables | ||
| 32 | via a segment override, so we just need to make sure this code | ||
| 33 | never gets used | ||
| 34 | */ | ||
| 35 | #define BUG ud2a | ||
| 36 | #define PER_CPU_VAR(var, off) 0xdeadbeef | ||
| 37 | #endif | ||
| 38 | |||
| 39 | /* | ||
| 40 | Enable events. This clears the event mask and tests the pending | ||
| 41 | event status with one and operation. If there are pending | ||
| 42 | events, then enter the hypervisor to get them handled. | ||
| 43 | */ | ||
| 44 | ENTRY(xen_irq_enable_direct) | ||
| 45 | BUG | ||
| 46 | |||
| 47 | /* Unmask events */ | ||
| 48 | movb $0, PER_CPU_VAR(xen_vcpu_info, XEN_vcpu_info_mask) | ||
| 49 | |||
| 50 | /* Preempt here doesn't matter because that will deal with | ||
| 51 | any pending interrupts. The pending check may end up being | ||
| 52 | run on the wrong CPU, but that doesn't hurt. */ | ||
| 53 | |||
| 54 | /* Test for pending */ | ||
| 55 | testb $0xff, PER_CPU_VAR(xen_vcpu_info, XEN_vcpu_info_pending) | ||
| 56 | jz 1f | ||
| 57 | |||
| 58 | 2: call check_events | ||
| 59 | 1: | ||
| 60 | ENDPATCH(xen_irq_enable_direct) | ||
| 61 | ret | ||
| 62 | ENDPROC(xen_irq_enable_direct) | ||
| 63 | RELOC(xen_irq_enable_direct, 2b+1) | ||
| 64 | |||
| 65 | /* | ||
| 66 | Disabling events is simply a matter of making the event mask | ||
| 67 | non-zero. | ||
| 68 | */ | ||
| 69 | ENTRY(xen_irq_disable_direct) | ||
| 70 | BUG | ||
| 71 | |||
| 72 | movb $1, PER_CPU_VAR(xen_vcpu_info, XEN_vcpu_info_mask) | ||
| 73 | ENDPATCH(xen_irq_disable_direct) | ||
| 74 | ret | ||
| 75 | ENDPROC(xen_irq_disable_direct) | ||
| 76 | RELOC(xen_irq_disable_direct, 0) | ||
| 77 | |||
| 78 | /* | ||
| 79 | (xen_)save_fl is used to get the current interrupt enable status. | ||
| 80 | Callers expect the status to be in X86_EFLAGS_IF, and other bits | ||
| 81 | may be set in the return value. We take advantage of this by | ||
| 82 | making sure that X86_EFLAGS_IF has the right value (and other bits | ||
| 83 | in that byte are 0), but other bits in the return value are | ||
| 84 | undefined. We need to toggle the state of the bit, because | ||
| 85 | Xen and x86 use opposite senses (mask vs enable). | ||
| 86 | */ | ||
| 87 | ENTRY(xen_save_fl_direct) | ||
| 88 | BUG | ||
| 89 | |||
| 90 | testb $0xff, PER_CPU_VAR(xen_vcpu_info, XEN_vcpu_info_mask) | ||
| 91 | setz %ah | ||
| 92 | addb %ah,%ah | ||
| 93 | ENDPATCH(xen_save_fl_direct) | ||
| 94 | ret | ||
| 95 | ENDPROC(xen_save_fl_direct) | ||
| 96 | RELOC(xen_save_fl_direct, 0) | ||
| 97 | |||
| 98 | /* | ||
| 99 | In principle the caller should be passing us a value return | ||
| 100 | from xen_save_fl_direct, but for robustness sake we test only | ||
| 101 | the X86_EFLAGS_IF flag rather than the whole byte. After | ||
| 102 | setting the interrupt mask state, it checks for unmasked | ||
| 103 | pending events and enters the hypervisor to get them delivered | ||
| 104 | if so. | ||
| 105 | */ | ||
| 106 | ENTRY(xen_restore_fl_direct) | ||
| 107 | BUG | ||
| 108 | |||
| 109 | testb $X86_EFLAGS_IF>>8, %ah | ||
| 110 | setz PER_CPU_VAR(xen_vcpu_info, XEN_vcpu_info_mask) | ||
| 111 | /* Preempt here doesn't matter because that will deal with | ||
| 112 | any pending interrupts. The pending check may end up being | ||
| 113 | run on the wrong CPU, but that doesn't hurt. */ | ||
| 114 | |||
| 115 | /* check for unmasked and pending */ | ||
| 116 | cmpw $0x0001, PER_CPU_VAR(xen_vcpu_info, XEN_vcpu_info_pending) | ||
| 117 | jz 1f | ||
| 118 | 2: call check_events | ||
| 119 | 1: | ||
| 120 | ENDPATCH(xen_restore_fl_direct) | ||
| 121 | ret | ||
| 122 | ENDPROC(xen_restore_fl_direct) | ||
| 123 | RELOC(xen_restore_fl_direct, 2b+1) | ||
| 124 | |||
| 125 | |||
| 126 | /* | ||
| 127 | Force an event check by making a hypercall, | ||
| 128 | but preserve regs before making the call. | ||
| 129 | */ | ||
| 130 | check_events: | ||
| 131 | push %rax | ||
| 132 | push %rcx | ||
| 133 | push %rdx | ||
| 134 | push %rsi | ||
| 135 | push %rdi | ||
| 136 | push %r8 | ||
| 137 | push %r9 | ||
| 138 | push %r10 | ||
| 139 | push %r11 | ||
| 140 | call xen_force_evtchn_callback | ||
| 141 | pop %r11 | ||
| 142 | pop %r10 | ||
| 143 | pop %r9 | ||
| 144 | pop %r8 | ||
| 145 | pop %rdi | ||
| 146 | pop %rsi | ||
| 147 | pop %rdx | ||
| 148 | pop %rcx | ||
| 149 | pop %rax | ||
| 150 | ret | ||
| 151 | 22 | ||
| 152 | ENTRY(xen_adjust_exception_frame) | 23 | ENTRY(xen_adjust_exception_frame) |
| 153 | mov 8+0(%rsp),%rcx | 24 | mov 8+0(%rsp), %rcx |
| 154 | mov 8+8(%rsp),%r11 | 25 | mov 8+8(%rsp), %r11 |
| 155 | ret $16 | 26 | ret $16 |
| 156 | 27 | ||
| 157 | hypercall_iret = hypercall_page + __HYPERVISOR_iret * 32 | 28 | hypercall_iret = hypercall_page + __HYPERVISOR_iret * 32 |
| 158 | /* | 29 | /* |
| 159 | Xen64 iret frame: | 30 | * Xen64 iret frame: |
| 160 | 31 | * | |
| 161 | ss | 32 | * ss |
| 162 | rsp | 33 | * rsp |
| 163 | rflags | 34 | * rflags |
| 164 | cs | 35 | * cs |
| 165 | rip <-- standard iret frame | 36 | * rip <-- standard iret frame |
| 166 | 37 | * | |
| 167 | flags | 38 | * flags |
| 168 | 39 | * | |
| 169 | rcx } | 40 | * rcx } |
| 170 | r11 }<-- pushed by hypercall page | 41 | * r11 }<-- pushed by hypercall page |
| 171 | rsp -> rax } | 42 | * rsp->rax } |
| 172 | */ | 43 | */ |
| 173 | ENTRY(xen_iret) | 44 | ENTRY(xen_iret) |
| 174 | pushq $0 | 45 | pushq $0 |
| @@ -177,8 +48,8 @@ ENDPATCH(xen_iret) | |||
| 177 | RELOC(xen_iret, 1b+1) | 48 | RELOC(xen_iret, 1b+1) |
| 178 | 49 | ||
| 179 | /* | 50 | /* |
| 180 | sysexit is not used for 64-bit processes, so it's | 51 | * sysexit is not used for 64-bit processes, so it's only ever used to |
| 181 | only ever used to return to 32-bit compat userspace. | 52 | * return to 32-bit compat userspace. |
| 182 | */ | 53 | */ |
| 183 | ENTRY(xen_sysexit) | 54 | ENTRY(xen_sysexit) |
| 184 | pushq $__USER32_DS | 55 | pushq $__USER32_DS |
| @@ -193,13 +64,15 @@ ENDPATCH(xen_sysexit) | |||
| 193 | RELOC(xen_sysexit, 1b+1) | 64 | RELOC(xen_sysexit, 1b+1) |
| 194 | 65 | ||
| 195 | ENTRY(xen_sysret64) | 66 | ENTRY(xen_sysret64) |
| 196 | /* We're already on the usermode stack at this point, but still | 67 | /* |
| 197 | with the kernel gs, so we can easily switch back */ | 68 | * We're already on the usermode stack at this point, but |
| 198 | movq %rsp, %gs:pda_oldrsp | 69 | * still with the kernel gs, so we can easily switch back |
| 199 | movq %gs:pda_kernelstack,%rsp | 70 | */ |
| 71 | movq %rsp, PER_CPU_VAR(old_rsp) | ||
| 72 | movq PER_CPU_VAR(kernel_stack), %rsp | ||
| 200 | 73 | ||
| 201 | pushq $__USER_DS | 74 | pushq $__USER_DS |
| 202 | pushq %gs:pda_oldrsp | 75 | pushq PER_CPU_VAR(old_rsp) |
| 203 | pushq %r11 | 76 | pushq %r11 |
| 204 | pushq $__USER_CS | 77 | pushq $__USER_CS |
| 205 | pushq %rcx | 78 | pushq %rcx |
| @@ -210,13 +83,15 @@ ENDPATCH(xen_sysret64) | |||
| 210 | RELOC(xen_sysret64, 1b+1) | 83 | RELOC(xen_sysret64, 1b+1) |
| 211 | 84 | ||
| 212 | ENTRY(xen_sysret32) | 85 | ENTRY(xen_sysret32) |
| 213 | /* We're already on the usermode stack at this point, but still | 86 | /* |
| 214 | with the kernel gs, so we can easily switch back */ | 87 | * We're already on the usermode stack at this point, but |
| 215 | movq %rsp, %gs:pda_oldrsp | 88 | * still with the kernel gs, so we can easily switch back |
| 216 | movq %gs:pda_kernelstack, %rsp | 89 | */ |
| 90 | movq %rsp, PER_CPU_VAR(old_rsp) | ||
| 91 | movq PER_CPU_VAR(kernel_stack), %rsp | ||
| 217 | 92 | ||
| 218 | pushq $__USER32_DS | 93 | pushq $__USER32_DS |
| 219 | pushq %gs:pda_oldrsp | 94 | pushq PER_CPU_VAR(old_rsp) |
| 220 | pushq %r11 | 95 | pushq %r11 |
| 221 | pushq $__USER32_CS | 96 | pushq $__USER32_CS |
| 222 | pushq %rcx | 97 | pushq %rcx |
| @@ -227,28 +102,27 @@ ENDPATCH(xen_sysret32) | |||
| 227 | RELOC(xen_sysret32, 1b+1) | 102 | RELOC(xen_sysret32, 1b+1) |
| 228 | 103 | ||
| 229 | /* | 104 | /* |
| 230 | Xen handles syscall callbacks much like ordinary exceptions, | 105 | * Xen handles syscall callbacks much like ordinary exceptions, which |
| 231 | which means we have: | 106 | * means we have: |
| 232 | - kernel gs | 107 | * - kernel gs |
| 233 | - kernel rsp | 108 | * - kernel rsp |
| 234 | - an iret-like stack frame on the stack (including rcx and r11): | 109 | * - an iret-like stack frame on the stack (including rcx and r11): |
| 235 | ss | 110 | * ss |
| 236 | rsp | 111 | * rsp |
| 237 | rflags | 112 | * rflags |
| 238 | cs | 113 | * cs |
| 239 | rip | 114 | * rip |
| 240 | r11 | 115 | * r11 |
| 241 | rsp-> rcx | 116 | * rsp->rcx |
| 242 | 117 | * | |
| 243 | In all the entrypoints, we undo all that to make it look | 118 | * In all the entrypoints, we undo all that to make it look like a |
| 244 | like a CPU-generated syscall/sysenter and jump to the normal | 119 | * CPU-generated syscall/sysenter and jump to the normal entrypoint. |
| 245 | entrypoint. | ||
| 246 | */ | 120 | */ |
| 247 | 121 | ||
| 248 | .macro undo_xen_syscall | 122 | .macro undo_xen_syscall |
| 249 | mov 0*8(%rsp),%rcx | 123 | mov 0*8(%rsp), %rcx |
| 250 | mov 1*8(%rsp),%r11 | 124 | mov 1*8(%rsp), %r11 |
| 251 | mov 5*8(%rsp),%rsp | 125 | mov 5*8(%rsp), %rsp |
| 252 | .endm | 126 | .endm |
| 253 | 127 | ||
| 254 | /* Normal 64-bit system call target */ | 128 | /* Normal 64-bit system call target */ |
| @@ -275,7 +149,7 @@ ENDPROC(xen_sysenter_target) | |||
| 275 | 149 | ||
| 276 | ENTRY(xen_syscall32_target) | 150 | ENTRY(xen_syscall32_target) |
| 277 | ENTRY(xen_sysenter_target) | 151 | ENTRY(xen_sysenter_target) |
| 278 | lea 16(%rsp), %rsp /* strip %rcx,%r11 */ | 152 | lea 16(%rsp), %rsp /* strip %rcx, %r11 */ |
| 279 | mov $-ENOSYS, %rax | 153 | mov $-ENOSYS, %rax |
| 280 | pushq $VGCF_in_syscall | 154 | pushq $VGCF_in_syscall |
| 281 | jmp hypercall_iret | 155 | jmp hypercall_iret |
diff --git a/arch/x86/xen/xen-head.S b/arch/x86/xen/xen-head.S index 63d49a523ed3..1a5ff24e29c0 100644 --- a/arch/x86/xen/xen-head.S +++ b/arch/x86/xen/xen-head.S | |||
| @@ -8,7 +8,7 @@ | |||
| 8 | 8 | ||
| 9 | #include <asm/boot.h> | 9 | #include <asm/boot.h> |
| 10 | #include <asm/asm.h> | 10 | #include <asm/asm.h> |
| 11 | #include <asm/page.h> | 11 | #include <asm/page_types.h> |
| 12 | 12 | ||
| 13 | #include <xen/interface/elfnote.h> | 13 | #include <xen/interface/elfnote.h> |
| 14 | #include <asm/xen/interface.h> | 14 | #include <asm/xen/interface.h> |
diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h index c1f8faf0a2c5..2f5ef2632ea2 100644 --- a/arch/x86/xen/xen-ops.h +++ b/arch/x86/xen/xen-ops.h | |||
| @@ -10,9 +10,12 @@ | |||
| 10 | extern const char xen_hypervisor_callback[]; | 10 | extern const char xen_hypervisor_callback[]; |
| 11 | extern const char xen_failsafe_callback[]; | 11 | extern const char xen_failsafe_callback[]; |
| 12 | 12 | ||
| 13 | extern void *xen_initial_gdt; | ||
| 14 | |||
| 13 | struct trap_info; | 15 | struct trap_info; |
| 14 | void xen_copy_trap_info(struct trap_info *traps); | 16 | void xen_copy_trap_info(struct trap_info *traps); |
| 15 | 17 | ||
| 18 | DECLARE_PER_CPU(struct vcpu_info, xen_vcpu_info); | ||
| 16 | DECLARE_PER_CPU(unsigned long, xen_cr3); | 19 | DECLARE_PER_CPU(unsigned long, xen_cr3); |
| 17 | DECLARE_PER_CPU(unsigned long, xen_current_cr3); | 20 | DECLARE_PER_CPU(unsigned long, xen_current_cr3); |
| 18 | 21 | ||
| @@ -22,6 +25,13 @@ extern struct shared_info *HYPERVISOR_shared_info; | |||
| 22 | 25 | ||
| 23 | void xen_setup_mfn_list_list(void); | 26 | void xen_setup_mfn_list_list(void); |
| 24 | void xen_setup_shared_info(void); | 27 | void xen_setup_shared_info(void); |
| 28 | void xen_setup_machphys_mapping(void); | ||
| 29 | pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn); | ||
| 30 | void xen_ident_map_ISA(void); | ||
| 31 | void xen_reserve_top(void); | ||
| 32 | |||
| 33 | void xen_leave_lazy(void); | ||
| 34 | void xen_post_allocator_init(void); | ||
| 25 | 35 | ||
| 26 | char * __init xen_memory_setup(void); | 36 | char * __init xen_memory_setup(void); |
| 27 | void __init xen_arch_setup(void); | 37 | void __init xen_arch_setup(void); |
diff --git a/arch/xtensa/include/asm/swab.h b/arch/xtensa/include/asm/swab.h index f50b697eb601..226a39162310 100644 --- a/arch/xtensa/include/asm/swab.h +++ b/arch/xtensa/include/asm/swab.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | #ifndef _XTENSA_SWAB_H | 11 | #ifndef _XTENSA_SWAB_H |
| 12 | #define _XTENSA_SWAB_H | 12 | #define _XTENSA_SWAB_H |
| 13 | 13 | ||
| 14 | #include <asm/types.h> | 14 | #include <linux/types.h> |
| 15 | #include <linux/compiler.h> | 15 | #include <linux/compiler.h> |
| 16 | 16 | ||
| 17 | #define __SWAB_64_THRU_32__ | 17 | #define __SWAB_64_THRU_32__ |
diff --git a/drivers/acpi/acpica/tbxface.c b/drivers/acpi/acpica/tbxface.c index c3e841f3cde9..ab0aff3c7d6a 100644 --- a/drivers/acpi/acpica/tbxface.c +++ b/drivers/acpi/acpica/tbxface.c | |||
| @@ -365,7 +365,7 @@ ACPI_EXPORT_SYMBOL(acpi_unload_table_id) | |||
| 365 | 365 | ||
| 366 | /******************************************************************************* | 366 | /******************************************************************************* |
| 367 | * | 367 | * |
| 368 | * FUNCTION: acpi_get_table | 368 | * FUNCTION: acpi_get_table_with_size |
| 369 | * | 369 | * |
| 370 | * PARAMETERS: Signature - ACPI signature of needed table | 370 | * PARAMETERS: Signature - ACPI signature of needed table |
| 371 | * Instance - Which instance (for SSDTs) | 371 | * Instance - Which instance (for SSDTs) |
| @@ -377,8 +377,9 @@ ACPI_EXPORT_SYMBOL(acpi_unload_table_id) | |||
| 377 | * | 377 | * |
| 378 | *****************************************************************************/ | 378 | *****************************************************************************/ |
| 379 | acpi_status | 379 | acpi_status |
| 380 | acpi_get_table(char *signature, | 380 | acpi_get_table_with_size(char *signature, |
| 381 | u32 instance, struct acpi_table_header **out_table) | 381 | u32 instance, struct acpi_table_header **out_table, |
| 382 | acpi_size *tbl_size) | ||
| 382 | { | 383 | { |
| 383 | u32 i; | 384 | u32 i; |
| 384 | u32 j; | 385 | u32 j; |
| @@ -408,6 +409,7 @@ acpi_get_table(char *signature, | |||
| 408 | acpi_tb_verify_table(&acpi_gbl_root_table_list.tables[i]); | 409 | acpi_tb_verify_table(&acpi_gbl_root_table_list.tables[i]); |
| 409 | if (ACPI_SUCCESS(status)) { | 410 | if (ACPI_SUCCESS(status)) { |
| 410 | *out_table = acpi_gbl_root_table_list.tables[i].pointer; | 411 | *out_table = acpi_gbl_root_table_list.tables[i].pointer; |
| 412 | *tbl_size = acpi_gbl_root_table_list.tables[i].length; | ||
| 411 | } | 413 | } |
| 412 | 414 | ||
| 413 | if (!acpi_gbl_permanent_mmap) { | 415 | if (!acpi_gbl_permanent_mmap) { |
| @@ -420,6 +422,15 @@ acpi_get_table(char *signature, | |||
| 420 | return (AE_NOT_FOUND); | 422 | return (AE_NOT_FOUND); |
| 421 | } | 423 | } |
| 422 | 424 | ||
| 425 | acpi_status | ||
| 426 | acpi_get_table(char *signature, | ||
| 427 | u32 instance, struct acpi_table_header **out_table) | ||
| 428 | { | ||
| 429 | acpi_size tbl_size; | ||
| 430 | |||
| 431 | return acpi_get_table_with_size(signature, | ||
| 432 | instance, out_table, &tbl_size); | ||
| 433 | } | ||
| 423 | ACPI_EXPORT_SYMBOL(acpi_get_table) | 434 | ACPI_EXPORT_SYMBOL(acpi_get_table) |
| 424 | 435 | ||
| 425 | /******************************************************************************* | 436 | /******************************************************************************* |
diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index b3193ec0a2ef..d1dd5160daa9 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c | |||
| @@ -274,12 +274,19 @@ EXPORT_SYMBOL_GPL(acpi_os_map_memory); | |||
| 274 | 274 | ||
| 275 | void acpi_os_unmap_memory(void __iomem * virt, acpi_size size) | 275 | void acpi_os_unmap_memory(void __iomem * virt, acpi_size size) |
| 276 | { | 276 | { |
| 277 | if (acpi_gbl_permanent_mmap) { | 277 | if (acpi_gbl_permanent_mmap) |
| 278 | iounmap(virt); | 278 | iounmap(virt); |
| 279 | } | 279 | else |
| 280 | __acpi_unmap_table(virt, size); | ||
| 280 | } | 281 | } |
| 281 | EXPORT_SYMBOL_GPL(acpi_os_unmap_memory); | 282 | EXPORT_SYMBOL_GPL(acpi_os_unmap_memory); |
| 282 | 283 | ||
| 284 | void early_acpi_os_unmap_memory(void __iomem * virt, acpi_size size) | ||
| 285 | { | ||
| 286 | if (!acpi_gbl_permanent_mmap) | ||
| 287 | __acpi_unmap_table(virt, size); | ||
| 288 | } | ||
| 289 | |||
| 283 | #ifdef ACPI_FUTURE_USAGE | 290 | #ifdef ACPI_FUTURE_USAGE |
| 284 | acpi_status | 291 | acpi_status |
| 285 | acpi_os_get_physical_address(void *virt, acpi_physical_address * phys) | 292 | acpi_os_get_physical_address(void *virt, acpi_physical_address * phys) |
diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c index a8852952fac4..fec1ae36d431 100644 --- a/drivers/acpi/tables.c +++ b/drivers/acpi/tables.c | |||
| @@ -181,14 +181,15 @@ acpi_table_parse_entries(char *id, | |||
| 181 | struct acpi_subtable_header *entry; | 181 | struct acpi_subtable_header *entry; |
| 182 | unsigned int count = 0; | 182 | unsigned int count = 0; |
| 183 | unsigned long table_end; | 183 | unsigned long table_end; |
| 184 | acpi_size tbl_size; | ||
| 184 | 185 | ||
| 185 | if (!handler) | 186 | if (!handler) |
| 186 | return -EINVAL; | 187 | return -EINVAL; |
| 187 | 188 | ||
| 188 | if (strncmp(id, ACPI_SIG_MADT, 4) == 0) | 189 | if (strncmp(id, ACPI_SIG_MADT, 4) == 0) |
| 189 | acpi_get_table(id, acpi_apic_instance, &table_header); | 190 | acpi_get_table_with_size(id, acpi_apic_instance, &table_header, &tbl_size); |
| 190 | else | 191 | else |
| 191 | acpi_get_table(id, 0, &table_header); | 192 | acpi_get_table_with_size(id, 0, &table_header, &tbl_size); |
| 192 | 193 | ||
| 193 | if (!table_header) { | 194 | if (!table_header) { |
| 194 | printk(KERN_WARNING PREFIX "%4.4s not present\n", id); | 195 | printk(KERN_WARNING PREFIX "%4.4s not present\n", id); |
| @@ -206,8 +207,10 @@ acpi_table_parse_entries(char *id, | |||
| 206 | table_end) { | 207 | table_end) { |
| 207 | if (entry->type == entry_id | 208 | if (entry->type == entry_id |
| 208 | && (!max_entries || count++ < max_entries)) | 209 | && (!max_entries || count++ < max_entries)) |
| 209 | if (handler(entry, table_end)) | 210 | if (handler(entry, table_end)) { |
| 211 | early_acpi_os_unmap_memory((char *)table_header, tbl_size); | ||
| 210 | return -EINVAL; | 212 | return -EINVAL; |
| 213 | } | ||
| 211 | 214 | ||
| 212 | entry = (struct acpi_subtable_header *) | 215 | entry = (struct acpi_subtable_header *) |
| 213 | ((unsigned long)entry + entry->length); | 216 | ((unsigned long)entry + entry->length); |
| @@ -217,6 +220,7 @@ acpi_table_parse_entries(char *id, | |||
| 217 | "%i found\n", id, entry_id, count - max_entries, count); | 220 | "%i found\n", id, entry_id, count - max_entries, count); |
| 218 | } | 221 | } |
| 219 | 222 | ||
| 223 | early_acpi_os_unmap_memory((char *)table_header, tbl_size); | ||
| 220 | return count; | 224 | return count; |
| 221 | } | 225 | } |
| 222 | 226 | ||
| @@ -241,17 +245,19 @@ acpi_table_parse_madt(enum acpi_madt_type id, | |||
| 241 | int __init acpi_table_parse(char *id, acpi_table_handler handler) | 245 | int __init acpi_table_parse(char *id, acpi_table_handler handler) |
| 242 | { | 246 | { |
| 243 | struct acpi_table_header *table = NULL; | 247 | struct acpi_table_header *table = NULL; |
| 248 | acpi_size tbl_size; | ||
| 244 | 249 | ||
| 245 | if (!handler) | 250 | if (!handler) |
| 246 | return -EINVAL; | 251 | return -EINVAL; |
| 247 | 252 | ||
| 248 | if (strncmp(id, ACPI_SIG_MADT, 4) == 0) | 253 | if (strncmp(id, ACPI_SIG_MADT, 4) == 0) |
| 249 | acpi_get_table(id, acpi_apic_instance, &table); | 254 | acpi_get_table_with_size(id, acpi_apic_instance, &table, &tbl_size); |
| 250 | else | 255 | else |
| 251 | acpi_get_table(id, 0, &table); | 256 | acpi_get_table_with_size(id, 0, &table, &tbl_size); |
| 252 | 257 | ||
| 253 | if (table) { | 258 | if (table) { |
| 254 | handler(table); | 259 | handler(table); |
| 260 | early_acpi_os_unmap_memory(table, tbl_size); | ||
| 255 | return 0; | 261 | return 0; |
| 256 | } else | 262 | } else |
| 257 | return 1; | 263 | return 1; |
| @@ -265,8 +271,9 @@ int __init acpi_table_parse(char *id, acpi_table_handler handler) | |||
| 265 | static void __init check_multiple_madt(void) | 271 | static void __init check_multiple_madt(void) |
| 266 | { | 272 | { |
| 267 | struct acpi_table_header *table = NULL; | 273 | struct acpi_table_header *table = NULL; |
| 274 | acpi_size tbl_size; | ||
| 268 | 275 | ||
| 269 | acpi_get_table(ACPI_SIG_MADT, 2, &table); | 276 | acpi_get_table_with_size(ACPI_SIG_MADT, 2, &table, &tbl_size); |
| 270 | if (table) { | 277 | if (table) { |
| 271 | printk(KERN_WARNING PREFIX | 278 | printk(KERN_WARNING PREFIX |
| 272 | "BIOS bug: multiple APIC/MADT found," | 279 | "BIOS bug: multiple APIC/MADT found," |
| @@ -275,6 +282,7 @@ static void __init check_multiple_madt(void) | |||
| 275 | "If \"acpi_apic_instance=%d\" works better, " | 282 | "If \"acpi_apic_instance=%d\" works better, " |
| 276 | "notify linux-acpi@vger.kernel.org\n", | 283 | "notify linux-acpi@vger.kernel.org\n", |
| 277 | acpi_apic_instance ? 0 : 2); | 284 | acpi_apic_instance ? 0 : 2); |
| 285 | early_acpi_os_unmap_memory(table, tbl_size); | ||
| 278 | 286 | ||
| 279 | } else | 287 | } else |
| 280 | acpi_apic_instance = 0; | 288 | acpi_apic_instance = 0; |
diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c index 719ee5c1c8d9..5b257a57bc57 100644 --- a/drivers/base/cpu.c +++ b/drivers/base/cpu.c | |||
| @@ -107,7 +107,7 @@ static SYSDEV_ATTR(crash_notes, 0400, show_crash_notes, NULL); | |||
| 107 | /* | 107 | /* |
| 108 | * Print cpu online, possible, present, and system maps | 108 | * Print cpu online, possible, present, and system maps |
| 109 | */ | 109 | */ |
| 110 | static ssize_t print_cpus_map(char *buf, cpumask_t *map) | 110 | static ssize_t print_cpus_map(char *buf, const struct cpumask *map) |
| 111 | { | 111 | { |
| 112 | int n = cpulist_scnprintf(buf, PAGE_SIZE-2, map); | 112 | int n = cpulist_scnprintf(buf, PAGE_SIZE-2, map); |
| 113 | 113 | ||
diff --git a/drivers/base/topology.c b/drivers/base/topology.c index a778fb52b11f..bf6b13206d00 100644 --- a/drivers/base/topology.c +++ b/drivers/base/topology.c | |||
| @@ -31,7 +31,10 @@ | |||
| 31 | #include <linux/hardirq.h> | 31 | #include <linux/hardirq.h> |
| 32 | #include <linux/topology.h> | 32 | #include <linux/topology.h> |
| 33 | 33 | ||
| 34 | #define define_one_ro(_name) \ | 34 | #define define_one_ro_named(_name, _func) \ |
| 35 | static SYSDEV_ATTR(_name, 0444, _func, NULL) | ||
| 36 | |||
| 37 | #define define_one_ro(_name) \ | ||
| 35 | static SYSDEV_ATTR(_name, 0444, show_##_name, NULL) | 38 | static SYSDEV_ATTR(_name, 0444, show_##_name, NULL) |
| 36 | 39 | ||
| 37 | #define define_id_show_func(name) \ | 40 | #define define_id_show_func(name) \ |
| @@ -42,8 +45,8 @@ static ssize_t show_##name(struct sys_device *dev, \ | |||
| 42 | return sprintf(buf, "%d\n", topology_##name(cpu)); \ | 45 | return sprintf(buf, "%d\n", topology_##name(cpu)); \ |
| 43 | } | 46 | } |
| 44 | 47 | ||
| 45 | #if defined(topology_thread_siblings) || defined(topology_core_siblings) | 48 | #if defined(topology_thread_cpumask) || defined(topology_core_cpumask) |
| 46 | static ssize_t show_cpumap(int type, cpumask_t *mask, char *buf) | 49 | static ssize_t show_cpumap(int type, const struct cpumask *mask, char *buf) |
| 47 | { | 50 | { |
| 48 | ptrdiff_t len = PTR_ALIGN(buf + PAGE_SIZE - 1, PAGE_SIZE) - buf; | 51 | ptrdiff_t len = PTR_ALIGN(buf + PAGE_SIZE - 1, PAGE_SIZE) - buf; |
| 49 | int n = 0; | 52 | int n = 0; |
| @@ -65,7 +68,7 @@ static ssize_t show_##name(struct sys_device *dev, \ | |||
| 65 | struct sysdev_attribute *attr, char *buf) \ | 68 | struct sysdev_attribute *attr, char *buf) \ |
| 66 | { \ | 69 | { \ |
| 67 | unsigned int cpu = dev->id; \ | 70 | unsigned int cpu = dev->id; \ |
| 68 | return show_cpumap(0, &(topology_##name(cpu)), buf); \ | 71 | return show_cpumap(0, topology_##name(cpu), buf); \ |
| 69 | } | 72 | } |
| 70 | 73 | ||
| 71 | #define define_siblings_show_list(name) \ | 74 | #define define_siblings_show_list(name) \ |
| @@ -74,7 +77,7 @@ static ssize_t show_##name##_list(struct sys_device *dev, \ | |||
| 74 | char *buf) \ | 77 | char *buf) \ |
| 75 | { \ | 78 | { \ |
| 76 | unsigned int cpu = dev->id; \ | 79 | unsigned int cpu = dev->id; \ |
| 77 | return show_cpumap(1, &(topology_##name(cpu)), buf); \ | 80 | return show_cpumap(1, topology_##name(cpu), buf); \ |
| 78 | } | 81 | } |
| 79 | 82 | ||
| 80 | #else | 83 | #else |
| @@ -82,9 +85,7 @@ static ssize_t show_##name##_list(struct sys_device *dev, \ | |||
| 82 | static ssize_t show_##name(struct sys_device *dev, \ | 85 | static ssize_t show_##name(struct sys_device *dev, \ |
| 83 | struct sysdev_attribute *attr, char *buf) \ | 86 | struct sysdev_attribute *attr, char *buf) \ |
| 84 | { \ | 87 | { \ |
| 85 | unsigned int cpu = dev->id; \ | 88 | return show_cpumap(0, topology_##name(dev->id), buf); \ |
| 86 | cpumask_t mask = topology_##name(cpu); \ | ||
| 87 | return show_cpumap(0, &mask, buf); \ | ||
| 88 | } | 89 | } |
| 89 | 90 | ||
| 90 | #define define_siblings_show_list(name) \ | 91 | #define define_siblings_show_list(name) \ |
| @@ -92,9 +93,7 @@ static ssize_t show_##name##_list(struct sys_device *dev, \ | |||
| 92 | struct sysdev_attribute *attr, \ | 93 | struct sysdev_attribute *attr, \ |
| 93 | char *buf) \ | 94 | char *buf) \ |
| 94 | { \ | 95 | { \ |
| 95 | unsigned int cpu = dev->id; \ | 96 | return show_cpumap(1, topology_##name(dev->id), buf); \ |
| 96 | cpumask_t mask = topology_##name(cpu); \ | ||
| 97 | return show_cpumap(1, &mask, buf); \ | ||
| 98 | } | 97 | } |
| 99 | #endif | 98 | #endif |
| 100 | 99 | ||
| @@ -107,13 +106,13 @@ define_one_ro(physical_package_id); | |||
| 107 | define_id_show_func(core_id); | 106 | define_id_show_func(core_id); |
| 108 | define_one_ro(core_id); | 107 | define_one_ro(core_id); |
| 109 | 108 | ||
| 110 | define_siblings_show_func(thread_siblings); | 109 | define_siblings_show_func(thread_cpumask); |
| 111 | define_one_ro(thread_siblings); | 110 | define_one_ro_named(thread_siblings, show_thread_cpumask); |
| 112 | define_one_ro(thread_siblings_list); | 111 | define_one_ro_named(thread_siblings_list, show_thread_cpumask_list); |
| 113 | 112 | ||
| 114 | define_siblings_show_func(core_siblings); | 113 | define_siblings_show_func(core_cpumask); |
| 115 | define_one_ro(core_siblings); | 114 | define_one_ro_named(core_siblings, show_core_cpumask); |
| 116 | define_one_ro(core_siblings_list); | 115 | define_one_ro_named(core_siblings_list, show_core_cpumask_list); |
| 117 | 116 | ||
| 118 | static struct attribute *default_attrs[] = { | 117 | static struct attribute *default_attrs[] = { |
| 119 | &attr_physical_package_id.attr, | 118 | &attr_physical_package_id.attr, |
diff --git a/drivers/clocksource/acpi_pm.c b/drivers/clocksource/acpi_pm.c index e1129fad96dd..ee19b6e8fcb4 100644 --- a/drivers/clocksource/acpi_pm.c +++ b/drivers/clocksource/acpi_pm.c | |||
| @@ -143,7 +143,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_LE, | |||
| 143 | #endif | 143 | #endif |
| 144 | 144 | ||
| 145 | #ifndef CONFIG_X86_64 | 145 | #ifndef CONFIG_X86_64 |
| 146 | #include "mach_timer.h" | 146 | #include <asm/mach_timer.h> |
| 147 | #define PMTMR_EXPECTED_RATE \ | 147 | #define PMTMR_EXPECTED_RATE \ |
| 148 | ((CALIBRATE_LATCH * (PMTMR_TICKS_PER_SEC >> 10)) / (CLOCK_TICK_RATE>>10)) | 148 | ((CALIBRATE_LATCH * (PMTMR_TICKS_PER_SEC >> 10)) / (CLOCK_TICK_RATE>>10)) |
| 149 | /* | 149 | /* |
diff --git a/drivers/clocksource/cyclone.c b/drivers/clocksource/cyclone.c index 1bde303b970b..8615059a8729 100644 --- a/drivers/clocksource/cyclone.c +++ b/drivers/clocksource/cyclone.c | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | #include <asm/pgtable.h> | 7 | #include <asm/pgtable.h> |
| 8 | #include <asm/io.h> | 8 | #include <asm/io.h> |
| 9 | 9 | ||
| 10 | #include "mach_timer.h" | 10 | #include <asm/mach_timer.h> |
| 11 | 11 | ||
| 12 | #define CYCLONE_CBAR_ADDR 0xFEB00CD0 /* base address ptr */ | 12 | #define CYCLONE_CBAR_ADDR 0xFEB00CD0 /* base address ptr */ |
| 13 | #define CYCLONE_PMCC_OFFSET 0x51A0 /* offset to control register */ | 13 | #define CYCLONE_PMCC_OFFSET 0x51A0 /* offset to control register */ |
diff --git a/drivers/eisa/Kconfig b/drivers/eisa/Kconfig index c0646576cf47..2705284f6223 100644 --- a/drivers/eisa/Kconfig +++ b/drivers/eisa/Kconfig | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | # | 3 | # |
| 4 | config EISA_VLB_PRIMING | 4 | config EISA_VLB_PRIMING |
| 5 | bool "Vesa Local Bus priming" | 5 | bool "Vesa Local Bus priming" |
| 6 | depends on X86_PC && EISA | 6 | depends on X86 && EISA |
| 7 | default n | 7 | default n |
| 8 | ---help--- | 8 | ---help--- |
| 9 | Activate this option if your system contains a Vesa Local | 9 | Activate this option if your system contains a Vesa Local |
| @@ -24,11 +24,11 @@ config EISA_PCI_EISA | |||
| 24 | When in doubt, say Y. | 24 | When in doubt, say Y. |
| 25 | 25 | ||
| 26 | # Using EISA_VIRTUAL_ROOT on something other than an Alpha or | 26 | # Using EISA_VIRTUAL_ROOT on something other than an Alpha or |
| 27 | # an X86_PC may lead to crashes... | 27 | # an X86 may lead to crashes... |
| 28 | 28 | ||
| 29 | config EISA_VIRTUAL_ROOT | 29 | config EISA_VIRTUAL_ROOT |
| 30 | bool "EISA virtual root device" | 30 | bool "EISA virtual root device" |
| 31 | depends on EISA && (ALPHA || X86_PC) | 31 | depends on EISA && (ALPHA || X86) |
| 32 | default y | 32 | default y |
| 33 | ---help--- | 33 | ---help--- |
| 34 | Activate this option if your system only have EISA bus | 34 | Activate this option if your system only have EISA bus |
diff --git a/drivers/firmware/dcdbas.c b/drivers/firmware/dcdbas.c index 777fba48d2d3..3009e0171e54 100644 --- a/drivers/firmware/dcdbas.c +++ b/drivers/firmware/dcdbas.c | |||
| @@ -244,7 +244,7 @@ static ssize_t host_control_on_shutdown_store(struct device *dev, | |||
| 244 | */ | 244 | */ |
| 245 | int dcdbas_smi_request(struct smi_cmd *smi_cmd) | 245 | int dcdbas_smi_request(struct smi_cmd *smi_cmd) |
| 246 | { | 246 | { |
| 247 | cpumask_t old_mask; | 247 | cpumask_var_t old_mask; |
| 248 | int ret = 0; | 248 | int ret = 0; |
| 249 | 249 | ||
| 250 | if (smi_cmd->magic != SMI_CMD_MAGIC) { | 250 | if (smi_cmd->magic != SMI_CMD_MAGIC) { |
| @@ -254,8 +254,11 @@ int dcdbas_smi_request(struct smi_cmd *smi_cmd) | |||
| 254 | } | 254 | } |
| 255 | 255 | ||
| 256 | /* SMI requires CPU 0 */ | 256 | /* SMI requires CPU 0 */ |
| 257 | old_mask = current->cpus_allowed; | 257 | if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) |
| 258 | set_cpus_allowed_ptr(current, &cpumask_of_cpu(0)); | 258 | return -ENOMEM; |
| 259 | |||
| 260 | cpumask_copy(old_mask, ¤t->cpus_allowed); | ||
| 261 | set_cpus_allowed_ptr(current, cpumask_of(0)); | ||
| 259 | if (smp_processor_id() != 0) { | 262 | if (smp_processor_id() != 0) { |
| 260 | dev_dbg(&dcdbas_pdev->dev, "%s: failed to get CPU 0\n", | 263 | dev_dbg(&dcdbas_pdev->dev, "%s: failed to get CPU 0\n", |
| 261 | __func__); | 264 | __func__); |
| @@ -275,7 +278,8 @@ int dcdbas_smi_request(struct smi_cmd *smi_cmd) | |||
| 275 | ); | 278 | ); |
| 276 | 279 | ||
| 277 | out: | 280 | out: |
| 278 | set_cpus_allowed_ptr(current, &old_mask); | 281 | set_cpus_allowed_ptr(current, old_mask); |
| 282 | free_cpumask_var(old_mask); | ||
| 279 | return ret; | 283 | return ret; |
| 280 | } | 284 | } |
| 281 | 285 | ||
diff --git a/drivers/firmware/iscsi_ibft.c b/drivers/firmware/iscsi_ibft.c index 3ab3e4a41d67..7b7ddc2d51c9 100644 --- a/drivers/firmware/iscsi_ibft.c +++ b/drivers/firmware/iscsi_ibft.c | |||
| @@ -938,8 +938,8 @@ static int __init ibft_init(void) | |||
| 938 | return -ENOMEM; | 938 | return -ENOMEM; |
| 939 | 939 | ||
| 940 | if (ibft_addr) { | 940 | if (ibft_addr) { |
| 941 | printk(KERN_INFO "iBFT detected at 0x%lx.\n", | 941 | printk(KERN_INFO "iBFT detected at 0x%llx.\n", |
| 942 | virt_to_phys((void *)ibft_addr)); | 942 | (u64)virt_to_phys((void *)ibft_addr)); |
| 943 | 943 | ||
| 944 | rc = ibft_check_device(); | 944 | rc = ibft_check_device(); |
| 945 | if (rc) | 945 | if (rc) |
diff --git a/drivers/gpu/drm/drm_proc.c b/drivers/gpu/drm/drm_proc.c index 8df849f66830..b756f043a5f4 100644 --- a/drivers/gpu/drm/drm_proc.c +++ b/drivers/gpu/drm/drm_proc.c | |||
| @@ -678,9 +678,9 @@ static int drm__vma_info(char *buf, char **start, off_t offset, int request, | |||
| 678 | *start = &buf[offset]; | 678 | *start = &buf[offset]; |
| 679 | *eof = 0; | 679 | *eof = 0; |
| 680 | 680 | ||
| 681 | DRM_PROC_PRINT("vma use count: %d, high_memory = %p, 0x%08lx\n", | 681 | DRM_PROC_PRINT("vma use count: %d, high_memory = %p, 0x%llx\n", |
| 682 | atomic_read(&dev->vma_count), | 682 | atomic_read(&dev->vma_count), |
| 683 | high_memory, virt_to_phys(high_memory)); | 683 | high_memory, (u64)virt_to_phys(high_memory)); |
| 684 | list_for_each_entry(pt, &dev->vmalist, head) { | 684 | list_for_each_entry(pt, &dev->vmalist, head) { |
| 685 | if (!(vma = pt->vma)) | 685 | if (!(vma = pt->vma)) |
| 686 | continue; | 686 | continue; |
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig index 35561689ff38..ea2638b41982 100644 --- a/drivers/input/keyboard/Kconfig +++ b/drivers/input/keyboard/Kconfig | |||
| @@ -13,11 +13,11 @@ menuconfig INPUT_KEYBOARD | |||
| 13 | if INPUT_KEYBOARD | 13 | if INPUT_KEYBOARD |
| 14 | 14 | ||
| 15 | config KEYBOARD_ATKBD | 15 | config KEYBOARD_ATKBD |
| 16 | tristate "AT keyboard" if EMBEDDED || !X86_PC | 16 | tristate "AT keyboard" if EMBEDDED || !X86 |
| 17 | default y | 17 | default y |
| 18 | select SERIO | 18 | select SERIO |
| 19 | select SERIO_LIBPS2 | 19 | select SERIO_LIBPS2 |
| 20 | select SERIO_I8042 if X86_PC | 20 | select SERIO_I8042 if X86 |
| 21 | select SERIO_GSCPS2 if GSC | 21 | select SERIO_GSCPS2 if GSC |
| 22 | help | 22 | help |
| 23 | Say Y here if you want to use a standard AT or PS/2 keyboard. Usually | 23 | Say Y here if you want to use a standard AT or PS/2 keyboard. Usually |
diff --git a/drivers/input/mouse/Kconfig b/drivers/input/mouse/Kconfig index 093c8c1bca74..9bef935ef19f 100644 --- a/drivers/input/mouse/Kconfig +++ b/drivers/input/mouse/Kconfig | |||
| @@ -17,7 +17,7 @@ config MOUSE_PS2 | |||
| 17 | default y | 17 | default y |
| 18 | select SERIO | 18 | select SERIO |
| 19 | select SERIO_LIBPS2 | 19 | select SERIO_LIBPS2 |
| 20 | select SERIO_I8042 if X86_PC | 20 | select SERIO_I8042 if X86 |
| 21 | select SERIO_GSCPS2 if GSC | 21 | select SERIO_GSCPS2 if GSC |
| 22 | help | 22 | help |
| 23 | Say Y here if you have a PS/2 mouse connected to your system. This | 23 | Say Y here if you have a PS/2 mouse connected to your system. This |
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index c64e6798878a..1c484084ed4f 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig | |||
| @@ -162,7 +162,7 @@ config ENCLOSURE_SERVICES | |||
| 162 | config SGI_XP | 162 | config SGI_XP |
| 163 | tristate "Support communication between SGI SSIs" | 163 | tristate "Support communication between SGI SSIs" |
| 164 | depends on NET | 164 | depends on NET |
| 165 | depends on (IA64_GENERIC || IA64_SGI_SN2 || IA64_SGI_UV || X86_64) && SMP | 165 | depends on (IA64_GENERIC || IA64_SGI_SN2 || IA64_SGI_UV || X86_UV) && SMP |
| 166 | select IA64_UNCACHED_ALLOCATOR if IA64_GENERIC || IA64_SGI_SN2 | 166 | select IA64_UNCACHED_ALLOCATOR if IA64_GENERIC || IA64_SGI_SN2 |
| 167 | select GENERIC_ALLOCATOR if IA64_GENERIC || IA64_SGI_SN2 | 167 | select GENERIC_ALLOCATOR if IA64_GENERIC || IA64_SGI_SN2 |
| 168 | select SGI_GRU if (IA64_GENERIC || IA64_SGI_UV || X86_64) && SMP | 168 | select SGI_GRU if (IA64_GENERIC || IA64_SGI_UV || X86_64) && SMP |
| @@ -189,7 +189,7 @@ config HP_ILO | |||
| 189 | 189 | ||
| 190 | config SGI_GRU | 190 | config SGI_GRU |
| 191 | tristate "SGI GRU driver" | 191 | tristate "SGI GRU driver" |
| 192 | depends on (X86_64 || IA64_SGI_UV || IA64_GENERIC) && SMP | 192 | depends on (X86_UV || IA64_SGI_UV || IA64_GENERIC) && SMP |
| 193 | default n | 193 | default n |
| 194 | select MMU_NOTIFIER | 194 | select MMU_NOTIFIER |
| 195 | ---help--- | 195 | ---help--- |
diff --git a/drivers/misc/sgi-gru/grufile.c b/drivers/misc/sgi-gru/grufile.c index 650983806392..c67e4e8bd62c 100644 --- a/drivers/misc/sgi-gru/grufile.c +++ b/drivers/misc/sgi-gru/grufile.c | |||
| @@ -36,23 +36,11 @@ | |||
| 36 | #include <linux/interrupt.h> | 36 | #include <linux/interrupt.h> |
| 37 | #include <linux/proc_fs.h> | 37 | #include <linux/proc_fs.h> |
| 38 | #include <linux/uaccess.h> | 38 | #include <linux/uaccess.h> |
| 39 | #include <asm/uv/uv.h> | ||
| 39 | #include "gru.h" | 40 | #include "gru.h" |
| 40 | #include "grulib.h" | 41 | #include "grulib.h" |
| 41 | #include "grutables.h" | 42 | #include "grutables.h" |
| 42 | 43 | ||
| 43 | #if defined CONFIG_X86_64 | ||
| 44 | #include <asm/genapic.h> | ||
| 45 | #include <asm/irq.h> | ||
| 46 | #define IS_UV() is_uv_system() | ||
| 47 | #elif defined CONFIG_IA64 | ||
| 48 | #include <asm/system.h> | ||
| 49 | #include <asm/sn/simulator.h> | ||
| 50 | /* temp support for running on hardware simulator */ | ||
| 51 | #define IS_UV() IS_MEDUSA() || ia64_platform_is("uv") | ||
| 52 | #else | ||
| 53 | #define IS_UV() 0 | ||
| 54 | #endif | ||
| 55 | |||
| 56 | #include <asm/uv/uv_hub.h> | 44 | #include <asm/uv/uv_hub.h> |
| 57 | #include <asm/uv/uv_mmrs.h> | 45 | #include <asm/uv/uv_mmrs.h> |
| 58 | 46 | ||
| @@ -381,7 +369,7 @@ static int __init gru_init(void) | |||
| 381 | char id[10]; | 369 | char id[10]; |
| 382 | void *gru_start_vaddr; | 370 | void *gru_start_vaddr; |
| 383 | 371 | ||
| 384 | if (!IS_UV()) | 372 | if (!is_uv_system()) |
| 385 | return 0; | 373 | return 0; |
| 386 | 374 | ||
| 387 | #if defined CONFIG_IA64 | 375 | #if defined CONFIG_IA64 |
| @@ -451,7 +439,7 @@ static void __exit gru_exit(void) | |||
| 451 | int order = get_order(sizeof(struct gru_state) * | 439 | int order = get_order(sizeof(struct gru_state) * |
| 452 | GRU_CHIPLETS_PER_BLADE); | 440 | GRU_CHIPLETS_PER_BLADE); |
| 453 | 441 | ||
| 454 | if (!IS_UV()) | 442 | if (!is_uv_system()) |
| 455 | return; | 443 | return; |
| 456 | 444 | ||
| 457 | for (i = 0; i < GRU_CHIPLETS_PER_BLADE; i++) | 445 | for (i = 0; i < GRU_CHIPLETS_PER_BLADE; i++) |
diff --git a/drivers/misc/sgi-xp/xp.h b/drivers/misc/sgi-xp/xp.h index 7b4cbd5e03e9..2275126cb334 100644 --- a/drivers/misc/sgi-xp/xp.h +++ b/drivers/misc/sgi-xp/xp.h | |||
| @@ -15,19 +15,19 @@ | |||
| 15 | 15 | ||
| 16 | #include <linux/mutex.h> | 16 | #include <linux/mutex.h> |
| 17 | 17 | ||
| 18 | #ifdef CONFIG_IA64 | 18 | #if defined CONFIG_X86_UV || defined CONFIG_IA64_SGI_UV |
| 19 | #include <asm/uv/uv.h> | ||
| 20 | #define is_uv() is_uv_system() | ||
| 21 | #endif | ||
| 22 | |||
| 23 | #ifndef is_uv | ||
| 24 | #define is_uv() 0 | ||
| 25 | #endif | ||
| 26 | |||
| 27 | #if defined CONFIG_IA64 | ||
| 19 | #include <asm/system.h> | 28 | #include <asm/system.h> |
| 20 | #include <asm/sn/arch.h> /* defines is_shub1() and is_shub2() */ | 29 | #include <asm/sn/arch.h> /* defines is_shub1() and is_shub2() */ |
| 21 | #define is_shub() ia64_platform_is("sn2") | 30 | #define is_shub() ia64_platform_is("sn2") |
| 22 | #ifdef CONFIG_IA64_SGI_UV | ||
| 23 | #define is_uv() ia64_platform_is("uv") | ||
| 24 | #else | ||
| 25 | #define is_uv() 0 | ||
| 26 | #endif | ||
| 27 | #endif | ||
| 28 | #ifdef CONFIG_X86_64 | ||
| 29 | #include <asm/genapic.h> | ||
| 30 | #define is_uv() is_uv_system() | ||
| 31 | #endif | 31 | #endif |
| 32 | 32 | ||
| 33 | #ifndef is_shub1 | 33 | #ifndef is_shub1 |
| @@ -42,10 +42,6 @@ | |||
| 42 | #define is_shub() 0 | 42 | #define is_shub() 0 |
| 43 | #endif | 43 | #endif |
| 44 | 44 | ||
| 45 | #ifndef is_uv | ||
| 46 | #define is_uv() 0 | ||
| 47 | #endif | ||
| 48 | |||
| 49 | #ifdef USE_DBUG_ON | 45 | #ifdef USE_DBUG_ON |
| 50 | #define DBUG_ON(condition) BUG_ON(condition) | 46 | #define DBUG_ON(condition) BUG_ON(condition) |
| 51 | #else | 47 | #else |
diff --git a/drivers/misc/sgi-xp/xpc_main.c b/drivers/misc/sgi-xp/xpc_main.c index 89218f7cfaa7..6576170de962 100644 --- a/drivers/misc/sgi-xp/xpc_main.c +++ b/drivers/misc/sgi-xp/xpc_main.c | |||
| @@ -318,7 +318,7 @@ xpc_hb_checker(void *ignore) | |||
| 318 | 318 | ||
| 319 | /* this thread was marked active by xpc_hb_init() */ | 319 | /* this thread was marked active by xpc_hb_init() */ |
| 320 | 320 | ||
| 321 | set_cpus_allowed_ptr(current, &cpumask_of_cpu(XPC_HB_CHECK_CPU)); | 321 | set_cpus_allowed_ptr(current, cpumask_of(XPC_HB_CHECK_CPU)); |
| 322 | 322 | ||
| 323 | /* set our heartbeating to other partitions into motion */ | 323 | /* set our heartbeating to other partitions into motion */ |
| 324 | xpc_hb_check_timeout = jiffies + (xpc_hb_check_interval * HZ); | 324 | xpc_hb_check_timeout = jiffies + (xpc_hb_check_interval * HZ); |
diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig index 8b12e6e109d3..2ff88791cebc 100644 --- a/drivers/mtd/nand/Kconfig +++ b/drivers/mtd/nand/Kconfig | |||
| @@ -273,7 +273,7 @@ config MTD_NAND_CAFE | |||
| 273 | 273 | ||
| 274 | config MTD_NAND_CS553X | 274 | config MTD_NAND_CS553X |
| 275 | tristate "NAND support for CS5535/CS5536 (AMD Geode companion chip)" | 275 | tristate "NAND support for CS5535/CS5536 (AMD Geode companion chip)" |
| 276 | depends on X86_32 && (X86_PC || X86_GENERICARCH) | 276 | depends on X86_32 |
| 277 | help | 277 | help |
| 278 | The CS553x companion chips for the AMD Geode processor | 278 | The CS553x companion chips for the AMD Geode processor |
| 279 | include NAND flash controllers with built-in hardware ECC | 279 | include NAND flash controllers with built-in hardware ECC |
diff --git a/drivers/net/ne3210.c b/drivers/net/ne3210.c index fac43fd6fc87..6a843f7350ab 100644 --- a/drivers/net/ne3210.c +++ b/drivers/net/ne3210.c | |||
| @@ -150,7 +150,8 @@ static int __init ne3210_eisa_probe (struct device *device) | |||
| 150 | if (phys_mem < virt_to_phys(high_memory)) { | 150 | if (phys_mem < virt_to_phys(high_memory)) { |
| 151 | printk(KERN_CRIT "ne3210.c: Card RAM overlaps with normal memory!!!\n"); | 151 | printk(KERN_CRIT "ne3210.c: Card RAM overlaps with normal memory!!!\n"); |
| 152 | printk(KERN_CRIT "ne3210.c: Use EISA SCU to set card memory below 1MB,\n"); | 152 | printk(KERN_CRIT "ne3210.c: Use EISA SCU to set card memory below 1MB,\n"); |
| 153 | printk(KERN_CRIT "ne3210.c: or to an address above 0x%lx.\n", virt_to_phys(high_memory)); | 153 | printk(KERN_CRIT "ne3210.c: or to an address above 0x%llx.\n", |
| 154 | (u64)virt_to_phys(high_memory)); | ||
| 154 | printk(KERN_CRIT "ne3210.c: Driver NOT installed.\n"); | 155 | printk(KERN_CRIT "ne3210.c: Driver NOT installed.\n"); |
| 155 | retval = -EINVAL; | 156 | retval = -EINVAL; |
| 156 | goto out3; | 157 | goto out3; |
diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c index ab0e09bf154d..847e9bb0098f 100644 --- a/drivers/net/sfc/efx.c +++ b/drivers/net/sfc/efx.c | |||
| @@ -854,20 +854,27 @@ static void efx_fini_io(struct efx_nic *efx) | |||
| 854 | * interrupts across them. */ | 854 | * interrupts across them. */ |
| 855 | static int efx_wanted_rx_queues(void) | 855 | static int efx_wanted_rx_queues(void) |
| 856 | { | 856 | { |
| 857 | cpumask_t core_mask; | 857 | cpumask_var_t core_mask; |
| 858 | int count; | 858 | int count; |
| 859 | int cpu; | 859 | int cpu; |
| 860 | 860 | ||
| 861 | cpus_clear(core_mask); | 861 | if (!alloc_cpumask_var(&core_mask, GFP_KERNEL)) { |
| 862 | printk(KERN_WARNING | ||
| 863 | "efx.c: allocation failure, irq balancing hobbled\n"); | ||
| 864 | return 1; | ||
| 865 | } | ||
| 866 | |||
| 867 | cpumask_clear(core_mask); | ||
| 862 | count = 0; | 868 | count = 0; |
| 863 | for_each_online_cpu(cpu) { | 869 | for_each_online_cpu(cpu) { |
| 864 | if (!cpu_isset(cpu, core_mask)) { | 870 | if (!cpumask_test_cpu(cpu, core_mask)) { |
| 865 | ++count; | 871 | ++count; |
| 866 | cpus_or(core_mask, core_mask, | 872 | cpumask_or(core_mask, core_mask, |
| 867 | topology_core_siblings(cpu)); | 873 | topology_core_cpumask(cpu)); |
| 868 | } | 874 | } |
| 869 | } | 875 | } |
| 870 | 876 | ||
| 877 | free_cpumask_var(core_mask); | ||
| 871 | return count; | 878 | return count; |
| 872 | } | 879 | } |
| 873 | 880 | ||
diff --git a/drivers/net/sfc/falcon.c b/drivers/net/sfc/falcon.c index d5378e60fcdd..064307c2277e 100644 --- a/drivers/net/sfc/falcon.c +++ b/drivers/net/sfc/falcon.c | |||
| @@ -338,10 +338,10 @@ static int falcon_alloc_special_buffer(struct efx_nic *efx, | |||
| 338 | nic_data->next_buffer_table += buffer->entries; | 338 | nic_data->next_buffer_table += buffer->entries; |
| 339 | 339 | ||
| 340 | EFX_LOG(efx, "allocating special buffers %d-%d at %llx+%x " | 340 | EFX_LOG(efx, "allocating special buffers %d-%d at %llx+%x " |
| 341 | "(virt %p phys %lx)\n", buffer->index, | 341 | "(virt %p phys %llx)\n", buffer->index, |
| 342 | buffer->index + buffer->entries - 1, | 342 | buffer->index + buffer->entries - 1, |
| 343 | (unsigned long long)buffer->dma_addr, len, | 343 | (u64)buffer->dma_addr, len, |
| 344 | buffer->addr, virt_to_phys(buffer->addr)); | 344 | buffer->addr, (u64)virt_to_phys(buffer->addr)); |
| 345 | 345 | ||
| 346 | return 0; | 346 | return 0; |
| 347 | } | 347 | } |
| @@ -353,10 +353,10 @@ static void falcon_free_special_buffer(struct efx_nic *efx, | |||
| 353 | return; | 353 | return; |
| 354 | 354 | ||
| 355 | EFX_LOG(efx, "deallocating special buffers %d-%d at %llx+%x " | 355 | EFX_LOG(efx, "deallocating special buffers %d-%d at %llx+%x " |
| 356 | "(virt %p phys %lx)\n", buffer->index, | 356 | "(virt %p phys %llx)\n", buffer->index, |
| 357 | buffer->index + buffer->entries - 1, | 357 | buffer->index + buffer->entries - 1, |
| 358 | (unsigned long long)buffer->dma_addr, buffer->len, | 358 | (u64)buffer->dma_addr, buffer->len, |
| 359 | buffer->addr, virt_to_phys(buffer->addr)); | 359 | buffer->addr, (u64)virt_to_phys(buffer->addr)); |
| 360 | 360 | ||
| 361 | pci_free_consistent(efx->pci_dev, buffer->len, buffer->addr, | 361 | pci_free_consistent(efx->pci_dev, buffer->len, buffer->addr, |
| 362 | buffer->dma_addr); | 362 | buffer->dma_addr); |
| @@ -2343,10 +2343,10 @@ int falcon_probe_port(struct efx_nic *efx) | |||
| 2343 | FALCON_MAC_STATS_SIZE); | 2343 | FALCON_MAC_STATS_SIZE); |
| 2344 | if (rc) | 2344 | if (rc) |
| 2345 | return rc; | 2345 | return rc; |
| 2346 | EFX_LOG(efx, "stats buffer at %llx (virt %p phys %lx)\n", | 2346 | EFX_LOG(efx, "stats buffer at %llx (virt %p phys %llx)\n", |
| 2347 | (unsigned long long)efx->stats_buffer.dma_addr, | 2347 | (u64)efx->stats_buffer.dma_addr, |
| 2348 | efx->stats_buffer.addr, | 2348 | efx->stats_buffer.addr, |
| 2349 | virt_to_phys(efx->stats_buffer.addr)); | 2349 | (u64)virt_to_phys(efx->stats_buffer.addr)); |
| 2350 | 2350 | ||
| 2351 | return 0; | 2351 | return 0; |
| 2352 | } | 2352 | } |
| @@ -2921,9 +2921,9 @@ int falcon_probe_nic(struct efx_nic *efx) | |||
| 2921 | goto fail4; | 2921 | goto fail4; |
| 2922 | BUG_ON(efx->irq_status.dma_addr & 0x0f); | 2922 | BUG_ON(efx->irq_status.dma_addr & 0x0f); |
| 2923 | 2923 | ||
| 2924 | EFX_LOG(efx, "INT_KER at %llx (virt %p phys %lx)\n", | 2924 | EFX_LOG(efx, "INT_KER at %llx (virt %p phys %llx)\n", |
| 2925 | (unsigned long long)efx->irq_status.dma_addr, | 2925 | (u64)efx->irq_status.dma_addr, |
| 2926 | efx->irq_status.addr, virt_to_phys(efx->irq_status.addr)); | 2926 | efx->irq_status.addr, (u64)virt_to_phys(efx->irq_status.addr)); |
| 2927 | 2927 | ||
| 2928 | falcon_probe_spi_devices(efx); | 2928 | falcon_probe_spi_devices(efx); |
| 2929 | 2929 | ||
diff --git a/drivers/net/wireless/arlan-main.c b/drivers/net/wireless/arlan-main.c index bfca15da6f0f..14c11656e82c 100644 --- a/drivers/net/wireless/arlan-main.c +++ b/drivers/net/wireless/arlan-main.c | |||
| @@ -1082,8 +1082,8 @@ static int __init arlan_probe_here(struct net_device *dev, | |||
| 1082 | if (arlan_check_fingerprint(memaddr)) | 1082 | if (arlan_check_fingerprint(memaddr)) |
| 1083 | return -ENODEV; | 1083 | return -ENODEV; |
| 1084 | 1084 | ||
| 1085 | printk(KERN_NOTICE "%s: Arlan found at %x, \n ", dev->name, | 1085 | printk(KERN_NOTICE "%s: Arlan found at %llx, \n ", dev->name, |
| 1086 | (int) virt_to_phys((void*)memaddr)); | 1086 | (u64) virt_to_phys((void*)memaddr)); |
| 1087 | 1087 | ||
| 1088 | ap->card = (void *) memaddr; | 1088 | ap->card = (void *) memaddr; |
| 1089 | dev->mem_start = memaddr; | 1089 | dev->mem_start = memaddr; |
diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c index 9da5a4b81133..c3ea5fa7d05a 100644 --- a/drivers/oprofile/buffer_sync.c +++ b/drivers/oprofile/buffer_sync.c | |||
| @@ -38,7 +38,7 @@ | |||
| 38 | 38 | ||
| 39 | static LIST_HEAD(dying_tasks); | 39 | static LIST_HEAD(dying_tasks); |
| 40 | static LIST_HEAD(dead_tasks); | 40 | static LIST_HEAD(dead_tasks); |
| 41 | static cpumask_t marked_cpus = CPU_MASK_NONE; | 41 | static cpumask_var_t marked_cpus; |
| 42 | static DEFINE_SPINLOCK(task_mortuary); | 42 | static DEFINE_SPINLOCK(task_mortuary); |
| 43 | static void process_task_mortuary(void); | 43 | static void process_task_mortuary(void); |
| 44 | 44 | ||
| @@ -456,10 +456,10 @@ static void mark_done(int cpu) | |||
| 456 | { | 456 | { |
| 457 | int i; | 457 | int i; |
| 458 | 458 | ||
| 459 | cpu_set(cpu, marked_cpus); | 459 | cpumask_set_cpu(cpu, marked_cpus); |
| 460 | 460 | ||
| 461 | for_each_online_cpu(i) { | 461 | for_each_online_cpu(i) { |
| 462 | if (!cpu_isset(i, marked_cpus)) | 462 | if (!cpumask_test_cpu(i, marked_cpus)) |
| 463 | return; | 463 | return; |
| 464 | } | 464 | } |
| 465 | 465 | ||
| @@ -468,7 +468,7 @@ static void mark_done(int cpu) | |||
| 468 | */ | 468 | */ |
| 469 | process_task_mortuary(); | 469 | process_task_mortuary(); |
| 470 | 470 | ||
| 471 | cpus_clear(marked_cpus); | 471 | cpumask_clear(marked_cpus); |
| 472 | } | 472 | } |
| 473 | 473 | ||
| 474 | 474 | ||
| @@ -565,6 +565,20 @@ void sync_buffer(int cpu) | |||
| 565 | mutex_unlock(&buffer_mutex); | 565 | mutex_unlock(&buffer_mutex); |
| 566 | } | 566 | } |
| 567 | 567 | ||
| 568 | int __init buffer_sync_init(void) | ||
| 569 | { | ||
| 570 | if (!alloc_cpumask_var(&marked_cpus, GFP_KERNEL)) | ||
| 571 | return -ENOMEM; | ||
| 572 | |||
| 573 | cpumask_clear(marked_cpus); | ||
| 574 | return 0; | ||
| 575 | } | ||
| 576 | |||
| 577 | void __exit buffer_sync_cleanup(void) | ||
| 578 | { | ||
| 579 | free_cpumask_var(marked_cpus); | ||
| 580 | } | ||
| 581 | |||
| 568 | /* The function can be used to add a buffer worth of data directly to | 582 | /* The function can be used to add a buffer worth of data directly to |
| 569 | * the kernel buffer. The buffer is assumed to be a circular buffer. | 583 | * the kernel buffer. The buffer is assumed to be a circular buffer. |
| 570 | * Take the entries from index start and end at index end, wrapping | 584 | * Take the entries from index start and end at index end, wrapping |
diff --git a/drivers/oprofile/buffer_sync.h b/drivers/oprofile/buffer_sync.h index 3110732c1835..0ebf5db62679 100644 --- a/drivers/oprofile/buffer_sync.h +++ b/drivers/oprofile/buffer_sync.h | |||
| @@ -19,4 +19,8 @@ void sync_stop(void); | |||
| 19 | /* sync the given CPU's buffer */ | 19 | /* sync the given CPU's buffer */ |
| 20 | void sync_buffer(int cpu); | 20 | void sync_buffer(int cpu); |
| 21 | 21 | ||
| 22 | /* initialize/destroy the buffer system. */ | ||
| 23 | int buffer_sync_init(void); | ||
| 24 | void buffer_sync_cleanup(void); | ||
| 25 | |||
| 22 | #endif /* OPROFILE_BUFFER_SYNC_H */ | 26 | #endif /* OPROFILE_BUFFER_SYNC_H */ |
diff --git a/drivers/oprofile/oprof.c b/drivers/oprofile/oprof.c index 3cffce90f82a..ced39f602292 100644 --- a/drivers/oprofile/oprof.c +++ b/drivers/oprofile/oprof.c | |||
| @@ -183,6 +183,10 @@ static int __init oprofile_init(void) | |||
| 183 | { | 183 | { |
| 184 | int err; | 184 | int err; |
| 185 | 185 | ||
| 186 | err = buffer_sync_init(); | ||
| 187 | if (err) | ||
| 188 | return err; | ||
| 189 | |||
| 186 | err = oprofile_arch_init(&oprofile_ops); | 190 | err = oprofile_arch_init(&oprofile_ops); |
| 187 | 191 | ||
| 188 | if (err < 0 || timer) { | 192 | if (err < 0 || timer) { |
| @@ -191,8 +195,10 @@ static int __init oprofile_init(void) | |||
| 191 | } | 195 | } |
| 192 | 196 | ||
| 193 | err = oprofilefs_register(); | 197 | err = oprofilefs_register(); |
| 194 | if (err) | 198 | if (err) { |
| 195 | oprofile_arch_exit(); | 199 | oprofile_arch_exit(); |
| 200 | buffer_sync_cleanup(); | ||
| 201 | } | ||
| 196 | 202 | ||
| 197 | return err; | 203 | return err; |
| 198 | } | 204 | } |
| @@ -202,6 +208,7 @@ static void __exit oprofile_exit(void) | |||
| 202 | { | 208 | { |
| 203 | oprofilefs_unregister(); | 209 | oprofilefs_unregister(); |
| 204 | oprofile_arch_exit(); | 210 | oprofile_arch_exit(); |
| 211 | buffer_sync_cleanup(); | ||
| 205 | } | 212 | } |
| 206 | 213 | ||
| 207 | 214 | ||
diff --git a/drivers/pci/dmar.c b/drivers/pci/dmar.c index f5a662a50acb..519f5f91e765 100644 --- a/drivers/pci/dmar.c +++ b/drivers/pci/dmar.c | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | LIST_HEAD(dmar_drhd_units); | 42 | LIST_HEAD(dmar_drhd_units); |
| 43 | 43 | ||
| 44 | static struct acpi_table_header * __initdata dmar_tbl; | 44 | static struct acpi_table_header * __initdata dmar_tbl; |
| 45 | static acpi_size dmar_tbl_size; | ||
| 45 | 46 | ||
| 46 | static void __init dmar_register_drhd_unit(struct dmar_drhd_unit *drhd) | 47 | static void __init dmar_register_drhd_unit(struct dmar_drhd_unit *drhd) |
| 47 | { | 48 | { |
| @@ -288,8 +289,9 @@ static int __init dmar_table_detect(void) | |||
| 288 | acpi_status status = AE_OK; | 289 | acpi_status status = AE_OK; |
| 289 | 290 | ||
| 290 | /* if we could find DMAR table, then there are DMAR devices */ | 291 | /* if we could find DMAR table, then there are DMAR devices */ |
| 291 | status = acpi_get_table(ACPI_SIG_DMAR, 0, | 292 | status = acpi_get_table_with_size(ACPI_SIG_DMAR, 0, |
| 292 | (struct acpi_table_header **)&dmar_tbl); | 293 | (struct acpi_table_header **)&dmar_tbl, |
| 294 | &dmar_tbl_size); | ||
| 293 | 295 | ||
| 294 | if (ACPI_SUCCESS(status) && !dmar_tbl) { | 296 | if (ACPI_SUCCESS(status) && !dmar_tbl) { |
| 295 | printk (KERN_WARNING PREFIX "Unable to map DMAR\n"); | 297 | printk (KERN_WARNING PREFIX "Unable to map DMAR\n"); |
| @@ -481,6 +483,7 @@ void __init detect_intel_iommu(void) | |||
| 481 | iommu_detected = 1; | 483 | iommu_detected = 1; |
| 482 | #endif | 484 | #endif |
| 483 | } | 485 | } |
| 486 | early_acpi_os_unmap_memory(dmar_tbl, dmar_tbl_size); | ||
| 484 | dmar_tbl = NULL; | 487 | dmar_tbl = NULL; |
| 485 | } | 488 | } |
| 486 | 489 | ||
diff --git a/drivers/pci/intr_remapping.c b/drivers/pci/intr_remapping.c index f78371b22529..5a57753ea9fc 100644 --- a/drivers/pci/intr_remapping.c +++ b/drivers/pci/intr_remapping.c | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include <linux/irq.h> | 6 | #include <linux/irq.h> |
| 7 | #include <asm/io_apic.h> | 7 | #include <asm/io_apic.h> |
| 8 | #include <asm/smp.h> | 8 | #include <asm/smp.h> |
| 9 | #include <asm/cpu.h> | ||
| 9 | #include <linux/intel-iommu.h> | 10 | #include <linux/intel-iommu.h> |
| 10 | #include "intr_remapping.h" | 11 | #include "intr_remapping.h" |
| 11 | 12 | ||
diff --git a/drivers/watchdog/rdc321x_wdt.c b/drivers/watchdog/rdc321x_wdt.c index bf92802f2bbe..36e221beedcd 100644 --- a/drivers/watchdog/rdc321x_wdt.c +++ b/drivers/watchdog/rdc321x_wdt.c | |||
| @@ -37,7 +37,7 @@ | |||
| 37 | #include <linux/io.h> | 37 | #include <linux/io.h> |
| 38 | #include <linux/uaccess.h> | 38 | #include <linux/uaccess.h> |
| 39 | 39 | ||
| 40 | #include <asm/mach-rdc321x/rdc321x_defs.h> | 40 | #include <asm/rdc321x_defs.h> |
| 41 | 41 | ||
| 42 | #define RDC_WDT_MASK 0x80000000 /* Mask */ | 42 | #define RDC_WDT_MASK 0x80000000 /* Mask */ |
| 43 | #define RDC_WDT_EN 0x00800000 /* Enable bit */ | 43 | #define RDC_WDT_EN 0x00800000 /* Enable bit */ |
diff --git a/drivers/xen/events.c b/drivers/xen/events.c index eb0dfdeaa949..30963af5dba0 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c | |||
| @@ -26,9 +26,11 @@ | |||
| 26 | #include <linux/irq.h> | 26 | #include <linux/irq.h> |
| 27 | #include <linux/module.h> | 27 | #include <linux/module.h> |
| 28 | #include <linux/string.h> | 28 | #include <linux/string.h> |
| 29 | #include <linux/bootmem.h> | ||
| 29 | 30 | ||
| 30 | #include <asm/ptrace.h> | 31 | #include <asm/ptrace.h> |
| 31 | #include <asm/irq.h> | 32 | #include <asm/irq.h> |
| 33 | #include <asm/idle.h> | ||
| 32 | #include <asm/sync_bitops.h> | 34 | #include <asm/sync_bitops.h> |
| 33 | #include <asm/xen/hypercall.h> | 35 | #include <asm/xen/hypercall.h> |
| 34 | #include <asm/xen/hypervisor.h> | 36 | #include <asm/xen/hypervisor.h> |
| @@ -50,36 +52,55 @@ static DEFINE_PER_CPU(int, virq_to_irq[NR_VIRQS]) = {[0 ... NR_VIRQS-1] = -1}; | |||
| 50 | /* IRQ <-> IPI mapping */ | 52 | /* IRQ <-> IPI mapping */ |
| 51 | static DEFINE_PER_CPU(int, ipi_to_irq[XEN_NR_IPIS]) = {[0 ... XEN_NR_IPIS-1] = -1}; | 53 | static DEFINE_PER_CPU(int, ipi_to_irq[XEN_NR_IPIS]) = {[0 ... XEN_NR_IPIS-1] = -1}; |
| 52 | 54 | ||
| 53 | /* Packed IRQ information: binding type, sub-type index, and event channel. */ | 55 | /* Interrupt types. */ |
| 54 | struct packed_irq | 56 | enum xen_irq_type { |
| 55 | { | 57 | IRQT_UNBOUND = 0, |
| 56 | unsigned short evtchn; | ||
| 57 | unsigned char index; | ||
| 58 | unsigned char type; | ||
| 59 | }; | ||
| 60 | |||
| 61 | static struct packed_irq irq_info[NR_IRQS]; | ||
| 62 | |||
| 63 | /* Binding types. */ | ||
| 64 | enum { | ||
| 65 | IRQT_UNBOUND, | ||
| 66 | IRQT_PIRQ, | 58 | IRQT_PIRQ, |
| 67 | IRQT_VIRQ, | 59 | IRQT_VIRQ, |
| 68 | IRQT_IPI, | 60 | IRQT_IPI, |
| 69 | IRQT_EVTCHN | 61 | IRQT_EVTCHN |
| 70 | }; | 62 | }; |
| 71 | 63 | ||
| 72 | /* Convenient shorthand for packed representation of an unbound IRQ. */ | 64 | /* |
| 73 | #define IRQ_UNBOUND mk_irq_info(IRQT_UNBOUND, 0, 0) | 65 | * Packed IRQ information: |
| 66 | * type - enum xen_irq_type | ||
| 67 | * event channel - irq->event channel mapping | ||
| 68 | * cpu - cpu this event channel is bound to | ||
| 69 | * index - type-specific information: | ||
| 70 | * PIRQ - vector, with MSB being "needs EIO" | ||
| 71 | * VIRQ - virq number | ||
| 72 | * IPI - IPI vector | ||
| 73 | * EVTCHN - | ||
| 74 | */ | ||
| 75 | struct irq_info | ||
| 76 | { | ||
| 77 | enum xen_irq_type type; /* type */ | ||
| 78 | unsigned short evtchn; /* event channel */ | ||
| 79 | unsigned short cpu; /* cpu bound */ | ||
| 80 | |||
| 81 | union { | ||
| 82 | unsigned short virq; | ||
| 83 | enum ipi_vector ipi; | ||
| 84 | struct { | ||
| 85 | unsigned short gsi; | ||
| 86 | unsigned short vector; | ||
| 87 | } pirq; | ||
| 88 | } u; | ||
| 89 | }; | ||
| 90 | |||
| 91 | static struct irq_info irq_info[NR_IRQS]; | ||
| 74 | 92 | ||
| 75 | static int evtchn_to_irq[NR_EVENT_CHANNELS] = { | 93 | static int evtchn_to_irq[NR_EVENT_CHANNELS] = { |
| 76 | [0 ... NR_EVENT_CHANNELS-1] = -1 | 94 | [0 ... NR_EVENT_CHANNELS-1] = -1 |
| 77 | }; | 95 | }; |
| 78 | static unsigned long cpu_evtchn_mask[NR_CPUS][NR_EVENT_CHANNELS/BITS_PER_LONG]; | 96 | struct cpu_evtchn_s { |
| 79 | static u8 cpu_evtchn[NR_EVENT_CHANNELS]; | 97 | unsigned long bits[NR_EVENT_CHANNELS/BITS_PER_LONG]; |
| 80 | 98 | }; | |
| 81 | /* Reference counts for bindings to IRQs. */ | 99 | static struct cpu_evtchn_s *cpu_evtchn_mask_p; |
| 82 | static int irq_bindcount[NR_IRQS]; | 100 | static inline unsigned long *cpu_evtchn_mask(int cpu) |
| 101 | { | ||
| 102 | return cpu_evtchn_mask_p[cpu].bits; | ||
| 103 | } | ||
| 83 | 104 | ||
| 84 | /* Xen will never allocate port zero for any purpose. */ | 105 | /* Xen will never allocate port zero for any purpose. */ |
| 85 | #define VALID_EVTCHN(chn) ((chn) != 0) | 106 | #define VALID_EVTCHN(chn) ((chn) != 0) |
| @@ -87,27 +108,108 @@ static int irq_bindcount[NR_IRQS]; | |||
| 87 | static struct irq_chip xen_dynamic_chip; | 108 | static struct irq_chip xen_dynamic_chip; |
| 88 | 109 | ||
| 89 | /* Constructor for packed IRQ information. */ | 110 | /* Constructor for packed IRQ information. */ |
| 90 | static inline struct packed_irq mk_irq_info(u32 type, u32 index, u32 evtchn) | 111 | static struct irq_info mk_unbound_info(void) |
| 112 | { | ||
| 113 | return (struct irq_info) { .type = IRQT_UNBOUND }; | ||
| 114 | } | ||
| 115 | |||
| 116 | static struct irq_info mk_evtchn_info(unsigned short evtchn) | ||
| 117 | { | ||
| 118 | return (struct irq_info) { .type = IRQT_EVTCHN, .evtchn = evtchn, | ||
| 119 | .cpu = 0 }; | ||
| 120 | } | ||
| 121 | |||
| 122 | static struct irq_info mk_ipi_info(unsigned short evtchn, enum ipi_vector ipi) | ||
| 91 | { | 123 | { |
| 92 | return (struct packed_irq) { evtchn, index, type }; | 124 | return (struct irq_info) { .type = IRQT_IPI, .evtchn = evtchn, |
| 125 | .cpu = 0, .u.ipi = ipi }; | ||
| 126 | } | ||
| 127 | |||
| 128 | static struct irq_info mk_virq_info(unsigned short evtchn, unsigned short virq) | ||
| 129 | { | ||
| 130 | return (struct irq_info) { .type = IRQT_VIRQ, .evtchn = evtchn, | ||
| 131 | .cpu = 0, .u.virq = virq }; | ||
| 132 | } | ||
| 133 | |||
| 134 | static struct irq_info mk_pirq_info(unsigned short evtchn, | ||
| 135 | unsigned short gsi, unsigned short vector) | ||
| 136 | { | ||
| 137 | return (struct irq_info) { .type = IRQT_PIRQ, .evtchn = evtchn, | ||
| 138 | .cpu = 0, .u.pirq = { .gsi = gsi, .vector = vector } }; | ||
| 93 | } | 139 | } |
| 94 | 140 | ||
| 95 | /* | 141 | /* |
| 96 | * Accessors for packed IRQ information. | 142 | * Accessors for packed IRQ information. |
| 97 | */ | 143 | */ |
| 98 | static inline unsigned int evtchn_from_irq(int irq) | 144 | static struct irq_info *info_for_irq(unsigned irq) |
| 145 | { | ||
| 146 | return &irq_info[irq]; | ||
| 147 | } | ||
| 148 | |||
| 149 | static unsigned int evtchn_from_irq(unsigned irq) | ||
| 99 | { | 150 | { |
| 100 | return irq_info[irq].evtchn; | 151 | return info_for_irq(irq)->evtchn; |
| 101 | } | 152 | } |
| 102 | 153 | ||
| 103 | static inline unsigned int index_from_irq(int irq) | 154 | static enum ipi_vector ipi_from_irq(unsigned irq) |
| 104 | { | 155 | { |
| 105 | return irq_info[irq].index; | 156 | struct irq_info *info = info_for_irq(irq); |
| 157 | |||
| 158 | BUG_ON(info == NULL); | ||
| 159 | BUG_ON(info->type != IRQT_IPI); | ||
| 160 | |||
| 161 | return info->u.ipi; | ||
| 106 | } | 162 | } |
| 107 | 163 | ||
| 108 | static inline unsigned int type_from_irq(int irq) | 164 | static unsigned virq_from_irq(unsigned irq) |
| 109 | { | 165 | { |
| 110 | return irq_info[irq].type; | 166 | struct irq_info *info = info_for_irq(irq); |
| 167 | |||
| 168 | BUG_ON(info == NULL); | ||
| 169 | BUG_ON(info->type != IRQT_VIRQ); | ||
| 170 | |||
| 171 | return info->u.virq; | ||
| 172 | } | ||
| 173 | |||
| 174 | static unsigned gsi_from_irq(unsigned irq) | ||
| 175 | { | ||
| 176 | struct irq_info *info = info_for_irq(irq); | ||
| 177 | |||
| 178 | BUG_ON(info == NULL); | ||
| 179 | BUG_ON(info->type != IRQT_PIRQ); | ||
| 180 | |||
| 181 | return info->u.pirq.gsi; | ||
| 182 | } | ||
| 183 | |||
| 184 | static unsigned vector_from_irq(unsigned irq) | ||
| 185 | { | ||
| 186 | struct irq_info *info = info_for_irq(irq); | ||
| 187 | |||
| 188 | BUG_ON(info == NULL); | ||
| 189 | BUG_ON(info->type != IRQT_PIRQ); | ||
| 190 | |||
| 191 | return info->u.pirq.vector; | ||
| 192 | } | ||
| 193 | |||
| 194 | static enum xen_irq_type type_from_irq(unsigned irq) | ||
| 195 | { | ||
| 196 | return info_for_irq(irq)->type; | ||
| 197 | } | ||
| 198 | |||
| 199 | static unsigned cpu_from_irq(unsigned irq) | ||
| 200 | { | ||
| 201 | return info_for_irq(irq)->cpu; | ||
| 202 | } | ||
| 203 | |||
| 204 | static unsigned int cpu_from_evtchn(unsigned int evtchn) | ||
| 205 | { | ||
| 206 | int irq = evtchn_to_irq[evtchn]; | ||
| 207 | unsigned ret = 0; | ||
| 208 | |||
| 209 | if (irq != -1) | ||
| 210 | ret = cpu_from_irq(irq); | ||
| 211 | |||
| 212 | return ret; | ||
| 111 | } | 213 | } |
| 112 | 214 | ||
| 113 | static inline unsigned long active_evtchns(unsigned int cpu, | 215 | static inline unsigned long active_evtchns(unsigned int cpu, |
| @@ -115,7 +217,7 @@ static inline unsigned long active_evtchns(unsigned int cpu, | |||
| 115 | unsigned int idx) | 217 | unsigned int idx) |
| 116 | { | 218 | { |
| 117 | return (sh->evtchn_pending[idx] & | 219 | return (sh->evtchn_pending[idx] & |
| 118 | cpu_evtchn_mask[cpu][idx] & | 220 | cpu_evtchn_mask(cpu)[idx] & |
| 119 | ~sh->evtchn_mask[idx]); | 221 | ~sh->evtchn_mask[idx]); |
| 120 | } | 222 | } |
| 121 | 223 | ||
| @@ -125,13 +227,13 @@ static void bind_evtchn_to_cpu(unsigned int chn, unsigned int cpu) | |||
| 125 | 227 | ||
| 126 | BUG_ON(irq == -1); | 228 | BUG_ON(irq == -1); |
| 127 | #ifdef CONFIG_SMP | 229 | #ifdef CONFIG_SMP |
| 128 | irq_to_desc(irq)->affinity = cpumask_of_cpu(cpu); | 230 | cpumask_copy(irq_to_desc(irq)->affinity, cpumask_of(cpu)); |
| 129 | #endif | 231 | #endif |
| 130 | 232 | ||
| 131 | __clear_bit(chn, cpu_evtchn_mask[cpu_evtchn[chn]]); | 233 | __clear_bit(chn, cpu_evtchn_mask(cpu_from_irq(irq))); |
| 132 | __set_bit(chn, cpu_evtchn_mask[cpu]); | 234 | __set_bit(chn, cpu_evtchn_mask(cpu)); |
| 133 | 235 | ||
| 134 | cpu_evtchn[chn] = cpu; | 236 | irq_info[irq].cpu = cpu; |
| 135 | } | 237 | } |
| 136 | 238 | ||
| 137 | static void init_evtchn_cpu_bindings(void) | 239 | static void init_evtchn_cpu_bindings(void) |
| @@ -142,17 +244,11 @@ static void init_evtchn_cpu_bindings(void) | |||
| 142 | 244 | ||
| 143 | /* By default all event channels notify CPU#0. */ | 245 | /* By default all event channels notify CPU#0. */ |
| 144 | for_each_irq_desc(i, desc) { | 246 | for_each_irq_desc(i, desc) { |
| 145 | desc->affinity = cpumask_of_cpu(0); | 247 | cpumask_copy(desc->affinity, cpumask_of(0)); |
| 146 | } | 248 | } |
| 147 | #endif | 249 | #endif |
| 148 | 250 | ||
| 149 | memset(cpu_evtchn, 0, sizeof(cpu_evtchn)); | 251 | memset(cpu_evtchn_mask(0), ~0, sizeof(cpu_evtchn_mask(0))); |
| 150 | memset(cpu_evtchn_mask[0], ~0, sizeof(cpu_evtchn_mask[0])); | ||
| 151 | } | ||
| 152 | |||
| 153 | static inline unsigned int cpu_from_evtchn(unsigned int evtchn) | ||
| 154 | { | ||
| 155 | return cpu_evtchn[evtchn]; | ||
| 156 | } | 252 | } |
| 157 | 253 | ||
| 158 | static inline void clear_evtchn(int port) | 254 | static inline void clear_evtchn(int port) |
| @@ -232,9 +328,8 @@ static int find_unbound_irq(void) | |||
| 232 | int irq; | 328 | int irq; |
| 233 | struct irq_desc *desc; | 329 | struct irq_desc *desc; |
| 234 | 330 | ||
| 235 | /* Only allocate from dynirq range */ | ||
| 236 | for (irq = 0; irq < nr_irqs; irq++) | 331 | for (irq = 0; irq < nr_irqs; irq++) |
| 237 | if (irq_bindcount[irq] == 0) | 332 | if (irq_info[irq].type == IRQT_UNBOUND) |
| 238 | break; | 333 | break; |
| 239 | 334 | ||
| 240 | if (irq == nr_irqs) | 335 | if (irq == nr_irqs) |
| @@ -244,6 +339,8 @@ static int find_unbound_irq(void) | |||
| 244 | if (WARN_ON(desc == NULL)) | 339 | if (WARN_ON(desc == NULL)) |
| 245 | return -1; | 340 | return -1; |
| 246 | 341 | ||
| 342 | dynamic_irq_init(irq); | ||
| 343 | |||
| 247 | return irq; | 344 | return irq; |
| 248 | } | 345 | } |
| 249 | 346 | ||
| @@ -258,16 +355,13 @@ int bind_evtchn_to_irq(unsigned int evtchn) | |||
| 258 | if (irq == -1) { | 355 | if (irq == -1) { |
| 259 | irq = find_unbound_irq(); | 356 | irq = find_unbound_irq(); |
| 260 | 357 | ||
| 261 | dynamic_irq_init(irq); | ||
| 262 | set_irq_chip_and_handler_name(irq, &xen_dynamic_chip, | 358 | set_irq_chip_and_handler_name(irq, &xen_dynamic_chip, |
| 263 | handle_level_irq, "event"); | 359 | handle_level_irq, "event"); |
| 264 | 360 | ||
| 265 | evtchn_to_irq[evtchn] = irq; | 361 | evtchn_to_irq[evtchn] = irq; |
| 266 | irq_info[irq] = mk_irq_info(IRQT_EVTCHN, 0, evtchn); | 362 | irq_info[irq] = mk_evtchn_info(evtchn); |
| 267 | } | 363 | } |
| 268 | 364 | ||
| 269 | irq_bindcount[irq]++; | ||
| 270 | |||
| 271 | spin_unlock(&irq_mapping_update_lock); | 365 | spin_unlock(&irq_mapping_update_lock); |
| 272 | 366 | ||
| 273 | return irq; | 367 | return irq; |
| @@ -282,12 +376,12 @@ static int bind_ipi_to_irq(unsigned int ipi, unsigned int cpu) | |||
| 282 | spin_lock(&irq_mapping_update_lock); | 376 | spin_lock(&irq_mapping_update_lock); |
| 283 | 377 | ||
| 284 | irq = per_cpu(ipi_to_irq, cpu)[ipi]; | 378 | irq = per_cpu(ipi_to_irq, cpu)[ipi]; |
| 379 | |||
| 285 | if (irq == -1) { | 380 | if (irq == -1) { |
| 286 | irq = find_unbound_irq(); | 381 | irq = find_unbound_irq(); |
| 287 | if (irq < 0) | 382 | if (irq < 0) |
| 288 | goto out; | 383 | goto out; |
| 289 | 384 | ||
| 290 | dynamic_irq_init(irq); | ||
| 291 | set_irq_chip_and_handler_name(irq, &xen_dynamic_chip, | 385 | set_irq_chip_and_handler_name(irq, &xen_dynamic_chip, |
| 292 | handle_level_irq, "ipi"); | 386 | handle_level_irq, "ipi"); |
| 293 | 387 | ||
| @@ -298,15 +392,12 @@ static int bind_ipi_to_irq(unsigned int ipi, unsigned int cpu) | |||
| 298 | evtchn = bind_ipi.port; | 392 | evtchn = bind_ipi.port; |
| 299 | 393 | ||
| 300 | evtchn_to_irq[evtchn] = irq; | 394 | evtchn_to_irq[evtchn] = irq; |
| 301 | irq_info[irq] = mk_irq_info(IRQT_IPI, ipi, evtchn); | 395 | irq_info[irq] = mk_ipi_info(evtchn, ipi); |
| 302 | |||
| 303 | per_cpu(ipi_to_irq, cpu)[ipi] = irq; | 396 | per_cpu(ipi_to_irq, cpu)[ipi] = irq; |
| 304 | 397 | ||
| 305 | bind_evtchn_to_cpu(evtchn, cpu); | 398 | bind_evtchn_to_cpu(evtchn, cpu); |
| 306 | } | 399 | } |
| 307 | 400 | ||
| 308 | irq_bindcount[irq]++; | ||
| 309 | |||
| 310 | out: | 401 | out: |
| 311 | spin_unlock(&irq_mapping_update_lock); | 402 | spin_unlock(&irq_mapping_update_lock); |
| 312 | return irq; | 403 | return irq; |
| @@ -332,20 +423,17 @@ static int bind_virq_to_irq(unsigned int virq, unsigned int cpu) | |||
| 332 | 423 | ||
| 333 | irq = find_unbound_irq(); | 424 | irq = find_unbound_irq(); |
| 334 | 425 | ||
| 335 | dynamic_irq_init(irq); | ||
| 336 | set_irq_chip_and_handler_name(irq, &xen_dynamic_chip, | 426 | set_irq_chip_and_handler_name(irq, &xen_dynamic_chip, |
| 337 | handle_level_irq, "virq"); | 427 | handle_level_irq, "virq"); |
| 338 | 428 | ||
| 339 | evtchn_to_irq[evtchn] = irq; | 429 | evtchn_to_irq[evtchn] = irq; |
| 340 | irq_info[irq] = mk_irq_info(IRQT_VIRQ, virq, evtchn); | 430 | irq_info[irq] = mk_virq_info(evtchn, virq); |
| 341 | 431 | ||
| 342 | per_cpu(virq_to_irq, cpu)[virq] = irq; | 432 | per_cpu(virq_to_irq, cpu)[virq] = irq; |
| 343 | 433 | ||
| 344 | bind_evtchn_to_cpu(evtchn, cpu); | 434 | bind_evtchn_to_cpu(evtchn, cpu); |
| 345 | } | 435 | } |
| 346 | 436 | ||
| 347 | irq_bindcount[irq]++; | ||
| 348 | |||
| 349 | spin_unlock(&irq_mapping_update_lock); | 437 | spin_unlock(&irq_mapping_update_lock); |
| 350 | 438 | ||
| 351 | return irq; | 439 | return irq; |
| @@ -358,7 +446,7 @@ static void unbind_from_irq(unsigned int irq) | |||
| 358 | 446 | ||
| 359 | spin_lock(&irq_mapping_update_lock); | 447 | spin_lock(&irq_mapping_update_lock); |
| 360 | 448 | ||
| 361 | if ((--irq_bindcount[irq] == 0) && VALID_EVTCHN(evtchn)) { | 449 | if (VALID_EVTCHN(evtchn)) { |
| 362 | close.port = evtchn; | 450 | close.port = evtchn; |
| 363 | if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0) | 451 | if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0) |
| 364 | BUG(); | 452 | BUG(); |
| @@ -366,11 +454,11 @@ static void unbind_from_irq(unsigned int irq) | |||
| 366 | switch (type_from_irq(irq)) { | 454 | switch (type_from_irq(irq)) { |
| 367 | case IRQT_VIRQ: | 455 | case IRQT_VIRQ: |
| 368 | per_cpu(virq_to_irq, cpu_from_evtchn(evtchn)) | 456 | per_cpu(virq_to_irq, cpu_from_evtchn(evtchn)) |
| 369 | [index_from_irq(irq)] = -1; | 457 | [virq_from_irq(irq)] = -1; |
| 370 | break; | 458 | break; |
| 371 | case IRQT_IPI: | 459 | case IRQT_IPI: |
| 372 | per_cpu(ipi_to_irq, cpu_from_evtchn(evtchn)) | 460 | per_cpu(ipi_to_irq, cpu_from_evtchn(evtchn)) |
| 373 | [index_from_irq(irq)] = -1; | 461 | [ipi_from_irq(irq)] = -1; |
| 374 | break; | 462 | break; |
| 375 | default: | 463 | default: |
| 376 | break; | 464 | break; |
| @@ -380,7 +468,7 @@ static void unbind_from_irq(unsigned int irq) | |||
| 380 | bind_evtchn_to_cpu(evtchn, 0); | 468 | bind_evtchn_to_cpu(evtchn, 0); |
| 381 | 469 | ||
| 382 | evtchn_to_irq[evtchn] = -1; | 470 | evtchn_to_irq[evtchn] = -1; |
| 383 | irq_info[irq] = IRQ_UNBOUND; | 471 | irq_info[irq] = mk_unbound_info(); |
| 384 | 472 | ||
| 385 | dynamic_irq_cleanup(irq); | 473 | dynamic_irq_cleanup(irq); |
| 386 | } | 474 | } |
| @@ -498,8 +586,8 @@ irqreturn_t xen_debug_interrupt(int irq, void *dev_id) | |||
| 498 | for(i = 0; i < NR_EVENT_CHANNELS; i++) { | 586 | for(i = 0; i < NR_EVENT_CHANNELS; i++) { |
| 499 | if (sync_test_bit(i, sh->evtchn_pending)) { | 587 | if (sync_test_bit(i, sh->evtchn_pending)) { |
| 500 | printk(" %d: event %d -> irq %d\n", | 588 | printk(" %d: event %d -> irq %d\n", |
| 501 | cpu_evtchn[i], i, | 589 | cpu_from_evtchn(i), i, |
| 502 | evtchn_to_irq[i]); | 590 | evtchn_to_irq[i]); |
| 503 | } | 591 | } |
| 504 | } | 592 | } |
| 505 | 593 | ||
| @@ -508,7 +596,6 @@ irqreturn_t xen_debug_interrupt(int irq, void *dev_id) | |||
| 508 | return IRQ_HANDLED; | 596 | return IRQ_HANDLED; |
| 509 | } | 597 | } |
| 510 | 598 | ||
| 511 | |||
| 512 | /* | 599 | /* |
| 513 | * Search the CPUs pending events bitmasks. For each one found, map | 600 | * Search the CPUs pending events bitmasks. For each one found, map |
| 514 | * the event number to an irq, and feed it into do_IRQ() for | 601 | * the event number to an irq, and feed it into do_IRQ() for |
| @@ -521,11 +608,15 @@ irqreturn_t xen_debug_interrupt(int irq, void *dev_id) | |||
| 521 | void xen_evtchn_do_upcall(struct pt_regs *regs) | 608 | void xen_evtchn_do_upcall(struct pt_regs *regs) |
| 522 | { | 609 | { |
| 523 | int cpu = get_cpu(); | 610 | int cpu = get_cpu(); |
| 611 | struct pt_regs *old_regs = set_irq_regs(regs); | ||
| 524 | struct shared_info *s = HYPERVISOR_shared_info; | 612 | struct shared_info *s = HYPERVISOR_shared_info; |
| 525 | struct vcpu_info *vcpu_info = __get_cpu_var(xen_vcpu); | 613 | struct vcpu_info *vcpu_info = __get_cpu_var(xen_vcpu); |
| 526 | static DEFINE_PER_CPU(unsigned, nesting_count); | 614 | static DEFINE_PER_CPU(unsigned, nesting_count); |
| 527 | unsigned count; | 615 | unsigned count; |
| 528 | 616 | ||
| 617 | exit_idle(); | ||
| 618 | irq_enter(); | ||
| 619 | |||
| 529 | do { | 620 | do { |
| 530 | unsigned long pending_words; | 621 | unsigned long pending_words; |
| 531 | 622 | ||
| @@ -550,7 +641,7 @@ void xen_evtchn_do_upcall(struct pt_regs *regs) | |||
| 550 | int irq = evtchn_to_irq[port]; | 641 | int irq = evtchn_to_irq[port]; |
| 551 | 642 | ||
| 552 | if (irq != -1) | 643 | if (irq != -1) |
| 553 | xen_do_IRQ(irq, regs); | 644 | handle_irq(irq, regs); |
| 554 | } | 645 | } |
| 555 | } | 646 | } |
| 556 | 647 | ||
| @@ -561,12 +652,17 @@ void xen_evtchn_do_upcall(struct pt_regs *regs) | |||
| 561 | } while(count != 1); | 652 | } while(count != 1); |
| 562 | 653 | ||
| 563 | out: | 654 | out: |
| 655 | irq_exit(); | ||
| 656 | set_irq_regs(old_regs); | ||
| 657 | |||
| 564 | put_cpu(); | 658 | put_cpu(); |
| 565 | } | 659 | } |
| 566 | 660 | ||
| 567 | /* Rebind a new event channel to an existing irq. */ | 661 | /* Rebind a new event channel to an existing irq. */ |
| 568 | void rebind_evtchn_irq(int evtchn, int irq) | 662 | void rebind_evtchn_irq(int evtchn, int irq) |
| 569 | { | 663 | { |
| 664 | struct irq_info *info = info_for_irq(irq); | ||
| 665 | |||
| 570 | /* Make sure the irq is masked, since the new event channel | 666 | /* Make sure the irq is masked, since the new event channel |
| 571 | will also be masked. */ | 667 | will also be masked. */ |
| 572 | disable_irq(irq); | 668 | disable_irq(irq); |
| @@ -576,11 +672,11 @@ void rebind_evtchn_irq(int evtchn, int irq) | |||
| 576 | /* After resume the irq<->evtchn mappings are all cleared out */ | 672 | /* After resume the irq<->evtchn mappings are all cleared out */ |
| 577 | BUG_ON(evtchn_to_irq[evtchn] != -1); | 673 | BUG_ON(evtchn_to_irq[evtchn] != -1); |
| 578 | /* Expect irq to have been bound before, | 674 | /* Expect irq to have been bound before, |
| 579 | so the bindcount should be non-0 */ | 675 | so there should be a proper type */ |
| 580 | BUG_ON(irq_bindcount[irq] == 0); | 676 | BUG_ON(info->type == IRQT_UNBOUND); |
| 581 | 677 | ||
| 582 | evtchn_to_irq[evtchn] = irq; | 678 | evtchn_to_irq[evtchn] = irq; |
| 583 | irq_info[irq] = mk_irq_info(IRQT_EVTCHN, 0, evtchn); | 679 | irq_info[irq] = mk_evtchn_info(evtchn); |
| 584 | 680 | ||
| 585 | spin_unlock(&irq_mapping_update_lock); | 681 | spin_unlock(&irq_mapping_update_lock); |
| 586 | 682 | ||
| @@ -690,8 +786,7 @@ static void restore_cpu_virqs(unsigned int cpu) | |||
| 690 | if ((irq = per_cpu(virq_to_irq, cpu)[virq]) == -1) | 786 | if ((irq = per_cpu(virq_to_irq, cpu)[virq]) == -1) |
| 691 | continue; | 787 | continue; |
| 692 | 788 | ||
| 693 | BUG_ON(irq_info[irq].type != IRQT_VIRQ); | 789 | BUG_ON(virq_from_irq(irq) != virq); |
| 694 | BUG_ON(irq_info[irq].index != virq); | ||
| 695 | 790 | ||
| 696 | /* Get a new binding from Xen. */ | 791 | /* Get a new binding from Xen. */ |
| 697 | bind_virq.virq = virq; | 792 | bind_virq.virq = virq; |
| @@ -703,7 +798,7 @@ static void restore_cpu_virqs(unsigned int cpu) | |||
| 703 | 798 | ||
| 704 | /* Record the new mapping. */ | 799 | /* Record the new mapping. */ |
| 705 | evtchn_to_irq[evtchn] = irq; | 800 | evtchn_to_irq[evtchn] = irq; |
| 706 | irq_info[irq] = mk_irq_info(IRQT_VIRQ, virq, evtchn); | 801 | irq_info[irq] = mk_virq_info(evtchn, virq); |
| 707 | bind_evtchn_to_cpu(evtchn, cpu); | 802 | bind_evtchn_to_cpu(evtchn, cpu); |
| 708 | 803 | ||
| 709 | /* Ready for use. */ | 804 | /* Ready for use. */ |
| @@ -720,8 +815,7 @@ static void restore_cpu_ipis(unsigned int cpu) | |||
| 720 | if ((irq = per_cpu(ipi_to_irq, cpu)[ipi]) == -1) | 815 | if ((irq = per_cpu(ipi_to_irq, cpu)[ipi]) == -1) |
| 721 | continue; | 816 | continue; |
| 722 | 817 | ||
| 723 | BUG_ON(irq_info[irq].type != IRQT_IPI); | 818 | BUG_ON(ipi_from_irq(irq) != ipi); |
| 724 | BUG_ON(irq_info[irq].index != ipi); | ||
| 725 | 819 | ||
| 726 | /* Get a new binding from Xen. */ | 820 | /* Get a new binding from Xen. */ |
| 727 | bind_ipi.vcpu = cpu; | 821 | bind_ipi.vcpu = cpu; |
| @@ -732,7 +826,7 @@ static void restore_cpu_ipis(unsigned int cpu) | |||
| 732 | 826 | ||
| 733 | /* Record the new mapping. */ | 827 | /* Record the new mapping. */ |
| 734 | evtchn_to_irq[evtchn] = irq; | 828 | evtchn_to_irq[evtchn] = irq; |
| 735 | irq_info[irq] = mk_irq_info(IRQT_IPI, ipi, evtchn); | 829 | irq_info[irq] = mk_ipi_info(evtchn, ipi); |
| 736 | bind_evtchn_to_cpu(evtchn, cpu); | 830 | bind_evtchn_to_cpu(evtchn, cpu); |
| 737 | 831 | ||
| 738 | /* Ready for use. */ | 832 | /* Ready for use. */ |
| @@ -812,8 +906,11 @@ void xen_irq_resume(void) | |||
| 812 | 906 | ||
| 813 | static struct irq_chip xen_dynamic_chip __read_mostly = { | 907 | static struct irq_chip xen_dynamic_chip __read_mostly = { |
| 814 | .name = "xen-dyn", | 908 | .name = "xen-dyn", |
| 909 | |||
| 910 | .disable = disable_dynirq, | ||
| 815 | .mask = disable_dynirq, | 911 | .mask = disable_dynirq, |
| 816 | .unmask = enable_dynirq, | 912 | .unmask = enable_dynirq, |
| 913 | |||
| 817 | .ack = ack_dynirq, | 914 | .ack = ack_dynirq, |
| 818 | .set_affinity = set_affinity_irq, | 915 | .set_affinity = set_affinity_irq, |
| 819 | .retrigger = retrigger_dynirq, | 916 | .retrigger = retrigger_dynirq, |
| @@ -822,6 +919,10 @@ static struct irq_chip xen_dynamic_chip __read_mostly = { | |||
| 822 | void __init xen_init_IRQ(void) | 919 | void __init xen_init_IRQ(void) |
| 823 | { | 920 | { |
| 824 | int i; | 921 | int i; |
| 922 | size_t size = nr_cpu_ids * sizeof(struct cpu_evtchn_s); | ||
| 923 | |||
| 924 | cpu_evtchn_mask_p = alloc_bootmem(size); | ||
| 925 | BUG_ON(cpu_evtchn_mask_p == NULL); | ||
| 825 | 926 | ||
| 826 | init_evtchn_cpu_bindings(); | 927 | init_evtchn_cpu_bindings(); |
| 827 | 928 | ||
| @@ -829,9 +930,5 @@ void __init xen_init_IRQ(void) | |||
| 829 | for (i = 0; i < NR_EVENT_CHANNELS; i++) | 930 | for (i = 0; i < NR_EVENT_CHANNELS; i++) |
| 830 | mask_evtchn(i); | 931 | mask_evtchn(i); |
| 831 | 932 | ||
| 832 | /* Dynamic IRQ space is currently unbound. Zero the refcnts. */ | ||
| 833 | for (i = 0; i < nr_irqs; i++) | ||
| 834 | irq_bindcount[i] = 0; | ||
| 835 | |||
| 836 | irq_ctx_init(smp_processor_id()); | 933 | irq_ctx_init(smp_processor_id()); |
| 837 | } | 934 | } |
diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c index 9b91617b9582..e7e83b65c18f 100644 --- a/drivers/xen/manage.c +++ b/drivers/xen/manage.c | |||
| @@ -100,7 +100,7 @@ static void do_suspend(void) | |||
| 100 | /* XXX use normal device tree? */ | 100 | /* XXX use normal device tree? */ |
| 101 | xenbus_suspend(); | 101 | xenbus_suspend(); |
| 102 | 102 | ||
| 103 | err = stop_machine(xen_suspend, &cancelled, &cpumask_of_cpu(0)); | 103 | err = stop_machine(xen_suspend, &cancelled, cpumask_of(0)); |
| 104 | if (err) { | 104 | if (err) { |
| 105 | printk(KERN_ERR "failed to start xen_suspend: %d\n", err); | 105 | printk(KERN_ERR "failed to start xen_suspend: %d\n", err); |
| 106 | goto out; | 106 | goto out; |
diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h index a62720a7edc0..ab0b85cf21f3 100644 --- a/include/acpi/acpiosxf.h +++ b/include/acpi/acpiosxf.h | |||
| @@ -144,6 +144,7 @@ void __iomem *acpi_os_map_memory(acpi_physical_address where, | |||
| 144 | acpi_size length); | 144 | acpi_size length); |
| 145 | 145 | ||
| 146 | void acpi_os_unmap_memory(void __iomem * logical_address, acpi_size size); | 146 | void acpi_os_unmap_memory(void __iomem * logical_address, acpi_size size); |
| 147 | void early_acpi_os_unmap_memory(void __iomem * virt, acpi_size size); | ||
| 147 | 148 | ||
| 148 | #ifdef ACPI_FUTURE_USAGE | 149 | #ifdef ACPI_FUTURE_USAGE |
| 149 | acpi_status | 150 | acpi_status |
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index c8e8cf45830f..cc40102fe2f3 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h | |||
| @@ -130,6 +130,10 @@ acpi_get_table_header(acpi_string signature, | |||
| 130 | struct acpi_table_header *out_table_header); | 130 | struct acpi_table_header *out_table_header); |
| 131 | 131 | ||
| 132 | acpi_status | 132 | acpi_status |
| 133 | acpi_get_table_with_size(acpi_string signature, | ||
| 134 | u32 instance, struct acpi_table_header **out_table, | ||
| 135 | acpi_size *tbl_size); | ||
| 136 | acpi_status | ||
| 133 | acpi_get_table(acpi_string signature, | 137 | acpi_get_table(acpi_string signature, |
| 134 | u32 instance, struct acpi_table_header **out_table); | 138 | u32 instance, struct acpi_table_header **out_table); |
| 135 | 139 | ||
diff --git a/include/asm-frv/swab.h b/include/asm-frv/swab.h index afb3396ba5ed..f305834b4799 100644 --- a/include/asm-frv/swab.h +++ b/include/asm-frv/swab.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifndef _ASM_SWAB_H | 1 | #ifndef _ASM_SWAB_H |
| 2 | #define _ASM_SWAB_H | 2 | #define _ASM_SWAB_H |
| 3 | 3 | ||
| 4 | #include <asm/types.h> | 4 | #include <linux/types.h> |
| 5 | 5 | ||
| 6 | #if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) | 6 | #if defined(__GNUC__) && !defined(__STRICT_ANSI__) || defined(__KERNEL__) |
| 7 | # define __SWAB_64_THRU_32__ | 7 | # define __SWAB_64_THRU_32__ |
diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h index b0e63c672ebd..00f45ff081a6 100644 --- a/include/asm-generic/percpu.h +++ b/include/asm-generic/percpu.h | |||
| @@ -80,4 +80,56 @@ extern void setup_per_cpu_areas(void); | |||
| 80 | #define DECLARE_PER_CPU(type, name) extern PER_CPU_ATTRIBUTES \ | 80 | #define DECLARE_PER_CPU(type, name) extern PER_CPU_ATTRIBUTES \ |
| 81 | __typeof__(type) per_cpu_var(name) | 81 | __typeof__(type) per_cpu_var(name) |
| 82 | 82 | ||
| 83 | /* | ||
| 84 | * Optional methods for optimized non-lvalue per-cpu variable access. | ||
| 85 | * | ||
| 86 | * @var can be a percpu variable or a field of it and its size should | ||
| 87 | * equal char, int or long. percpu_read() evaluates to a lvalue and | ||
| 88 | * all others to void. | ||
| 89 | * | ||
| 90 | * These operations are guaranteed to be atomic w.r.t. preemption. | ||
| 91 | * The generic versions use plain get/put_cpu_var(). Archs are | ||
| 92 | * encouraged to implement single-instruction alternatives which don't | ||
| 93 | * require preemption protection. | ||
| 94 | */ | ||
| 95 | #ifndef percpu_read | ||
| 96 | # define percpu_read(var) \ | ||
| 97 | ({ \ | ||
| 98 | typeof(per_cpu_var(var)) __tmp_var__; \ | ||
| 99 | __tmp_var__ = get_cpu_var(var); \ | ||
| 100 | put_cpu_var(var); \ | ||
| 101 | __tmp_var__; \ | ||
| 102 | }) | ||
| 103 | #endif | ||
| 104 | |||
| 105 | #define __percpu_generic_to_op(var, val, op) \ | ||
| 106 | do { \ | ||
| 107 | get_cpu_var(var) op val; \ | ||
| 108 | put_cpu_var(var); \ | ||
| 109 | } while (0) | ||
| 110 | |||
| 111 | #ifndef percpu_write | ||
| 112 | # define percpu_write(var, val) __percpu_generic_to_op(var, (val), =) | ||
| 113 | #endif | ||
| 114 | |||
| 115 | #ifndef percpu_add | ||
| 116 | # define percpu_add(var, val) __percpu_generic_to_op(var, (val), +=) | ||
| 117 | #endif | ||
| 118 | |||
| 119 | #ifndef percpu_sub | ||
| 120 | # define percpu_sub(var, val) __percpu_generic_to_op(var, (val), -=) | ||
| 121 | #endif | ||
| 122 | |||
| 123 | #ifndef percpu_and | ||
| 124 | # define percpu_and(var, val) __percpu_generic_to_op(var, (val), &=) | ||
| 125 | #endif | ||
| 126 | |||
| 127 | #ifndef percpu_or | ||
| 128 | # define percpu_or(var, val) __percpu_generic_to_op(var, (val), |=) | ||
| 129 | #endif | ||
| 130 | |||
| 131 | #ifndef percpu_xor | ||
| 132 | # define percpu_xor(var, val) __percpu_generic_to_op(var, (val), ^=) | ||
| 133 | #endif | ||
| 134 | |||
| 83 | #endif /* _ASM_GENERIC_PERCPU_H_ */ | 135 | #endif /* _ASM_GENERIC_PERCPU_H_ */ |
diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h index 79a7ff925bf8..4ce48e878530 100644 --- a/include/asm-generic/sections.h +++ b/include/asm-generic/sections.h | |||
| @@ -9,7 +9,7 @@ extern char __bss_start[], __bss_stop[]; | |||
| 9 | extern char __init_begin[], __init_end[]; | 9 | extern char __init_begin[], __init_end[]; |
| 10 | extern char _sinittext[], _einittext[]; | 10 | extern char _sinittext[], _einittext[]; |
| 11 | extern char _end[]; | 11 | extern char _end[]; |
| 12 | extern char __per_cpu_start[], __per_cpu_end[]; | 12 | extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[]; |
| 13 | extern char __kprobes_text_start[], __kprobes_text_end[]; | 13 | extern char __kprobes_text_start[], __kprobes_text_end[]; |
| 14 | extern char __initdata_begin[], __initdata_end[]; | 14 | extern char __initdata_begin[], __initdata_end[]; |
| 15 | extern char __start_rodata[], __end_rodata[]; | 15 | extern char __start_rodata[], __end_rodata[]; |
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index c61fab1dd2f8..5406e70aba86 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h | |||
| @@ -430,12 +430,59 @@ | |||
| 430 | *(.initcall7.init) \ | 430 | *(.initcall7.init) \ |
| 431 | *(.initcall7s.init) | 431 | *(.initcall7s.init) |
| 432 | 432 | ||
| 433 | /** | ||
| 434 | * PERCPU_VADDR - define output section for percpu area | ||
| 435 | * @vaddr: explicit base address (optional) | ||
| 436 | * @phdr: destination PHDR (optional) | ||
| 437 | * | ||
| 438 | * Macro which expands to output section for percpu area. If @vaddr | ||
| 439 | * is not blank, it specifies explicit base address and all percpu | ||
| 440 | * symbols will be offset from the given address. If blank, @vaddr | ||
| 441 | * always equals @laddr + LOAD_OFFSET. | ||
| 442 | * | ||
| 443 | * @phdr defines the output PHDR to use if not blank. Be warned that | ||
| 444 | * output PHDR is sticky. If @phdr is specified, the next output | ||
| 445 | * section in the linker script will go there too. @phdr should have | ||
| 446 | * a leading colon. | ||
| 447 | * | ||
| 448 | * Note that this macros defines __per_cpu_load as an absolute symbol. | ||
| 449 | * If there is no need to put the percpu section at a predetermined | ||
| 450 | * address, use PERCPU(). | ||
| 451 | */ | ||
| 452 | #define PERCPU_VADDR(vaddr, phdr) \ | ||
| 453 | VMLINUX_SYMBOL(__per_cpu_load) = .; \ | ||
| 454 | .data.percpu vaddr : AT(VMLINUX_SYMBOL(__per_cpu_load) \ | ||
| 455 | - LOAD_OFFSET) { \ | ||
| 456 | VMLINUX_SYMBOL(__per_cpu_start) = .; \ | ||
| 457 | *(.data.percpu.first) \ | ||
| 458 | *(.data.percpu.page_aligned) \ | ||
| 459 | *(.data.percpu) \ | ||
| 460 | *(.data.percpu.shared_aligned) \ | ||
| 461 | VMLINUX_SYMBOL(__per_cpu_end) = .; \ | ||
| 462 | } phdr \ | ||
| 463 | . = VMLINUX_SYMBOL(__per_cpu_load) + SIZEOF(.data.percpu); | ||
| 464 | |||
| 465 | /** | ||
| 466 | * PERCPU - define output section for percpu area, simple version | ||
| 467 | * @align: required alignment | ||
| 468 | * | ||
| 469 | * Align to @align and outputs output section for percpu area. This | ||
| 470 | * macro doesn't maniuplate @vaddr or @phdr and __per_cpu_load and | ||
| 471 | * __per_cpu_start will be identical. | ||
| 472 | * | ||
| 473 | * This macro is equivalent to ALIGN(align); PERCPU_VADDR( , ) except | ||
| 474 | * that __per_cpu_load is defined as a relative symbol against | ||
| 475 | * .data.percpu which is required for relocatable x86_32 | ||
| 476 | * configuration. | ||
| 477 | */ | ||
| 433 | #define PERCPU(align) \ | 478 | #define PERCPU(align) \ |
| 434 | . = ALIGN(align); \ | 479 | . = ALIGN(align); \ |
| 435 | VMLINUX_SYMBOL(__per_cpu_start) = .; \ | 480 | .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { \ |
| 436 | .data.percpu : AT(ADDR(.data.percpu) - LOAD_OFFSET) { \ | 481 | VMLINUX_SYMBOL(__per_cpu_load) = .; \ |
| 482 | VMLINUX_SYMBOL(__per_cpu_start) = .; \ | ||
| 483 | *(.data.percpu.first) \ | ||
| 437 | *(.data.percpu.page_aligned) \ | 484 | *(.data.percpu.page_aligned) \ |
| 438 | *(.data.percpu) \ | 485 | *(.data.percpu) \ |
| 439 | *(.data.percpu.shared_aligned) \ | 486 | *(.data.percpu.shared_aligned) \ |
| 440 | } \ | 487 | VMLINUX_SYMBOL(__per_cpu_end) = .; \ |
| 441 | VMLINUX_SYMBOL(__per_cpu_end) = .; | 488 | } |
diff --git a/include/asm-m32r/swab.h b/include/asm-m32r/swab.h index 97973e101825..54dab001d6d1 100644 --- a/include/asm-m32r/swab.h +++ b/include/asm-m32r/swab.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifndef _ASM_M32R_SWAB_H | 1 | #ifndef _ASM_M32R_SWAB_H |
| 2 | #define _ASM_M32R_SWAB_H | 2 | #define _ASM_M32R_SWAB_H |
| 3 | 3 | ||
| 4 | #include <asm/types.h> | 4 | #include <linux/types.h> |
| 5 | 5 | ||
| 6 | #if !defined(__STRICT_ANSI__) || defined(__KERNEL__) | 6 | #if !defined(__STRICT_ANSI__) || defined(__KERNEL__) |
| 7 | # define __SWAB_64_THRU_32__ | 7 | # define __SWAB_64_THRU_32__ |
diff --git a/include/asm-mn10300/swab.h b/include/asm-mn10300/swab.h index 4504d1b4b477..bd818a820ca8 100644 --- a/include/asm-mn10300/swab.h +++ b/include/asm-mn10300/swab.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | #ifndef _ASM_SWAB_H | 11 | #ifndef _ASM_SWAB_H |
| 12 | #define _ASM_SWAB_H | 12 | #define _ASM_SWAB_H |
| 13 | 13 | ||
| 14 | #include <asm/types.h> | 14 | #include <linux/types.h> |
| 15 | 15 | ||
| 16 | #ifdef __GNUC__ | 16 | #ifdef __GNUC__ |
| 17 | 17 | ||
diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 6fce2fc2d124..78199151c00b 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h | |||
| @@ -79,6 +79,7 @@ typedef int (*acpi_table_handler) (struct acpi_table_header *table); | |||
| 79 | typedef int (*acpi_table_entry_handler) (struct acpi_subtable_header *header, const unsigned long end); | 79 | typedef int (*acpi_table_entry_handler) (struct acpi_subtable_header *header, const unsigned long end); |
| 80 | 80 | ||
| 81 | char * __acpi_map_table (unsigned long phys_addr, unsigned long size); | 81 | char * __acpi_map_table (unsigned long phys_addr, unsigned long size); |
| 82 | void __acpi_unmap_table(char *map, unsigned long size); | ||
| 82 | int early_acpi_boot_init(void); | 83 | int early_acpi_boot_init(void); |
| 83 | int acpi_boot_init (void); | 84 | int acpi_boot_init (void); |
| 84 | int acpi_boot_table_init (void); | 85 | int acpi_boot_table_init (void); |
diff --git a/include/linux/coda_psdev.h b/include/linux/coda_psdev.h index 07ae8f846055..5b5d4731f956 100644 --- a/include/linux/coda_psdev.h +++ b/include/linux/coda_psdev.h | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #define CODA_PSDEV_MAJOR 67 | 6 | #define CODA_PSDEV_MAJOR 67 |
| 7 | #define MAX_CODADEVS 5 /* how many do we allow */ | 7 | #define MAX_CODADEVS 5 /* how many do we allow */ |
| 8 | 8 | ||
| 9 | #ifdef __KERNEL__ | ||
| 9 | struct kstatfs; | 10 | struct kstatfs; |
| 10 | 11 | ||
| 11 | /* communication pending/processing queues */ | 12 | /* communication pending/processing queues */ |
| @@ -24,7 +25,6 @@ static inline struct venus_comm *coda_vcp(struct super_block *sb) | |||
| 24 | return (struct venus_comm *)((sb)->s_fs_info); | 25 | return (struct venus_comm *)((sb)->s_fs_info); |
| 25 | } | 26 | } |
| 26 | 27 | ||
| 27 | |||
| 28 | /* upcalls */ | 28 | /* upcalls */ |
| 29 | int venus_rootfid(struct super_block *sb, struct CodaFid *fidp); | 29 | int venus_rootfid(struct super_block *sb, struct CodaFid *fidp); |
| 30 | int venus_getattr(struct super_block *sb, struct CodaFid *fid, | 30 | int venus_getattr(struct super_block *sb, struct CodaFid *fid, |
| @@ -64,6 +64,12 @@ int coda_downcall(int opcode, union outputArgs *out, struct super_block *sb); | |||
| 64 | int venus_fsync(struct super_block *sb, struct CodaFid *fid); | 64 | int venus_fsync(struct super_block *sb, struct CodaFid *fid); |
| 65 | int venus_statfs(struct dentry *dentry, struct kstatfs *sfs); | 65 | int venus_statfs(struct dentry *dentry, struct kstatfs *sfs); |
| 66 | 66 | ||
| 67 | /* | ||
| 68 | * Statistics | ||
| 69 | */ | ||
| 70 | |||
| 71 | extern struct venus_comm coda_comms[]; | ||
| 72 | #endif /* __KERNEL__ */ | ||
| 67 | 73 | ||
| 68 | /* messages between coda filesystem in kernel and Venus */ | 74 | /* messages between coda filesystem in kernel and Venus */ |
| 69 | struct upc_req { | 75 | struct upc_req { |
| @@ -82,11 +88,4 @@ struct upc_req { | |||
| 82 | #define REQ_WRITE 0x4 | 88 | #define REQ_WRITE 0x4 |
| 83 | #define REQ_ABORT 0x8 | 89 | #define REQ_ABORT 0x8 |
| 84 | 90 | ||
| 85 | |||
| 86 | /* | ||
| 87 | * Statistics | ||
| 88 | */ | ||
| 89 | |||
| 90 | extern struct venus_comm coda_comms[]; | ||
| 91 | |||
| 92 | #endif | 91 | #endif |
diff --git a/include/linux/elfcore.h b/include/linux/elfcore.h index 5ca54d77079f..7605c5e9589f 100644 --- a/include/linux/elfcore.h +++ b/include/linux/elfcore.h | |||
| @@ -111,6 +111,15 @@ static inline void elf_core_copy_regs(elf_gregset_t *elfregs, struct pt_regs *re | |||
| 111 | #endif | 111 | #endif |
| 112 | } | 112 | } |
| 113 | 113 | ||
| 114 | static inline void elf_core_copy_kernel_regs(elf_gregset_t *elfregs, struct pt_regs *regs) | ||
| 115 | { | ||
| 116 | #ifdef ELF_CORE_COPY_KERNEL_REGS | ||
| 117 | ELF_CORE_COPY_KERNEL_REGS((*elfregs), regs); | ||
| 118 | #else | ||
| 119 | elf_core_copy_regs(elfregs, regs); | ||
| 120 | #endif | ||
| 121 | } | ||
| 122 | |||
| 114 | static inline int elf_core_copy_task_regs(struct task_struct *t, elf_gregset_t* elfregs) | 123 | static inline int elf_core_copy_task_regs(struct task_struct *t, elf_gregset_t* elfregs) |
| 115 | { | 124 | { |
| 116 | #ifdef ELF_CORE_COPY_TASK_REGS | 125 | #ifdef ELF_CORE_COPY_TASK_REGS |
diff --git a/include/linux/in6.h b/include/linux/in6.h index bc492048c349..718bf21c5754 100644 --- a/include/linux/in6.h +++ b/include/linux/in6.h | |||
| @@ -44,11 +44,11 @@ struct in6_addr | |||
| 44 | * NOTE: Be aware the IN6ADDR_* constants and in6addr_* externals are defined | 44 | * NOTE: Be aware the IN6ADDR_* constants and in6addr_* externals are defined |
| 45 | * in network byte order, not in host byte order as are the IPv4 equivalents | 45 | * in network byte order, not in host byte order as are the IPv4 equivalents |
| 46 | */ | 46 | */ |
| 47 | #ifdef __KERNEL__ | ||
| 47 | extern const struct in6_addr in6addr_any; | 48 | extern const struct in6_addr in6addr_any; |
| 48 | #define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } } | 49 | #define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } } |
| 49 | extern const struct in6_addr in6addr_loopback; | 50 | extern const struct in6_addr in6addr_loopback; |
| 50 | #define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } } | 51 | #define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } } |
| 51 | #ifdef __KERNEL__ | ||
| 52 | extern const struct in6_addr in6addr_linklocal_allnodes; | 52 | extern const struct in6_addr in6addr_linklocal_allnodes; |
| 53 | #define IN6ADDR_LINKLOCAL_ALLNODES_INIT \ | 53 | #define IN6ADDR_LINKLOCAL_ALLNODES_INIT \ |
| 54 | { { { 0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } } | 54 | { { { 0xff,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } } |
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index 9127f6b51a39..472f11765f60 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
| @@ -467,6 +467,7 @@ int show_interrupts(struct seq_file *p, void *v); | |||
| 467 | struct irq_desc; | 467 | struct irq_desc; |
| 468 | 468 | ||
| 469 | extern int early_irq_init(void); | 469 | extern int early_irq_init(void); |
| 470 | extern int arch_probe_nr_irqs(void); | ||
| 470 | extern int arch_early_irq_init(void); | 471 | extern int arch_early_irq_init(void); |
| 471 | extern int arch_init_chip_data(struct irq_desc *desc, int cpu); | 472 | extern int arch_init_chip_data(struct irq_desc *desc, int cpu); |
| 472 | 473 | ||
diff --git a/include/linux/irq.h b/include/linux/irq.h index f899b502f186..27a67536511e 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
| @@ -182,11 +182,11 @@ struct irq_desc { | |||
| 182 | unsigned int irqs_unhandled; | 182 | unsigned int irqs_unhandled; |
| 183 | spinlock_t lock; | 183 | spinlock_t lock; |
| 184 | #ifdef CONFIG_SMP | 184 | #ifdef CONFIG_SMP |
| 185 | cpumask_t affinity; | 185 | cpumask_var_t affinity; |
| 186 | unsigned int cpu; | 186 | unsigned int cpu; |
| 187 | #endif | ||
| 188 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 187 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
| 189 | cpumask_t pending_mask; | 188 | cpumask_var_t pending_mask; |
| 189 | #endif | ||
| 190 | #endif | 190 | #endif |
| 191 | #ifdef CONFIG_PROC_FS | 191 | #ifdef CONFIG_PROC_FS |
| 192 | struct proc_dir_entry *dir; | 192 | struct proc_dir_entry *dir; |
| @@ -422,4 +422,84 @@ extern int set_irq_msi(unsigned int irq, struct msi_desc *entry); | |||
| 422 | 422 | ||
| 423 | #endif /* !CONFIG_S390 */ | 423 | #endif /* !CONFIG_S390 */ |
| 424 | 424 | ||
| 425 | #ifdef CONFIG_SMP | ||
| 426 | /** | ||
| 427 | * init_alloc_desc_masks - allocate cpumasks for irq_desc | ||
| 428 | * @desc: pointer to irq_desc struct | ||
| 429 | * @cpu: cpu which will be handling the cpumasks | ||
| 430 | * @boot: true if need bootmem | ||
| 431 | * | ||
| 432 | * Allocates affinity and pending_mask cpumask if required. | ||
| 433 | * Returns true if successful (or not required). | ||
| 434 | * Side effect: affinity has all bits set, pending_mask has all bits clear. | ||
| 435 | */ | ||
| 436 | static inline bool init_alloc_desc_masks(struct irq_desc *desc, int cpu, | ||
| 437 | bool boot) | ||
| 438 | { | ||
| 439 | int node; | ||
| 440 | |||
| 441 | if (boot) { | ||
| 442 | alloc_bootmem_cpumask_var(&desc->affinity); | ||
| 443 | cpumask_setall(desc->affinity); | ||
| 444 | |||
| 445 | #ifdef CONFIG_GENERIC_PENDING_IRQ | ||
| 446 | alloc_bootmem_cpumask_var(&desc->pending_mask); | ||
| 447 | cpumask_clear(desc->pending_mask); | ||
| 448 | #endif | ||
| 449 | return true; | ||
| 450 | } | ||
| 451 | |||
| 452 | node = cpu_to_node(cpu); | ||
| 453 | |||
| 454 | if (!alloc_cpumask_var_node(&desc->affinity, GFP_ATOMIC, node)) | ||
| 455 | return false; | ||
| 456 | cpumask_setall(desc->affinity); | ||
| 457 | |||
| 458 | #ifdef CONFIG_GENERIC_PENDING_IRQ | ||
| 459 | if (!alloc_cpumask_var_node(&desc->pending_mask, GFP_ATOMIC, node)) { | ||
| 460 | free_cpumask_var(desc->affinity); | ||
| 461 | return false; | ||
| 462 | } | ||
| 463 | cpumask_clear(desc->pending_mask); | ||
| 464 | #endif | ||
| 465 | return true; | ||
| 466 | } | ||
| 467 | |||
| 468 | /** | ||
| 469 | * init_copy_desc_masks - copy cpumasks for irq_desc | ||
| 470 | * @old_desc: pointer to old irq_desc struct | ||
| 471 | * @new_desc: pointer to new irq_desc struct | ||
| 472 | * | ||
| 473 | * Insures affinity and pending_masks are copied to new irq_desc. | ||
| 474 | * If !CONFIG_CPUMASKS_OFFSTACK the cpumasks are embedded in the | ||
| 475 | * irq_desc struct so the copy is redundant. | ||
| 476 | */ | ||
| 477 | |||
| 478 | static inline void init_copy_desc_masks(struct irq_desc *old_desc, | ||
| 479 | struct irq_desc *new_desc) | ||
| 480 | { | ||
| 481 | #ifdef CONFIG_CPUMASKS_OFFSTACK | ||
| 482 | cpumask_copy(new_desc->affinity, old_desc->affinity); | ||
| 483 | |||
| 484 | #ifdef CONFIG_GENERIC_PENDING_IRQ | ||
| 485 | cpumask_copy(new_desc->pending_mask, old_desc->pending_mask); | ||
| 486 | #endif | ||
| 487 | #endif | ||
| 488 | } | ||
| 489 | |||
| 490 | #else /* !CONFIG_SMP */ | ||
| 491 | |||
| 492 | static inline bool init_alloc_desc_masks(struct irq_desc *desc, int cpu, | ||
| 493 | bool boot) | ||
| 494 | { | ||
| 495 | return true; | ||
| 496 | } | ||
| 497 | |||
| 498 | static inline void init_copy_desc_masks(struct irq_desc *old_desc, | ||
| 499 | struct irq_desc *new_desc) | ||
| 500 | { | ||
| 501 | } | ||
| 502 | |||
| 503 | #endif /* CONFIG_SMP */ | ||
| 504 | |||
| 425 | #endif /* _LINUX_IRQ_H */ | 505 | #endif /* _LINUX_IRQ_H */ |
diff --git a/include/linux/irqnr.h b/include/linux/irqnr.h index 86af92e9e84c..887477bc2ab0 100644 --- a/include/linux/irqnr.h +++ b/include/linux/irqnr.h | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | 20 | ||
| 21 | # define for_each_irq_desc_reverse(irq, desc) \ | 21 | # define for_each_irq_desc_reverse(irq, desc) \ |
| 22 | for (irq = nr_irqs - 1; irq >= 0; irq--) | 22 | for (irq = nr_irqs - 1; irq >= 0; irq--) |
| 23 | |||
| 23 | #else /* CONFIG_GENERIC_HARDIRQS */ | 24 | #else /* CONFIG_GENERIC_HARDIRQS */ |
| 24 | 25 | ||
| 25 | extern int nr_irqs; | 26 | extern int nr_irqs; |
diff --git a/include/linux/magic.h b/include/linux/magic.h index 0b4df7eba852..5b4e28bcb788 100644 --- a/include/linux/magic.h +++ b/include/linux/magic.h | |||
| @@ -49,4 +49,5 @@ | |||
| 49 | #define FUTEXFS_SUPER_MAGIC 0xBAD1DEA | 49 | #define FUTEXFS_SUPER_MAGIC 0xBAD1DEA |
| 50 | #define INOTIFYFS_SUPER_MAGIC 0x2BAD1DEA | 50 | #define INOTIFYFS_SUPER_MAGIC 0x2BAD1DEA |
| 51 | 51 | ||
| 52 | #define STACK_END_MAGIC 0x57AC6E9D | ||
| 52 | #endif /* __LINUX_MAGIC_H__ */ | 53 | #endif /* __LINUX_MAGIC_H__ */ |
diff --git a/include/linux/nubus.h b/include/linux/nubus.h index 7382af374731..e137b3c486a7 100644 --- a/include/linux/nubus.h +++ b/include/linux/nubus.h | |||
| @@ -237,6 +237,7 @@ struct nubus_dirent | |||
| 237 | int mask; | 237 | int mask; |
| 238 | }; | 238 | }; |
| 239 | 239 | ||
| 240 | #ifdef __KERNEL__ | ||
| 240 | struct nubus_board { | 241 | struct nubus_board { |
| 241 | struct nubus_board* next; | 242 | struct nubus_board* next; |
| 242 | struct nubus_dev* first_dev; | 243 | struct nubus_dev* first_dev; |
| @@ -351,6 +352,7 @@ void nubus_get_rsrc_mem(void* dest, | |||
| 351 | void nubus_get_rsrc_str(void* dest, | 352 | void nubus_get_rsrc_str(void* dest, |
| 352 | const struct nubus_dirent *dirent, | 353 | const struct nubus_dirent *dirent, |
| 353 | int maxlen); | 354 | int maxlen); |
| 355 | #endif /* __KERNEL__ */ | ||
| 354 | 356 | ||
| 355 | /* We'd like to get rid of this eventually. Only daynaport.c uses it now. */ | 357 | /* We'd like to get rid of this eventually. Only daynaport.c uses it now. */ |
| 356 | static inline void *nubus_slot_addr(int slot) | 358 | static inline void *nubus_slot_addr(int slot) |
diff --git a/include/linux/percpu.h b/include/linux/percpu.h index 9f2a3751873a..3577ffd90d45 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h | |||
| @@ -8,35 +8,46 @@ | |||
| 8 | 8 | ||
| 9 | #include <asm/percpu.h> | 9 | #include <asm/percpu.h> |
| 10 | 10 | ||
| 11 | #ifndef PER_CPU_BASE_SECTION | ||
| 12 | #ifdef CONFIG_SMP | ||
| 13 | #define PER_CPU_BASE_SECTION ".data.percpu" | ||
| 14 | #else | ||
| 15 | #define PER_CPU_BASE_SECTION ".data" | ||
| 16 | #endif | ||
| 17 | #endif | ||
| 18 | |||
| 11 | #ifdef CONFIG_SMP | 19 | #ifdef CONFIG_SMP |
| 12 | #define DEFINE_PER_CPU(type, name) \ | ||
| 13 | __attribute__((__section__(".data.percpu"))) \ | ||
| 14 | PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name | ||
| 15 | 20 | ||
| 16 | #ifdef MODULE | 21 | #ifdef MODULE |
| 17 | #define SHARED_ALIGNED_SECTION ".data.percpu" | 22 | #define PER_CPU_SHARED_ALIGNED_SECTION "" |
| 18 | #else | 23 | #else |
| 19 | #define SHARED_ALIGNED_SECTION ".data.percpu.shared_aligned" | 24 | #define PER_CPU_SHARED_ALIGNED_SECTION ".shared_aligned" |
| 20 | #endif | 25 | #endif |
| 26 | #define PER_CPU_FIRST_SECTION ".first" | ||
| 21 | 27 | ||
| 22 | #define DEFINE_PER_CPU_SHARED_ALIGNED(type, name) \ | 28 | #else |
| 23 | __attribute__((__section__(SHARED_ALIGNED_SECTION))) \ | ||
| 24 | PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name \ | ||
| 25 | ____cacheline_aligned_in_smp | ||
| 26 | 29 | ||
| 27 | #define DEFINE_PER_CPU_PAGE_ALIGNED(type, name) \ | 30 | #define PER_CPU_SHARED_ALIGNED_SECTION "" |
| 28 | __attribute__((__section__(".data.percpu.page_aligned"))) \ | 31 | #define PER_CPU_FIRST_SECTION "" |
| 32 | |||
| 33 | #endif | ||
| 34 | |||
| 35 | #define DEFINE_PER_CPU_SECTION(type, name, section) \ | ||
| 36 | __attribute__((__section__(PER_CPU_BASE_SECTION section))) \ | ||
| 29 | PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name | 37 | PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name |
| 30 | #else | 38 | |
| 31 | #define DEFINE_PER_CPU(type, name) \ | 39 | #define DEFINE_PER_CPU(type, name) \ |
| 32 | PER_CPU_ATTRIBUTES __typeof__(type) per_cpu__##name | 40 | DEFINE_PER_CPU_SECTION(type, name, "") |
| 33 | 41 | ||
| 34 | #define DEFINE_PER_CPU_SHARED_ALIGNED(type, name) \ | 42 | #define DEFINE_PER_CPU_SHARED_ALIGNED(type, name) \ |
| 35 | DEFINE_PER_CPU(type, name) | 43 | DEFINE_PER_CPU_SECTION(type, name, PER_CPU_SHARED_ALIGNED_SECTION) \ |
| 44 | ____cacheline_aligned_in_smp | ||
| 36 | 45 | ||
| 37 | #define DEFINE_PER_CPU_PAGE_ALIGNED(type, name) \ | 46 | #define DEFINE_PER_CPU_PAGE_ALIGNED(type, name) \ |
| 38 | DEFINE_PER_CPU(type, name) | 47 | DEFINE_PER_CPU_SECTION(type, name, ".page_aligned") |
| 39 | #endif | 48 | |
| 49 | #define DEFINE_PER_CPU_FIRST(type, name) \ | ||
| 50 | DEFINE_PER_CPU_SECTION(type, name, PER_CPU_FIRST_SECTION) | ||
| 40 | 51 | ||
| 41 | #define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var) | 52 | #define EXPORT_PER_CPU_SYMBOL(var) EXPORT_SYMBOL(per_cpu__##var) |
| 42 | #define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var) | 53 | #define EXPORT_PER_CPU_SYMBOL_GPL(var) EXPORT_SYMBOL_GPL(per_cpu__##var) |
diff --git a/include/linux/reiserfs_fs.h b/include/linux/reiserfs_fs.h index bc5114d35e99..e356c99f0659 100644 --- a/include/linux/reiserfs_fs.h +++ b/include/linux/reiserfs_fs.h | |||
| @@ -28,8 +28,6 @@ | |||
| 28 | #include <linux/reiserfs_fs_sb.h> | 28 | #include <linux/reiserfs_fs_sb.h> |
| 29 | #endif | 29 | #endif |
| 30 | 30 | ||
| 31 | struct fid; | ||
| 32 | |||
| 33 | /* | 31 | /* |
| 34 | * include/linux/reiser_fs.h | 32 | * include/linux/reiser_fs.h |
| 35 | * | 33 | * |
| @@ -37,6 +35,33 @@ struct fid; | |||
| 37 | * | 35 | * |
| 38 | */ | 36 | */ |
| 39 | 37 | ||
| 38 | /* ioctl's command */ | ||
| 39 | #define REISERFS_IOC_UNPACK _IOW(0xCD,1,long) | ||
| 40 | /* define following flags to be the same as in ext2, so that chattr(1), | ||
| 41 | lsattr(1) will work with us. */ | ||
| 42 | #define REISERFS_IOC_GETFLAGS FS_IOC_GETFLAGS | ||
| 43 | #define REISERFS_IOC_SETFLAGS FS_IOC_SETFLAGS | ||
| 44 | #define REISERFS_IOC_GETVERSION FS_IOC_GETVERSION | ||
| 45 | #define REISERFS_IOC_SETVERSION FS_IOC_SETVERSION | ||
| 46 | |||
| 47 | #ifdef __KERNEL__ | ||
| 48 | /* the 32 bit compat definitions with int argument */ | ||
| 49 | #define REISERFS_IOC32_UNPACK _IOW(0xCD, 1, int) | ||
| 50 | #define REISERFS_IOC32_GETFLAGS FS_IOC32_GETFLAGS | ||
| 51 | #define REISERFS_IOC32_SETFLAGS FS_IOC32_SETFLAGS | ||
| 52 | #define REISERFS_IOC32_GETVERSION FS_IOC32_GETVERSION | ||
| 53 | #define REISERFS_IOC32_SETVERSION FS_IOC32_SETVERSION | ||
| 54 | |||
| 55 | /* Locking primitives */ | ||
| 56 | /* Right now we are still falling back to (un)lock_kernel, but eventually that | ||
| 57 | would evolve into real per-fs locks */ | ||
| 58 | #define reiserfs_write_lock( sb ) lock_kernel() | ||
| 59 | #define reiserfs_write_unlock( sb ) unlock_kernel() | ||
| 60 | |||
| 61 | /* xattr stuff */ | ||
| 62 | #define REISERFS_XATTR_DIR_SEM(s) (REISERFS_SB(s)->xattr_dir_sem) | ||
| 63 | struct fid; | ||
| 64 | |||
| 40 | /* in reading the #defines, it may help to understand that they employ | 65 | /* in reading the #defines, it may help to understand that they employ |
| 41 | the following abbreviations: | 66 | the following abbreviations: |
| 42 | 67 | ||
| @@ -698,6 +723,7 @@ static inline void cpu_key_k_offset_dec(struct cpu_key *key) | |||
| 698 | /* object identifier for root dir */ | 723 | /* object identifier for root dir */ |
| 699 | #define REISERFS_ROOT_OBJECTID 2 | 724 | #define REISERFS_ROOT_OBJECTID 2 |
| 700 | #define REISERFS_ROOT_PARENT_OBJECTID 1 | 725 | #define REISERFS_ROOT_PARENT_OBJECTID 1 |
| 726 | |||
| 701 | extern struct reiserfs_key root_key; | 727 | extern struct reiserfs_key root_key; |
| 702 | 728 | ||
| 703 | /* | 729 | /* |
| @@ -1540,7 +1566,6 @@ struct reiserfs_iget_args { | |||
| 1540 | /* FUNCTION DECLARATIONS */ | 1566 | /* FUNCTION DECLARATIONS */ |
| 1541 | /***************************************************************************/ | 1567 | /***************************************************************************/ |
| 1542 | 1568 | ||
| 1543 | /*#ifdef __KERNEL__*/ | ||
| 1544 | #define get_journal_desc_magic(bh) (bh->b_data + bh->b_size - 12) | 1569 | #define get_journal_desc_magic(bh) (bh->b_data + bh->b_size - 12) |
| 1545 | 1570 | ||
| 1546 | #define journal_trans_half(blocksize) \ | 1571 | #define journal_trans_half(blocksize) \ |
| @@ -2178,29 +2203,6 @@ long reiserfs_compat_ioctl(struct file *filp, | |||
| 2178 | unsigned int cmd, unsigned long arg); | 2203 | unsigned int cmd, unsigned long arg); |
| 2179 | int reiserfs_unpack(struct inode *inode, struct file *filp); | 2204 | int reiserfs_unpack(struct inode *inode, struct file *filp); |
| 2180 | 2205 | ||
| 2181 | /* ioctl's command */ | ||
| 2182 | #define REISERFS_IOC_UNPACK _IOW(0xCD,1,long) | ||
| 2183 | /* define following flags to be the same as in ext2, so that chattr(1), | ||
| 2184 | lsattr(1) will work with us. */ | ||
| 2185 | #define REISERFS_IOC_GETFLAGS FS_IOC_GETFLAGS | ||
| 2186 | #define REISERFS_IOC_SETFLAGS FS_IOC_SETFLAGS | ||
| 2187 | #define REISERFS_IOC_GETVERSION FS_IOC_GETVERSION | ||
| 2188 | #define REISERFS_IOC_SETVERSION FS_IOC_SETVERSION | ||
| 2189 | |||
| 2190 | /* the 32 bit compat definitions with int argument */ | ||
| 2191 | #define REISERFS_IOC32_UNPACK _IOW(0xCD, 1, int) | ||
| 2192 | #define REISERFS_IOC32_GETFLAGS FS_IOC32_GETFLAGS | ||
| 2193 | #define REISERFS_IOC32_SETFLAGS FS_IOC32_SETFLAGS | ||
| 2194 | #define REISERFS_IOC32_GETVERSION FS_IOC32_GETVERSION | ||
| 2195 | #define REISERFS_IOC32_SETVERSION FS_IOC32_SETVERSION | ||
| 2196 | |||
| 2197 | /* Locking primitives */ | ||
| 2198 | /* Right now we are still falling back to (un)lock_kernel, but eventually that | ||
| 2199 | would evolve into real per-fs locks */ | ||
| 2200 | #define reiserfs_write_lock( sb ) lock_kernel() | ||
| 2201 | #define reiserfs_write_unlock( sb ) unlock_kernel() | ||
| 2202 | |||
| 2203 | /* xattr stuff */ | ||
| 2204 | #define REISERFS_XATTR_DIR_SEM(s) (REISERFS_SB(s)->xattr_dir_sem) | ||
| 2205 | 2206 | ||
| 2207 | #endif /* __KERNEL__ */ | ||
| 2206 | #endif /* _LINUX_REISER_FS_H */ | 2208 | #endif /* _LINUX_REISER_FS_H */ |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 8981e52c714f..f0a50b20e8a0 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -1178,10 +1178,9 @@ struct task_struct { | |||
| 1178 | pid_t pid; | 1178 | pid_t pid; |
| 1179 | pid_t tgid; | 1179 | pid_t tgid; |
| 1180 | 1180 | ||
| 1181 | #ifdef CONFIG_CC_STACKPROTECTOR | ||
| 1182 | /* Canary value for the -fstack-protector gcc feature */ | 1181 | /* Canary value for the -fstack-protector gcc feature */ |
| 1183 | unsigned long stack_canary; | 1182 | unsigned long stack_canary; |
| 1184 | #endif | 1183 | |
| 1185 | /* | 1184 | /* |
| 1186 | * pointers to (original) parent process, youngest child, younger sibling, | 1185 | * pointers to (original) parent process, youngest child, younger sibling, |
| 1187 | * older sibling, respectively. (p->father can be replaced with | 1186 | * older sibling, respectively. (p->father can be replaced with |
| @@ -2087,6 +2086,19 @@ static inline int object_is_on_stack(void *obj) | |||
| 2087 | 2086 | ||
| 2088 | extern void thread_info_cache_init(void); | 2087 | extern void thread_info_cache_init(void); |
| 2089 | 2088 | ||
| 2089 | #ifdef CONFIG_DEBUG_STACK_USAGE | ||
| 2090 | static inline unsigned long stack_not_used(struct task_struct *p) | ||
| 2091 | { | ||
| 2092 | unsigned long *n = end_of_stack(p); | ||
| 2093 | |||
| 2094 | do { /* Skip over canary */ | ||
| 2095 | n++; | ||
| 2096 | } while (!*n); | ||
| 2097 | |||
| 2098 | return (unsigned long)n - (unsigned long)end_of_stack(p); | ||
| 2099 | } | ||
| 2100 | #endif | ||
| 2101 | |||
| 2090 | /* set thread flags in other task's structures | 2102 | /* set thread flags in other task's structures |
| 2091 | * - see asm/thread_info.h for TIF_xxxx flags available | 2103 | * - see asm/thread_info.h for TIF_xxxx flags available |
| 2092 | */ | 2104 | */ |
diff --git a/include/linux/smp.h b/include/linux/smp.h index 715196b09d67..bbacb7baa446 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h | |||
| @@ -176,6 +176,12 @@ static inline void init_call_single_data(void) | |||
| 176 | #define put_cpu() preempt_enable() | 176 | #define put_cpu() preempt_enable() |
| 177 | #define put_cpu_no_resched() preempt_enable_no_resched() | 177 | #define put_cpu_no_resched() preempt_enable_no_resched() |
| 178 | 178 | ||
| 179 | /* | ||
| 180 | * Callback to arch code if there's nosmp or maxcpus=0 on the | ||
| 181 | * boot command line: | ||
| 182 | */ | ||
| 183 | extern void arch_disable_smp_support(void); | ||
| 184 | |||
| 179 | void smp_setup_processor_id(void); | 185 | void smp_setup_processor_id(void); |
| 180 | 186 | ||
| 181 | #endif /* __LINUX_SMP_H */ | 187 | #endif /* __LINUX_SMP_H */ |
diff --git a/include/linux/socket.h b/include/linux/socket.h index 20fc4bbfca42..afc01909a428 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h | |||
| @@ -24,10 +24,12 @@ struct __kernel_sockaddr_storage { | |||
| 24 | #include <linux/types.h> /* pid_t */ | 24 | #include <linux/types.h> /* pid_t */ |
| 25 | #include <linux/compiler.h> /* __user */ | 25 | #include <linux/compiler.h> /* __user */ |
| 26 | 26 | ||
| 27 | #ifdef CONFIG_PROC_FS | 27 | #ifdef __KERNEL__ |
| 28 | # ifdef CONFIG_PROC_FS | ||
| 28 | struct seq_file; | 29 | struct seq_file; |
| 29 | extern void socket_seq_show(struct seq_file *seq); | 30 | extern void socket_seq_show(struct seq_file *seq); |
| 30 | #endif | 31 | # endif |
| 32 | #endif /* __KERNEL__ */ | ||
| 31 | 33 | ||
| 32 | typedef unsigned short sa_family_t; | 34 | typedef unsigned short sa_family_t; |
| 33 | 35 | ||
diff --git a/include/linux/stackprotector.h b/include/linux/stackprotector.h new file mode 100644 index 000000000000..6f3e54c704c0 --- /dev/null +++ b/include/linux/stackprotector.h | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | #ifndef _LINUX_STACKPROTECTOR_H | ||
| 2 | #define _LINUX_STACKPROTECTOR_H 1 | ||
| 3 | |||
| 4 | #include <linux/compiler.h> | ||
| 5 | #include <linux/sched.h> | ||
| 6 | #include <linux/random.h> | ||
| 7 | |||
| 8 | #ifdef CONFIG_CC_STACKPROTECTOR | ||
| 9 | # include <asm/stackprotector.h> | ||
| 10 | #else | ||
| 11 | static inline void boot_init_stack_canary(void) | ||
| 12 | { | ||
| 13 | } | ||
| 14 | #endif | ||
| 15 | |||
| 16 | #endif | ||
diff --git a/include/linux/topology.h b/include/linux/topology.h index e632d29f0544..a16b9e06f2e5 100644 --- a/include/linux/topology.h +++ b/include/linux/topology.h | |||
| @@ -193,5 +193,11 @@ int arch_update_cpu_topology(void); | |||
| 193 | #ifndef topology_core_siblings | 193 | #ifndef topology_core_siblings |
| 194 | #define topology_core_siblings(cpu) cpumask_of_cpu(cpu) | 194 | #define topology_core_siblings(cpu) cpumask_of_cpu(cpu) |
| 195 | #endif | 195 | #endif |
| 196 | #ifndef topology_thread_cpumask | ||
| 197 | #define topology_thread_cpumask(cpu) cpumask_of(cpu) | ||
| 198 | #endif | ||
| 199 | #ifndef topology_core_cpumask | ||
| 200 | #define topology_core_cpumask(cpu) cpumask_of(cpu) | ||
| 201 | #endif | ||
| 196 | 202 | ||
| 197 | #endif /* _LINUX_TOPOLOGY_H */ | 203 | #endif /* _LINUX_TOPOLOGY_H */ |
diff --git a/include/linux/types.h b/include/linux/types.h index 712ca53bc348..fca82ed55f49 100644 --- a/include/linux/types.h +++ b/include/linux/types.h | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | #ifndef _LINUX_TYPES_H | 1 | #ifndef _LINUX_TYPES_H |
| 2 | #define _LINUX_TYPES_H | 2 | #define _LINUX_TYPES_H |
| 3 | 3 | ||
| 4 | #include <asm/types.h> | ||
| 5 | |||
| 6 | #ifndef __ASSEMBLY__ | ||
| 4 | #ifdef __KERNEL__ | 7 | #ifdef __KERNEL__ |
| 5 | 8 | ||
| 6 | #define DECLARE_BITMAP(name,bits) \ | 9 | #define DECLARE_BITMAP(name,bits) \ |
| @@ -9,7 +12,6 @@ | |||
| 9 | #endif | 12 | #endif |
| 10 | 13 | ||
| 11 | #include <linux/posix_types.h> | 14 | #include <linux/posix_types.h> |
| 12 | #include <asm/types.h> | ||
| 13 | 15 | ||
| 14 | #ifndef __KERNEL_STRICT_NAMES | 16 | #ifndef __KERNEL_STRICT_NAMES |
| 15 | 17 | ||
| @@ -212,5 +214,5 @@ struct ustat { | |||
| 212 | }; | 214 | }; |
| 213 | 215 | ||
| 214 | #endif /* __KERNEL__ */ | 216 | #endif /* __KERNEL__ */ |
| 215 | 217 | #endif /* __ASSEMBLY__ */ | |
| 216 | #endif /* _LINUX_TYPES_H */ | 218 | #endif /* _LINUX_TYPES_H */ |
diff --git a/init/main.c b/init/main.c index 844209453c02..6441083f8273 100644 --- a/init/main.c +++ b/init/main.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/proc_fs.h> | 14 | #include <linux/proc_fs.h> |
| 15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
| 16 | #include <linux/syscalls.h> | 16 | #include <linux/syscalls.h> |
| 17 | #include <linux/stackprotector.h> | ||
| 17 | #include <linux/string.h> | 18 | #include <linux/string.h> |
| 18 | #include <linux/ctype.h> | 19 | #include <linux/ctype.h> |
| 19 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
| @@ -135,14 +136,14 @@ unsigned int __initdata setup_max_cpus = NR_CPUS; | |||
| 135 | * greater than 0, limits the maximum number of CPUs activated in | 136 | * greater than 0, limits the maximum number of CPUs activated in |
| 136 | * SMP mode to <NUM>. | 137 | * SMP mode to <NUM>. |
| 137 | */ | 138 | */ |
| 138 | #ifndef CONFIG_X86_IO_APIC | 139 | |
| 139 | static inline void disable_ioapic_setup(void) {}; | 140 | void __weak arch_disable_smp_support(void) { } |
| 140 | #endif | ||
| 141 | 141 | ||
| 142 | static int __init nosmp(char *str) | 142 | static int __init nosmp(char *str) |
| 143 | { | 143 | { |
| 144 | setup_max_cpus = 0; | 144 | setup_max_cpus = 0; |
| 145 | disable_ioapic_setup(); | 145 | arch_disable_smp_support(); |
| 146 | |||
| 146 | return 0; | 147 | return 0; |
| 147 | } | 148 | } |
| 148 | 149 | ||
| @@ -152,14 +153,14 @@ static int __init maxcpus(char *str) | |||
| 152 | { | 153 | { |
| 153 | get_option(&str, &setup_max_cpus); | 154 | get_option(&str, &setup_max_cpus); |
| 154 | if (setup_max_cpus == 0) | 155 | if (setup_max_cpus == 0) |
| 155 | disable_ioapic_setup(); | 156 | arch_disable_smp_support(); |
| 156 | 157 | ||
| 157 | return 0; | 158 | return 0; |
| 158 | } | 159 | } |
| 159 | 160 | ||
| 160 | early_param("maxcpus", maxcpus); | 161 | early_param("maxcpus", maxcpus); |
| 161 | #else | 162 | #else |
| 162 | #define setup_max_cpus NR_CPUS | 163 | const unsigned int setup_max_cpus = NR_CPUS; |
| 163 | #endif | 164 | #endif |
| 164 | 165 | ||
| 165 | /* | 166 | /* |
| @@ -539,6 +540,12 @@ asmlinkage void __init start_kernel(void) | |||
| 539 | */ | 540 | */ |
| 540 | lockdep_init(); | 541 | lockdep_init(); |
| 541 | debug_objects_early_init(); | 542 | debug_objects_early_init(); |
| 543 | |||
| 544 | /* | ||
| 545 | * Set up the the initial canary ASAP: | ||
| 546 | */ | ||
| 547 | boot_init_stack_canary(); | ||
| 548 | |||
| 542 | cgroup_init_early(); | 549 | cgroup_init_early(); |
| 543 | 550 | ||
| 544 | local_irq_disable(); | 551 | local_irq_disable(); |
diff --git a/kernel/exit.c b/kernel/exit.c index efd30ccf3858..167e1e3ad7c6 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
| @@ -980,12 +980,9 @@ static void check_stack_usage(void) | |||
| 980 | { | 980 | { |
| 981 | static DEFINE_SPINLOCK(low_water_lock); | 981 | static DEFINE_SPINLOCK(low_water_lock); |
| 982 | static int lowest_to_date = THREAD_SIZE; | 982 | static int lowest_to_date = THREAD_SIZE; |
| 983 | unsigned long *n = end_of_stack(current); | ||
| 984 | unsigned long free; | 983 | unsigned long free; |
| 985 | 984 | ||
| 986 | while (*n == 0) | 985 | free = stack_not_used(current); |
| 987 | n++; | ||
| 988 | free = (unsigned long)n - (unsigned long)end_of_stack(current); | ||
| 989 | 986 | ||
| 990 | if (free >= lowest_to_date) | 987 | if (free >= lowest_to_date) |
| 991 | return; | 988 | return; |
diff --git a/kernel/fork.c b/kernel/fork.c index a66fbde20715..8de303bdd4e5 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -61,6 +61,7 @@ | |||
| 61 | #include <linux/proc_fs.h> | 61 | #include <linux/proc_fs.h> |
| 62 | #include <linux/blkdev.h> | 62 | #include <linux/blkdev.h> |
| 63 | #include <trace/sched.h> | 63 | #include <trace/sched.h> |
| 64 | #include <linux/magic.h> | ||
| 64 | 65 | ||
| 65 | #include <asm/pgtable.h> | 66 | #include <asm/pgtable.h> |
| 66 | #include <asm/pgalloc.h> | 67 | #include <asm/pgalloc.h> |
| @@ -212,6 +213,8 @@ static struct task_struct *dup_task_struct(struct task_struct *orig) | |||
| 212 | { | 213 | { |
| 213 | struct task_struct *tsk; | 214 | struct task_struct *tsk; |
| 214 | struct thread_info *ti; | 215 | struct thread_info *ti; |
| 216 | unsigned long *stackend; | ||
| 217 | |||
| 215 | int err; | 218 | int err; |
| 216 | 219 | ||
| 217 | prepare_to_copy(orig); | 220 | prepare_to_copy(orig); |
| @@ -237,6 +240,8 @@ static struct task_struct *dup_task_struct(struct task_struct *orig) | |||
| 237 | goto out; | 240 | goto out; |
| 238 | 241 | ||
| 239 | setup_thread_stack(tsk, orig); | 242 | setup_thread_stack(tsk, orig); |
| 243 | stackend = end_of_stack(tsk); | ||
| 244 | *stackend = STACK_END_MAGIC; /* for overflow detection */ | ||
| 240 | 245 | ||
| 241 | #ifdef CONFIG_CC_STACKPROTECTOR | 246 | #ifdef CONFIG_CC_STACKPROTECTOR |
| 242 | tsk->stack_canary = get_random_int(); | 247 | tsk->stack_canary = get_random_int(); |
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 7de11bd64dfe..122fef4b0bd3 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
| @@ -46,7 +46,10 @@ void dynamic_irq_init(unsigned int irq) | |||
| 46 | desc->irq_count = 0; | 46 | desc->irq_count = 0; |
| 47 | desc->irqs_unhandled = 0; | 47 | desc->irqs_unhandled = 0; |
| 48 | #ifdef CONFIG_SMP | 48 | #ifdef CONFIG_SMP |
| 49 | cpumask_setall(&desc->affinity); | 49 | cpumask_setall(desc->affinity); |
| 50 | #ifdef CONFIG_GENERIC_PENDING_IRQ | ||
| 51 | cpumask_clear(desc->pending_mask); | ||
| 52 | #endif | ||
| 50 | #endif | 53 | #endif |
| 51 | spin_unlock_irqrestore(&desc->lock, flags); | 54 | spin_unlock_irqrestore(&desc->lock, flags); |
| 52 | } | 55 | } |
diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c index 3aba8d12f328..f51eaee921b6 100644 --- a/kernel/irq/handle.c +++ b/kernel/irq/handle.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/kernel_stat.h> | 17 | #include <linux/kernel_stat.h> |
| 18 | #include <linux/rculist.h> | 18 | #include <linux/rculist.h> |
| 19 | #include <linux/hash.h> | 19 | #include <linux/hash.h> |
| 20 | #include <linux/bootmem.h> | ||
| 20 | 21 | ||
| 21 | #include "internals.h" | 22 | #include "internals.h" |
| 22 | 23 | ||
| @@ -69,6 +70,7 @@ int nr_irqs = NR_IRQS; | |||
| 69 | EXPORT_SYMBOL_GPL(nr_irqs); | 70 | EXPORT_SYMBOL_GPL(nr_irqs); |
| 70 | 71 | ||
| 71 | #ifdef CONFIG_SPARSE_IRQ | 72 | #ifdef CONFIG_SPARSE_IRQ |
| 73 | |||
| 72 | static struct irq_desc irq_desc_init = { | 74 | static struct irq_desc irq_desc_init = { |
| 73 | .irq = -1, | 75 | .irq = -1, |
| 74 | .status = IRQ_DISABLED, | 76 | .status = IRQ_DISABLED, |
| @@ -76,9 +78,6 @@ static struct irq_desc irq_desc_init = { | |||
| 76 | .handle_irq = handle_bad_irq, | 78 | .handle_irq = handle_bad_irq, |
| 77 | .depth = 1, | 79 | .depth = 1, |
| 78 | .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock), | 80 | .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock), |
| 79 | #ifdef CONFIG_SMP | ||
| 80 | .affinity = CPU_MASK_ALL | ||
| 81 | #endif | ||
| 82 | }; | 81 | }; |
| 83 | 82 | ||
| 84 | void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr) | 83 | void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr) |
| @@ -113,6 +112,10 @@ static void init_one_irq_desc(int irq, struct irq_desc *desc, int cpu) | |||
| 113 | printk(KERN_ERR "can not alloc kstat_irqs\n"); | 112 | printk(KERN_ERR "can not alloc kstat_irqs\n"); |
| 114 | BUG_ON(1); | 113 | BUG_ON(1); |
| 115 | } | 114 | } |
| 115 | if (!init_alloc_desc_masks(desc, cpu, false)) { | ||
| 116 | printk(KERN_ERR "can not alloc irq_desc cpumasks\n"); | ||
| 117 | BUG_ON(1); | ||
| 118 | } | ||
| 116 | arch_init_chip_data(desc, cpu); | 119 | arch_init_chip_data(desc, cpu); |
| 117 | } | 120 | } |
| 118 | 121 | ||
| @@ -121,7 +124,7 @@ static void init_one_irq_desc(int irq, struct irq_desc *desc, int cpu) | |||
| 121 | */ | 124 | */ |
| 122 | DEFINE_SPINLOCK(sparse_irq_lock); | 125 | DEFINE_SPINLOCK(sparse_irq_lock); |
| 123 | 126 | ||
| 124 | struct irq_desc *irq_desc_ptrs[NR_IRQS] __read_mostly; | 127 | struct irq_desc **irq_desc_ptrs __read_mostly; |
| 125 | 128 | ||
| 126 | static struct irq_desc irq_desc_legacy[NR_IRQS_LEGACY] __cacheline_aligned_in_smp = { | 129 | static struct irq_desc irq_desc_legacy[NR_IRQS_LEGACY] __cacheline_aligned_in_smp = { |
| 127 | [0 ... NR_IRQS_LEGACY-1] = { | 130 | [0 ... NR_IRQS_LEGACY-1] = { |
| @@ -131,14 +134,10 @@ static struct irq_desc irq_desc_legacy[NR_IRQS_LEGACY] __cacheline_aligned_in_sm | |||
| 131 | .handle_irq = handle_bad_irq, | 134 | .handle_irq = handle_bad_irq, |
| 132 | .depth = 1, | 135 | .depth = 1, |
| 133 | .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock), | 136 | .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock), |
| 134 | #ifdef CONFIG_SMP | ||
| 135 | .affinity = CPU_MASK_ALL | ||
| 136 | #endif | ||
| 137 | } | 137 | } |
| 138 | }; | 138 | }; |
| 139 | 139 | ||
| 140 | /* FIXME: use bootmem alloc ...*/ | 140 | static unsigned int *kstat_irqs_legacy; |
| 141 | static unsigned int kstat_irqs_legacy[NR_IRQS_LEGACY][NR_CPUS]; | ||
| 142 | 141 | ||
| 143 | int __init early_irq_init(void) | 142 | int __init early_irq_init(void) |
| 144 | { | 143 | { |
| @@ -148,18 +147,30 @@ int __init early_irq_init(void) | |||
| 148 | 147 | ||
| 149 | init_irq_default_affinity(); | 148 | init_irq_default_affinity(); |
| 150 | 149 | ||
| 150 | /* initialize nr_irqs based on nr_cpu_ids */ | ||
| 151 | arch_probe_nr_irqs(); | ||
| 152 | printk(KERN_INFO "NR_IRQS:%d nr_irqs:%d\n", NR_IRQS, nr_irqs); | ||
| 153 | |||
| 151 | desc = irq_desc_legacy; | 154 | desc = irq_desc_legacy; |
| 152 | legacy_count = ARRAY_SIZE(irq_desc_legacy); | 155 | legacy_count = ARRAY_SIZE(irq_desc_legacy); |
| 153 | 156 | ||
| 157 | /* allocate irq_desc_ptrs array based on nr_irqs */ | ||
| 158 | irq_desc_ptrs = alloc_bootmem(nr_irqs * sizeof(void *)); | ||
| 159 | |||
| 160 | /* allocate based on nr_cpu_ids */ | ||
| 161 | /* FIXME: invert kstat_irgs, and it'd be a per_cpu_alloc'd thing */ | ||
| 162 | kstat_irqs_legacy = alloc_bootmem(NR_IRQS_LEGACY * nr_cpu_ids * | ||
| 163 | sizeof(int)); | ||
| 164 | |||
| 154 | for (i = 0; i < legacy_count; i++) { | 165 | for (i = 0; i < legacy_count; i++) { |
| 155 | desc[i].irq = i; | 166 | desc[i].irq = i; |
| 156 | desc[i].kstat_irqs = kstat_irqs_legacy[i]; | 167 | desc[i].kstat_irqs = kstat_irqs_legacy + i * nr_cpu_ids; |
| 157 | lockdep_set_class(&desc[i].lock, &irq_desc_lock_class); | 168 | lockdep_set_class(&desc[i].lock, &irq_desc_lock_class); |
| 158 | 169 | init_alloc_desc_masks(&desc[i], 0, true); | |
| 159 | irq_desc_ptrs[i] = desc + i; | 170 | irq_desc_ptrs[i] = desc + i; |
| 160 | } | 171 | } |
| 161 | 172 | ||
| 162 | for (i = legacy_count; i < NR_IRQS; i++) | 173 | for (i = legacy_count; i < nr_irqs; i++) |
| 163 | irq_desc_ptrs[i] = NULL; | 174 | irq_desc_ptrs[i] = NULL; |
| 164 | 175 | ||
| 165 | return arch_early_irq_init(); | 176 | return arch_early_irq_init(); |
| @@ -167,7 +178,10 @@ int __init early_irq_init(void) | |||
| 167 | 178 | ||
| 168 | struct irq_desc *irq_to_desc(unsigned int irq) | 179 | struct irq_desc *irq_to_desc(unsigned int irq) |
| 169 | { | 180 | { |
| 170 | return (irq < NR_IRQS) ? irq_desc_ptrs[irq] : NULL; | 181 | if (irq_desc_ptrs && irq < nr_irqs) |
| 182 | return irq_desc_ptrs[irq]; | ||
| 183 | |||
| 184 | return NULL; | ||
| 171 | } | 185 | } |
| 172 | 186 | ||
| 173 | struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu) | 187 | struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu) |
| @@ -176,10 +190,9 @@ struct irq_desc *irq_to_desc_alloc_cpu(unsigned int irq, int cpu) | |||
| 176 | unsigned long flags; | 190 | unsigned long flags; |
| 177 | int node; | 191 | int node; |
| 178 | 192 | ||
| 179 | if (irq >= NR_IRQS) { | 193 | if (irq >= nr_irqs) { |
| 180 | printk(KERN_WARNING "irq >= NR_IRQS in irq_to_desc_alloc: %d %d\n", | 194 | WARN(1, "irq (%d) >= nr_irqs (%d) in irq_to_desc_alloc\n", |
| 181 | irq, NR_IRQS); | 195 | irq, nr_irqs); |
| 182 | WARN_ON(1); | ||
| 183 | return NULL; | 196 | return NULL; |
| 184 | } | 197 | } |
| 185 | 198 | ||
| @@ -221,9 +234,6 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = { | |||
| 221 | .handle_irq = handle_bad_irq, | 234 | .handle_irq = handle_bad_irq, |
| 222 | .depth = 1, | 235 | .depth = 1, |
| 223 | .lock = __SPIN_LOCK_UNLOCKED(irq_desc->lock), | 236 | .lock = __SPIN_LOCK_UNLOCKED(irq_desc->lock), |
| 224 | #ifdef CONFIG_SMP | ||
| 225 | .affinity = CPU_MASK_ALL | ||
| 226 | #endif | ||
| 227 | } | 237 | } |
| 228 | }; | 238 | }; |
| 229 | 239 | ||
| @@ -235,12 +245,15 @@ int __init early_irq_init(void) | |||
| 235 | 245 | ||
| 236 | init_irq_default_affinity(); | 246 | init_irq_default_affinity(); |
| 237 | 247 | ||
| 248 | printk(KERN_INFO "NR_IRQS:%d\n", NR_IRQS); | ||
| 249 | |||
| 238 | desc = irq_desc; | 250 | desc = irq_desc; |
| 239 | count = ARRAY_SIZE(irq_desc); | 251 | count = ARRAY_SIZE(irq_desc); |
| 240 | 252 | ||
| 241 | for (i = 0; i < count; i++) | 253 | for (i = 0; i < count; i++) { |
| 242 | desc[i].irq = i; | 254 | desc[i].irq = i; |
| 243 | 255 | init_alloc_desc_masks(&desc[i], 0, true); | |
| 256 | } | ||
| 244 | return arch_early_irq_init(); | 257 | return arch_early_irq_init(); |
| 245 | } | 258 | } |
| 246 | 259 | ||
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h index e6d0a43cc125..40416a81a0f5 100644 --- a/kernel/irq/internals.h +++ b/kernel/irq/internals.h | |||
| @@ -16,7 +16,14 @@ extern int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, | |||
| 16 | extern struct lock_class_key irq_desc_lock_class; | 16 | extern struct lock_class_key irq_desc_lock_class; |
| 17 | extern void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr); | 17 | extern void init_kstat_irqs(struct irq_desc *desc, int cpu, int nr); |
| 18 | extern spinlock_t sparse_irq_lock; | 18 | extern spinlock_t sparse_irq_lock; |
| 19 | |||
| 20 | #ifdef CONFIG_SPARSE_IRQ | ||
| 21 | /* irq_desc_ptrs allocated at boot time */ | ||
| 22 | extern struct irq_desc **irq_desc_ptrs; | ||
| 23 | #else | ||
| 24 | /* irq_desc_ptrs is a fixed size array */ | ||
| 19 | extern struct irq_desc *irq_desc_ptrs[NR_IRQS]; | 25 | extern struct irq_desc *irq_desc_ptrs[NR_IRQS]; |
| 26 | #endif | ||
| 20 | 27 | ||
| 21 | #ifdef CONFIG_PROC_FS | 28 | #ifdef CONFIG_PROC_FS |
| 22 | extern void register_irq_proc(unsigned int irq, struct irq_desc *desc); | 29 | extern void register_irq_proc(unsigned int irq, struct irq_desc *desc); |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 291f03664552..a3a5dc9ef346 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -90,14 +90,14 @@ int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask) | |||
| 90 | 90 | ||
| 91 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 91 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
| 92 | if (desc->status & IRQ_MOVE_PCNTXT || desc->status & IRQ_DISABLED) { | 92 | if (desc->status & IRQ_MOVE_PCNTXT || desc->status & IRQ_DISABLED) { |
| 93 | cpumask_copy(&desc->affinity, cpumask); | 93 | cpumask_copy(desc->affinity, cpumask); |
| 94 | desc->chip->set_affinity(irq, cpumask); | 94 | desc->chip->set_affinity(irq, cpumask); |
| 95 | } else { | 95 | } else { |
| 96 | desc->status |= IRQ_MOVE_PENDING; | 96 | desc->status |= IRQ_MOVE_PENDING; |
| 97 | cpumask_copy(&desc->pending_mask, cpumask); | 97 | cpumask_copy(desc->pending_mask, cpumask); |
| 98 | } | 98 | } |
| 99 | #else | 99 | #else |
| 100 | cpumask_copy(&desc->affinity, cpumask); | 100 | cpumask_copy(desc->affinity, cpumask); |
| 101 | desc->chip->set_affinity(irq, cpumask); | 101 | desc->chip->set_affinity(irq, cpumask); |
| 102 | #endif | 102 | #endif |
| 103 | desc->status |= IRQ_AFFINITY_SET; | 103 | desc->status |= IRQ_AFFINITY_SET; |
| @@ -119,16 +119,16 @@ int do_irq_select_affinity(unsigned int irq, struct irq_desc *desc) | |||
| 119 | * one of the targets is online. | 119 | * one of the targets is online. |
| 120 | */ | 120 | */ |
| 121 | if (desc->status & (IRQ_AFFINITY_SET | IRQ_NO_BALANCING)) { | 121 | if (desc->status & (IRQ_AFFINITY_SET | IRQ_NO_BALANCING)) { |
| 122 | if (cpumask_any_and(&desc->affinity, cpu_online_mask) | 122 | if (cpumask_any_and(desc->affinity, cpu_online_mask) |
| 123 | < nr_cpu_ids) | 123 | < nr_cpu_ids) |
| 124 | goto set_affinity; | 124 | goto set_affinity; |
| 125 | else | 125 | else |
| 126 | desc->status &= ~IRQ_AFFINITY_SET; | 126 | desc->status &= ~IRQ_AFFINITY_SET; |
| 127 | } | 127 | } |
| 128 | 128 | ||
| 129 | cpumask_and(&desc->affinity, cpu_online_mask, irq_default_affinity); | 129 | cpumask_and(desc->affinity, cpu_online_mask, irq_default_affinity); |
| 130 | set_affinity: | 130 | set_affinity: |
| 131 | desc->chip->set_affinity(irq, &desc->affinity); | 131 | desc->chip->set_affinity(irq, desc->affinity); |
| 132 | 132 | ||
| 133 | return 0; | 133 | return 0; |
| 134 | } | 134 | } |
diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c index bd72329e630c..e05ad9be43b7 100644 --- a/kernel/irq/migration.c +++ b/kernel/irq/migration.c | |||
| @@ -18,7 +18,7 @@ void move_masked_irq(int irq) | |||
| 18 | 18 | ||
| 19 | desc->status &= ~IRQ_MOVE_PENDING; | 19 | desc->status &= ~IRQ_MOVE_PENDING; |
| 20 | 20 | ||
| 21 | if (unlikely(cpumask_empty(&desc->pending_mask))) | 21 | if (unlikely(cpumask_empty(desc->pending_mask))) |
| 22 | return; | 22 | return; |
| 23 | 23 | ||
| 24 | if (!desc->chip->set_affinity) | 24 | if (!desc->chip->set_affinity) |
| @@ -38,13 +38,13 @@ void move_masked_irq(int irq) | |||
| 38 | * For correct operation this depends on the caller | 38 | * For correct operation this depends on the caller |
| 39 | * masking the irqs. | 39 | * masking the irqs. |
| 40 | */ | 40 | */ |
| 41 | if (likely(cpumask_any_and(&desc->pending_mask, cpu_online_mask) | 41 | if (likely(cpumask_any_and(desc->pending_mask, cpu_online_mask) |
| 42 | < nr_cpu_ids)) { | 42 | < nr_cpu_ids)) { |
| 43 | cpumask_and(&desc->affinity, | 43 | cpumask_and(desc->affinity, |
| 44 | &desc->pending_mask, cpu_online_mask); | 44 | desc->pending_mask, cpu_online_mask); |
| 45 | desc->chip->set_affinity(irq, &desc->affinity); | 45 | desc->chip->set_affinity(irq, desc->affinity); |
| 46 | } | 46 | } |
| 47 | cpumask_clear(&desc->pending_mask); | 47 | cpumask_clear(desc->pending_mask); |
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | void move_native_irq(int irq) | 50 | void move_native_irq(int irq) |
diff --git a/kernel/irq/numa_migrate.c b/kernel/irq/numa_migrate.c index acd88356ac76..7f9b80434e32 100644 --- a/kernel/irq/numa_migrate.c +++ b/kernel/irq/numa_migrate.c | |||
| @@ -38,15 +38,22 @@ static void free_kstat_irqs(struct irq_desc *old_desc, struct irq_desc *desc) | |||
| 38 | old_desc->kstat_irqs = NULL; | 38 | old_desc->kstat_irqs = NULL; |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | static void init_copy_one_irq_desc(int irq, struct irq_desc *old_desc, | 41 | static bool init_copy_one_irq_desc(int irq, struct irq_desc *old_desc, |
| 42 | struct irq_desc *desc, int cpu) | 42 | struct irq_desc *desc, int cpu) |
| 43 | { | 43 | { |
| 44 | memcpy(desc, old_desc, sizeof(struct irq_desc)); | 44 | memcpy(desc, old_desc, sizeof(struct irq_desc)); |
| 45 | if (!init_alloc_desc_masks(desc, cpu, false)) { | ||
| 46 | printk(KERN_ERR "irq %d: can not get new irq_desc cpumask " | ||
| 47 | "for migration.\n", irq); | ||
| 48 | return false; | ||
| 49 | } | ||
| 45 | spin_lock_init(&desc->lock); | 50 | spin_lock_init(&desc->lock); |
| 46 | desc->cpu = cpu; | 51 | desc->cpu = cpu; |
| 47 | lockdep_set_class(&desc->lock, &irq_desc_lock_class); | 52 | lockdep_set_class(&desc->lock, &irq_desc_lock_class); |
| 48 | init_copy_kstat_irqs(old_desc, desc, cpu, nr_cpu_ids); | 53 | init_copy_kstat_irqs(old_desc, desc, cpu, nr_cpu_ids); |
| 54 | init_copy_desc_masks(old_desc, desc); | ||
| 49 | arch_init_copy_chip_data(old_desc, desc, cpu); | 55 | arch_init_copy_chip_data(old_desc, desc, cpu); |
| 56 | return true; | ||
| 50 | } | 57 | } |
| 51 | 58 | ||
| 52 | static void free_one_irq_desc(struct irq_desc *old_desc, struct irq_desc *desc) | 59 | static void free_one_irq_desc(struct irq_desc *old_desc, struct irq_desc *desc) |
| @@ -76,12 +83,18 @@ static struct irq_desc *__real_move_irq_desc(struct irq_desc *old_desc, | |||
| 76 | node = cpu_to_node(cpu); | 83 | node = cpu_to_node(cpu); |
| 77 | desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node); | 84 | desc = kzalloc_node(sizeof(*desc), GFP_ATOMIC, node); |
| 78 | if (!desc) { | 85 | if (!desc) { |
| 79 | printk(KERN_ERR "irq %d: can not get new irq_desc for migration.\n", irq); | 86 | printk(KERN_ERR "irq %d: can not get new irq_desc " |
| 87 | "for migration.\n", irq); | ||
| 88 | /* still use old one */ | ||
| 89 | desc = old_desc; | ||
| 90 | goto out_unlock; | ||
| 91 | } | ||
| 92 | if (!init_copy_one_irq_desc(irq, old_desc, desc, cpu)) { | ||
| 80 | /* still use old one */ | 93 | /* still use old one */ |
| 94 | kfree(desc); | ||
| 81 | desc = old_desc; | 95 | desc = old_desc; |
| 82 | goto out_unlock; | 96 | goto out_unlock; |
| 83 | } | 97 | } |
| 84 | init_copy_one_irq_desc(irq, old_desc, desc, cpu); | ||
| 85 | 98 | ||
| 86 | irq_desc_ptrs[irq] = desc; | 99 | irq_desc_ptrs[irq] = desc; |
| 87 | spin_unlock_irqrestore(&sparse_irq_lock, flags); | 100 | spin_unlock_irqrestore(&sparse_irq_lock, flags); |
diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c index aae3f742bcec..692363dd591f 100644 --- a/kernel/irq/proc.c +++ b/kernel/irq/proc.c | |||
| @@ -20,11 +20,11 @@ static struct proc_dir_entry *root_irq_dir; | |||
| 20 | static int irq_affinity_proc_show(struct seq_file *m, void *v) | 20 | static int irq_affinity_proc_show(struct seq_file *m, void *v) |
| 21 | { | 21 | { |
| 22 | struct irq_desc *desc = irq_to_desc((long)m->private); | 22 | struct irq_desc *desc = irq_to_desc((long)m->private); |
| 23 | const struct cpumask *mask = &desc->affinity; | 23 | const struct cpumask *mask = desc->affinity; |
| 24 | 24 | ||
| 25 | #ifdef CONFIG_GENERIC_PENDING_IRQ | 25 | #ifdef CONFIG_GENERIC_PENDING_IRQ |
| 26 | if (desc->status & IRQ_MOVE_PENDING) | 26 | if (desc->status & IRQ_MOVE_PENDING) |
| 27 | mask = &desc->pending_mask; | 27 | mask = desc->pending_mask; |
| 28 | #endif | 28 | #endif |
| 29 | seq_cpumask(m, mask); | 29 | seq_cpumask(m, mask); |
| 30 | seq_putc(m, '\n'); | 30 | seq_putc(m, '\n'); |
diff --git a/kernel/kexec.c b/kernel/kexec.c index 8a6d7b08864e..795e7b67a228 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
| @@ -1130,7 +1130,7 @@ void crash_save_cpu(struct pt_regs *regs, int cpu) | |||
| 1130 | return; | 1130 | return; |
| 1131 | memset(&prstatus, 0, sizeof(prstatus)); | 1131 | memset(&prstatus, 0, sizeof(prstatus)); |
| 1132 | prstatus.pr_pid = current->pid; | 1132 | prstatus.pr_pid = current->pid; |
| 1133 | elf_core_copy_regs(&prstatus.pr_reg, regs); | 1133 | elf_core_copy_kernel_regs(&prstatus.pr_reg, regs); |
| 1134 | buf = append_elf_note(buf, KEXEC_CORE_NOTE_NAME, NT_PRSTATUS, | 1134 | buf = append_elf_note(buf, KEXEC_CORE_NOTE_NAME, NT_PRSTATUS, |
| 1135 | &prstatus, sizeof(prstatus)); | 1135 | &prstatus, sizeof(prstatus)); |
| 1136 | final_note(buf); | 1136 | final_note(buf); |
diff --git a/kernel/panic.c b/kernel/panic.c index 2a2ff36ff44d..32fe4eff1b89 100644 --- a/kernel/panic.c +++ b/kernel/panic.c | |||
| @@ -74,6 +74,9 @@ NORET_TYPE void panic(const char * fmt, ...) | |||
| 74 | vsnprintf(buf, sizeof(buf), fmt, args); | 74 | vsnprintf(buf, sizeof(buf), fmt, args); |
| 75 | va_end(args); | 75 | va_end(args); |
| 76 | printk(KERN_EMERG "Kernel panic - not syncing: %s\n",buf); | 76 | printk(KERN_EMERG "Kernel panic - not syncing: %s\n",buf); |
| 77 | #ifdef CONFIG_DEBUG_BUGVERBOSE | ||
| 78 | dump_stack(); | ||
| 79 | #endif | ||
| 77 | bust_spinlocks(0); | 80 | bust_spinlocks(0); |
| 78 | 81 | ||
| 79 | /* | 82 | /* |
| @@ -355,15 +358,18 @@ EXPORT_SYMBOL(warn_slowpath); | |||
| 355 | #endif | 358 | #endif |
| 356 | 359 | ||
| 357 | #ifdef CONFIG_CC_STACKPROTECTOR | 360 | #ifdef CONFIG_CC_STACKPROTECTOR |
| 361 | |||
| 358 | /* | 362 | /* |
| 359 | * Called when gcc's -fstack-protector feature is used, and | 363 | * Called when gcc's -fstack-protector feature is used, and |
| 360 | * gcc detects corruption of the on-stack canary value | 364 | * gcc detects corruption of the on-stack canary value |
| 361 | */ | 365 | */ |
| 362 | void __stack_chk_fail(void) | 366 | void __stack_chk_fail(void) |
| 363 | { | 367 | { |
| 364 | panic("stack-protector: Kernel stack is corrupted"); | 368 | panic("stack-protector: Kernel stack is corrupted in: %p\n", |
| 369 | __builtin_return_address(0)); | ||
| 365 | } | 370 | } |
| 366 | EXPORT_SYMBOL(__stack_chk_fail); | 371 | EXPORT_SYMBOL(__stack_chk_fail); |
| 372 | |||
| 367 | #endif | 373 | #endif |
| 368 | 374 | ||
| 369 | core_param(panic, panic_timeout, int, 0644); | 375 | core_param(panic, panic_timeout, int, 0644); |
diff --git a/kernel/sched.c b/kernel/sched.c index 410eec404133..7d97ff7c4478 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -5944,12 +5944,7 @@ void sched_show_task(struct task_struct *p) | |||
| 5944 | printk(KERN_CONT " %016lx ", thread_saved_pc(p)); | 5944 | printk(KERN_CONT " %016lx ", thread_saved_pc(p)); |
| 5945 | #endif | 5945 | #endif |
| 5946 | #ifdef CONFIG_DEBUG_STACK_USAGE | 5946 | #ifdef CONFIG_DEBUG_STACK_USAGE |
| 5947 | { | 5947 | free = stack_not_used(p); |
| 5948 | unsigned long *n = end_of_stack(p); | ||
| 5949 | while (!*n) | ||
| 5950 | n++; | ||
| 5951 | free = (unsigned long)n - (unsigned long)end_of_stack(p); | ||
| 5952 | } | ||
| 5953 | #endif | 5948 | #endif |
| 5954 | printk(KERN_CONT "%5lu %5d %6d\n", free, | 5949 | printk(KERN_CONT "%5lu %5d %6d\n", free, |
| 5955 | task_pid_nr(p), task_pid_nr(p->real_parent)); | 5950 | task_pid_nr(p), task_pid_nr(p->real_parent)); |
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c index bac1061cea2f..da932f4c8524 100644 --- a/kernel/sched_rt.c +++ b/kernel/sched_rt.c | |||
| @@ -960,12 +960,13 @@ static struct task_struct *pick_next_highest_task_rt(struct rq *rq, int cpu) | |||
| 960 | 960 | ||
| 961 | static DEFINE_PER_CPU(cpumask_var_t, local_cpu_mask); | 961 | static DEFINE_PER_CPU(cpumask_var_t, local_cpu_mask); |
| 962 | 962 | ||
| 963 | static inline int pick_optimal_cpu(int this_cpu, cpumask_t *mask) | 963 | static inline int pick_optimal_cpu(int this_cpu, |
| 964 | const struct cpumask *mask) | ||
| 964 | { | 965 | { |
| 965 | int first; | 966 | int first; |
| 966 | 967 | ||
| 967 | /* "this_cpu" is cheaper to preempt than a remote processor */ | 968 | /* "this_cpu" is cheaper to preempt than a remote processor */ |
| 968 | if ((this_cpu != -1) && cpu_isset(this_cpu, *mask)) | 969 | if ((this_cpu != -1) && cpumask_test_cpu(this_cpu, mask)) |
| 969 | return this_cpu; | 970 | return this_cpu; |
| 970 | 971 | ||
| 971 | first = cpumask_first(mask); | 972 | first = cpumask_first(mask); |
| @@ -981,6 +982,7 @@ static int find_lowest_rq(struct task_struct *task) | |||
| 981 | struct cpumask *lowest_mask = __get_cpu_var(local_cpu_mask); | 982 | struct cpumask *lowest_mask = __get_cpu_var(local_cpu_mask); |
| 982 | int this_cpu = smp_processor_id(); | 983 | int this_cpu = smp_processor_id(); |
| 983 | int cpu = task_cpu(task); | 984 | int cpu = task_cpu(task); |
| 985 | cpumask_var_t domain_mask; | ||
| 984 | 986 | ||
| 985 | if (task->rt.nr_cpus_allowed == 1) | 987 | if (task->rt.nr_cpus_allowed == 1) |
| 986 | return -1; /* No other targets possible */ | 988 | return -1; /* No other targets possible */ |
| @@ -1013,19 +1015,25 @@ static int find_lowest_rq(struct task_struct *task) | |||
| 1013 | if (this_cpu == cpu) | 1015 | if (this_cpu == cpu) |
| 1014 | this_cpu = -1; /* Skip this_cpu opt if the same */ | 1016 | this_cpu = -1; /* Skip this_cpu opt if the same */ |
| 1015 | 1017 | ||
| 1016 | for_each_domain(cpu, sd) { | 1018 | if (alloc_cpumask_var(&domain_mask, GFP_ATOMIC)) { |
| 1017 | if (sd->flags & SD_WAKE_AFFINE) { | 1019 | for_each_domain(cpu, sd) { |
| 1018 | cpumask_t domain_mask; | 1020 | if (sd->flags & SD_WAKE_AFFINE) { |
| 1019 | int best_cpu; | 1021 | int best_cpu; |
| 1020 | 1022 | ||
| 1021 | cpumask_and(&domain_mask, sched_domain_span(sd), | 1023 | cpumask_and(domain_mask, |
| 1022 | lowest_mask); | 1024 | sched_domain_span(sd), |
| 1025 | lowest_mask); | ||
| 1023 | 1026 | ||
| 1024 | best_cpu = pick_optimal_cpu(this_cpu, | 1027 | best_cpu = pick_optimal_cpu(this_cpu, |
| 1025 | &domain_mask); | 1028 | domain_mask); |
| 1026 | if (best_cpu != -1) | 1029 | |
| 1027 | return best_cpu; | 1030 | if (best_cpu != -1) { |
| 1031 | free_cpumask_var(domain_mask); | ||
| 1032 | return best_cpu; | ||
| 1033 | } | ||
| 1034 | } | ||
| 1028 | } | 1035 | } |
| 1036 | free_cpumask_var(domain_mask); | ||
| 1029 | } | 1037 | } |
| 1030 | 1038 | ||
| 1031 | /* | 1039 | /* |
diff --git a/kernel/softirq.c b/kernel/softirq.c index bdbe9de9cd8d..0365b4899a3d 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c | |||
| @@ -795,6 +795,11 @@ int __init __weak early_irq_init(void) | |||
| 795 | return 0; | 795 | return 0; |
| 796 | } | 796 | } |
| 797 | 797 | ||
| 798 | int __init __weak arch_probe_nr_irqs(void) | ||
| 799 | { | ||
| 800 | return 0; | ||
| 801 | } | ||
| 802 | |||
| 798 | int __init __weak arch_early_irq_init(void) | 803 | int __init __weak arch_early_irq_init(void) |
| 799 | { | 804 | { |
| 800 | return 0; | 805 | return 0; |
diff --git a/scripts/gcc-x86_32-has-stack-protector.sh b/scripts/gcc-x86_32-has-stack-protector.sh new file mode 100644 index 000000000000..29493dc4528d --- /dev/null +++ b/scripts/gcc-x86_32-has-stack-protector.sh | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | |||
| 3 | echo "int foo(void) { char X[200]; return 3; }" | $* -S -xc -c -O0 -fstack-protector - -o - 2> /dev/null | grep -q "%gs" | ||
| 4 | if [ "$?" -eq "0" ] ; then | ||
| 5 | echo y | ||
| 6 | else | ||
| 7 | echo n | ||
| 8 | fi | ||
diff --git a/scripts/gcc-x86_64-has-stack-protector.sh b/scripts/gcc-x86_64-has-stack-protector.sh index 325c0a1b03b6..afaec618b395 100644 --- a/scripts/gcc-x86_64-has-stack-protector.sh +++ b/scripts/gcc-x86_64-has-stack-protector.sh | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | #!/bin/sh | 1 | #!/bin/sh |
| 2 | 2 | ||
| 3 | echo "int foo(void) { char X[200]; return 3; }" | $1 -S -xc -c -O0 -mcmodel=kernel -fstack-protector - -o - 2> /dev/null | grep -q "%gs" | 3 | echo "int foo(void) { char X[200]; return 3; }" | $* -S -xc -c -O0 -mcmodel=kernel -fstack-protector - -o - 2> /dev/null | grep -q "%gs" |
| 4 | if [ "$?" -eq "0" ] ; then | 4 | if [ "$?" -eq "0" ] ; then |
| 5 | echo $2 | 5 | echo y |
| 6 | else | ||
| 7 | echo n | ||
| 6 | fi | 8 | fi |
diff --git a/scripts/headers_check.pl b/scripts/headers_check.pl index db30fac3083e..56f90a480899 100644 --- a/scripts/headers_check.pl +++ b/scripts/headers_check.pl | |||
| @@ -38,7 +38,7 @@ foreach my $file (@files) { | |||
| 38 | &check_asm_types(); | 38 | &check_asm_types(); |
| 39 | &check_sizetypes(); | 39 | &check_sizetypes(); |
| 40 | &check_prototypes(); | 40 | &check_prototypes(); |
| 41 | &check_config(); | 41 | # Dropped for now. Too much noise &check_config(); |
| 42 | } | 42 | } |
| 43 | close FH; | 43 | close FH; |
| 44 | } | 44 | } |
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 88921611b22e..7e62303133dc 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
| @@ -415,8 +415,9 @@ static int parse_elf(struct elf_info *info, const char *filename) | |||
| 415 | const char *secstrings | 415 | const char *secstrings |
| 416 | = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; | 416 | = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset; |
| 417 | const char *secname; | 417 | const char *secname; |
| 418 | int nobits = sechdrs[i].sh_type == SHT_NOBITS; | ||
| 418 | 419 | ||
| 419 | if (sechdrs[i].sh_offset > info->size) { | 420 | if (!nobits && sechdrs[i].sh_offset > info->size) { |
| 420 | fatal("%s is truncated. sechdrs[i].sh_offset=%lu > " | 421 | fatal("%s is truncated. sechdrs[i].sh_offset=%lu > " |
| 421 | "sizeof(*hrd)=%zu\n", filename, | 422 | "sizeof(*hrd)=%zu\n", filename, |
| 422 | (unsigned long)sechdrs[i].sh_offset, | 423 | (unsigned long)sechdrs[i].sh_offset, |
| @@ -425,6 +426,8 @@ static int parse_elf(struct elf_info *info, const char *filename) | |||
| 425 | } | 426 | } |
| 426 | secname = secstrings + sechdrs[i].sh_name; | 427 | secname = secstrings + sechdrs[i].sh_name; |
| 427 | if (strcmp(secname, ".modinfo") == 0) { | 428 | if (strcmp(secname, ".modinfo") == 0) { |
| 429 | if (nobits) | ||
| 430 | fatal("%s has NOBITS .modinfo\n", filename); | ||
| 428 | info->modinfo = (void *)hdr + sechdrs[i].sh_offset; | 431 | info->modinfo = (void *)hdr + sechdrs[i].sh_offset; |
| 429 | info->modinfo_len = sechdrs[i].sh_size; | 432 | info->modinfo_len = sechdrs[i].sh_size; |
| 430 | } else if (strcmp(secname, "__ksymtab") == 0) | 433 | } else if (strcmp(secname, "__ksymtab") == 0) |
diff --git a/sound/drivers/Kconfig b/sound/drivers/Kconfig index 0bcf14640fde..84714a65e5c8 100644 --- a/sound/drivers/Kconfig +++ b/sound/drivers/Kconfig | |||
| @@ -33,7 +33,7 @@ if SND_DRIVERS | |||
| 33 | 33 | ||
| 34 | config SND_PCSP | 34 | config SND_PCSP |
| 35 | tristate "PC-Speaker support (READ HELP!)" | 35 | tristate "PC-Speaker support (READ HELP!)" |
| 36 | depends on PCSPKR_PLATFORM && X86_PC && HIGH_RES_TIMERS | 36 | depends on PCSPKR_PLATFORM && X86 && HIGH_RES_TIMERS |
| 37 | depends on INPUT | 37 | depends on INPUT |
| 38 | depends on EXPERIMENTAL | 38 | depends on EXPERIMENTAL |
| 39 | select SND_PCM | 39 | select SND_PCM |
