[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 44/49] x86: factor out cpu_pre/post_load()
From: |
Juan Quintela |
Subject: |
[Qemu-devel] [PATCH 44/49] x86: factor out cpu_pre/post_load() |
Date: |
Tue, 29 Sep 2009 22:49:03 +0200 |
Signed-off-by: Juan Quintela <address@hidden>
---
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
- [Qemu-devel] [PATCH 34/49] x86: add pending_irq_vmstate to the state, (continued)
- [Qemu-devel] [PATCH 34/49] x86: add pending_irq_vmstate to the state, Juan Quintela, 2009/09/29
- [Qemu-devel] [PATCH 35/49] x86: add fpregs_format_vmstate, Juan Quintela, 2009/09/29
- [Qemu-devel] [PATCH 36/49] x86: mce_banks always have the same size, Juan Quintela, 2009/09/29
- [Qemu-devel] [PATCH 37/49] x86: send mce_banks as an array, Juan Quintela, 2009/09/29
- [Qemu-devel] [PATCH 39/49] x86: split FPReg union, Juan Quintela, 2009/09/29
- [Qemu-devel] [PATCH 38/49] x86: mcg_cap is never 0, Juan Quintela, 2009/09/29
- [Qemu-devel] [PATCH 40/49] x86: split MTRRVar union, Juan Quintela, 2009/09/29
- [Qemu-devel] [PATCH 41/49] Add *TL functions to vmstate, Juan Quintela, 2009/09/29
- [Qemu-devel] [PATCH 42/49] x86: port segments to vmstate, Juan Quintela, 2009/09/29
- [Qemu-devel] [PATCH 43/49] x86: factor out cpu_pre_save(), Juan Quintela, 2009/09/29
- [Qemu-devel] [PATCH 44/49] x86: factor out cpu_pre/post_load(),
Juan Quintela <=
- [Qemu-devel] [PATCH 45/49] x86: factor out cpu_get/put_xmm_reg(), Juan Quintela, 2009/09/29
- [Qemu-devel] [PATCH 46/49] x86: factor out cpu_get/put_mttr_var(), Juan Quintela, 2009/09/29
- [Qemu-devel] [PATCH 48/49] vmstate: Add suppot for field_exist() test, Juan Quintela, 2009/09/29
- [Qemu-devel] [PATCH 47/49] x86: factor out cpu_get/put_fpreg(), Juan Quintela, 2009/09/29
- [Qemu-devel] [PATCH 49/49] x86: port cpu to vmstate, Juan Quintela, 2009/09/29