#!/usr/bin/env python """Test that OpenOCD can talk to a RISC-V target.""" import argparse import sys import targets import testlib from testlib import assertIn, assertEqual class OpenOcdTest(testlib.BaseTest): def __init__(self, target): testlib.BaseTest.__init__(self, target) self.gdb = None def early_applicable(self): return self.target.openocd_config def setup(self): # pylint: disable=attribute-defined-outside-init self.cli = testlib.OpenocdCli() self.cli.command("halt") def write_nops(self, count): for address in range(self.target.ram, self.target.ram + 4 * count, 4): # 0x13 is nop self.cli.command("mww 0x%x 0x13" % address) class RegTest(OpenOcdTest): def test(self): self.write_nops(4) regs = self.cli.reg() assertIn("x18", regs) self.cli.command("reg x18 0x11782") self.cli.command("step 0x%x" % self.target.ram) assertEqual(self.cli.reg("x18"), 0x11782) class StepTest(OpenOcdTest): def test(self): self.write_nops(4) self.cli.command("step 0x%x" % self.target.ram) for i in range(4): pc = self.cli.reg("pc") assertEqual(pc, self.target.ram + 4 * (i+1)) self.cli.command("step") class ResumeTest(OpenOcdTest): def test(self): self.write_nops(16) self.cli.command("bp 0x%x 4" % (self.target.ram + 12)) self.cli.command("bp 0x%x 4" % (self.target.ram + 24)) self.cli.command("resume 0x%x" % self.target.ram) assertEqual(self.cli.reg("pc"), self.target.ram + 12) self.cli.command("resume") assertEqual(self.cli.reg("pc"), self.target.ram + 24) self.cli.command("resume 0x%x" % self.target.ram) assertEqual(self.cli.reg("pc"), self.target.ram + 12) def main(): parser = argparse.ArgumentParser( description="Test that OpenOCD can talk to a RISC-V target.") targets.add_target_options(parser) testlib.add_test_run_options(parser) parsed = parser.parse_args() target = parsed.target(parsed.server_cmd, parsed.sim_cmd, parsed.isolate) if parsed.xlen: target.xlen = parsed.xlen module = sys.modules[__name__] return testlib.run_all_tests(module, target, parsed) if __name__ == '__main__': sys.exit(main())