[PATCH 5/9] Implement hsave v2

Alexander Graf
2008-09-05T07:51:27Z

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 <agraf@suse.de>
---
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 fe42916..48f6d88 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;
}

@@ -1359,6 +1360,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);
}
@@ -1453,6 +1457,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