From fe465ec81d5f686147e47d9addd683b6ce28de3a Mon Sep 17 00:00:00 2001 From: julianb0 Date: Thu, 16 May 2019 17:11:22 +0200 Subject: [PATCH] stack and function calls --- instr/INSTRS | 6 ++++++ instr/instrs.c | 37 ++++++++++++++++++++++++++++++++++--- karch/decd.c | 1 + karch/main.c | 7 ++++++- 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/instr/INSTRS b/instr/INSTRS index 8720789..9e751ef 100644 --- a/instr/INSTRS +++ b/instr/INSTRS @@ -50,6 +50,12 @@ push r pop r +call r +call i +call m + +ret + cli sti diff --git a/instr/instrs.c b/instr/instrs.c index f006d3b..383b7d7 100644 --- a/instr/instrs.c +++ b/instr/instrs.c @@ -93,7 +93,7 @@ IMPL_START_1(push) _except(ctx, E_STK, "RSP above RBP"); } - writemem64(ctx, v1, ctx->r[RSP]); + writemem64(ctx, v1, ctx->r[RSP].val); ctx->r[RSP].val -= 8; } IMPL_END; @@ -107,12 +107,43 @@ IMPL_START_1(pop) if (ctx->r[RSP].val >= ctx->r[RBP].val) { _except(ctx, E_STK, "RBP above RSP"); } - - v1 = readmem64(ctx, ctx->r[RSP]); + ctx->r[RSP].val += 8; + v1 = readmem64(ctx, ctx->r[RSP].val); } IMPL_OUT; +IMPL_START_1(call) +{ + if (ctx->r[RSP].val % 8 > 0 || ctx->r[RBP].val % 8 > 0) { + _except(ctx, E_STK, "Misaligned stack REGS"); + } + + if (ctx->r[RSP].val > ctx->r[RBP].val) { + _except(ctx, E_STK, "RSP above RBP"); + } + + writemem64(ctx, ctx->r[RIP].val, ctx->r[RSP].val); + ctx->r[RSP].val -= 8; + ctx->r[RIP].val = v1; +} +IMPL_END; + +IMPL_START_0(ret) +{ + if (ctx->r[RSP].val % 8 > 0 || ctx->r[RBP].val % 8 > 0) { + _except(ctx, E_STK, "Misaligned stack REGS"); + } + + if (ctx->r[RSP].val >= ctx->r[RBP].val) { + _except(ctx, E_STK, "RBP above RSP"); + } + + ctx->r[RSP].val += 8; + ctx->r[RIP].val = readmem64(ctx, ctx->r[RSP].val); +} +IMPL_END; + IMPL_START_0(cli) { CHK_SUPERV(); diff --git a/karch/decd.c b/karch/decd.c index bf171d3..d0ee409 100644 --- a/karch/decd.c +++ b/karch/decd.c @@ -64,6 +64,7 @@ void decode(ctx_t *ctx) ushort c = ctx->get(ctx); if (c == 0xFFFF) { + log("0x%016lX: stop\n", rip); _except(ctx, E_SHT, "Shutdown INSTR"); } diff --git a/karch/main.c b/karch/main.c index ab3e5ab..472ebb3 100644 --- a/karch/main.c +++ b/karch/main.c @@ -8,7 +8,12 @@ ushort fwprog[] = { I_MOV_R_I, RBP, A_IMM32, FWSTACK>>16, FWSTACK&0xFF, I_MOV_R_I, RSP, A_IMM32, FWSTACK>>16, FWSTACK&0xFF, - I_PUSH_I, A_IMM16, 0xDDEE, + I_CALL_I, A_IMM32, (MEMOFF+0x13)>>16, (MEMOFF+0x13)&0xFF, + I_ADD_R_I, RAX, A_IMM16, 1, + 0xFFFF, + + I_ADD_R_I, RBX, A_IMM16, 1, + I_RET, /* I_MOV_M_I, A_MEM, RBP, A_IMM16, 0xAC,