X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=debug%2Fgdbserver.py;h=09938d3f1b049b4e44674be4aa901285c6fdff41;hb=4590b79bc7241f3fa2424f96b4c6666a864fb6a9;hp=51c6ab6b09d550e2d1fbce5d4b8ee81ef09c5d35;hpb=452853f0f96be65cde0900265b654c01b35f321d;p=riscv-tests.git diff --git a/debug/gdbserver.py b/debug/gdbserver.py index 51c6ab6..09938d3 100755 --- a/debug/gdbserver.py +++ b/debug/gdbserver.py @@ -65,15 +65,19 @@ def readable_binary_string(s): return "".join("%02x" % ord(c) for c in s) class SimpleRegisterTest(GdbTest): - def check_reg(self, name): + def check_reg(self, name, alias): a = random.randrange(1< 1 -# -# def setup(self): -# self.gdb.load() -# for hart in self.target.harts: -# self.gdb.select_hart(hart) -# self.gdb.p("$pc=_start") -# -# def test(self): -# # Run to main -# # Hart 0 is the first to be resumed, so we have to set the breakpoint -# # there. gdb won't actually set the breakpoint until we tell it to -# # resume. -# self.gdb.select_hart(self.target.harts[0]) -# self.gdb.b("main") -# self.gdb.c_all() -# for hart in self.target.harts: -# self.gdb.select_hart(hart) -# assertIn("main", self.gdb.where()) -# self.gdb.select_hart(self.target.harts[0]) -# self.gdb.command("delete breakpoints") -# -# # Run through the entire loop. -# self.gdb.b("main_end") -# self.gdb.c_all() -# -# hart_ids = [] -# for hart in self.target.harts: -# self.gdb.select_hart(hart) -# assertIn("main_end", self.gdb.where()) -# # Check register values. -# hart_id = self.gdb.p("$x1") -# assertNotIn(hart_id, hart_ids) -# hart_ids.append(hart_id) -# for n in range(2, 32): -# value = self.gdb.p("$x%d" % n) -# assertEqual(value, hart_ids[-1] + n - 1) -# -# # Confirmed that we read different register values for different harts. -# # Write a new value to x1, and run through the add sequence again. -# -# for hart in self.target.harts: -# self.gdb.select_hart(hart) -# self.gdb.p("$x1=0x%x" % (hart.index * 0x800)) -# self.gdb.p("$pc=main_post_csrr") -# self.gdb.c_all() -# for hart in self.target.harts: -# self.gdb.select_hart(hart) -# assertIn("main", self.gdb.where()) -# # Check register values. -# for n in range(1, 32): -# value = self.gdb.p("$x%d" % n) -# assertEqual(value, hart.index * 0x800 + n - 1) +class MulticoreRegTest(GdbTest): + compile_args = ("programs/infinite_loop.S", "-DMULTICORE") + + def early_applicable(self): + return len(self.target.harts) > 1 + + def setup(self): + self.gdb.load() + for hart in self.target.harts: + self.gdb.select_hart(hart) + self.gdb.p("$pc=_start") + + def test(self): + # Run to main + for hart in self.target.harts: + self.gdb.select_hart(hart) + self.gdb.b("main") + self.gdb.c() + assertIn("main", self.gdb.where()) + self.gdb.command("delete breakpoints") + + # Run through the entire loop. + for hart in self.target.harts: + self.gdb.select_hart(hart) + self.gdb.b("main_end") + self.gdb.c() + assertIn("main_end", self.gdb.where()) + + hart_ids = [] + for hart in self.target.harts: + self.gdb.select_hart(hart) + # Check register values. + hart_id = self.gdb.p("$x1") + assertNotIn(hart_id, hart_ids) + hart_ids.append(hart_id) + for n in range(2, 32): + value = self.gdb.p("$x%d" % n) + assertEqual(value, hart_ids[-1] + n - 1) + + # Confirmed that we read different register values for different harts. + # Write a new value to x1, and run through the add sequence again. + + for hart in self.target.harts: + self.gdb.select_hart(hart) + self.gdb.p("$x1=0x%x" % (hart.index * 0x800)) + self.gdb.p("$pc=main_post_csrr") + self.gdb.c() + for hart in self.target.harts: + self.gdb.select_hart(hart) + assertIn("main", self.gdb.where()) + # Check register values. + for n in range(1, 32): + value = self.gdb.p("$x%d" % n) + assertEqual(value, hart.index * 0x800 + n - 1) class MulticoreRunHaltStepiTest(GdbTest): compile_args = ("programs/multicore.c", "-DMULTICORE") @@ -810,6 +814,13 @@ class PrivTest(GdbTest): class PrivRw(PrivTest): def test(self): """Test reading/writing priv.""" + # Disable physical memory protection by allowing U mode access to all + # memory. + self.gdb.p("$pmpcfg0=0xf") # TOR, R, W, X + self.gdb.p("$pmpaddr0=0x%x" % ((self.hart.ram + self.hart.ram_size) >> 2)) + + # Leave the PC at _start, where the first 4 instructions should be + # legal in any mode. for privilege in range(4): self.gdb.p("$priv=%d" % privilege) self.gdb.stepi() @@ -858,9 +869,7 @@ def main(): global parsed # pylint: disable=global-statement parsed = parser.parse_args() target = targets.target(parsed) - - if parsed.xlen: - target.xlen = parsed.xlen + testlib.print_log_names = parsed.print_log_names module = sys.modules[__name__]