Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/fiber/src/stackswitch/arm.rs
1692 views
1
// A WORD OF CAUTION
2
//
3
// This entire file basically needs to be kept in sync with itself. It's not
4
// really possible to modify just one bit of this file without understanding
5
// all the other bits. Documentation tries to reference various bits here and
6
// there but try to make sure to read over everything before tweaking things!
7
//
8
// Also at this time this file is heavily based off the x86_64 file, so you'll
9
// probably want to read that one as well.
10
11
use wasmtime_asm_macros::asm_func;
12
13
// fn(top_of_stack(%r0): *mut u8)
14
asm_func!(
15
wasmtime_versioned_export_macros::versioned_stringify_ident!(wasmtime_fiber_switch),
16
"
17
// Save callee-saved registers
18
push {{r4-r11,lr}}
19
20
// Swap stacks, recording our current stack pointer
21
ldr r4, [r0, #-0x08]
22
str sp, [r0, #-0x08]
23
mov sp, r4
24
25
// Restore and return
26
pop {{r4-r11,lr}}
27
bx lr
28
",
29
);
30
31
// fn(
32
// top_of_stack(%r0): *mut u8,
33
// entry_point(%r1): extern fn(*mut u8, *mut u8),
34
// entry_arg0(%r2): *mut u8,
35
// )
36
asm_func!(
37
wasmtime_versioned_export_macros::versioned_stringify_ident!(wasmtime_fiber_init),
38
"
39
adr r3, {start}
40
str r3, [r0, #-0x0c] // => lr
41
str r0, [r0, #-0x10] // => r11
42
str r1, [r0, #-0x14] // => r10
43
str r2, [r0, #-0x18] // => r9
44
45
add r3, r0, #-0x2c
46
str r3, [r0, #-0x08]
47
bx lr
48
",
49
start = sym super::wasmtime_fiber_start,
50
);
51
52
asm_func!(
53
wasmtime_versioned_export_macros::versioned_stringify_ident!(wasmtime_fiber_start),
54
"
55
.cfi_startproc simple
56
.cfi_def_cfa_offset 0
57
// See the x86_64 file for more commentary on what these CFI directives
58
// are doing. Like over there note that the relative offsets to
59
// registers here match the frame layout in `wasmtime_fiber_switch`.
60
//
61
// TODO: this is only lightly tested. This gets backtraces in gdb but
62
// not at runtime. Perhaps the libgcc at runtime was too old? Doesn't
63
// support something here? Unclear. Will need investigation if someone
64
// ends up needing this and it still doesn't work.
65
.cfi_escape 0x0f, /* DW_CFA_def_cfa_expression */ \
66
5, /* the byte length of this expression */ \
67
0x7d, 0x00, /* DW_OP_breg14(%sp) + 0 */ \
68
0x06, /* DW_OP_deref */ \
69
0x23, 0x24 /* DW_OP_plus_uconst 0x24 */
70
71
.cfi_rel_offset lr, -0x04
72
.cfi_rel_offset r11, -0x08
73
.cfi_rel_offset r10, -0x0c
74
.cfi_rel_offset r9, -0x10
75
.cfi_rel_offset r8, -0x14
76
.cfi_rel_offset r7, -0x18
77
.cfi_rel_offset r6, -0x1c
78
.cfi_rel_offset r5, -0x20
79
.cfi_rel_offset r4, -0x24
80
81
mov r1, r11
82
mov r0, r9
83
blx r10
84
.cfi_endproc
85
",
86
);
87
88