1"""Test that gdbstub has access to proc mappings.
2
3This runs as a sourced script (via -x, via run-test.py)."""
4from __future__ import print_function
5import gdb
6import sys
7
8
9n_failures = 0
10
11
12def report(cond, msg):
13    """Report success/fail of a test"""
14    if cond:
15        print("PASS: {}".format(msg))
16    else:
17        print("FAIL: {}".format(msg))
18        global n_failures
19        n_failures += 1
20
21
22def run_test():
23    """Run through the tests one by one"""
24    try:
25        mappings = gdb.execute("info proc mappings", False, True)
26    except gdb.error as exc:
27        exc_str = str(exc)
28        if "Not supported on this target." in exc_str:
29            # Detect failures due to an outstanding issue with how GDB handles
30            # the x86_64 QEMU's target.xml, which does not contain the
31            # definition of orig_rax. Skip the test in this case.
32            print("SKIP: {}".format(exc_str))
33            return
34        raise
35    report(isinstance(mappings, str), "Fetched the mappings from the inferior")
36    # Broken with host page size > guest page size
37    # report("/sha1" in mappings, "Found the test binary name in the mappings")
38
39
40def main():
41    """Prepare the environment and run through the tests"""
42    try:
43        inferior = gdb.selected_inferior()
44        print("ATTACHED: {}".format(inferior.architecture().name()))
45    except (gdb.error, AttributeError):
46        print("SKIPPING (not connected)")
47        exit(0)
48
49    if gdb.parse_and_eval('$pc') == 0:
50        print("SKIP: PC not set")
51        exit(0)
52
53    try:
54        # These are not very useful in scripts
55        gdb.execute("set pagination off")
56        gdb.execute("set confirm off")
57
58        # Run the actual tests
59        run_test()
60    except gdb.error:
61        report(False, "GDB Exception: {}".format(sys.exc_info()[0]))
62    print("All tests complete: %d failures" % n_failures)
63    exit(n_failures)
64
65
66main()
67