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:
Andrew Cooper authored and Jan Beulich committed 2018-07-30 12:09:46 +02:00
1 parent e343ee80be
commit c117d09fe3
1 file changed
+23 -3
+23 -3
View File
@@ -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;
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.