aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Newsome <tim@sifive.com>2016-11-11 12:19:46 -0800
committerGitHub <noreply@github.com>2016-11-11 12:19:46 -0800
commit98a7fc66ec9342d6e3f1e3477c2e30d75f78c294 (patch)
tree32a967a8b4d775632b7b2c38adc34c8dd93751f3
parentf7bb852141c107722bdb0302d11b6f992a6991d5 (diff)
parentda7763c222260acc4b5807a25c316f8710b80923 (diff)
downloadriscv-tests-98a7fc66ec9342d6e3f1e3477c2e30d75f78c294.zip
riscv-tests-98a7fc66ec9342d6e3f1e3477c2e30d75f78c294.tar.gz
riscv-tests-98a7fc66ec9342d6e3f1e3477c2e30d75f78c294.tar.bz2
Merge pull request #35 from richardxia/have-openocd-pick-gdb-server-port
Tell OpenOCD to pick an unused port for gdb server
-rw-r--r--debug/testlib.py30
1 files changed, 27 insertions, 3 deletions
diff --git a/debug/testlib.py b/debug/testlib.py
index b20e2ff..b8e9ad4 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 = 50
+ 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(0.1)
+ raise Exception("Timed out waiting for gdb server to obtain port.")
+
def __del__(self):
try:
self.process.kill()