mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
[HVM] Save/restore: explicitly name MSRs in save format
Signed off by: Mats Petersson (Mats.Petersson@amd.com)
This commit is contained in:
1 parent
29438379b9
commit
bd25d1048e
3 files changed
+32
-29
No files matched your search
+13
-19
@@ -362,7 +362,7 @@ static inline void __restore_debug_registers(struct vcpu *v)
|
||||
}
|
||||
|
||||
|
||||
int svm_vmcs_save(struct vcpu *v, struct hvm_hw_cpu *c)
|
||||
int svm_vmcb_save(struct vcpu *v, struct hvm_hw_cpu *c)
|
||||
{
|
||||
struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
|
||||
|
||||
@@ -571,17 +571,14 @@ void svm_save_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
|
||||
{
|
||||
struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
|
||||
|
||||
data->shadow_gs = vmcb->kerngsbase;
|
||||
/* MSR_LSTAR, MSR_STAR, MSR_CSTAR, MSR_SYSCALL_MASK, MSR_EFER */
|
||||
data->msr_items[0] = vmcb->lstar;
|
||||
data->msr_items[1] = vmcb->star;
|
||||
data->msr_items[2] = vmcb->cstar;
|
||||
data->msr_items[3] = vmcb->sfmask;
|
||||
data->msr_items[4] = vmcb->efer;
|
||||
data->shadow_gs = vmcb->kerngsbase;
|
||||
data->msr_lstar = vmcb->lstar;
|
||||
data->msr_star = vmcb->star;
|
||||
data->msr_cstar = vmcb->cstar;
|
||||
data->msr_syscall_mask = vmcb->sfmask;
|
||||
data->msr_efer = vmcb->efer;
|
||||
|
||||
data->tsc = hvm_get_guest_time(v);
|
||||
|
||||
// dump_msr_state(guest_state);
|
||||
}
|
||||
|
||||
|
||||
@@ -590,22 +587,19 @@ void svm_load_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
|
||||
struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
|
||||
|
||||
vmcb->kerngsbase = data->shadow_gs;
|
||||
/* MSR_LSTAR, MSR_STAR, MSR_CSTAR, MSR_SYSCALL_MASK, MSR_EFER */
|
||||
vmcb->lstar = data->msr_items[0];
|
||||
vmcb->star = data->msr_items[1];
|
||||
vmcb->cstar = data->msr_items[2];
|
||||
vmcb->sfmask = data->msr_items[3];
|
||||
vmcb->efer = data->msr_items[4];
|
||||
vmcb->lstar = data->msr_lstar;
|
||||
vmcb->star = data->msr_star;
|
||||
vmcb->cstar = data->msr_cstar;
|
||||
vmcb->sfmask = data->msr_syscall_mask;
|
||||
vmcb->efer = data->msr_efer;
|
||||
|
||||
hvm_set_guest_time(v, data->tsc);
|
||||
|
||||
// dump_msr_state(guest_state);
|
||||
}
|
||||
|
||||
void svm_save_vmcb_ctxt(struct vcpu *v, struct hvm_hw_cpu *ctxt)
|
||||
{
|
||||
svm_save_cpu_state(v, ctxt);
|
||||
svm_vmcs_save(v, ctxt);
|
||||
svm_vmcb_save(v, ctxt);
|
||||
}
|
||||
|
||||
int svm_load_vmcb_ctxt(struct vcpu *v, struct hvm_hw_cpu *ctxt)
|
||||
|
||||
@@ -583,15 +583,17 @@ void vmx_save_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
|
||||
{
|
||||
struct vmx_msr_state *guest_state = &v->arch.hvm_vmx.msr_state;
|
||||
unsigned long guest_flags = guest_state->flags;
|
||||
int i = 0;
|
||||
|
||||
data->shadow_gs = guest_state->shadow_gs;
|
||||
|
||||
/* save msrs */
|
||||
data->flags = guest_flags;
|
||||
for (i = 0; i < VMX_MSR_COUNT; i++)
|
||||
data->msr_items[i] = guest_state->msrs[i];
|
||||
|
||||
data->msr_lstar = guest_state->msrs[VMX_INDEX_MSR_LSTAR];
|
||||
data->msr_star = guest_state->msrs[VMX_INDEX_MSR_STAR];
|
||||
data->msr_cstar = guest_state->msrs[VMX_INDEX_MSR_CSTAR];
|
||||
data->msr_syscall_mask = guest_state->msrs[VMX_INDEX_MSR_SYSCALL_MASK];
|
||||
data->msr_efer = guest_state->msrs[VMX_INDEX_MSR_EFER];
|
||||
|
||||
data->tsc = hvm_get_guest_time(v);
|
||||
|
||||
dump_msr_state(guest_state);
|
||||
@@ -599,13 +601,15 @@ void vmx_save_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
|
||||
|
||||
void vmx_load_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
|
||||
{
|
||||
int i = 0;
|
||||
struct vmx_msr_state *guest_state = &v->arch.hvm_vmx.msr_state;
|
||||
|
||||
/* restore msrs */
|
||||
guest_state->flags = data->flags;
|
||||
for (i = 0; i < VMX_MSR_COUNT; i++)
|
||||
guest_state->msrs[i] = data->msr_items[i];
|
||||
guest_state->msrs[VMX_INDEX_MSR_LSTAR] = data->msr_lstar;
|
||||
guest_state->msrs[VMX_INDEX_MSR_STAR] = data->msr_star;
|
||||
guest_state->msrs[VMX_INDEX_MSR_CSTAR] = data->msr_cstar;
|
||||
guest_state->msrs[VMX_INDEX_MSR_SYSCALL_MASK] = data->msr_syscall_mask;
|
||||
guest_state->msrs[VMX_INDEX_MSR_EFER] = data->msr_efer;
|
||||
|
||||
guest_state->shadow_gs = data->shadow_gs;
|
||||
|
||||
|
||||
@@ -140,10 +140,16 @@ struct hvm_hw_cpu {
|
||||
uint64_t sysenter_esp;
|
||||
uint64_t sysenter_eip;
|
||||
|
||||
/* MSRs */
|
||||
/* msr for em64t */
|
||||
uint64_t shadow_gs;
|
||||
uint64_t flags;
|
||||
uint64_t msr_items[6];
|
||||
|
||||
/* msr content saved/restored. */
|
||||
uint64_t msr_lstar;
|
||||
uint64_t msr_star;
|
||||
uint64_t msr_cstar;
|
||||
uint64_t msr_syscall_mask;
|
||||
uint64_t msr_efer;
|
||||
|
||||
/* guest's idea of what rdtsc() would return */
|
||||
uint64_t tsc;
|
||||
@@ -311,7 +317,6 @@ struct hvm_hw_pci_link {
|
||||
|
||||
DECLARE_HVM_SAVE_TYPE(PCI_LINK, 9, struct hvm_hw_pci_link);
|
||||
|
||||
|
||||
/*
|
||||
* PIT
|
||||
*/
|
||||
|
||||