// The OS/K Team licences this file to you under the MIT license. // See the LICENSE file in the project root for more information. #include "arch.h" // Boot firware, loaded at MEMOFF (1MB) 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_CALL_I, A_IMM32, (MEMOFF+0x13)>>16, (MEMOFF+0x13)&0xFF, I_ADD_R_I, RAX, A_IMM16, 1, I_STOP, I_ADD_R_I, RBX, A_IMM16, 1, I_RET, }; ushort bget(ctx_t *ctx) { if (addr2real(ctx->r[RIP].val) >= ctx->mz) { _except(ctx, E_ACC, "Executing out of memory: 0x%016lX", ctx->r[RIP].val); } ushort c = ctx->mp[addr2real(ctx->r[RIP].val)]; ctx->r[RIP].val++; return c; } ushort dget(ctx_t *ctx) { static int i = 0; if (i >= sizeof(fwprog)/2) { log("Finished disassembling\n"); fclose(ctx->disf); exit(0); } ctx->r[RIP].val += 2; return fwprog[i++]; } extern reg_t arch_r[NREGS]; extern instr_t arch_i[NINSTRS]; int main(int argc, char **argv) { ctx_t main_ctx; main_ctx.r = arch_r; main_ctx.i = arch_i; // Execute firmware if (!(argc > 1 && !strcmp(argv[1], "-d"))) { main_ctx.mp = malloc(MEMSIZE); main_ctx.mz = MEMSIZE; main_ctx.get = bget; main_ctx.disf = NULL; main_ctx.r[RIP].val = MEMOFF; if (main_ctx.mp == 0) { log("Couldn't allocate RAM\n"); exit(-1); } memcpy(&main_ctx.mp[addr2real(main_ctx.r[RIP].val)], fwprog, sizeof(fwprog)); while (1) { decode(&main_ctx); } } // Disassembly else { main_ctx.disf = fopen("fwprog.dis", "w"); if (main_ctx.disf == NULL) { log("Couldn't open fwprog.dis\n"); exit(-2); } main_ctx.mp = NULL; main_ctx.mz = 0; main_ctx.get = dget; while (1) { disasm(&main_ctx); } } return 0; }