mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-10-19 16:28:21 +02:00
sparc: do not call INSN handler on until-address, and verify until-address early when translating block in JIT frontend.
This commit is contained in:
parent
fda17cd377
commit
2929138c99
@ -2617,7 +2617,7 @@ static void gen_faligndata(TCGContext *tcg_ctx, TCGv dst, TCGv gsr, TCGv s1, TCG
|
|||||||
goto nfpu_insn;
|
goto nfpu_insn;
|
||||||
|
|
||||||
/* before an instruction, dc->pc must be static */
|
/* before an instruction, dc->pc must be static */
|
||||||
static void disas_sparc_insn(DisasContext * dc, unsigned int insn)
|
static void disas_sparc_insn(DisasContext * dc, unsigned int insn, bool hook_insn)
|
||||||
{
|
{
|
||||||
TCGContext *tcg_ctx = dc->uc->tcg_ctx;
|
TCGContext *tcg_ctx = dc->uc->tcg_ctx;
|
||||||
unsigned int opc, rs1, rs2, rd;
|
unsigned int opc, rs1, rs2, rd;
|
||||||
@ -2630,8 +2630,14 @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn)
|
|||||||
tcg_gen_debug_insn_start(tcg_ctx, dc->pc);
|
tcg_gen_debug_insn_start(tcg_ctx, dc->pc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// end address tells us to stop emulation
|
||||||
|
if (dc->pc == dc->uc->addr_end) {
|
||||||
|
insn = 0x91d02000; // generate TRAP to end this TB
|
||||||
|
hook_insn = false; // do not hook this instruction
|
||||||
|
}
|
||||||
|
|
||||||
// Unicorn: trace this instruction on request
|
// Unicorn: trace this instruction on request
|
||||||
if (dc->uc->hook_insn) {
|
if (hook_insn && dc->uc->hook_insn) {
|
||||||
struct hook_struct *trace = hook_find(dc->uc, UC_HOOK_CODE, dc->pc);
|
struct hook_struct *trace = hook_find(dc->uc, UC_HOOK_CODE, dc->pc);
|
||||||
if (trace)
|
if (trace)
|
||||||
gen_uc_tracecode(tcg_ctx, 4, trace->callback, dc->uc, dc->pc, trace->user_data);
|
gen_uc_tracecode(tcg_ctx, 4, trace->callback, dc->uc, dc->pc, trace->user_data);
|
||||||
@ -5379,7 +5385,7 @@ static inline void gen_intermediate_code_internal(SPARCCPU *cpu,
|
|||||||
DisasContext dc1, *dc = &dc1;
|
DisasContext dc1, *dc = &dc1;
|
||||||
CPUBreakpoint *bp;
|
CPUBreakpoint *bp;
|
||||||
int j, lj = -1;
|
int j, lj = -1;
|
||||||
int num_insns;
|
int num_insns = 0;
|
||||||
int max_insns;
|
int max_insns;
|
||||||
unsigned int insn;
|
unsigned int insn;
|
||||||
TCGContext *tcg_ctx = env->uc->tcg_ctx;
|
TCGContext *tcg_ctx = env->uc->tcg_ctx;
|
||||||
@ -5400,7 +5406,15 @@ static inline void gen_intermediate_code_internal(SPARCCPU *cpu,
|
|||||||
dc->singlestep = (cs->singlestep_enabled); // || singlestep);
|
dc->singlestep = (cs->singlestep_enabled); // || singlestep);
|
||||||
gen_opc_end = tcg_ctx->gen_opc_buf + OPC_MAX_SIZE;
|
gen_opc_end = tcg_ctx->gen_opc_buf + OPC_MAX_SIZE;
|
||||||
|
|
||||||
num_insns = 0;
|
|
||||||
|
// early check to see if the address of this block is the until address
|
||||||
|
if (pc_start == env->uc->addr_end) {
|
||||||
|
gen_tb_start(tcg_ctx);
|
||||||
|
insn = 0x91d02000; // generate TRAP to end this TB
|
||||||
|
disas_sparc_insn(dc, insn, false);
|
||||||
|
goto exit_gen_loop;
|
||||||
|
}
|
||||||
|
|
||||||
max_insns = tb->cflags & CF_COUNT_MASK;
|
max_insns = tb->cflags & CF_COUNT_MASK;
|
||||||
if (max_insns == 0)
|
if (max_insns == 0)
|
||||||
max_insns = CF_COUNT_MASK;
|
max_insns = CF_COUNT_MASK;
|
||||||
@ -5454,7 +5468,7 @@ static inline void gen_intermediate_code_internal(SPARCCPU *cpu,
|
|||||||
insn = cpu_ldl_code(env, dc->pc);
|
insn = cpu_ldl_code(env, dc->pc);
|
||||||
}
|
}
|
||||||
|
|
||||||
disas_sparc_insn(dc, insn);
|
disas_sparc_insn(dc, insn, true);
|
||||||
num_insns++;
|
num_insns++;
|
||||||
|
|
||||||
if (dc->is_br)
|
if (dc->is_br)
|
||||||
|
Loading…
Reference in New Issue
Block a user