1import lldb
2from lldbsuite.test.lldbtest import *
3from lldbsuite.test.decorators import *
4from lldbsuite.test.gdbclientutils import *
5from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase
6
7
8class TestMemoryRegionDirtyPages(GDBRemoteTestBase):
9
10    @skipIfXmlSupportMissing
11    def test(self):
12        class MyResponder(MockGDBServerResponder):
13
14            def qHostInfo(self):
15                return "ptrsize:8;endian:little;vm-page-size:4096;"
16
17            def qMemoryRegionInfo(self, addr):
18                if addr == 0:
19                    return "start:0;size:100000000;"
20                if addr == 0x100000000:
21                    return "start:100000000;size:4000;permissions:rx;dirty-pages:;"
22                if addr == 0x100004000:
23                    return "start:100004000;size:4000;permissions:r;dirty-pages:100004000;"
24                if addr == 0x1000a2000:
25                    return "start:1000a2000;size:5000;permissions:r;dirty-pages:1000a2000,1000a3000,1000a4000,1000a5000,1000a6000;"
26
27        self.server.responder = MyResponder()
28        target = self.dbg.CreateTarget('')
29        if self.TraceOn():
30          self.runCmd("log enable gdb-remote packets")
31          self.addTearDownHook(
32                lambda: self.runCmd("log disable gdb-remote packets"))
33        process = self.connect(target)
34
35        # A memory region where we don't know anything about dirty pages
36        region = lldb.SBMemoryRegionInfo()
37        err = process.GetMemoryRegionInfo(0, region)
38        self.assertSuccess(err)
39        self.assertFalse(region.HasDirtyMemoryPageList())
40        self.assertEqual(region.GetNumDirtyPages(), 0)
41        region.Clear()
42
43        # A memory region with dirty page information -- and zero dirty pages
44        err = process.GetMemoryRegionInfo(0x100000000, region)
45        self.assertSuccess(err)
46        self.assertTrue(region.HasDirtyMemoryPageList())
47        self.assertEqual(region.GetNumDirtyPages(), 0)
48        self.assertEqual(region.GetPageSize(), 4096)
49        region.Clear()
50
51        # A memory region with one dirty page
52        err = process.GetMemoryRegionInfo(0x100004000, region)
53        self.assertSuccess(err)
54        self.assertTrue(region.HasDirtyMemoryPageList())
55        self.assertEqual(region.GetNumDirtyPages(), 1)
56        self.assertEqual(region.GetDirtyPageAddressAtIndex(0), 0x100004000)
57        region.Clear()
58
59        # A memory region with multple dirty pages
60        err = process.GetMemoryRegionInfo(0x1000a2000, region)
61        self.assertSuccess(err)
62        self.assertTrue(region.HasDirtyMemoryPageList())
63        self.assertEqual(region.GetNumDirtyPages(), 5)
64        self.assertEqual(region.GetDirtyPageAddressAtIndex(4), 0x1000a6000)
65        region.Clear()
66
67