Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/lib/libc/arch/i386 Decorate the i386 signal trampoline with ...
details: https://anonhg.NetBSD.org/src/rev/6b0485393c02
branches: trunk
changeset: 955820:6b0485393c02
user: kamil <kamil%NetBSD.org@localhost>
date: Mon Oct 12 23:56:08 2020 +0000
description:
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.
diffstat:
lib/libc/arch/i386/Makefile.inc | 4 ++-
lib/libc/arch/i386/genassym.cf | 41 ++++++++++++++++++++++++++++++++++++
lib/libc/arch/i386/sys/__sigtramp2.S | 23 +++++++++++++++++++-
3 files changed, 66 insertions(+), 2 deletions(-)
diffs (107 lines):
diff -r 0d5f78c32131 -r 6b0485393c02 lib/libc/arch/i386/Makefile.inc
--- a/lib/libc/arch/i386/Makefile.inc Mon Oct 12 21:33:46 2020 +0000
+++ b/lib/libc/arch/i386/Makefile.inc Mon Oct 12 23:56:08 2020 +0000
@@ -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.
diff -r 0d5f78c32131 -r 6b0485393c02 lib/libc/arch/i386/genassym.cf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/arch/i386/genassym.cf Mon Oct 12 23:56:08 2020 +0000
@@ -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])
diff -r 0d5f78c32131 -r 6b0485393c02 lib/libc/arch/i386/sys/__sigtramp2.S
--- a/lib/libc/arch/i386/sys/__sigtramp2.S Mon Oct 12 21:33:46 2020 +0000
+++ b/lib/libc/arch/i386/sys/__sigtramp2.S Mon Oct 12 23:56:08 2020 +0000
@@ -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 @@
SYSTRAP(setcontext) /* do setcontext */
movl $-1,4(%esp) /* if we return here, something is wrong */
SYSTRAP(exit) /* exit */
+ .cfi_endproc
END(__sigtramp_siginfo_2)
Home |
Main Index |
Thread Index |
Old Index