summaryrefslogtreecommitdiff
path: root/target-m68k
diff options
context:
space:
mode:
Diffstat (limited to 'target-m68k')
-rw-r--r--target-m68k/op_helper.c7
-rw-r--r--target-m68k/translate.c8
2 files changed, 7 insertions, 8 deletions
diff --git a/target-m68k/op_helper.c b/target-m68k/op_helper.c
index 4f8fabb922..1af0ca647b 100644
--- a/target-m68k/op_helper.c
+++ b/target-m68k/op_helper.c
@@ -62,8 +62,8 @@ static void do_rte(CPUM68KState *env)
env->pc = cpu_ldl_kernel(env, sp + 4);
sp |= (fmt >> 28) & 3;
env->sr = fmt & 0xffff;
- m68k_switch_sp(env);
env->aregs[7] = sp + 8;
+ m68k_switch_sp(env);
}
static void do_interrupt_all(CPUM68KState *env, int is_hw)
@@ -107,10 +107,7 @@ static void do_interrupt_all(CPUM68KState *env, int is_hw)
vector = cs->exception_index << 2;
- sp = env->aregs[7];
-
fmt |= 0x40000000;
- fmt |= (sp & 3) << 28;
fmt |= vector << 16;
fmt |= env->sr;
@@ -120,6 +117,8 @@ static void do_interrupt_all(CPUM68KState *env, int is_hw)
env->sr &= ~SR_M;
}
m68k_switch_sp(env);
+ sp = env->aregs[7];
+ fmt |= (sp & 3) << 28;
/* ??? This could cause MMU faults. */
sp &= ~3;
diff --git a/target-m68k/translate.c b/target-m68k/translate.c
index 22ecc20410..d6c478fd28 100644
--- a/target-m68k/translate.c
+++ b/target-m68k/translate.c
@@ -1995,8 +1995,8 @@ DISAS_INSN(move_from_usp)
gen_exception(s, s->pc - 2, EXCP_PRIVILEGE);
return;
}
- /* TODO: Implement USP. */
- gen_exception(s, s->pc - 2, EXCP_ILLEGAL);
+ tcg_gen_ld_i32(AREG(insn, 0), cpu_env,
+ offsetof(CPUM68KState, sp[M68K_USP]));
}
DISAS_INSN(move_to_usp)
@@ -2005,8 +2005,8 @@ DISAS_INSN(move_to_usp)
gen_exception(s, s->pc - 2, EXCP_PRIVILEGE);
return;
}
- /* TODO: Implement USP. */
- gen_exception(s, s->pc - 2, EXCP_ILLEGAL);
+ tcg_gen_st_i32(AREG(insn, 0), cpu_env,
+ offsetof(CPUM68KState, sp[M68K_USP]));
}
DISAS_INSN(halt)