diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-07-27 12:53:01 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-07-27 12:53:01 -0400 |
commit | 43a255c210cebdf09235567bf46d3ceea3438b4f (patch) | |
tree | b82d0cf9202da868d6928a15001790d9f7d2d164 /arch/x86 | |
parent | fbf08efa0400ec51963666d4757b4c57e5096a3c (diff) | |
parent | bf72f5dee0656cfa9dc40bcb533f08d1d144e6ea (diff) |
Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 fixes from Peter Anvin:
"A couple of crash fixes, plus a fix that on 32 bits would cause a
missing -ENOSYS for nonexistent system calls"
* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
x86, cpu: Fix cache topology for early P4-SMT
x86_32, entry: Store badsys error code in %eax
x86, MCE: Robustify mcheck_init_device
Diffstat (limited to 'arch/x86')
-rw-r--r-- | arch/x86/kernel/cpu/intel.c | 22 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/intel_cacheinfo.c | 12 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce.c | 10 | ||||
-rw-r--r-- | arch/x86/kernel/entry_32.S | 9 |
4 files changed, 34 insertions, 19 deletions
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index a80029035bf2..f9e4fdd3b877 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
@@ -370,6 +370,17 @@ static void init_intel(struct cpuinfo_x86 *c) | |||
370 | */ | 370 | */ |
371 | detect_extended_topology(c); | 371 | detect_extended_topology(c); |
372 | 372 | ||
373 | if (!cpu_has(c, X86_FEATURE_XTOPOLOGY)) { | ||
374 | /* | ||
375 | * let's use the legacy cpuid vector 0x1 and 0x4 for topology | ||
376 | * detection. | ||
377 | */ | ||
378 | c->x86_max_cores = intel_num_cpu_cores(c); | ||
379 | #ifdef CONFIG_X86_32 | ||
380 | detect_ht(c); | ||
381 | #endif | ||
382 | } | ||
383 | |||
373 | l2 = init_intel_cacheinfo(c); | 384 | l2 = init_intel_cacheinfo(c); |
374 | if (c->cpuid_level > 9) { | 385 | if (c->cpuid_level > 9) { |
375 | unsigned eax = cpuid_eax(10); | 386 | unsigned eax = cpuid_eax(10); |
@@ -438,17 +449,6 @@ static void init_intel(struct cpuinfo_x86 *c) | |||
438 | set_cpu_cap(c, X86_FEATURE_P3); | 449 | set_cpu_cap(c, X86_FEATURE_P3); |
439 | #endif | 450 | #endif |
440 | 451 | ||
441 | if (!cpu_has(c, X86_FEATURE_XTOPOLOGY)) { | ||
442 | /* | ||
443 | * let's use the legacy cpuid vector 0x1 and 0x4 for topology | ||
444 | * detection. | ||
445 | */ | ||
446 | c->x86_max_cores = intel_num_cpu_cores(c); | ||
447 | #ifdef CONFIG_X86_32 | ||
448 | detect_ht(c); | ||
449 | #endif | ||
450 | } | ||
451 | |||
452 | /* Work around errata */ | 452 | /* Work around errata */ |
453 | srat_detect_node(c); | 453 | srat_detect_node(c); |
454 | 454 | ||
diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index a952e9c85b6f..9c8f7394c612 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c | |||
@@ -730,6 +730,18 @@ unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c) | |||
730 | #endif | 730 | #endif |
731 | } | 731 | } |
732 | 732 | ||
733 | #ifdef CONFIG_X86_HT | ||
734 | /* | ||
735 | * If cpu_llc_id is not yet set, this means cpuid_level < 4 which in | ||
736 | * turns means that the only possibility is SMT (as indicated in | ||
737 | * cpuid1). Since cpuid2 doesn't specify shared caches, and we know | ||
738 | * that SMT shares all caches, we can unconditionally set cpu_llc_id to | ||
739 | * c->phys_proc_id. | ||
740 | */ | ||
741 | if (per_cpu(cpu_llc_id, cpu) == BAD_APICID) | ||
742 | per_cpu(cpu_llc_id, cpu) = c->phys_proc_id; | ||
743 | #endif | ||
744 | |||
733 | c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d)); | 745 | c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d)); |
734 | 746 | ||
735 | return l2; | 747 | return l2; |
diff --git a/arch/x86/kernel/cpu/mcheck/mce.c b/arch/x86/kernel/cpu/mcheck/mce.c index bb92f38153b2..9a79c8dbd8e8 100644 --- a/arch/x86/kernel/cpu/mcheck/mce.c +++ b/arch/x86/kernel/cpu/mcheck/mce.c | |||
@@ -2451,6 +2451,12 @@ static __init int mcheck_init_device(void) | |||
2451 | for_each_online_cpu(i) { | 2451 | for_each_online_cpu(i) { |
2452 | err = mce_device_create(i); | 2452 | err = mce_device_create(i); |
2453 | if (err) { | 2453 | if (err) { |
2454 | /* | ||
2455 | * Register notifier anyway (and do not unreg it) so | ||
2456 | * that we don't leave undeleted timers, see notifier | ||
2457 | * callback above. | ||
2458 | */ | ||
2459 | __register_hotcpu_notifier(&mce_cpu_notifier); | ||
2454 | cpu_notifier_register_done(); | 2460 | cpu_notifier_register_done(); |
2455 | goto err_device_create; | 2461 | goto err_device_create; |
2456 | } | 2462 | } |
@@ -2471,10 +2477,6 @@ static __init int mcheck_init_device(void) | |||
2471 | err_register: | 2477 | err_register: |
2472 | unregister_syscore_ops(&mce_syscore_ops); | 2478 | unregister_syscore_ops(&mce_syscore_ops); |
2473 | 2479 | ||
2474 | cpu_notifier_register_begin(); | ||
2475 | __unregister_hotcpu_notifier(&mce_cpu_notifier); | ||
2476 | cpu_notifier_register_done(); | ||
2477 | |||
2478 | err_device_create: | 2480 | err_device_create: |
2479 | /* | 2481 | /* |
2480 | * We didn't keep track of which devices were created above, but | 2482 | * We didn't keep track of which devices were created above, but |
diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S index dbaa23e78b36..0d0c9d4ab6d5 100644 --- a/arch/x86/kernel/entry_32.S +++ b/arch/x86/kernel/entry_32.S | |||
@@ -425,8 +425,8 @@ sysenter_do_call: | |||
425 | cmpl $(NR_syscalls), %eax | 425 | cmpl $(NR_syscalls), %eax |
426 | jae sysenter_badsys | 426 | jae sysenter_badsys |
427 | call *sys_call_table(,%eax,4) | 427 | call *sys_call_table(,%eax,4) |
428 | movl %eax,PT_EAX(%esp) | ||
429 | sysenter_after_call: | 428 | sysenter_after_call: |
429 | movl %eax,PT_EAX(%esp) | ||
430 | LOCKDEP_SYS_EXIT | 430 | LOCKDEP_SYS_EXIT |
431 | DISABLE_INTERRUPTS(CLBR_ANY) | 431 | DISABLE_INTERRUPTS(CLBR_ANY) |
432 | TRACE_IRQS_OFF | 432 | TRACE_IRQS_OFF |
@@ -502,6 +502,7 @@ ENTRY(system_call) | |||
502 | jae syscall_badsys | 502 | jae syscall_badsys |
503 | syscall_call: | 503 | syscall_call: |
504 | call *sys_call_table(,%eax,4) | 504 | call *sys_call_table(,%eax,4) |
505 | syscall_after_call: | ||
505 | movl %eax,PT_EAX(%esp) # store the return value | 506 | movl %eax,PT_EAX(%esp) # store the return value |
506 | syscall_exit: | 507 | syscall_exit: |
507 | LOCKDEP_SYS_EXIT | 508 | LOCKDEP_SYS_EXIT |
@@ -675,12 +676,12 @@ syscall_fault: | |||
675 | END(syscall_fault) | 676 | END(syscall_fault) |
676 | 677 | ||
677 | syscall_badsys: | 678 | syscall_badsys: |
678 | movl $-ENOSYS,PT_EAX(%esp) | 679 | movl $-ENOSYS,%eax |
679 | jmp syscall_exit | 680 | jmp syscall_after_call |
680 | END(syscall_badsys) | 681 | END(syscall_badsys) |
681 | 682 | ||
682 | sysenter_badsys: | 683 | sysenter_badsys: |
683 | movl $-ENOSYS,PT_EAX(%esp) | 684 | movl $-ENOSYS,%eax |
684 | jmp sysenter_after_call | 685 | jmp sysenter_after_call |
685 | END(syscall_badsys) | 686 | END(syscall_badsys) |
686 | CFI_ENDPROC | 687 | CFI_ENDPROC |