Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/unwinder/src/arch/riscv64.rs
1693 views
1
//! Riscv64-specific definitions of architecture-specific functions in Wasmtime.
2
3
#[inline]
4
pub fn get_stack_pointer() -> usize {
5
let stack_pointer: usize;
6
unsafe {
7
core::arch::asm!(
8
"mv {}, sp",
9
out(reg) stack_pointer,
10
options(nostack,nomem),
11
);
12
}
13
stack_pointer
14
}
15
16
pub unsafe fn get_next_older_pc_from_fp(fp: usize) -> usize {
17
unsafe { *(fp as *mut usize).offset(1) }
18
}
19
20
pub unsafe fn resume_to_exception_handler(
21
pc: usize,
22
sp: usize,
23
fp: usize,
24
payload1: usize,
25
payload2: usize,
26
) -> ! {
27
unsafe {
28
core::arch::asm!(
29
"mv sp, a2",
30
"mv fp, a3",
31
"jr a4",
32
in("a0") payload1,
33
in("a1") payload2,
34
in("a2") sp,
35
in("a3") fp,
36
in("a4") pc,
37
options(nostack, nomem, noreturn),
38
);
39
}
40
}
41
42
// And the current frame pointer points to the next older frame pointer.
43
pub const NEXT_OLDER_FP_FROM_FP_OFFSET: usize = 0;
44
45
// SP of caller is FP in callee plus size of FP/return address pair.
46
pub const NEXT_OLDER_SP_FROM_FP_OFFSET: usize = 16;
47
48
pub fn assert_fp_is_aligned(fp: usize) {
49
assert_eq!(fp % 16, 0, "stack should always be aligned to 16");
50
}
51
52