1*b9504c9aSIlya Leoshkevich"""Test GDB's follow-fork-mode child.
2*b9504c9aSIlya Leoshkevich
3*b9504c9aSIlya LeoshkevichSPDX-License-Identifier: GPL-2.0-or-later
4*b9504c9aSIlya Leoshkevich"""
5*b9504c9aSIlya Leoshkevichfrom test_gdbstub import main, report
6*b9504c9aSIlya Leoshkevich
7*b9504c9aSIlya Leoshkevich
8*b9504c9aSIlya Leoshkevichdef run_test():
9*b9504c9aSIlya Leoshkevich    """Run through the tests one by one"""
10*b9504c9aSIlya Leoshkevich    gdb.execute("set follow-fork-mode child")
11*b9504c9aSIlya Leoshkevich    # Check that the parent breakpoints are unset.
12*b9504c9aSIlya Leoshkevich    gdb.execute("break break_after_fork")
13*b9504c9aSIlya Leoshkevich    # Check that the parent syscall catchpoints are unset.
14*b9504c9aSIlya Leoshkevich    # Skip this check on the architectures that don't have them.
15*b9504c9aSIlya Leoshkevich    have_fork_syscall = False
16*b9504c9aSIlya Leoshkevich    for fork_syscall in ("fork", "clone", "clone2", "clone3"):
17*b9504c9aSIlya Leoshkevich        try:
18*b9504c9aSIlya Leoshkevich            gdb.execute("catch syscall {}".format(fork_syscall))
19*b9504c9aSIlya Leoshkevich        except gdb.error:
20*b9504c9aSIlya Leoshkevich            pass
21*b9504c9aSIlya Leoshkevich        else:
22*b9504c9aSIlya Leoshkevich            have_fork_syscall = True
23*b9504c9aSIlya Leoshkevich    gdb.execute("continue")
24*b9504c9aSIlya Leoshkevich    for i in range(42):
25*b9504c9aSIlya Leoshkevich        if have_fork_syscall:
26*b9504c9aSIlya Leoshkevich            # syscall entry.
27*b9504c9aSIlya Leoshkevich            if i % 2 == 0:
28*b9504c9aSIlya Leoshkevich                # Check that the parent single-stepping is turned off.
29*b9504c9aSIlya Leoshkevich                gdb.execute("si")
30*b9504c9aSIlya Leoshkevich            else:
31*b9504c9aSIlya Leoshkevich                gdb.execute("continue")
32*b9504c9aSIlya Leoshkevich            # syscall exit.
33*b9504c9aSIlya Leoshkevich            gdb.execute("continue")
34*b9504c9aSIlya Leoshkevich        # break_after_fork()
35*b9504c9aSIlya Leoshkevich        gdb.execute("continue")
36*b9504c9aSIlya Leoshkevich    exitcode = int(gdb.parse_and_eval("$_exitcode"))
37*b9504c9aSIlya Leoshkevich    report(exitcode == 42, "{} == 42".format(exitcode))
38*b9504c9aSIlya Leoshkevich
39*b9504c9aSIlya Leoshkevich
40*b9504c9aSIlya Leoshkevichmain(run_test)
41