tools/libxc: Correct use of X86_XSS_MASK in guest xstate generation
authorAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 19 Apr 2016 17:27:05 +0000 (18:27 +0100)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Wed, 20 Apr 2016 13:48:23 +0000 (14:48 +0100)
c/s 75f9455e "tools/libxc: Calculate xstate cpuid leaf from guest information"
incorrectly inverted the shift and mask when using X86_XSS_MASK.  Luckily, the
mask is currently zero, avoiding incorrect calculations.

While adjusting this, use an explcit uint32_t cast rather than masking against
0xffffffff.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Wei Liu <wei.liu2@citrix.com>
Release-acked-by: Wei Liu <wei.liu2@citrix.com>
tools/libxc/xc_cpuid_x86.c

index 6d14904c170615115c286c50a7d2695c03e22d23..84f4e0810b99b1bc184ee1b5380c5af581410212 100644 (file)
@@ -460,7 +460,7 @@ static void xc_cpuid_config_xsave(xc_interface *xch,
     {
     case 0:
         /* EAX: low 32bits of xfeature_enabled_mask */
-        regs[0] = guest_xfeature_mask & 0xFFFFFFFF;
+        regs[0] = (uint32_t)guest_xfeature_mask;
         /* EDX: high 32bits of xfeature_enabled_mask */
         regs[3] = guest_xfeature_mask >> 32;
         /* ECX: max size required by all HW features */
@@ -487,8 +487,8 @@ static void xc_cpuid_config_xsave(xc_interface *xch,
 
         if ( test_bit(X86_FEATURE_XSAVES, info->featureset) )
         {
-            regs[2] = guest_xfeature_mask & X86_XSS_MASK & 0xFFFFFFFF;
-            regs[3] = (guest_xfeature_mask >> 32) & X86_XSS_MASK;
+            regs[2] = (uint32_t)(guest_xfeature_mask & X86_XSS_MASK);
+            regs[3] = (guest_xfeature_mask & X86_XSS_MASK) >> 32;
         }
         else
             regs[2] = regs[3] = 0;