From: Chuanxiao Dong <chuanxiao.dong@xxxxxxxxx> Add API get_max_physaddr_bits(), this is necessary used to calculate the reserved bits for EPT entry. Signed-off-by: Chuanxiao Dong <chuanxiao.dong@xxxxxxxxx> --- arch/x86/kvm/vmx/pkvm/hyp/memory.c | 21 +++++++++++++++++++++ arch/x86/kvm/vmx/pkvm/hyp/memory.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/arch/x86/kvm/vmx/pkvm/hyp/memory.c b/arch/x86/kvm/vmx/pkvm/hyp/memory.c index 43fc39d44c3d..9a9616ac4cc3 100644 --- a/arch/x86/kvm/vmx/pkvm/hyp/memory.c +++ b/arch/x86/kvm/vmx/pkvm/hyp/memory.c @@ -10,9 +10,11 @@ #include "memory.h" #include "pgtable.h" #include "pkvm_hyp.h" +#include "cpu.h" unsigned long __page_base_offset; unsigned long __symbol_base_offset; +static u8 max_physaddr_bits; unsigned int hyp_memblock_nr; struct memblock_region hyp_memory[HYP_MEMBLOCK_REGIONS]; @@ -285,3 +287,22 @@ int write_gpa(struct kvm_vcpu *vcpu, gpa_t gpa, void *addr, unsigned int bytes) { return copy_gpa(vcpu, gpa, addr, bytes, false); } + +u64 get_max_physaddr_bits(void) +{ + u32 eax, ebx, ecx, edx; + + if (max_physaddr_bits) + return max_physaddr_bits; + + eax = 0x80000000; + ecx = 0; + native_cpuid(&eax, &ebx, &ecx, &edx); + if (eax >= 0x80000008) { + eax = 0x80000008; + native_cpuid(&eax, &ebx, &ecx, &edx); + max_physaddr_bits = (u8)eax & 0xff; + } + + return max_physaddr_bits; +} diff --git a/arch/x86/kvm/vmx/pkvm/hyp/memory.h b/arch/x86/kvm/vmx/pkvm/hyp/memory.h index a95ae5f71841..b1062f3703e3 100644 --- a/arch/x86/kvm/vmx/pkvm/hyp/memory.h +++ b/arch/x86/kvm/vmx/pkvm/hyp/memory.h @@ -32,4 +32,6 @@ int write_gva(struct kvm_vcpu *vcpu, gva_t gva, void *addr, int read_gpa(struct kvm_vcpu *vcpu, gpa_t gpa, void *addr, unsigned int bytes); int write_gpa(struct kvm_vcpu *vcpu, gpa_t gpa, void *addr, unsigned int bytes); +u64 get_max_physaddr_bits(void); + #endif -- 2.25.1