diff options
Diffstat (limited to 'arch/i386/kernel/cpu/common.c')
-rw-r--r-- | arch/i386/kernel/cpu/common.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/arch/i386/kernel/cpu/common.c b/arch/i386/kernel/cpu/common.c index ebd5d8247fa..ed4c9c3fe66 100644 --- a/arch/i386/kernel/cpu/common.c +++ b/arch/i386/kernel/cpu/common.c | |||
@@ -434,7 +434,7 @@ void __init identify_cpu(struct cpuinfo_x86 *c) | |||
434 | void __init detect_ht(struct cpuinfo_x86 *c) | 434 | void __init detect_ht(struct cpuinfo_x86 *c) |
435 | { | 435 | { |
436 | u32 eax, ebx, ecx, edx; | 436 | u32 eax, ebx, ecx, edx; |
437 | int index_lsb, index_msb, tmp; | 437 | int index_msb, tmp; |
438 | int cpu = smp_processor_id(); | 438 | int cpu = smp_processor_id(); |
439 | 439 | ||
440 | if (!cpu_has(c, X86_FEATURE_HT)) | 440 | if (!cpu_has(c, X86_FEATURE_HT)) |
@@ -446,7 +446,6 @@ void __init detect_ht(struct cpuinfo_x86 *c) | |||
446 | if (smp_num_siblings == 1) { | 446 | if (smp_num_siblings == 1) { |
447 | printk(KERN_INFO "CPU: Hyper-Threading is disabled\n"); | 447 | printk(KERN_INFO "CPU: Hyper-Threading is disabled\n"); |
448 | } else if (smp_num_siblings > 1 ) { | 448 | } else if (smp_num_siblings > 1 ) { |
449 | index_lsb = 0; | ||
450 | index_msb = 31; | 449 | index_msb = 31; |
451 | 450 | ||
452 | if (smp_num_siblings > NR_CPUS) { | 451 | if (smp_num_siblings > NR_CPUS) { |
@@ -455,21 +454,34 @@ void __init detect_ht(struct cpuinfo_x86 *c) | |||
455 | return; | 454 | return; |
456 | } | 455 | } |
457 | tmp = smp_num_siblings; | 456 | tmp = smp_num_siblings; |
458 | while ((tmp & 1) == 0) { | ||
459 | tmp >>=1 ; | ||
460 | index_lsb++; | ||
461 | } | ||
462 | tmp = smp_num_siblings; | ||
463 | while ((tmp & 0x80000000 ) == 0) { | 457 | while ((tmp & 0x80000000 ) == 0) { |
464 | tmp <<=1 ; | 458 | tmp <<=1 ; |
465 | index_msb--; | 459 | index_msb--; |
466 | } | 460 | } |
467 | if (index_lsb != index_msb ) | 461 | if (smp_num_siblings & (smp_num_siblings - 1)) |
468 | index_msb++; | 462 | index_msb++; |
469 | phys_proc_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb); | 463 | phys_proc_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb); |
470 | 464 | ||
471 | printk(KERN_INFO "CPU: Physical Processor ID: %d\n", | 465 | printk(KERN_INFO "CPU: Physical Processor ID: %d\n", |
472 | phys_proc_id[cpu]); | 466 | phys_proc_id[cpu]); |
467 | |||
468 | smp_num_siblings = smp_num_siblings / c->x86_num_cores; | ||
469 | |||
470 | tmp = smp_num_siblings; | ||
471 | index_msb = 31; | ||
472 | while ((tmp & 0x80000000) == 0) { | ||
473 | tmp <<=1 ; | ||
474 | index_msb--; | ||
475 | } | ||
476 | |||
477 | if (smp_num_siblings & (smp_num_siblings - 1)) | ||
478 | index_msb++; | ||
479 | |||
480 | cpu_core_id[cpu] = phys_pkg_id((ebx >> 24) & 0xFF, index_msb); | ||
481 | |||
482 | if (c->x86_num_cores > 1) | ||
483 | printk(KERN_INFO "CPU: Processor Core ID: %d\n", | ||
484 | cpu_core_id[cpu]); | ||
473 | } | 485 | } |
474 | } | 486 | } |
475 | #endif | 487 | #endif |