amd64 ia32 vdso: add unwind annotations to the signal trampoline

Reviewed by:	emaste
Discussed with:	jhb, jrtc27
Tested by:	pho
Sponsored by:	The FreeBSD Foundation
MFC after:	1 month
Differential revision:	https://reviews.freebsd.org/D32960
This commit is contained in:
Konstantin Belousov 2021-11-15 20:30:48 +02:00
parent 5b8918fac6
commit 8a4bd7f818
2 changed files with 52 additions and 3 deletions

View File

@ -2,6 +2,11 @@
* Copyright (c) 2003 Peter Wemm
* All rights reserved.
*
* Copyright (c) 2021 The FreeBSD Foundation
*
* Portions of this software were developed by Konstantin Belousov
* under sponsorship from the FreeBSD Foundation.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@ -39,15 +44,45 @@
ALIGN_TEXT
.globl __vdso_ia32_sigcode
__vdso_ia32_sigcode:
.cfi_startproc
.cfi_signal_frame
.cfi_def_cfa %esp, 0
#if 0
.cfi_offset %gs, IA32_SIGF_UC + IA32_UC_GS
.cfi_offset %fs, IA32_SIGF_UC + IA32_UC_FS
.cfi_offset %es, IA32_SIGF_UC + IA32_UC_ES
.cfi_offset %ds, IA32_SIGF_UC + IA32_UC_DS
#endif
.cfi_offset %edi, IA32_SIGF_UC + IA32_UC_EDI
.cfi_offset %esi, IA32_SIGF_UC + IA32_UC_ESI
.cfi_offset %ebp, IA32_SIGF_UC + IA32_UC_EBP
.cfi_offset %ebx, IA32_SIGF_UC + IA32_UC_EBX
.cfi_offset %edx, IA32_SIGF_UC + IA32_UC_EDX
.cfi_offset %ecx, IA32_SIGF_UC + IA32_UC_ECX
.cfi_offset %eax, IA32_SIGF_UC + IA32_UC_EAX
.cfi_offset %eip, IA32_SIGF_UC + IA32_UC_EIP
#if 0
.cfi_offset %cs, IA32_SIGF_UC + IA32_UC_CS
.cfi_offset %flags, IA32_SIGF_UC + IA32_UC_EFLAGS
#endif
.cfi_offset %esp, IA32_SIGF_UC + IA32_UC_ESP
#if 0
.cfi_offset %ss, IA32_SIGF_UC + IA32_UC_SS
.cfi_offset 93 /* %fs.base */, IA32_SIGF_UC + IA32_UC_FSBASE
.cfi_offset 94 /* %gs.base */, IA32_SIGF_UC + IA32_UC_GSBASE
#endif
calll *IA32_SIGF_HANDLER(%esp)
leal IA32_SIGF_UC(%esp),%eax /* get ucontext */
pushl %eax
.cfi_def_cfa %esp, 4
movl $SYS_sigreturn,%eax
pushl %eax /* junk to fake return addr. */
.cfi_def_cfa %esp, 8
int $0x80 /* enter kernel with args */
/* on stack */
1:
jmp 1b
.cfi_endproc
#ifdef COMPAT_FREEBSD4
ALIGN_TEXT

View File

@ -11,13 +11,27 @@ __FBSDID("$FreeBSD$");
ASSYM(IA32_SIGF_HANDLER, offsetof(struct ia32_sigframe, sf_ah));
ASSYM(IA32_SIGF_UC, offsetof(struct ia32_sigframe, sf_uc));
#ifdef COMPAT_43
ASSYM(IA32_SIGF_SC, offsetof(struct ia32_sigframe3, sf_siginfo.si_sc));
#endif
ASSYM(IA32_UC_GS, offsetof(struct ia32_ucontext, uc_mcontext.mc_gs));
ASSYM(IA32_UC_FS, offsetof(struct ia32_ucontext, uc_mcontext.mc_fs));
ASSYM(IA32_UC_ES, offsetof(struct ia32_ucontext, uc_mcontext.mc_es));
ASSYM(IA32_UC_DS, offsetof(struct ia32_ucontext, uc_mcontext.mc_ds));
ASSYM(IA32_UC_EDI, offsetof(struct ia32_ucontext, uc_mcontext.mc_edi));
ASSYM(IA32_UC_ESI, offsetof(struct ia32_ucontext, uc_mcontext.mc_esi));
ASSYM(IA32_UC_EBP, offsetof(struct ia32_ucontext, uc_mcontext.mc_ebp));
ASSYM(IA32_UC_EBX, offsetof(struct ia32_ucontext, uc_mcontext.mc_ebx));
ASSYM(IA32_UC_EDX, offsetof(struct ia32_ucontext, uc_mcontext.mc_edx));
ASSYM(IA32_UC_ECX, offsetof(struct ia32_ucontext, uc_mcontext.mc_ecx));
ASSYM(IA32_UC_EAX, offsetof(struct ia32_ucontext, uc_mcontext.mc_eax));
ASSYM(IA32_UC_EIP, offsetof(struct ia32_ucontext, uc_mcontext.mc_eip));
ASSYM(IA32_UC_CS, offsetof(struct ia32_ucontext, uc_mcontext.mc_cs));
ASSYM(IA32_UC_EFLAGS, offsetof(struct ia32_ucontext, uc_mcontext.mc_eflags));
ASSYM(IA32_UC_ESP, offsetof(struct ia32_ucontext, uc_mcontext.mc_esp));
ASSYM(IA32_UC_SS, offsetof(struct ia32_ucontext, uc_mcontext.mc_ss));
ASSYM(IA32_UC_FSBASE, offsetof(struct ia32_ucontext, uc_mcontext.mc_fsbase));
ASSYM(IA32_UC_GSBASE, offsetof(struct ia32_ucontext, uc_mcontext.mc_gsbase));
#ifdef COMPAT_43
ASSYM(IA32_SIGF_SC, offsetof(struct ia32_sigframe3, sf_siginfo.si_sc));
#endif
#ifdef COMPAT_FREEBSD4
ASSYM(IA32_SIGF_UC4, offsetof(struct ia32_sigframe4, sf_uc));
ASSYM(IA32_UC4_GS, offsetof(struct ia32_ucontext4, uc_mcontext.mc_gs));