| 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 |