"""Single step a bunch of times."""
self.gdb.command("p i=0");
last_pc = None
+ advances = 0
+ jumps = 0
for _ in range(100):
self.gdb.stepi()
- pc = self.gdb.command("p $pc")
+ pc = self.gdb.p("$pc")
self.assertNotEqual(last_pc, pc)
+ if (last_pc and pc > last_pc and pc - last_pc <= 4):
+ advances += 1
+ else:
+ jumps += 1
last_pc = pc
+ # Some basic sanity that we're not running between breakpoints or
+ # something.
+ self.assertGreater(jumps, 10)
+ self.assertGreater(advances, 50)
def test_exit(self):
self.exit()
+ def test_symbols(self):
+ self.gdb.b("main")
+ self.gdb.b("rot13")
+ output = self.gdb.c()
+ self.assertIn(", main ", output)
+ output = self.gdb.c()
+ self.assertIn(", rot13 ", output)
+
def test_breakpoint(self):
self.gdb.b("rot13")
# The breakpoint should be hit exactly 2 times.
#TODO self.assertIn("rot13 ", output)
self.exit()
- def test_hwbp(self):
+ def test_hwbp_1(self):
self.gdb.hbreak("rot13")
# The breakpoint should be hit exactly 2 times.
for i in range(2):
#TODO self.assertIn("rot13 ", output)
self.exit()
+ def test_hwbp_2(self):
+ self.gdb.hbreak("main")
+ self.gdb.hbreak("rot13")
+ # We should hit 3 breakpoints.
+ for i in range(3):
+ output = self.gdb.c()
+ self.gdb.p("$pc")
+ self.assertIn("Breakpoint ", output)
+ #TODO self.assertIn("rot13 ", output)
+ self.exit()
+
def test_too_many_hwbp(self):
for i in range(30):
self.gdb.hbreak("*rot13 + %d" % (i * 4))
self.gdb.p("i=0");
self.exit()
+class StepTest(DeleteServer):
+ def setUp(self):
+ self.binary = target.compile("programs/step.S")
+ self.server = target.server()
+ self.gdb = testlib.Gdb()
+ self.gdb.command("file %s" % self.binary)
+ self.gdb.command("target extended-remote localhost:%d" % self.server.port)
+ self.gdb.load()
+ self.gdb.b("main")
+ self.gdb.c()
+
+ def test_step(self):
+ main = self.gdb.p("$pc")
+ for expected in (4, 0xc, 0x10, 0x18, 0x14, 0x14):
+ self.gdb.stepi()
+ pc = self.gdb.p("$pc")
+ self.assertEqual(pc - main, expected)
+
class RegsTest(DeleteServer):
def setUp(self):
self.binary = target.compile("programs/regs.S")
class DownloadTest(DeleteServer):
def setUp(self):
- length = 2**20
+ length = min(2**20, target.ram_size - 2048)
fd = file("download.c", "w")
fd.write("#include <stdint.h>\n")
fd.write("unsigned int crc32a(uint8_t *message, unsigned int size);\n")
def test_mprv(self):
"""Test that the debugger can access memory when MPRV is set."""
self.gdb.c(wait=False)
+ time.sleep(0.5)
self.gdb.interrupt()
output = self.gdb.command("p/x *(int*)(((char*)&data)-0x80000000)")
self.assertIn("0xbead", output)
name = "spike"
xlen = 64
ram = 0x80010000
+ ram_size = 5 * 1024 * 1024
def server(self):
return testlib.Spike(parsed.cmd, halted=True)
directory = "spike"
xlen = 32
ram = 0x80010000
+ ram_size = 5 * 1024 * 1024
def server(self):
return testlib.Spike(parsed.cmd, halted=True, xlen=32)
name = "m2gl_m2s"
xlen = 32
ram = 0x80000000
+ ram_size = 16 * 1024
def server(self):
return testlib.Openocd(cmd=parsed.cmd,