1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #include "traceback.h"
- #include <common/printk.h>
- #include <process/process.h>
- static int lookup_kallsyms(uint64_t addr, int level)
- {
- const char *str = (const char *)&kallsyms_names;
-
-
-
- uint64_t index = 0;
- for (index = 0; index < kallsyms_num - 1; ++index)
- {
- if (addr > kallsyms_address[index] && addr <= kallsyms_address[index + 1])
- break;
- }
- if (index < kallsyms_num)
- {
-
- printk("function:%s() \t(+) %04d address:%#018lx\n", &str[kallsyms_names_index[index]], addr - kallsyms_address[index], addr);
- return 0;
- }
- else
- return -1;
- }
- void traceback(struct pt_regs *regs)
- {
-
- if (verify_area(regs->rbp, 0))
- {
- printk_color(YELLOW, BLACK, "Kernel traceback: Fault in userland. pid=%ld, rbp=%#018lx\n", current_pcb->pid, regs->rbp);
- return;
- }
- uint64_t *rbp = (uint64_t *)regs->rbp;
- printk_color(YELLOW, BLACK, "======== Kernel traceback =======\n");
-
-
-
-
- uint64_t ret_addr = regs->rip;
-
- for (int i = 0; i < 10; ++i)
- {
- if (lookup_kallsyms(ret_addr, i) != 0)
- break;
-
-
- if((uint64_t)(rbp) >= current_pcb->thread->rbp || ((uint64_t)rbp<regs->rsp))
- break;
- printk_color(ORANGE, BLACK, "rbp:%#018lx,*rbp:%#018lx\n", rbp, *rbp);
-
-
- ret_addr = *(rbp + 1);
- rbp = (uint64_t *)(*rbp);
- printk("\n");
- }
- printk_color(YELLOW, BLACK, "======== Kernel traceback end =======\n");
- }
|