diff options
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_exit.c | 3 | ||||
-rw-r--r-- | sys/kern/kern_panic.c | 27 | ||||
-rw-r--r-- | sys/kern/kern_sched.c | 3 | ||||
-rw-r--r-- | sys/kern/kern_time.c | 3 |
4 files changed, 29 insertions, 7 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index b1bd9ba..2c9e2e4 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -33,6 +33,7 @@ #include <sys/panic.h> #include <sys/filedesc.h> #include <sys/vnode.h> +#include <dev/cons/cons.h> #include <vm/physmem.h> #include <vm/dynalloc.h> #include <vm/vm.h> @@ -89,6 +90,8 @@ proc_reap(struct proc *td) vaddr_t stack_va; paddr_t stack_pa; + cons_detach(); + /* Clear out all fds */ for (size_t i = 4; i < PROC_MAX_FILEDES; ++i) { fdp = td->fds[i]; diff --git a/sys/kern/kern_panic.c b/sys/kern/kern_panic.c index 099f620..13b4964 100644 --- a/sys/kern/kern_panic.c +++ b/sys/kern/kern_panic.c @@ -34,6 +34,22 @@ #include <dev/cons/cons.h> #include <machine/cdefs.h> #include <machine/cpu.h> +#include <string.h> + +#if defined(__PANIC_SCR) +#define PANIC_SCR __PANIC_SCR +#else +#define PANIC_SCR 0 +#endif + +static void +panic_puts(const char *str) +{ + size_t len; + + len = strlen(str); + cons_putstr(&g_root_scr, str, len); +} /* * Burn and sizzle - the core logic that really ends @@ -50,11 +66,11 @@ bas(bool do_trace, int reboot_type) spinlock_acquire(&lock); /* Never released */ if (do_trace) { - kprintf(OMIT_TIMESTAMP "** backtrace\n"); + panic_puts(" ** backtrace\n"); md_backtrace(); } - kprintf(OMIT_TIMESTAMP "\n-- ALL CORES HAVE BEEN HALTED --\n"); + panic_puts("\n-- ALL CORES HAVE BEEN HALTED --\n"); cpu_reboot(reboot_type); __builtin_unreachable(); } @@ -76,7 +92,8 @@ static void do_panic(const char *fmt, va_list *ap) { syslog_silence(false); - kprintf(OMIT_TIMESTAMP "panic: "); + spinlock_release(&g_root_scr.lock); + panic_puts("panic: "); vkprintf(fmt, ap); bas(true, REBOOT_HALT); @@ -101,7 +118,9 @@ panic(const char *fmt, ...) md_intoff(); cpu_halt_others(); - panic_screen(); + if (PANIC_SCR) { + panic_screen(); + } va_start(ap, fmt); do_panic(fmt, &ap); __builtin_unreachable(); diff --git a/sys/kern/kern_sched.c b/sys/kern/kern_sched.c index 774ba71..24806db 100644 --- a/sys/kern/kern_sched.c +++ b/sys/kern/kern_sched.c @@ -159,6 +159,9 @@ this_td(void) struct cpu_info *ci; ci = this_cpu(); + if (ci == NULL) { + return NULL; + } return ci->curtd; } diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c index 102648c..e741157 100644 --- a/sys/kern/kern_time.c +++ b/sys/kern/kern_time.c @@ -68,9 +68,6 @@ sys_sleep(struct syscall_args *scargs) timeout_msec = ts.tv_nsec / 1000000; timeout_msec += ts.tv_sec * 1000; - - md_inton(); tmr.msleep(timeout_msec); - md_intoff(); return 0; } |