:: limine / common / lib / macros.aarch64_asm.h 929 B raw

1
// Branch to \el1 if in EL1, or to \el2 if in EL2
2
// Uses \reg, halts if not in EL1 or EL2
3
.macro PICK_EL reg, el1, el2
4
    mrs \reg, currentel
5
    and \reg, \reg, #0b1100
6
7
    cmp \reg, #0b0100 // EL1?
8
    b.eq \el1
9
    cmp \reg, #0b1000 // EL2?
10
    b.eq \el2
11
12
    // Halt otherwise
13
    msr daifset, #0b1111
14
99:
15
    wfi
16
    b 99b
17
.endm
18
19
20
// Zero out all general purpose registers apart from X0
21
.macro ZERO_REGS_EXCEPT_X0
22
    mov x1, xzr
23
    mov x2, xzr
24
    mov x3, xzr
25
    mov x4, xzr
26
    mov x5, xzr
27
    mov x6, xzr
28
    mov x7, xzr
29
    mov x8, xzr
30
    mov x9, xzr
31
    mov x10, xzr
32
    mov x11, xzr
33
    mov x12, xzr
34
    mov x13, xzr
35
    mov x14, xzr
36
    mov x15, xzr
37
    mov x16, xzr
38
    mov x17, xzr
39
    mov x18, xzr
40
    mov x19, xzr
41
    mov x20, xzr
42
    mov x21, xzr
43
    mov x22, xzr
44
    mov x23, xzr
45
    mov x24, xzr
46
    mov x25, xzr
47
    mov x26, xzr
48
    mov x27, xzr
49
    mov x28, xzr
50
    mov x29, xzr
51
    mov x30, xzr
52
.endm
tab: 248 wrap: offon