From 4ec77dde62f8c14df9403abf7b10a2455ea72125 Mon Sep 17 00:00:00 2001 From: Tim Newsome Date: Tue, 27 Dec 2016 11:34:50 -0800 Subject: [PATCH] Use compressed code if the target supports it. The main change was to read misa before running any other test. If misa indicates C is supported, then use compressed code. This required changing some tests, mostly to ensure correct alignment. The single step test also needs to know the correct addresses to step through in compressed code. Only print at most 1000 lines from each log file. --- debug/gdbserver.py | 59 ++++++------------------- debug/openocd.py | 2 +- debug/programs/step.S | 8 +++- debug/programs/trigger.S | 1 + debug/targets.py | 7 +++ debug/testlib.py | 93 +++++++++++++++++++++++++++++++++++----- 6 files changed, 109 insertions(+), 61 deletions(-) diff --git a/debug/gdbserver.py b/debug/gdbserver.py index 323d32c..9dfea39 100755 --- a/debug/gdbserver.py +++ b/debug/gdbserver.py @@ -11,6 +11,7 @@ import targets import testlib 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 +35,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 +63,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< 1000: + for l in lines[:500]: + sys.stdout.write(l) + print "..." + for l in lines[-500:]: + sys.stdout.write(l) + else: + for l in lines: + sys.stdout.write(l) + class BaseTest(object): compiled = {} - logs = [] def __init__(self, target): self.target = target @@ -382,6 +404,7 @@ class BaseTest(object): self.target_process = None self.binary = None self.start = 0 + self.logs = [] def early_applicable(self): """Return a false value if the test has determined it cannot run @@ -450,8 +473,7 @@ class BaseTest(object): header("Traceback") traceback.print_exc(file=sys.stdout) for log in self.logs: - header(log) - print open(log, "r").read() + print_log(log) print "/" * 40 return result @@ -463,6 +485,55 @@ class BaseTest(object): print "%s in %.2fs" % (result, time.time() - self.start) return result +gdb_cmd = None +class GdbTest(BaseTest): + def __init__(self, target): + BaseTest.__init__(self, target) + self.gdb = None + + def classSetup(self): + BaseTest.classSetup(self) + self.logs.append("gdb.log") + + if gdb_cmd: + self.gdb = Gdb(gdb_cmd) + else: + self.gdb = Gdb() + + if self.binary: + self.gdb.command("file %s" % self.binary) + if self.target: + self.gdb.command("set arch riscv:rv%d" % self.target.xlen) + self.gdb.command("set remotetimeout %d" % self.target.timeout_sec) + if self.server.port: + self.gdb.command( + "target extended-remote localhost:%d" % self.server.port) + + self.gdb.p("$priv=3") + + def classTeardown(self): + del self.gdb + BaseTest.classTeardown(self) + +class ExamineTarget(GdbTest): + def test(self): + self.target.misa = self.gdb.p("$misa") + + txt = "RV" + if (self.target.misa >> 30) == 1: + txt += "32" + elif (self.target.misa >> 62) == 2: + txt += "64" + elif (self.target.misa >> 126) == 3: + txt += "128" + else: + txt += "??" + + for i in range(26): + if self.target.misa & (1<