| #include <assert.h> | 
 | #include <kdebug.h> | 
 | #include <pmap.h> | 
 | #include <process.h> | 
 | #include <string.h> | 
 |  | 
 | /* Here's the old backtrace, remove it once gen_backtrace is done: */ | 
 | #if 0 | 
 | 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; | 
 | 	} | 
 | } | 
 | #endif | 
 |  | 
 | void gen_backtrace(void (*pfunc)(void *, const char *), void *opaque) | 
 | { | 
 | 	printk("\n\tTODO: %s on riscv\n\n", __func__); | 
 | } | 
 |  | 
 | /* 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: %s on riscv\n\n", __func__); | 
 | 	return 0; | 
 | } | 
 |  | 
 | size_t backtrace_user_list(uintptr_t pc, uintptr_t fp, uintptr_t *pcs, | 
 |                            size_t nr_slots) | 
 | { | 
 | 	printk("\n\tTODO: %s on riscv\n\n", __func__); | 
 | 	return 0; | 
 | } |