Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86-64: Don't apply destructive erratum workaround on unaffected CPUs

Erratum 93 applies to AMD K8 CPUs only, and its workaround
(forcing the upper 32 bits of %rip to all get set under certain
conditions) is actually getting in the way of analyzing page
faults occurring during EFI physical mode runtime calls (in
particular the page table walk shown is completely unrelated to
the actual fault). This is because typically EFI runtime code
lives in the space between 2G and 4G, which - modulo the above
manipulation - is likely to overlap with the kernel or modules
area.

While even for the other errata workarounds their taking effect
could be limited to just the affected CPUs, none of them appears
to be destructive, and they're generally getting called only
outside of performance critical paths, so they're being left
untouched.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Link: http://lkml.kernel.org/r/4E835FE30200007800058464@nat28.tlf.novell.com
Signed-off-by: Ingo Molnar <mingo@elte.hu>

authored by

Jan Beulich and committed by
Ingo Molnar
e05139f2 a102a9ec

+7 -1
+7 -1
arch/x86/mm/fault.c
··· 420 420 return 0; 421 421 } 422 422 423 + #ifdef CONFIG_CPU_SUP_AMD 423 424 static const char errata93_warning[] = 424 425 KERN_ERR 425 426 "******* Your BIOS seems to not contain a fix for K8 errata #93\n" 426 427 "******* Working around it, but it may cause SEGVs or burn power.\n" 427 428 "******* Please consider a BIOS update.\n" 428 429 "******* Disabling USB legacy in the BIOS may also help.\n"; 430 + #endif 429 431 430 432 /* 431 433 * No vm86 mode in 64-bit mode: ··· 507 505 */ 508 506 static int is_errata93(struct pt_regs *regs, unsigned long address) 509 507 { 510 - #ifdef CONFIG_X86_64 508 + #if defined(CONFIG_X86_64) && defined(CONFIG_CPU_SUP_AMD) 509 + if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD 510 + || boot_cpu_data.x86 != 0xf) 511 + return 0; 512 + 511 513 if (address != regs->ip) 512 514 return 0; 513 515