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
370370 */
371371 detect_extended_topology(c);
372372
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+
373384 l2 = init_intel_cacheinfo(c);
374385 if (c->cpuid_level > 9) {
375386 unsigned eax = cpuid_eax(10);
@@ -438,17 +449,6 @@ static void init_intel(struct cpuinfo_x86 *c) · 62 unmodified lines
438449 set_cpu_cap(c, X86_FEATURE_P3);
439450 #endif
440451
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−
452452 /* Work around errata */
453453 srat_detect_node(c);
454454
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
730730 #endif
731731 }
732732
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+
733745 c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d));
734746
735747 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
24512451 for_each_online_cpu(i) {
24522452 err = mce_device_create(i);
24532453 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);
24542460 cpu_notifier_register_done();
24552461 goto err_device_create;
24562462 }
@@ -2471,10 +2477,6 @@ static __init int mcheck_init_device(void) · 14 unmodified lines
24712477 err_register:
24722478 unregister_syscore_ops(&mce_syscore_ops);
24732479
2474− cpu_notifier_register_begin();
2475− __unregister_hotcpu_notifier(&mce_cpu_notifier);
2476− cpu_notifier_register_done();
2477−
24782480 err_device_create:
24792481 /*
24802482 * 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
425425 cmpl $(NR_syscalls), %eax
426426 jae sysenter_badsys
427427 call *sys_call_table(,%eax,4)
428− movl %eax,PT_EAX(%esp)
429428 sysenter_after_call:
429+ movl %eax,PT_EAX(%esp)
430430 LOCKDEP_SYS_EXIT
431431 DISABLE_INTERRUPTS(CLBR_ANY)
432432 TRACE_IRQS_OFF
@@ -502,6 +502,7 @@ ENTRY(system_call) · 69 unmodified lines
502502 jae syscall_badsys
503503 syscall_call:
504504 call *sys_call_table(,%eax,4)
505+syscall_after_call:
505506 movl %eax,PT_EAX(%esp) # store the return value
506507 syscall_exit:
507508 LOCKDEP_SYS_EXIT
@@ -675,12 +676,12 @@ syscall_fault: · 167 unmodified lines
675676 END(syscall_fault)
676677
677678 syscall_badsys:
678− movl $-ENOSYS,PT_EAX(%esp)
679− jmp syscall_exit
679+ movl $-ENOSYS,%eax
680+ jmp syscall_after_call
680681 END(syscall_badsys)
681682
682683 sysenter_badsys:
683− movl $-ENOSYS,PT_EAX(%esp)
684+ movl $-ENOSYS,%eax
684685 jmp sysenter_after_call
685686 END(syscall_badsys)
686687 CFI_ENDPROC