mirror of
https://github.com/ish-app/ish.git
synced 2026-02-01 14:32:26 +00:00
Make more types of block exits patchable
This commit is contained in:
parent
e394c50110
commit
bfa4bc056e
18
jit/gen.c
18
jit/gen.c
@ -216,22 +216,18 @@ static inline bool gen_op(struct gen_state *state, gadget_t *gadgets, enum arg a
|
||||
|
||||
#define fake_ip (state->ip | (1ul << 63))
|
||||
|
||||
// jmp to
|
||||
// jcxz to else
|
||||
// jmp_cc to else
|
||||
// call here to from
|
||||
#define jump_ips(off1, off2) \
|
||||
state->jump_ip[0] = state->size + off1; \
|
||||
if (off2 != 0) \
|
||||
state->jump_ip[1] = state->size + off2
|
||||
#define JMP(loc) load(loc, OP_SIZE); g(jmp_indir); end_block = true
|
||||
#define JMP_REL(off) gg(jmp, fake_ip + off); end_block = true
|
||||
#define JMP_REL(off) gg(jmp, fake_ip + off); jump_ips(-1, 0); end_block = true
|
||||
#define JCXZ_REL(off) ggg(jcxz, fake_ip + off, fake_ip); end_block = true
|
||||
#define jcc(cc, to, else) \
|
||||
gagg(jmp, cond_##cc, to, else); \
|
||||
state->jump_ip[0] = state->size - 2; /* to */\
|
||||
state->jump_ip[1] = state->size - 1; /* else */\
|
||||
end_block = true
|
||||
#define jcc(cc, to, else) gagg(jmp, cond_##cc, to, else); jump_ips(-2, -1); end_block = true
|
||||
#define J_REL(cc, off) jcc(cc, fake_ip + off, fake_ip)
|
||||
#define JN_REL(cc, off) jcc(cc, fake_ip, fake_ip + off)
|
||||
#define CALL(loc) load(loc, OP_SIZE); ggg(call_indir, saved_ip, fake_ip); end_block = true
|
||||
#define CALL_REL(off) gggg(call, saved_ip, fake_ip + off, fake_ip); end_block = true
|
||||
#define CALL_REL(off) gggg(call, saved_ip, fake_ip + off, fake_ip); jump_ips(-2, 0); end_block = true
|
||||
#define RET_NEAR(imm) ggg(ret, saved_ip, 4 + imm); end_block = true
|
||||
#define INT(code) gg_here(interrupt, (uint8_t) code); end_block = true
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user