/* spc_vm.c launcher for stage 1 */ #include "../stage0/spl_mcode.h" #include "../stage0/spl_syscall.h" #include "../stage0/spl_vm.h" #include #include int main(int argc, const char **argv) { int argi = 1; /* Parse flags: --entry , --trace, -d */ const char *entry = "main"; int trace = 0; int debug_addr = 0; for (int i = argi; i < argc; i += 1) { if (strcmp(argv[i], "--entry") == 0 && i + 1 < argc) { entry = argv[++i]; } else if (strcmp(argv[i], "--trace") == 0) { trace = 1; } else if (strcmp(argv[i], "-d") == 0) { debug_addr = 1; } else if (argv[i][0] != '-') { argi = i; break; } } if (argi >= argc) { fprintf(stderr, "Usage: spc_vm [-d] [--trace] [args...]\n"); return 1; } const char *path = argv[argi++]; const char **spl_argv = argv + (argi - 1); int spl_argc = (int)(argc - (argi - 1)); spl_prog_t prog; if (spl_prog_load_from_file(path, &prog) != 0) { fprintf(stderr, "spc_vm: cannot load '%s'\n", path); return 1; } spl_syscall_register(&prog); spl_vm_t vm; spl_vm_init(&vm); if (spl_vm_load_prog(&vm, &prog) != 0) { fprintf(stderr, "vm: prog '%s' not found\n", entry); spl_prog_drop(&prog); return 1; } if (spl_vm_prepare(&vm, entry, spl_argc, spl_argv, NULL) != 0) { fprintf(stderr, "vm: entry point '%s' not found\n", entry); spl_prog_drop(&prog); return 1; } spl_vm_set_trace(&vm, trace); if (debug_addr) spl_vm_set_debug(&vm, 1); int ret = spl_vm_run_until(&vm, 0); spl_vm_drop(&vm); spl_prog_drop(&prog); return (int)vm.exit_code; }