diff --git a/vm/in/instrs.h b/vm/in/instrs.h index d7d32c4..d5762e0 100644 --- a/vm/in/instrs.h +++ b/vm/in/instrs.h @@ -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); //----------------------------------------------------------------------------// diff --git a/vm/pc/decode.h b/vm/pc/decode.h index 5b42a39..313ccd0 100644 --- a/vm/pc/decode.h +++ b/vm/pc/decode.h @@ -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 *); }; diff --git a/vm/pc/except.c b/vm/pc/except.c index 60280b7..1a9f2ab 100644 --- a/vm/pc/except.c +++ b/vm/pc/except.c @@ -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]++; diff --git a/vm/pc/exec.c b/vm/pc/exec.c index e7babd6..c3fa7ba 100644 --- a/vm/pc/exec.c +++ b/vm/pc/exec.c @@ -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) diff --git a/vm/pc/log.c b/vm/pc/log.c index fdd28bb..5c7a7ec 100644 --- a/vm/pc/log.c +++ b/vm/pc/log.c @@ -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); } diff --git a/vm/pc/main.c b/vm/pc/main.c index 7a3bc4a..1510bbd 100644 --- a/vm/pc/main.c +++ b/vm/pc/main.c @@ -55,6 +55,8 @@ jmp_buf exc_jmp_buf; // void main_loop(void) { + trace("\n\n\n"); + setjmp(exc_jmp_buf); //