summaryrefslogtreecommitdiff
path: root/cpu-exec.c
diff options
context:
space:
mode:
authorSeokYeon Hwang <syeon.hwang@samsung.com>2013-09-10 12:18:05 +0900
committerSeokYeon Hwang <syeon.hwang@samsung.com>2013-09-10 12:18:05 +0900
commit74ba0a08e4265c04556102cda35743f0f09df318 (patch)
tree1331a947c908a50877632c2d9b916c664267540b /cpu-exec.c
parentacdb0d70ee52e7e811665784af6c7bb22d4d613f (diff)
parent1ee2daeb6448312d6d0e22175f5c1b9b01f8974c (diff)
downloadqemu-74ba0a08e4265c04556102cda35743f0f09df318.tar.gz
qemu-74ba0a08e4265c04556102cda35743f0f09df318.tar.bz2
qemu-74ba0a08e4265c04556102cda35743f0f09df318.zip
Merge tag 'v1.6.0' into tizen_qemu_1.6
Signed-off-by: SeokYeon Hwang <syeon.hwang@samsung.com> Conflicts: VERSION arch_init.c block/vmdk.c configure cpu-exec.c cpus.c exec.c hw/9pfs/virtio-9p-device.c hw/display/vga-pci.c hw/pci-host/q35.c hw/usb/dev-storage.c hw/virtio/virtio-mmio.c include/exec/cpu-defs.h include/qemu/error-report.h include/qemu/log.h include/sysemu/kvm.h include/sysemu/sysemu.h pc-bios/bios.bin qapi-schema.json qemu-char.c ui/input.c util/oslib-win32.c vl.c
Diffstat (limited to 'cpu-exec.c')
-rw-r--r--cpu-exec.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/cpu-exec.c b/cpu-exec.c
index 0871c5c04c..83a110ce3f 100644
--- a/cpu-exec.c
+++ b/cpu-exec.c
@@ -60,8 +60,14 @@ static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu, uint8_t *tb_ptr)
* counter hit zero); we must restore the guest PC to the address
* of the start of the TB.
*/
+ CPUClass *cc = CPU_GET_CLASS(cpu);
TranslationBlock *tb = (TranslationBlock *)(next_tb & ~TB_EXIT_MASK);
- cpu_pc_from_tb(env, tb);
+ if (cc->synchronize_from_tb) {
+ cc->synchronize_from_tb(cpu, tb);
+ } else {
+ assert(cc->set_pc);
+ cc->set_pc(cpu, tb->pc);
+ }
}
if ((next_tb & TB_EXIT_MASK) == TB_EXIT_REQUESTED) {
/* We were asked to stop executing TBs (probably a pending
@@ -233,12 +239,12 @@ int cpu_exec(CPUArchState *env)
cpu->halted = 0;
}
- cpu_single_env = env;
+ current_cpu = cpu;
- /* As long as cpu_single_env is null, up to the assignment just above,
+ /* As long as current_cpu is null, up to the assignment just above,
* requests by other threads to exit the execution loop are expected to
* be issued using the exit_request global. We must make sure that our
- * evaluation of the global value is performed past the cpu_single_env
+ * evaluation of the global value is performed past the current_cpu
* value transition point, which requires a memory barrier as well as
* an instruction scheduling constraint on modern architectures. */
smp_mb();
@@ -250,7 +256,7 @@ int cpu_exec(CPUArchState *env)
#if defined(TARGET_I386)
/* put eflags in CPU temporary format */
CC_SRC = env->eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
- DF = 1 - (2 * ((env->eflags >> 10) & 1));
+ env->df = 1 - (2 * ((env->eflags >> 10) & 1));
CC_OP = CC_OP_EFLAGS;
env->eflags &= ~(DF_MASK | CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
#elif defined(TARGET_SPARC)
@@ -316,7 +322,7 @@ int cpu_exec(CPUArchState *env)
for(;;) {
interrupt_request = need_handle_intr_request(cpu);
if (unlikely(interrupt_request)) {
- if (unlikely(env->singlestep_enabled & SSTEP_NOIRQ)) {
+ if (unlikely(cpu->singlestep_enabled & SSTEP_NOIRQ)) {
/* Mask out external interrupts for this step. */
interrupt_request &= ~CPU_INTERRUPT_SSTEP_MASK;
}
@@ -361,7 +367,7 @@ int cpu_exec(CPUArchState *env)
if (hax_enabled())
env->hax_vcpu->resync = 1;
#endif
- do_smm_enter(env);
+ do_smm_enter(x86_env_get_cpu(env));
next_tb = 0;
} else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
!(env->hflags2 & HF2_NMI_MASK)) {
@@ -607,15 +613,15 @@ int cpu_exec(CPUArchState *env)
if (qemu_loglevel_mask(CPU_LOG_TB_CPU)) {
/* restore flags in standard format */
#if defined(TARGET_I386)
- log_cpu_state(env, CPU_DUMP_CCOP);
+ log_cpu_state(cpu, CPU_DUMP_CCOP);
#elif defined(TARGET_M68K)
cpu_m68k_flush_flags(env, env->cc_op);
env->cc_op = CC_OP_FLAGS;
env->sr = (env->sr & 0xffe0)
| env->cc_dest | (env->cc_x << 4);
- log_cpu_state(env, 0);
+ log_cpu_state(cpu, 0);
#else
- log_cpu_state(env, 0);
+ log_cpu_state(cpu, 0);
#endif
}
#endif /* DEBUG_DISAS */
@@ -707,7 +713,8 @@ int cpu_exec(CPUArchState *env)
} else {
/* Reload env after longjmp - the compiler may have smashed all
* local variables as longjmp is marked 'noreturn'. */
- env = cpu_single_env;
+ cpu = current_cpu;
+ env = cpu->env_ptr;
}
} /* for(;;) */
@@ -715,7 +722,7 @@ int cpu_exec(CPUArchState *env)
#if defined(TARGET_I386)
/* restore flags in standard format */
env->eflags = env->eflags | cpu_cc_compute_all(env, CC_OP)
- | (DF & DF_MASK);
+ | (env->df & DF_MASK);
#elif defined(TARGET_ARM)
/* XXX: Save/restore host fpu exception state?. */
#elif defined(TARGET_UNICORE32)
@@ -741,7 +748,7 @@ int cpu_exec(CPUArchState *env)
#error unsupported target CPU
#endif
- /* fail safe : never use cpu_single_env outside cpu_exec() */
- cpu_single_env = NULL;
+ /* fail safe : never use current_cpu outside cpu_exec() */
+ current_cpu = NULL;
return ret;
}