brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.3 KiB · f917f35 Raw
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