// The OS/K Team licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #include #include #include #include #define FWPROGSIZE (1024 * 1024 * 1024) static ssize_t fwsize; static ushort *fwprog; ushort bget(ctx_t *ctx) { ulong addr = R(RIP) + R(CR1); if (addr2real(addr) >= ctx->mz) { _except(ctx, E_ACC, "Executing out of memory: " "rip=0x%lX cr1=0x%lX", R(RIP), R(RIP)); } ushort c = ctx->mp[addr2real(addr)]; R(RIP) += 2; return c; } ctx_t main_ctx; void sigcommon(void) { _except(&main_ctx, E_BRK, "SIGNAL'ed"); } void sigint(int _) { sigcommon(); } void sigsegv(int _) { logerr("Segmentation fault\n"); sigcommon(); } jmp_buf exc_jmp_buf; // // Main loop // void main_loop(void) { if (main_ctx.dumpsw) trace("\n\n\n"); setjmp(exc_jmp_buf); // // Start decoding // while (!dying) { // Execute one instruction decode(&main_ctx); console_update(&main_ctx); } die(0); } int main(int argc, char **argv) { FILE *fwfile; main_ctx.r = arch_r; main_ctx.i = arch_i; #if 0 && defined(NDEBUG) main_ctx.dumpsw = 1; #endif // // srand // struct timeval time; gettimeofday(&time, NULL); srandom((time.tv_sec * 1000) + (time.tv_usec / 1000)); // // Signal handling // signal(SIGINT, sigint); signal(SIGBUS, sigsegv); signal(SIGSEGV, sigsegv); // // Load program // if (argc < 3) { logerr("Not enough arguments\n"); exit(-3); } create_symtab(argv[2]); fwfile = fopen(argv[1], "rb"); if (!fwfile) { logerr("Couldn't open program file\n"); exit(-2); } fwprog = malloc(FWPROGSIZE); if (!fwprog) { logerr("Couldn't allocate firmware buffer\n"); exit(-1); } fwsize = fread(fwprog, 1, FWPROGSIZE, fwfile); if (fwsize < 2) { logerr("Program file too small or empty\n"); free(fwprog); exit(-3); } fclose(fwfile); // // Register frame allocation // main_ctx.rf = calloc(NREGS, sizeof(ulong)); // // Memory allocation // main_ctx.mp = malloc(MEMSIZE + 16); main_ctx.mz = MEMSIZE; main_ctx.get = bget; main_ctx.rf[RIP] = MEMOFF; if (main_ctx.mp == 0) { logerr("Couldn't allocate RAM\n"); free(main_ctx.rf); free(fwprog); exit(-1); } memcpy(&main_ctx.mp[addr2real(main_ctx.rf[RIP])], fwprog, fwsize); // // Devices initialization // main_ctx.dh = 0; if (devinitall(&main_ctx) < 0) { logerr("Couldn't initialize devices\n"); free(main_ctx.rf); free(fwprog); exit(-10); } // To be moved to some screen device console_init(&main_ctx); main_loop(); }