diff mbox series

[v7,07/10] KVM: nVMX: Add a helper to encode VMCS info in MSR_IA32_VMX_BASIC

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

Commit Message

Sean Christopherson May 20, 2024, 5:59 p.m. UTC
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(-)

Comments

Kai Huang May 20, 2024, 11:16 p.m. UTC | #1
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>
Xiaoyao Li May 22, 2024, 6:54 a.m. UTC | #2
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 mbox series

Patch

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;
 }