linux(4): Retire handmade DWARF annotations from signal trampolines
The Linux exports __kernel_sigreturn and __kernel_rt_sigreturn from the vdso. Modern glibc's sigaction sets the sa_restorer field of sigaction to the corresponding vdso __sigreturn, and sets the SA_RESTORER. Our signal trampolines uses the FreeBSD-way to call a signal handler, so does not use the sigaction's sa_restorer. However, as glibc's runtime linker depends on the existment of the vdso __sigreturn symbols, for all Linuxulators was added separate trampolines named __sigcode with DWARF anotations and left separate __sigreturn methods, which are exported. MFC after: 2 weeks
This commit is contained in:
parent
6e826d27c3
commit
8f9635dc99
@ -12,5 +12,23 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
ASSYM(LINUX_RT_SIGF_UC, offsetof(struct l_rt_sigframe, sf_uc));
|
||||
ASSYM(LINUX_RT_SIGF_SC, offsetof(struct l_ucontext, uc_mcontext));
|
||||
ASSYM(L_SC_R8, offsetof(struct l_sigcontext, sc_r8));
|
||||
ASSYM(L_SC_R9, offsetof(struct l_sigcontext, sc_r9));
|
||||
ASSYM(L_SC_R10, offsetof(struct l_sigcontext, sc_r10));
|
||||
ASSYM(L_SC_R11, offsetof(struct l_sigcontext, sc_r11));
|
||||
ASSYM(L_SC_R12, offsetof(struct l_sigcontext, sc_r12));
|
||||
ASSYM(L_SC_R13, offsetof(struct l_sigcontext, sc_r13));
|
||||
ASSYM(L_SC_R14, offsetof(struct l_sigcontext, sc_r14));
|
||||
ASSYM(L_SC_R15, offsetof(struct l_sigcontext, sc_r15));
|
||||
ASSYM(L_SC_RDI, offsetof(struct l_sigcontext, sc_rdi));
|
||||
ASSYM(L_SC_RSI, offsetof(struct l_sigcontext, sc_rsi));
|
||||
ASSYM(L_SC_RBP, offsetof(struct l_sigcontext, sc_rbp));
|
||||
ASSYM(L_SC_RBX, offsetof(struct l_sigcontext, sc_rbx));
|
||||
ASSYM(L_SC_RDX, offsetof(struct l_sigcontext, sc_rdx));
|
||||
ASSYM(L_SC_RAX, offsetof(struct l_sigcontext, sc_rax));
|
||||
ASSYM(L_SC_RCX, offsetof(struct l_sigcontext, sc_rcx));
|
||||
ASSYM(L_SC_RSP, offsetof(struct l_sigcontext, sc_rsp));
|
||||
ASSYM(L_SC_RIP, offsetof(struct l_sigcontext, sc_rip));
|
||||
ASSYM(L_SC_RFLAGS, offsetof(struct l_sigcontext, sc_rflags));
|
||||
ASSYM(L_SC_CS, offsetof(struct l_sigcontext, sc_cs));
|
||||
ASSYM(LINUX_VERSION_CODE, LINUX_VERSION_CODE);
|
||||
ASSYM(LINUX_SC_RSP, offsetof(struct l_sigcontext, sc_rsp));
|
||||
|
@ -1,4 +1,31 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2015-2022 Dmitry Chagin <dchagin@freeBSD.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#include "linux_assym.h" /* system definitions */
|
||||
#include <machine/asmacros.h> /* miscellaneous asm macros */
|
||||
@ -14,15 +41,37 @@ linux_platform:
|
||||
.text
|
||||
|
||||
ENTRY(linux_rt_sigcode)
|
||||
.cfi_startproc
|
||||
.cfi_signal_frame
|
||||
.cfi_def_cfa %rsp, LINUX_RT_SIGF_SC
|
||||
.cfi_offset %r8, L_SC_R8
|
||||
.cfi_offset %r9, L_SC_R9
|
||||
.cfi_offset %r10, L_SC_R10
|
||||
.cfi_offset %r11, L_SC_R11
|
||||
.cfi_offset %r12, L_SC_R12
|
||||
.cfi_offset %r13, L_SC_R13
|
||||
.cfi_offset %r14, L_SC_R14
|
||||
.cfi_offset %r15, L_SC_R15
|
||||
.cfi_offset %rdi, L_SC_RDI
|
||||
.cfi_offset %rsi, L_SC_RSI
|
||||
.cfi_offset %rbp, L_SC_RBP
|
||||
.cfi_offset %rbx, L_SC_RBX
|
||||
.cfi_offset %rdx, L_SC_RDX
|
||||
.cfi_offset %rax, L_SC_RAX
|
||||
.cfi_offset %rcx, L_SC_RCX
|
||||
.cfi_offset %rip, L_SC_RIP
|
||||
.cfi_offset 49, L_SC_RFLAGS
|
||||
.cfi_offset %cs, L_SC_CS
|
||||
.cfi_offset %rsp, L_SC_RSP
|
||||
|
||||
movq %rsp, %rbx /* rt_sigframe for rt_sigreturn */
|
||||
call *%rcx /* call signal handler */
|
||||
.startrtsigcode:
|
||||
movq $LINUX_SYS_linux_rt_sigreturn, %rax
|
||||
syscall
|
||||
hlt
|
||||
.endrtsigcode:
|
||||
0: jmp 0b
|
||||
|
||||
0: hlt
|
||||
jmp 0b
|
||||
.cfi_endproc
|
||||
END(linux_rt_sigcode)
|
||||
|
||||
#if 0
|
||||
.section .note.Linux, "a",@note
|
||||
@ -40,34 +89,3 @@ ENTRY(linux_rt_sigcode)
|
||||
.balign 4
|
||||
.previous
|
||||
#endif
|
||||
|
||||
.section .eh_frame,"a",@progbits
|
||||
.LSTARTFRAMEDLSI0:
|
||||
.long .LENDCIEDLSI0-.LSTARTCIEDLSI0
|
||||
.LSTARTCIEDLSI0:
|
||||
.long 0 /* CIE ID */
|
||||
.byte 1 /* Version number */
|
||||
.string "zR" /* NULL-terminated
|
||||
* augmentation string
|
||||
*/
|
||||
.uleb128 1 /* Code alignment factor */
|
||||
.sleb128 -4 /* Data alignment factor */
|
||||
.byte 8 /* Return address register column */
|
||||
.uleb128 1 /* Augmentation value length */
|
||||
.byte 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
|
||||
.byte 0x0c /* DW_CFA_def_cfa */
|
||||
.uleb128 4
|
||||
.uleb128 4
|
||||
.byte 0x88 /* DW_CFA_offset, column 0x8 */
|
||||
.uleb128 1
|
||||
.align 4
|
||||
.LENDCIEDLSI0:
|
||||
.long .LENDFDEDLSI0-.LSTARTFDEDLSI0 /* Length FDE */
|
||||
.LSTARTFDEDLSI0:
|
||||
.long .LSTARTFDEDLSI0-.LSTARTFRAMEDLSI0 /* CIE pointer */
|
||||
.long .startrtsigcode-. /* PC-relative start address */
|
||||
.long .endrtsigcode-.startrtsigcode
|
||||
.uleb128 0
|
||||
.align 4
|
||||
.LENDFDEDLSI0:
|
||||
.previous
|
||||
|
@ -14,5 +14,20 @@ __FBSDID("$FreeBSD$");
|
||||
ASSYM(LINUX_SIGF_SC, offsetof(struct l_sigframe, sf_sc));
|
||||
ASSYM(LINUX_RT_SIGF_UC, offsetof(struct l_rt_sigframe, sf_uc));
|
||||
ASSYM(LINUX_RT_SIGF_SC, offsetof(struct l_ucontext, uc_mcontext));
|
||||
ASSYM(L_SC_GS, offsetof(struct l_sigcontext, sc_gs));
|
||||
ASSYM(L_SC_FS, offsetof(struct l_sigcontext, sc_fs));
|
||||
ASSYM(L_SC_ES, offsetof(struct l_sigcontext, sc_es));
|
||||
ASSYM(L_SC_DS, offsetof(struct l_sigcontext, sc_ds));
|
||||
ASSYM(L_SC_CS, offsetof(struct l_sigcontext, sc_cs));
|
||||
ASSYM(L_SC_SS, offsetof(struct l_sigcontext, sc_ss));
|
||||
ASSYM(L_SC_EFLAGS, offsetof(struct l_sigcontext, sc_eflags));
|
||||
ASSYM(L_SC_EDI, offsetof(struct l_sigcontext, sc_edi));
|
||||
ASSYM(L_SC_ESI, offsetof(struct l_sigcontext, sc_esi));
|
||||
ASSYM(L_SC_EBP, offsetof(struct l_sigcontext, sc_ebp));
|
||||
ASSYM(L_SC_EBX, offsetof(struct l_sigcontext, sc_ebx));
|
||||
ASSYM(L_SC_EDX, offsetof(struct l_sigcontext, sc_edx));
|
||||
ASSYM(L_SC_ECX, offsetof(struct l_sigcontext, sc_ecx));
|
||||
ASSYM(L_SC_EAX, offsetof(struct l_sigcontext, sc_eax));
|
||||
ASSYM(L_SC_EIP, offsetof(struct l_sigcontext, sc_eip));
|
||||
ASSYM(L_SC_ESP, offsetof(struct l_sigcontext, sc_esp_at_signal));
|
||||
ASSYM(LINUX_VERSION_CODE, LINUX_VERSION_CODE);
|
||||
ASSYM(LINUX_SC_ESP, offsetof(struct l_sigcontext, sc_esp));
|
||||
|
@ -14,30 +14,96 @@ linux_platform:
|
||||
.text
|
||||
.code32
|
||||
|
||||
ENTRY(__kernel_sigreturn)
|
||||
ENTRY(linux32_vdso_sigcode)
|
||||
.cfi_startproc
|
||||
.cfi_signal_frame
|
||||
.cfi_def_cfa %esp, LINUX_SIGF_SC
|
||||
.cfi_offset %gs, L_SC_GS
|
||||
.cfi_offset %fs, L_SC_FS
|
||||
.cfi_offset %es, L_SC_ES
|
||||
.cfi_offset %ds, L_SC_DS
|
||||
.cfi_offset %cs, L_SC_CS
|
||||
.cfi_offset %ss, L_SC_SS
|
||||
.cfi_offset %flags, L_SC_EFLAGS
|
||||
.cfi_offset %edi, L_SC_EDI
|
||||
.cfi_offset %esi, L_SC_ESI
|
||||
.cfi_offset %ebp, L_SC_EBP
|
||||
.cfi_offset %ebx, L_SC_EBX
|
||||
.cfi_offset %edx, L_SC_EDX
|
||||
.cfi_offset %ecx, L_SC_ECX
|
||||
.cfi_offset %eax, L_SC_EAX
|
||||
.cfi_offset %eip, L_SC_EIP
|
||||
.cfi_offset %esp, L_SC_ESP
|
||||
|
||||
movl %esp, %ebx /* sigframe for sigreturn */
|
||||
call *%edi /* call signal handler */
|
||||
popl %eax /* gcc unwind code need this */
|
||||
.cfi_def_cfa %esp, LINUX_SIGF_SC-4
|
||||
movl $LINUX32_SYS_linux_sigreturn, %eax
|
||||
int $0x80
|
||||
0: jmp 0b
|
||||
.cfi_endproc
|
||||
END(linux32_vdso_sigcode)
|
||||
|
||||
|
||||
ENTRY(linux32_vdso_rt_sigcode)
|
||||
.cfi_startproc
|
||||
.cfi_signal_frame
|
||||
.cfi_def_cfa %esp, LINUX_RT_SIGF_UC + LINUX_RT_SIGF_SC
|
||||
.cfi_offset %gs, L_SC_GS
|
||||
.cfi_offset %fs, L_SC_FS
|
||||
.cfi_offset %es, L_SC_ES
|
||||
.cfi_offset %ds, L_SC_DS
|
||||
.cfi_offset %cs, L_SC_CS
|
||||
.cfi_offset %ss, L_SC_SS
|
||||
.cfi_offset %flags, L_SC_EFLAGS
|
||||
.cfi_offset %edi, L_SC_EDI
|
||||
.cfi_offset %esi, L_SC_ESI
|
||||
.cfi_offset %ebp, L_SC_EBP
|
||||
.cfi_offset %ebx, L_SC_EBX
|
||||
.cfi_offset %edx, L_SC_EDX
|
||||
.cfi_offset %ecx, L_SC_ECX
|
||||
.cfi_offset %eax, L_SC_EAX
|
||||
.cfi_offset %eip, L_SC_EIP
|
||||
.cfi_offset %esp, L_SC_ESP
|
||||
|
||||
leal LINUX_RT_SIGF_UC(%esp), %ebx /* linux ucontext for rt_sigreturn */
|
||||
call *%edi /* call signal handler */
|
||||
movl $LINUX32_SYS_linux_rt_sigreturn, %eax
|
||||
int $0x80
|
||||
0: jmp 0b
|
||||
.cfi_endproc
|
||||
END(linux32_vdso_rt_sigcode)
|
||||
|
||||
ENTRY(__kernel_sigreturn)
|
||||
.cfi_startproc
|
||||
.cfi_signal_frame
|
||||
movl %esp, %ebx /* sigframe for sigreturn */
|
||||
call *%edi /* call signal handler */
|
||||
.startsigcode:
|
||||
popl %eax /* gcc unwind code need this */
|
||||
movl $LINUX32_SYS_linux_sigreturn, %eax
|
||||
int $0x80
|
||||
.endsigcode:
|
||||
0: jmp 0b
|
||||
.cfi_endproc
|
||||
END(__kernel_sigreturn)
|
||||
|
||||
ENTRY(__kernel_rt_sigreturn)
|
||||
.cfi_startproc
|
||||
.cfi_signal_frame
|
||||
leal LINUX_RT_SIGF_UC(%esp), %ebx /* linux ucontext for rt_sigreturn */
|
||||
call *%edi /* call signal handler */
|
||||
.startrtsigcode:
|
||||
movl $LINUX32_SYS_linux_rt_sigreturn, %eax
|
||||
int $0x80
|
||||
.endrtsigcode:
|
||||
0: jmp 0b
|
||||
.cfi_endproc
|
||||
END(__kernel_rt_sigreturn)
|
||||
|
||||
ENTRY(__kernel_vsyscall)
|
||||
.startvsyscall:
|
||||
.cfi_startproc
|
||||
int $0x80
|
||||
ret
|
||||
.endvsyscall:
|
||||
.cfi_endproc
|
||||
END(__kernel_vsyscall)
|
||||
|
||||
#if 0
|
||||
.section .note.Linux, "a",@note
|
||||
@ -55,86 +121,3 @@ ENTRY(__kernel_vsyscall)
|
||||
.balign 4
|
||||
.previous
|
||||
#endif
|
||||
|
||||
#define do_cfa_expr(offset) \
|
||||
.byte 0x0f; /* DW_CFA_def_cfa_expression */ \
|
||||
.uleb128 11f-10f; /* length */ \
|
||||
10: .byte 0x74; /* DW_OP_breg4 */ \
|
||||
.sleb128 offset; /* offset */ \
|
||||
.byte 0x06; /* DW_OP_deref */ \
|
||||
11:
|
||||
|
||||
|
||||
/* CIE */
|
||||
.section .eh_frame,"a",@progbits
|
||||
.LSTARTFRAMEDLSI1:
|
||||
.long .LENDCIEDLSI1-.LSTARTCIEDLSI1
|
||||
.LSTARTCIEDLSI1:
|
||||
.long 0 /* CIE ID */
|
||||
.byte 1 /* Version number */
|
||||
.string "zRS" /* NULL-terminated
|
||||
* augmentation string
|
||||
*/
|
||||
.uleb128 1 /* Code alignment factor */
|
||||
.sleb128 -4 /* Data alignment factor */
|
||||
.byte 8 /* Return address
|
||||
* register column
|
||||
*/
|
||||
.uleb128 1 /* Augmentation value length */
|
||||
.byte 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
|
||||
.byte 0 /* DW_CFA_nop */
|
||||
.align 4
|
||||
.LENDCIEDLSI1:
|
||||
|
||||
/* FDE */
|
||||
.long .LENDFDEDLSI1-.LSTARTFDEDLSI1 /* Length FDE */
|
||||
.LSTARTFDEDLSI1:
|
||||
.long .LSTARTFDEDLSI1-.LSTARTFRAMEDLSI1 /* CIE pointer */
|
||||
.long .startsigcode-. /* PC-relative start address */
|
||||
.long .endsigcode-.startsigcode
|
||||
.uleb128 0 /* Augmentation */
|
||||
do_cfa_expr(LINUX_SIGF_SC-8)
|
||||
.align 4
|
||||
.LENDFDEDLSI1:
|
||||
|
||||
.long .LENDFDEDLSI2-.LSTARTFDEDLSI2 /* Length FDE */
|
||||
.LSTARTFDEDLSI2:
|
||||
.long .LSTARTFDEDLSI2-.LSTARTFRAMEDLSI1 /* CIE pointer */
|
||||
.long .startrtsigcode-. /* PC-relative start address */
|
||||
.long .endrtsigcode-.startrtsigcode
|
||||
.uleb128 0 /* Augmentation */
|
||||
do_cfa_expr(LINUX_RT_SIGF_SC-4+LINUX_SC_ESP)
|
||||
.align 4
|
||||
.LENDFDEDLSI2:
|
||||
.previous
|
||||
|
||||
.section .eh_frame,"a",@progbits
|
||||
.LSTARTFRAMEDLSI2:
|
||||
.long .LENDCIEDLSI2-.LSTARTCIEDLSI2
|
||||
.LSTARTCIEDLSI2:
|
||||
.long 0 /* CIE ID */
|
||||
.byte 1 /* Version number */
|
||||
.string "zR" /* NULL-terminated
|
||||
* augmentation string
|
||||
*/
|
||||
.uleb128 1 /* Code alignment factor */
|
||||
.sleb128 -4 /* Data alignment factor */
|
||||
.byte 8 /* Return address register column */
|
||||
.uleb128 1 /* Augmentation value length */
|
||||
.byte 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
|
||||
.byte 0x0c /* DW_CFA_def_cfa */
|
||||
.uleb128 4
|
||||
.uleb128 4
|
||||
.byte 0x88 /* DW_CFA_offset, column 0x8 */
|
||||
.uleb128 1
|
||||
.align 4
|
||||
.LENDCIEDLSI2:
|
||||
.long .LENDFDEDLSI3-.LSTARTFDEDLSI3 /* Length FDE */
|
||||
.LSTARTFDEDLSI3:
|
||||
.long .LSTARTFDEDLSI3-.LSTARTFRAMEDLSI2 /* CIE pointer */
|
||||
.long .startvsyscall-. /* PC-relative start address */
|
||||
.long .endvsyscall-.startvsyscall
|
||||
.uleb128 0
|
||||
.align 4
|
||||
.LENDFDEDLSI3:
|
||||
.previous
|
||||
|
@ -183,8 +183,8 @@ struct linux32_ps_strings {
|
||||
sizeof(struct linux32_ps_strings))
|
||||
|
||||
LINUX_VDSO_SYM_INTPTR(__kernel_vsyscall);
|
||||
LINUX_VDSO_SYM_INTPTR(__kernel_sigreturn);
|
||||
LINUX_VDSO_SYM_INTPTR(__kernel_rt_sigreturn);
|
||||
LINUX_VDSO_SYM_INTPTR(linux32_vdso_sigcode);
|
||||
LINUX_VDSO_SYM_INTPTR(linux32_vdso_rt_sigcode);
|
||||
LINUX_VDSO_SYM_INTPTR(kern_timekeep_base);
|
||||
LINUX_VDSO_SYM_INTPTR(kern_tsc_selector);
|
||||
LINUX_VDSO_SYM_INTPTR(kern_cpu_selector);
|
||||
@ -367,7 +367,7 @@ linux_rt_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
||||
|
||||
/* Build context to run handler in. */
|
||||
regs->tf_rsp = PTROUT(fp);
|
||||
regs->tf_rip = __kernel_rt_sigreturn;
|
||||
regs->tf_rip = linux32_vdso_rt_sigcode;
|
||||
regs->tf_rdi = PTROUT(catcher);
|
||||
regs->tf_rflags &= ~(PSL_T | PSL_D);
|
||||
regs->tf_cs = _ucode32sel;
|
||||
@ -473,7 +473,7 @@ linux_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
||||
|
||||
/* Build context to run handler in. */
|
||||
regs->tf_rsp = PTROUT(fp);
|
||||
regs->tf_rip = __kernel_sigreturn;
|
||||
regs->tf_rip = linux32_vdso_sigcode;
|
||||
regs->tf_rdi = PTROUT(catcher);
|
||||
regs->tf_rflags &= ~(PSL_T | PSL_D);
|
||||
regs->tf_cs = _ucode32sel;
|
||||
|
@ -77,6 +77,8 @@ VERSION
|
||||
kern_timekeep_base;
|
||||
kern_tsc_selector;
|
||||
kern_cpu_selector;
|
||||
linux32_vdso_sigcode;
|
||||
linux32_vdso_rt_sigcode;
|
||||
local: *;
|
||||
};
|
||||
}
|
||||
|
@ -11,9 +11,22 @@ __FBSDID("$FreeBSD$");
|
||||
#include <x86/linux/linux_x86_sigframe.h>
|
||||
|
||||
ASSYM(LINUX_SIGF_SC, offsetof(struct l_sigframe, sf_sc));
|
||||
ASSYM(LINUX_SC_GS, offsetof(struct l_sigcontext, sc_gs));
|
||||
ASSYM(LINUX_SC_EFLAGS, offsetof(struct l_sigcontext, sc_eflags));
|
||||
ASSYM(LINUX_RT_SIGF_UC, offsetof(struct l_rt_sigframe, sf_uc));
|
||||
ASSYM(LINUX_RT_SIGF_SC, offsetof(struct l_ucontext, uc_mcontext));
|
||||
ASSYM(LINUX_SC_ESP, offsetof(struct l_sigcontext, sc_esp));
|
||||
ASSYM(L_SC_GS, offsetof(struct l_sigcontext, sc_gs));
|
||||
ASSYM(L_SC_FS, offsetof(struct l_sigcontext, sc_fs));
|
||||
ASSYM(L_SC_ES, offsetof(struct l_sigcontext, sc_es));
|
||||
ASSYM(L_SC_DS, offsetof(struct l_sigcontext, sc_ds));
|
||||
ASSYM(L_SC_CS, offsetof(struct l_sigcontext, sc_cs));
|
||||
ASSYM(L_SC_SS, offsetof(struct l_sigcontext, sc_ss));
|
||||
ASSYM(L_SC_EFLAGS, offsetof(struct l_sigcontext, sc_eflags));
|
||||
ASSYM(L_SC_EDI, offsetof(struct l_sigcontext, sc_edi));
|
||||
ASSYM(L_SC_ESI, offsetof(struct l_sigcontext, sc_esi));
|
||||
ASSYM(L_SC_EBP, offsetof(struct l_sigcontext, sc_ebp));
|
||||
ASSYM(L_SC_EBX, offsetof(struct l_sigcontext, sc_ebx));
|
||||
ASSYM(L_SC_EDX, offsetof(struct l_sigcontext, sc_edx));
|
||||
ASSYM(L_SC_ECX, offsetof(struct l_sigcontext, sc_ecx));
|
||||
ASSYM(L_SC_EAX, offsetof(struct l_sigcontext, sc_eax));
|
||||
ASSYM(L_SC_EIP, offsetof(struct l_sigcontext, sc_eip));
|
||||
ASSYM(L_SC_ESP, offsetof(struct l_sigcontext, sc_esp_at_signal));
|
||||
ASSYM(LINUX_VERSION_CODE, LINUX_VERSION_CODE);
|
||||
|
@ -15,30 +15,91 @@ linux_platform:
|
||||
|
||||
.text
|
||||
|
||||
ENTRY(__kernel_sigreturn)
|
||||
ENTRY(linux_vdso_sigcode)
|
||||
.cfi_startproc
|
||||
.cfi_signal_frame
|
||||
.cfi_def_cfa %esp, LINUX_SIGF_SC
|
||||
.cfi_offset %gs, L_SC_GS
|
||||
.cfi_offset %fs, L_SC_FS
|
||||
.cfi_offset %es, L_SC_ES
|
||||
.cfi_offset %ds, L_SC_DS
|
||||
.cfi_offset %cs, L_SC_CS
|
||||
.cfi_offset %ss, L_SC_SS
|
||||
.cfi_offset %flags, L_SC_EFLAGS
|
||||
.cfi_offset %edi, L_SC_EDI
|
||||
.cfi_offset %esi, L_SC_ESI
|
||||
.cfi_offset %ebp, L_SC_EBP
|
||||
.cfi_offset %ebx, L_SC_EBX
|
||||
.cfi_offset %edx, L_SC_EDX
|
||||
.cfi_offset %ecx, L_SC_ECX
|
||||
.cfi_offset %eax, L_SC_EAX
|
||||
.cfi_offset %eip, L_SC_EIP
|
||||
.cfi_offset %esp, L_SC_ESP
|
||||
|
||||
movl %esp, %ebx /* sigframe for sigreturn */
|
||||
call *%edi /* call signal handler */
|
||||
.startsigcode:
|
||||
popl %eax /* gcc unwind code need this */
|
||||
.cfi_def_cfa %esp, LINUX_SIGF_SC-4
|
||||
movl $LINUX_SYS_linux_sigreturn, %eax
|
||||
int $0x80
|
||||
0: jmp 0b
|
||||
.cfi_endproc
|
||||
END(linux_vdso_sigcode)
|
||||
|
||||
ENTRY(linux_vdso_rt_sigcode)
|
||||
.cfi_startproc
|
||||
.cfi_signal_frame
|
||||
.cfi_def_cfa %esp, LINUX_RT_SIGF_UC + LINUX_RT_SIGF_SC
|
||||
.cfi_offset %gs, L_SC_GS
|
||||
.cfi_offset %fs, L_SC_FS
|
||||
.cfi_offset %es, L_SC_ES
|
||||
.cfi_offset %ds, L_SC_DS
|
||||
.cfi_offset %cs, L_SC_CS
|
||||
.cfi_offset %ss, L_SC_SS
|
||||
.cfi_offset %flags, L_SC_EFLAGS
|
||||
.cfi_offset %edi, L_SC_EDI
|
||||
.cfi_offset %esi, L_SC_ESI
|
||||
.cfi_offset %ebp, L_SC_EBP
|
||||
.cfi_offset %ebx, L_SC_EBX
|
||||
.cfi_offset %edx, L_SC_EDX
|
||||
.cfi_offset %ecx, L_SC_ECX
|
||||
.cfi_offset %eax, L_SC_EAX
|
||||
.cfi_offset %eip, L_SC_EIP
|
||||
.cfi_offset %esp, L_SC_ESP
|
||||
|
||||
leal LINUX_RT_SIGF_UC(%esp), %ebx /* linux ucontext for rt_sigreturn */
|
||||
call *%edi /* call signal handler */
|
||||
movl $LINUX_SYS_linux_rt_sigreturn, %eax
|
||||
int $0x80
|
||||
0: jmp 0b
|
||||
.cfi_endproc
|
||||
END(linux_vdso_rt_sigcode)
|
||||
|
||||
ENTRY(__kernel_sigreturn)
|
||||
.cfi_startproc
|
||||
.cfi_signal_frame
|
||||
popl %eax /* gcc unwind code need this */
|
||||
movl $LINUX_SYS_linux_sigreturn, %eax
|
||||
int $0x80
|
||||
.endsigcode:
|
||||
0: jmp 0b
|
||||
.cfi_endproc
|
||||
END(__kernel_sigreturn)
|
||||
|
||||
ENTRY(__kernel_rt_sigreturn)
|
||||
leal LINUX_RT_SIGF_UC(%esp), %ebx /* linux ucontext for rt_sigreturn */
|
||||
call *%edi /* call signal handler */
|
||||
.startrtsigcode:
|
||||
.cfi_startproc
|
||||
.cfi_signal_frame
|
||||
movl $LINUX_SYS_linux_rt_sigreturn, %eax
|
||||
int $0x80
|
||||
.endrtsigcode:
|
||||
0: jmp 0b
|
||||
.cfi_endproc
|
||||
END(__kernel_rt_sigreturn)
|
||||
|
||||
ENTRY(__kernel_vsyscall)
|
||||
.startvsyscall:
|
||||
.cfi_startproc
|
||||
int $0x80
|
||||
ret
|
||||
.endvsyscall:
|
||||
.cfi_endproc
|
||||
END(__kernel_vsyscall)
|
||||
|
||||
#if 0
|
||||
.section .note.Linux, "a",@note
|
||||
@ -56,86 +117,3 @@ ENTRY(__kernel_vsyscall)
|
||||
.balign 4
|
||||
.previous
|
||||
#endif
|
||||
|
||||
#define do_cfa_expr(offset) \
|
||||
.byte 0x0f; /* DW_CFA_def_cfa_expression */ \
|
||||
.uleb128 11f-10f; /* length */ \
|
||||
10: .byte 0x74; /* DW_OP_breg4 */ \
|
||||
.sleb128 offset; /* offset */ \
|
||||
.byte 0x06; /* DW_OP_deref */ \
|
||||
11:
|
||||
|
||||
|
||||
/* CIE */
|
||||
.section .eh_frame,"a",@progbits
|
||||
.LSTARTFRAMEDLSI1:
|
||||
.long .LENDCIEDLSI1-.LSTARTCIEDLSI1
|
||||
.LSTARTCIEDLSI1:
|
||||
.long 0 /* CIE ID */
|
||||
.byte 1 /* Version number */
|
||||
.string "zRS" /* NULL-terminated
|
||||
* augmentation string
|
||||
*/
|
||||
.uleb128 1 /* Code alignment factor */
|
||||
.sleb128 -4 /* Data alignment factor */
|
||||
.byte 8 /* Return address
|
||||
* register column
|
||||
*/
|
||||
.uleb128 1 /* Augmentation value length */
|
||||
.byte 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
|
||||
.byte 0 /* DW_CFA_nop */
|
||||
.align 4
|
||||
.LENDCIEDLSI1:
|
||||
|
||||
/* FDE */
|
||||
.long .LENDFDEDLSI1-.LSTARTFDEDLSI1 /* Length FDE */
|
||||
.LSTARTFDEDLSI1:
|
||||
.long .LSTARTFDEDLSI1-.LSTARTFRAMEDLSI1 /* CIE pointer */
|
||||
.long .startsigcode-. /* PC-relative start address */
|
||||
.long .endsigcode-.startsigcode
|
||||
.uleb128 0 /* Augmentation */
|
||||
do_cfa_expr(LINUX_SIGF_SC-8)
|
||||
.align 4
|
||||
.LENDFDEDLSI1:
|
||||
|
||||
.long .LENDFDEDLSI2-.LSTARTFDEDLSI2 /* Length FDE */
|
||||
.LSTARTFDEDLSI2:
|
||||
.long .LSTARTFDEDLSI2-.LSTARTFRAMEDLSI1 /* CIE pointer */
|
||||
.long .startrtsigcode-. /* PC-relative start address */
|
||||
.long .endrtsigcode-.startrtsigcode
|
||||
.uleb128 0 /* Augmentation */
|
||||
do_cfa_expr(LINUX_RT_SIGF_SC-4+LINUX_SC_ESP)
|
||||
.align 4
|
||||
.LENDFDEDLSI2:
|
||||
.previous
|
||||
|
||||
.section .eh_frame,"a",@progbits
|
||||
.LSTARTFRAMEDLSI2:
|
||||
.long .LENDCIEDLSI2-.LSTARTCIEDLSI2
|
||||
.LSTARTCIEDLSI2:
|
||||
.long 0 /* CIE ID */
|
||||
.byte 1 /* Version number */
|
||||
.string "zR" /* NULL-terminated
|
||||
* augmentation string
|
||||
*/
|
||||
.uleb128 1 /* Code alignment factor */
|
||||
.sleb128 -4 /* Data alignment factor */
|
||||
.byte 8 /* Return address register column */
|
||||
.uleb128 1 /* Augmentation value length */
|
||||
.byte 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */
|
||||
.byte 0x0c /* DW_CFA_def_cfa */
|
||||
.uleb128 4
|
||||
.uleb128 4
|
||||
.byte 0x88 /* DW_CFA_offset, column 0x8 */
|
||||
.uleb128 1
|
||||
.align 4
|
||||
.LENDCIEDLSI2:
|
||||
.long .LENDFDEDLSI3-.LSTARTFDEDLSI3 /* Length FDE */
|
||||
.LSTARTFDEDLSI3:
|
||||
.long .LSTARTFDEDLSI3-.LSTARTFRAMEDLSI2 /* CIE pointer */
|
||||
.long .startvsyscall-. /* PC-relative start address */
|
||||
.long .endvsyscall-.startvsyscall
|
||||
.uleb128 0
|
||||
.align 4
|
||||
.LENDFDEDLSI3:
|
||||
.previous
|
||||
|
@ -158,8 +158,8 @@ static int _bsd_to_linux_trapcode[] = {
|
||||
|
||||
LINUX_VDSO_SYM_CHAR(linux_platform);
|
||||
LINUX_VDSO_SYM_INTPTR(__kernel_vsyscall);
|
||||
LINUX_VDSO_SYM_INTPTR(__kernel_sigreturn);
|
||||
LINUX_VDSO_SYM_INTPTR(__kernel_rt_sigreturn);
|
||||
LINUX_VDSO_SYM_INTPTR(linux_vdso_sigcode);
|
||||
LINUX_VDSO_SYM_INTPTR(linux_vdso_rt_sigcode);
|
||||
LINUX_VDSO_SYM_INTPTR(kern_timekeep_base);
|
||||
LINUX_VDSO_SYM_INTPTR(kern_tsc_selector);
|
||||
LINUX_VDSO_SYM_INTPTR(kern_cpu_selector);
|
||||
@ -473,7 +473,7 @@ linux_rt_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
||||
|
||||
/* Build context to run handler in. */
|
||||
regs->tf_esp = PTROUT(fp);
|
||||
regs->tf_eip = __kernel_rt_sigreturn;
|
||||
regs->tf_eip = linux_vdso_rt_sigcode;
|
||||
regs->tf_edi = PTROUT(catcher);
|
||||
regs->tf_eflags &= ~(PSL_T | PSL_VM | PSL_D);
|
||||
regs->tf_cs = _ucodesel;
|
||||
@ -574,7 +574,7 @@ linux_sendsig(sig_t catcher, ksiginfo_t *ksi, sigset_t *mask)
|
||||
|
||||
/* Build context to run handler in. */
|
||||
regs->tf_esp = PTROUT(fp);
|
||||
regs->tf_eip = __kernel_sigreturn;
|
||||
regs->tf_eip = linux_vdso_sigcode;
|
||||
regs->tf_edi = PTROUT(catcher);
|
||||
regs->tf_eflags &= ~(PSL_T | PSL_VM | PSL_D);
|
||||
regs->tf_cs = _ucodesel;
|
||||
|
@ -77,6 +77,8 @@ VERSION
|
||||
kern_timekeep_base;
|
||||
kern_tsc_selector;
|
||||
kern_cpu_selector;
|
||||
linux_vdso_sigcode;
|
||||
linux_vdso_rt_sigcode;
|
||||
local: *;
|
||||
};
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user