1db2ea0ddSAlex Bennée#!/usr/bin/env python3 2db2ea0ddSAlex Bennée# 3db2ea0ddSAlex Bennée# Run a gdbstub test case 4db2ea0ddSAlex Bennée# 5db2ea0ddSAlex Bennée# Copyright (c) 2019 Linaro 6db2ea0ddSAlex Bennée# 7db2ea0ddSAlex Bennée# Author: Alex Bennée <alex.bennee@linaro.org> 8db2ea0ddSAlex Bennée# 9db2ea0ddSAlex Bennée# This work is licensed under the terms of the GNU GPL, version 2 or later. 10db2ea0ddSAlex Bennée# See the COPYING file in the top-level directory. 11db2ea0ddSAlex Bennée# 12db2ea0ddSAlex Bennée# SPDX-License-Identifier: GPL-2.0-or-later 13db2ea0ddSAlex Bennée 14db2ea0ddSAlex Bennéeimport argparse 15db2ea0ddSAlex Bennéeimport subprocess 16db2ea0ddSAlex Bennéeimport shutil 17db2ea0ddSAlex Bennéeimport shlex 18*b0dc2a8bSAlex Bennéeimport os 19*b0dc2a8bSAlex Bennéefrom tempfile import TemporaryDirectory 20db2ea0ddSAlex Bennée 21db2ea0ddSAlex Bennéedef get_args(): 22db2ea0ddSAlex Bennée parser = argparse.ArgumentParser(description="A gdbstub test runner") 23db2ea0ddSAlex Bennée parser.add_argument("--qemu", help="Qemu binary for test", 24db2ea0ddSAlex Bennée required=True) 25db2ea0ddSAlex Bennée parser.add_argument("--qargs", help="Qemu arguments for test") 26db2ea0ddSAlex Bennée parser.add_argument("--binary", help="Binary to debug", 27db2ea0ddSAlex Bennée required=True) 28db2ea0ddSAlex Bennée parser.add_argument("--test", help="GDB test script", 29db2ea0ddSAlex Bennée required=True) 30db2ea0ddSAlex Bennée parser.add_argument("--gdb", help="The gdb binary to use", default=None) 31db2ea0ddSAlex Bennée 32db2ea0ddSAlex Bennée return parser.parse_args() 33db2ea0ddSAlex Bennée 34db2ea0ddSAlex Bennéeif __name__ == '__main__': 35db2ea0ddSAlex Bennée args = get_args() 36db2ea0ddSAlex Bennée 37db2ea0ddSAlex Bennée # Search for a gdb we can use 38db2ea0ddSAlex Bennée if not args.gdb: 39db2ea0ddSAlex Bennée args.gdb = shutil.which("gdb-multiarch") 40db2ea0ddSAlex Bennée if not args.gdb: 41db2ea0ddSAlex Bennée args.gdb = shutil.which("gdb") 42db2ea0ddSAlex Bennée if not args.gdb: 43db2ea0ddSAlex Bennée print("We need gdb to run the test") 44db2ea0ddSAlex Bennée exit(-1) 45db2ea0ddSAlex Bennée 46*b0dc2a8bSAlex Bennée socket_dir = TemporaryDirectory("qemu-gdbstub") 47*b0dc2a8bSAlex Bennée socket_name = os.path.join(socket_dir.name, "gdbstub.socket") 48*b0dc2a8bSAlex Bennée 49db2ea0ddSAlex Bennée # Launch QEMU with binary 50db2ea0ddSAlex Bennée if "system" in args.qemu: 51db2ea0ddSAlex Bennée cmd = "%s %s %s -s -S" % (args.qemu, args.qargs, args.binary) 52db2ea0ddSAlex Bennée else: 53*b0dc2a8bSAlex Bennée cmd = "%s %s -g %s %s" % (args.qemu, args.qargs, socket_name, 54*b0dc2a8bSAlex Bennée args.binary) 55db2ea0ddSAlex Bennée 56db2ea0ddSAlex Bennée inferior = subprocess.Popen(shlex.split(cmd)) 57db2ea0ddSAlex Bennée 58db2ea0ddSAlex Bennée # Now launch gdb with our test and collect the result 59d2fefdedSAlex Bennée gdb_cmd = "%s %s" % (args.gdb, args.binary) 60d2fefdedSAlex Bennée # run quietly and ignore .gdbinit 61d2fefdedSAlex Bennée gdb_cmd += " -q -n -batch" 62d2fefdedSAlex Bennée # disable prompts in case of crash 63d2fefdedSAlex Bennée gdb_cmd += " -ex 'set confirm off'" 64d2fefdedSAlex Bennée # connect to remote 65*b0dc2a8bSAlex Bennée if "system" in args.qemu: 66d2fefdedSAlex Bennée gdb_cmd += " -ex 'target remote localhost:1234'" 67*b0dc2a8bSAlex Bennée else: 68*b0dc2a8bSAlex Bennée gdb_cmd += " -ex 'target remote %s'" % (socket_name) 69d2fefdedSAlex Bennée # finally the test script itself 70d2fefdedSAlex Bennée gdb_cmd += " -x %s" % (args.test) 71d2fefdedSAlex Bennée 72d2fefdedSAlex Bennée print("GDB CMD: %s" % (gdb_cmd)) 73db2ea0ddSAlex Bennée 74db2ea0ddSAlex Bennée result = subprocess.call(gdb_cmd, shell=True); 75db2ea0ddSAlex Bennée 76d2fefdedSAlex Bennée # A negative result is the result of an internal gdb failure like 77d2fefdedSAlex Bennée # a crash. We force a return of 0 so we don't fail the test on 78d2fefdedSAlex Bennée # account of broken external tools. 79d2fefdedSAlex Bennée if result < 0: 80d2fefdedSAlex Bennée print("GDB crashed? SKIPPING") 81d2fefdedSAlex Bennée exit(0) 82d2fefdedSAlex Bennée 83db2ea0ddSAlex Bennée exit(result) 84