|  | #ifdef __SHARC__ | 
|  | #pragma nosharc | 
|  | #endif | 
|  |  | 
|  | #include <stab.h> | 
|  | #include <string.h> | 
|  | #include <assert.h> | 
|  | #include <kdebug.h> | 
|  | #include <pmap.h> | 
|  | #include <process.h> | 
|  |  | 
|  | #include <ros/memlayout.h> | 
|  |  | 
|  | void backtrace(void) | 
|  | { | 
|  | void **fp; | 
|  | asm volatile ("move %0, s0" : "=r"(fp)); | 
|  |  | 
|  | for (int i = 0; ; i++) { | 
|  | void *pc = fp[-1], *sp = fp[-2]; | 
|  | printk("[%d] pc %p sp %p\n", i, pc, sp); | 
|  | if (pc == 0 || (void**)sp < fp) | 
|  | break; | 
|  | fp = (void**)sp; | 
|  | } | 
|  | } | 
|  |  | 
|  | void backtrace_frame(uintptr_t pc, uintptr_t fp) | 
|  | { | 
|  | printk("\n\tTODO: backtrace frame on riscv\n\n"); | 
|  | } | 
|  |  | 
|  | /* can either implement these, or use the x86 ones globally and limit the | 
|  | * arch-indep stuff. */ | 
|  | size_t backtrace_list(uintptr_t pc, uintptr_t fp, uintptr_t *pcs, | 
|  | size_t nr_slots) | 
|  | { | 
|  | printk("\n\tTODO: backtrace list on riscv\n\n"); | 
|  | return 0; | 
|  | } |