From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1M9a6D-0007iB-FF for qemu-devel@nongnu.org; Thu, 28 May 2009 03:32:25 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1M9a69-0007eA-SR for qemu-devel@nongnu.org; Thu, 28 May 2009 03:32:25 -0400 Received: from [199.232.76.173] (port=39977 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1M9a69-0007dz-OU for qemu-devel@nongnu.org; Thu, 28 May 2009 03:32:21 -0400 Received: from mx20.gnu.org ([199.232.41.8]:3704) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1M9a69-0001Yc-59 for qemu-devel@nongnu.org; Thu, 28 May 2009 03:32:21 -0400 Received: from fmmailgate03.web.de ([217.72.192.234]) by mx20.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1M9a67-0008Pv-8m for qemu-devel@nongnu.org; Thu, 28 May 2009 03:32:19 -0400 Message-ID: <4A1E3DF9.5080607@web.de> Date: Thu, 28 May 2009 09:32:09 +0200 From: Jan Kiszka MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enigD062245352762E1026564D25" Sender: jan.kiszka@web.de Subject: [Qemu-devel] [PATCH] KVM: x86: Refactor persistent CPU state List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: Avi Kivity , qemu-devel This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enigD062245352762E1026564D25 Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: quoted-printable This patch aligns the KVM-related layout and encoding of the CPU state to be saved to disk or migrated with qemu-kvm. The major differences are reordering of fields and a compressed interrupt_bitmap into a single number as there can be no more than one pending IRQ at a time. Signed-off-by: Jan Kiszka --- target-i386/machine.c | 30 +++++++++++++++++++++++------- 1 files changed, 23 insertions(+), 7 deletions(-) diff --git a/target-i386/machine.c b/target-i386/machine.c index bb8b9db..259302c 100644 --- a/target-i386/machine.c +++ b/target-i386/machine.c @@ -28,7 +28,8 @@ void cpu_save(QEMUFile *f, void *opaque) uint16_t fptag, fpus, fpuc, fpregs_format; uint32_t hflags; int32_t a20_mask; - int i; + int32_t pending_irq; + int i, bit; =20 cpu_synchronize_state(env, 0); =20 @@ -141,11 +142,21 @@ void cpu_save(QEMUFile *f, void *opaque) qemu_put_be64s(f, &env->mtrr_var[i].mask); } =20 - for (i =3D 0; i < sizeof(env->interrupt_bitmap)/8; i++) { - qemu_put_be64s(f, &env->interrupt_bitmap[i]); + /* KVM-related states */ + + /* There can only be one pending IRQ set in the bitmap at a time, so= try + to find it and save its number instead (-1 for none). */ + pending_irq =3D -1; + for (i =3D 0; i < ARRAY_SIZE(env->interrupt_bitmap); i++) { + bit =3D ffsll(env->interrupt_bitmap[i]); + if (bit) { + pending_irq =3D i * 64 + bit - 1; + break; + } } - qemu_put_be64s(f, &env->tsc); + qemu_put_sbe32s(f, &pending_irq); qemu_put_be32s(f, &env->mp_state); + qemu_put_be64s(f, &env->tsc); } =20 #ifdef USE_X86LDOUBLE @@ -179,6 +190,7 @@ int cpu_load(QEMUFile *f, void *opaque, int version_i= d) uint32_t hflags; uint16_t fpus, fpuc, fptag, fpregs_format; int32_t a20_mask; + int32_t pending_irq; =20 if (version_id < 3 || version_id > CPU_SAVE_VERSION) return -EINVAL; @@ -324,12 +336,16 @@ int cpu_load(QEMUFile *f, void *opaque, int version= _id) qemu_get_be64s(f, &env->mtrr_var[i].mask); } } + if (version_id >=3D 9) { - for (i =3D 0; i < sizeof(env->interrupt_bitmap)/8; i++) { - qemu_get_be64s(f, &env->interrupt_bitmap[i]); + qemu_get_sbe32s(f, &pending_irq); + memset(&env->interrupt_bitmap, 0, sizeof(env->interrupt_bitmap))= ; + if (pending_irq >=3D 0) { + env->interrupt_bitmap[pending_irq / 64] |=3D + (uint64_t)1 << (pending_irq % 64); } - qemu_get_be64s(f, &env->tsc); qemu_get_be32s(f, &env->mp_state); + qemu_get_be64s(f, &env->tsc); } =20 /* XXX: ensure compatiblity for halted bit ? */ --------------enigD062245352762E1026564D25 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 iEYEARECAAYFAkoePfwACgkQniDOoMHTA+mQtwCfbJYXxJYUBnhmI6YbPHpI8z17 dzEAniAzE9p7Uet78Z2fNFEJIB2fzd5A =RcAK -----END PGP SIGNATURE----- --------------enigD062245352762E1026564D25--