| // SPDX-License-Identifier: GPL-2.0-only |
| // Copyright (C) 2015-2019 ARM Limited. |
| // Original author: Dave Martin <Dave.Martin@arm.com> |
| |
| #ifndef ASSEMBLER_H |
| #define ASSEMBLER_H |
| |
| .macro __for from:req, to:req |
| .if (\from) == (\to) |
| _for__body %\from |
| .else |
| __for \from, %(\from) + ((\to) - (\from)) / 2 |
| __for %(\from) + ((\to) - (\from)) / 2 + 1, \to |
| .endif |
| .endm |
| |
| .macro _for var:req, from:req, to:req, insn:vararg |
| .macro _for__body \var:req |
| .noaltmacro |
| \insn |
| .altmacro |
| .endm |
| |
| .altmacro |
| __for \from, \to |
| .noaltmacro |
| |
| .purgem _for__body |
| .endm |
| |
| .macro function name |
| .macro endfunction |
| .type \name, @function |
| .purgem endfunction |
| .endm |
| \name: |
| .endm |
| |
| .macro define_accessor name, num, insn |
| .macro \name\()_entry n |
| \insn \n, 1 |
| ret |
| .endm |
| |
| function \name |
| adr x2, .L__accessor_tbl\@ |
| add x2, x2, x0, lsl #3 |
| br x2 |
| |
| .L__accessor_tbl\@: |
| _for x, 0, (\num) - 1, \name\()_entry \x |
| endfunction |
| |
| .purgem \name\()_entry |
| .endm |
| |
| // Utility macro to print a literal string |
| // Clobbers x0-x4,x8 |
| .macro puts string |
| .pushsection .rodata.str1.1, "aMS", @progbits, 1 |
| .L__puts_literal\@: .string "\string" |
| .popsection |
| |
| ldr x0, =.L__puts_literal\@ |
| bl puts |
| .endm |
| |
| #define PR_SET_SHADOW_STACK_STATUS 75 |
| # define PR_SHADOW_STACK_ENABLE (1UL << 0) |
| |
| .macro enable_gcs |
| // Run with GCS |
| mov x0, PR_SET_SHADOW_STACK_STATUS |
| mov x1, PR_SHADOW_STACK_ENABLE |
| mov x2, xzr |
| mov x3, xzr |
| mov x4, xzr |
| mov x5, xzr |
| mov x8, #__NR_prctl |
| svc #0 |
| .endm |
| |
| #endif /* ! ASSEMBLER_H */ |