Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/unwinder/src/arch/s390x.rs
1693 views
1
//! s390x-specific definitions of architecture-specific functions in Wasmtime.
2
3
#[inline]
4
pub fn get_stack_pointer() -> usize {
5
let mut sp;
6
unsafe {
7
core::arch::asm!(
8
"lgr {}, %r15",
9
out(reg) sp,
10
options(nostack, nomem),
11
);
12
}
13
sp
14
}
15
16
pub unsafe fn get_next_older_pc_from_fp(fp: usize) -> usize {
17
// The next older PC can be found in register %r14 at function entry, which
18
// was saved into slot 14 of the register save area pointed to by "FP" (the
19
// backchain pointer).
20
unsafe { *(fp as *mut usize).offset(14) }
21
}
22
23
pub unsafe fn resume_to_exception_handler(
24
pc: usize,
25
sp: usize,
26
_fp: usize,
27
payload1: usize,
28
payload2: usize,
29
) -> ! {
30
unsafe {
31
core::arch::asm!(
32
"lgr %r15, {}",
33
"br {}",
34
in(reg) sp,
35
in(reg_addr) pc,
36
in("r6") payload1,
37
in("r7") payload2,
38
options(nostack, nomem, noreturn),
39
);
40
}
41
}
42
43
// The next older "FP" (backchain pointer) was saved in the slot pointed to
44
// by the current "FP".
45
pub const NEXT_OLDER_FP_FROM_FP_OFFSET: usize = 0;
46
47
// SP of caller is "FP" (backchain pointer) in callee.
48
pub const NEXT_OLDER_SP_FROM_FP_OFFSET: usize = 0;
49
50
pub fn assert_fp_is_aligned(fp: usize) {
51
assert_eq!(fp % 8, 0, "stack should always be aligned to 8");
52
}
53
54