diff options
author | Tim Newsome <tim@sifive.com> | 2016-09-29 11:42:41 -0700 |
---|---|---|
committer | Tim Newsome <tim@sifive.com> | 2016-09-29 11:42:41 -0700 |
commit | 3a5ca22f5cc6044ae6cdfb2874f62b3e6a9878ad (patch) | |
tree | 32d537fd942f81351add0eb3efe0226d43756501 /debug/gdbserver.py | |
parent | ad4010d4b7147a6607c2fd30c7885ca6b464abbc (diff) | |
download | riscv-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-x | debug/gdbserver.py | 61 |
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.: |