Add vmcs_load_track/vmcs_clear_track to track vmcs load & clear which is prepared for the following VMPTRLD emulation. Use these track APIs for vmcs load/clear is necessary if pKVM want to get current_vmcs pointer for some case, for example, if pKVM handle nmi in the root mode, it may need tmp switch vmcs to host vcpu to inject nmi then switch back to current_vmcs. Signed-off-by: Chuanxiao Dong <chuanxiao.dong@xxxxxxxxx> Signed-off-by: Jason Chen CJ <jason.cj.chen@xxxxxxxxx> --- arch/x86/kvm/vmx/pkvm/hyp/vmx.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/arch/x86/kvm/vmx/pkvm/hyp/vmx.h b/arch/x86/kvm/vmx/pkvm/hyp/vmx.h index 35369cc3b646..54c17e256107 100644 --- a/arch/x86/kvm/vmx/pkvm/hyp/vmx.h +++ b/arch/x86/kvm/vmx/pkvm/hyp/vmx.h @@ -50,6 +50,27 @@ static inline void vmx_enable_irq_window(struct vcpu_vmx *vmx) exec_controls_setbit(vmx, CPU_BASED_INTR_WINDOW_EXITING); } +static inline void vmcs_load_track(struct vcpu_vmx *vmx, struct vmcs *vmcs) +{ + struct pkvm_host_vcpu *pkvm_host_vcpu = vmx_to_pkvm_hvcpu(vmx); + + pkvm_host_vcpu->current_vmcs = vmcs; + barrier(); + vmcs_load(vmcs); +} + +static inline void vmcs_clear_track(struct vcpu_vmx *vmx, struct vmcs *vmcs) +{ + struct pkvm_host_vcpu *pkvm_host_vcpu = vmx_to_pkvm_hvcpu(vmx); + + /* vmcs_clear might clear non-current vmcs */ + if (pkvm_host_vcpu->current_vmcs == vmcs) + pkvm_host_vcpu->current_vmcs = NULL; + + barrier(); + vmcs_clear(vmcs); +} + void pkvm_init_host_state_area(struct pkvm_pcpu *pcpu, int cpu); #endif -- 2.25.1