On Wed, 2023-07-19 at 22:41 +0800, Binbin Wu wrote:Yes, to avoid calling guest_cpuid_has() in CR3 handling and instruction emulation paths.
Use the governed feature framework to track if Linear Address Masking (LAM)Better to explain why to use governed feature for LAM? Is it because there's
is "enabled", i.e. if LAM can be used by the guest. So that guest_can_use()
can be used to support LAM virtualization.
hot path(s) calling guest_cpuid_has()? Anyway some context of why can help
here.
Yes, but new version of kvm_governed_feature_check_and_set() of KVM-governed feature framework will check against kvm_cpu_cap_has() as well.
LAM modifies the checking that is applied to 64-bit linear addresses, allowingIf you want to use boot_cpu_has(), it's better to be done at your last patch to
software to use of the untranslated address bits for metadata and masks the
metadata bits before using them as linear addresses to access memory.
Signed-off-by: Binbin Wu <binbin.wu@xxxxxxxxxxxxxxx>
---
arch/x86/kvm/governed_features.h | 2 ++
arch/x86/kvm/vmx/vmx.c | 3 +++
2 files changed, 5 insertions(+)
diff --git a/arch/x86/kvm/governed_features.h b/arch/x86/kvm/governed_features.h
index 40ce8e6608cd..708578d60e6f 100644
--- a/arch/x86/kvm/governed_features.h
+++ b/arch/x86/kvm/governed_features.h
@@ -5,5 +5,7 @@ BUILD_BUG()
#define KVM_GOVERNED_X86_FEATURE(x) KVM_GOVERNED_FEATURE(X86_FEATURE_##x)
+KVM_GOVERNED_X86_FEATURE(LAM)
+
#undef KVM_GOVERNED_X86_FEATURE
#undef KVM_GOVERNED_FEATURE
diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c
index 0ecf4be2c6af..ae47303c88d7 100644
--- a/arch/x86/kvm/vmx/vmx.c
+++ b/arch/x86/kvm/vmx/vmx.c
@@ -7783,6 +7783,9 @@ static void vmx_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
vmx->msr_ia32_feature_control_valid_bits &=
~FEAT_CTL_SGX_LC_ENABLED;
+ if (boot_cpu_has(X86_FEATURE_LAM))
+ kvm_governed_feature_check_and_set(vcpu, X86_FEATURE_LAM);
+
only set the cap bit when boot_cpu_has() is true, I suppose.
/* Refresh #PF interception to account for MAXPHYADDR changes. */
vmx_update_exception_bitmap(vcpu);
}