1
0
mirror of https://github.com/rcore-os/rCore.git synced 2024-11-23 00:16:17 +04:00

Implement backtrace support for RISCV64

This commit is contained in:
Jiajie Chen 2019-01-08 11:33:31 +08:00
parent d8edd1a7db
commit 7d6856ceab
2 changed files with 27 additions and 10 deletions

View File

@ -5,44 +5,60 @@ extern "C" {
/// Returns the current frame pointer. /// Returns the current frame pointer.
#[inline(always)] #[inline(always)]
#[cfg(target_arch = "aarch64")] #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
pub fn fp() -> usize { pub fn fp() -> usize {
let ptr: usize; let ptr: usize;
#[cfg(target_arch = "aarch64")]
unsafe { unsafe {
asm!("mov $0, x29" : "=r"(ptr)); asm!("mov $0, x29" : "=r"(ptr));
} }
#[cfg(target_arch = "riscv64")]
unsafe {
asm!("mv $0, s0" : "=r"(ptr));
}
ptr ptr
} }
/// Returns the current link register. /// Returns the current link register.
#[inline(always)] #[inline(always)]
#[cfg(target_arch = "aarch64")] #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
pub fn lr() -> usize { pub fn lr() -> usize {
let ptr: usize; let ptr: usize;
#[cfg(target_arch = "aarch64")]
unsafe { unsafe {
asm!("mov $0, x30" : "=r"(ptr)); asm!("mov $0, x30" : "=r"(ptr));
} }
#[cfg(target_arch = "riscv64")]
unsafe {
asm!("mv $0, ra" : "=r"(ptr));
}
ptr ptr
} }
// Print the backtrace starting from the caller // Print the backtrace starting from the caller
pub fn backtrace() { pub fn backtrace() {
#[cfg(target_arch = "aarch64")] #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
unsafe { unsafe {
let mut current_pc = lr(); let mut current_pc = lr();
let mut current_fp = fp(); let mut current_fp = fp();
let mut stack_num = 0; 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 { 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; stack_num = stack_num + 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); current_fp = *(current_fp as *const usize);
if current_fp as usize != 0 { if current_fp != 0 {
current_pc = *(current_fp as *const usize).offset(1); current_pc = *(current_fp as *const usize).offset(1);
} }
println!("pc {:#018X} fp {:#018X}", current_pc, current_fp); }
} }
} }
} }

View File

@ -31,5 +31,6 @@
"ptx-kernel", "ptx-kernel",
"msp430-interrupt", "msp430-interrupt",
"x86-interrupt" "x86-interrupt"
] ],
"eliminate-frame-pointer": false
} }