#include <defs.h>
|
|
#include <stdio.h>
|
|
#include <intr.h>
|
|
#include <kmonitor.h>
|
|
|
|
static bool is_panic = 0;
|
|
|
|
/* *
|
|
* __panic - __panic is called on unresolvable fatal errors. it prints
|
|
* "panic: 'message'", and then enters the kernel monitor.
|
|
* */
|
|
void
|
|
__panic(const char *file, int line, const char *fmt, ...) {
|
|
if (is_panic) {
|
|
goto panic_dead;
|
|
}
|
|
is_panic = 1;
|
|
|
|
// print the 'message'
|
|
va_list ap;
|
|
va_start(ap, fmt);
|
|
cprintf("kernel panic at %s:%d:\n ", file, line);
|
|
vcprintf(fmt, ap);
|
|
cprintf("\n");
|
|
va_end(ap);
|
|
|
|
panic_dead:
|
|
intr_disable();
|
|
while (1) {
|
|
kmonitor(NULL);
|
|
}
|
|
}
|
|
|
|
/* __warn - like panic, but don't */
|
|
void
|
|
__warn(const char *file, int line, const char *fmt, ...) {
|
|
va_list ap;
|
|
va_start(ap, fmt);
|
|
cprintf("kernel warning at %s:%d:\n ", file, line);
|
|
vcprintf(fmt, ap);
|
|
cprintf("\n");
|
|
va_end(ap);
|
|
}
|
|
|
|
bool
|
|
is_kernel_panic(void) {
|
|
return is_panic;
|
|
}
|
|
|