From mboxrd@z Thu Jan 1 00:00:00 1970 From: Keir Fraser Subject: Re: [PATCH] x86/emulator: workaround for AMD erratum 573 Date: Thu, 15 Dec 2011 16:53:03 +0000 Message-ID: References: <4EEA01350200007800068241@nat28.tlf.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <4EEA01350200007800068241@nat28.tlf.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Jan Beulich , "xen-devel@lists.xensource.com" List-Id: xen-devel@lists.xenproject.org On 15/12/2011 13:16, "Jan Beulich" 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 Acked-by: Keir Fraser > --- 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 > +#include /* current_cpu_info */ > +#include /* 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@lists.xensource.com > http://lists.xensource.com/xen-devel