mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 03:04:51 +01:00
arch/riscv: compile vdso with landing pad and shadow stack note
User mode tasks compiled with Zicfilp may call indirectly into the vdso (like hwprobe indirect calls). Add support for compiling landing pads into the vdso. Landing pad instructions in the vdso will be no-ops for tasks which have not enabled landing pads. Furthermore, add support for the C sources of the vdso to be compiled with shadow stack and landing pads enabled as well. Landing pad and shadow stack instructions are emitted only when the VDSO_CFI cflags option is defined during compile. Signed-off-by: Jim Shu <jim.shu@sifive.com> Reviewed-by: Zong Li <zong.li@sifive.com> Signed-off-by: Deepak Gupta <debug@rivosinc.com> Tested-by: Andreas Korb <andreas.korb@aisec.fraunhofer.de> # QEMU, custom CVA6 Tested-by: Valentin Haudiquet <valentin.haudiquet@canonical.com> Link: https://patch.msgid.link/20251112-v5_user_cfi_series-v23-23-b55691eacf4f@rivosinc.com [pjw@kernel.org: cleaned up patch description, issues reported by checkpatch] Signed-off-by: Paul Walmsley <pjw@kernel.org>
This commit is contained in:
parent
41213bf2ae
commit
37f57bd3fa
9 changed files with 81 additions and 3 deletions
|
|
@ -81,9 +81,12 @@ riscv-march-$(CONFIG_TOOLCHAIN_HAS_ZACAS) := $(riscv-march-y)_zacas
|
|||
# Check if the toolchain supports Zabha
|
||||
riscv-march-$(CONFIG_TOOLCHAIN_HAS_ZABHA) := $(riscv-march-y)_zabha
|
||||
|
||||
KBUILD_BASE_ISA = -march=$(shell echo $(riscv-march-y) | sed -E 's/(rv32ima|rv64ima)fd([^v_]*)v?/\1\2/')
|
||||
export KBUILD_BASE_ISA
|
||||
|
||||
# Remove F,D,V from isa string for all. Keep extensions between "fd" and "v" by
|
||||
# matching non-v and non-multi-letter extensions out with the filter ([^v_]*)
|
||||
KBUILD_CFLAGS += -march=$(shell echo $(riscv-march-y) | sed -E 's/(rv32ima|rv64ima)fd([^v_]*)v?/\1\2/')
|
||||
KBUILD_CFLAGS += $(KBUILD_BASE_ISA)
|
||||
|
||||
KBUILD_AFLAGS += -march=$(riscv-march-y)
|
||||
|
||||
|
|
|
|||
|
|
@ -80,3 +80,47 @@
|
|||
.endm
|
||||
|
||||
#endif /* __ASM_ASSEMBLER_H */
|
||||
|
||||
#if defined(VDSO_CFI) && (__riscv_xlen == 64)
|
||||
.macro vdso_lpad, label = 0
|
||||
lpad \label
|
||||
.endm
|
||||
#else
|
||||
.macro vdso_lpad, label = 0
|
||||
.endm
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This macro emits a program property note section identifying
|
||||
* architecture features which require special handling, mainly for
|
||||
* use in assembly files included in the VDSO.
|
||||
*/
|
||||
#define NT_GNU_PROPERTY_TYPE_0 5
|
||||
#define GNU_PROPERTY_RISCV_FEATURE_1_AND 0xc0000000
|
||||
|
||||
#define GNU_PROPERTY_RISCV_FEATURE_1_ZICFILP BIT(0)
|
||||
#define GNU_PROPERTY_RISCV_FEATURE_1_ZICFISS BIT(1)
|
||||
|
||||
#if defined(VDSO_CFI) && (__riscv_xlen == 64)
|
||||
#define GNU_PROPERTY_RISCV_FEATURE_1_DEFAULT \
|
||||
(GNU_PROPERTY_RISCV_FEATURE_1_ZICFILP | GNU_PROPERTY_RISCV_FEATURE_1_ZICFISS)
|
||||
#endif
|
||||
|
||||
#ifdef GNU_PROPERTY_RISCV_FEATURE_1_DEFAULT
|
||||
.macro emit_riscv_feature_1_and, feat = GNU_PROPERTY_RISCV_FEATURE_1_DEFAULT
|
||||
.pushsection .note.gnu.property, "a"
|
||||
.p2align 3
|
||||
.word 4
|
||||
.word 16
|
||||
.word NT_GNU_PROPERTY_TYPE_0
|
||||
.asciz "GNU"
|
||||
.word GNU_PROPERTY_RISCV_FEATURE_1_AND
|
||||
.word 4
|
||||
.word \feat
|
||||
.word 0
|
||||
.popsection
|
||||
.endm
|
||||
#else
|
||||
.macro emit_riscv_feature_1_and, feat = 0
|
||||
.endm
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -17,6 +17,11 @@ ifdef CONFIG_VDSO_GETRANDOM
|
|||
vdso-syms += getrandom
|
||||
endif
|
||||
|
||||
ifdef VDSO_CFI_BUILD
|
||||
CFI_MARCH = _zicfilp_zicfiss
|
||||
CFI_FULL = -fcf-protection=full
|
||||
endif
|
||||
|
||||
# Files to link into the vdso
|
||||
obj-vdso = $(patsubst %, %.o, $(vdso-syms)) note.o
|
||||
|
||||
|
|
@ -27,6 +32,10 @@ endif
|
|||
ccflags-y := -fno-stack-protector
|
||||
ccflags-y += -DDISABLE_BRANCH_PROFILING
|
||||
ccflags-y += -fno-builtin
|
||||
ccflags-y += $(KBUILD_BASE_ISA)$(CFI_MARCH)
|
||||
ccflags-y += $(CFI_FULL)
|
||||
asflags-y += $(KBUILD_BASE_ISA)$(CFI_MARCH)
|
||||
asflags-y += $(CFI_FULL)
|
||||
|
||||
ifneq ($(c-gettimeofday-y),)
|
||||
CFLAGS_vgettimeofday.o += -fPIC -include $(c-gettimeofday-y)
|
||||
|
|
@ -79,7 +88,7 @@ include/generated/vdso-offsets.h: $(obj)/vdso.so.dbg FORCE
|
|||
# The DSO images are built using a special linker script
|
||||
# Make sure only to export the intended __vdso_xxx symbol offsets.
|
||||
quiet_cmd_vdsold_and_check = VDSOLD $@
|
||||
cmd_vdsold_and_check = $(LD) $(ld_flags) -T $(filter-out FORCE,$^) -o $@.tmp && \
|
||||
cmd_vdsold_and_check = $(LD) $(CFI_FULL) $(ld_flags) -T $(filter-out FORCE,$^) -o $@.tmp && \
|
||||
$(OBJCOPY) $(patsubst %, -G __vdso_%, $(vdso-syms)) $@.tmp $@ && \
|
||||
rm $@.tmp && \
|
||||
$(cmd_vdso_check)
|
||||
|
|
|
|||
|
|
@ -5,11 +5,13 @@
|
|||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
.text
|
||||
/* int __vdso_flush_icache(void *start, void *end, unsigned long flags); */
|
||||
SYM_FUNC_START(__vdso_flush_icache)
|
||||
.cfi_startproc
|
||||
vdso_lpad
|
||||
#ifdef CONFIG_SMP
|
||||
li a7, __NR_riscv_flush_icache
|
||||
ecall
|
||||
|
|
@ -20,3 +22,5 @@ SYM_FUNC_START(__vdso_flush_icache)
|
|||
ret
|
||||
.cfi_endproc
|
||||
SYM_FUNC_END(__vdso_flush_icache)
|
||||
|
||||
emit_riscv_feature_1_and
|
||||
|
|
|
|||
|
|
@ -5,14 +5,18 @@
|
|||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
.text
|
||||
/* int __vdso_getcpu(unsigned *cpu, unsigned *node, void *unused); */
|
||||
SYM_FUNC_START(__vdso_getcpu)
|
||||
.cfi_startproc
|
||||
vdso_lpad
|
||||
/* For now, just do the syscall. */
|
||||
li a7, __NR_getcpu
|
||||
ecall
|
||||
ret
|
||||
.cfi_endproc
|
||||
SYM_FUNC_END(__vdso_getcpu)
|
||||
|
||||
emit_riscv_feature_1_and
|
||||
|
|
|
|||
|
|
@ -6,7 +6,10 @@
|
|||
|
||||
#include <linux/elfnote.h>
|
||||
#include <linux/version.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
ELFNOTE_START(Linux, 0, "a")
|
||||
.long LINUX_VERSION_CODE
|
||||
ELFNOTE_END
|
||||
|
||||
emit_riscv_feature_1_and
|
||||
|
|
|
|||
|
|
@ -5,12 +5,16 @@
|
|||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
.text
|
||||
SYM_FUNC_START(__vdso_rt_sigreturn)
|
||||
.cfi_startproc
|
||||
.cfi_signal_frame
|
||||
vdso_lpad
|
||||
li a7, __NR_rt_sigreturn
|
||||
ecall
|
||||
.cfi_endproc
|
||||
SYM_FUNC_END(__vdso_rt_sigreturn)
|
||||
|
||||
emit_riscv_feature_1_and
|
||||
|
|
|
|||
|
|
@ -3,13 +3,17 @@
|
|||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
.text
|
||||
SYM_FUNC_START(riscv_hwprobe)
|
||||
.cfi_startproc
|
||||
vdso_lpad
|
||||
li a7, __NR_riscv_hwprobe
|
||||
ecall
|
||||
ret
|
||||
|
||||
.cfi_endproc
|
||||
SYM_FUNC_END(riscv_hwprobe)
|
||||
|
||||
emit_riscv_feature_1_and
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@
|
|||
|
||||
#include <asm/asm.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
.text
|
||||
|
||||
|
|
@ -74,7 +75,7 @@ SYM_FUNC_START(__arch_chacha20_blocks_nostack)
|
|||
#define _20 20, 20, 20, 20
|
||||
#define _24 24, 24, 24, 24
|
||||
#define _25 25, 25, 25, 25
|
||||
|
||||
vdso_lpad
|
||||
/*
|
||||
* The ABI requires s0-s9 saved.
|
||||
* This does not violate the stack-less requirement: no sensitive data
|
||||
|
|
@ -247,3 +248,5 @@ SYM_FUNC_START(__arch_chacha20_blocks_nostack)
|
|||
|
||||
ret
|
||||
SYM_FUNC_END(__arch_chacha20_blocks_nostack)
|
||||
|
||||
emit_riscv_feature_1_and
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue