xfeature
extern void fpstate_clear_xstate_component(struct fpstate *fpstate, unsigned int xfeature);
unsigned int zerofrom, i, xfeature;
xfeature = xfeature_uncompact_order[i];
if (zerofrom < xstate_offsets[xfeature])
membuf_zero(&to, xstate_offsets[xfeature] - zerofrom);
if (xfeature == XFEATURE_PKRU) {
__raw_xsave_addr(xsave, xfeature),
xstate_sizes[xfeature]);
zerofrom = xstate_offsets[xfeature] + xstate_sizes[xfeature];
void fpstate_clear_xstate_component(struct fpstate *fpstate, unsigned int xfeature)
void *addr = get_xsave_addr(&fpstate->regs.xsave, xfeature);
memset(addr, 0, xstate_sizes[xfeature]);
static unsigned int xfeature_get_offset(u64 xcomp_bv, int xfeature)
xfeature <= XFEATURE_SSE)
return xstate_offsets[xfeature];
if (i == xfeature)
static bool xfeature_enabled(enum xfeature xfeature)
return fpu_kernel_cfg.max_features & BIT_ULL(xfeature);
u32 eax, ebx, ecx, edx, xfeature, i = 0;
for_each_extended_xfeature(xfeature, fpu_kernel_cfg.max_features) {
cpuid_count(CPUID_LEAF_XSTATE, xfeature, &eax, &ebx, &ecx, &edx);
xstate_sizes[xfeature] = eax;
xstate_flags[xfeature] = ecx;
if (xfeature_is_supervisor(xfeature))
xstate_offsets[xfeature] = ebx;
xfeature_uncompact_order[i++] = xfeature;
void __vm_xsave_require_permission(uint64_t xfeature, const char *name);
#define vm_xsave_require_permission(xfeature) \
__vm_xsave_require_permission(xfeature, #xfeature)
void __vm_xsave_require_permission(uint64_t xfeature, const char *name)
TEST_ASSERT(is_power_of_2(xfeature),
__TEST_REQUIRE(bitmask & xfeature,
TEST_REQUIRE(!syscall(SYS_arch_prctl, ARCH_REQ_XCOMP_GUEST_PERM, ilog2(xfeature)));
TEST_ASSERT(bitmask & xfeature,
name, xfeature, bitmask);