aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/cpu
diff options
context:
space:
mode:
authorLiu, Jinsong <jinsong.liu@intel.com>2012-09-26 12:05:55 +0200
committerLiu, Jinsong <jinsong.liu@intel.com>2012-09-26 12:05:55 +0200
commit19b03acdd1cdb8a6c35a30079ae6d6fb72caa285 (patch)
tree734c7cb2e579c64fae4183bb4201eb9d98f01e2b /xen/arch/x86/cpu
parent513e591c04d9d4f9ffe9ec282daaba798c30c176 (diff)
downloadxen-19b03acdd1cdb8a6c35a30079ae6d6fb72caa285.tar.gz
xen-19b03acdd1cdb8a6c35a30079ae6d6fb72caa285.tar.bz2
xen-19b03acdd1cdb8a6c35a30079ae6d6fb72caa285.zip
x86: vMCE save and restore
This patch provides vMCE save/restore when migration. 1. MCG_CAP is well-defined. However, considering future cap extension, we keep save/restore logic that Jan implement at c/s 24887; 2. MCi_CTL2 initialized by guestos when booting, so need save/restore otherwise guest would surprise; 3. Other MSRs do not need save/restore since they are either error- related and pointless to save/restore, or, unified among all vMCE platform; Signed-off-by: Liu, Jinsong <jinsong.liu@intel.com> - fix handling of partial data in XEN_DOMCTL_set_ext_vcpucontext - fix adjustment of xen_domctl_ext_vcpucontext Signed-off-by: Jan Beulich <jbeulich@suse.com> Committed-by: Jan Beulich <jbeulich@suse.com>
Diffstat (limited to 'xen/arch/x86/cpu')
-rw-r--r--xen/arch/x86/cpu/mcheck/vmce.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/xen/arch/x86/cpu/mcheck/vmce.c b/xen/arch/x86/cpu/mcheck/vmce.c
index 1432870e53..cc1d48f524 100644
--- a/xen/arch/x86/cpu/mcheck/vmce.c
+++ b/xen/arch/x86/cpu/mcheck/vmce.c
@@ -68,7 +68,7 @@ void vmce_init_vcpu(struct vcpu *v)
spin_lock_init(&v->arch.vmce.lock);
}
-int vmce_restore_vcpu(struct vcpu *v, uint64_t caps)
+int vmce_restore_vcpu(struct vcpu *v, const struct hvm_vmce_vcpu *ctxt)
{
unsigned long guest_mcg_cap;
@@ -77,16 +77,20 @@ int vmce_restore_vcpu(struct vcpu *v, uint64_t caps)
else
guest_mcg_cap = AMD_GUEST_MCG_CAP;
- if ( caps & ~guest_mcg_cap & ~MCG_CAP_COUNT & ~MCG_CTL_P )
+ if ( ctxt->caps & ~guest_mcg_cap & ~MCG_CAP_COUNT & ~MCG_CTL_P )
{
dprintk(XENLOG_G_ERR, "%s restore: unsupported MCA capabilities"
" %#" PRIx64 " for d%d:v%u (supported: %#Lx)\n",
- is_hvm_vcpu(v) ? "HVM" : "PV", caps, v->domain->domain_id,
- v->vcpu_id, guest_mcg_cap & ~MCG_CAP_COUNT);
+ is_hvm_vcpu(v) ? "HVM" : "PV", ctxt->caps,
+ v->domain->domain_id, v->vcpu_id,
+ guest_mcg_cap & ~MCG_CAP_COUNT);
return -EPERM;
}
- v->arch.vmce.mcg_cap = caps;
+ v->arch.vmce.mcg_cap = ctxt->caps;
+ v->arch.vmce.bank[0].mci_ctl2 = ctxt->mci_ctl2_bank0;
+ v->arch.vmce.bank[1].mci_ctl2 = ctxt->mci_ctl2_bank1;
+
return 0;
}
@@ -291,7 +295,9 @@ static int vmce_save_vcpu_ctxt(struct domain *d, hvm_domain_context_t *h)
for_each_vcpu( d, v ) {
struct hvm_vmce_vcpu ctxt = {
- .caps = v->arch.vmce.mcg_cap
+ .caps = v->arch.vmce.mcg_cap,
+ .mci_ctl2_bank0 = v->arch.vmce.bank[0].mci_ctl2,
+ .mci_ctl2_bank1 = v->arch.vmce.bank[1].mci_ctl2
};
err = hvm_save_entry(VMCE_VCPU, v->vcpu_id, h, &ctxt);
@@ -316,9 +322,9 @@ static int vmce_load_vcpu_ctxt(struct domain *d, hvm_domain_context_t *h)
err = -EINVAL;
}
else
- err = hvm_load_entry(VMCE_VCPU, h, &ctxt);
+ err = hvm_load_entry_zeroextend(VMCE_VCPU, h, &ctxt);
- return err ?: vmce_restore_vcpu(v, ctxt.caps);
+ return err ?: vmce_restore_vcpu(v, &ctxt);
}
HVM_REGISTER_SAVE_RESTORE(VMCE_VCPU, vmce_save_vcpu_ctxt,