On 1/18/22 11:04 PM, Like Xu wrote: > Remove the XFEATURE_MASK_SSE bit as part of the XFEATURE_MASK_EXTEND > and opportunistically, move it into the context of its unique user KVM. Is this a problem for xstate_required_size()? The rules for the CPUID sub-functions <=1 are different than those for >1. Most importantly, 'eax' doesn't enumerate the size of the feature for the XFEATURE_SSE sub-leaf. I think XFEATURE_MASK_EXTEND was being used to avoid that oddity: > u32 xstate_required_size(u64 xstate_bv, bool compacted) > { > int feature_bit = 0; > u32 ret = XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET; > > xstate_bv &= XFEATURE_MASK_EXTEND; > while (xstate_bv) { > if (xstate_bv & 0x1) { > u32 eax, ebx, ecx, edx, offset; > cpuid_count(0xD, feature_bit, &eax, &ebx, &ecx, &edx); > /* ECX[1]: 64B alignment in compacted form */ > if (compacted) > offset = (ecx & 0x2) ? ALIGN(ret, 64) : ret; > else > offset = ebx; > ret = max(ret, offset + eax); > } > > xstate_bv >>= 1; > feature_bit++; > } > > return ret; > }