Andy Lutomirski <luto@xxxxxxxxxx> writes: > On Fri, Mar 2, 2018 at 10:55 AM, Vitaly Kuznetsov <vkuznets@xxxxxxxxxx> wrote: >> vmx_save_host_state() is only called from kvm_arch_vcpu_ioctl_run() so >> the context is pretty well defined >> > > True. > >> and MSR_FS_BASE should always be >> equal to current->thread.fsbase. > > Not true. current->thread.fsbase is almost entirely undefined in this > context. What you *could* do is export save_fsgs() and call it first. > When FSGSBASE support lands (which will happen eventually!), the code > in your patch will be completely wrong. > > Admittedly, your patch isn't 100% bogus, but the reason is subtle and > you need lots of comments there *and* in save_fsgs(). Just to make sure I understand the reason, Currently, the only way for processes to change FS/GS base is to call ARCH_SET_FS/GS prctls and these reflect the changes they make in thread.fs/gsbase so *conceptually* reading them is OK now. Now there's so called X86_BUG_NULL_SEG: on Intel CPUs writing '0' to FS/GS selectors zeroes the base (and on AMDs it doesn't). save_fsgs() checks fs/gs selectors and adjusts thread.fs/gsbase accordingly. (de-facto no-issue for my patch as it only touches Intel's VMX but we don't want to rely on vendor, detect_null_seg_behavior() does real check of the behavior). Now FSGSBASE support comes to play. Userspace will start changing FS/GS base without kernel's intervention so we really need to do read if we want to figure out what's there. Luckily, reads are now cheaper thanks to new instructions. So what I think we need to do here is introduce "sync_process_fs_gs()" ('save_fsgs' now) api which we will call from both __switch_to() and KVM's vmx_save_host_state() before reading thread.fs/gsbase. -- Vitaly