diff options
author | Richard Xia <rxia@sifive.com> | 2016-11-04 16:18:38 -0700 |
---|---|---|
committer | Richard Xia <rxia@sifive.com> | 2016-11-04 16:18:38 -0700 |
commit | 14b56c155ded80ba7f5a5f6194cef83d654c16d8 (patch) | |
tree | 5484740303eaf107948cb4fa769467249327b954 /debug/testlib.py | |
parent | f7bb852141c107722bdb0302d11b6f992a6991d5 (diff) | |
download | riscv-tests-14b56c155ded80ba7f5a5f6194cef83d654c16d8.zip riscv-tests-14b56c155ded80ba7f5a5f6194cef83d654c16d8.tar.gz riscv-tests-14b56c155ded80ba7f5a5f6194cef83d654c16d8.tar.bz2 |
Tell OpenOCD to pick an unused port, and use lsof to figure out which one it picked.
Diffstat (limited to 'debug/testlib.py')
-rw-r--r-- | debug/testlib.py | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/debug/testlib.py b/debug/testlib.py index b20e2ff..40daad5 100644 --- a/debug/testlib.py +++ b/debug/testlib.py @@ -130,11 +130,10 @@ class Openocd(object): if debug: cmd.append("-d") - # Assign port - self.port = unused_port() # This command needs to come before any config scripts on the command # line, since they are executed in order. - cmd[1:1] = ["--command", "gdb_port %d" % self.port] + # Tell OpenOCD to bind to an unused port. + cmd[1:1] = ["--command", "gdb_port %d" % 0] logfile = open(Openocd.logname, "w") logfile.write("+ %s\n" % " ".join(cmd)) @@ -158,6 +157,31 @@ class Openocd(object): messaged = True print "Waiting for OpenOCD to examine RISCV core..." + self.port = self._get_gdb_server_port() + + def _get_gdb_server_port(self): + """Get port that OpenOCD's gdb server is listening on.""" + MAX_ATTEMPTS = 5 + PORT_REGEX = re.compile(r'(?P<port>\d+) \(LISTEN\)') + for _ in range(MAX_ATTEMPTS): + with open(os.devnull, 'w') as devnull: + output = subprocess.check_output([ + 'lsof', + '-a', # Take the AND of the following selectors + '-p{}'.format(self.process.pid), # Filter on PID + '-iTCP', # Filter only TCP sockets + ], stderr=devnull) + matches = list(PORT_REGEX.finditer(output)) + if len(matches) > 1: + raise Exception( + "OpenOCD listening on multiple ports. Cannot uniquely " + "identify gdb server port.") + elif matches: + [match] = matches + return int(match.group('port')) + time.sleep(1) + raise Exception("Timed out waiting for gdb server to obtain port.") + def __del__(self): try: self.process.kill() |