diff --git a/qemu/target-m68k/cpu.h b/qemu/target-m68k/cpu.h index 7123c211..a8853265 100644 --- a/qemu/target-m68k/cpu.h +++ b/qemu/target-m68k/cpu.h @@ -163,7 +163,8 @@ int cpu_m68k_exec(struct uc_struct *uc, CPUState *cpu); is returned if the signal was handled by the virtual CPU. */ int cpu_m68k_signal_handler(int host_signum, void *pinfo, void *puc); -uint32_t cpu_m68k_flush_flags(CPUM68KState *env, int op); +uint32_t cpu_m68k_get_ccr(CPUM68KState *env); +void cpu_m68k_set_ccr(CPUM68KState *env, uint32_t); typedef enum { CC_OP_DYNAMIC, /* Use env->cc_op */ diff --git a/qemu/target-m68k/helper.c b/qemu/target-m68k/helper.c index b27d6167..c0398ba4 100644 --- a/qemu/target-m68k/helper.c +++ b/qemu/target-m68k/helper.c @@ -46,7 +46,7 @@ M68kCPU *cpu_m68k_init(struct uc_struct *uc, const char *cpu_model) return cpu; } -uint32_t cpu_m68k_flush_flags(CPUM68KState *env, int op) +static uint32_t cpu_m68k_flush_flags(CPUM68KState *env, int op) { int flags; uint32_t src; @@ -186,6 +186,18 @@ set_x: return flags; } +uint32_t cpu_m68k_get_ccr(CPUM68KState *env) +{ + return cpu_m68k_flush_flags(env, env->cc_op) | env->cc_x * CCF_X; +} + +void cpu_m68k_set_ccr(CPUM68KState *env, uint32_t val) +{ + env->cc_op = CC_OP_FLAGS; + env->cc_dest = val & 0xf; + env->cc_x = (val & CCF_X ? 1 : 0); +} + void HELPER(movec)(CPUM68KState *env, uint32_t reg, uint32_t val) { M68kCPU *cpu = m68k_env_get_cpu(env); @@ -380,7 +392,8 @@ uint32_t HELPER(addx_cc)(CPUM68KState *env, uint32_t op1, uint32_t op2) void HELPER(set_sr)(CPUM68KState *env, uint32_t val) { - env->sr = val & 0xffff; + env->sr = val & 0xffe0; + cpu_m68k_set_ccr(env, val); m68k_switch_sp(env); } diff --git a/qemu/target-m68k/op_helper.c b/qemu/target-m68k/op_helper.c index b577ffc2..967787bc 100644 --- a/qemu/target-m68k/op_helper.c +++ b/qemu/target-m68k/op_helper.c @@ -64,9 +64,8 @@ static void do_rte(CPUM68KState *env) fmt = cpu_ldl_kernel(env, sp); env->pc = cpu_ldl_kernel(env, sp + 4); sp |= (fmt >> 28) & 3; - env->sr = fmt & 0xffff; env->aregs[7] = sp + 8; - m68k_switch_sp(env); + helper_set_sr(env, fmt); } static void do_interrupt_all(CPUM68KState *env, int is_hw) @@ -104,6 +103,7 @@ static void do_interrupt_all(CPUM68KState *env, int is_hw) fmt |= 0x40000000; fmt |= vector << 16; fmt |= env->sr; + fmt |= cpu_m68k_get_ccr(env); env->sr |= SR_S; if (is_hw) {