1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
/*
* This code has been nicked from glibc (GNU-LGPL v2.1 or newer)
* Code modified by Bart Kuivenhoven <bemk@redhat.com> - Red Hat - 2013
*/
#define EXT_C(sym) sym
#define FUNCTION(x) .globl EXT_C(x) ; .type EXT_C(x), @function ; EXT_C(x):
#define JB_X19 0x00
#define JB_X20 0x01
#define JB_X21 0x02
#define JB_X22 0x03
#define JB_X23 0x04
#define JB_X24 0x05
#define JB_X25 0x06
#define JB_X26 0x07
#define JB_X27 0x08
#define JB_X28 0x09
#define JB_X29 0x0A
#define JB_X30 0x0B
#define JB_D8 0x0C
#define JB_D9 0x0D
#define JB_D10 0x0E
#define JB_D11 0x0F
#define JB_D12 0x10
#define JB_D13 0x11
#define JB_D14 0x12
#define JB_D15 0x13
#define JB_SP 0x14
FUNCTION(setjmp)
stp x19, x20, [x0, #JB_X19<<3]
stp x21, x22, [x0, #JB_X21<<3]
stp x23, x24, [x0, #JB_X23<<3]
stp x25, x26, [x0, #JB_X25<<3]
stp x27, x28, [x0, #JB_X27<<3]
stp x29, x30, [x0, #JB_X29<<3]
stp d8, d9, [x0, #JB_D8<<3]
stp d10, d11, [x0, #JB_D10<<3]
stp d12, d13, [x0, #JB_D12<<3]
stp d14, d15, [x0, #JB_D14<<3]
mov x2, sp
str x2, [x0, #JB_SP<<3]
mov w0, #0
RET
FUNCTION(longjmp)
ldp x19, x20, [x0, #JB_X19<<3]
ldp x21, x22, [x0, #JB_X21<<3]
ldp x23, x24, [x0, #JB_X23<<3]
ldp x25, x26, [x0, #JB_X25<<3]
ldp x27, x28, [x0, #JB_X27<<3]
ldp x29, x30, [x0, #JB_X29<<3]
ldp d8, d9, [x0, #JB_D8<<3]
ldp d10, d11, [x0, #JB_D10<<3]
ldp d12, d13, [x0, #JB_D12<<3]
ldp d14, d15, [x0, #JB_D14<<3]
ldr x5, [x0, #JB_SP<<3]
mov sp, x5
cmp x1, #0
mov x0, #1
csel x0, x1, x0, ne
/* Use br instead of ret because ret is guaranteed to mispredict */
br x30
|