| 1 | |
| 2 | |
| 3 | |
| 4 |
|
| 5 | #ifndef ASSEMBLER_H
|
| 6 | #define ASSEMBLER_H
|
| 7 |
|
| 8 | .macro __for from:req, to:req
|
| 9 | .if (\from) == (\to)
|
| 10 | _for__body %\from
|
| 11 | .else
|
| 12 | __for \from, %(\from) + ((\to) - (\from)) / 2
|
| 13 | __for %(\from) + ((\to) - (\from)) / 2 + 1, \to
|
| 14 | .endif
|
| 15 | .endm
|
| 16 |
|
| 17 | .macro _for var:req, from:req, to:req, insn:vararg
|
| 18 | .macro _for__body \var:req
|
| 19 | .noaltmacro
|
| 20 | \insn
|
| 21 | .altmacro
|
| 22 | .endm
|
| 23 |
|
| 24 | .altmacro
|
| 25 | __for \from, \to
|
| 26 | .noaltmacro
|
| 27 |
|
| 28 | .purgem _for__body
|
| 29 | .endm
|
| 30 |
|
| 31 | .macro function name
|
| 32 | .macro endfunction
|
| 33 | .type \name, @function
|
| 34 | .purgem endfunction
|
| 35 | .endm
|
| 36 | \name:
|
| 37 | .endm
|
| 38 |
|
| 39 | .macro define_accessor name, num, insn
|
| 40 | .macro \name\()_entry n
|
| 41 | \insn \n, 1
|
| 42 | ret
|
| 43 | .endm
|
| 44 |
|
| 45 | function \name
|
| 46 | adr x2, .L__accessor_tbl\@
|
| 47 | add x2, x2, x0, lsl #3
|
| 48 | br x2
|
| 49 |
|
| 50 | .L__accessor_tbl\@:
|
| 51 | _for x, 0, (\num) - 1, \name\()_entry \x
|
| 52 | endfunction
|
| 53 |
|
| 54 | .purgem \name\()_entry
|
| 55 | .endm
|
| 56 |
|
| 57 | |
| 58 | |
| 59 | .macro puts string
|
| 60 | .pushsection .rodata.str1.1, "aMS", @progbits, 1
|
| 61 | .L__puts_literal\@: .string "\string"
|
| 62 | .popsection
|
| 63 |
|
| 64 | ldr x0, =.L__puts_literal\@
|
| 65 | bl puts
|
| 66 | .endm
|
| 67 |
|
| 68 | #define PR_SET_SHADOW_STACK_STATUS 75
|
| 69 | # define PR_SHADOW_STACK_ENABLE (1UL << 0)
|
| 70 |
|
| 71 | .macro enable_gcs
|
| 72 | |
| 73 | mov x0, PR_SET_SHADOW_STACK_STATUS
|
| 74 | mov x1, PR_SHADOW_STACK_ENABLE
|
| 75 | mov x2, xzr
|
| 76 | mov x3, xzr
|
| 77 | mov x4, xzr
|
| 78 | mov x5, xzr
|
| 79 | mov x8, #__NR_prctl
|
| 80 | svc #0
|
| 81 | .endm
|
| 82 |
|
| 83 | #endif
|