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:
parent
5b8918fac6
commit
8a4bd7f818
@ -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
|
||||
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user