mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
Shadow stack instructions are taken from the Zimop ISA extension, which is mandated on RVA23. Any userspace with shadow stack instructions in it will fault on hardware that doesn't have support for Zimop. Thus, a shadow stack-enabled userspace can't be run on hardware that doesn't support Zimop. It's not known how Linux userspace providers will respond to this kind of binary fragmentation. In order to keep kernel portable across different hardware, 'arch/riscv/kernel/vdso_cfi' is created which has Makefile logic to compile 'arch/riscv/kernel/vdso' sources with CFI flags, and 'arch/riscv/kernel/vdso.c' is modified to select the appropriate vdso depending on whether the underlying CPU implements the Zimop extension. Since the offset of vdso symbols will change due to having two different vdso binaries, there is added logic to include a new generated vdso offset header and dynamically select the offset (like for rt_sigreturn). Signed-off-by: Deepak Gupta <debug@rivosinc.com> Acked-by: Charles Mirabile <cmirabil@redhat.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-24-b55691eacf4f@rivosinc.com [pjw@kernel.org: cleaned up patch description] Signed-off-by: Paul Walmsley <pjw@kernel.org>
53 lines
1.3 KiB
C
53 lines
1.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2012 ARM Limited
|
|
* Copyright (C) 2014 Regents of the University of California
|
|
* Copyright (C) 2017 SiFive
|
|
*/
|
|
|
|
#ifndef _ASM_RISCV_VDSO_H
|
|
#define _ASM_RISCV_VDSO_H
|
|
|
|
/*
|
|
* All systems with an MMU have a VDSO, but systems without an MMU don't
|
|
* support shared libraries and therefore don't have one.
|
|
*/
|
|
#ifdef CONFIG_MMU
|
|
|
|
#define __VDSO_PAGES 4
|
|
|
|
#ifndef __ASSEMBLER__
|
|
#include <generated/vdso-offsets.h>
|
|
#ifdef CONFIG_RISCV_USER_CFI
|
|
#include <generated/vdso-cfi-offsets.h>
|
|
#endif
|
|
|
|
#ifdef CONFIG_RISCV_USER_CFI
|
|
#define VDSO_SYMBOL(base, name) \
|
|
(riscv_has_extension_unlikely(RISCV_ISA_EXT_ZIMOP) ? \
|
|
(void __user *)((unsigned long)(base) + __vdso_##name##_cfi_offset) : \
|
|
(void __user *)((unsigned long)(base) + __vdso_##name##_offset))
|
|
#else
|
|
#define VDSO_SYMBOL(base, name) \
|
|
((void __user *)((unsigned long)(base) + __vdso_##name##_offset))
|
|
#endif
|
|
|
|
#ifdef CONFIG_COMPAT
|
|
#include <generated/compat_vdso-offsets.h>
|
|
|
|
#define COMPAT_VDSO_SYMBOL(base, name) \
|
|
(void __user *)((unsigned long)(base) + compat__vdso_##name##_offset)
|
|
|
|
extern char compat_vdso_start[], compat_vdso_end[];
|
|
|
|
#endif /* CONFIG_COMPAT */
|
|
|
|
extern char vdso_start[], vdso_end[];
|
|
extern char vdso_cfi_start[], vdso_cfi_end[];
|
|
|
|
#endif /* !__ASSEMBLER__ */
|
|
|
|
#endif /* CONFIG_MMU */
|
|
|
|
#endif /* _ASM_RISCV_VDSO_H */
|