amd64 native 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:29:45 +02:00
parent eb02958748
commit 5b8918fac6
3 changed files with 78 additions and 1 deletions

View File

@ -205,6 +205,33 @@ ASSYM(PTI_SIZE, sizeof(struct pti_frame));
ASSYM(SIGF_HANDLER, offsetof(struct sigframe, sf_ahu.sf_handler));
ASSYM(SIGF_UC, offsetof(struct sigframe, sf_uc));
ASSYM(UC_EFLAGS, offsetof(ucontext_t, uc_mcontext.mc_rflags));
ASSYM(UC_RDI, offsetof(ucontext_t, uc_mcontext.mc_rdi));
ASSYM(UC_RSI, offsetof(ucontext_t, uc_mcontext.mc_rsi));
ASSYM(UC_RDX, offsetof(ucontext_t, uc_mcontext.mc_rdx));
ASSYM(UC_RCX, offsetof(ucontext_t, uc_mcontext.mc_rcx));
ASSYM(UC_R8, offsetof(ucontext_t, uc_mcontext.mc_r8));
ASSYM(UC_R9, offsetof(ucontext_t, uc_mcontext.mc_r9));
ASSYM(UC_RAX, offsetof(ucontext_t, uc_mcontext.mc_rax));
ASSYM(UC_RBX, offsetof(ucontext_t, uc_mcontext.mc_rbx));
ASSYM(UC_RBP, offsetof(ucontext_t, uc_mcontext.mc_rbp));
ASSYM(UC_R10, offsetof(ucontext_t, uc_mcontext.mc_r10));
ASSYM(UC_R11, offsetof(ucontext_t, uc_mcontext.mc_r11));
ASSYM(UC_R12, offsetof(ucontext_t, uc_mcontext.mc_r12));
ASSYM(UC_R13, offsetof(ucontext_t, uc_mcontext.mc_r13));
ASSYM(UC_R14, offsetof(ucontext_t, uc_mcontext.mc_r14));
ASSYM(UC_R15, offsetof(ucontext_t, uc_mcontext.mc_r15));
ASSYM(UC_FS, offsetof(ucontext_t, uc_mcontext.mc_fs));
ASSYM(UC_GS, offsetof(ucontext_t, uc_mcontext.mc_gs));
ASSYM(UC_ES, offsetof(ucontext_t, uc_mcontext.mc_es));
ASSYM(UC_DS, offsetof(ucontext_t, uc_mcontext.mc_ds));
ASSYM(UC_RIP, offsetof(ucontext_t, uc_mcontext.mc_rip));
ASSYM(UC_CS, offsetof(ucontext_t, uc_mcontext.mc_cs));
ASSYM(UC_RFLAGS, offsetof(ucontext_t, uc_mcontext.mc_rflags));
ASSYM(UC_RSP, offsetof(ucontext_t, uc_mcontext.mc_rsp));
ASSYM(UC_SS, offsetof(ucontext_t, uc_mcontext.mc_ss));
ASSYM(UC_FSBASE, offsetof(ucontext_t, uc_mcontext.mc_fsbase));
ASSYM(UC_GSBASE, offsetof(ucontext_t, uc_mcontext.mc_gsbase));
ASSYM(ENOENT, ENOENT);
ASSYM(EFAULT, EFAULT);
ASSYM(ENAMETOOLONG, ENAMETOOLONG);

View File

@ -2,6 +2,11 @@
* Copyright (c) 2003 Peter Wemm <peter@freeBSD.org>
* 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:
@ -36,13 +41,58 @@
* Signal trampoline, mapped as vdso into shared page.
*/
ENTRY(__vdso_sigcode)
.cfi_startproc
.cfi_signal_frame
.cfi_def_cfa %rsp, 0
.cfi_offset %rdi, SIGF_UC + UC_RDI
.cfi_offset %rsi, SIGF_UC + UC_RSI
.cfi_offset %rdx, SIGF_UC + UC_RDX
.cfi_offset %rcx, SIGF_UC + UC_RCX
.cfi_offset %r8, SIGF_UC + UC_R8
.cfi_offset %r9, SIGF_UC + UC_R9
.cfi_offset %rax, SIGF_UC + UC_RAX
.cfi_offset %rbx, SIGF_UC + UC_RBX
.cfi_offset %rbp, SIGF_UC + UC_RBP
.cfi_offset %r10, SIGF_UC + UC_R10
.cfi_offset %r11, SIGF_UC + UC_R11
.cfi_offset %r12, SIGF_UC + UC_R12
.cfi_offset %r13, SIGF_UC + UC_R13
.cfi_offset %r14, SIGF_UC + UC_R14
.cfi_offset %r15, SIGF_UC + UC_R15
#if 0
/*
* Gnu as complains about %fs/%gs/%es/%ds registers offsets not being
* multiple of 8, but gas + ld.bfd work for %cs/%ss.
*
* Clang IAS + ld.lld combination cannot handle any of the segment
* registers. Also, clang IAS does not know %rflags/%fs.base/%gs.base
* registers names, use dwarf registers numbers from psABI directly.
*/
.cfi_offset %fs, SIGF_UC + UC_FS
.cfi_offset %gs, SIGF_UC + UC_GS
.cfi_offset %es, SIGF_UC + UC_ES
.cfi_offset %ds, SIGF_UC + UC_DS
#endif
.cfi_offset %rip, SIGF_UC + UC_RIP
#if 0
.cfi_offset %cs, SIGF_UC + UC_CS
#endif
.cfi_offset 49 /* %rflags */, SIGF_UC + UC_RFLAGS
.cfi_offset %rsp, SIGF_UC + UC_RSP
#if 0
.cfi_offset %ss, SIGF_UC + UC_SS
#endif
.cfi_offset 58 /* %fs.base */, SIGF_UC + UC_FSBASE
.cfi_offset 59 /* %gs.base */, SIGF_UC + UC_GSBASE
call *SIGF_HANDLER(%rsp) /* call signal handler */
lea SIGF_UC(%rsp),%rdi /* get ucontext_t */
pushq $0 /* junk to fake return addr. */
.cfi_def_cfa %rsp, 8
movq $SYS_sigreturn,%rax
syscall /* enter kernel with args */
0: hlt /* trap priviliged instruction */
jmp 0b
.cfi_endproc
END(__vdso_sigcode)
.section .note.GNU-stack,"",%progbits

View File

@ -55,5 +55,5 @@ ${CC} -x assembler-with-cpp -DLOCORE -fPIC -nostdinc -c \
"${S}"/tools/vdso_wrap.S
${NM} -D elf-vdso.so.1 | \
awk '/__vdso_sigcode/{printf "#define VDSO_SIGCODE_OFFSET 0x%s\n",$1}' \
${AWK} '/__vdso_sigcode/{printf "#define VDSO_SIGCODE_OFFSET 0x%s\n",$1}' \
>vdso_offsets.h