aboutsummaryrefslogtreecommitdiff
path: root/libs/libc/print.c
diff options
context:
space:
mode:
Diffstat (limited to 'libs/libc/print.c')
-rw-r--r--libs/libc/print.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/libs/libc/print.c b/libs/libc/print.c
index 7c40a8b..091df82 100644
--- a/libs/libc/print.c
+++ b/libs/libc/print.c
@@ -207,20 +207,30 @@ int print(const char *str)
return strlen(str);
}
-void print_trace(u32 count)
+void print_trace_custom(u32 stack, u32 count)
{
+ stac();
struct frame {
struct frame *ebp;
u32 eip;
- } * stk;
- __asm__ volatile("movl %%ebp, %0;" : "=r"(stk));
- print("EBP\tEIP\n");
+ } *stk = (void *)stack;
+ printf("Stack trace for 0x%x\n", stack);
+ print("\tEBP\tEIP\n");
for (u32 i = 0; stk && memory_readable(stk) && i < count; i++) {
if (!stk->ebp || !stk->eip)
break;
- printf("0x%x\t0x%x\n", stk->ebp, stk->eip);
+ printf("\t0x%x\t0x%x\n", stk->ebp, stk->eip);
stk = stk->ebp;
}
+ print("Stack trace end\n");
+ clac();
+}
+
+void print_trace(void)
+{
+ u32 ebp;
+ __asm__ volatile("movl %%ebp, %0;" : "=r"(ebp));
+ print_trace_custom(ebp, 10);
}
#endif
@@ -235,7 +245,7 @@ void panic(const char *format, ...)
#ifdef KERNEL
print("--- DON'T PANIC! ---\n");
print(buf);
- print_trace(10);
+ print_trace();
while (1)
__asm__ volatile("cli\nhlt");
#else