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])

Reply via email to