diff options
author | Christoph Muellner <christoph.muellner@theobroma-systems.com> | 2018-03-20 11:16:02 +0100 |
---|---|---|
committer | Christoph Muellner <christoph.muellner@theobroma-systems.com> | 2018-04-05 22:33:45 +0200 |
commit | f08166b6816dea1dff2c18785b104af650382e86 (patch) | |
tree | 98edcc6f70442fb4120a01aa296581a9f1ae571a /arch/arm64/lib/retpoline.S | |
parent | 110b33618f3c55f2af17e4d3f7adbab4c2b81c43 (diff) |
arm64: Introduce retpoline for aarch64/arm64.
This patch adds retpoline support for aarch64.
This includes:
* Kconfig flag CONFIG_RETPOLINE to enable it
* testing for required compiler support
* generation of external retpoline thunk functions
* patches for the arm64 specific assembly code
* Enable /sys/devices/system/cpu/vulnerabilities
* Add thunk prototypes to asm/asm-prototypes.h
Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com>
Diffstat (limited to 'arch/arm64/lib/retpoline.S')
-rw-r--r-- | arch/arm64/lib/retpoline.S | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/arch/arm64/lib/retpoline.S b/arch/arm64/lib/retpoline.S new file mode 100644 index 000000000000..c1a6f7c41b62 --- /dev/null +++ b/arch/arm64/lib/retpoline.S @@ -0,0 +1,61 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#include <linux/stringify.h> +#include <linux/linkage.h> +#include <asm/assembler.h> +#include <asm/nospec-branch.h> +#include <asm-generic/export.h> + +.macro THUNK reg + .section .text.__aarch64.indirect_thunk + +ENTRY(__aarch64_indirect_thunk_\reg) + retpoline + br \reg +ENDPROC(__aarch64_indirect_thunk_\reg) +.endm + +#define _ASM_ALIGN +#define _ASM_PTR ".quad" + +# define _ASM_NOKPROBE(entry) \ + .pushsection "_kprobe_blacklist","aw" ; \ + _ASM_ALIGN \ + _ASM_PTR (entry); \ + .popsection + +#define __EXPORT_THUNK(sym) _ASM_NOKPROBE(sym); EXPORT_SYMBOL(sym) +#define EXPORT_THUNK(reg) __EXPORT_THUNK(__aarch64_indirect_thunk_ ## reg) +#define GENERATE_THUNK(reg) THUNK reg ; EXPORT_THUNK(reg) + +GENERATE_THUNK(x0) +GENERATE_THUNK(x1) +GENERATE_THUNK(x2) +GENERATE_THUNK(x3) +GENERATE_THUNK(x4) +GENERATE_THUNK(x5) +GENERATE_THUNK(x6) +GENERATE_THUNK(x7) +GENERATE_THUNK(x8) +GENERATE_THUNK(x9) +GENERATE_THUNK(x10) +GENERATE_THUNK(x11) +GENERATE_THUNK(x12) +GENERATE_THUNK(x13) +GENERATE_THUNK(x14) +GENERATE_THUNK(x15) +GENERATE_THUNK(x16) +GENERATE_THUNK(x17) +GENERATE_THUNK(x18) +GENERATE_THUNK(x19) +GENERATE_THUNK(x20) +GENERATE_THUNK(x21) +GENERATE_THUNK(x22) +GENERATE_THUNK(x23) +GENERATE_THUNK(x24) +GENERATE_THUNK(x25) +GENERATE_THUNK(x26) +GENERATE_THUNK(x27) +GENERATE_THUNK(x28) +GENERATE_THUNK(x29) +GENERATE_THUNK(x30) |