[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