From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MsjeQ-0005mq-7d for qemu-devel@nongnu.org; Tue, 29 Sep 2009 16:50:22 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MsjeL-0005hX-Ey for qemu-devel@nongnu.org; Tue, 29 Sep 2009 16:50:21 -0400 Received: from [199.232.76.173] (port=55263 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MsjeL-0005hO-Bg for qemu-devel@nongnu.org; Tue, 29 Sep 2009 16:50:17 -0400 Received: from mx1.redhat.com ([209.132.183.28]:61845) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MsjeK-0002er-OJ for qemu-devel@nongnu.org; Tue, 29 Sep 2009 16:50:17 -0400 Received: from int-mx03.intmail.prod.int.phx2.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n8TKoFGf009607 for ; Tue, 29 Sep 2009 16:50:15 -0400 From: Juan Quintela Date: Tue, 29 Sep 2009 22:49:03 +0200 Message-Id: In-Reply-To: References: In-Reply-To: References: Subject: [Qemu-devel] [PATCH 44/49] x86: factor out cpu_pre/post_load() List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Signed-off-by: Juan Quintela --- target-i386/machine.c | 61 +++++++++++++++++++++++++++++++++---------------- 1 files changed, 41 insertions(+), 20 deletions(-) diff --git a/target-i386/machine.c b/target-i386/machine.c index 5694a5c..454ea14 100644 --- a/target-i386/machine.c +++ b/target-i386/machine.c @@ -204,12 +204,51 @@ static void fp64_to_fp80(union x86_longdouble *p, uint64_t temp) } #endif +static int cpu_pre_load(void *opaque) +{ + CPUState *env = opaque; + + cpu_synchronize_state(env); + return 0; +} + +static int cpu_post_load(void *opaque, int version_id) +{ + CPUState *env = opaque; + int i; + + /* XXX: restore FPU round state */ + env->fpstt = (env->fpus_vmstate >> 11) & 7; + env->fpus = env->fpus_vmstate & ~0x3800; + env->fptag_vmstate ^= 0xff; + for(i = 0; i < 8; i++) { + env->fptags[i] = (env->fptag_vmstate >> i) & 1; + } + + cpu_breakpoint_remove_all(env, BP_CPU); + cpu_watchpoint_remove_all(env, BP_CPU); + for (i = 0; i < 4; i++) + hw_breakpoint_insert(env, i); + + if (version_id >= 9) { + memset(&env->interrupt_bitmap, 0, sizeof(env->interrupt_bitmap)); + if (env->pending_irq_vmstate >= 0) { + env->interrupt_bitmap[env->pending_irq_vmstate / 64] |= + (uint64_t)1 << (env->pending_irq_vmstate % 64); + } + } + + tlb_flush(env, 1); + return 0; +} + int cpu_load(QEMUFile *f, void *opaque, int version_id) { CPUState *env = opaque; int i, guess_mmx; - cpu_synchronize_state(env); + cpu_pre_load(env); + if (version_id < 3 || version_id > CPU_SAVE_VERSION) return -EINVAL; for(i = 0; i < CPU_NB_REGS; i++) @@ -268,14 +307,6 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) } } - /* XXX: restore FPU round state */ - env->fpstt = (env->fpus_vmstate >> 11) & 7; - env->fpus = env->fpus_vmstate & ~0x3800; - env->fptag_vmstate ^= 0xff; - for(i = 0; i < 8; i++) { - env->fptags[i] = (env->fptag_vmstate >> i) & 1; - } - for(i = 0; i < 6; i++) cpu_get_seg(f, &env->segs[i]); cpu_get_seg(f, &env->ldt); @@ -299,10 +330,6 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) for(i = 0; i < 8; i++) qemu_get_betls(f, &env->dr[i]); - cpu_breakpoint_remove_all(env, BP_CPU); - cpu_watchpoint_remove_all(env, BP_CPU); - for (i = 0; i < 4; i++) - hw_breakpoint_insert(env, i); qemu_get_sbe32s(f, &env->a20_mask); @@ -354,11 +381,6 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) if (version_id >= 9) { qemu_get_sbe32s(f, &env->pending_irq_vmstate); - memset(&env->interrupt_bitmap, 0, sizeof(env->interrupt_bitmap)); - if (env->pending_irq_vmstate >= 0) { - env->interrupt_bitmap[env->pending_irq_vmstate / 64] |= - (uint64_t)1 << (env->pending_irq_vmstate % 64); - } qemu_get_be32s(f, &env->mp_state); qemu_get_be64s(f, &env->tsc); } @@ -372,6 +394,5 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) } } - tlb_flush(env, 1); - return 0; + return cpu_post_load(env, version_id); } -- 1.6.2.5