X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=debug%2Fgdbserver.py;h=476e51d876c48b46ce43b6ac4cd75d0a7d5bc2a7;hb=2b0193de9f7cb43d3b3c519fe8eff497ea738598;hp=f506640fbbc2d0cac41e8d7db88c19f38d28cb1b;hpb=6a64f119fbda35f415d0c8238909aba70acc1654;p=riscv-tests.git diff --git a/debug/gdbserver.py b/debug/gdbserver.py index f506640..476e51d 100755 --- a/debug/gdbserver.py +++ b/debug/gdbserver.py @@ -6,11 +6,13 @@ import random import sys import tempfile import time +import os import targets import testlib -from testlib import assertEqual, assertNotEqual, assertIn, assertNotIn -from testlib import assertGreater, assertTrue, assertRegexpMatches +from testlib import assertEqual, assertNotEqual, assertIn +from testlib import assertGreater, assertTrue, assertRegexpMatches, assertLess +from testlib import GdbTest MSTATUS_UIE = 0x00000001 MSTATUS_SIE = 0x00000002 @@ -34,30 +36,6 @@ MSTATUS64_SD = 0x8000000000000000 # pylint: disable=abstract-method -def gdb( - target=None, - port=None, - binary=None - ): - - g = None - if parsed.gdb: - g = testlib.Gdb(parsed.gdb) - else: - g = testlib.Gdb() - - if binary: - g.command("file %s" % binary) - if target: - g.command("set arch riscv:rv%d" % target.xlen) - g.command("set remotetimeout %d" % target.timeout_sec) - if port: - g.command("target extended-remote localhost:%d" % port) - - g.p("$priv=3") - - return g - def ihex_line(address, record_type, data): assert len(data) < 128 line = ":%02X%04X%02X" % (len(data), address, record_type) @@ -86,20 +64,6 @@ def ihex_parse(line): def readable_binary_string(s): return "".join("%02x" % ord(c) for c in s) -class GdbTest(testlib.BaseTest): - def __init__(self, target): - testlib.BaseTest.__init__(self, target) - self.gdb = None - - def classSetup(self): - testlib.BaseTest.classSetup(self) - self.logs.append("gdb.log") - self.gdb = gdb(self.target, self.server.port, self.binary) - - def classTeardown(self): - del self.gdb - testlib.BaseTest.classTeardown(self) - class SimpleRegisterTest(GdbTest): def check_reg(self, name): a = random.randrange(1<\n") - download_c.write( + length = min(2**10, self.target.ram_size - 2048) + self.download_c = tempfile.NamedTemporaryFile(prefix="download_", + suffix=".c", delete=False) + self.download_c.write("#include \n") + self.download_c.write( "unsigned int crc32a(uint8_t *message, unsigned int size);\n") - download_c.write("uint32_t length = %d;\n" % length) - download_c.write("uint8_t d[%d] = {\n" % length) + self.download_c.write("uint32_t length = %d;\n" % length) + self.download_c.write("uint8_t d[%d] = {\n" % length) self.crc = 0 + assert length % 16 == 0 for i in range(length / 16): - download_c.write(" /* 0x%04x */ " % (i * 16)) + self.download_c.write(" /* 0x%04x */ " % (i * 16)) for _ in range(16): value = random.randrange(1<<8) - download_c.write("%d, " % value) + self.download_c.write("0x%02x, " % value) self.crc = binascii.crc32("%c" % value, self.crc) - download_c.write("\n") - download_c.write("};\n") - download_c.write("uint8_t *data = &d[0];\n") - download_c.write("uint32_t main() { return crc32a(data, length); }\n") - download_c.flush() + self.download_c.write("\n") + self.download_c.write("};\n") + self.download_c.write("uint8_t *data = &d[0];\n") + self.download_c.write( + "uint32_t main() { return crc32a(data, length); }\n") + self.download_c.flush() if self.crc < 0: self.crc += 2**32 - self.binary = self.target.compile(download_c.name, + self.binary = self.target.compile(self.download_c.name, "programs/checksum.c") self.gdb.command("file %s" % self.binary) def test(self): self.gdb.load() self.gdb.command("b _exit") - self.gdb.c() + self.gdb.c(timeout=60) assertEqual(self.gdb.p("status"), self.crc) - -class MprvTest(GdbTest): - compile_args = ("programs/mprv.S", ) - def setup(self): - self.gdb.load() - - def test(self): - """Test that the debugger can access memory when MPRV is set.""" - self.gdb.c(wait=False) - time.sleep(0.5) - self.gdb.interrupt() - output = self.gdb.command("p/x *(int*)(((char*)&data)-0x80000000)") - assertIn("0xbead", output) - -class PrivTest(GdbTest): - compile_args = ("programs/priv.S", ) - def setup(self): - # pylint: disable=attribute-defined-outside-init - self.gdb.load() - - misa = self.gdb.p("$misa") - self.supported = set() - if misa & (1<<20): - self.supported.add(0) - if misa & (1<<18): - self.supported.add(1) - if misa & (1<<7): - self.supported.add(2) - self.supported.add(3) - -class PrivRw(PrivTest): - def test(self): - """Test reading/writing priv.""" - for privilege in range(4): - self.gdb.p("$priv=%d" % privilege) - self.gdb.stepi() - actual = self.gdb.p("$priv") - assertIn(actual, self.supported) - if privilege in self.supported: - assertEqual(actual, privilege) - -class PrivChange(PrivTest): - def test(self): - """Test that the core's privilege level actually changes.""" - - if 0 not in self.supported: - return 'not_applicable' - - self.gdb.b("main") - self.gdb.c() - - # Machine mode - self.gdb.p("$priv=3") - main_address = self.gdb.p("$pc") - self.gdb.stepi() - assertEqual("%x" % self.gdb.p("$pc"), "%x" % (main_address+4)) - - # User mode - self.gdb.p("$priv=0") - self.gdb.stepi() - # Should have taken an exception, so be nowhere near main. - pc = self.gdb.p("$pc") - assertTrue(pc < main_address or pc > main_address + 0x100) + os.unlink(self.download_c.name) + +# FIXME: PRIV isn't implemented in the current OpenOCD +#class MprvTest(GdbTest): +# compile_args = ("programs/mprv.S", ) +# def setup(self): +# self.gdb.load() +# +# def test(self): +# """Test that the debugger can access memory when MPRV is set.""" +# self.gdb.c(wait=False) +# time.sleep(0.5) +# self.gdb.interrupt() +# output = self.gdb.command("p/x *(int*)(((char*)&data)-0x80000000)") +# assertIn("0xbead", output) +# +#class PrivTest(GdbTest): +# compile_args = ("programs/priv.S", ) +# def setup(self): +# # pylint: disable=attribute-defined-outside-init +# self.gdb.load() +# +# misa = self.target.misa +# self.supported = set() +# if misa & (1<<20): +# self.supported.add(0) +# if misa & (1<<18): +# self.supported.add(1) +# if misa & (1<<7): +# self.supported.add(2) +# self.supported.add(3) +# +#class PrivRw(PrivTest): +# def test(self): +# """Test reading/writing priv.""" +# for privilege in range(4): +# self.gdb.p("$priv=%d" % privilege) +# self.gdb.stepi() +# actual = self.gdb.p("$priv") +# assertIn(actual, self.supported) +# if privilege in self.supported: +# assertEqual(actual, privilege) +# +#class PrivChange(PrivTest): +# def test(self): +# """Test that the core's privilege level actually changes.""" +# +# if 0 not in self.supported: +# return 'not_applicable' +# +# self.gdb.b("main") +# self.gdb.c() +# +# # Machine mode +# self.gdb.p("$priv=3") +# main_address = self.gdb.p("$pc") +# self.gdb.stepi() +# assertEqual("%x" % self.gdb.p("$pc"), "%x" % (main_address+4)) +# +# # User mode +# self.gdb.p("$priv=0") +# self.gdb.stepi() +# # Should have taken an exception, so be nowhere near main. +# pc = self.gdb.p("$pc") +# assertTrue(pc < main_address or pc > main_address + 0x100) parsed = None def main(): @@ -681,11 +686,9 @@ def main(): epilog=""" Example command line from the real world: Run all RegsTest cases against a physical FPGA, with custom openocd command: - ./gdbserver.py --freedom-e300 --cmd "$HOME/SiFive/openocd/src/openocd -s $HOME/SiFive/openocd/tcl -d" Simple + ./gdbserver.py --freedom-e300 --server_cmd "$HOME/SiFive/openocd/src/openocd -s $HOME/SiFive/openocd/tcl -d" Simple """) targets.add_target_options(parser) - parser.add_argument("--gdb", - help="The command to use to start gdb.") testlib.add_test_run_options(parser) @@ -693,13 +696,13 @@ def main(): global parsed # pylint: disable=global-statement parsed = parser.parse_args() - target = parsed.target(parsed.cmd, parsed.run, parsed.isolate) + 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.test, parsed.fail_fast) + return testlib.run_all_tests(module, target, parsed) # TROUBLESHOOTING TIPS # If a particular test fails, run just that one test, eg.: