Index: arch/i386/Makefile.inc =================================================================== RCS file: /cvsroot/src/lib/libc/arch/i386/Makefile.inc,v retrieving revision 1.21 diff -u -r1.21 Makefile.inc --- arch/i386/Makefile.inc 15 Jul 2015 14:27:49 -0000 1.21 +++ arch/i386/Makefile.inc 12 Oct 2020 21:10:07 -0000 @@ -3,3 +3,5 @@ .if ${RUMPRUN} != "yes" SRCS+= __sigaction14_sigtramp.c __sigtramp2.S .endif + +CPPFLAGS+= -I. Index: arch/i386/genassym.cf =================================================================== RCS file: arch/i386/genassym.cf diff -N arch/i386/genassym.cf --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ arch/i386/genassym.cf 12 Oct 2020 21:10:07 -0000 @@ -0,0 +1,41 @@ +# $NetBSD$ +# +# 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 + +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]) Index: arch/i386/sys/__sigtramp2.S =================================================================== RCS file: /cvsroot/src/lib/libc/arch/i386/sys/__sigtramp2.S,v retrieving revision 1.5 diff -u -r1.5 __sigtramp2.S --- arch/i386/sys/__sigtramp2.S 23 May 2014 02:34:19 -0000 1.5 +++ arch/i386/sys/__sigtramp2.S 12 Oct 2020 21:10:07 -0000 @@ -30,6 +30,7 @@ */ #include "SYS.h" +#include "assym.h" /* * The i386 signal trampoline is invoked only to return from @@ -42,7 +43,25 @@ * 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 eax, 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 + 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 +69,5 @@ SYSTRAP(setcontext) /* do setcontext */ movl $-1,4(%esp) /* if we return here, something is wrong */ SYSTRAP(exit) /* exit */ + .cfi_endproc END(__sigtramp_siginfo_2)