From 7d6856ceab8d7d3f1c0a66e0f21c6050671f8ff5 Mon Sep 17 00:00:00 2001 From: Jiajie Chen Date: Tue, 8 Jan 2019 11:33:31 +0800 Subject: [PATCH] Implement backtrace support for RISCV64 --- kernel/src/backtrace.rs | 34 +++++++++++++++++++++++++--------- kernel/targets/riscv64.json | 3 ++- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/kernel/src/backtrace.rs b/kernel/src/backtrace.rs index 6243474..798327d 100644 --- a/kernel/src/backtrace.rs +++ b/kernel/src/backtrace.rs @@ -5,44 +5,60 @@ extern "C" { /// Returns the current frame pointer. #[inline(always)] -#[cfg(target_arch = "aarch64")] +#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] pub fn fp() -> usize { let ptr: usize; + #[cfg(target_arch = "aarch64")] unsafe { asm!("mov $0, x29" : "=r"(ptr)); } + #[cfg(target_arch = "riscv64")] + unsafe { + asm!("mv $0, s0" : "=r"(ptr)); + } ptr } /// Returns the current link register. #[inline(always)] -#[cfg(target_arch = "aarch64")] +#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] pub fn lr() -> usize { let ptr: usize; + #[cfg(target_arch = "aarch64")] unsafe { asm!("mov $0, x30" : "=r"(ptr)); } + #[cfg(target_arch = "riscv64")] + unsafe { + asm!("mv $0, ra" : "=r"(ptr)); + } ptr } // Print the backtrace starting from the caller pub fn backtrace() { - #[cfg(target_arch = "aarch64")] + #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))] unsafe { let mut current_pc = lr(); let mut current_fp = fp(); let mut stack_num = 0; - println!("pc {:#018X} fp {:#018X}", current_pc, current_fp); while current_pc >= stext as usize && current_pc <= etext as usize && current_fp as usize != 0 { - println!("#{} {:#018X}", stack_num, current_pc); + println!("#{} {:#018X} fp {:#18X}", stack_num, current_pc - 4, current_fp); stack_num = stack_num + 1; - current_fp = *(current_fp as *const usize); - if current_fp as usize != 0 { - current_pc = *(current_fp as *const usize).offset(1); + #[cfg(target_arch = "riscv64")] + { + current_fp = *((current_fp - 16) as *const usize); + current_pc = *(current_fp as *const usize).offset(-1); + } + #[cfg(target_arch = "aarch64")] + { + current_fp = *(current_fp as *const usize); + if current_fp != 0 { + current_pc = *(current_fp as *const usize).offset(1); + } } - println!("pc {:#018X} fp {:#018X}", current_pc, current_fp); } } } diff --git a/kernel/targets/riscv64.json b/kernel/targets/riscv64.json index 4742c08..7cf840a 100644 --- a/kernel/targets/riscv64.json +++ b/kernel/targets/riscv64.json @@ -31,5 +31,6 @@ "ptx-kernel", "msp430-interrupt", "x86-interrupt" - ] + ], + "eliminate-frame-pointer": false }