aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2013-06-04 09:41:41 +0200
committerJan Beulich <jbeulich@suse.com>2013-06-04 09:41:41 +0200
commit13e00caf1a01a4eb99f2269be6ce12a3a4703178 (patch)
tree5ed8a36973f105cf37fc0a0b543367e0b29ffdae
parent5849504a03725f553195c8d80b0d595ef8334e2a (diff)
downloadxen-13e00caf1a01a4eb99f2269be6ce12a3a4703178.tar.gz
xen-13e00caf1a01a4eb99f2269be6ce12a3a4703178.tar.bz2
xen-13e00caf1a01a4eb99f2269be6ce12a3a4703178.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> master commit: 365c95f7de789e1dca03f119eab7dc61fe0f77c9 master date: 2013-06-04 09:29:07 +0200
-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 7e4e6b69ea..f69ca0b549 100644
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -2192,6 +2192,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);