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/845105331841
branches:  trunk
changeset: 944832:845105331841
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 f8e224e8aab4 -r 845105331841 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 f8e224e8aab4 -r 845105331841 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 f8e224e8aab4 -r 845105331841 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