Re: [PATCH 1/4] x86/fpu: Clear XSTATE_BV[i] in save state whenever XFD[i]=1

From: Paolo Bonzini

Date: Thu Jan 15 2026 - 13:26:28 EST


On 1/15/26 19:19, Dave Hansen wrote:
Is there anything preventing the kernel_fpu_begin() interrupt from
happening a little later, say:

XFD[18]=0
...
XFD[18]=1
# Interrupt (that does XSAVE)
XRSTOR (no #NM)

In that case, the XSAVE in kernel_fpu_begin() "operates as if XINUSE[i]
= 0" and would set XFEATURES[18]=0; it would save the component as being
in its init state. The later XRSTOR would obviously restore state 18 to
its init state.

Yes, absolutely, and the fact that the race window is so small is why this issue stayed undetected for years. In fact, consider that XFD becomes a pass-through MSR after the first write, at which point there's on race window at all---XFD[18] will be 1 if that's the guest value and the state will be destroyed.

I only mentioned SMIs as a way for this to happen on bare metal, i.e. without KVM involvement at all (though for dual-monitor treatment virtualization _is_ involved).

That's a long-winded way of saying I think I agree with the patch. It
destroys the state a bit more aggressively but it doesn't do anything _new_.

Thanks. :)

What would folks think about making the SDM language stronger, or at
least explicitly adding the language that setting XFD[i]=1 can lead to
XINUSE[i] going from 1=>0. Kinda like the language that's already in
"XRSTOR and the Init and Modified Optimizations", but specific to XFD:

If XFD[i] = 1 and XINUSE[i] = 1, state component i may be
tracked as init; XINUSE[i] may be set to 0.

That would make it consistent with the KVM behavior. It might also give
the CPU folks some additional wiggle room for new behavior.
Yes, absolutely. I think any other hypervisor may want to do the same, to avoid save/restores of tile data to when guest XFD[18]=1 (and to avoid unnecessary clearing of XFD, just for the sake of storing tile data that is most likely unused).

Paolo