Implement backtrace for RISC-V
[akaros.git] / kern / arch / riscv / kdebug.c
1 #ifdef __SHARC__
2 #pragma nosharc
3 #endif
4
5 #include <stab.h>
6 #include <string.h>
7 #include <assert.h>
8 #include <kdebug.h>
9 #include <pmap.h>
10 #include <process.h>
11
12 #include <ros/memlayout.h>
13
14 int debuginfo_eip(uintptr_t eip, struct eipdebuginfo *info)
15 {
16         // DWARF-2 works for RISC-V, so in principle this is implementable.
17         
18         static bool once = TRUE;
19         if (once) {
20                 warn("Not implemented for RISC-V");
21                 once = FALSE;
22         }
23         return 0;
24 }
25
26 void backtrace(void)
27 {
28         void **fp;
29         asm volatile ("move %0, s0" : "=r"(fp));
30
31         for (int i = 0; ; i++) {
32                 void *pc = fp[-1], *sp = fp[-2];
33                 printk("[%d] pc %p sp %p\n", i, pc, sp);
34                 if (pc == 0 || (void**)sp < fp)
35                         break;
36                 fp = (void**)sp;
37         }
38 }