diff mbox series

riscv: add icache flush for nommu sigreturn trampoline

Message ID 20230406001104.3361877-1-mathis.salmen@matsal.de (mailing list archive)
State Superseded
Headers show
Series riscv: add icache flush for nommu sigreturn trampoline | expand

Checks

Context Check Description
conchuod/cover_letter success Single patches do not need cover letters
conchuod/tree_selection success Guessed tree name to be for-next at HEAD d34a6b715a23
conchuod/fixes_present success Fixes tag not required for -next series
conchuod/maintainers_pattern success MAINTAINERS pattern errors before the patch: 1 and now 1
conchuod/verify_signedoff success Signed-off-by tag matches author and committer
conchuod/kdoc success Errors and warnings before: 0 this patch: 0
conchuod/build_rv64_clang_allmodconfig success Errors and warnings before: 18 this patch: 18
conchuod/module_param success Was 0 now: 0
conchuod/build_rv64_gcc_allmodconfig success Errors and warnings before: 18 this patch: 18
conchuod/build_rv32_defconfig success Build OK
conchuod/dtb_warn_rv64 success Errors and warnings before: 3 this patch: 3
conchuod/header_inline success No static functions without inline keyword in header files
conchuod/checkpatch warning CHECK: Alignment should match open parenthesis CHECK: Consider using #include <linux/cacheflush.h> instead of <asm/cacheflush.h>
conchuod/source_inline success Was 0 now: 0
conchuod/build_rv64_nommu_k210_defconfig success Build OK
conchuod/verify_fixes success No Fixes tag
conchuod/build_rv64_nommu_virt_defconfig success Build OK

Commit Message

Mathis Salmen April 6, 2023, 12:11 a.m. UTC
In a NOMMU kernel, sigreturn trampolines are generated on the user
stack by setup_rt_frame. Currently, these trampolines are not instruction
fenced, thus their visibility to ifetch is not guaranteed.

This patch adds a flush_icache_range in setup_rt_frame to fix this
problem.

Signed-off-by: Mathis Salmen <mathis.salmen@matsal.de>
---
 arch/riscv/kernel/signal.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Christoph Hellwig April 6, 2023, 5:33 a.m. UTC | #1
On Thu, Apr 06, 2023 at 02:11:04AM +0200, Mathis Salmen wrote:
> +	/* Make sure the two instructions are pushed to icache. */
> +	flush_icache_range((uintptr_t)&frame->sigreturn_code,
> +			(uintptr_t)&frame->sigreturn_code + sizeof(frame->sigreturn_code));
>  	regs->ra = (unsigned long)&frame->sigreturn_code;

Please add a local variable for the in-casted value of
&frame->sigreturn_code to actually make this readable.
diff mbox series

Patch

diff --git a/arch/riscv/kernel/signal.c b/arch/riscv/kernel/signal.c
index bfb2afa41..548703230 100644
--- a/arch/riscv/kernel/signal.c
+++ b/arch/riscv/kernel/signal.c
@@ -19,6 +19,7 @@ 
 #include <asm/signal32.h>
 #include <asm/switch_to.h>
 #include <asm/csr.h>
+#include <asm/cacheflush.h>
 
 extern u32 __user_rt_sigreturn[2];
 
@@ -209,6 +210,10 @@  static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
 	if (copy_to_user(&frame->sigreturn_code, __user_rt_sigreturn,
 			 sizeof(frame->sigreturn_code)))
 		return -EFAULT;
+	/* Make sure the two instructions are pushed to icache. */
+	flush_icache_range((uintptr_t)&frame->sigreturn_code,
+			(uintptr_t)&frame->sigreturn_code + sizeof(frame->sigreturn_code));
+
 	regs->ra = (unsigned long)&frame->sigreturn_code;
 #endif /* CONFIG_MMU */