@@ -86,13 +86,13 @@ void rx_cpu_do_interrupt(CPUState *cs)
env->isp -= 4;
cpu_stl_le_data(env, env->isp, env->pc);
- if (vec < 0x100) {
+ if (vec < RX_EXCP_INT) {
env->pc = cpu_ldl_le_data(env, 0xffffff80 + vec * 4);
} else {
env->pc = cpu_ldl_le_data(env, env->intb + (vec & 0xff) * 4);
}
- if (vec == 30) {
+ if (vec == RX_EXCP_NMI) {
/* Non-maskable interrupt */
qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
} else {
@@ -100,22 +100,22 @@ void rx_cpu_do_interrupt(CPUState *cs)
}
switch (vec) {
- case 20:
+ case RX_EXCP_PRIVILEGE_VIOLATION:
expname = "privilege violation";
break;
- case 21:
+ case RX_EXCP_ACCESS:
expname = "access exception";
break;
- case 23:
+ case RX_EXCP_ILLEGAL_INSTRUCTION:
expname = "illegal instruction";
break;
- case 25:
+ case RX_EXCP_FPU:
expname = "fpu exception";
break;
- case 30:
+ case RX_EXCP_NMI:
expname = "non-maskable interrupt";
break;
- case 0x100 ... 0x1ff:
+ case RX_EXCP_INT ... RX_EXCP_INT + 0xff:
expname = "unconditional trap";
}
qemu_log_mask(CPU_LOG_INT, "exception 0x%02x [%s] raised\n",
@@ -1,9 +1,4 @@
-DEF_HELPER_1(raise_illegal_instruction, noreturn, env)
-DEF_HELPER_1(raise_access_fault, noreturn, env)
-DEF_HELPER_1(raise_privilege_violation, noreturn, env)
DEF_HELPER_1(wait, noreturn, env)
-DEF_HELPER_2(rxint, noreturn, env, i32)
-DEF_HELPER_1(rxbrk, noreturn, env)
DEF_HELPER_3(fadd, f32, env, f32, f32)
DEF_HELPER_3(fsub, f32, env, f32, f32)
DEF_HELPER_3(fmul, f32, env, f32, f32)
@@ -25,10 +25,6 @@
#include "fpu/softfloat.h"
#include "tcg/debug-assert.h"
-static inline G_NORETURN
-void raise_exception(CPURXState *env, int index,
- uintptr_t retaddr);
-
static void _set_psw(CPURXState *env, uint32_t psw, uint32_t rte)
{
uint32_t prev_u;
@@ -115,7 +111,7 @@ static void update_fpsw(CPURXState *env, float32 ret, uintptr_t retaddr)
enable = FIELD_EX32(env->fpsw, FPSW, ENABLE);
enable |= 1 << 5; /* CE always enabled */
if (cause & enable) {
- raise_exception(env, 21, retaddr);
+ cpu_loop_exit_excp(env_cpu(env), RX_EXCP_ACCESS, retaddr);
}
}
}
@@ -419,32 +415,6 @@ uint32_t helper_divu(CPURXState *env, uint32_t num, uint32_t den)
return ret;
}
-/* exception */
-static inline G_NORETURN
-void raise_exception(CPURXState *env, int index,
- uintptr_t retaddr)
-{
- CPUState *cs = env_cpu(env);
-
- cs->exception_index = index;
- cpu_loop_exit_restore(cs, retaddr);
-}
-
-G_NORETURN void helper_raise_privilege_violation(CPURXState *env)
-{
- raise_exception(env, 20, GETPC());
-}
-
-G_NORETURN void helper_raise_access_fault(CPURXState *env)
-{
- raise_exception(env, 21, GETPC());
-}
-
-G_NORETURN void helper_raise_illegal_instruction(CPURXState *env)
-{
- raise_exception(env, 23, GETPC());
-}
-
G_NORETURN void helper_wait(CPURXState *env)
{
CPUState *cs = env_cpu(env);
@@ -452,15 +422,5 @@ G_NORETURN void helper_wait(CPURXState *env)
cs->halted = 1;
env->in_sleep = 1;
env->psw_i = 1;
- raise_exception(env, EXCP_HLT, 0);
-}
-
-G_NORETURN void helper_rxint(CPURXState *env, uint32_t vec)
-{
- raise_exception(env, 0x100 + vec, 0);
-}
-
-G_NORETURN void helper_rxbrk(CPURXState *env)
-{
- raise_exception(env, 0x100, 0);
+ cpu_loop_exit_excp(cs, EXCP_HLT, 0);
}
@@ -245,7 +245,8 @@ static int is_privileged(DisasContext *ctx, int is_exception)
{
if (FIELD_EX32(ctx->tb_flags, PSW, PM)) {
if (is_exception) {
- gen_helper_raise_privilege_violation(tcg_env);
+ gen_helper_raise_excp_restore(
+ tcg_env, tcg_constant_i32(RX_EXCP_PRIVILEGE_VIOLATION));
}
return 0;
} else {
@@ -2174,7 +2175,7 @@ static bool trans_RTE(DisasContext *ctx, arg_RTE *a)
static bool trans_BRK(DisasContext *ctx, arg_BRK *a)
{
tcg_gen_movi_i32(cpu_pc, ctx->base.pc_next);
- gen_helper_rxbrk(tcg_env);
+ gen_helper_raise_excp(tcg_env, tcg_constant_i32(RX_EXCP_INT));
ctx->base.is_jmp = DISAS_NORETURN;
return true;
}
@@ -2182,12 +2183,9 @@ static bool trans_BRK(DisasContext *ctx, arg_BRK *a)
/* int #imm */
static bool trans_INT(DisasContext *ctx, arg_INT *a)
{
- TCGv_i32 vec;
-
tcg_debug_assert(a->imm < 0x100);
- vec = tcg_constant_i32(a->imm);
tcg_gen_movi_i32(cpu_pc, ctx->base.pc_next);
- gen_helper_rxint(tcg_env, vec);
+ gen_helper_raise_excp(tcg_env, tcg_constant_i32(RX_EXCP_INT + a->imm));
ctx->base.is_jmp = DISAS_NORETURN;
return true;
}
@@ -2228,7 +2226,8 @@ static void rx_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
ctx->pc = ctx->base.pc_next;
insn = decode_load(ctx);
if (!decode(ctx, insn)) {
- gen_helper_raise_illegal_instruction(tcg_env);
+ gen_helper_raise_excp_restore(
+ tcg_env, tcg_constant_i32(RX_EXCP_ILLEGAL_INSTRUCTION));
}
}
Translate privilege and illegal through raise_excp_restore, and BRK and INT through raise_excp. Drop unused raise_access_fault and the one-line raise_exception wrapper. FPSW still exits with RX_EXCP_ACCESS. Signed-off-by: Yonggang Luo <luoyonggang@gmail.com> --- target/rx/helper.c | 16 ++++++++-------- target/rx/helper.h | 5 ----- target/rx/op_helper.c | 44 ++----------------------------------------- target/rx/translate.c | 13 ++++++------- 4 files changed, 16 insertions(+), 62 deletions(-)