Skip to content

Commit 43a255c

Browse files
committed
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
2 parents fbf08ef + bf72f5d commit 43a255c

File tree

4 files changed

+34
-19
lines changed

4 files changed

+34
-19
lines changed

arch/x86/kernel/cpu/intel.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,17 @@ static void init_intel(struct cpuinfo_x86 *c)
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)
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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,18 @@ unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c)
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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2451,6 +2451,12 @@ static __init int mcheck_init_device(void)
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)
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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -425,8 +425,8 @@ sysenter_do_call:
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)
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:
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

0 commit comments

Comments
 (0)