1ee65728eSMike Rapoport.. SPDX-License-Identifier: GPL-2.0
2ee65728eSMike Rapoport
3ee65728eSMike Rapoport===============================
4ee65728eSMike RapoportArchitecture Page Table Helpers
5ee65728eSMike Rapoport===============================
6ee65728eSMike Rapoport
7ee65728eSMike RapoportGeneric MM expects architectures (with MMU) to provide helpers to create, access
8ee65728eSMike Rapoportand modify page table entries at various level for different memory functions.
9ee65728eSMike RapoportThese page table helpers need to conform to a common semantics across platforms.
10ee65728eSMike RapoportFollowing tables describe the expected semantics which can also be tested during
11ee65728eSMike Rapoportboot via CONFIG_DEBUG_VM_PGTABLE option. All future changes in here or the debug
12ee65728eSMike Rapoporttest need to be in sync.
13ee65728eSMike Rapoport
14ee65728eSMike Rapoport
15ee65728eSMike RapoportPTE Page Table Helpers
16ee65728eSMike Rapoport======================
17ee65728eSMike Rapoport
18ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
19ee65728eSMike Rapoport| pte_same                  | Tests whether both PTE entries are the same      |
20ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
21ee65728eSMike Rapoport| pte_bad                   | Tests a non-table mapped PTE                     |
22ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
23ee65728eSMike Rapoport| pte_present               | Tests a valid mapped PTE                         |
24ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
25ee65728eSMike Rapoport| pte_young                 | Tests a young PTE                                |
26ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
27ee65728eSMike Rapoport| pte_dirty                 | Tests a dirty PTE                                |
28ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
29ee65728eSMike Rapoport| pte_write                 | Tests a writable PTE                             |
30ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
31ee65728eSMike Rapoport| pte_special               | Tests a special PTE                              |
32ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
33ee65728eSMike Rapoport| pte_protnone              | Tests a PROT_NONE PTE                            |
34ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
35ee65728eSMike Rapoport| pte_devmap                | Tests a ZONE_DEVICE mapped PTE                   |
36ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
37ee65728eSMike Rapoport| pte_soft_dirty            | Tests a soft dirty PTE                           |
38ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
39ee65728eSMike Rapoport| pte_swp_soft_dirty        | Tests a soft dirty swapped PTE                   |
40ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
41ee65728eSMike Rapoport| pte_mkyoung               | Creates a young PTE                              |
42ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
43ee65728eSMike Rapoport| pte_mkold                 | Creates an old PTE                               |
44ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
45ee65728eSMike Rapoport| pte_mkdirty               | Creates a dirty PTE                              |
46ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
47ee65728eSMike Rapoport| pte_mkclean               | Creates a clean PTE                              |
48ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
49*161e393cSRick Edgecombe| pte_mkwrite               | Creates a writable PTE of the type specified by  |
50*161e393cSRick Edgecombe|                           | the VMA.                                         |
51ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
522f0584f3SRick Edgecombe| pte_mkwrite_novma         | Creates a writable PTE, of the conventional type |
532f0584f3SRick Edgecombe|                           | of writable.                                     |
542f0584f3SRick Edgecombe+---------------------------+--------------------------------------------------+
55ee65728eSMike Rapoport| pte_wrprotect             | Creates a write protected PTE                    |
56ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
57ee65728eSMike Rapoport| pte_mkspecial             | Creates a special PTE                            |
58ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
59ee65728eSMike Rapoport| pte_mkdevmap              | Creates a ZONE_DEVICE mapped PTE                 |
60ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
61ee65728eSMike Rapoport| pte_mksoft_dirty          | Creates a soft dirty PTE                         |
62ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
63ee65728eSMike Rapoport| pte_clear_soft_dirty      | Clears a soft dirty PTE                          |
64ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
65ee65728eSMike Rapoport| pte_swp_mksoft_dirty      | Creates a soft dirty swapped PTE                 |
66ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
67ee65728eSMike Rapoport| pte_swp_clear_soft_dirty  | Clears a soft dirty swapped PTE                  |
68ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
69ee65728eSMike Rapoport| pte_mknotpresent          | Invalidates a mapped PTE                         |
70ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
71ee65728eSMike Rapoport| ptep_clear                | Clears a PTE                                     |
72ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
73ee65728eSMike Rapoport| ptep_get_and_clear        | Clears and returns PTE                           |
74ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
75ee65728eSMike Rapoport| ptep_get_and_clear_full   | Clears and returns PTE (batched PTE unmap)       |
76ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
77ee65728eSMike Rapoport| ptep_test_and_clear_young | Clears young from a PTE                          |
78ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
79ee65728eSMike Rapoport| ptep_set_wrprotect        | Converts into a write protected PTE              |
80ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
81ee65728eSMike Rapoport| ptep_set_access_flags     | Converts into a more permissive PTE              |
82ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
83ee65728eSMike Rapoport
84ee65728eSMike Rapoport
85ee65728eSMike RapoportPMD Page Table Helpers
86ee65728eSMike Rapoport======================
87ee65728eSMike Rapoport
88ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
89ee65728eSMike Rapoport| pmd_same                  | Tests whether both PMD entries are the same      |
90ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
91ee65728eSMike Rapoport| pmd_bad                   | Tests a non-table mapped PMD                     |
92ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
93ee65728eSMike Rapoport| pmd_leaf                  | Tests a leaf mapped PMD                          |
94ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
95ee65728eSMike Rapoport| pmd_huge                  | Tests a HugeTLB mapped PMD                       |
96ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
97ee65728eSMike Rapoport| pmd_trans_huge            | Tests a Transparent Huge Page (THP) at PMD       |
98ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
997ce5f7e1SAnshuman Khandual| pmd_present               | Tests whether pmd_page() points to valid memory  |
100ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
101ee65728eSMike Rapoport| pmd_young                 | Tests a young PMD                                |
102ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
103ee65728eSMike Rapoport| pmd_dirty                 | Tests a dirty PMD                                |
104ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
105ee65728eSMike Rapoport| pmd_write                 | Tests a writable PMD                             |
106ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
107ee65728eSMike Rapoport| pmd_special               | Tests a special PMD                              |
108ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
109ee65728eSMike Rapoport| pmd_protnone              | Tests a PROT_NONE PMD                            |
110ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
111ee65728eSMike Rapoport| pmd_devmap                | Tests a ZONE_DEVICE mapped PMD                   |
112ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
113ee65728eSMike Rapoport| pmd_soft_dirty            | Tests a soft dirty PMD                           |
114ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
115ee65728eSMike Rapoport| pmd_swp_soft_dirty        | Tests a soft dirty swapped PMD                   |
116ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
117ee65728eSMike Rapoport| pmd_mkyoung               | Creates a young PMD                              |
118ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
119ee65728eSMike Rapoport| pmd_mkold                 | Creates an old PMD                               |
120ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
121ee65728eSMike Rapoport| pmd_mkdirty               | Creates a dirty PMD                              |
122ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
123ee65728eSMike Rapoport| pmd_mkclean               | Creates a clean PMD                              |
124ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
125*161e393cSRick Edgecombe| pmd_mkwrite               | Creates a writable PMD of the type specified by  |
126*161e393cSRick Edgecombe|                           | the VMA.                                         |
127ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
1282f0584f3SRick Edgecombe| pmd_mkwrite_novma         | Creates a writable PMD, of the conventional type |
1292f0584f3SRick Edgecombe|                           | of writable.                                     |
1302f0584f3SRick Edgecombe+---------------------------+--------------------------------------------------+
131ee65728eSMike Rapoport| pmd_wrprotect             | Creates a write protected PMD                    |
132ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
133ee65728eSMike Rapoport| pmd_mkspecial             | Creates a special PMD                            |
134ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
135ee65728eSMike Rapoport| pmd_mkdevmap              | Creates a ZONE_DEVICE mapped PMD                 |
136ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
137ee65728eSMike Rapoport| pmd_mksoft_dirty          | Creates a soft dirty PMD                         |
138ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
139ee65728eSMike Rapoport| pmd_clear_soft_dirty      | Clears a soft dirty PMD                          |
140ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
141ee65728eSMike Rapoport| pmd_swp_mksoft_dirty      | Creates a soft dirty swapped PMD                 |
142ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
143ee65728eSMike Rapoport| pmd_swp_clear_soft_dirty  | Clears a soft dirty swapped PMD                  |
144ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
145ee65728eSMike Rapoport| pmd_mkinvalid             | Invalidates a mapped PMD [1]                     |
146ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
147ee65728eSMike Rapoport| pmd_set_huge              | Creates a PMD huge mapping                       |
148ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
149ee65728eSMike Rapoport| pmd_clear_huge            | Clears a PMD huge mapping                        |
150ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
151ee65728eSMike Rapoport| pmdp_get_and_clear        | Clears a PMD                                     |
152ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
153ee65728eSMike Rapoport| pmdp_get_and_clear_full   | Clears a PMD                                     |
154ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
155ee65728eSMike Rapoport| pmdp_test_and_clear_young | Clears young from a PMD                          |
156ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
157ee65728eSMike Rapoport| pmdp_set_wrprotect        | Converts into a write protected PMD              |
158ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
159ee65728eSMike Rapoport| pmdp_set_access_flags     | Converts into a more permissive PMD              |
160ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
161ee65728eSMike Rapoport
162ee65728eSMike Rapoport
163ee65728eSMike RapoportPUD Page Table Helpers
164ee65728eSMike Rapoport======================
165ee65728eSMike Rapoport
166ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
167ee65728eSMike Rapoport| pud_same                  | Tests whether both PUD entries are the same      |
168ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
169ee65728eSMike Rapoport| pud_bad                   | Tests a non-table mapped PUD                     |
170ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
171ee65728eSMike Rapoport| pud_leaf                  | Tests a leaf mapped PUD                          |
172ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
173ee65728eSMike Rapoport| pud_huge                  | Tests a HugeTLB mapped PUD                       |
174ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
175ee65728eSMike Rapoport| pud_trans_huge            | Tests a Transparent Huge Page (THP) at PUD       |
176ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
177ee65728eSMike Rapoport| pud_present               | Tests a valid mapped PUD                         |
178ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
179ee65728eSMike Rapoport| pud_young                 | Tests a young PUD                                |
180ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
181ee65728eSMike Rapoport| pud_dirty                 | Tests a dirty PUD                                |
182ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
183ee65728eSMike Rapoport| pud_write                 | Tests a writable PUD                             |
184ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
185ee65728eSMike Rapoport| pud_devmap                | Tests a ZONE_DEVICE mapped PUD                   |
186ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
187ee65728eSMike Rapoport| pud_mkyoung               | Creates a young PUD                              |
188ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
189ee65728eSMike Rapoport| pud_mkold                 | Creates an old PUD                               |
190ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
191ee65728eSMike Rapoport| pud_mkdirty               | Creates a dirty PUD                              |
192ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
193ee65728eSMike Rapoport| pud_mkclean               | Creates a clean PUD                              |
194ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
195ee65728eSMike Rapoport| pud_mkwrite               | Creates a writable PUD                           |
196ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
197ee65728eSMike Rapoport| pud_wrprotect             | Creates a write protected PUD                    |
198ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
199ee65728eSMike Rapoport| pud_mkdevmap              | Creates a ZONE_DEVICE mapped PUD                 |
200ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
201ee65728eSMike Rapoport| pud_mkinvalid             | Invalidates a mapped PUD [1]                     |
202ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
203ee65728eSMike Rapoport| pud_set_huge              | Creates a PUD huge mapping                       |
204ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
205ee65728eSMike Rapoport| pud_clear_huge            | Clears a PUD huge mapping                        |
206ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
207ee65728eSMike Rapoport| pudp_get_and_clear        | Clears a PUD                                     |
208ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
209ee65728eSMike Rapoport| pudp_get_and_clear_full   | Clears a PUD                                     |
210ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
211ee65728eSMike Rapoport| pudp_test_and_clear_young | Clears young from a PUD                          |
212ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
213ee65728eSMike Rapoport| pudp_set_wrprotect        | Converts into a write protected PUD              |
214ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
215ee65728eSMike Rapoport| pudp_set_access_flags     | Converts into a more permissive PUD              |
216ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
217ee65728eSMike Rapoport
218ee65728eSMike Rapoport
219ee65728eSMike RapoportHugeTLB Page Table Helpers
220ee65728eSMike Rapoport==========================
221ee65728eSMike Rapoport
222ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
223ee65728eSMike Rapoport| pte_huge                  | Tests a HugeTLB                                  |
224ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
2259dabf6e1SAnshuman Khandual| arch_make_huge_pte        | Creates a HugeTLB                                |
226ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
227ee65728eSMike Rapoport| huge_pte_dirty            | Tests a dirty HugeTLB                            |
228ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
229ee65728eSMike Rapoport| huge_pte_write            | Tests a writable HugeTLB                         |
230ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
231ee65728eSMike Rapoport| huge_pte_mkdirty          | Creates a dirty HugeTLB                          |
232ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
233ee65728eSMike Rapoport| huge_pte_mkwrite          | Creates a writable HugeTLB                       |
234ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
235ee65728eSMike Rapoport| huge_pte_wrprotect        | Creates a write protected HugeTLB                |
236ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
237ee65728eSMike Rapoport| huge_ptep_get_and_clear   | Clears a HugeTLB                                 |
238ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
239ee65728eSMike Rapoport| huge_ptep_set_wrprotect   | Converts into a write protected HugeTLB          |
240ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
241ee65728eSMike Rapoport| huge_ptep_set_access_flags  | Converts into a more permissive HugeTLB        |
242ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
243ee65728eSMike Rapoport
244ee65728eSMike Rapoport
245ee65728eSMike RapoportSWAP Page Table Helpers
246ee65728eSMike Rapoport========================
247ee65728eSMike Rapoport
248ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
249ee65728eSMike Rapoport| __pte_to_swp_entry        | Creates a swapped entry (arch) from a mapped PTE |
250ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
251ee65728eSMike Rapoport| __swp_to_pte_entry        | Creates a mapped PTE from a swapped entry (arch) |
252ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
253ee65728eSMike Rapoport| __pmd_to_swp_entry        | Creates a swapped entry (arch) from a mapped PMD |
254ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
255ee65728eSMike Rapoport| __swp_to_pmd_entry        | Creates a mapped PMD from a swapped entry (arch) |
256ee65728eSMike Rapoport+---------------------------+--------------------------------------------------+
257ee65728eSMike Rapoport| is_migration_entry        | Tests a migration (read or write) swapped entry  |
258ee65728eSMike Rapoport+-------------------------------+----------------------------------------------+
259ee65728eSMike Rapoport| is_writable_migration_entry   | Tests a write migration swapped entry        |
260ee65728eSMike Rapoport+-------------------------------+----------------------------------------------+
261ee65728eSMike Rapoport| make_readable_migration_entry | Creates a read migration swapped entry       |
262ee65728eSMike Rapoport+-------------------------------+----------------------------------------------+
263ee65728eSMike Rapoport| make_writable_migration_entry | Creates a write migration swapped entry      |
264ee65728eSMike Rapoport+-------------------------------+----------------------------------------------+
265ee65728eSMike Rapoport
266ee65728eSMike Rapoport[1] https://lore.kernel.org/linux-mm/20181017020930.GN30832@redhat.com/
267