x86/kvm: Avoid looking up PKRU in XSAVE buffer
[linux-2.6-microblaze.git] / arch / x86 / kvm / x86.c
index e0f4a46..c25bf24 100644 (file)
@@ -4604,20 +4604,21 @@ static void fill_xsave(u8 *dest, struct kvm_vcpu *vcpu)
         */
        valid = xstate_bv & ~XFEATURE_MASK_FPSSE;
        while (valid) {
+               u32 size, offset, ecx, edx;
                u64 xfeature_mask = valid & -valid;
                int xfeature_nr = fls64(xfeature_mask) - 1;
-               void *src = get_xsave_addr(xsave, xfeature_nr);
-
-               if (src) {
-                       u32 size, offset, ecx, edx;
-                       cpuid_count(XSTATE_CPUID, xfeature_nr,
-                                   &size, &offset, &ecx, &edx);
-                       if (xfeature_nr == XFEATURE_PKRU)
-                               memcpy(dest + offset, &vcpu->arch.pkru,
-                                      sizeof(vcpu->arch.pkru));
-                       else
-                               memcpy(dest + offset, src, size);
+               void *src;
+
+               cpuid_count(XSTATE_CPUID, xfeature_nr,
+                           &size, &offset, &ecx, &edx);
 
+               if (xfeature_nr == XFEATURE_PKRU) {
+                       memcpy(dest + offset, &vcpu->arch.pkru,
+                              sizeof(vcpu->arch.pkru));
+               } else {
+                       src = get_xsave_addr(xsave, xfeature_nr);
+                       if (src)
+                               memcpy(dest + offset, src, size);
                }
 
                valid -= xfeature_mask;
@@ -4647,18 +4648,20 @@ static void load_xsave(struct kvm_vcpu *vcpu, u8 *src)
         */
        valid = xstate_bv & ~XFEATURE_MASK_FPSSE;
        while (valid) {
+               u32 size, offset, ecx, edx;
                u64 xfeature_mask = valid & -valid;
                int xfeature_nr = fls64(xfeature_mask) - 1;
-               void *dest = get_xsave_addr(xsave, xfeature_nr);
-
-               if (dest) {
-                       u32 size, offset, ecx, edx;
-                       cpuid_count(XSTATE_CPUID, xfeature_nr,
-                                   &size, &offset, &ecx, &edx);
-                       if (xfeature_nr == XFEATURE_PKRU)
-                               memcpy(&vcpu->arch.pkru, src + offset,
-                                      sizeof(vcpu->arch.pkru));
-                       else
+
+               cpuid_count(XSTATE_CPUID, xfeature_nr,
+                           &size, &offset, &ecx, &edx);
+
+               if (xfeature_nr == XFEATURE_PKRU) {
+                       memcpy(&vcpu->arch.pkru, src + offset,
+                              sizeof(vcpu->arch.pkru));
+               } else {
+                       void *dest = get_xsave_addr(xsave, xfeature_nr);
+
+                       if (dest)
                                memcpy(dest, src + offset, size);
                }