diff options
author | Liu, Jinsong <jinsong.liu@intel.com> | 2012-09-26 12:05:55 +0200 |
---|---|---|
committer | Liu, Jinsong <jinsong.liu@intel.com> | 2012-09-26 12:05:55 +0200 |
commit | 19b03acdd1cdb8a6c35a30079ae6d6fb72caa285 (patch) | |
tree | 734c7cb2e579c64fae4183bb4201eb9d98f01e2b /xen/arch/x86/domctl.c | |
parent | 513e591c04d9d4f9ffe9ec282daaba798c30c176 (diff) | |
download | xen-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.c | 24 |
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; |