All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-devel@nongnu.org
Cc: "Wainer dos Santos Moschetta" <wainersm@redhat.com>,
	"Alistair Francis" <Alistair.Francis@wdc.com>,
	"Nicholas Piggin" <npiggin@gmail.com>,
	"Liu Zhiwei" <zhiwei_liu@linux.alibaba.com>,
	"Richard Henderson" <richard.henderson@linaro.org>,
	"Yanan Wang" <wangyanan55@huawei.com>,
	qemu-s390x@nongnu.org,
	"Edgar E. Iglesias" <edgar.iglesias@gmail.com>,
	"Eduardo Habkost" <eduardo@habkost.net>,
	"Daniel Henrique Barboza" <dbarboza@ventanamicro.com>,
	"Michael Rolnik" <mrolnik@gmail.com>,
	"Daniel Henrique Barboza" <danielhb413@gmail.com>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Laurent Vivier" <lvivier@redhat.com>,
	"Yoshinori Sato" <ysato@users.sourceforge.jp>,
	"Laurent Vivier" <laurent@vivier.eu>,
	"Thomas Huth" <thuth@redhat.com>,
	"Peter Maydell" <peter.maydell@linaro.org>,
	"Mahmoud Mandour" <ma.mandourr@gmail.com>,
	"Brad Smith" <brad@comstyle.com>,
	"Alistair Francis" <alistair.francis@wdc.com>,
	"Brian Cain" <bcain@quicinc.com>,
	"Cleber Rosa" <crosa@redhat.com>, "John Snow" <jsnow@redhat.com>,
	"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
	"Pierrick Bouvier" <pierrick.bouvier@linaro.org>,
	"Palmer Dabbelt" <palmer@dabbelt.com>,
	"Riku Voipio" <riku.voipio@iki.fi>,
	qemu-arm@nongnu.org, qemu-ppc@nongnu.org,
	"Weiwei Li" <liwei1518@gmail.com>,
	"Bin Meng" <bin.meng@windriver.com>,
	"Cédric Le Goater" <clg@kaod.org>,
	"Beraldo Leal" <bleal@redhat.com>,
	"Kyle Evans" <kevans@freebsd.org>,
	"David Hildenbrand" <david@redhat.com>,
	"Song Gao" <gaosong@loongson.cn>,
	"Philippe Mathieu-Daudé" <philmd@linaro.org>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Alexandre Iooss" <erdnaxe@crans.org>,
	"Warner Losh" <imp@bsdimp.com>,
	qemu-riscv@nongnu.org, "Ilya Leoshkevich" <iii@linux.ibm.com>
Subject: [PATCH 13/29] tests/tcg: Add two follow-fork-mode tests
Date: Tue,  5 Mar 2024 12:09:49 +0000	[thread overview]
Message-ID: <20240305121005.3528075-14-alex.bennee@linaro.org> (raw)
In-Reply-To: <20240305121005.3528075-1-alex.bennee@linaro.org>

From: Ilya Leoshkevich <iii@linux.ibm.com>

Add follow-fork-mode child and and follow-fork-mode parent tests.
Check for the obvious pitfalls, such as lingering breakpoints,
catchpoints, and single-step mode.

Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Message-Id: <20240219141628.246823-13-iii@linux.ibm.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 tests/tcg/multiarch/follow-fork-mode.c        | 56 +++++++++++++++++++
 tests/tcg/multiarch/Makefile.target           | 17 +++++-
 .../gdbstub/follow-fork-mode-child.py         | 40 +++++++++++++
 .../gdbstub/follow-fork-mode-parent.py        | 16 ++++++
 4 files changed, 128 insertions(+), 1 deletion(-)
 create mode 100644 tests/tcg/multiarch/follow-fork-mode.c
 create mode 100644 tests/tcg/multiarch/gdbstub/follow-fork-mode-child.py
 create mode 100644 tests/tcg/multiarch/gdbstub/follow-fork-mode-parent.py

