self.gdb.load()
for hart in self.target.harts:
self.gdb.select_hart(hart)
+ self.gdb.p("$mhartid")
self.gdb.p("$pc=_start")
def test(self):
previous_hart_count = [0 for h in self.target.harts]
previous_interrupt_count = [0 for h in self.target.harts]
- for _ in range(10):
- self.gdb.c(wait=False)
- time.sleep(2)
- self.gdb.interrupt()
- self.gdb.p("$mie")
- self.gdb.p("$mip")
- self.gdb.p("$mstatus")
- self.gdb.p("$priv")
- self.gdb.p("buf", fmt="")
- hart_count = self.gdb.p("hart_count")
- interrupt_count = self.gdb.p("interrupt_count")
- for i, h in enumerate(self.target.harts):
- assertGreater(hart_count[i], previous_hart_count[i])
- assertGreater(interrupt_count[i], previous_interrupt_count[i])
- self.gdb.select_hart(h)
- pc = self.gdb.p("$pc")
- self.gdb.stepi()
- stepped_pc = self.gdb.p("$pc")
- assertNotEqual(pc, stepped_pc)
+ # Check 10 times
+ for i in range(10):
+ # 3 attempts for each time we want the check to pass
+ for attempt in range(3):
+ self.gdb.global_command("echo round %d attempt %d\\n" % (i,
+ attempt))
+ self.gdb.c_all(wait=False)
+ time.sleep(2)
+ self.gdb.interrupt_all()
+ hart_count = self.gdb.p("hart_count")
+ interrupt_count = self.gdb.p("interrupt_count")
+ ok = True
+ for i, h in enumerate(self.target.harts):
+ if hart_count[i] <= previous_hart_count[i]:
+ ok = False
+ break
+ if interrupt_count[i] <= previous_interrupt_count[i]:
+ ok = False
+ break
+ self.gdb.p("$mie")
+ self.gdb.p("$mip")
+ self.gdb.p("$mstatus")
+ self.gdb.p("$priv")
+ self.gdb.p("buf", fmt="")
+ self.gdb.select_hart(h)
+ pc = self.gdb.p("$pc")
+ self.gdb.stepi()
+ stepped_pc = self.gdb.p("$pc")
+ assertNotEqual(pc, stepped_pc)
+ previous_hart_count = hart_count
+ previous_interrupt_count = interrupt_count
+ if ok:
+ break
+ else:
+ assert False, \
+ "hart count or interrupt didn't increment as expected"
class MulticoreRunAllHaltOne(GdbTest):
compile_args = ("programs/multicore.c", "-DMULTICORE")
time.sleep(1)
self.gdb.p("buf", fmt="")
-class StepTest(GdbTest):
+class StepTest(GdbSingleHartTest):
compile_args = ("programs/step.S", )
def setup(self):
pc = self.gdb.p("$pc")
assertEqual("%x" % (pc - main_address), "%x" % expected)
-class TriggerTest(GdbTest):
+class TriggerTest(GdbSingleHartTest):
compile_args = ("programs/trigger.S", )
def setup(self):
self.gdb.load()
assertIn("clear_triggers", output)
self.check_triggers((1<<6) | (1<<0), 0xfeedac00)
-class RegsTest(GdbTest):
+class RegsTest(GdbSingleHartTest):
compile_args = ("programs/regs.S", )
def setup(self):
self.gdb.load()
self.binary = self.target.compile(self.hart, self.download_c.name,
"programs/checksum.c")
- self.gdb.command("file %s" % self.binary)
+ self.gdb.global_command("file %s" % self.binary)
def test(self):
self.gdb.load()
+ self.parkOtherHarts()
self.gdb.command("b _exit")
self.gdb.c()
assertEqual(self.gdb.p("status"), self.crc)
os.unlink(self.download_c.name)
-#class MprvTest(GdbTest):
+#class MprvTest(GdbSingleHartTest):
# compile_args = ("programs/mprv.S", )
# def setup(self):
# self.gdb.load()
# output = self.gdb.command("p/x *(int*)(((char*)&data)-0x80000000)")
# assertIn("0xbead", output)
-class PrivTest(GdbTest):
+class PrivTest(GdbSingleHartTest):
compile_args = ("programs/priv.S", )
def setup(self):
# pylint: disable=attribute-defined-outside-init