[PATCH v2] riscv: add icache flush for nommu sigreturn trampoline

Conor Dooley conor at kernel.org
Sat Apr 8 12:51:28 PDT 2023


Hey Mathis,

On Thu, Apr 06, 2023 at 12:11:31PM +0200, Mathis Salmen wrote:
> 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.
> 

I assume that this is then
Fixes: 6bd33e1ece52 ("riscv: add nommu support")
yeah?

Cheers,
Conor.

> Signed-off-by: Mathis Salmen <mathis.salmen at matsal.de>
> ---
> V1 -> V2: Added local variable for readability.
> 
>  arch/riscv/kernel/signal.c | 9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/riscv/kernel/signal.c b/arch/riscv/kernel/signal.c
> index bfb2afa41..dee66c929 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];
>  
> @@ -181,6 +182,7 @@ static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
>  {
>  	struct rt_sigframe __user *frame;
>  	long err = 0;
> +	unsigned long __maybe_unused addr;
>  
>  	frame = get_sigframe(ksig, regs, sizeof(*frame));
>  	if (!access_ok(frame, sizeof(*frame)))
> @@ -209,7 +211,12 @@ 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;
> -	regs->ra = (unsigned long)&frame->sigreturn_code;
> +
> +	addr = (unsigned long)&frame->sigreturn_code;
> +	/* Make sure the two instructions are pushed to icache. */
> +	flush_icache_range(addr, addr + sizeof(frame->sigreturn_code));
> +
> +	regs->ra = addr;
>  #endif /* CONFIG_MMU */
>  
>  	/*
> -- 
> 2.40.0
> 
> 
> _______________________________________________
> linux-riscv mailing list
> linux-riscv at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-riscv/attachments/20230408/8c563d0a/attachment.sig>


More information about the linux-riscv mailing list