From 7baf4f08e1eb86e9eea704fcac13ce89e968e16e Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Fri, 1 Feb 2019 11:47:12 +0100 Subject: [PATCH] x86emul: work around SandyBridge errata There are a number of exception condition related errata on SandyBridge CPUs, some of which are unexpected #UD (others, of no interest here, are lack of mandated exceptions, or exceptions of unexpected type). Annotate the one workaround we already have, and add two more. Due to the exception recovery we have in place for stub invocations these aren't security issues. Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper master commit: 0d4d9e8f55602415475e04a5dc8b4ad27845a7f9 master date: 2018-12-18 15:19:47 +0100 --- xen/arch/x86/x86_emulate/x86_emulate.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/x86_emulate/x86_emulate.c b/xen/arch/x86/x86_emulate/x86_emulate.c index 2a4a98d0b5..003c4fba7c 100644 --- a/xen/arch/x86/x86_emulate/x86_emulate.c +++ b/xen/arch/x86/x86_emulate/x86_emulate.c @@ -5647,9 +5647,11 @@ x86_emulate( else { generate_exception_if(vex.reg != 0xf, EXC_UD); - vex.l = 0; host_and_vcpu_must_have(avx); get_fpu(X86EMUL_FPU_ymm, &fic); + + /* Work around erratum BT230. */ + vex.l = 0; } opc = init_prefixes(stub); @@ -6337,6 +6339,9 @@ x86_emulate( get_fpu(X86EMUL_FPU_mmx, &fic); } + /* Work around erratum BT36. */ + vex.w = 0; + opc = init_prefixes(stub); opc[0] = b; fic.insn_bytes = PFX_BYTES + 1; @@ -7630,6 +7635,11 @@ x86_emulate( generate_exception_if(vex.l || vex.reg != 0xf, EXC_UD); host_and_vcpu_must_have(avx); get_fpu(X86EMUL_FPU_ymm, &fic); + + /* Work around erratum BT41. */ + if ( !mode_64bit() ) + vex.w = 0; + opc = init_prefixes(stub); goto pextr;