[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86/emulator: workaround for AMD erratum 573
On 15/12/2011 13:16, "Jan Beulich" <JBeulich@xxxxxxxx> wrote: > 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> > --- a/tools/tests/x86_emulator/x86_emulate.c > +++ b/tools/tests/x86_emulator/x86_emulate.c > @@ -9,5 +9,7 @@ typedef bool bool_t; > > #define BUG() abort() > > +#define cpu_has_amd_erratum(nr) 0 > + > #include "x86_emulate/x86_emulate.h" > #include "x86_emulate/x86_emulate.c" > --- a/xen/arch/x86/x86_emulate.c > +++ b/xen/arch/x86/x86_emulate.c > @@ -10,8 +10,14 @@ > */ > > #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 > + > +#define cpu_has_amd_erratum(nr) \ > + cpu_has_amd_erratum(¤t_cpu_data, AMD_ERRATUM_##nr) > > #include "x86_emulate/x86_emulate.c" > --- a/xen/arch/x86/x86_emulate/x86_emulate.c > +++ b/xen/arch/x86/x86_emulate/x86_emulate.c > @@ -2761,6 +2761,9 @@ x86_emulate( > 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 */ > @@ -2786,7 +2789,6 @@ x86_emulate( > case 0xf8: /* fprem */ > case 0xf9: /* fyl2xp1 */ > case 0xfa: /* fsqrt */ > - case 0xfb: /* fsincos */ > case 0xfc: /* frndint */ > case 0xfd: /* fscale */ > case 0xfe: /* fsin */ > --- a/xen/include/asm-x86/amd.h > +++ b/xen/include/asm-x86/amd.h > @@ -134,6 +134,12 @@ > 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)) > + > struct cpuinfo_x86; > int cpu_has_amd_erratum(const struct cpuinfo_x86 *, int, ...); > > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxxxxxxxx > http://lists.xensource.com/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |