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-27 08:28:29 +0200 |
commit | 685aaecf4e90f0c1148222e95629ca562e8093db (patch) | |
tree | 0da2df49a7973f54a7cd0e1fb8fe48e725ce1621 /arch/arm64/lib | |
parent | 5a0f312409eab96928a95598d440cf54b5cf7153 (diff) |
arm64: Introduce retpoline for aarch64/arm64.linux-4.16.5-amp
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
* arm64: retpoline: Use kernel's EXPORT_SYMBOL macro.
* arm64: retpoline: Add thunks for x29 and x30.
* arm64: retpoline: Add function signature for symbol versioning.
Signed-off-by: Christoph Muellner <christoph.muellner@theobroma-systems.com>
Diffstat (limited to 'arch/arm64/lib')
-rw-r--r-- | arch/arm64/lib/Makefile | 4 | ||||
-rw-r--r-- | arch/arm64/lib/retpoline.S | 61 |
2 files changed, 63 insertions, 2 deletions
diff --git a/arch/arm64/lib/Makefile b/arch/arm64/lib/Makefile index 4e696f96451f..155d5080a674 100644 --- a/arch/arm64/lib/Makefile +++ b/arch/arm64/lib/Makefile @@ -2,8 +2,8 @@ lib-y := bitops.o clear_user.o delay.o copy_from_user.o \ copy_to_user.o copy_in_user.o copy_page.o \ clear_page.o memchr.o memcpy.o memmove.o memset.o \ - memcmp.o strcmp.o strncmp.o strlen.o strnlen.o \ - strchr.o strrchr.o tishift.o + memcmp.o retpoline.o strcmp.o strncmp.o strlen.o \ + strnlen.o strchr.o strrchr.o tishift.o # Tell the compiler to treat all general purpose registers (with the # exception of the IP registers, which are already handled by the caller 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) |