Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37629ea8 authored by Kevin Brodsky's avatar Kevin Brodsky Committed by Gagan Malvi
Browse files

FROMLIST: [PATCH 1/6] arm64: compat: Use vDSO sigreturn trampolines if available

(cherry pick from url https://patchwork.kernel.org/patch/10060449/

)

If the compat vDSO is enabled, it replaces the sigreturn page.
Therefore, we use the sigreturn trampolines the vDSO provides instead.

Signed-off-by: default avatarKevin Brodsky <kevin.brodsky@arm.com>
Signed-off-by: default avatarMark Salyzyn <salyzyn@android.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Dave Martin <Dave.Martin@arm.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
Bug: 63737556
Bug: 20045882
Change-Id: Ic0933741e321e1bf66409b7e190a776f12948024

Signed-off-by: default avatarstarlight5234 <ifist2834@gmail.com>
Signed-off-by: default avatarTheSync <repo-sync@outlook.com>
parent 0499c51f
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -28,6 +28,9 @@
#ifndef __ASSEMBLY__

#include <generated/vdso-offsets.h>
#ifdef CONFIG_VDSO32
#include <generated/vdso32-offsets.h>
#endif

#define VDSO_SYMBOL(base, name)						   \
({									   \
+15 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <asm/signal32.h>
#include <asm/uaccess.h>
#include <asm/unistd.h>
#include <asm/vdso.h>

struct compat_vfp_sigframe {
	compat_ulong_t	magic;
@@ -438,6 +439,19 @@ static void compat_setup_return(struct pt_regs *regs, struct k_sigaction *ka,
		retcode = ptr_to_compat(ka->sa.sa_restorer);
	} else {
		/* Set up sigreturn pointer */
#ifdef CONFIG_VDSO32
		void *vdso_base = current->mm->context.vdso;
		void *trampoline =
			(ka->sa.sa_flags & SA_SIGINFO
			 ? (thumb
			    ? VDSO_SYMBOL(vdso_base, compat_rt_sigreturn_thumb)
			    : VDSO_SYMBOL(vdso_base, compat_rt_sigreturn_arm))
			 : (thumb
			    ? VDSO_SYMBOL(vdso_base, compat_sigreturn_thumb)
			    : VDSO_SYMBOL(vdso_base, compat_sigreturn_arm)));

		retcode = ptr_to_compat(trampoline) + thumb;
#else
		void *sigreturn_base = current->mm->context.vdso;
		unsigned int idx = thumb << 1;

@@ -445,6 +459,7 @@ static void compat_setup_return(struct pt_regs *regs, struct k_sigaction *ka,
			idx += 3;

		retcode = ptr_to_compat(sigreturn_base) + (idx << 2) + thumb;
#endif
	}

	regs->regs[0]	= usig;