diff options
author | SeokYeon Hwang <syeon.hwang@samsung.com> | 2013-09-10 12:18:05 +0900 |
---|---|---|
committer | SeokYeon Hwang <syeon.hwang@samsung.com> | 2013-09-10 12:18:05 +0900 |
commit | 74ba0a08e4265c04556102cda35743f0f09df318 (patch) | |
tree | 1331a947c908a50877632c2d9b916c664267540b /cpu-exec.c | |
parent | acdb0d70ee52e7e811665784af6c7bb22d4d613f (diff) | |
parent | 1ee2daeb6448312d6d0e22175f5c1b9b01f8974c (diff) | |
download | qemu-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.c | 35 |
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; } |