KVM: nVMX: Add nested msr load/restore algorithm
PATCH v3 1/3 KVM: nVMX: Add nested msr load/restore algorithm
Several hypervisors need MSR auto load/restore feature. We read MSRs from VM-entry MSR load area which specified by L1, and load them via kvm_set_msr in the nested entry.
When nested exit occurs, we get MSRs via kvm_get_msr, writing them to L1`s MSR store area. After this, we read MSRs from VM-exit MSR load area, and load them via kvm_set_msr.
Signed-off-by Wincy Van <[email protected]>
--- arch/x86/include/uapi/asm/vmx.h | 5 +++ arch/x86/kvm/vmx.c | 68 +++++++++++++++++++++++++++++++++++++++++ arch/x86/kvm/x86.c | 1 + virt/kvm/kvm_main.c | 1 + 4 files changed, 75 insertions(+)
arch/x86/include/uapi/asm/vmx.h +5 -0
@@ -56,6 +56,7 @@#define EXIT_REASON_MSR_READ 31#define EXIT_REASON_MSR_WRITE 32#define EXIT_REASON_INVALID_STATE 33 +#define EXIT_REASON_MSR_LOAD_FAIL 34#define EXIT_REASON_MWAIT_INSTRUCTION 36#define EXIT_REASON_MONITOR_INSTRUCTION 39#define EXIT_REASON_PAUSE_INSTRUCTION 40
@@ -116,10 +117,14 @@ { EXIT_REASON_APIC_WRITE, "APIC_WRITE" }, \ { EXIT_REASON_EOI_INDUCED, "EOI_INDUCED" }, \ { EXIT_REASON_INVALID_STATE, "INVALID_STATE" }, \ + { EXIT_REASON_MSR_LOAD_FAIL, "MSR_LOAD_FAIL" }, \ { EXIT_REASON_INVD, "INVD" }, \ { EXIT_REASON_INVVPID, "INVVPID" }, \ { EXIT_REASON_INVPCID, "INVPCID" }, \ { EXIT_REASON_XSAVES, "XSAVES" }, \ { EXIT_REASON_XRSTORS, "XRSTORS" } +#define VMX_ABORT_SAVE_GUEST_MSR_FAIL 1 +#define VMX_ABORT_LOAD_HOST_MSR_FAIL 4 + #endif /* _UAPIVMX_H */
arch/x86/kvm/vmx.c +68 -0
80 lines not on this page · raw message
arch/x86/kvm/x86.c +1 -0
@@ -2324,6 +2324,7 @@ int kvm_get_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata) {return kvm_x86_ops->get_msr (vcpu, msr_index, pdata); } +EXPORT_SYMBOL_GPL (kvm_get_msr);static int get_msr_mtrr (struct kvm_vcpu *vcpu,u32 msr,u64 *pdata) {
virt/kvm/kvm_main.c +1 -0
@@ -1579,6 +1579,7 @@ int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data, }return 0 ; } +EXPORT_SYMBOL_GPL (kvm_write_guest);int kvm_gfn_to_hva_cache_init (struct kvm *kvm,struct gfn_to_hva_cache *ghc,gpa_t gpa,unsigned long len)
Signature · 1 line
2.0.4