self.active_child.expect("Continuing")
def c_all(self):
- """Resume every hart."""
+ """
+ Resume every hart.
+
+ This function works fine when using multiple gdb sessions, but the
+ caller must be careful when using it nonetheless. gdb's behavior is to
+ not set breakpoints until just before the hart is resumed, and then
+ clears them as soon as the hart halts. That means that you can't set
+ one software breakpoint, and expect multiple harts to hit it. It's
+ possible that the first hart completes set/run/halt/clear before the
+ second hart even gets to resume, so it will never hit the breakpoint.
+ """
with PrivateState(self):
for child in self.children:
child.sendline("c")
gdb_cmd = parsed.gdb
todo = []
+ examine_added = False
for hart in target.harts:
if parsed.misaval:
hart.misa = int(parsed.misaval, 16)
print "Using $misa from command line: 0x%x" % hart.misa
elif hart.misa:
print "Using $misa from hart definition: 0x%x" % hart.misa
- else:
- todo.append(("ExamineTarget", ExamineTarget, hart))
+ elif not examine_added:
+ todo.append(("ExamineTarget", ExamineTarget, None))
+ examine_added = True
for name in dir(module):
definition = getattr(module, name)
- if type(definition) == type and hasattr(definition, 'test') and \
+ if isinstance(definition, type) and hasattr(definition, 'test') and \
(not parsed.test or any(test in name for test in parsed.test)):
todo.append((name, definition, None))
compile_args = getattr(self, 'compile_args', None)
if compile_args:
if compile_args not in BaseTest.compiled:
- # pylint: disable=star-args
BaseTest.compiled[compile_args] = \
self.target.compile(self.hart, *compile_args)
self.binary = BaseTest.compiled.get(compile_args)
class ExamineTarget(GdbTest):
def test(self):
- self.hart.misa = self.gdb.p("$misa")
-
- txt = "RV"
- if (self.hart.misa >> 30) == 1:
- txt += "32"
- elif (self.hart.misa >> 62) == 2:
- txt += "64"
- elif (self.hart.misa >> 126) == 3:
- txt += "128"
- else:
- raise TestFailed("Couldn't determine XLEN from $misa (0x%x)" %
- self.hart.misa)
+ for hart in self.target.harts:
+ self.gdb.select_hart(hart)
+
+ hart.misa = self.gdb.p("$misa")
+
+ txt = "RV"
+ if (hart.misa >> 30) == 1:
+ txt += "32"
+ elif (hart.misa >> 62) == 2:
+ txt += "64"
+ elif (hart.misa >> 126) == 3:
+ txt += "128"
+ else:
+ raise TestFailed("Couldn't determine XLEN from $misa (0x%x)" %
+ self.hart.misa)
- for i in range(26):
- if self.hart.misa & (1<<i):
- txt += chr(i + ord('A'))
- print txt,
+ for i in range(26):
+ if hart.misa & (1<<i):
+ txt += chr(i + ord('A'))
+ print txt,
class TestFailed(Exception):
def __init__(self, message):