xref: /llvm-project/lldb/test/API/python_api/process/address-masks/TestAddressMasks.py (revision 04bbbba271ebe4c2421f34a4fbf34c328df9f111)
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