Make more types of block exits patchable

This commit is contained in:
Theodore Dubois 2018-06-17 14:45:09 -07:00
parent e394c50110
commit bfa4bc056e

View File

@ -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