Unverified Commit e609b4f4 authored by Sami Tolvanen's avatar Sami Tolvanen Committed by Palmer Dabbelt
Browse files

riscv: Move global pointer loading to a macro

In Clang 17, -fsanitize=shadow-call-stack uses the newly declared
platform register gp for storing shadow call stack pointers. As
this is obviously incompatible with gp relaxation, in preparation
for CONFIG_SHADOW_CALL_STACK support, move global pointer loading
to a single macro, which we can cleanly disable when SCS is used
instead.

Link: https://reviews.llvm.org/rGaa1d2693c256
Link: https://github.com/riscv-non-isa/riscv-elf-psabi-doc/commit/a484e843e6eeb51f0cb7b8819e50da6d2444d769


Signed-off-by: default avatarSami Tolvanen <samitolvanen@google.com>
Tested-by: default avatarNathan Chancellor <nathan@kernel.org>
Link: https://lore.kernel.org/r/20230927224757.1154247-11-samitolvanen@google.com


Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent 82982fdd
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -109,6 +109,14 @@
	REG_L \dst, 0(\dst)
.endm

/* load __global_pointer to gp */
.macro load_global_pointer
.option push
.option norelax
	la gp, __global_pointer$
.option pop
.endm

	/* save all GPs except x1 ~ x5 */
	.macro save_from_x6_to_x31
	REG_S x6,  PT_T1(sp)
+2 −4
Original line number Diff line number Diff line
@@ -75,10 +75,8 @@ _save_context:
	csrw CSR_SCRATCH, x0

	/* Load the global pointer */
.option push
.option norelax
	la gp, __global_pointer$
.option pop
	load_global_pointer

	move a0, sp /* pt_regs */
	la ra, ret_from_exception

+3 −12
Original line number Diff line number Diff line
@@ -110,10 +110,7 @@ relocate_enable_mmu:
	csrw CSR_TVEC, a0

	/* Reload the global pointer */
.option push
.option norelax
	la gp, __global_pointer$
.option pop
	load_global_pointer

	/*
	 * Switch to kernel page tables.  A full fence is necessary in order to
@@ -134,10 +131,7 @@ secondary_start_sbi:
	csrw CSR_IP, zero

	/* Load the global pointer */
	.option push
	.option norelax
		la gp, __global_pointer$
	.option pop
	load_global_pointer

	/*
	 * Disable FPU & VECTOR to detect illegal usage of
@@ -228,10 +222,7 @@ pmp_done:
#endif /* CONFIG_RISCV_M_MODE */

	/* Load the global pointer */
.option push
.option norelax
	la gp, __global_pointer$
.option pop
	load_global_pointer

	/*
	 * Disable FPU & VECTOR to detect illegal usage of
+1 −4
Original line number Diff line number Diff line
@@ -61,10 +61,7 @@ END(__cpu_suspend_enter)

SYM_TYPED_FUNC_START(__cpu_resume_enter)
	/* Load the global pointer */
	.option push
	.option norelax
		la gp, __global_pointer$
	.option pop
	load_global_pointer

#ifdef CONFIG_MMU
	/* Save A0 and A1 */