History

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

Linus Torvalds committed 12 years ago

Commit 43a255c2 parents fbf08ef bf72f5d4 files · +34 −19Browse files

Unified · Split

4 files
  1. arch/x86/kernel/cpu/intel.c +11 −11
  2. arch/x86/kernel/cpu/intel_cacheinfo.c +12 −0
  3. arch/x86/kernel/cpu/mcheck/mce.c +6 −4
  4. arch/x86/kernel/entry_32.S +5 −4
arch/x86/kernel/cpu/intel.c+11−11
@@ -370,6 +370,17 @@ static void init_intel(struct cpuinfo_x86 *c) · 369 unmodified lines
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) · 62 unmodified lines
438 set_cpu_cap(c, X86_FEATURE_P3);449 set_cpu_cap(c, X86_FEATURE_P3);
439#endif450#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
arch/x86/kernel/cpu/intel_cacheinfo.c+12−0
@@ -730,6 +730,18 @@ unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c) · 729 unmodified lines
730#endif730#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;
arch/x86/kernel/cpu/mcheck/mce.c+6−4
@@ -2451,6 +2451,12 @@ static __init int mcheck_init_device(void) · 2450 unmodified lines
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) · 14 unmodified lines
2471err_register:2477err_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
2478err_device_create:2480err_device_create:
2479 /*2481 /*
2480 * We didn't keep track of which devices were created above, but2482 * We didn't keep track of which devices were created above, but
arch/x86/kernel/entry_32.S+5−4
@@ -425,8 +425,8 @@ sysenter_do_call: · 424 unmodified lines
425 cmpl $(NR_syscalls), %eax425 cmpl $(NR_syscalls), %eax
426 jae sysenter_badsys426 jae sysenter_badsys
427 call *sys_call_table(,%eax,4)427 call *sys_call_table(,%eax,4)
428 movl %eax,PT_EAX(%esp)
429sysenter_after_call:428sysenter_after_call:
429 movl %eax,PT_EAX(%esp)
430 LOCKDEP_SYS_EXIT430 LOCKDEP_SYS_EXIT
431 DISABLE_INTERRUPTS(CLBR_ANY)431 DISABLE_INTERRUPTS(CLBR_ANY)
432 TRACE_IRQS_OFF432 TRACE_IRQS_OFF
@@ -502,6 +502,7 @@ ENTRY(system_call) · 69 unmodified lines
502 jae syscall_badsys502 jae syscall_badsys
503syscall_call:503syscall_call:
504 call *sys_call_table(,%eax,4)504 call *sys_call_table(,%eax,4)
505syscall_after_call:
505 movl %eax,PT_EAX(%esp) # store the return value506 movl %eax,PT_EAX(%esp) # store the return value
506syscall_exit:507syscall_exit:
507 LOCKDEP_SYS_EXIT508 LOCKDEP_SYS_EXIT
@@ -675,12 +676,12 @@ syscall_fault: · 167 unmodified lines
675END(syscall_fault)676END(syscall_fault)
676 677
677syscall_badsys:678syscall_badsys:
678 movl $-ENOSYS,PT_EAX(%esp)679 movl $-ENOSYS,%eax
679 jmp syscall_exit680 jmp syscall_after_call
680END(syscall_badsys)681END(syscall_badsys)
681 682
682sysenter_badsys:683sysenter_badsys:
683 movl $-ENOSYS,PT_EAX(%esp)684 movl $-ENOSYS,%eax
684 jmp sysenter_after_call685 jmp sysenter_after_call
685END(syscall_badsys)686END(syscall_badsys)
686 CFI_ENDPROC687 CFI_ENDPROC