From e028389dab575bf316e1f864cc91a96d7faec4a9 Mon Sep 17 00:00:00 2001 From: Will McVicker Date: Mon, 16 Nov 2020 14:21:34 -0800 Subject: [PATCH] ANDROID: arm64: Fix off-by-one vdso trampoline return value The VDSO_compat_* symbols added by vdso.lds.S for sigreturn32 are not being tagged in the symbol table as FUNC symbols by ld.lld. As a result, I see a SIGBUS error when running the LTP test syscalls.rt_sigaction01. This was fixed in https://reviews.llvm.org/D86263. Until we can update to the latest version of llvm, let's drop the bottom bit for these symbols in the VDSO_SYMBOL() macro so that the `vdso_trampoline + thumb` functions properly. Test: LTP test syscalls.rt_sigaction01 Bug: 172307050 Fixes: 71ca95b7e949 ("FROMLIST: arm64: vdso32: Allow ld.lld to properly link the VDSO") Signed-off-by: Will McVicker Change-Id: I24cf58ae62616a80c82653a7fc7dea93b33a3d0d --- arch/arm64/include/asm/vdso.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/arch/arm64/include/asm/vdso.h b/arch/arm64/include/asm/vdso.h index 9b197e5ea759..a08cc3cb0f8e 100644 --- a/arch/arm64/include/asm/vdso.h +++ b/arch/arm64/include/asm/vdso.h @@ -32,9 +32,10 @@ #include #endif -#define VDSO_SYMBOL(base, name) \ -({ \ - (void *)(vdso_offset_##name - VDSO_LBASE + (unsigned long)(base)); \ +#define VDSO_SYMBOL(base, name) \ +({ \ + (void *)((vdso_offset_##name & ~1UL) - VDSO_LBASE + \ + (unsigned long)(base)); \ }) #endif /* !__ASSEMBLY__ */