[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-4.0-testing] x86/emulator: workaround for AMD erratum 573
# HG changeset patch # User Jan Beulich <jbeulich@xxxxxxxx> # Date 1331111120 0 # Node ID 26bf0e10596e0058529aa525d8e154aa67afe7d2 # Parent 35ee60fe531f5a8e10b5ad314dfa287a3c09265d x86/emulator: workaround for AMD erratum 573 The only cases where we might end up emulating fsincos (as any other x87 operations without memory operands) are - when a HVM guest is in real mode (not applicable on AMD) - between two half page table updates in PAE mode (unlikely, and not doing the emulation here does affect only performance, not correctness) - when a guest maliciously (or erroneously) modifies an (MMIO or page table update) instruction under emulation (unspecified behavior) Hence, in order to avoid the erratum to cause harm to the entire host, don't emulate fsincos on the affected AMD CPU families. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Acked-by: Keir Fraser <keir@xxxxxxx> xen-unstable changeset: 24417:1452fb248cd5 xen-unstable date: Fri Dec 16 15:45:40 2011 +0100 --- diff -r 35ee60fe531f -r 26bf0e10596e tools/tests/x86_emulate.c --- a/tools/tests/x86_emulate.c Wed Mar 07 09:04:11 2012 +0000 +++ b/tools/tests/x86_emulate.c Wed Mar 07 09:05:20 2012 +0000 @@ -3,5 +3,7 @@ #include <string.h> #include <public/xen.h> +#define cpu_has_amd_erratum(nr) 0 + #include "x86_emulate/x86_emulate.h" #include "x86_emulate/x86_emulate.c" diff -r 35ee60fe531f -r 26bf0e10596e xen/arch/x86/x86_emulate.c --- a/xen/arch/x86/x86_emulate.c Wed Mar 07 09:04:11 2012 +0000 +++ b/xen/arch/x86/x86_emulate.c Wed Mar 07 09:05:20 2012 +0000 @@ -10,8 +10,15 @@ */ #include <asm/x86_emulate.h> +#include <asm/processor.h> /* current_cpu_info */ +#include <asm/amd.h> /* cpu_has_amd_erratum() */ /* Avoid namespace pollution. */ #undef cmpxchg +#undef cpuid +#undef wbinvd + +#define cpu_has_amd_erratum(nr) \ + cpu_has_amd_erratum(¤t_cpu_data, AMD_ERRATUM_##nr) #include "x86_emulate/x86_emulate.c" diff -r 35ee60fe531f -r 26bf0e10596e xen/arch/x86/x86_emulate/x86_emulate.c --- a/xen/arch/x86/x86_emulate/x86_emulate.c Wed Mar 07 09:04:11 2012 +0000 +++ b/xen/arch/x86/x86_emulate/x86_emulate.c Wed Mar 07 09:05:20 2012 +0000 @@ -2578,6 +2578,9 @@ case 0xd9: /* FPU 0xd9 */ switch ( modrm ) { + case 0xfb: /* fsincos */ + fail_if(cpu_has_amd_erratum(573)); + /* fall through */ case 0xc0 ... 0xc7: /* fld %stN */ case 0xc8 ... 0xcf: /* fxch %stN */ case 0xd0: /* fnop */ @@ -2603,7 +2606,6 @@ case 0xf8: /* fprem */ case 0xf9: /* fyl2xp1 */ case 0xfa: /* fsqrt */ - case 0xfb: /* fsincos */ case 0xfc: /* frndint */ case 0xfd: /* fscale */ case 0xfe: /* fsin */ diff -r 35ee60fe531f -r 26bf0e10596e xen/include/asm-x86/amd.h --- a/xen/include/asm-x86/amd.h Wed Mar 07 09:04:11 2012 +0000 +++ b/xen/include/asm-x86/amd.h Wed Mar 07 09:05:20 2012 +0000 @@ -134,5 +134,11 @@ AMD_OSVW_ERRATUM(3, AMD_MODEL_RANGE(0x10, 0x2, 0x1, 0xff, 0xf), \ AMD_MODEL_RANGE(0x12, 0x0, 0x0, 0x1, 0x0)) +#define AMD_ERRATUM_573 \ + AMD_LEGACY_ERRATUM(AMD_MODEL_RANGE(0x0f, 0x0, 0x0, 0xff, 0xf), \ + AMD_MODEL_RANGE(0x10, 0x0, 0x0, 0xff, 0xf), \ + AMD_MODEL_RANGE(0x11, 0x0, 0x0, 0xff, 0xf), \ + AMD_MODEL_RANGE(0x12, 0x0, 0x0, 0xff, 0xf)) + int cpu_has_amd_erratum(const struct cpuinfo_x86 *, int, ...); #endif /* __AMD_H__ */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |