-#include "debug.h"
+#include <debug.h>
#include <stdarg.h>
-#include "interrupt.h"
-#include "lib.h"
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+/* 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
-panic (const char *format, ...)
+debug_backtrace (void)
{
- va_list args;
+ static bool explained;
+ void **frame;
+
+ printf ("Call stack:");
+ for (frame = __builtin_frame_address (0);
+ frame != NULL && frame[0] != NULL;
+ frame = frame[0])
+ printf (" %p", frame[1]);
+ printf (".\n");
- intr_disable ();
-
- va_start (args, format);
- vprintk (format, args);
- printk ("\n");
- va_end (args);
-
- for (;;);
+ if (!explained)
+ {
+ explained = true;
+ 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");
+ }
}