diff --git a/Makefile b/Makefile index 74e454f..af4c4ca 100644 --- a/Makefile +++ b/Makefile @@ -343,7 +343,7 @@ grade: @echo $(MAKE) clean @$(MAKE) clean || \ (echo "'make clean' failed. HINT: Do you have another running instance of xv6?" && exit 1) - ./grade-lab-$(LAB) $(GRADEFLAGS) + python3.12 ./grade-lab-$(LAB) $(GRADEFLAGS) ## ## FOR submissions diff --git a/kernel/defs.h b/kernel/defs.h index d1b6bb9..29f5a76 100644 --- a/kernel/defs.h +++ b/kernel/defs.h @@ -80,6 +80,7 @@ int pipewrite(struct pipe*, uint64, int); int printf(char*, ...) __attribute__ ((format (printf, 1, 2))); void panic(char*) __attribute__((noreturn)); void printfinit(void); +void backtrace(void); // proc.c int cpuid(void); diff --git a/kernel/printf.c b/kernel/printf.c index d20534c..f0a7055 100644 --- a/kernel/printf.c +++ b/kernel/printf.c @@ -176,3 +176,22 @@ printfinit(void) initlock(&pr.lock, "pr"); pr.locking = 1; } + +void +backtrace(void) +{ + printf("barcktrace:\n"); + + uint64 ra,fp = r_fp();//frame pointer -> address + uint64 pre_fp = *((uint64*)(fp - 16)); + + while(PGROUNDDOWN(fp)==PGROUNDDOWN(pre_fp)){ + ra = *(uint64 *)(fp - 8); + printf("%p\n", (void*)ra); + fp = pre_fp; + pre_fp = *((uint64*)(fp - 16)); + } + + ra = *(uint64 *)(fp - 8); + printf("%p\n",(void*)ra); +} \ No newline at end of file diff --git a/kernel/riscv.h b/kernel/riscv.h index f7aaa8a..e6b00e2 100644 --- a/kernel/riscv.h +++ b/kernel/riscv.h @@ -338,6 +338,14 @@ r_ra() return x; } +static inline uint64 +r_fp() +{ + uint64 x; + asm volatile("mv %0, s0" : "=r" (x) ); + return x; +} + // flush the TLB. static inline void sfence_vma() diff --git a/kernel/sysproc.c b/kernel/sysproc.c index 3b4d5bd..651a697 100644 --- a/kernel/sysproc.c +++ b/kernel/sysproc.c @@ -54,6 +54,8 @@ sys_sleep(void) int n; uint ticks0; + backtrace(); + argint(0, &n); if(n < 0) n = 0;