Sync pc before memory hooks

This ensures correct PC for any arch
This commit is contained in:
mio
2025-04-12 22:08:29 +08:00
parent 3a7bde03b8
commit 4a13bc7cb8
2 changed files with 35 additions and 19 deletions

View File

@@ -545,9 +545,6 @@ static inline void gen_op_ld_v(DisasContext *s, int idx, TCGv t0, TCGv a0)
{
TCGContext *tcg_ctx = s->uc->tcg_ctx;
if (HOOK_EXISTS(s->uc, UC_HOOK_MEM_READ))
gen_sync_pc(tcg_ctx, s->prev_pc); // Unicorn: sync EIP
tcg_gen_qemu_ld_tl(tcg_ctx, t0, a0, s->mem_index, idx | MO_LE);
}
@@ -555,9 +552,6 @@ static inline void gen_op_st_v(DisasContext *s, int idx, TCGv t0, TCGv a0)
{
TCGContext *tcg_ctx = s->uc->tcg_ctx;
if (HOOK_EXISTS(s->uc, UC_HOOK_MEM_WRITE))
gen_sync_pc(tcg_ctx, s->prev_pc); // Unicorn: sync EIP
tcg_gen_qemu_st_tl(tcg_ctx, t0, a0, s->mem_index, idx | MO_LE);
}
@@ -2914,9 +2908,6 @@ static inline void gen_ldq_env_A0(DisasContext *s, int offset)
{
TCGContext *tcg_ctx = s->uc->tcg_ctx;
if (HOOK_EXISTS(s->uc, UC_HOOK_MEM_READ))
gen_sync_pc(tcg_ctx, s->prev_pc); // Unicorn: sync EIP
tcg_gen_qemu_ld_i64(tcg_ctx, s->tmp1_i64, s->A0, s->mem_index, MO_LEQ);
tcg_gen_st_i64(tcg_ctx, s->tmp1_i64, tcg_ctx->cpu_env, offset);
}
@@ -2925,9 +2916,6 @@ static inline void gen_stq_env_A0(DisasContext *s, int offset)
{
TCGContext *tcg_ctx = s->uc->tcg_ctx;
if (HOOK_EXISTS(s->uc, UC_HOOK_MEM_WRITE))
gen_sync_pc(tcg_ctx, s->prev_pc); // Unicorn: sync EIP
tcg_gen_ld_i64(tcg_ctx, s->tmp1_i64, tcg_ctx->cpu_env, offset);
tcg_gen_qemu_st_i64(tcg_ctx, s->tmp1_i64, s->A0, s->mem_index, MO_LEQ);
}
@@ -2937,9 +2925,6 @@ static inline void gen_ldo_env_A0(DisasContext *s, int offset)
TCGContext *tcg_ctx = s->uc->tcg_ctx;
int mem_index = s->mem_index;
if (HOOK_EXISTS(s->uc, UC_HOOK_MEM_READ))
gen_sync_pc(tcg_ctx, s->prev_pc); // Unicorn: sync EIP
tcg_gen_qemu_ld_i64(tcg_ctx, s->tmp1_i64, s->A0, mem_index, MO_LEQ);
tcg_gen_st_i64(tcg_ctx, s->tmp1_i64, tcg_ctx->cpu_env, offset + offsetof(ZMMReg, ZMM_Q(0)));
tcg_gen_addi_tl(tcg_ctx, s->tmp0, s->A0, 8);
@@ -2952,9 +2937,6 @@ static inline void gen_sto_env_A0(DisasContext *s, int offset)
TCGContext *tcg_ctx = s->uc->tcg_ctx;
int mem_index = s->mem_index;
if (HOOK_EXISTS(s->uc, UC_HOOK_MEM_WRITE))
gen_sync_pc(tcg_ctx, s->prev_pc); // Unicorn: sync EIP
tcg_gen_ld_i64(tcg_ctx, s->tmp1_i64, tcg_ctx->cpu_env, offset + offsetof(ZMMReg, ZMM_Q(0)));
tcg_gen_qemu_st_i64(tcg_ctx, s->tmp1_i64, s->A0, mem_index, MO_LEQ);
tcg_gen_addi_tl(tcg_ctx, s->tmp0, s->A0, 8);