diff --git a/tests/tcg/multiarch/follow-fork-mode.c b/tests/tcg/multiarch/follow-fork-mode.c
new file mode 100644
index 00000000000..cb6b032b388
--- /dev/null
+++ b/tests/tcg/multiarch/follow-fork-mode.c
@@ -0,0 +1,56 @@
+/*
+ * Test GDB's follow-fork-mode.
+ *
+ * fork() a chain of processes.
+ * Parents sends one byte to their children, and children return their
+ * position in the chain, in order to prove that they survived GDB's fork()
+ * handling.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+#include <assert.h>
+#include <stdlib.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+void break_after_fork(void)
+{
+}
+
+int main(void)
+{
+    int depth = 42, err, i, fd[2], status;
+    pid_t child, pid;
+    ssize_t n;
+    char b;
+
+    for (i = 0; i < depth; i++) {
+        err = pipe(fd);
+        assert(err == 0);
+        child = fork();
+        break_after_fork();
+        assert(child != -1);
+        if (child == 0) {
+            close(fd[1]);
+
+            n = read(fd[0], &b, 1);
+            close(fd[0]);
+            assert(n == 1);
+            assert(b == (char)i);
+        } else {
+            close(fd[0]);
+
+            b = (char)i;
+            n = write(fd[1], &b, 1);
+            close(fd[1]);
+            assert(n == 1);
+
+            pid = waitpid(child, &status, 0);
+            assert(pid == child);
+            assert(WIFEXITED(status));
+            return WEXITSTATUS(status) - 1;
+        }
+    }
+
+    return depth;
+}
diff --git a/tests/tcg/multiarch/Makefile.target b/tests/tcg/multiarch/Makefile.target
index f11f3b084d7..979a0dd1bc2 100644
--- a/tests/tcg/multiarch/Makefile.target
+++ b/tests/tcg/multiarch/Makefile.target
@@ -106,6 +106,20 @@ run-gdbstub-catch-syscalls: catch-syscalls
 		--bin $< --test $(MULTIARCH_SRC)/gdbstub/catch-syscalls.py, \
 	hitting a syscall catchpoint)
 
+run-gdbstub-follow-fork-mode-child: follow-fork-mode
+	$(call run-test, $@, $(GDB_SCRIPT) \
+		--gdb $(GDB) \
+		--qemu $(QEMU) --qargs "$(QEMU_OPTS)" \
+		--bin $< --test $(MULTIARCH_SRC)/gdbstub/follow-fork-mode-child.py, \
+	following children on fork)
+
+run-gdbstub-follow-fork-mode-parent: follow-fork-mode
+	$(call run-test, $@, $(GDB_SCRIPT) \
+		--gdb $(GDB) \
+		--qemu $(QEMU) --qargs "$(QEMU_OPTS)" \
+		--bin $< --test $(MULTIARCH_SRC)/gdbstub/follow-fork-mode-parent.py, \
+	following parents on fork)
+
 else
 run-gdbstub-%:
 	$(call skip-test, "gdbstub test $*", "need working gdb with $(patsubst -%,,$(TARGET_NAME)) support")
@@ -113,7 +127,8 @@ endif
 EXTRA_RUNS += run-gdbstub-sha1 run-gdbstub-qxfer-auxv-read \
 	      run-gdbstub-proc-mappings run-gdbstub-thread-breakpoint \
 	      run-gdbstub-registers run-gdbstub-prot-none \
-	      run-gdbstub-catch-syscalls
+	      run-gdbstub-catch-syscalls run-gdbstub-follow-fork-mode-child \
+	      run-gdbstub-follow-fork-mode-parent
 
 # ARM Compatible Semi Hosting Tests
 #
diff --git a/tests/tcg/multiarch/gdbstub/follow-fork-mode-child.py b/tests/tcg/multiarch/gdbstub/follow-fork-mode-child.py
new file mode 100644
index 00000000000..72a6e440c08
--- /dev/null
+++ b/tests/tcg/multiarch/gdbstub/follow-fork-mode-child.py
@@ -0,0 +1,40 @@
+"""Test GDB's follow-fork-mode child.
+
+SPDX-License-Identifier: GPL-2.0-or-later
+"""
+from test_gdbstub import main, report
+
+
+def run_test():
+    """Run through the tests one by one"""
+    gdb.execute("set follow-fork-mode child")
+    # Check that the parent breakpoints are unset.
+    gdb.execute("break break_after_fork")
+    # Check that the parent syscall catchpoints are unset.
+    # Skip this check on the architectures that don't have them.
+    have_fork_syscall = False
+    for fork_syscall in ("fork", "clone", "clone2", "clone3"):
+        try:
+            gdb.execute("catch syscall {}".format(fork_syscall))
+        except gdb.error:
+            pass
+        else:
+            have_fork_syscall = True
+    gdb.execute("continue")
+    for i in range(42):
+        if have_fork_syscall:
+            # syscall entry.
+            if i % 2 == 0:
+                # Check that the parent single-stepping is turned off.
+                gdb.execute("si")
+            else:
+                gdb.execute("continue")
+            # syscall exit.
+            gdb.execute("continue")
+        # break_after_fork()
+        gdb.execute("continue")
+    exitcode = int(gdb.parse_and_eval("$_exitcode"))
+    report(exitcode == 42, "{} == 42".format(exitcode))
+
+
+main(run_test)
diff --git a/tests/tcg/multiarch/gdbstub/follow-fork-mode-parent.py b/tests/tcg/multiarch/gdbstub/follow-fork-mode-parent.py
new file mode 100644
index 00000000000..5c2fe722088
--- /dev/null
+++ b/tests/tcg/multiarch/gdbstub/follow-fork-mode-parent.py
@@ -0,0 +1,16 @@
+"""Test GDB's follow-fork-mode parent.
+
+SPDX-License-Identifier: GPL-2.0-or-later
+"""
+from test_gdbstub import main, report
+
+
+def run_test():
+    """Run through the tests one by one"""
+    gdb.execute("set follow-fork-mode parent")
+    gdb.execute("continue")
+    exitcode = int(gdb.parse_and_eval("$_exitcode"))
+    report(exitcode == 0, "{} == 0".format(exitcode))
+
+
+main(run_test)
-- 
2.39.2



  parent reply	other threads:[~2024-03-05 12:17 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-05 12:09 [PATCH 00/29] maintainer/next for 9.0 (testing, gdbstub, plugins, disas) Alex Bennée
2024-03-05 12:09 ` [PATCH 01/29] tests: bump QOS_PATH_MAX_ELEMENT_SIZE again Alex Bennée
2024-03-05 12:09 ` [PATCH 02/29] gdbstub: Support disablement in a multi-threaded process Alex Bennée
2024-03-05 12:09 ` [PATCH 03/29] {linux,bsd}-user: Introduce get_task_state() Alex Bennée
2024-03-05 12:09 ` [PATCH 04/29] {linux,bsd}-user: Update ts_tid after fork() Alex Bennée
2024-03-05 20:44   ` Richard Henderson
2024-03-05 12:09 ` [PATCH 05/29] gdbstub: Introduce gdbserver_fork_start() Alex Bennée
2024-03-05 12:09 ` [PATCH 06/29] {linux,bsd}-user: Pass pid to fork_end() Alex Bennée
2024-03-05 12:09 ` [PATCH 07/29] {linux,bsd}-user: Pass pid to gdbserver_fork() Alex Bennée
2024-03-05 12:09 ` [PATCH 08/29] gdbstub: Call gdbserver_fork() both in parent and in child Alex Bennée
2024-03-05 12:09 ` [PATCH 09/29] gdbstub: Introduce gdb_handle_query_supported_user() Alex Bennée
2024-03-05 12:09 ` [PATCH 10/29] gdbstub: Introduce gdb_handle_set_thread_user() Alex Bennée
2024-03-05 12:09 ` [PATCH 11/29] gdbstub: Introduce gdb_handle_detach_user() Alex Bennée
2024-03-05 12:09 ` [PATCH 12/29] gdbstub: Implement follow-fork-mode child Alex Bennée
2024-03-05 12:09 ` Alex Bennée [this message]
2024-03-05 12:09 ` [PATCH 14/29] plugins: scoreboard API Alex Bennée
2024-03-05 12:09 ` [PATCH 15/29] plugins: define qemu_plugin_u64 Alex Bennée
2024-03-05 12:09 ` [PATCH 16/29] plugins: implement inline operation relative to cpu_index Alex Bennée
2024-03-05 12:09 ` [PATCH 17/29] plugins: add inline operation per vcpu Alex Bennée
2024-03-05 12:09 ` [PATCH 18/29] tests/plugin: add test plugin for inline operations Alex Bennée
2024-03-05 12:09 ` [PATCH 19/29] tests/plugin/mem: migrate to new per_vcpu API Alex Bennée
2024-03-05 12:09 ` [PATCH 20/29] tests/plugin/insn: " Alex Bennée
2024-03-05 12:09 ` [PATCH 21/29] tests/plugin/bb: " Alex Bennée
2024-03-05 12:09 ` [PATCH 22/29] contrib/plugins/hotblocks: " Alex Bennée
2024-03-05 12:09 ` [PATCH 23/29] contrib/plugins/howvec: " Alex Bennée
2024-03-05 12:10 ` [PATCH 24/29] plugins: remove non per_vcpu inline operation from API Alex Bennée
2024-03-05 12:10 ` [PATCH 25/29] plugins: cleanup codepath for previous inline operation Alex Bennée
2024-03-05 12:10 ` [PATCH 26/29] disas: introduce show_opcodes Alex Bennée
2024-03-05 20:46   ` Richard Henderson
2024-03-05 12:10 ` [PATCH 27/29] disas/hppa: honour show_opcodes Alex Bennée
2024-03-05 20:46   ` Richard Henderson
2024-03-05 12:10 ` [PATCH 28/29] target/loongarch: honour show_opcodes when disassembling Alex Bennée
2024-03-05 20:47   ` Richard Henderson
2024-03-05 12:10 ` [PATCH 29/29] target/riscv: " Alex Bennée
2024-03-05 20:48   ` Richard Henderson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240305121005.3528075-14-alex.bennee@linaro.org \
    --to=alex.bennee@linaro.org \
    --cc=Alistair.Francis@wdc.com \
    --cc=bcain@quicinc.com \
    --cc=bin.meng@windriver.com \
    --cc=bleal@redhat.com \
    --cc=brad@comstyle.com \
    --cc=clg@kaod.org \
    --cc=crosa@redhat.com \
    --cc=danielhb413@gmail.com \
    --cc=david@redhat.com \
    --cc=dbarboza@ventanamicro.com \
    --cc=edgar.iglesias@gmail.com \
    --cc=eduardo@habkost.net \
    --cc=erdnaxe@crans.org \
    --cc=gaosong@loongson.cn \
    --cc=iii@linux.ibm.com \
    --cc=imp@bsdimp.com \
    --cc=jsnow@redhat.com \
    --cc=kevans@freebsd.org \
    --cc=laurent@vivier.eu \
    --cc=liwei1518@gmail.com \
    --cc=lvivier@redhat.com \
    --cc=ma.mandourr@gmail.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=mrolnik@gmail.com \
    --cc=npiggin@gmail.com \
    --cc=palmer@dabbelt.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=philmd@linaro.org \
    --cc=pierrick.bouvier@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=qemu-riscv@nongnu.org \
    --cc=qemu-s390x@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=riku.voipio@iki.fi \
    --cc=thuth@redhat.com \
    --cc=wainersm@redhat.com \
    --cc=wangyanan55@huawei.com \
    --cc=ysato@users.sourceforge.jp \
    --cc=zhiwei_liu@linux.alibaba.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.