mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86/xstate: Make errors in xstate calculations more obvious by crashing the domain
If xcr0_max exceeds xfeature_mask, then something is broken with the CPUID
policy derivation or auditing logic. If hardware rejects new_bv, then
something is broken with Xen's xstate logic.
In both cases, crash the domain with an obvious error message, to help
highlight the issues.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
master commit: d6371ccb93
master date: 2018-07-19 19:57:26 +0100
This commit is contained in:
1 parent
e343ee80be
commit
c117d09fe3
1 file changed
+23
-3
+23
-3
@@ -717,12 +717,32 @@ int handle_xsetbv(u32 index, u64 new_bv)
|
||||
if ( index != XCR_XFEATURE_ENABLED_MASK )
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if ( (new_bv & ~xcr0_max) ||
|
||||
(new_bv & ~xfeature_mask) || !valid_xcr0(new_bv) )
|
||||
/*
|
||||
* The CPUID logic shouldn't be able to hand out an XCR0 exceeding Xen's
|
||||
* maximum features, but keep the check for robustness.
|
||||
*/
|
||||
if ( unlikely(xcr0_max & ~xfeature_mask) )
|
||||
{
|
||||
gprintk(XENLOG_ERR,
|
||||
"xcr0_max %016" PRIx64 " exceeds hardware max %016" PRIx64 "\n",
|
||||
xcr0_max, xfeature_mask);
|
||||
domain_crash(curr->domain);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ( (new_bv & ~xcr0_max) || !valid_xcr0(new_bv) )
|
||||
return -EINVAL;
|
||||
|
||||
if ( !set_xcr0(new_bv) )
|
||||
/* By this point, new_bv really should be accepted by hardware. */
|
||||
if ( unlikely(!set_xcr0(new_bv)) )
|
||||
{
|
||||
gprintk(XENLOG_ERR, "new_bv %016" PRIx64 " rejected by hardware\n",
|
||||
new_bv);
|
||||
domain_crash(curr->domain);
|
||||
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
mask = new_bv & ~curr->arch.xcr0_accum;
|
||||
curr->arch.xcr0 = new_bv;
|
||||
|
||||