it's a trap!

This commit is contained in:
julianb0 2019-07-09 21:02:26 +02:00
parent e6d0c9ec20
commit 622fcdfde7
No known key found for this signature in database
GPG Key ID: DDF8325C95299A62
6 changed files with 29 additions and 71 deletions

View File

@ -13,7 +13,6 @@
GETV(v, p)
#define GETV(v, p) \
assert(p); \
if (ACC_FMT_IS_MEM(p->type)) \
v = readmem(ctx, p->addr, p->mlen); \
else v = p->val
@ -23,7 +22,6 @@
GETVZX(v, p)
#define GETVZX(v, p) \
assert(p); \
if (ACC_FMT_IS_MEM(p->type)) \
v = readmemzx(ctx, p->addr, p->mlen); \
else v = p->val
@ -31,36 +29,25 @@
//----------------------------------------------------------------------------//
#define IMPL_START_0(name) \
bool i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2, acc_t *p3, \
uint i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2, acc_t *p3, \
ulong *r1, ulong *r2, ulong *r3) \
{
#define IMPL_START_1(name) \
bool i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2, acc_t *p3, \
ulong *r1, ulong *r2, ulong *r3) \
{ \
IMPL_START_0(name) \
DECV(v1, p1);
#define IMPL_START_2(name) \
bool i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2, acc_t *p3, \
ulong *r1, ulong *r2, ulong *r3) \
{ \
DECV(v1, p1); \
IMPL_START_1(name) \
DECV(v2, p2);
#define IMPL_START_2_ONLY(name) \
bool i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2, acc_t *p3, \
ulong *r1, ulong *r2, ulong *r3) \
{ \
ulong v1; (void)v1; \
IMPL_START_0(name) \
ulong v1; \
DECV(v2, p2);
#define IMPL_START_3(name) \
bool i_##name(ctx_t *ctx, acc_t *p1, acc_t *p2, acc_t *p3, \
ulong *r1, ulong *r2, ulong *r3) \
{ \
DECV(v1, p1); \
DECV(v2, p2); \
IMPL_START_2(name) \
DECV(v3, p3);
//----------------------------------------------------------------------------//

View File

@ -77,7 +77,7 @@ struct instr_t
uint prm2;
uint prm3;
bool (*func)(ctx_t *, acc_t *, acc_t *, acc_t *,
uint (*func)(ctx_t *, acc_t *, acc_t *, acc_t *,
ulong *, ulong *, ulong *);
};

View File

@ -12,15 +12,15 @@ void _except(ctx_t *ctx, int _code, char *fmt, ...)
uint code = _code;
uint effcode;
ulong orig_frame, orig_rpc, orig_rip;
ulong orig_frame;
logerr("\nException %u - ", code);
trace("\nException %u - ", code);
va_start(ap, fmt);
vlog(fmt, ap);
va_end(ap);
logerr("\n\n");
trace("\n\n");
//
// Interrupted earlier?
@ -44,7 +44,7 @@ void _except(ctx_t *ctx, int _code, char *fmt, ...)
if (code == E_DBF)
effcode = E_DBF;
if (code < 512)
else if (code < 512)
effcode = 0;
else if (code < 768)
@ -83,8 +83,6 @@ void _except(ctx_t *ctx, int _code, char *fmt, ...)
if (rfs[handler] != NULL)
{
orig_frame = rfs_current_idx;
orig_rpc = rpc;
orig_rip = rip;
ctx->rf = rfs[handler];
rfs_current_idx = handler;
@ -94,8 +92,6 @@ void _except(ctx_t *ctx, int _code, char *fmt, ...)
R(R11) = effcode;
R(R12) = orig_frame;
R(R13) = rip;
R(R14) = orig_rpc;
R(R15) = orig_rip;
idt_handling[effcode]++;

View File

@ -53,7 +53,7 @@ void exec_instr(ctx_t *ctx,
bool lock,
bool rep)
{
bool out;
uint out;
ulong r1 = 0, r2 = 0, r3 = 0;
// Global instruction counter
@ -78,49 +78,22 @@ do_rep:
out = in->func(ctx, p1, p2, p3, &r1, &r2, &r3);
#define OUTPUT(p, r) { \
if (p->type == A_REG) \
R(p->reg) = r1; \
else if (p1->type == A_IMM64) \
_except(ctx, E_ACC, "Trying to output to an IMM64"); \
else { \
assert(ACC_IS_MEM(p)); \
writemem(ctx, r, p->addr, p->mlen); \
} }
if (out)
{
if (p1->type == A_REG)
R(p1->reg) = r1;
else if (p1->type == A_IMM64)
_except(ctx, E_ACC, "Trying to output to an IMM64");
else
{
assert(ACC_IS_MEM(p1));
writemem(ctx, r1, p1->addr, p1->mlen);
}
}
if (out >= 2)
{
if (p2->type == A_REG)
R(p2->reg) = r2;
else if (p2->type == A_IMM64)
_except(ctx, E_ACC, "Trying to output to an IMM64");
else
{
assert(ACC_IS_MEM(p2));
writemem(ctx, r2, p2->addr, p2->mlen);
}
}
if (out >= 3)
{
if (p3->type == A_REG)
R(p3->reg) = r3;
else if (p3->type == A_IMM64)
_except(ctx, E_ACC, "Trying to output to an IMM64");
else
{
assert(ACC_IS_MEM(p3));
writemem(ctx, r3, p3->addr, p3->mlen);
}
OUTPUT(p1, r1);
if (out >= 2) OUTPUT(p2, r2);
if (out >= 3) OUTPUT(p3, r3);
}
if (rep)

View File

@ -25,6 +25,6 @@ void logerr(const char *fmt, ...)
void vlog(const char *fmt, va_list ap)
{
vfprintf(stderr, fmt, ap);
vfprintf(stdout, fmt, ap);
}

View File

@ -55,6 +55,8 @@ jmp_buf exc_jmp_buf;
//
void main_loop(void)
{
trace("\n\n\n");
setjmp(exc_jmp_buf);
//