From: Ștefan Șicleru <ssicleru@xxxxxxxxxxxxxxx> This function returns the EPT view of the current vCPU or 0 if the hardware support is missing. Signed-off-by: Ștefan Șicleru <ssicleru@xxxxxxxxxxxxxxx> Signed-off-by: Adalbert Lazăr <alazar@xxxxxxxxxxxxxxx> --- arch/x86/include/asm/kvm_host.h | 3 +++ arch/x86/kvm/vmx/vmx.c | 8 ++++++++ arch/x86/kvm/vmx/vmx.h | 3 +++ arch/x86/kvm/x86.c | 10 ++++++++++ 4 files changed, 24 insertions(+) diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h index 5eb26135e81b..0acc21087caf 100644 --- a/arch/x86/include/asm/kvm_host.h +++ b/arch/x86/include/asm/kvm_host.h @@ -1302,6 +1302,7 @@ struct kvm_x86_ops { void (*control_singlestep)(struct kvm_vcpu *vcpu, bool enable); bool (*get_vmfunc_status)(void); bool (*get_eptp_switching_status)(void); + u16 (*get_ept_view)(struct kvm_vcpu *vcpu); }; struct kvm_x86_nested_ops { @@ -1773,4 +1774,6 @@ static inline int kvm_cpu_get_apicid(int mps_cpu) #define GET_SMSTATE(type, buf, offset) \ (*(type *)((buf) + (offset) - 0x7e00)) +u16 kvm_get_ept_view(struct kvm_vcpu *vcpu); + #endif /* _ASM_X86_KVM_HOST_H */ diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c index ccbf561b0fc4..0256c3a93c87 100644 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@ -8002,6 +8002,13 @@ static bool vmx_get_eptp_switching_status(void) return kvm_eptp_switching_supported; } +static u16 vmx_get_ept_view(struct kvm_vcpu *vcpu) +{ + const struct vcpu_vmx *vmx = to_vmx(vcpu); + + return vmx->view; +} + static struct kvm_x86_ops vmx_x86_ops __initdata = { .hardware_unsetup = hardware_unsetup, @@ -8145,6 +8152,7 @@ static struct kvm_x86_ops vmx_x86_ops __initdata = { .control_singlestep = vmx_control_singlestep, .get_vmfunc_status = vmx_get_vmfunc_status, .get_eptp_switching_status = vmx_get_eptp_switching_status, + .get_ept_view = vmx_get_ept_view, }; static __init int hardware_setup(void) diff --git a/arch/x86/kvm/vmx/vmx.h b/arch/x86/kvm/vmx/vmx.h index aa0c7ffd588b..14f0b9102d58 100644 --- a/arch/x86/kvm/vmx/vmx.h +++ b/arch/x86/kvm/vmx/vmx.h @@ -296,6 +296,9 @@ struct vcpu_vmx { u64 ept_pointer; struct pt_desc pt_desc; + + /* The view this vcpu operates on. */ + u16 view; }; enum ept_pointers_status { diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index b16b018c74cc..2e2c56a37bdb 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -10869,6 +10869,16 @@ u64 kvm_spec_ctrl_valid_bits(struct kvm_vcpu *vcpu) } EXPORT_SYMBOL_GPL(kvm_spec_ctrl_valid_bits); +u16 kvm_get_ept_view(struct kvm_vcpu *vcpu) +{ + if (!kvm_x86_ops.get_ept_view) + return 0; + + return kvm_x86_ops.get_ept_view(vcpu); +} +EXPORT_SYMBOL_GPL(kvm_get_ept_view); + + EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_exit); EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_fast_mmio); EXPORT_TRACEPOINT_SYMBOL_GPL(kvm_inj_virq);