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. Commitc91db232da
("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:
parent
e4e9f6dfee
commit
9a96428557
|
@ -15,9 +15,9 @@
|
|||
#define BTI_J hint 36 ;
|
||||
|
||||
/*
|
||||
* When using in-kernel BTI we need to ensure that assembly functions
|
||||
* have suitable annotations. Override SYM_FUNC_START to insert a BTI
|
||||
* landing pad at the start of everything.
|
||||
* When using in-kernel BTI we need to ensure that PCS-conformant assembly
|
||||
* functions have suitable annotations. Override SYM_FUNC_START to insert
|
||||
* a BTI landing pad at the start of everything.
|
||||
*/
|
||||
#define SYM_FUNC_START(name) \
|
||||
SYM_START(name, SYM_L_GLOBAL, SYM_A_ALIGN) \
|
||||
|
|
|
@ -15,7 +15,14 @@
|
|||
.text
|
||||
|
||||
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_signal_frame
|
||||
.cfi_def_cfa x29, 0
|
||||
|
@ -24,6 +31,6 @@ SYM_FUNC_START(__kernel_rt_sigreturn)
|
|||
mov x8, #__NR_rt_sigreturn
|
||||
svc #0
|
||||
.cfi_endproc
|
||||
SYM_FUNC_END(__kernel_rt_sigreturn)
|
||||
SYM_CODE_END(__kernel_rt_sigreturn)
|
||||
|
||||
emit_aarch64_feature_1_and
|
||||
|
|
|
@ -17,39 +17,39 @@
|
|||
.save {r0-r15}
|
||||
.pad #COMPAT_SIGFRAME_REGS_OFFSET
|
||||
nop
|
||||
SYM_FUNC_START(__kernel_sigreturn_arm)
|
||||
SYM_CODE_START(__kernel_sigreturn_arm)
|
||||
mov r7, #__NR_compat_sigreturn
|
||||
svc #0
|
||||
.fnend
|
||||
SYM_FUNC_END(__kernel_sigreturn_arm)
|
||||
SYM_CODE_END(__kernel_sigreturn_arm)
|
||||
|
||||
.fnstart
|
||||
.save {r0-r15}
|
||||
.pad #COMPAT_RT_SIGFRAME_REGS_OFFSET
|
||||
nop
|
||||
SYM_FUNC_START(__kernel_rt_sigreturn_arm)
|
||||
SYM_CODE_START(__kernel_rt_sigreturn_arm)
|
||||
mov r7, #__NR_compat_rt_sigreturn
|
||||
svc #0
|
||||
.fnend
|
||||
SYM_FUNC_END(__kernel_rt_sigreturn_arm)
|
||||
SYM_CODE_END(__kernel_rt_sigreturn_arm)
|
||||
|
||||
.thumb
|
||||
.fnstart
|
||||
.save {r0-r15}
|
||||
.pad #COMPAT_SIGFRAME_REGS_OFFSET
|
||||
nop
|
||||
SYM_FUNC_START(__kernel_sigreturn_thumb)
|
||||
SYM_CODE_START(__kernel_sigreturn_thumb)
|
||||
mov r7, #__NR_compat_sigreturn
|
||||
svc #0
|
||||
.fnend
|
||||
SYM_FUNC_END(__kernel_sigreturn_thumb)
|
||||
SYM_CODE_END(__kernel_sigreturn_thumb)
|
||||
|
||||
.fnstart
|
||||
.save {r0-r15}
|
||||
.pad #COMPAT_RT_SIGFRAME_REGS_OFFSET
|
||||
nop
|
||||
SYM_FUNC_START(__kernel_rt_sigreturn_thumb)
|
||||
SYM_CODE_START(__kernel_rt_sigreturn_thumb)
|
||||
mov r7, #__NR_compat_rt_sigreturn
|
||||
svc #0
|
||||
.fnend
|
||||
SYM_FUNC_END(__kernel_rt_sigreturn_thumb)
|
||||
SYM_CODE_END(__kernel_rt_sigreturn_thumb)
|
||||
|
|
Loading…
Reference in New Issue