• Rick Edgecombe's avatar
    x86/fpu/xstate: Introduce CET MSR and XSAVES supervisor states · 8970ef02
    Rick Edgecombe authored
    Shadow stack register state can be managed with XSAVE. The registers
    can logically be separated into two groups:
            * Registers controlling user-mode operation
            * Registers controlling kernel-mode operation
    
    The architecture has two new XSAVE state components: one for each group
    of those groups of registers. This lets an OS manage them separately if
    it chooses. Future patches for host userspace and KVM guests will only
    utilize the user-mode registers, so only configure XSAVE to save
    user-mode registers. This state will add 16 bytes to the xsave buffer
    size.
    
    Future patches will use the user-mode XSAVE area to save guest user-mode
    CET state. However, VMCS includes new fields for guest CET supervisor
    states. KVM can use these to save and restore guest supervisor state, so
    host supervisor XSAVE support is not required.
    
    Adding this exacerbates the already unwieldy if statement in
    check_xstate_against_struct() that handles warning about unimplemented
    xfeatures. So refactor these check's by having XCHECK_SZ() set a bool when
    it actually check's the xfeature. This ends up exceeding 80 chars, but was
    better on balance than other options explored. Pass the bool as pointer to
    make it clear that XCHECK_SZ() can change the variable.
    
    While configuring user-mode XSAVE, clarify kernel-mode registers are not
    managed by XSAVE by defining the xfeature in
    XFEATURE_MASK_SUPERVISOR_UNSUPPORTED, like is done for XFEATURE_MASK_PT.
    This serves more of a documentation as code purpose, and functionally,
    only enables a few safety checks.
    
    Both XSAVE state components are supervisor states, even the state
    controlling user-mode operation. This is a departure from earlier features
    like protection keys where the PKRU state is a normal user
    (non-supervisor) state. Having the user state be supervisor-managed
    ensures there is no direct, unprivileged access to it, making it harder
    for an attacker to subvert CET.
    
    To facilitate this privileged access, define the two user-mode CET MSRs,
    and the bits defined in those MSRs relevant to future shadow stack
    enablement patches.
    Co-developed-by: default avatarYu-cheng Yu <yu-cheng.yu@intel.com>
    Signed-off-by: default avatarYu-cheng Yu <yu-cheng.yu@intel.com>
    Signed-off-by: default avatarRick Edgecombe <rick.p.edgecombe@intel.com>
    Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
    Reviewed-by: default avatarKees Cook <keescook@chromium.org>
    Acked-by: default avatarMike Rapoport (IBM) <rppt@kernel.org>
    Tested-by: default avatarPengfei Xu <pengfei.xu@intel.com>
    Tested-by: default avatarJohn Allen <john.allen@amd.com>
    Tested-by: default avatarKees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/all/20230613001108.3040476-25-rick.p.edgecombe%40intel.com
    8970ef02
xstate.c 50.7 KB