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