From 5dd2193aee458c0356e25238eb60a4389b367adc Mon Sep 17 00:00:00 2001 From: Nathanne Isip Date: Tue, 20 Feb 2024 03:33:36 +0800 Subject: [PATCH] Improved virtual machine panic handler. --- src/rishka_errors.cpp | 6 +++--- src/rishka_errors.h | 3 ++- src/rishka_vm.cpp | 24 ++++++++++++------------ 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/rishka_errors.cpp b/src/rishka_errors.cpp index 8c5c955..7532a3c 100644 --- a/src/rishka_errors.cpp +++ b/src/rishka_errors.cpp @@ -28,12 +28,12 @@ void rishka_perror(const char* msg, uintptr_t len, bool flush) { } } -void rishka_panic(const char* message) { +void rishka_panic(const char* message, rishka_virtual_machine* vm) { size_t len = strlen(message); if(len > 0) rishka_perror(message, len, true); - while(true) - vTaskDelay(10); + vm->running = false; + vm->exitcode = -1; } \ No newline at end of file diff --git a/src/rishka_errors.h b/src/rishka_errors.h index f9f60f1..d5fa82c 100644 --- a/src/rishka_errors.h +++ b/src/rishka_errors.h @@ -19,8 +19,9 @@ #define RISHKA_ERRORS_H #include +#include void rishka_perror(const char* msg, uintptr_t len, bool flush); -void rishka_panic(const char* message); +void rishka_panic(const char* message, rishka_virtual_machine* vm); #endif \ No newline at end of file diff --git a/src/rishka_vm.cpp b/src/rishka_vm.cpp index 0b97330..62c8dc6 100644 --- a/src/rishka_vm.cpp +++ b/src/rishka_vm.cpp @@ -83,7 +83,7 @@ void rishka_vm_execute(rishka_virtual_machine* vm, uint32_t inst) { break; default: - rishka_panic("Invalid load instruction."); + rishka_panic("Invalid load instruction.", vm); break; } @@ -116,7 +116,7 @@ void rishka_vm_execute(rishka_virtual_machine* vm, uint32_t inst) { break; default: - rishka_panic("Invalid store instruction."); + rishka_panic("Invalid store instruction.", vm); break; } break; @@ -165,7 +165,7 @@ void rishka_vm_execute(rishka_virtual_machine* vm, uint32_t inst) { break; default: - rishka_panic("Invalid immediate shift instruction."); + rishka_panic("Invalid immediate shift instruction.", vm); break; } break; @@ -181,7 +181,7 @@ void rishka_vm_execute(rishka_virtual_machine* vm, uint32_t inst) { } default: - rishka_panic("Invalid immediate instruction."); + rishka_panic("Invalid immediate instruction.", vm); break; } @@ -218,7 +218,7 @@ void rishka_vm_execute(rishka_virtual_machine* vm, uint32_t inst) { break; default: - rishka_panic("Invalid immediate shift instruction."); + rishka_panic("Invalid immediate shift instruction.", vm); break; } @@ -226,7 +226,7 @@ void rishka_vm_execute(rishka_virtual_machine* vm, uint32_t inst) { } default: - rishka_panic("Invalid immediate instruction."); + rishka_panic("Invalid immediate instruction.", vm); break; } @@ -343,7 +343,7 @@ void rishka_vm_execute(rishka_virtual_machine* vm, uint32_t inst) { } default: - rishka_panic("Invalid arithmetic instruction."); + rishka_panic("Invalid arithmetic instruction.", vm); break; } @@ -426,7 +426,7 @@ void rishka_vm_execute(rishka_virtual_machine* vm, uint32_t inst) { } default: - rishka_panic("Invalid store doubleword instruction."); + rishka_panic("Invalid store doubleword instruction.", vm); break; } @@ -506,7 +506,7 @@ void rishka_vm_execute(rishka_virtual_machine* vm, uint32_t inst) { break; default: - rishka_panic("Invalid branch instruction."); + rishka_panic("Invalid branch instruction.", vm); break; } @@ -537,7 +537,7 @@ void rishka_vm_execute(rishka_virtual_machine* vm, uint32_t inst) { break; default: - rishka_panic("Invalid system instruction."); + rishka_panic("Invalid system instruction.", vm); break; } @@ -545,7 +545,7 @@ void rishka_vm_execute(rishka_virtual_machine* vm, uint32_t inst) { } default: - rishka_panic("Invalid opcode instruction."); + rishka_panic("Invalid opcode instruction.", vm); break; } @@ -633,7 +633,7 @@ uint64_t rishka_vm_handle_syscall(rishka_virtual_machine* vm, uint64_t code) { return (uint64_t) rishka_syscall_rt_strpass(); default: - rishka_panic("Invalid system call."); + rishka_panic("Invalid system call.", vm); break; }