Commit aa93b6f9 authored by Sean Christopherson's avatar Sean Christopherson
Browse files

KVM: x86: Use for-loop to iterate over XSTATE size entries

Rework xstate_required_size() to use a for-loop and continue, to make it
more obvious that the xstate_sizes[] lookups are indeed correctly bounded,
and to make it (hopefully) easier to understand that the loop is iterating
over supported XSAVE features.

Link: https://lore.kernel.org/r/20241211013302.1347853-3-seanjc@google.com


Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent a11128ce
Loading
Loading
Loading
Loading
+14 −15
Original line number Diff line number Diff line
@@ -58,25 +58,24 @@ void __init kvm_init_xstate_sizes(void)

u32 xstate_required_size(u64 xstate_bv, bool compacted)
{
	int feature_bit = 0;
	u32 ret = XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET;
	int i;

	xstate_bv &= XFEATURE_MASK_EXTEND;
	while (xstate_bv) {
		if (xstate_bv & 0x1) {
			struct cpuid_xstate_sizes *xs = &xstate_sizes[feature_bit];
	for (i = XFEATURE_YMM; i < ARRAY_SIZE(xstate_sizes) && xstate_bv; i++) {
		struct cpuid_xstate_sizes *xs = &xstate_sizes[i];
		u32 offset;

		if (!(xstate_bv & BIT_ULL(i)))
			continue;

		/* ECX[1]: 64B alignment in compacted form */
		if (compacted)
			offset = (xs->ecx & 0x2) ? ALIGN(ret, 64) : ret;
		else
			offset = xs->ebx;
		ret = max(ret, offset + xs->eax);
		}

		xstate_bv >>= 1;
		feature_bit++;
		xstate_bv &= ~BIT_ULL(i);
	}

	return ret;