From 7031207afb0e48d6c31055c2c5b2d68bdc9fa3a0 Mon Sep 17 00:00:00 2001 From: julianb0 Date: Thu, 16 May 2019 16:57:59 +0200 Subject: [PATCH] memory, stack, dumping --- instr/INSTRS | 5 +++++ instr/instrs.c | 30 ++++++++++++++++++++++++++++++ karch/arch.h | 1 + karch/main.c | 8 ++++++-- 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/instr/INSTRS b/instr/INSTRS index bd2cb95..8720789 100644 --- a/instr/INSTRS +++ b/instr/INSTRS @@ -45,6 +45,11 @@ xchg r m xchg m r xchg m i +push i +push r + +pop r + cli sti diff --git a/instr/instrs.c b/instr/instrs.c index 94043c6..f006d3b 100644 --- a/instr/instrs.c +++ b/instr/instrs.c @@ -83,6 +83,36 @@ IMPL_START_2(xchg) } IMPL_OUT; +IMPL_START_1(push) +{ + 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, v1, ctx->r[RSP]); + ctx->r[RSP].val -= 8; +} +IMPL_END; + +IMPL_START_1(pop) +{ + 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"); + } + + v1 = readmem64(ctx, ctx->r[RSP]); + ctx->r[RSP].val += 8; +} +IMPL_OUT; + IMPL_START_0(cli) { CHK_SUPERV(); diff --git a/karch/arch.h b/karch/arch.h index d99c48e..29d87b0 100644 --- a/karch/arch.h +++ b/karch/arch.h @@ -106,6 +106,7 @@ enum E_ACC, // Invalid access E_SYS, // Supervisor only E_ALI, // Alignment error + E_STK, // Stack error NEXCPTS }; diff --git a/karch/main.c b/karch/main.c index ecf0fb5..ab3e5ab 100644 --- a/karch/main.c +++ b/karch/main.c @@ -7,11 +7,15 @@ 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_MOV_M_I, A_MEM, RBP, A_IMM16, 0xAC, I_SUB_R_I, RBP, A_IMM16, 8, I_ADD_M_R, A_OFF, 8, RBP, RSP, - I_MOV_R_M, RAX, A_MEM, RBP, + I_MOV_R_M, RAX, A_MEM, RBP, +*/ }; ushort bget(ctx_t *ctx)