Resume after hang (with warning)

This commit is contained in:
Toby Jaffey 2025-12-08 21:19:59 +00:00
parent 41a94d0629
commit de689bdeaf

View file

@ -133,16 +133,21 @@ void hexdump(const uint8_t *p, int len) {
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
uvm32_state_t vmst; uvm32_state_t vmst;
uint32_t max_instrs_per_run = 500000;
clock_t start_time = clock() / (CLOCKS_PER_SEC / 1000); clock_t start_time = clock() / (CLOCKS_PER_SEC / 1000);
argc--; argc--;
argv++; argv++;
if (argc < 1) { if (argc < 1) {
printf("<romfile>\n"); printf("<romfile> [max_instrs_per_run]\n");
return 1; return 1;
} }
if (argc > 1) {
max_instrs_per_run = strtoll(argv[1], NULL, 10);
}
int romlen = 0; int romlen = 0;
uint8_t *rom = read_file(argv[0], &romlen); uint8_t *rom = read_file(argv[0], &romlen);
if (NULL == rom) { if (NULL == rom) {
@ -165,7 +170,7 @@ int main(int argc, char *argv[]) {
enableRawMode(); enableRawMode();
while(isrunning) { while(isrunning) {
total_instrs += uvm32_run(&vmst, &evt, 1000000); // num instructions before vm considered hung total_instrs += uvm32_run(&vmst, &evt, max_instrs_per_run); // num instructions before vm considered hung
num_syscalls++; num_syscalls++;
switch(evt.typ) { switch(evt.typ) {
@ -179,7 +184,11 @@ int main(int argc, char *argv[]) {
break; break;
case UVM32_EVT_ERR: case UVM32_EVT_ERR:
printf("UVM32_EVT_ERR '%s' (%d)\n", evt.data.err.errstr, (int)evt.data.err.errcode); printf("UVM32_EVT_ERR '%s' (%d)\n", evt.data.err.errstr, (int)evt.data.err.errcode);
isrunning = false; if (evt.data.err.errcode == UVM32_ERR_HUNG) {
printf("VM may have hung, increase max_instrs_per_run\n");
} else {
isrunning = false;
}
break; break;
case UVM32_EVT_SYSCALL: case UVM32_EVT_SYSCALL:
switch((f_code_t)evt.data.syscall.code) { switch((f_code_t)evt.data.syscall.code) {
@ -190,7 +199,7 @@ int main(int argc, char *argv[]) {
printf("%.*s\n", evt.data.syscall.val.buf.len, evt.data.syscall.val.buf.ptr); printf("%.*s\n", evt.data.syscall.val.buf.len, evt.data.syscall.val.buf.ptr);
break; break;
case F_PRINTDEC: case F_PRINTDEC:
printf("%d\n", evt.data.syscall.val.u32); printf("%d", evt.data.syscall.val.u32);
break; break;
case F_PUTC: case F_PUTC:
printf("%c", evt.data.syscall.val.u32); printf("%c", evt.data.syscall.val.u32);