fn trap_handler() {
unsafe{
...
asm!( "mret");
}
}
pub extern "C" fn _start() -> ! {
/* set mtvec */
type FnPtr = fn();
let th: FnPtr = trap_handler;
unsafe{
asm!("csrw mtvec, {}", in(reg) th);
}
}
Objdump:
80000030 <trap_handler>:
80000030: fc010113 addi sp,sp,-64
80000034: 10013537 lui a0,0x10013
80000140: 30200073 mret
80000144: 04010113 addi sp,sp,64 => skipped
80000148: 00008067 ret
As observed above, rust compiler treats this as a normal function and returns with ret. However, trap handler in RISC-V returns with mret in machine mode causing the stack pointer to mis-align. How should this be fixed?