2019-05-30 12:44:56 +02:00
|
|
|
// The OS/K Team licenses this file to you under the MIT license.
|
2019-05-15 21:56:42 +02:00
|
|
|
// See the LICENSE file in the project root for more information.
|
2019-05-15 19:26:40 +02:00
|
|
|
|
2019-06-05 19:31:48 +02:00
|
|
|
#include <dv/dev.h>
|
|
|
|
#include <sys/time.h>
|
2019-06-05 22:59:32 +02:00
|
|
|
#include <termio.h>
|
2019-05-15 19:26:40 +02:00
|
|
|
|
2019-05-22 18:39:46 +02:00
|
|
|
#define FWPROGSIZE (1024 * 1024 * 1024)
|
|
|
|
static ssize_t fwsize;
|
|
|
|
static ushort *fwprog;
|
2019-05-15 19:26:40 +02:00
|
|
|
|
|
|
|
ushort bget(ctx_t *ctx)
|
|
|
|
{
|
2019-06-02 16:33:28 +02:00
|
|
|
if (rip % 2) {
|
2019-05-22 18:39:46 +02:00
|
|
|
_except(ctx, E_ALI, "Misaligned RIP register: 0x%016lX",
|
2019-06-02 16:33:28 +02:00
|
|
|
rip);
|
2019-05-22 18:39:46 +02:00
|
|
|
}
|
|
|
|
|
2019-06-02 16:33:28 +02:00
|
|
|
if (addr2real(rip) >= ctx->mz) {
|
2019-05-16 18:45:00 +02:00
|
|
|
_except(ctx, E_ACC, "Executing out of memory: 0x%016lX",
|
2019-06-02 16:33:28 +02:00
|
|
|
rip);
|
2019-05-15 19:26:40 +02:00
|
|
|
}
|
2019-05-29 16:57:22 +02:00
|
|
|
|
2019-06-02 16:33:28 +02:00
|
|
|
ushort c = ctx->mp[addr2real(rip)];
|
2019-05-30 12:44:56 +02:00
|
|
|
|
2019-06-02 16:33:28 +02:00
|
|
|
rip += 2;
|
2019-05-30 12:44:56 +02:00
|
|
|
|
2019-05-16 10:03:01 +02:00
|
|
|
return c;
|
2019-05-15 19:26:40 +02:00
|
|
|
}
|
|
|
|
|
2019-05-16 21:42:23 +02:00
|
|
|
ushort dget(ctx_t *ctx)
|
|
|
|
{
|
|
|
|
static int i = 0;
|
|
|
|
|
2019-05-22 18:39:46 +02:00
|
|
|
if (i >= fwsize) {
|
2019-05-16 21:42:23 +02:00
|
|
|
log("Finished disassembling\n");
|
|
|
|
fclose(ctx->disf);
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
2019-06-02 16:33:28 +02:00
|
|
|
rip += 2;
|
2019-05-16 21:42:23 +02:00
|
|
|
return fwprog[i++];
|
|
|
|
}
|
|
|
|
|
2019-06-05 19:31:48 +02:00
|
|
|
ctx_t main_ctx;
|
|
|
|
|
2019-06-05 22:59:32 +02:00
|
|
|
void sigint(int _)
|
|
|
|
{
|
|
|
|
//
|
|
|
|
// Enable stdin echoing
|
|
|
|
//
|
|
|
|
struct termios t;
|
|
|
|
tcgetattr(0, &t);
|
|
|
|
t.c_lflag |= ECHO;
|
|
|
|
tcsetattr(0, TCSANOW, &t);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Shut down devices
|
|
|
|
//
|
|
|
|
devfiniall(&main_ctx);
|
|
|
|
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
|
2019-05-16 21:42:23 +02:00
|
|
|
int main(int argc, char **argv)
|
2019-05-15 19:26:40 +02:00
|
|
|
{
|
2019-05-22 18:39:46 +02:00
|
|
|
FILE *fwfile;
|
2019-05-30 12:44:56 +02:00
|
|
|
|
2019-06-05 22:59:32 +02:00
|
|
|
main_ctx.r = arch_r;
|
|
|
|
main_ctx.i = arch_i;
|
2019-06-05 19:31:48 +02:00
|
|
|
|
2019-06-05 22:59:32 +02:00
|
|
|
//
|
|
|
|
// srand
|
|
|
|
//
|
|
|
|
struct timeval time;
|
2019-06-05 19:31:48 +02:00
|
|
|
gettimeofday(&time, NULL);
|
|
|
|
srandom((time.tv_sec * 1000) + (time.tv_usec / 1000));
|
|
|
|
|
2019-06-05 22:59:32 +02:00
|
|
|
//
|
|
|
|
// Disable stdin echoing
|
|
|
|
//
|
|
|
|
struct termios t;
|
|
|
|
tcgetattr(0, &t);
|
|
|
|
t.c_lflag &= ~ECHO;
|
|
|
|
tcsetattr(0, TCSANOW, &t);
|
|
|
|
|
|
|
|
//
|
|
|
|
// Signal handling
|
|
|
|
//
|
|
|
|
|
|
|
|
//
|
|
|
|
// Load program
|
|
|
|
//
|
2019-05-16 21:42:23 +02:00
|
|
|
|
2019-05-22 18:39:46 +02:00
|
|
|
if (argc < 2) {
|
|
|
|
log("Not enough arguments\n");
|
|
|
|
exit(-3);
|
|
|
|
}
|
2019-05-30 12:44:56 +02:00
|
|
|
|
2019-05-22 18:39:46 +02:00
|
|
|
fwprog = malloc(FWPROGSIZE);
|
|
|
|
fwfile = fopen(argv[1], "rb");
|
2019-05-30 12:44:56 +02:00
|
|
|
|
2019-05-22 18:39:46 +02:00
|
|
|
if (!fwprog) {
|
|
|
|
log("Couldn't allocate firmware buffer\n");
|
|
|
|
exit(-1);
|
|
|
|
}
|
2019-05-30 12:44:56 +02:00
|
|
|
|
2019-05-22 18:39:46 +02:00
|
|
|
if (!fwfile) {
|
|
|
|
log("Couldn't open program file\n");
|
|
|
|
exit(-2);
|
|
|
|
}
|
2019-05-30 12:44:56 +02:00
|
|
|
|
2019-05-22 18:39:46 +02:00
|
|
|
fwsize = fread(fwprog, 1, FWPROGSIZE, fwfile);
|
2019-05-30 12:44:56 +02:00
|
|
|
|
2019-05-22 18:39:46 +02:00
|
|
|
//log("Loaded %lu bytes
|
|
|
|
|
|
|
|
if (fwsize < 2) {
|
2019-05-30 18:31:50 +02:00
|
|
|
log("Program file too small or empty\n");
|
2019-05-22 18:39:46 +02:00
|
|
|
exit(-3);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(argc > 2 && !strcmp(argv[2], "-d"))) {
|
|
|
|
main_ctx.mp = malloc(MEMSIZE + 16);
|
2019-05-16 21:42:23 +02:00
|
|
|
main_ctx.mz = MEMSIZE;
|
2019-05-30 12:44:56 +02:00
|
|
|
|
2019-05-16 21:42:23 +02:00
|
|
|
main_ctx.get = bget;
|
|
|
|
main_ctx.disf = NULL;
|
2019-05-30 12:44:56 +02:00
|
|
|
|
2019-05-16 21:42:23 +02:00
|
|
|
main_ctx.r[RIP].val = MEMOFF;
|
2019-05-30 12:44:56 +02:00
|
|
|
|
2019-05-16 21:42:23 +02:00
|
|
|
if (main_ctx.mp == 0) {
|
|
|
|
log("Couldn't allocate RAM\n");
|
|
|
|
exit(-1);
|
|
|
|
}
|
2019-05-30 12:44:56 +02:00
|
|
|
|
|
|
|
memcpy(&main_ctx.mp[addr2real(main_ctx.r[RIP].val)], fwprog, fwsize);
|
|
|
|
|
2019-06-05 19:31:48 +02:00
|
|
|
main_ctx.dh = 0;
|
|
|
|
if (devinitall(&main_ctx) < 0) {
|
|
|
|
log("Couldn't initialize devices\n");
|
|
|
|
exit(-10);
|
|
|
|
}
|
|
|
|
|
2019-05-16 21:42:23 +02:00
|
|
|
while (1) {
|
|
|
|
decode(&main_ctx);
|
2019-06-05 22:59:32 +02:00
|
|
|
|
|
|
|
if (main_ctx.step)
|
|
|
|
getchar();
|
2019-05-16 21:42:23 +02:00
|
|
|
}
|
2019-05-16 10:03:01 +02:00
|
|
|
}
|
2019-05-15 19:26:40 +02:00
|
|
|
|
2019-05-16 21:42:23 +02:00
|
|
|
// Disassembly
|
|
|
|
else {
|
|
|
|
main_ctx.disf = fopen("fwprog.dis", "w");
|
2019-05-30 12:44:56 +02:00
|
|
|
|
2019-05-16 21:42:23 +02:00
|
|
|
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;
|
2019-05-30 12:44:56 +02:00
|
|
|
|
2019-05-16 21:42:23 +02:00
|
|
|
while (1) {
|
|
|
|
disasm(&main_ctx);
|
|
|
|
}
|
2019-05-15 19:26:40 +02:00
|
|
|
}
|
|
|
|
|
2019-05-16 21:42:23 +02:00
|
|
|
|
2019-05-15 19:26:40 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|