diff options
| -rw-r--r-- | arch/x86/include/asm/processor.h | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/common.c | 129 |
2 files changed, 68 insertions, 64 deletions
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index 76139506c3e4..dccef5be0fc1 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h | |||
| @@ -391,6 +391,9 @@ DECLARE_PER_CPU(union irq_stack_union, irq_stack_union); | |||
| 391 | DECLARE_INIT_PER_CPU(irq_stack_union); | 391 | DECLARE_INIT_PER_CPU(irq_stack_union); |
| 392 | 392 | ||
| 393 | DECLARE_PER_CPU(char *, irq_stack_ptr); | 393 | DECLARE_PER_CPU(char *, irq_stack_ptr); |
| 394 | DECLARE_PER_CPU(unsigned int, irq_count); | ||
| 395 | extern unsigned long kernel_eflags; | ||
| 396 | extern asmlinkage void ignore_sysret(void); | ||
| 394 | #else /* X86_64 */ | 397 | #else /* X86_64 */ |
| 395 | #ifdef CONFIG_CC_STACKPROTECTOR | 398 | #ifdef CONFIG_CC_STACKPROTECTOR |
| 396 | DECLARE_PER_CPU(unsigned long, stack_canary); | 399 | DECLARE_PER_CPU(unsigned long, stack_canary); |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 826d5c876278..cad6878c88db 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
| @@ -1,52 +1,52 @@ | |||
| 1 | #include <linux/init.h> | 1 | #include <linux/topology.h> |
| 2 | #include <linux/kernel.h> | ||
| 3 | #include <linux/sched.h> | ||
| 4 | #include <linux/string.h> | ||
| 5 | #include <linux/bootmem.h> | 2 | #include <linux/bootmem.h> |
| 3 | #include <linux/linkage.h> | ||
| 6 | #include <linux/bitops.h> | 4 | #include <linux/bitops.h> |
| 5 | #include <linux/kernel.h> | ||
| 7 | #include <linux/module.h> | 6 | #include <linux/module.h> |
| 8 | #include <linux/kgdb.h> | 7 | #include <linux/percpu.h> |
| 9 | #include <linux/topology.h> | 8 | #include <linux/string.h> |
| 10 | #include <linux/delay.h> | 9 | #include <linux/delay.h> |
| 10 | #include <linux/sched.h> | ||
| 11 | #include <linux/init.h> | ||
| 12 | #include <linux/kgdb.h> | ||
| 11 | #include <linux/smp.h> | 13 | #include <linux/smp.h> |
| 12 | #include <linux/percpu.h> | 14 | #include <linux/io.h> |
| 13 | #include <asm/i387.h> | 15 | |
| 14 | #include <asm/msr.h> | 16 | #include <asm/stackprotector.h> |
| 15 | #include <asm/io.h> | ||
| 16 | #include <asm/linkage.h> | ||
| 17 | #include <asm/mmu_context.h> | 17 | #include <asm/mmu_context.h> |
| 18 | #include <asm/hypervisor.h> | ||
| 19 | #include <asm/processor.h> | ||
| 20 | #include <asm/sections.h> | ||
| 21 | #include <asm/cpumask.h> | ||
| 22 | #include <asm/pgtable.h> | ||
| 23 | #include <asm/atomic.h> | ||
| 24 | #include <asm/proto.h> | ||
| 25 | #include <asm/setup.h> | ||
| 26 | #include <asm/apic.h> | ||
| 27 | #include <asm/desc.h> | ||
| 28 | #include <asm/i387.h> | ||
| 18 | #include <asm/mtrr.h> | 29 | #include <asm/mtrr.h> |
| 30 | #include <asm/numa.h> | ||
| 31 | #include <asm/asm.h> | ||
| 32 | #include <asm/cpu.h> | ||
| 19 | #include <asm/mce.h> | 33 | #include <asm/mce.h> |
| 34 | #include <asm/msr.h> | ||
| 20 | #include <asm/pat.h> | 35 | #include <asm/pat.h> |
| 21 | #include <asm/asm.h> | ||
| 22 | #include <asm/numa.h> | ||
| 23 | #include <asm/smp.h> | 36 | #include <asm/smp.h> |
| 24 | #include <asm/cpu.h> | ||
| 25 | #include <asm/cpumask.h> | ||
| 26 | #include <asm/apic.h> | ||
| 27 | 37 | ||
| 28 | #ifdef CONFIG_X86_LOCAL_APIC | 38 | #ifdef CONFIG_X86_LOCAL_APIC |
| 29 | #include <asm/uv/uv.h> | 39 | #include <asm/uv/uv.h> |
| 30 | #endif | 40 | #endif |
| 31 | 41 | ||
| 32 | #include <asm/pgtable.h> | ||
| 33 | #include <asm/processor.h> | ||
| 34 | #include <asm/desc.h> | ||
| 35 | #include <asm/atomic.h> | ||
| 36 | #include <asm/proto.h> | ||
| 37 | #include <asm/sections.h> | ||
| 38 | #include <asm/setup.h> | ||
| 39 | #include <asm/hypervisor.h> | ||
| 40 | #include <asm/stackprotector.h> | ||
| 41 | |||
| 42 | #include "cpu.h" | 42 | #include "cpu.h" |
| 43 | 43 | ||
| 44 | #ifdef CONFIG_X86_64 | 44 | #ifdef CONFIG_X86_64 |
| 45 | 45 | ||
| 46 | /* all of these masks are initialized in setup_cpu_local_masks() */ | 46 | /* all of these masks are initialized in setup_cpu_local_masks() */ |
| 47 | cpumask_var_t cpu_callin_mask; | ||
| 48 | cpumask_var_t cpu_callout_mask; | ||
| 49 | cpumask_var_t cpu_initialized_mask; | 47 | cpumask_var_t cpu_initialized_mask; |
| 48 | cpumask_var_t cpu_callout_mask; | ||
| 49 | cpumask_var_t cpu_callin_mask; | ||
| 50 | 50 | ||
| 51 | /* representing cpus for which sibling maps can be computed */ | 51 | /* representing cpus for which sibling maps can be computed */ |
| 52 | cpumask_var_t cpu_sibling_setup_mask; | 52 | cpumask_var_t cpu_sibling_setup_mask; |
| @@ -62,10 +62,10 @@ void __init setup_cpu_local_masks(void) | |||
| 62 | 62 | ||
| 63 | #else /* CONFIG_X86_32 */ | 63 | #else /* CONFIG_X86_32 */ |
| 64 | 64 | ||
| 65 | cpumask_t cpu_callin_map; | 65 | cpumask_t cpu_sibling_setup_map; |
| 66 | cpumask_t cpu_callout_map; | 66 | cpumask_t cpu_callout_map; |
| 67 | cpumask_t cpu_initialized; | 67 | cpumask_t cpu_initialized; |
| 68 | cpumask_t cpu_sibling_setup_map; | 68 | cpumask_t cpu_callin_map; |
| 69 | 69 | ||
| 70 | #endif /* CONFIG_X86_32 */ | 70 | #endif /* CONFIG_X86_32 */ |
| 71 | 71 | ||
| @@ -79,7 +79,7 @@ DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = { | |||
| 79 | * IRET will check the segment types kkeil 2000/10/28 | 79 | * IRET will check the segment types kkeil 2000/10/28 |
| 80 | * Also sysret mandates a special GDT layout | 80 | * Also sysret mandates a special GDT layout |
| 81 | * | 81 | * |
| 82 | * The TLS descriptors are currently at a different place compared to i386. | 82 | * TLS descriptors are currently at a different place compared to i386. |
| 83 | * Hopefully nobody expects them at a fixed place (Wine?) | 83 | * Hopefully nobody expects them at a fixed place (Wine?) |
| 84 | */ | 84 | */ |
| 85 | [GDT_ENTRY_KERNEL32_CS] = { { { 0x0000ffff, 0x00cf9b00 } } }, | 85 | [GDT_ENTRY_KERNEL32_CS] = { { { 0x0000ffff, 0x00cf9b00 } } }, |
| @@ -243,6 +243,7 @@ cpuid_dependent_features[] = { | |||
| 243 | static void __cpuinit filter_cpuid_features(struct cpuinfo_x86 *c, bool warn) | 243 | static void __cpuinit filter_cpuid_features(struct cpuinfo_x86 *c, bool warn) |
| 244 | { | 244 | { |
| 245 | const struct cpuid_dependent_feature *df; | 245 | const struct cpuid_dependent_feature *df; |
| 246 | |||
| 246 | for (df = cpuid_dependent_features; df->feature; df++) { | 247 | for (df = cpuid_dependent_features; df->feature; df++) { |
| 247 | /* | 248 | /* |
| 248 | * Note: cpuid_level is set to -1 if unavailable, but | 249 | * Note: cpuid_level is set to -1 if unavailable, but |
| @@ -364,12 +365,12 @@ static void __cpuinit get_model_name(struct cpuinfo_x86 *c) | |||
| 364 | undo that brain damage */ | 365 | undo that brain damage */ |
| 365 | p = q = &c->x86_model_id[0]; | 366 | p = q = &c->x86_model_id[0]; |
| 366 | while (*p == ' ') | 367 | while (*p == ' ') |
| 367 | p++; | 368 | p++; |
| 368 | if (p != q) { | 369 | if (p != q) { |
| 369 | while (*p) | 370 | while (*p) |
| 370 | *q++ = *p++; | 371 | *q++ = *p++; |
| 371 | while (q <= &c->x86_model_id[48]) | 372 | while (q <= &c->x86_model_id[48]) |
| 372 | *q++ = '\0'; /* Zero-pad the rest */ | 373 | *q++ = '\0'; /* Zero-pad the rest */ |
| 373 | } | 374 | } |
| 374 | } | 375 | } |
| 375 | 376 | ||
| @@ -441,14 +442,15 @@ void __cpuinit detect_ht(struct cpuinfo_x86 *c) | |||
| 441 | } else if (smp_num_siblings > 1) { | 442 | } else if (smp_num_siblings > 1) { |
| 442 | 443 | ||
| 443 | if (smp_num_siblings > nr_cpu_ids) { | 444 | if (smp_num_siblings > nr_cpu_ids) { |
| 444 | printk(KERN_WARNING "CPU: Unsupported number of siblings %d", | 445 | pr_warning("CPU: Unsupported number of siblings %d", |
| 445 | smp_num_siblings); | 446 | smp_num_siblings); |
| 446 | smp_num_siblings = 1; | 447 | smp_num_siblings = 1; |
| 447 | return; | 448 | return; |
| 448 | } | 449 | } |
| 449 | 450 | ||
| 450 | index_msb = get_count_order(smp_num_siblings); | 451 | index_msb = get_count_order(smp_num_siblings); |
| 451 | c->phys_proc_id = apic->phys_pkg_id(c->initial_apicid, index_msb); | 452 | c->phys_proc_id = apic->phys_pkg_id(c->initial_apicid, |
| 453 | index_msb); | ||
| 452 | 454 | ||
| 453 | smp_num_siblings = smp_num_siblings / c->x86_max_cores; | 455 | smp_num_siblings = smp_num_siblings / c->x86_max_cores; |
| 454 | 456 | ||
| @@ -491,7 +493,8 @@ static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c) | |||
| 491 | 493 | ||
| 492 | if (!printed) { | 494 | if (!printed) { |
| 493 | printed++; | 495 | printed++; |
| 494 | printk(KERN_ERR "CPU: vendor_id '%s' unknown, using generic init.\n", v); | 496 | printk(KERN_ERR "CPU: vendor_id '%s'" |
| 497 | "unknown, using generic init.\n", v); | ||
| 495 | printk(KERN_ERR "CPU: Your system may be unstable.\n"); | 498 | printk(KERN_ERR "CPU: Your system may be unstable.\n"); |
| 496 | } | ||
