summaryrefslogtreecommitdiffstats
path: root/gnu-efi-3.0/gnuefi/setjmp_aarch64.S
blob: b722023534aaf23ecae23cf8d566b8412361a60b (plain)
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