On Thu, Aug 03, 2023, Yang Weijiang wrote: > Add all CET MSRs including the synthesized GUEST_SSP to report list. > PL{0,1,2}_SSP are independent to host XSAVE management with later > patches. MSR_IA32_U_CET and MSR_IA32_PL3_SSP are XSAVE-managed on > host side. MSR_IA32_S_CET/MSR_IA32_INT_SSP_TAB/MSR_KVM_GUEST_SSP > are not XSAVE-managed. > > When CET IBT/SHSTK are enumerated to guest, both user and supervisor > modes should be supported for architechtural integrity, i.e., two > modes are supported as both or neither. > > Signed-off-by: Yang Weijiang <weijiang.yang@xxxxxxxxx> > --- > arch/x86/include/uapi/asm/kvm_para.h | 1 + > arch/x86/kvm/x86.c | 10 ++++++++++ > arch/x86/kvm/x86.h | 10 ++++++++++ > 3 files changed, 21 insertions(+) > > diff --git a/arch/x86/include/uapi/asm/kvm_para.h b/arch/x86/include/uapi/asm/kvm_para.h > index 6e64b27b2c1e..7af465e4e0bd 100644 > --- a/arch/x86/include/uapi/asm/kvm_para.h > +++ b/arch/x86/include/uapi/asm/kvm_para.h > @@ -58,6 +58,7 @@ > #define MSR_KVM_ASYNC_PF_INT 0x4b564d06 > #define MSR_KVM_ASYNC_PF_ACK 0x4b564d07 > #define MSR_KVM_MIGRATION_CONTROL 0x4b564d08 > +#define MSR_KVM_GUEST_SSP 0x4b564d09 > > struct kvm_steal_time { > __u64 steal; > diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c > index 82b9f14990da..d68ef87fe007 100644 > --- a/arch/x86/kvm/x86.c > +++ b/arch/x86/kvm/x86.c > @@ -1463,6 +1463,9 @@ static const u32 msrs_to_save_base[] = { > > MSR_IA32_XFD, MSR_IA32_XFD_ERR, > MSR_IA32_XSS, > + MSR_IA32_U_CET, MSR_IA32_S_CET, > + MSR_IA32_PL0_SSP, MSR_IA32_PL1_SSP, MSR_IA32_PL2_SSP, > + MSR_IA32_PL3_SSP, MSR_IA32_INT_SSP_TAB, MSR_KVM_GUEST_SSP, > }; > > static const u32 msrs_to_save_pmu[] = { > @@ -7214,6 +7217,13 @@ static void kvm_probe_msr_to_save(u32 msr_index) > if (!kvm_caps.supported_xss) > return; > break; > + case MSR_IA32_U_CET: > + case MSR_IA32_S_CET: > + case MSR_KVM_GUEST_SSP: > + case MSR_IA32_PL0_SSP ... MSR_IA32_INT_SSP_TAB: > + if (!kvm_is_cet_supported()) > + return; > + break; > default: > break; > } > diff --git a/arch/x86/kvm/x86.h b/arch/x86/kvm/x86.h > index 82e3dafc5453..6e6292915f8c 100644 > --- a/arch/x86/kvm/x86.h > +++ b/arch/x86/kvm/x86.h > @@ -362,6 +362,16 @@ static inline bool kvm_mpx_supported(void) > == (XFEATURE_MASK_BNDREGS | XFEATURE_MASK_BNDCSR); > } > > +#define CET_XSTATE_MASK (XFEATURE_MASK_CET_USER) This is funky. As of this patch, KVM reports MSR_IA32_S_CET, a supervisor MSR, but does not require XFEATURE_MASK_CET_KERNEL. That eventually comes along with "KVM:x86: Enable guest CET supervisor xstate bit support", but as of this patch KVM is busted. The whole cpuid_count() code in that patch shouldn't exist, so the easiest thing is to just fold the KVM_SUPPORTED_XSS and CET_XSTATE_MASK changes from that patch into this one.