diff options
Diffstat (limited to 'panic')
| -rw-r--r-- | panic/panic.c | 40 | ||||
| -rw-r--r-- | panic/panic.h | 16 |
2 files changed, 56 insertions, 0 deletions
diff --git a/panic/panic.c b/panic/panic.c new file mode 100644 index 0000000..5bde05b --- /dev/null +++ b/panic/panic.c @@ -0,0 +1,40 @@ +#include "panic.h" +#include "lib/printf.h" + +int _kernel_panic_unlock = 0; + +void +__panic_reason(const char *fmt, va_list ap) +{ + _kernel_panic_unlock = 1; + + kvprintf(fmt, ap); +} + +void +__panic_end(void) +{ + hcf(); +} + +void +kpanic(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + __panic_reason(fmt, ap); + __panic_stack_trace(__panic_get_bp()); + __panic_end(); +} + +void +kpanic_istate(void *state, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + __panic_reason(fmt, ap); + __panic_stack_trace(__panic_print_istate(state)); + __panic_end(); +} diff --git a/panic/panic.h b/panic/panic.h new file mode 100644 index 0000000..4ca4a40 --- /dev/null +++ b/panic/panic.h @@ -0,0 +1,16 @@ +#ifndef _JOVE_PANIC_H +#define _JOVE_PANIC_H 1 + +#include "jove.h" +#include <stdarg.h> + +void __panic_reason(const char *fmt, va_list ap); +void *__panic_print_istate(void *state); +void *__panic_get_bp(void); +void __panic_stack_trace(void *bp); +NORETURN void __panic_end(void); + +NORETURN void kpanic(const char *fmt, ...); +NORETURN void kpanic_istate(void *state, const char *fmt, ...); + +#endif |
