aboutsummaryrefslogtreecommitdiff
path: root/libc/print.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc/print.c')
-rw-r--r--libc/print.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/libc/print.c b/libc/print.c
index 91ecf8f..1c577e5 100644
--- a/libc/print.c
+++ b/libc/print.c
@@ -214,9 +214,23 @@ int print(const char *str)
return strlen(str);
}
+void print_trace(u32 count)
+{
+ struct frame {
+ struct frame *ebp;
+ u32 eip;
+ } * stk;
+ __asm__ volatile("movl %%ebp, %0;" : "=r"(stk));
+ print("EBP\tEIP\n");
+ for (u32 i = 0; stk && i < count; i++) {
+ printf("0x%x\t0x%x\n", stk->ebp, stk->eip);
+ stk = stk->ebp;
+ }
+}
+
#endif
-void panic(const char *format, ...)
+NORETURN void panic(const char *format, ...)
{
char buf[1024] = { 0 };
va_list ap;
@@ -224,6 +238,7 @@ void panic(const char *format, ...)
vsprintf(buf, format, ap);
va_end(ap);
#ifdef kernel
+ print("--- DON'T PANIC! ---\n");
print(buf);
loop();
#else