]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: x86: Use for-loop to iterate over XSTATE size entries
authorSean Christopherson <seanjc@google.com>
Wed, 11 Dec 2024 01:32:59 +0000 (17:32 -0800)
committerSean Christopherson <seanjc@google.com>
Wed, 12 Feb 2025 18:16:30 +0000 (10:16 -0800)
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: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/cpuid.c

index 269ffbd5c2e0e0b0972a2842f35bffa5e182df4a..a57fa0123c773aededeb7c6a55ef0bc44d5a90db 100644 (file)
@@ -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];
-                       u32 offset;
-
-                       /* 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);
-               }
+       for (i = XFEATURE_YMM; i < ARRAY_SIZE(xstate_sizes) && xstate_bv; i++) {
+               struct cpuid_xstate_sizes *xs = &xstate_sizes[i];
+               u32 offset;
 
-               xstate_bv >>= 1;
-               feature_bit++;
+               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 &= ~BIT_ULL(i);
        }
 
        return ret;