]> xenbits.xensource.com Git - xen.git/commitdiff
x86/xstate: reset cached register values on resume
authorMarek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
Fri, 19 Nov 2021 08:40:44 +0000 (09:40 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 19 Nov 2021 08:40:44 +0000 (09:40 +0100)
set_xcr0() and set_msr_xss() use cached value to avoid setting the
register to the same value over and over. But suspend/resume implicitly
reset the registers and since percpu areas are not deallocated on
suspend anymore, the cache gets stale.
Reset the cache on resume, to ensure the next write will really hit the
hardware. Choose value 0, as it will never be a legitimate write to
those registers - and so, will force write (and cache update).

Note the cache is used io get_xcr0() and get_msr_xss() too, but:
- set_xcr0() is called few lines below in xstate_init(), so it will
  update the cache with appropriate value
- get_msr_xss() is not used anywhere - and thus not before any
  set_msr_xss() that will fill the cache

Fixes: aca2a985a55a "xen: don't free percpu areas during suspend"
Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
master commit: f7f4a523927fa4c7598e4647a16bc3e3cf8009d0
master date: 2021-11-04 14:42:37 +0100

xen/arch/x86/xstate.c

index 3794d9a5a54397fb14d20cd1580b5c5b85c63c17..3bcc523f804729d3f12b74646e5c230b9257a5a1 100644 (file)
@@ -608,6 +608,13 @@ void xstate_init(struct cpuinfo_x86 *c)
         return;
     }
 
+    /*
+     * Zap the cached values to make set_xcr0() and set_msr_xss() really
+     * write it.
+     */
+    this_cpu(xcr0) = 0;
+    this_cpu(xss) = ~0;
+
     cpuid_count(XSTATE_CPUID, 0, &eax, &ebx, &ecx, &edx);
 
     BUG_ON((eax & XSTATE_FP_SSE) != XSTATE_FP_SSE);