aboutsummaryrefslogtreecommitdiff
path: root/debug/gdbserver.py
diff options
context:
space:
mode:
authorTim Newsome <tim@sifive.com>2016-09-29 11:42:41 -0700
committerTim Newsome <tim@sifive.com>2016-09-29 11:42:41 -0700
commit3a5ca22f5cc6044ae6cdfb2874f62b3e6a9878ad (patch)
tree32d537fd942f81351add0eb3efe0226d43756501 /debug/gdbserver.py
parentad4010d4b7147a6607c2fd30c7885ca6b464abbc (diff)
downloadriscv-tests-3a5ca22f5cc6044ae6cdfb2874f62b3e6a9878ad.zip
riscv-tests-3a5ca22f5cc6044ae6cdfb2874f62b3e6a9878ad.tar.gz
riscv-tests-3a5ca22f5cc6044ae6cdfb2874f62b3e6a9878ad.tar.bz2
Update dmode test to match spec.
M-mode writes to triggers with dmode set are now ignored instead of raising an exception. Also added -f/--fail-fast option to gdbserver.
Diffstat (limited to 'debug/gdbserver.py')
-rwxr-xr-xdebug/gdbserver.py61
1 files changed, 48 insertions, 13 deletions
diff --git a/debug/gdbserver.py b/debug/gdbserver.py
index 4e8cb5b..81aafa3 100755
--- a/debug/gdbserver.py
+++ b/debug/gdbserver.py
@@ -175,7 +175,9 @@ class TestFailed(Exception):
Exception.__init__(self)
self.message = message
-def run_all_tests(target, tests):
+def run_all_tests(target, tests, fail_fast):
+ good_results = set(('pass', 'not_applicable'))
+
results = {}
module = sys.modules[__name__]
for name in dir(module):
@@ -185,11 +187,11 @@ def run_all_tests(target, tests):
instance = definition(target)
result = instance.run()
results.setdefault(result, []).append(name)
+ if result not in good_results and fail_fast:
+ break
print ":" * 40
- good_results = set(('pass', 'not_applicable'))
-
result = 0
for key, value in results.iteritems():
print "%d tests returned %s" % (len(value), key)
@@ -592,17 +594,47 @@ class TriggerStoreAddressInstant(TriggerTest):
assertEqual(self.gdb.p("$a0"), self.gdb.p("&data"))
class TriggerDmode(TriggerTest):
+ def check_triggers(self, tdata1_lsbs, tdata2):
+ dmode = 1 << (self.target.xlen-5)
+
+ triggers = []
+
+ if self.target.xlen == 32:
+ xlen_type = 'int'
+ elif self.target.xlen == 64:
+ xlen_type = 'long long'
+ else:
+ raise NotImplementedError
+
+ dmode_count = 0
+ i = 0
+ for i in range(16):
+ tdata1 = self.gdb.p("((%s *)&data)[%d]" % (xlen_type, 2*i))
+ if tdata1 == 0:
+ break
+ tdata2 = self.gdb.p("((%s *)&data)[%d]" % (xlen_type, 2*i+1))
+
+ if tdata1 & dmode:
+ dmode_count += 1
+ else:
+ assertEqual(tdata1 & 0xffff, tdata1_lsbs)
+ assertEqual(tdata2, tdata2)
+
+ assertGreater(i, 1)
+ assertEqual(dmode_count, 1)
+
+ return triggers
+
def test(self):
- return 'not_applicable'
- # pylint: disable=unreachable
- # Temporarily not applicable until spike is fixed to match the spec
- # change.
- self.gdb.command("hbreak handle_trap")
- self.gdb.p("$pc=write_valid")
+ self.gdb.command("hbreak write_load_trigger")
+ self.gdb.b("clear_triggers")
+ self.gdb.p("$pc=write_store_trigger")
output = self.gdb.c()
- assertIn("handle_trap", output)
- assertIn("mcause=2", output)
- assertIn("mepc=%d" % self.gdb.p("&write_invalid_illegal"), output)
+ assertIn("write_load_trigger", output)
+ self.check_triggers((1<<6) | (1<<1), 0xdeadbee0)
+ output = self.gdb.c()
+ assertIn("clear_triggers", output)
+ self.check_triggers((1<<6) | (1<<0), 0xfeedac00)
class RegsTest(GdbTest):
compile_args = ("programs/regs.S", )
@@ -893,6 +925,9 @@ def main():
"the same time. This may make it harder to debug a failure if it "
"does occur.")
+ parser.add_argument("--fail-fast", "-f", action="store_true",
+ help="Exit as soon as any test fails.")
+
parser.add_argument("test", nargs='*',
help="Run only tests that are named here.")
@@ -904,7 +939,7 @@ def main():
if parsed.xlen:
target.xlen = parsed.xlen
- return run_all_tests(target, parsed.test)
+ return run_all_tests(target, parsed.test, parsed.fail_fast)
# TROUBLESHOOTING TIPS
# If a particular test fails, run just that one test, eg.: