Add an escape hatch for "NMI-safer" printing

When debugging, I often want print a backtrace in NMI context.  That's
not particularly safe, and for the watchdog, hanging the machine is a
bad idea.

These dirty bools will let us skip the two locks *that I know about*
from the printing code paths.  Super brittle.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
diff --git a/kern/arch/x86/console.c b/kern/arch/x86/console.c
index 9c4bd5c..89099bf 100644
--- a/kern/arch/x86/console.c
+++ b/kern/arch/x86/console.c
@@ -252,6 +252,7 @@
 #define SCROLLING_CRT_SIZE	(MAX_SCROLL_LENGTH * CRT_SIZE)
 
 static spinlock_t console_lock = SPINLOCK_INITIALIZER_IRQSAVE;
+bool panic_skip_console_lock;
 
 static unsigned addr_6845;
 static uint16_t *crt_buf;
@@ -655,7 +656,8 @@
 {
 	void logbuf(int c);
 
-	spin_lock_irqsave(&console_lock);
+	if (!panic_skip_console_lock)
+		spin_lock_irqsave(&console_lock);
 
 	#ifndef CONFIG_SERIAL_IO
 		serial_spam_char(c);
@@ -664,7 +666,8 @@
 	cga_putc(c);
 	logbuf(c);
 
-	spin_unlock_irqsave(&console_lock);
+	if (!panic_skip_console_lock)
+		spin_unlock_irqsave(&console_lock);
 }
 
 // `High'-level console I/O.  Used by readline and cprintf.
diff --git a/kern/arch/x86/console.h b/kern/arch/x86/console.h
index e2660f8..6cc5737 100644
--- a/kern/arch/x86/console.h
+++ b/kern/arch/x86/console.h
@@ -26,6 +26,9 @@
 SLIST_HEAD(cons_dev_slist, cons_dev);
 extern struct cons_dev_slist cdev_list;
 
+/* Set this to turn off console locking.  (debugging/panic/NMI) */
+extern bool panic_skip_console_lock;
+
 void cons_init(void);
 /* Returns 0 on success, with the char in *data */
 int cons_get_char(struct cons_dev *cdev, uint8_t *data);
diff --git a/kern/include/stdio.h b/kern/include/stdio.h
index fd9cbaf..fc89b39 100644
--- a/kern/include/stdio.h
+++ b/kern/include/stdio.h
@@ -35,6 +35,7 @@
 void	vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt, va_list);
 
 // lib/printf.c
+extern bool panic_skip_print_lock;
 void print_lock(void);
 void print_unlock(void);
 void print_unlock_force(void);
diff --git a/kern/src/printf.c b/kern/src/printf.c
index 7b415d9..3fd7ddb 100644
--- a/kern/src/printf.c
+++ b/kern/src/printf.c
@@ -15,9 +15,13 @@
 static spinlock_t output_lock = SPINLOCK_INITIALIZER_IRQSAVE;
 static int output_lock_holder = -1;	/* core_id. */
 static int output_lock_count;
+bool panic_skip_print_lock;
 
 void print_lock(void)
 {
+	if (panic_skip_print_lock)
+		return;
+
 	if (output_lock_holder == core_id_early()) {
 		output_lock_count++;
 		return;
@@ -30,6 +34,9 @@
 
 void print_unlock(void)
 {
+	if (panic_skip_print_lock)
+		return;
+
 	output_lock_count--;
 	if (output_lock_count)
 		return;