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 18db2ea0ddSAlex Bennée 19db2ea0ddSAlex Bennéedef get_args(): 20db2ea0ddSAlex Bennée parser = argparse.ArgumentParser(description="A gdbstub test runner") 21db2ea0ddSAlex Bennée parser.add_argument("--qemu", help="Qemu binary for test", 22db2ea0ddSAlex Bennée required=True) 23db2ea0ddSAlex Bennée parser.add_argument("--qargs", help="Qemu arguments for test") 24db2ea0ddSAlex Bennée parser.add_argument("--binary", help="Binary to debug", 25db2ea0ddSAlex Bennée required=True) 26db2ea0ddSAlex Bennée parser.add_argument("--test", help="GDB test script", 27db2ea0ddSAlex Bennée required=True) 28db2ea0ddSAlex Bennée parser.add_argument("--gdb", help="The gdb binary to use", default=None) 29db2ea0ddSAlex Bennée 30db2ea0ddSAlex Bennée return parser.parse_args() 31db2ea0ddSAlex Bennée 32db2ea0ddSAlex Bennéeif __name__ == '__main__': 33db2ea0ddSAlex Bennée args = get_args() 34db2ea0ddSAlex Bennée 35db2ea0ddSAlex Bennée # Search for a gdb we can use 36db2ea0ddSAlex Bennée if not args.gdb: 37db2ea0ddSAlex Bennée args.gdb = shutil.which("gdb-multiarch") 38db2ea0ddSAlex Bennée if not args.gdb: 39db2ea0ddSAlex Bennée args.gdb = shutil.which("gdb") 40db2ea0ddSAlex Bennée if not args.gdb: 41db2ea0ddSAlex Bennée print("We need gdb to run the test") 42db2ea0ddSAlex Bennée exit(-1) 43db2ea0ddSAlex Bennée 44db2ea0ddSAlex Bennée # Launch QEMU with binary 45db2ea0ddSAlex Bennée if "system" in args.qemu: 46db2ea0ddSAlex Bennée cmd = "%s %s %s -s -S" % (args.qemu, args.qargs, args.binary) 47db2ea0ddSAlex Bennée else: 48db2ea0ddSAlex Bennée cmd = "%s %s -g 1234 %s" % (args.qemu, args.qargs, args.binary) 49db2ea0ddSAlex Bennée 50db2ea0ddSAlex Bennée inferior = subprocess.Popen(shlex.split(cmd)) 51db2ea0ddSAlex Bennée 52db2ea0ddSAlex Bennée # Now launch gdb with our test and collect the result 53*d2fefdedSAlex Bennée gdb_cmd = "%s %s" % (args.gdb, args.binary) 54*d2fefdedSAlex Bennée # run quietly and ignore .gdbinit 55*d2fefdedSAlex Bennée gdb_cmd += " -q -n -batch" 56*d2fefdedSAlex Bennée # disable prompts in case of crash 57*d2fefdedSAlex Bennée gdb_cmd += " -ex 'set confirm off'" 58*d2fefdedSAlex Bennée # connect to remote 59*d2fefdedSAlex Bennée gdb_cmd += " -ex 'target remote localhost:1234'" 60*d2fefdedSAlex Bennée # finally the test script itself 61*d2fefdedSAlex Bennée gdb_cmd += " -x %s" % (args.test) 62*d2fefdedSAlex Bennée 63*d2fefdedSAlex Bennée print("GDB CMD: %s" % (gdb_cmd)) 64db2ea0ddSAlex Bennée 65db2ea0ddSAlex Bennée result = subprocess.call(gdb_cmd, shell=True); 66db2ea0ddSAlex Bennée 67*d2fefdedSAlex Bennée # A negative result is the result of an internal gdb failure like 68*d2fefdedSAlex Bennée # a crash. We force a return of 0 so we don't fail the test on 69*d2fefdedSAlex Bennée # account of broken external tools. 70*d2fefdedSAlex Bennée if result < 0: 71*d2fefdedSAlex Bennée print("GDB crashed? SKIPPING") 72*d2fefdedSAlex Bennée exit(0) 73*d2fefdedSAlex Bennée 74db2ea0ddSAlex Bennée exit(result) 75