102 lines
2.0 KiB
C
102 lines
2.0 KiB
C
// 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;
|
|
}
|
|
|