X-Git-Url: https://git.libre-soc.org/?p=riscv-tests.git;a=blobdiff_plain;f=debug%2Ftestlib.py;h=99c4a7628b0188568d98a0be9898dd4c5dc3d0e0;hp=f8c8062f2b9c05d9416d90099d3e84611924b2d8;hb=37a93a9f86521aea2758271a1cc87c23bca06f59;hpb=7ce8ad62d7f1a1e183665418151d7c655c29642a diff --git a/debug/testlib.py b/debug/testlib.py index f8c8062..99c4a76 100644 --- a/debug/testlib.py +++ b/debug/testlib.py @@ -5,6 +5,7 @@ import subprocess import tempfile import testlib import unittest +import time # Note that gdb comes with its own testsuite. I was unable to figure out how to # run that testsuite against the spike simulator. @@ -17,10 +18,8 @@ def find_file(path): return None def compile(args, xlen=32): - """Compile a single .c file into a binary.""" - dst = os.path.splitext(args[0])[0] cc = os.path.expandvars("$RISCV/bin/riscv%d-unknown-elf-gcc" % xlen) - cmd = [cc, "-g", "-o", dst] + cmd = [cc, "-g"] for arg in args: found = find_file(arg) if found: @@ -30,7 +29,6 @@ def compile(args, xlen=32): cmd = " ".join(cmd) result = os.system(cmd) assert result == 0, "%r failed" % cmd - return dst def unused_port(): # http://stackoverflow.com/questions/2838244/get-open-tcp-port-in-python/2838309#2838309 @@ -65,6 +63,7 @@ class Spike(object): cmd.append(binary) logfile = open("spike.log", "w") logfile.write("+ %s\n" % " ".join(cmd)) + logfile.flush() self.process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=logfile, stderr=logfile) @@ -78,8 +77,46 @@ class Spike(object): def wait(self, *args, **kwargs): return self.process.wait(*args, **kwargs) +class VcsSim(object): + def __init__(self, simv=None, debug=False): + if simv: + cmd = shlex.split(simv) + else: + cmd = ["simv"] + cmd += ["+jtag_vpi_enable"] + if debug: + cmd[0] = cmd[0] + "-debug" + cmd += ["+vcdplusfile=output/gdbserver.vpd"] + logfile = open("simv.log", "w") + logfile.write("+ %s\n" % " ".join(cmd)) + logfile.flush() + listenfile = open("simv.log", "r") + listenfile.seek(0,2) + self.process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=logfile, + stderr=logfile) + done = False + while (not done): + line = listenfile.readline() + if (not line): + time.sleep(1) + if ("Listening on port 5555" in line): + done = True + + def __del__(self): + try: + self.process.kill() + self.process.wait() + except OSError: + pass + + class Openocd(object): - def __init__(self, cmd=None, config=None, debug=True): + def __init__(self, cmd=None, config=None, debug=False, otherProcess=None): + + # keep handles to other processes -- don't let them be + # garbage collected yet. + + self.otherProcess = otherProcess if cmd: cmd = shlex.split(cmd) else: @@ -89,6 +126,7 @@ class Openocd(object): if debug: cmd.append("-d") logfile = open("openocd.log", "w") + logfile.write("+ %s\n" % " ".join(cmd)) self.process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=logfile, stderr=logfile) # TODO: Pick a random port @@ -102,10 +140,11 @@ class Openocd(object): pass class Gdb(object): - def __init__(self): - path = os.path.expandvars("$RISCV/bin/riscv64-unknown-elf-gdb") - self.child = pexpect.spawn(path) + def __init__(self, + cmd=os.path.expandvars("$RISCV/bin/riscv64-unknown-elf-gdb")): + self.child = pexpect.spawn(cmd) self.child.logfile = file("gdb.log", "w") + self.child.logfile.write("+ %s\n" % cmd) self.wait() self.command("set confirm off") self.command("set width 0") @@ -153,7 +192,7 @@ class Gdb(object): return output def load(self): - output = self.command("load") + output = self.command("load", timeout=60) assert "failed" not in output assert "Transfer rate" in output @@ -166,5 +205,5 @@ class Gdb(object): def hbreak(self, location): output = self.command("hbreak %s" % location) assert "not defined" not in output - assert "Breakpoint" in output + assert "Hardware assisted breakpoint" in output return output