arm64: vdso: Don't prefix sigreturn trampoline with a BTI C instruction

For better or worse, GDB relies on the exact instruction sequence in the
VDSO sigreturn trampoline in order to unwind from signals correctly.
Commit c91db232da ("arm64: vdso: Convert to modern assembler annotations")
unfortunately added a BTI C instruction to the start of __kernel_rt_sigreturn,
which breaks this check. Thankfully, it's also not required, since the
trampoline is called from a RET instruction when returning from the signal
handler

Remove the unnecessary BTI C instruction from __kernel_rt_sigreturn,
and do the same for the 32-bit VDSO as well for good measure.

Cc: Daniel Kiss <daniel.kiss@arm.com>
Cc: Tamas Zsoldos <tamas.zsoldos@arm.com>
Reviewed-by: Dave Martin <dave.martin@arm.com>
Reviewed-by: Mark Brown <broonie@kernel.org>
Fixes: c91db232da ("arm64: vdso: Convert to modern assembler annotations")
Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
Will Deacon 2020-05-19 12:38:33 +01:00
parent e4e9f6dfee
commit 9a96428557
3 changed files with 20 additions and 13 deletions

View File

@ -15,9 +15,9 @@
#define BTI_J hint 36 ; #define BTI_J hint 36 ;
/* /*
* When using in-kernel BTI we need to ensure that assembly functions * When using in-kernel BTI we need to ensure that PCS-conformant assembly
* have suitable annotations. Override SYM_FUNC_START to insert a BTI * functions have suitable annotations. Override SYM_FUNC_START to insert
* landing pad at the start of everything. * a BTI landing pad at the start of everything.
*/ */
#define SYM_FUNC_START(name) \ #define SYM_FUNC_START(name) \
SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) \ SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) \

View File

@ -15,7 +15,14 @@
.text .text
nop nop
SYM_FUNC_START(__kernel_rt_sigreturn) /*
* GDB relies on being able to identify the sigreturn instruction sequence to
* unwind from signal handlers. We cannot, therefore, use SYM_FUNC_START()
* here, as it will emit a BTI C instruction and break the unwinder. Thankfully,
* this function is only ever called from a RET and so omitting the landing pad
* is perfectly fine.
*/
SYM_CODE_START(__kernel_rt_sigreturn)
.cfi_startproc .cfi_startproc
.cfi_signal_frame .cfi_signal_frame
.cfi_def_cfa x29, 0 .cfi_def_cfa x29, 0
@ -24,6 +31,6 @@ SYM_FUNC_START(__kernel_rt_sigreturn)
mov x8, #__NR_rt_sigreturn mov x8, #__NR_rt_sigreturn
svc #0 svc #0
.cfi_endproc .cfi_endproc
SYM_FUNC_END(__kernel_rt_sigreturn) SYM_CODE_END(__kernel_rt_sigreturn)
emit_aarch64_feature_1_and emit_aarch64_feature_1_and

View File

@ -17,39 +17,39 @@
.save {r0-r15} .save {r0-r15}
.pad #COMPAT_SIGFRAME_REGS_OFFSET .pad #COMPAT_SIGFRAME_REGS_OFFSET
nop nop
SYM_FUNC_START(__kernel_sigreturn_arm) SYM_CODE_START(__kernel_sigreturn_arm)
mov r7, #__NR_compat_sigreturn mov r7, #__NR_compat_sigreturn
svc #0 svc #0
.fnend .fnend
SYM_FUNC_END(__kernel_sigreturn_arm) SYM_CODE_END(__kernel_sigreturn_arm)
.fnstart .fnstart
.save {r0-r15} .save {r0-r15}
.pad #COMPAT_RT_SIGFRAME_REGS_OFFSET .pad #COMPAT_RT_SIGFRAME_REGS_OFFSET
nop nop
SYM_FUNC_START(__kernel_rt_sigreturn_arm) SYM_CODE_START(__kernel_rt_sigreturn_arm)
mov r7, #__NR_compat_rt_sigreturn mov r7, #__NR_compat_rt_sigreturn
svc #0 svc #0
.fnend .fnend
SYM_FUNC_END(__kernel_rt_sigreturn_arm) SYM_CODE_END(__kernel_rt_sigreturn_arm)
.thumb .thumb
.fnstart .fnstart
.save {r0-r15} .save {r0-r15}
.pad #COMPAT_SIGFRAME_REGS_OFFSET .pad #COMPAT_SIGFRAME_REGS_OFFSET
nop nop
SYM_FUNC_START(__kernel_sigreturn_thumb) SYM_CODE_START(__kernel_sigreturn_thumb)
mov r7, #__NR_compat_sigreturn mov r7, #__NR_compat_sigreturn
svc #0 svc #0
.fnend .fnend
SYM_FUNC_END(__kernel_sigreturn_thumb) SYM_CODE_END(__kernel_sigreturn_thumb)
.fnstart .fnstart
.save {r0-r15} .save {r0-r15}
.pad #COMPAT_RT_SIGFRAME_REGS_OFFSET .pad #COMPAT_RT_SIGFRAME_REGS_OFFSET
nop nop
SYM_FUNC_START(__kernel_rt_sigreturn_thumb) SYM_CODE_START(__kernel_rt_sigreturn_thumb)
mov r7, #__NR_compat_rt_sigreturn mov r7, #__NR_compat_rt_sigreturn
svc #0 svc #0
.fnend .fnend
SYM_FUNC_END(__kernel_rt_sigreturn_thumb) SYM_CODE_END(__kernel_rt_sigreturn_thumb)