aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/domctl.c
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/domctl.c
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/domctl.c')
-rw-r--r--xen/arch/x86/domctl.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
index cb51252ac5..24b317884e 100644
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -1066,12 +1066,14 @@ long arch_do_domctl(
evc->syscall32_callback_eip = 0;
evc->syscall32_disables_events = 0;
}
- evc->mcg_cap = v->arch.vmce.mcg_cap;
+ evc->vmce.caps = v->arch.vmce.mcg_cap;
+ evc->vmce.mci_ctl2_bank0 = v->arch.vmce.bank[0].mci_ctl2;
+ evc->vmce.mci_ctl2_bank1 = v->arch.vmce.bank[1].mci_ctl2;
}
else
{
ret = -EINVAL;
- if ( evc->size < offsetof(typeof(*evc), mcg_cap) )
+ if ( evc->size < offsetof(typeof(*evc), vmce) )
goto ext_vcpucontext_out;
if ( !is_hvm_domain(d) )
{
@@ -1101,9 +1103,21 @@ long arch_do_domctl(
evc->syscall32_callback_eip )
goto ext_vcpucontext_out;
- if ( evc->size >= offsetof(typeof(*evc), mcg_cap) +
- sizeof(evc->mcg_cap) )
- ret = vmce_restore_vcpu(v, evc->mcg_cap);
+ BUILD_BUG_ON(offsetof(struct xen_domctl_ext_vcpucontext,
+ mcg_cap) !=
+ offsetof(struct xen_domctl_ext_vcpucontext,
+ vmce.caps));
+ BUILD_BUG_ON(sizeof(evc->mcg_cap) != sizeof(evc->vmce.caps));
+ if ( evc->size >= offsetof(typeof(*evc), vmce) +
+ sizeof(evc->vmce) )
+ ret = vmce_restore_vcpu(v, &evc->vmce);
+ else if ( evc->size >= offsetof(typeof(*evc), mcg_cap) +
+ sizeof(evc->mcg_cap) )
+ {
+ struct hvm_vmce_vcpu vmce = { .caps = evc->mcg_cap };
+
+ ret = vmce_restore_vcpu(v, &vmce);
+ }
}
ret = 0;