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
Unified · Split
| @@ -370,6 +370,17 @@ static void init_intel(struct cpuinfo_x86 *c) · 369 unmodified lines | ||
| 370 | 370 | */ |
| 371 | 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 | 384 | l2 = init_intel_cacheinfo(c); |
| 374 | 385 | if (c->cpuid_level > 9) { |
| 375 | 386 | unsigned eax = cpuid_eax(10); |
| @@ -438,17 +449,6 @@ static void init_intel(struct cpuinfo_x86 *c) · 62 unmodified lines | ||
| 438 | 449 | set_cpu_cap(c, X86_FEATURE_P3); |
| 439 | 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 | 452 | /* Work around errata */ |
| 453 | 453 | srat_detect_node(c); |
| 454 | 454 | |
| @@ -730,6 +730,18 @@ unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c) · 729 unmodified lines | ||
| 730 | 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 | 745 | c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d)); |
| 734 | 746 | |
| 735 | 747 | return l2; |
| @@ -2451,6 +2451,12 @@ static __init int mcheck_init_device(void) · 2450 unmodified lines | ||
| 2451 | 2451 | for_each_online_cpu(i) { |
| 2452 | 2452 | err = mce_device_create(i); |
| 2453 | 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 | 2460 | cpu_notifier_register_done(); |
| 2455 | 2461 | goto err_device_create; |
| 2456 | 2462 | } |
| @@ -2471,10 +2477,6 @@ static __init int mcheck_init_device(void) · 14 unmodified lines | ||
| 2471 | 2477 | err_register: |
| 2472 | 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 | 2480 | err_device_create: |
| 2479 | 2481 | /* |
| 2480 | 2482 | * We didn't keep track of which devices were created above, but |
| @@ -425,8 +425,8 @@ sysenter_do_call: · 424 unmodified lines | ||
| 425 | 425 | cmpl $(NR_syscalls), %eax |
| 426 | 426 | jae sysenter_badsys |
| 427 | 427 | call *sys_call_table(,%eax,4) |
| 428 | − movl %eax,PT_EAX(%esp) | |
| 429 | 428 | sysenter_after_call: |
| 429 | + movl %eax,PT_EAX(%esp) | |
| 430 | 430 | LOCKDEP_SYS_EXIT |
| 431 | 431 | DISABLE_INTERRUPTS(CLBR_ANY) |
| 432 | 432 | TRACE_IRQS_OFF |
| @@ -502,6 +502,7 @@ ENTRY(system_call) · 69 unmodified lines | ||
| 502 | 502 | jae syscall_badsys |
| 503 | 503 | syscall_call: |
| 504 | 504 | call *sys_call_table(,%eax,4) |
| 505 | +syscall_after_call: | |
| 505 | 506 | movl %eax,PT_EAX(%esp) # store the return value |
| 506 | 507 | syscall_exit: |
| 507 | 508 | LOCKDEP_SYS_EXIT |
| @@ -675,12 +676,12 @@ syscall_fault: · 167 unmodified lines | ||
| 675 | 676 | END(syscall_fault) |
| 676 | 677 | |
| 677 | 678 | syscall_badsys: |
| 678 | − movl $-ENOSYS,PT_EAX(%esp) | |
| 679 | − jmp syscall_exit | |
| 679 | + movl $-ENOSYS,%eax | |
| 680 | + jmp syscall_after_call | |
| 680 | 681 | END(syscall_badsys) |
| 681 | 682 | |
| 682 | 683 | sysenter_badsys: |
| 683 | − movl $-ENOSYS,PT_EAX(%esp) | |
| 684 | + movl $-ENOSYS,%eax | |
| 684 | 685 | jmp sysenter_after_call |
| 685 | 686 | END(syscall_badsys) |
| 686 | 687 | CFI_ENDPROC |