Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/tests/lib/libc/sys Apply fix in rev 1.2 for core_dump_procin...



details:   https://anonhg.NetBSD.org/src/rev/40b2bb9a6100
branches:  trunk
changeset: 1015151:40b2bb9a6100
user:      rin <rin%NetBSD.org@localhost>
date:      Thu Oct 15 22:59:50 2020 +0000

description:
Apply fix in rev 1.2 for core_dump_procinfo to aarch64 and arm:

http://cvsweb.netbsd.org/bsdweb.cgi/src/tests/lib/libc/sys/t_ptrace_core_wait.h#rev1.2

> For powerpc, program counter is not automatically incremented by trap
> instruction. We cannot increment PC in the trap handler, which breaks
> applications depending on this behavior, e.g., GDB.

This statement is true for aarch64 and arm.

Also, use PTRACE_BREAKPOINT_SIZE instead of hard-coded 4 to address
instruction next to PC.

OK ryo

diffstat:

 tests/lib/libc/sys/t_ptrace_core_wait.h |  26 ++++++++++++++++----------
 1 files changed, 16 insertions(+), 10 deletions(-)

diffs (46 lines):

diff -r 57a20051a305 -r 40b2bb9a6100 tests/lib/libc/sys/t_ptrace_core_wait.h
--- a/tests/lib/libc/sys/t_ptrace_core_wait.h   Thu Oct 15 22:52:08 2020 +0000
+++ b/tests/lib/libc/sys/t_ptrace_core_wait.h   Thu Oct 15 22:59:50 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: t_ptrace_core_wait.h,v 1.2 2020/06/24 04:47:10 rin Exp $       */
+/*     $NetBSD: t_ptrace_core_wait.h,v 1.3 2020/10/15 22:59:50 rin Exp $       */
 
 /*-
  * Copyright (c) 2016, 2017, 2018, 2019, 2020 The NetBSD Foundation, Inc.
@@ -207,21 +207,27 @@
 
        DPRINTF("Before resuming the child process where it left off and "
            "without signal to be sent\n");
-#ifndef __powerpc__
-       SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
-#else
+
+#if defined(__aarch64__) || defined(__arm__) || defined(__powerpc__)
        /*
-        * For powerpc, program counter is not automatically incremented by
-        * a trap instruction. We cannot increment PC in the trap handler,
+        * For these archs, program counter is not automatically incremented
+        * by a trap instruction. We cannot increment PC in the trap handler,
         * which breaks applications depending on this behavior, e.g., GDB.
-        * Therefore, we need to pass (PC + 4) instead of (void *)1 (== PC)
-        * to PT_CONTINUE here.
+        * Therefore, we need to pass PC++ instead of (void *)1 (== PC) to
+        * PT_CONTINUE here.
         */
        struct reg r;
 
        SYSCALL_REQUIRE(ptrace(PT_GETREGS, child, &r, 0) != -1);
-       SYSCALL_REQUIRE(
-           ptrace(PT_CONTINUE, child, (void *)(r.pc + 4), 0) != -1);
+       SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child,
+#  if defined(__aarch64__) || defined(__arm__)
+           (void *)(r.r_pc + PTRACE_BREAKPOINT_SIZE),
+#  elif defined(__powerpc__)
+           (void *)(r.pc + PTRACE_BREAKPOINT_SIZE),
+#  endif
+           0) != -1);
+#else
+       SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
 #endif
 
        DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);



Home | Main Index | Thread Index | Old Index