aboutsummaryrefslogtreecommitdiff
path: root/tests/gdbserver-smoke.py
blob: 51e8cc95e3f42a1ebdbc12443d09491475dbe842 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/python

import os
import testlib
import unittest
import tempfile
import time

class DebugTest(unittest.TestCase):
    def setUp(self):
        self.binary = testlib.compile("debug.c")
        self.spike = testlib.spike(self.binary, halted=False)
        self.gdb = testlib.Gdb()
        self.gdb.command("file %s" % self.binary)
        self.gdb.command("target extended-remote localhost:9824")
        self.gdb.command("p i=0");

    def tearDown(self):
        self.spike.kill()
        self.spike.wait()

    def test_turbostep(self):
        """Single step a bunch of times."""
        last_pc = None
        for _ in range(100):
            self.gdb.command("stepi")
            pc = self.gdb.command("p $pc")
            self.assertNotEqual(last_pc, pc)
            last_pc = pc

    def test_exit(self):
        output = self.gdb.command("c")
        self.assertIn("Continuing", output)
        self.assertIn("Remote connection closed", output)

    def test_breakpoint(self):
        self.gdb.command("b print_row")
        # The breakpoint should be hit exactly 10 times.
        for _ in range(10):
            output = self.gdb.command("c")
            self.assertIn("Continuing", output)
            self.assertIn("Breakpoint 1", output)
        output = self.gdb.command("c")
        self.assertIn("Continuing", output)
        self.assertIn("Remote connection closed", output)

    def test_registers(self):
        output = self.gdb.command("info all-registers")
        self.assertNotIn("Could not", output)
        for reg in ('zero', 'ra', 'sp', 'gp', 'tp'):
            self.assertIn(reg, output)
        # mcpuid is one of the few registers that should have the high bit set
        # (for rv64).
        self.assertRegexpMatches(output, ".*mcpuid *0x80")

        # The time register should always be changing.
        last_time = None
        for _ in range(5):
            time = self.gdb.p("$time")
            self.assertNotEqual(time, last_time)
            last_time = time
            self.gdb.command("stepi")

class RegsTest(unittest.TestCase):
    def setUp(self):
        self.binary = testlib.compile("regs.s")
        self.spike = testlib.spike(self.binary, halted=False)
        self.gdb = testlib.Gdb()
        self.gdb.command("file %s" % self.binary)
        self.gdb.command("target extended-remote localhost:9824")

    def tearDown(self):
        self.spike.kill()
        self.spike.wait()

    def test_write_gprs(self):
        # Note a0 is missing from this list since it's used to hold the
        # address.
        regs = ("ra", "sp", "gp", "tp", "t0", "t1", "t2", "fp", "s1",
                "a1", "a2", "a3", "a4", "a5", "a6", "a7", "s2", "s3", "s4",
                "s5", "s6", "s7", "s8", "s9", "s10", "s11", "t3", "t4", "t5",
                "t6")

        self.gdb.command("p $pc=write_regs")
        for i, r in enumerate(regs):
            self.gdb.command("p $%s=%d" % (r, i*0xdeadbeef+17))
        self.gdb.command("p $a0=data")
        self.gdb.command("b all_done")
        output = self.gdb.command("c")
        self.assertIn("Breakpoint 1", output)

        for n in range(len(regs)):
            self.assertEqual(self.gdb.x("data+%d" % (8*n), 'g'),
                    n*0xdeadbeef+17)

    def test_write_csrs(self):
        # As much a test of gdb as of the simulator.
        self.gdb.p("$mscratch=0")
        self.gdb.stepi()
        self.assertEqual(self.gdb.p("$mscratch"), 0)
        self.gdb.p("$mscratch=123")
        self.gdb.stepi()
        self.assertEqual(self.gdb.p("$mscratch"), 123)

if __name__ == '__main__':
    unittest.main()