1"""Test Python APIs for setting, getting, and using address masks.""" 2 3import os 4import lldb 5from lldbsuite.test.decorators import * 6from lldbsuite.test.lldbtest import * 7from lldbsuite.test import lldbutil 8 9 10class AddressMasksTestCase(TestBase): 11 NO_DEBUG_INFO_TESTCASE = True 12 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-bit 23 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) == 0xfffffc0000000000 34 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 unmodified 39 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.eAddressMaskRangeAll 45 ) 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-address 51 # bits, confirm that they're cleared by FixAddress. 52 process.SetAddressableBits( 53 lldb.eAddressMaskTypeAll, 42, lldb.eAddressMaskRangeAll 54 ) 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.eAddressMaskRangeLow 72 ) 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 different 81 # 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-bit 84 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.eAddressMaskRangeLow 92 ) 93 process.SetAddressableBits( 94 lldb.eAddressMaskTypeAll, 15, lldb.eAddressMaskRangeHigh 95 ) 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.eAddressMaskRangeAll 103 ) 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, confirm 114 # 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-bit 117 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.eAddressMaskRangeLow 125 ) 126 process.SetAddressableBits( 127 lldb.eAddressMaskTypeAll, 15, lldb.eAddressMaskRangeHigh 128 ) 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