On 28.08.2025 17:04, Andrew Cooper wrote: > When FRED is active, hardware automatically swaps GS when changing privilege, > and the SWAPGS instruction is disallowed. > > For native OSes using GS as the thread local pointer this is a massive > improvement on the pre-FRED architecture, but under Xen it makes handling PV > guests more complicated. Specifically, it means that GS_BASE and GS_SHADOW > are the opposite way around in FRED mode, as opposed to IDT mode. > > This leads to the following changes: > > * In load_segments(), we have to load both GSes. Account for this in the > SWAP() condition and avoid the path with SWAGS. > > * In save_segments(), we need to read GS_KERN rather than GS_BASE.
GS_SHADOW in our terminology, that is. (Also again in code comments, and there's also a variable named gs_kern.) > * In toggle_guest_mode(), we need to emulate SWAPGS. > > * In do_set_segment_base(), merge the SEGBASE_GS_{USER,KERNEL} cases and > take FRED into account when choosing which base to update. > > SEGBASE_GS_USER_SEL was already an LKGS invocation (decades before FRED) > so under FRED needs to be a simple MOV %gs. Simply skip the SWAPGSes. > > Signed-off-by: Andrew Cooper <andrew.coop...@citrix.com> > --- > CC: Jan Beulich <jbeul...@suse.com> > CC: Roger Pau Monné <roger....@citrix.com> > > v2: > * New > > I think this functions, but it's not ideal. The conditions are asymmetric and > awkward. It's not as bad as I expect it to be after reading this remark. Preferably with the naming adjusted: Reviewed-by: Jan Beulich <jbeul...@suse.com> Jan