X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flib%2Fdebug.c;h=4f0f5f303cf933dab61c1b1e6f723d7ed7b8bb6b;hb=eb5ba83c314e0074e2b280516e3e30b8626c638f;hp=3d9a9b1e28f159f1d1dc0a82d7e117c6a6f02bac;hpb=ff144294a54d14af3c9324e6a336a3102094dea4;p=pintos-anon diff --git a/src/lib/debug.c b/src/lib/debug.c index 3d9a9b1..4f0f5f3 100644 --- a/src/lib/debug.c +++ b/src/lib/debug.c @@ -1,13 +1,24 @@ -#include "debug.h" +#include #include -#include "interrupt.h" -#include "lib.h" +#include +#include +#include +#include +#ifdef KERNEL +#include "threads/init.h" +#include "threads/interrupt.h" +#include "devices/serial.h" +#else +#include +#endif #define MAX_CLASSES 16 static bool all_enabled; static const char *enabled_classes[MAX_CLASSES]; static size_t enabled_cnt; +static bool class_is_enabled (const char *class); + /* Enables the debug message classes specified in CLASSES. The string CLASSES is modified by and becomes owned by this function. */ @@ -26,22 +37,6 @@ debug_enable (char *classes) } } -/* Checks whether CLASS is enabled. */ -static bool -class_is_enabled (const char *class) -{ - size_t i; - - if (all_enabled) - return true; - - for (i = 0; i < enabled_cnt; i++) - if (!strcmp (enabled_classes[i], class)) - return true; - - return false; -} - /* Prints a debug message along with the source file name, line number, and function name of where it was emitted. CLASS is used to filter out unwanted messages. */ @@ -53,50 +48,90 @@ debug_message (const char *file, int line, const char *function, { va_list args; - enum if_level old_level = intr_disable (); - printk ("%s:%d: %s(): ", file, line, function); +#ifdef KERNEL + enum intr_level old_level = intr_disable (); +#endif + printf ("%s:%d: %s(): ", file, line, function); va_start (args, message); - vprintk (message, args); - printk ("\n"); + vprintf (message, args); + printf ("\n"); va_end (args); +#ifdef KERNEL intr_set_level (old_level); +#endif } } -/* Halts the OS, printing the source file name, line number, and - function name, plus a user-specific message. */ +/* Halts the OS or user program, printing the source file name, + line number, and function name, plus a user-specific + message. */ void debug_panic (const char *file, int line, const char *function, const char *message, ...) { va_list args; +#ifdef KERNEL intr_disable (); +#endif + +#ifdef KERNEL + printf ("Kernel PANIC at %s:%d in %s(): ", file, line, function); +#else + printf ("User process panic at %s:%d in %s(): ", file, line, function); +#endif - printk ("PANIC at %s:%d in %s(): ", file, line, function); va_start (args, message); - vprintk (message, args); - printk ("\n"); + vprintf (message, args); + printf ("\n"); va_end (args); debug_backtrace (); + printf ("The `backtrace' program can make call stacks useful.\n" + "Read \"Backtraces\" in the \"Debugging Tools\" chapter\n" + "of the Pintos documentation for more information.\n"); + +#ifdef KERNEL + serial_flush (); + if (power_off_when_done) + power_off (); for (;;); +#else + exit (1); +#endif } -/* Prints the call stack, that is, a list of addresses in each of - the functions we are nested within. gdb or addr2line may be - applied to kernel.o to translate these into file names, line - numbers, and function names. */ +/* Prints the call stack, that is, a list of addresses, one in + each of the functions we are nested within. gdb or addr2line + may be applied to kernel.o to translate these into file names, + line numbers, and function names. */ void debug_backtrace (void) { void **frame; - printk ("Call stack:"); + printf ("Call stack:"); for (frame = __builtin_frame_address (0); frame != NULL && frame[0] != NULL; frame = frame[0]) - printk (" %p", frame[1]); - printk (".\n"); + printf (" %p", frame[1]); + printf (".\n"); +} + + +/* Returns true if CLASS is enabled, false otherwise. */ +static bool +class_is_enabled (const char *class) +{ + size_t i; + + if (all_enabled) + return true; + + for (i = 0; i < enabled_cnt; i++) + if (!strcmp (enabled_classes[i], class)) + return true; + + return false; }