mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 01:03:55 -06:00
target/mips: Extract break code into env->error_code
Simplify cpu_loop by doing all of the decode in translate. This fixes a bug in that cpu_loop was not handling the different layout of the R6 version of break16. This fixes a bug in that cpu_loop extracted the wrong bits for the mips16e break16 instruction. Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20220107213243.212806-17-richard.henderson@linaro.org> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
This commit is contained in:
parent
73c0aa6a85
commit
6f3533dd1b
5 changed files with 25 additions and 69 deletions
|
@ -822,7 +822,7 @@ static void gen_pool16c_insn(DisasContext *ctx)
|
|||
gen_HILO(ctx, OPC_MFLO, 0, uMIPS_RS5(ctx->opcode));
|
||||
break;
|
||||
case BREAK16:
|
||||
generate_exception_end(ctx, EXCP_BREAK);
|
||||
generate_exception_break(ctx, extract32(ctx->opcode, 0, 4));
|
||||
break;
|
||||
case SDBBP16:
|
||||
if (is_uhi(extract32(ctx->opcode, 0, 4))) {
|
||||
|
@ -937,7 +937,7 @@ static void gen_pool16c_r6_insn(DisasContext *ctx)
|
|||
break;
|
||||
case R6_BREAK16:
|
||||
/* BREAK16 */
|
||||
generate_exception(ctx, EXCP_BREAK);
|
||||
generate_exception_break(ctx, extract32(ctx->opcode, 6, 4));
|
||||
break;
|
||||
case R6_SDBBP16:
|
||||
/* SDBBP16 */
|
||||
|
@ -1812,7 +1812,7 @@ static void decode_micromips32_opc(CPUMIPSState *env, DisasContext *ctx)
|
|||
gen_pool32axf(env, ctx, rt, rs);
|
||||
break;
|
||||
case BREAK32:
|
||||
generate_exception_end(ctx, EXCP_BREAK);
|
||||
generate_exception_break(ctx, extract32(ctx->opcode, 6, 20));
|
||||
break;
|
||||
case SIGRIE:
|
||||
check_insn(ctx, ISA_MIPS_R6);
|
||||
|
|
|
@ -969,7 +969,7 @@ static int decode_ase_mips16e(CPUMIPSState *env, DisasContext *ctx)
|
|||
gen_slt(ctx, OPC_SLTU, 24, rx, ry);
|
||||
break;
|
||||
case RR_BREAK:
|
||||
generate_exception_end(ctx, EXCP_BREAK);
|
||||
generate_exception_break(ctx, extract32(ctx->opcode, 5, 6));
|
||||
break;
|
||||
case RR_SLLV:
|
||||
gen_shift(ctx, OPC_SLLV, ry, rx, ry);
|
||||
|
|
|
@ -1367,6 +1367,16 @@ void generate_exception_end(DisasContext *ctx, int excp)
|
|||
generate_exception_err(ctx, excp, 0);
|
||||
}
|
||||
|
||||
void generate_exception_break(DisasContext *ctx, int code)
|
||||
{
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
/* Pass the break code along to cpu_loop. */
|
||||
tcg_gen_st_i32(tcg_constant_i32(code), cpu_env,
|
||||
offsetof(CPUMIPSState, error_code));
|
||||
#endif
|
||||
generate_exception_end(ctx, EXCP_BREAK);
|
||||
}
|
||||
|
||||
void gen_reserved_instruction(DisasContext *ctx)
|
||||
{
|
||||
generate_exception_end(ctx, EXCP_RI);
|
||||
|
@ -14160,7 +14170,7 @@ static void decode_opc_special(CPUMIPSState *env, DisasContext *ctx)
|
|||
generate_exception_end(ctx, EXCP_SYSCALL);
|
||||
break;
|
||||
case OPC_BREAK:
|
||||
generate_exception_end(ctx, EXCP_BREAK);
|
||||
generate_exception_break(ctx, extract32(ctx->opcode, 6, 20));
|
||||
break;
|
||||
case OPC_SYNC:
|
||||
check_insn(ctx, ISA_MIPS2);
|
||||
|
|
|
@ -129,6 +129,7 @@ enum {
|
|||
void generate_exception(DisasContext *ctx, int excp);
|
||||
void generate_exception_err(DisasContext *ctx, int excp, int err);
|
||||
void generate_exception_end(DisasContext *ctx, int excp);
|
||||
void generate_exception_break(DisasContext *ctx, int code);
|
||||
void gen_reserved_instruction(DisasContext *ctx);
|
||||
|
||||
void check_insn(DisasContext *ctx, uint64_t flags);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue