From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jan Kiszka Subject: Re: [PATCH -v3] Add savevm/loadvm support for MCE Date: Thu, 04 Mar 2010 00:12:53 +0100 Message-ID: <4B8EECF5.8000808@web.de> References: <1267606366.1640.208.camel@yhuang-dev.sh.intel.com> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig8FDF37384D34E0D673A27E17" Cc: Avi Kivity , Anthony Liguori , Andi Kleen , "kvm@vger.kernel.org" To: Huang Ying Return-path: Received: from fmmailgate01.web.de ([217.72.192.221]:58374 "EHLO fmmailgate01.web.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751787Ab0CCXNF (ORCPT ); Wed, 3 Mar 2010 18:13:05 -0500 In-Reply-To: <1267606366.1640.208.camel@yhuang-dev.sh.intel.com> Sender: kvm-owner@vger.kernel.org List-ID: This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig8FDF37384D34E0D673A27E17 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Huang Ying wrote: > MCE registers are saved/load into/from CPUState in > kvm_arch_save/load_regs. To simulate the MCG_STATUS clearing upon > reset, MSR_MCG_STATUS is set to 0 for KVM_PUT_RESET_STATE. >=20 > v3: >=20 > - use msrs[] in kvm_arch_load/save_regs and get_msr_entry directly. Looks good! >=20 > v2: >=20 > - Rebased on new CPU registers save/load framework. >=20 > Signed-off-by: Huang Ying Acked-by: Jan Kiszka > --- > qemu-kvm-x86.c | 36 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 36 insertions(+) >=20 > --- a/qemu-kvm-x86.c > +++ b/qemu-kvm-x86.c > @@ -748,7 +748,22 @@ static int get_msr_entry(struct kvm_msr_ > case MSR_KVM_WALL_CLOCK: > env->wall_clock_msr =3D entry->data; > break; > +#ifdef KVM_CAP_MCE > + case MSR_MCG_STATUS: > + env->mcg_status =3D entry->data; > + break; > + case MSR_MCG_CTL: > + env->mcg_ctl =3D entry->data; > + break; > +#endif > default: > +#ifdef KVM_CAP_MCE > + if (entry->index >=3D MSR_MC0_CTL && \ > + entry->index < MSR_MC0_CTL + (env->mcg_cap & 0xff) * 4= ) { > + env->mce_banks[entry->index - MSR_MC0_CTL] =3D entry->= data; > + break; > + } > +#endif > printf("Warning unknown msr index 0x%x\n", entry->index); > return 1; > } > @@ -979,6 +994,18 @@ void kvm_arch_load_regs(CPUState *env, i > set_msr_entry(&msrs[n++], MSR_KVM_SYSTEM_TIME, env->system_tim= e_msr); > set_msr_entry(&msrs[n++], MSR_KVM_WALL_CLOCK, env->wall_clock_= msr); > } > +#ifdef KVM_CAP_MCE > + if (env->mcg_cap) { > + if (level =3D=3D KVM_PUT_RESET_STATE) > + set_msr_entry(&msrs[n++], MSR_MCG_STATUS, env->mcg_status)= ; > + else if (level =3D=3D KVM_PUT_FULL_STATE) { > + set_msr_entry(&msrs[n++], MSR_MCG_STATUS, env->mcg_status)= ; > + set_msr_entry(&msrs[n++], MSR_MCG_CTL, env->mcg_ctl); > + for (i =3D 0; i < (env->mcg_cap & 0xff); i++) > + set_msr_entry(&msrs[n++], MSR_MC0_CTL + i, env->mce_ba= nks[i]); > + } > + } > +#endif > =20 > rc =3D kvm_set_msrs(env, msrs, n); > if (rc =3D=3D -1) > @@ -1144,6 +1171,15 @@ void kvm_arch_save_regs(CPUState *env) > msrs[n++].index =3D MSR_KVM_SYSTEM_TIME; > msrs[n++].index =3D MSR_KVM_WALL_CLOCK; > =20 > +#ifdef KVM_CAP_MCE > + if (env->mcg_cap) { > + msrs[n++].index =3D MSR_MCG_STATUS; > + msrs[n++].index =3D MSR_MCG_CTL; > + for (i =3D 0; i < (env->mcg_cap & 0xff) * 4; i++) > + msrs[n++].index =3D MSR_MC0_CTL + i; > + } > +#endif > + > rc =3D kvm_get_msrs(env, msrs, n); > if (rc =3D=3D -1) { > perror("kvm_get_msrs FAILED"); >=20 >=20 --------------enig8FDF37384D34E0D673A27E17 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.9 (GNU/Linux) Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org iEYEARECAAYFAkuO7PUACgkQitSsb3rl5xSFfwCgmDqQK8TT2vlVgmMUFy/wQeHs Lw8AoM8aBFyHZkdVRixe3zzADJ6LLgb4 =8Ogp -----END PGP SIGNATURE----- --------------enig8FDF37384D34E0D673A27E17--