>>> On 23.07.12 at 11:44, "Liu, Jinsong"
<jinsong.liu@intel.com> wrote:
> Xen/MCE: vMCE save and restore
>
> This patch provide 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>
I fail to see how the changes below are compatible with the
current (and hence SLE11 SP2) implementation.
Jan
> diff -r 9851ff6c446a tools/misc/xen-hvmctx.c
> --- a/tools/misc/xen-hvmctx.c Mon Jul 16 19:29:50 2012 +0800
> +++ b/tools/misc/xen-hvmctx.c Mon Jul 16 21:14:19 2012 +0800
> @@ -388,6 +388,8 @@
> HVM_SAVE_TYPE(VMCE_VCPU) p;
> READ(p);
> printf(" VMCE_VCPU: caps %" PRIx64 "\n",
p.caps);
> + printf(" VMCE_VCPU: bank0 mci_ctl2 %" PRIx64
"\n",
> p.mci_ctl2_bank0);
> + printf(" VMCE_VCPU: bank1 mci_ctl2 %" PRIx64
"\n",
> p.mci_ctl2_bank1);
> }
>
> int main(int argc, char **argv)
> diff -r 9851ff6c446a xen/arch/x86/cpu/mcheck/vmce.c
> --- a/xen/arch/x86/cpu/mcheck/vmce.c Mon Jul 16 19:29:50 2012 +0800
> +++ b/xen/arch/x86/cpu/mcheck/vmce.c Mon Jul 16 21:14:19 2012 +0800
> @@ -56,8 +56,10 @@
> spin_lock_init(&v->arch.vmce.lock);
> }
>
> -int vmce_restore_vcpu(struct vcpu *v, uint64_t caps)
> +int vmce_restore_vcpu(struct vcpu *v, struct hvm_vmce_vcpu *ctxt)
> {
> + uint64_t caps = ctxt->caps;
> +
> if ( caps & ~GUEST_MCG_CAP & ~MCG_CAP_COUNT & ~MCG_CTL_P )
> {
> dprintk(XENLOG_G_ERR, "%s restore: unsupported MCA
capabilities"
> @@ -68,6 +70,9 @@
> }
>
> v->arch.vmce.mcg_cap = 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;
> }
>
> @@ -308,7 +313,9 @@
>
> 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);
> @@ -335,7 +342,7 @@
> else
> err = hvm_load_entry(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,
> diff -r 9851ff6c446a xen/arch/x86/domctl.c
> --- a/xen/arch/x86/domctl.c Mon Jul 16 19:29:50 2012 +0800
> +++ b/xen/arch/x86/domctl.c Mon Jul 16 21:14:19 2012 +0800
> @@ -1023,12 +1023,14 @@
> 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;
> #ifdef __x86_64__
> if ( !is_hvm_domain(d) )
> @@ -1060,9 +1062,9 @@
> 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);
> + if ( evc->size >= offsetof(typeof(*evc), vmce) +
> + sizeof(evc->vmce) );
> + ret = vmce_restore_vcpu(v, &evc->vmce);
> }
>
> ret = 0;
> diff -r 9851ff6c446a xen/include/asm-x86/mce.h
> --- a/xen/include/asm-x86/mce.h Mon Jul 16 19:29:50 2012 +0800
> +++ b/xen/include/asm-x86/mce.h Mon Jul 16 21:14:19 2012 +0800
> @@ -44,7 +44,7 @@
>
> /* Guest vMCE MSRs virtualization */
> extern void vmce_init_vcpu(struct vcpu *);
> -extern int vmce_restore_vcpu(struct vcpu *, uint64_t caps);
> +extern int vmce_restore_vcpu(struct vcpu *, struct hvm_vmce_vcpu *ctxt);
> extern int vmce_wrmsr(uint32_t msr, uint64_t val);
> extern int vmce_rdmsr(uint32_t msr, uint64_t *val);
>
> diff -r 9851ff6c446a xen/include/public/arch-x86/hvm/save.h
> --- a/xen/include/public/arch-x86/hvm/save.h Mon Jul 16 19:29:50 2012 +0800
> +++ b/xen/include/public/arch-x86/hvm/save.h Mon Jul 16 21:14:19 2012 +0800
> @@ -577,6 +577,8 @@
>
> struct hvm_vmce_vcpu {
> uint64_t caps;
> + uint64_t mci_ctl2_bank0;
> + uint64_t mci_ctl2_bank1;
> };
>
> DECLARE_HVM_SAVE_TYPE(VMCE_VCPU, 18, struct hvm_vmce_vcpu);
> diff -r 9851ff6c446a xen/include/public/domctl.h
> --- a/xen/include/public/domctl.h Mon Jul 16 19:29:50 2012 +0800
> +++ b/xen/include/public/domctl.h Mon Jul 16 21:14:19 2012 +0800
> @@ -32,6 +32,7 @@
> #error "domctl operations are intended for use by node control tools
only"
> #endif
>
> +#include <xen/hvm/save.h>
> #include "xen.h"
> #include "grant_table.h"
>
> @@ -571,7 +572,7 @@
> uint16_t sysenter_callback_cs;
> uint8_t syscall32_disables_events;
> uint8_t sysenter_disables_events;
> - uint64_aligned_t mcg_cap;
> + struct hvm_vmce_vcpu vmce;
> #endif
> };
> typedef struct xen_domctl_ext_vcpucontext xen_domctl_ext_vcpucontext_t;