135 lines · python
1"""Test Python APIs for setting, getting, and using address masks."""2 3import os4import lldb5from lldbsuite.test.decorators import *6from lldbsuite.test.lldbtest import *7from lldbsuite.test import lldbutil8 9 10class AddressMasksTestCase(TestBase):11 NO_DEBUG_INFO_TESTCASE = True12 13 def reset_all_masks(self, process):14 process.SetAddressMask(15 lldb.eAddressMaskTypeAll,16 lldb.LLDB_INVALID_ADDRESS_MASK,17 lldb.eAddressMaskRangeAll,18 )19 self.runCmd("settings set target.process.virtual-addressable-bits 0")20 self.runCmd("settings set target.process.highmem-virtual-addressable-bits 0")21 22 @skipIf(archs=["arm$"]) # 32-bit arm ABI hardcodes Code mask, is 32-bit23 def test_address_masks(self):24 self.build()25 (target, process, t, bp) = lldbutil.run_to_source_breakpoint(26 self, "break here", lldb.SBFileSpec("main.c")27 )28 29 process.SetAddressableBits(lldb.eAddressMaskTypeAll, 42)30 self.assertEqual(0x0000029500003F94, process.FixAddress(0x00265E9500003F94))31 self.reset_all_masks(process)32 33 # ~((1ULL<<42)-1) == 0xfffffc000000000034 process.SetAddressMask(lldb.eAddressMaskTypeAll, 0xFFFFFC0000000000)35 self.assertEqual(0x0000029500003F94, process.FixAddress(0x00265E9500003F94))36 self.reset_all_masks(process)37 38 # Check that all bits can pass through unmodified39 process.SetAddressableBits(lldb.eAddressMaskTypeAll, 64)40 self.assertEqual(0x00265E9500003F94, process.FixAddress(0x00265E9500003F94))41 self.reset_all_masks(process)42 43 process.SetAddressableBits(44 lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeAll45 )46 self.assertEqual(0x000002950001F694, process.FixAddress(0x00265E950001F694))47 self.assertEqual(0xFFFFFE950000F694, process.FixAddress(0xFFA65E950000F694))48 self.reset_all_masks(process)49 50 # Set a eAddressMaskTypeCode which has the low 3 bits marked as non-address51 # bits, confirm that they're cleared by FixAddress.52 process.SetAddressableBits(53 lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeAll54 )55 mask = process.GetAddressMask(lldb.eAddressMaskTypeAny)56 process.SetAddressMask(lldb.eAddressMaskTypeCode, mask | 0x3)57 self.assertEqual(0x000002950001F697, process.FixAddress(0x00265E950001F697))58 self.assertEqual(0xFFFFFE950000F697, process.FixAddress(0xFFA65E950000F697))59 self.assertEqual(60 0x000002950001F697,61 process.FixAddress(0x00265E950001F697, lldb.eAddressMaskTypeData),62 )63 self.assertEqual(64 0x000002950001F694,65 process.FixAddress(0x00265E950001F697, lldb.eAddressMaskTypeCode),66 )67 self.reset_all_masks(process)68 69 # The user can override whatever settings the Process thinks should be used.70 process.SetAddressableBits(71 lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeLow72 )73 self.runCmd("settings set target.process.virtual-addressable-bits 15")74 self.assertEqual(0x0000000000007694, process.FixAddress(0x00265E950001F694))75 self.assertEqual(0xFFFFFFFFFFFFF694, process.FixAddress(0xFFA65E950000F694))76 self.runCmd("settings set target.process.virtual-addressable-bits 0")77 self.assertEqual(0x000002950001F694, process.FixAddress(0x00265E950001F694))78 self.reset_all_masks(process)79 80 # AArch64 can have different address masks for high and low memory, when different81 # page tables are set up.82 @skipIf(archs=no_match(["arm64", "arm64e", "aarch64"]))83 @skipIf(archs=["arm$"]) # 32-bit arm ABI hardcodes Code mask, is 32-bit84 def test_address_masks_target_supports_highmem_tests(self):85 self.build()86 (target, process, t, bp) = lldbutil.run_to_source_breakpoint(87 self, "break here", lldb.SBFileSpec("main.c")88 )89 90 process.SetAddressableBits(91 lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeLow92 )93 process.SetAddressableBits(94 lldb.eAddressMaskTypeAll, 15, lldb.eAddressMaskRangeHigh95 )96 self.assertEqual(0x000002950001F694, process.FixAddress(0x00265E950001F694))97 self.assertEqual(0xFFFFFFFFFFFFF694, process.FixAddress(0xFFA65E950000F694))98 self.reset_all_masks(process)99 100 # The user can override whatever settings the Process thinks should be used.101 process.SetAddressableBits(102 lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeAll103 )104 self.runCmd("settings set target.process.virtual-addressable-bits 15")105 self.runCmd("settings set target.process.highmem-virtual-addressable-bits 15")106 self.assertEqual(0x0000000000007694, process.FixAddress(0x00265E950001F694))107 self.assertEqual(0xFFFFFFFFFFFFF694, process.FixAddress(0xFFA65E950000F694))108 self.runCmd("settings set target.process.virtual-addressable-bits 0")109 self.runCmd("settings set target.process.highmem-virtual-addressable-bits 0")110 self.assertEqual(0x000002950001F694, process.FixAddress(0x00265E950001F694))111 self.reset_all_masks(process)112 113 # On most targets where we have a single mask for all address range, confirm114 # that the high memory masks are ignored.115 @skipIf(archs=["arm64", "arm64e", "aarch64"])116 @skipIf(archs=["arm$"]) # 32-bit arm ABI hardcodes Code mask, is 32-bit117 def test_address_masks_target_no_highmem(self):118 self.build()119 (target, process, t, bp) = lldbutil.run_to_source_breakpoint(120 self, "break here", lldb.SBFileSpec("main.c")121 )122 123 process.SetAddressableBits(124 lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeLow125 )126 process.SetAddressableBits(127 lldb.eAddressMaskTypeAll, 15, lldb.eAddressMaskRangeHigh128 )129 self.assertEqual(0x000002950001F694, process.FixAddress(0x00265E950001F694))130 self.assertEqual(0xFFFFFE950000F694, process.FixAddress(0xFFA65E950000F694))131 self.runCmd("settings set target.process.virtual-addressable-bits 15")132 self.runCmd("settings set target.process.highmem-virtual-addressable-bits 42")133 self.assertEqual(0x0000000000007694, process.FixAddress(0x00265E950001F694))134 self.assertEqual(0xFFFFFFFFFFFFF694, process.FixAddress(0xFFA65E950000F694))135