| """Test Python APIs for setting, getting, and using address masks.""" | |
| import os | |
| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test import lldbutil | |
| class AddressMasksTestCase(TestBase): | |
| NO_DEBUG_INFO_TESTCASE = True | |
| def reset_all_masks(self, process): | |
| process.SetAddressMask( | |
| lldb.eAddressMaskTypeAll, | |
| lldb.LLDB_INVALID_ADDRESS_MASK, | |
| lldb.eAddressMaskRangeAll, | |
| ) | |
| self.runCmd("settings set target.process.virtual-addressable-bits 0") | |
| self.runCmd("settings set target.process.highmem-virtual-addressable-bits 0") | |
| @skipIf(archs=["arm$"]) # 32-bit arm ABI hardcodes Code mask, is 32-bit | |
| def test_address_masks(self): | |
| self.build() | |
| (target, process, t, bp) = lldbutil.run_to_source_breakpoint( | |
| self, "break here", lldb.SBFileSpec("main.c") | |
| ) | |
| process.SetAddressableBits(lldb.eAddressMaskTypeAll, 42) | |
| self.assertEqual(0x0000029500003F94, process.FixAddress(0x00265E9500003F94)) | |
| self.reset_all_masks(process) | |
| # ~((1ULL<<42)-1) == 0xfffffc0000000000 | |
| process.SetAddressMask(lldb.eAddressMaskTypeAll, 0xFFFFFC0000000000) | |
| self.assertEqual(0x0000029500003F94, process.FixAddress(0x00265E9500003F94)) | |
| self.reset_all_masks(process) | |
| # Check that all bits can pass through unmodified | |
| process.SetAddressableBits(lldb.eAddressMaskTypeAll, 64) | |
| self.assertEqual(0x00265E9500003F94, process.FixAddress(0x00265E9500003F94)) | |
| self.reset_all_masks(process) | |
| process.SetAddressableBits( | |
| lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeAll | |
| ) | |
| self.assertEqual(0x000002950001F694, process.FixAddress(0x00265E950001F694)) | |
| self.assertEqual(0xFFFFFE950000F694, process.FixAddress(0xFFA65E950000F694)) | |
| self.reset_all_masks(process) | |
| # Set a eAddressMaskTypeCode which has the low 3 bits marked as non-address | |
| # bits, confirm that they're cleared by FixAddress. | |
| process.SetAddressableBits( | |
| lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeAll | |
| ) | |
| mask = process.GetAddressMask(lldb.eAddressMaskTypeAny) | |
| process.SetAddressMask(lldb.eAddressMaskTypeCode, mask | 0x3) | |
| self.assertEqual(0x000002950001F697, process.FixAddress(0x00265E950001F697)) | |
| self.assertEqual(0xFFFFFE950000F697, process.FixAddress(0xFFA65E950000F697)) | |
| self.assertEqual( | |
| 0x000002950001F697, | |
| process.FixAddress(0x00265E950001F697, lldb.eAddressMaskTypeData), | |
| ) | |
| self.assertEqual( | |
| 0x000002950001F694, | |
| process.FixAddress(0x00265E950001F697, lldb.eAddressMaskTypeCode), | |
| ) | |
| self.reset_all_masks(process) | |
| # The user can override whatever settings the Process thinks should be used. | |
| process.SetAddressableBits( | |
| lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeLow | |
| ) | |
| self.runCmd("settings set target.process.virtual-addressable-bits 15") | |
| self.assertEqual(0x0000000000007694, process.FixAddress(0x00265E950001F694)) | |
| self.assertEqual(0xFFFFFFFFFFFFF694, process.FixAddress(0xFFA65E950000F694)) | |
| self.runCmd("settings set target.process.virtual-addressable-bits 0") | |
| self.assertEqual(0x000002950001F694, process.FixAddress(0x00265E950001F694)) | |
| self.reset_all_masks(process) | |
| # AArch64 can have different address masks for high and low memory, when different | |
| # page tables are set up. | |
| @skipIf(archs=no_match(["arm64", "arm64e", "aarch64"])) | |
| @skipIf(archs=["arm$"]) # 32-bit arm ABI hardcodes Code mask, is 32-bit | |
| def test_address_masks_target_supports_highmem_tests(self): | |
| self.build() | |
| (target, process, t, bp) = lldbutil.run_to_source_breakpoint( | |
| self, "break here", lldb.SBFileSpec("main.c") | |
| ) | |
| process.SetAddressableBits( | |
| lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeLow | |
| ) | |
| process.SetAddressableBits( | |
| lldb.eAddressMaskTypeAll, 15, lldb.eAddressMaskRangeHigh | |
| ) | |
| self.assertEqual(0x000002950001F694, process.FixAddress(0x00265E950001F694)) | |
| self.assertEqual(0xFFFFFFFFFFFFF694, process.FixAddress(0xFFA65E950000F694)) | |
| self.reset_all_masks(process) | |
| # The user can override whatever settings the Process thinks should be used. | |
| process.SetAddressableBits( | |
| lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeAll | |
| ) | |
| self.runCmd("settings set target.process.virtual-addressable-bits 15") | |
| self.runCmd("settings set target.process.highmem-virtual-addressable-bits 15") | |
| self.assertEqual(0x0000000000007694, process.FixAddress(0x00265E950001F694)) | |
| self.assertEqual(0xFFFFFFFFFFFFF694, process.FixAddress(0xFFA65E950000F694)) | |
| self.runCmd("settings set target.process.virtual-addressable-bits 0") | |
| self.runCmd("settings set target.process.highmem-virtual-addressable-bits 0") | |
| self.assertEqual(0x000002950001F694, process.FixAddress(0x00265E950001F694)) | |
| self.reset_all_masks(process) | |
| # On most targets where we have a single mask for all address range, confirm | |
| # that the high memory masks are ignored. | |
| @skipIf(archs=["arm64", "arm64e", "aarch64"]) | |
| @skipIf(archs=["arm$"]) # 32-bit arm ABI hardcodes Code mask, is 32-bit | |
| def test_address_masks_target_no_highmem(self): | |
| self.build() | |
| (target, process, t, bp) = lldbutil.run_to_source_breakpoint( | |
| self, "break here", lldb.SBFileSpec("main.c") | |
| ) | |
| process.SetAddressableBits( | |
| lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeLow | |
| ) | |
| process.SetAddressableBits( | |
| lldb.eAddressMaskTypeAll, 15, lldb.eAddressMaskRangeHigh | |
| ) | |
| self.assertEqual(0x000002950001F694, process.FixAddress(0x00265E950001F694)) | |
| self.assertEqual(0xFFFFFE950000F694, process.FixAddress(0xFFA65E950000F694)) | |
| self.runCmd("settings set target.process.virtual-addressable-bits 15") | |
| self.runCmd("settings set target.process.highmem-virtual-addressable-bits 42") | |
| self.assertEqual(0x0000000000007694, process.FixAddress(0x00265E950001F694)) | |
| self.assertEqual(0xFFFFFFFFFFFFF694, process.FixAddress(0xFFA65E950000F694)) |