e9b17d0283bdeb253cab412a24c31907f567f455
9 # Note that gdb comes with its own testsuite. I was unable to figure out how to
10 # run that testsuite against the spike simulator.
13 for directory
in (os
.getcwd(), os
.path
.dirname(testlib
.__file
__)):
14 fullpath
= os
.path
.join(directory
, path
)
15 if os
.path
.exists(fullpath
):
19 def compile(args
, xlen
=32):
20 """Compile a single .c file into a binary."""
21 dst
= os
.path
.splitext(args
[0])[0]
22 cc
= os
.path
.expandvars("$RISCV/bin/riscv%d-unknown-elf-gcc" % xlen
)
23 cmd
= [cc
, "-g", "-o", dst
]
25 found
= find_file(arg
)
31 result
= os
.system(cmd
)
32 assert result
== 0, "%r failed" % cmd
36 # http://stackoverflow.com/questions/2838244/get-open-tcp-port-in-python/2838309#2838309
38 s
= socket
.socket(socket
.AF_INET
, socket
.SOCK_STREAM
)
40 port
= s
.getsockname()[1]
45 def __init__(self
, cmd
, binary
=None, halted
=False, with_gdb
=True, timeout
=None,
47 """Launch spike. Return tuple of its process and the port it's running on."""
49 cmd
= shlex
.split(cmd
)
53 cmd
+= ["--isa", "RV32"]
56 cmd
= ["timeout", str(timeout
)] + cmd
61 self
.port
= unused_port()
62 cmd
+= ['--gdb-port', str(self
.port
)]
66 logfile
= open("spike.log", "w")
67 logfile
.write("+ %s\n" % " ".join(cmd
))
69 self
.process
= subprocess
.Popen(cmd
, stdin
=subprocess
.PIPE
, stdout
=logfile
,
79 def wait(self
, *args
, **kwargs
):
80 return self
.process
.wait(*args
, **kwargs
)
82 class Openocd(object):
83 def __init__(self
, cmd
=None, config
=None, debug
=False):
85 cmd
= shlex
.split(cmd
)
89 cmd
+= ["-f", find_file(config
)]
92 logfile
= open("openocd.log", "w")
93 logfile
.write("+ %s\n" % " ".join(cmd
))
94 self
.process
= subprocess
.Popen(cmd
, stdin
=subprocess
.PIPE
, stdout
=logfile
,
96 # TODO: Pick a random port
108 path
=os
.path
.expandvars("$RISCV/bin/riscv64-unknown-elf-gdb")):
109 self
.child
= pexpect
.spawn(path
)
110 self
.child
.logfile
= file("gdb.log", "w")
111 self
.child
.logfile
.write("+ %s\n" % path
)
113 self
.command("set confirm off")
114 self
.command("set width 0")
115 self
.command("set height 0")
117 self
.command("set print entry-values no")
120 """Wait for prompt."""
121 self
.child
.expect("\(gdb\)")
123 def command(self
, command
, timeout
=-1):
124 self
.child
.sendline(command
)
125 self
.child
.expect("\n", timeout
=timeout
)
126 self
.child
.expect("\(gdb\)", timeout
=timeout
)
127 return self
.child
.before
.strip()
129 def c(self
, wait
=True):
131 output
= self
.command("c")
132 assert "Continuing" in output
135 self
.child
.sendline("c")
136 self
.child
.expect("Continuing")
139 self
.child
.send("\003");
140 self
.child
.expect("\(gdb\)")
141 return self
.child
.before
.strip()
143 def x(self
, address
, size
='w'):
144 output
= self
.command("x/%s %s" % (size
, address
))
145 value
= int(output
.split(':')[1].strip(), 0)
149 output
= self
.command("p/x %s" % obj
)
150 value
= int(output
.split('=')[-1].strip(), 0)
154 output
= self
.command("stepi")
155 assert "Cannot" not in output
159 output
= self
.command("load", timeout
=60)
160 assert "failed" not in output
161 assert "Transfer rate" in output
163 def b(self
, location
):
164 output
= self
.command("b %s" % location
)
165 assert "not defined" not in output
166 assert "Breakpoint" in output
169 def hbreak(self
, location
):
170 output
= self
.command("hbreak %s" % location
)
171 assert "not defined" not in output
172 assert "Hardware assisted breakpoint" in output