aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2013-06-04 09:29:07 +0200
committerJan Beulich <jbeulich@suse.com>2013-06-04 09:29:07 +0200
commit365c95f7de789e1dca03f119eab7dc61fe0f77c9 (patch)
tree49b15e15658f7efdf5327e669ad1f0f1ba8393cd
parentc6ae65db36b98f2866f74a9a7ae6ac5d51fedc67 (diff)
downloadxen-365c95f7de789e1dca03f119eab7dc61fe0f77c9.tar.gz
xen-365c95f7de789e1dca03f119eab7dc61fe0f77c9.tar.bz2
xen-365c95f7de789e1dca03f119eab7dc61fe0f77c9.zip
x86/xsave: properly check guest input to XSETBV
Other than the HVM emulation path, the PV case so far failed to check that YMM state requires SSE state to be enabled, allowing for a #GP to occur upon passing the inputs to XSETBV inside the hypervisor. This is CVE-2013-2078 / XSA-54. Signed-off-by: Jan Beulich <jbeulich@suse.com>
-rw-r--r--xen/arch/x86/traps.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
index 087bbebf5f..ef964c3e39 100644
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -2205,6 +2205,11 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
if ( !(new_xfeature & XSTATE_FP) || (new_xfeature & ~xfeature_mask) )
goto fail;
+ /* YMM state takes SSE state as prerequisite. */
+ if ( (xfeature_mask & new_xfeature & XSTATE_YMM) &&
+ !(new_xfeature & XSTATE_SSE) )
+ goto fail;
+
v->arch.xcr0 = new_xfeature;
v->arch.xcr0_accum |= new_xfeature;
set_xcr0(new_xfeature);