Message ID | 20240520175925.1217334-8-seanjc@google.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | x86/cpu: KVM: Clean up PAT and VMX macros | expand |
On 21/05/2024 5:59 am, Sean Christopherson wrote: > Add a helper to encode the VMCS revision, size, and supported memory types > in MSR_IA32_VMX_BASIC, i.e. when synthesizing KVM's supported BASIC MSR > value, and delete the now unused VMCS size and memtype shift macros. > > For a variety of reasons, KVM has shifted (pun intended) to using helpers > to *get* information from the VMX MSRs, as opposed to defined MASK and > SHIFT macros for direct use. Provide a similar helper for the nested VMX > code, which needs to *set* information, so that KVM isn't left with a mix > of SHIFT macros and dedicated helpers. > > Reported-by: Xiaoyao Li <xiaoyao.li@intel.com> > Signed-off-by: Sean Christopherson <seanjc@google.com> > --- Reviewed-by: Kai Huang <kai.huang@intel.com>
On 5/21/2024 1:59 AM, Sean Christopherson wrote: > Add a helper to encode the VMCS revision, size, and supported memory types > in MSR_IA32_VMX_BASIC, i.e. when synthesizing KVM's supported BASIC MSR > value, and delete the now unused VMCS size and memtype shift macros. > > For a variety of reasons, KVM has shifted (pun intended) to using helpers > to *get* information from the VMX MSRs, as opposed to defined MASK and > SHIFT macros for direct use. Provide a similar helper for the nested VMX > code, which needs to *set* information, so that KVM isn't left with a mix > of SHIFT macros and dedicated helpers. > > Reported-by: Xiaoyao Li <xiaoyao.li@intel.com> > Signed-off-by: Sean Christopherson <seanjc@google.com> Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com> > --- > arch/x86/include/asm/vmx.h | 7 +++++-- > arch/x86/kvm/vmx/nested.c | 8 +++----- > 2 files changed, 8 insertions(+), 7 deletions(-) > > diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h > index 90963b14afaa..65aaf0577265 100644 > --- a/arch/x86/include/asm/vmx.h > +++ b/arch/x86/include/asm/vmx.h > @@ -135,10 +135,8 @@ > #define VMX_VMFUNC_EPTP_SWITCHING VMFUNC_CONTROL_BIT(EPTP_SWITCHING) > #define VMFUNC_EPTP_ENTRIES 512 > > -#define VMX_BASIC_VMCS_SIZE_SHIFT 32 > #define VMX_BASIC_32BIT_PHYS_ADDR_ONLY BIT_ULL(48) > #define VMX_BASIC_DUAL_MONITOR_TREATMENT BIT_ULL(49) > -#define VMX_BASIC_MEM_TYPE_SHIFT 50 > #define VMX_BASIC_INOUT BIT_ULL(54) > #define VMX_BASIC_TRUE_CTLS BIT_ULL(55) > > @@ -157,6 +155,11 @@ static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic) > return (vmx_basic & GENMASK_ULL(53, 50)) >> 50; > } > > +static inline u64 vmx_basic_encode_vmcs_info(u32 revision, u16 size, u8 memtype) > +{ > + return revision | ((u64)size << 32) | ((u64)memtype << 50); > +} > + > static inline int vmx_misc_preemption_timer_rate(u64 vmx_misc) > { > return vmx_misc & VMX_MISC_PREEMPTION_TIMER_RATE_MASK; > diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c > index fbfd3c5cb541..d690fa720dcf 100644 > --- a/arch/x86/kvm/vmx/nested.c > +++ b/arch/x86/kvm/vmx/nested.c > @@ -7035,12 +7035,10 @@ static void nested_vmx_setup_basic(struct nested_vmx_msrs *msrs) > * guest, and the VMCS structure we give it - not about the > * VMX support of the underlying hardware. > */ > - msrs->basic = > - VMCS12_REVISION | > - VMX_BASIC_TRUE_CTLS | > - ((u64)VMCS12_SIZE << VMX_BASIC_VMCS_SIZE_SHIFT) | > - (X86_MEMTYPE_WB << VMX_BASIC_MEM_TYPE_SHIFT); > + msrs->basic = vmx_basic_encode_vmcs_info(VMCS12_REVISION, VMCS12_SIZE, > + X86_MEMTYPE_WB); > > + msrs->basic |= VMX_BASIC_TRUE_CTLS; > if (cpu_has_vmx_basic_inout()) > msrs->basic |= VMX_BASIC_INOUT; > }
diff --git a/arch/x86/include/asm/vmx.h b/arch/x86/include/asm/vmx.h index 90963b14afaa..65aaf0577265 100644 --- a/arch/x86/include/asm/vmx.h +++ b/arch/x86/include/asm/vmx.h @@ -135,10 +135,8 @@ #define VMX_VMFUNC_EPTP_SWITCHING VMFUNC_CONTROL_BIT(EPTP_SWITCHING) #define VMFUNC_EPTP_ENTRIES 512 -#define VMX_BASIC_VMCS_SIZE_SHIFT 32 #define VMX_BASIC_32BIT_PHYS_ADDR_ONLY BIT_ULL(48) #define VMX_BASIC_DUAL_MONITOR_TREATMENT BIT_ULL(49) -#define VMX_BASIC_MEM_TYPE_SHIFT 50 #define VMX_BASIC_INOUT BIT_ULL(54) #define VMX_BASIC_TRUE_CTLS BIT_ULL(55) @@ -157,6 +155,11 @@ static inline u32 vmx_basic_vmcs_mem_type(u64 vmx_basic) return (vmx_basic & GENMASK_ULL(53, 50)) >> 50; } +static inline u64 vmx_basic_encode_vmcs_info(u32 revision, u16 size, u8 memtype) +{ + return revision | ((u64)size << 32) | ((u64)memtype << 50); +} + static inline int vmx_misc_preemption_timer_rate(u64 vmx_misc) { return vmx_misc & VMX_MISC_PREEMPTION_TIMER_RATE_MASK; diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index fbfd3c5cb541..d690fa720dcf 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -7035,12 +7035,10 @@ static void nested_vmx_setup_basic(struct nested_vmx_msrs *msrs) * guest, and the VMCS structure we give it - not about the * VMX support of the underlying hardware. */ - msrs->basic = - VMCS12_REVISION | - VMX_BASIC_TRUE_CTLS | - ((u64)VMCS12_SIZE << VMX_BASIC_VMCS_SIZE_SHIFT) | - (X86_MEMTYPE_WB << VMX_BASIC_MEM_TYPE_SHIFT); + msrs->basic = vmx_basic_encode_vmcs_info(VMCS12_REVISION, VMCS12_SIZE, + X86_MEMTYPE_WB); + msrs->basic |= VMX_BASIC_TRUE_CTLS; if (cpu_has_vmx_basic_inout()) msrs->basic |= VMX_BASIC_INOUT; }
Add a helper to encode the VMCS revision, size, and supported memory types in MSR_IA32_VMX_BASIC, i.e. when synthesizing KVM's supported BASIC MSR value, and delete the now unused VMCS size and memtype shift macros. For a variety of reasons, KVM has shifted (pun intended) to using helpers to *get* information from the VMX MSRs, as opposed to defined MASK and SHIFT macros for direct use. Provide a similar helper for the nested VMX code, which needs to *set* information, so that KVM isn't left with a mix of SHIFT macros and dedicated helpers. Reported-by: Xiaoyao Li <xiaoyao.li@intel.com> Signed-off-by: Sean Christopherson <seanjc@google.com> --- arch/x86/include/asm/vmx.h | 7 +++++-- arch/x86/kvm/vmx/nested.c | 8 +++----- 2 files changed, 8 insertions(+), 7 deletions(-)