mirror of
https://gitlab.os-k.eu/os-k-team/kvisc.git
synced 2023-08-25 14:05:46 +02:00
it's a trap!
This commit is contained in:
parent
e6d0c9ec20
commit
622fcdfde7
@ -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);
|
||||
|
||||
//----------------------------------------------------------------------------//
|
||||
|
@ -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 *);
|
||||
};
|
||||
|
||||
|
@ -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]++;
|
||||
|
||||
|
57
vm/pc/exec.c
57
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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -55,6 +55,8 @@ jmp_buf exc_jmp_buf;
|
||||
//
|
||||
void main_loop(void)
|
||||
{
|
||||
trace("\n\n\n");
|
||||
|
||||
setjmp(exc_jmp_buf);
|
||||
|
||||
//
|
||||
|
Loading…
Reference in New Issue
Block a user