Module Name: src Committed By: kamil Date: Mon Oct 12 23:56:08 UTC 2020
Modified Files: src/lib/libc/arch/i386: Makefile.inc src/lib/libc/arch/i386/sys: __sigtramp2.S Added Files: src/lib/libc/arch/i386: genassym.cf Log Message: Decorate the i386 signal trampoline with CFI attributes easing unwinding Now, the unwinders (in backtrace(3) and similar) can unwind properly the stack from a signal handler. To generate a diff of this commit: cvs rdiff -u -r1.21 -r1.22 src/lib/libc/arch/i386/Makefile.inc cvs rdiff -u -r0 -r1.1 src/lib/libc/arch/i386/genassym.cf cvs rdiff -u -r1.5 -r1.6 src/lib/libc/arch/i386/sys/__sigtramp2.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libc/arch/i386/Makefile.inc diff -u src/lib/libc/arch/i386/Makefile.inc:1.21 src/lib/libc/arch/i386/Makefile.inc:1.22 --- src/lib/libc/arch/i386/Makefile.inc:1.21 Wed Jul 15 14:27:49 2015 +++ src/lib/libc/arch/i386/Makefile.inc Mon Oct 12 23:56:08 2020 @@ -1,5 +1,7 @@ -# $NetBSD: Makefile.inc,v 1.21 2015/07/15 14:27:49 pooka Exp $ +# $NetBSD: Makefile.inc,v 1.22 2020/10/12 23:56:08 kamil Exp $ .if ${RUMPRUN} != "yes" SRCS+= __sigaction14_sigtramp.c __sigtramp2.S .endif + +CPPFLAGS+= -I. Index: src/lib/libc/arch/i386/sys/__sigtramp2.S diff -u src/lib/libc/arch/i386/sys/__sigtramp2.S:1.5 src/lib/libc/arch/i386/sys/__sigtramp2.S:1.6 --- src/lib/libc/arch/i386/sys/__sigtramp2.S:1.5 Fri May 23 02:34:19 2014 +++ src/lib/libc/arch/i386/sys/__sigtramp2.S Mon Oct 12 23:56:08 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: __sigtramp2.S,v 1.5 2014/05/23 02:34:19 uebayasi Exp $ */ +/* $NetBSD: __sigtramp2.S,v 1.6 2020/10/12 23:56:08 kamil Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -30,6 +30,7 @@ */ #include "SYS.h" +#include "assym.h" /* * The i386 signal trampoline is invoked only to return from @@ -42,7 +43,26 @@ * pointer to ucontext structure [8] * pointer to siginfo structure [4] * sp-> signal number [0] + * + * The unwind entry includes the one byte prior to the trampoline + * because the unwinder will look up (return PC - 1) while unwinding. + * Normally (return PC - 1) computes an address inside the call + * instruction that created the child frame, but here there is no call + * instruction so we have to manually add padding. */ + .cfi_startproc simple + .cfi_signal_frame + .cfi_def_cfa esp, 140 + .cfi_offset eax, UC_GREGS_EAX + .cfi_offset ecx, UC_GREGS_ECX + .cfi_offset edx, UC_GREGS_EDX + .cfi_offset ebx, UC_GREGS_EBX + /* The unwinder will use the CFA to restore ESP. */ + .cfi_offset ebp, UC_GREGS_EBP + .cfi_offset esi, UC_GREGS_ESI + .cfi_offset edi, UC_GREGS_EDI + .cfi_offset eip, UC_GREGS_EIP + nop NENTRY(__sigtramp_siginfo_2) leal 12+128(%esp),%eax /* get address of ucontext */ movl %eax,4(%esp) /* put it in the argument slot */ @@ -50,4 +70,5 @@ NENTRY(__sigtramp_siginfo_2) SYSTRAP(setcontext) /* do setcontext */ movl $-1,4(%esp) /* if we return here, something is wrong */ SYSTRAP(exit) /* exit */ + .cfi_endproc END(__sigtramp_siginfo_2) Added files: Index: src/lib/libc/arch/i386/genassym.cf diff -u /dev/null src/lib/libc/arch/i386/genassym.cf:1.1 --- /dev/null Mon Oct 12 23:56:08 2020 +++ src/lib/libc/arch/i386/genassym.cf Mon Oct 12 23:56:08 2020 @@ -0,0 +1,41 @@ +# $NetBSD: genassym.cf,v 1.1 2020/10/12 23:56:08 kamil Exp $ +# +# Copyright (c) 2020 The NetBSD Foundation, Inc. +# All rights reserved. +# +# This code is derived from software contributed to The NetBSD Foundation +# by Kamil Rytarowski or Moritz Systems Technology Company Sp. z o.o. +# +# 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. +# + +include <ucontext.h> + +define UC_GREGS_EAX offsetof(ucontext_t, uc_mcontext.__gregs[_REG_EAX]) +define UC_GREGS_EDX offsetof(ucontext_t, uc_mcontext.__gregs[_REG_EDX]) +define UC_GREGS_ECX offsetof(ucontext_t, uc_mcontext.__gregs[_REG_ECX]) +define UC_GREGS_EBX offsetof(ucontext_t, uc_mcontext.__gregs[_REG_EBX]) +define UC_GREGS_ESI offsetof(ucontext_t, uc_mcontext.__gregs[_REG_ESI]) +define UC_GREGS_EDI offsetof(ucontext_t, uc_mcontext.__gregs[_REG_EDI]) +define UC_GREGS_EBP offsetof(ucontext_t, uc_mcontext.__gregs[_REG_EBP]) +define UC_GREGS_ESP offsetof(ucontext_t, uc_mcontext.__gregs[_REG_ESP]) +define UC_GREGS_EIP offsetof(ucontext_t, uc_mcontext.__gregs[_REG_EIP])