Implement the hsave MSR, that gives the VCPU a GPA to save the
old guest state in.

v2 allows userspace to save/restore hsave

Signed-off-by: Alexander Graf <[EMAIL PROTECTED]>
---
 arch/x86/kvm/kvm_svm.h |    2 ++
 arch/x86/kvm/svm.c     |    7 +++++++
 2 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/arch/x86/kvm/kvm_svm.h b/arch/x86/kvm/kvm_svm.h
index 65ef0fc..76ad107 100644
--- a/arch/x86/kvm/kvm_svm.h
+++ b/arch/x86/kvm/kvm_svm.h
@@ -41,6 +41,8 @@ struct vcpu_svm {
        unsigned long host_dr7;
 
        u32 *msrpm;
+
+       u64 nested_hsave;
 };
 
 #endif
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 469ecc5..987d06c 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -613,6 +613,7 @@ static void init_vmcb(struct vcpu_svm *svm)
        }
        force_new_asid(&svm->vcpu);
 
+       svm->nested_hsave = 0;
        svm->vcpu.arch.hflags = HF_GIF_MASK;
 }
 
@@ -1363,6 +1364,9 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, unsigned 
ecx, u64 *data)
        case MSR_IA32_LASTINTTOIP:
                *data = svm->vmcb->save.last_excp_to;
                break;
+       case MSR_VM_HSAVE_PA:
+               *data = svm->nested_hsave;
+               break;
        default:
                return kvm_get_msr_common(vcpu, ecx, data);
        }
@@ -1457,6 +1461,9 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, unsigned 
ecx, u64 data)
                pr_unimpl(vcpu, "unimplemented perfctr wrmsr: 0x%x data 
0x%llx\n", ecx, data);
 
                break;
+       case MSR_VM_HSAVE_PA:
+               svm->nested_hsave = data;
+               break;
        default:
                return kvm_set_msr_common(vcpu, ecx, data);
        }
-- 
1.5.6

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to