qemu/tcg: factor out has_hookmem().
It's the same implementation for all architectures, so factor out has_hookmem() into tcg_uc_has_hookmem(). Signed-off-by: Glenn Baker <glenn.baker@gmx.com>
This commit is contained in:
parent
d84208e829
commit
7a5711ce1d
@ -1577,4 +1577,11 @@ struct jit_code_entry {
|
|||||||
void uc_del_inline_hook(uc_engine *uc, struct hook *hk);
|
void uc_del_inline_hook(uc_engine *uc, struct hook *hk);
|
||||||
void uc_add_inline_hook(uc_engine *uc, struct hook *hk, void** args, int args_len);
|
void uc_add_inline_hook(uc_engine *uc, struct hook *hk, void** args, int args_len);
|
||||||
|
|
||||||
|
static inline bool tcg_uc_has_hookmem(TCGContext *s)
|
||||||
|
{
|
||||||
|
return HOOK_EXISTS(s->uc, UC_HOOK_MEM_READ) ||
|
||||||
|
HOOK_EXISTS(s->uc, UC_HOOK_MEM_READ_AFTER) ||
|
||||||
|
HOOK_EXISTS(s->uc, UC_HOOK_MEM_WRITE);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* TCG_H */
|
#endif /* TCG_H */
|
||||||
|
@ -1581,20 +1581,13 @@ static inline void tcg_out_adr(TCGContext *s, TCGReg rd, void *target)
|
|||||||
tcg_out_insn(s, 3406, ADR, rd, offset);
|
tcg_out_insn(s, 3406, ADR, rd, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool has_hookmem(TCGContext *s)
|
|
||||||
{
|
|
||||||
return HOOK_EXISTS(s->uc, UC_HOOK_MEM_READ) ||
|
|
||||||
HOOK_EXISTS(s->uc, UC_HOOK_MEM_READ_AFTER) ||
|
|
||||||
HOOK_EXISTS(s->uc, UC_HOOK_MEM_WRITE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
||||||
{
|
{
|
||||||
TCGMemOpIdx oi = lb->oi;
|
TCGMemOpIdx oi = lb->oi;
|
||||||
MemOp opc = get_memop(oi);
|
MemOp opc = get_memop(oi);
|
||||||
MemOp size = opc & MO_SIZE;
|
MemOp size = opc & MO_SIZE;
|
||||||
|
|
||||||
const int type = has_hookmem(s) ? R_AARCH64_JUMP26 : R_AARCH64_CONDBR19;
|
const int type = tcg_uc_has_hookmem(s) ? R_AARCH64_JUMP26 : R_AARCH64_CONDBR19;
|
||||||
if (!patch_reloc(lb->label_ptr[0], type, (intptr_t)s->code_ptr, 0)) {
|
if (!patch_reloc(lb->label_ptr[0], type, (intptr_t)s->code_ptr, 0)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1620,7 +1613,7 @@ static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
|||||||
MemOp opc = get_memop(oi);
|
MemOp opc = get_memop(oi);
|
||||||
MemOp size = opc & MO_SIZE;
|
MemOp size = opc & MO_SIZE;
|
||||||
|
|
||||||
const int type = has_hookmem(s) ? R_AARCH64_JUMP26 : R_AARCH64_CONDBR19;
|
const int type = tcg_uc_has_hookmem(s) ? R_AARCH64_JUMP26 : R_AARCH64_CONDBR19;
|
||||||
if (!patch_reloc(lb->label_ptr[0], type, (intptr_t)s->code_ptr, 0)) {
|
if (!patch_reloc(lb->label_ptr[0], type, (intptr_t)s->code_ptr, 0)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1721,7 +1714,7 @@ static void tcg_out_tlb_read(TCGContext *s, TCGReg addr_reg, MemOp opc,
|
|||||||
/* If not equal, we jump to the slow path. */
|
/* If not equal, we jump to the slow path. */
|
||||||
*label_ptr = s->code_ptr;
|
*label_ptr = s->code_ptr;
|
||||||
// Unicorn: fast path if hookmem is not enabled
|
// Unicorn: fast path if hookmem is not enabled
|
||||||
if (!has_hookmem(s))
|
if (!tcg_uc_has_hookmem(s))
|
||||||
tcg_out_insn(s, 3202, B_C, TCG_COND_NE, 0);
|
tcg_out_insn(s, 3202, B_C, TCG_COND_NE, 0);
|
||||||
else
|
else
|
||||||
tcg_out_insn(s, 3206, B, 0);
|
tcg_out_insn(s, 3206, B, 0);
|
||||||
|
@ -1679,13 +1679,6 @@ static void * const qemu_st_helpers[16] = {
|
|||||||
[MO_BEQ] = helper_be_stq_mmu,
|
[MO_BEQ] = helper_be_stq_mmu,
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline bool has_hookmem(TCGContext *s)
|
|
||||||
{
|
|
||||||
return HOOK_EXISTS(s->uc, UC_HOOK_MEM_READ) ||
|
|
||||||
HOOK_EXISTS(s->uc, UC_HOOK_MEM_READ_AFTER) ||
|
|
||||||
HOOK_EXISTS(s->uc, UC_HOOK_MEM_WRITE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Perform the TLB load and compare.
|
/* Perform the TLB load and compare.
|
||||||
|
|
||||||
Inputs:
|
Inputs:
|
||||||
@ -1770,7 +1763,7 @@ static inline void tcg_out_tlb_load(TCGContext *s, TCGReg addrlo, TCGReg addrhi,
|
|||||||
tcg_out_mov(s, ttype, r1, addrlo);
|
tcg_out_mov(s, ttype, r1, addrlo);
|
||||||
|
|
||||||
// Unicorn: fast path if hookmem is not enable
|
// Unicorn: fast path if hookmem is not enable
|
||||||
if (!has_hookmem(s))
|
if (!tcg_uc_has_hookmem(s))
|
||||||
tcg_out_opc(s, OPC_JCC_long + JCC_JNE, 0, 0, 0);
|
tcg_out_opc(s, OPC_JCC_long + JCC_JNE, 0, 0, 0);
|
||||||
else
|
else
|
||||||
/* slow_path, so data access will go via load_helper() */
|
/* slow_path, so data access will go via load_helper() */
|
||||||
|
@ -2008,20 +2008,13 @@ static void add_qemu_ldst_label(TCGContext *s, bool is_ld, TCGMemOpIdx oi,
|
|||||||
label->label_ptr[0] = lptr;
|
label->label_ptr[0] = lptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool has_hookmem(TCGContext *s)
|
|
||||||
{
|
|
||||||
return HOOK_EXISTS(s->uc, UC_HOOK_MEM_READ) ||
|
|
||||||
HOOK_EXISTS(s->uc, UC_HOOK_MEM_READ_AFTER) ||
|
|
||||||
HOOK_EXISTS(s->uc, UC_HOOK_MEM_WRITE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
||||||
{
|
{
|
||||||
TCGMemOpIdx oi = lb->oi;
|
TCGMemOpIdx oi = lb->oi;
|
||||||
MemOp opc = get_memop(oi);
|
MemOp opc = get_memop(oi);
|
||||||
TCGReg hi, lo, arg = TCG_REG_R3;
|
TCGReg hi, lo, arg = TCG_REG_R3;
|
||||||
|
|
||||||
const int type = has_hookmem(s) ? R_PPC_REL24 : R_PPC_REL14;
|
const int type = tcg_uc_has_hookmem(s) ? R_PPC_REL24 : R_PPC_REL14;
|
||||||
if (!patch_reloc(lb->label_ptr[0], type, (intptr_t)s->code_ptr, 0)) {
|
if (!patch_reloc(lb->label_ptr[0], type, (intptr_t)s->code_ptr, 0)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2070,7 +2063,7 @@ static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
|
|||||||
MemOp s_bits = opc & MO_SIZE;
|
MemOp s_bits = opc & MO_SIZE;
|
||||||
TCGReg hi, lo, arg = TCG_REG_R3;
|
TCGReg hi, lo, arg = TCG_REG_R3;
|
||||||
|
|
||||||
const int type = has_hookmem(s) ? R_PPC_REL24 : R_PPC_REL14;
|
const int type = tcg_uc_has_hookmem(s) ? R_PPC_REL24 : R_PPC_REL14;
|
||||||
if (!patch_reloc(lb->label_ptr[0], type, (intptr_t)s->code_ptr, 0)) {
|
if (!patch_reloc(lb->label_ptr[0], type, (intptr_t)s->code_ptr, 0)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2152,7 +2145,7 @@ static void tcg_out_qemu_ld(TCGContext *s, const TCGArg *args, bool is_64)
|
|||||||
/* Load a pointer into the current opcode w/conditional branch-link. */
|
/* Load a pointer into the current opcode w/conditional branch-link. */
|
||||||
label_ptr = s->code_ptr;
|
label_ptr = s->code_ptr;
|
||||||
// Unicorn: fast path if hookmem is not enabled
|
// Unicorn: fast path if hookmem is not enabled
|
||||||
if (!has_hookmem(s))
|
if (!tcg_uc_has_hookmem(s))
|
||||||
tcg_out32(s, BC | BI(7, CR_EQ) | BO_COND_FALSE | LK);
|
tcg_out32(s, BC | BI(7, CR_EQ) | BO_COND_FALSE | LK);
|
||||||
else
|
else
|
||||||
tcg_out32(s, B | LK);
|
tcg_out32(s, B | LK);
|
||||||
@ -2231,7 +2224,7 @@ static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, bool is_64)
|
|||||||
/* Load a pointer into the current opcode w/conditional branch-link. */
|
/* Load a pointer into the current opcode w/conditional branch-link. */
|
||||||
label_ptr = s->code_ptr;
|
label_ptr = s->code_ptr;
|
||||||
// Unicorn: fast path if hookmem is not enabled
|
// Unicorn: fast path if hookmem is not enabled
|
||||||
if (!has_hookmem(s))
|
if (!tcg_uc_has_hookmem(s))
|
||||||
tcg_out32(s, BC | BI(7, CR_EQ) | BO_COND_FALSE | LK);
|
tcg_out32(s, BC | BI(7, CR_EQ) | BO_COND_FALSE | LK);
|
||||||
else
|
else
|
||||||
tcg_out32(s, B | LK);
|
tcg_out32(s, B | LK);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user