x86: pmap boot lowmem unmapping
[akaros.git] / kern / arch / x86 / pmap64.c
1 /* Copyright (c) 2013 The Regents of the University of California
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * 64 bit virtual memory / address space management (and a touch of pmem).
6  *
7  * TODO:
8  * - better testing: check my helper funcs, a variety of inserts/segments remove
9  * it all, etc (esp with jumbos).  check permissions and the existence of
10  * mappings.
11  * - mapping segments doesn't support having a PTE already present
12  * - mtrrs break big machines
13  * - jumbo pages are only supported at the VM layer, not PM (a jumbo is 2^9
14  * little pages, for example)
15  * - usermemwalk and freeing might need some help (in higher layers of the
16  * kernel). */
17
18 #include <arch/x86.h>
19 #include <arch/arch.h>
20 #include <arch/mmu.h>
21 #include <arch/apic.h>
22 #include <error.h>
23 #include <sys/queue.h>
24 #include <atomic.h>
25 #include <string.h>
26 #include <assert.h>
27 #include <pmap.h>
28 #include <kclock.h>
29 #include <env.h>
30 #include <stdio.h>
31 #include <kmalloc.h>
32 #include <page_alloc.h>
33
34 extern char boot_pml4[], gdt64[], gdt64desc[];
35 pde_t *boot_pgdir;
36 physaddr_t boot_cr3;
37 segdesc_t *gdt;
38 pseudodesc_t gdt_pd;
39
40 #define PG_WALK_SHIFT_MASK              0x00ff          /* first byte = target shift */
41 #define PG_WALK_CREATE                  0x0100
42
43 pte_t *pml_walk(pte_t *pml, uintptr_t va, int flags);
44 void map_segment(pde_t *pgdir, uintptr_t va, size_t size, physaddr_t pa,
45                  int perm, int pml_shift);
46 typedef int (*pte_cb_t)(pte_t *pte, uintptr_t kva, int pml_shift,
47                         bool visited_subs, void *arg);
48 int pml_for_each(pte_t *pml, uintptr_t start, size_t len, pte_cb_t callback,
49                  void *arg);
50 int unmap_segment(pde_t *pgdir, uintptr_t va, size_t size);
51
52 /* Helper: returns true if we do not need to walk the page table any further.
53  *
54  * The caller may or may not know if a jumbo is desired.  pml_shift determines
55  * which layer we are at in the page walk, and flags contains the target level
56  * we're looking for, like a jumbo or a default.
57  *
58  * Regardless of the desired target, if we find a jumbo page, we're also done.
59  */
60 static bool walk_is_complete(pte_t *pte, int pml_shift, int flags)
61 {
62         if ((pml_shift == (flags & PG_WALK_SHIFT_MASK)) || (*pte & PTE_PS))
63                 return TRUE;
64         return FALSE;
65 }
66
67 /* PTE_ADDR should only be used on a PTE that has a physical address of the next
68  * PML inside.  i.e., not a final PTE in the page table walk. */
69 static pte_t *pte2pml(pte_t pte)
70 {
71         return (pte_t*)KADDR(PTE_ADDR(pte));
72 }
73
74 static pte_t *__pml_walk(pte_t *pml, uintptr_t va, int flags, int pml_shift)
75 {
76         pte_t *pte;
77         void *new_pml_kva;
78
79         pte = &pml[PMLx(va, pml_shift)];
80         if (walk_is_complete(pte, pml_shift, flags))
81                 return pte;
82         if (!(*pte & PTE_P)) {
83                 if (!(flags & PG_WALK_CREATE))
84                         return NULL;
85                 new_pml_kva = kpage_zalloc_addr();
86                 /* Might want better error handling (we're probably out of memory) */
87                 if (!new_pml_kva)
88                         return NULL;
89                 /* We insert the new PT into the PML with U and W perms.  Permissions on
90                  * page table walks are anded together (if any of them are !User, the
91                  * translation is !User).  We put the perms on the last entry, not the
92                  * intermediates. */
93                 *pte = PADDR(new_pml_kva) | PTE_P | PTE_U | PTE_W;
94         }
95         return __pml_walk(pte2pml(*pte), va, flags, pml_shift - BITS_PER_PML);
96 }
97
98 /* Returns a pointer to the page table entry corresponding to va.  Flags has
99  * some options and selects which level of the page table we're happy with
100  * stopping at.  Normally, this is PML1 for a normal page (e.g. flags =
101  * PML1_SHIFT), but could be for a jumbo page (PML3 or PML2 entry).
102  *
103  * Flags also controls whether or not intermediate page tables are created or
104  * not.  This is useful for when we are checking whether or not a mapping
105  * exists, but aren't interested in creating intermediate tables that will not
106  * get filled.  When we want to create intermediate pages (i.e. we're looking
107  * for the PTE to insert a page), pass in PG_WALK_CREATE with flags.
108  *
109  * Returns 0 on error or absence of a PTE for va. */
110 pte_t *pml_walk(pte_t *pml, uintptr_t va, int flags)
111 {
112         return __pml_walk(pml, va, flags, PML4_SHIFT);
113 }
114
115 /* Helper: determines how much va needs to be advanced until it is aligned to
116  * pml_shift. */
117 static uintptr_t amt_til_aligned(uintptr_t va, int pml_shift)
118 {
119         /* find the lower bits of va, subtract them from the shift to see what we
120          * would need to add to get to the shift.  va might be aligned already, and
121          * we subtracted 0, so we mask off the top part again. */
122         return ((1UL << pml_shift) - (va & ((1UL << pml_shift) - 1))) &
123                ((1UL << pml_shift) - 1);
124 }
125
126 /* Helper: determines how much of size we can take, in chunks of pml_shift */
127 static uintptr_t amt_of_aligned_bytes(uintptr_t size, int pml_shift)
128 {
129         /* creates a mask all 1s from MSB down to (including) shift */
130         return (~((1UL << pml_shift) - 1)) & size;
131 }
132
133 /* Helper: Advance pte, given old_pte.  Will do pml walks when necessary. */
134 static pte_t *get_next_pte(pte_t *old_pte, pte_t *pgdir, uintptr_t va,
135                            int flags)
136 {
137         /* PTEs (undereferenced) are addresses within page tables.  so long as we
138          * stay inside the PML, we can just advance via pointer arithmetic.  if we
139          * advance old_pte and it points to the beginning of a page (offset == 0),
140          * we've looped outside of our original PML, and need to get a new one. */
141         old_pte++;
142         if (!PGOFF(old_pte))
143                 return pml_walk(pgdir, va, flags);
144         return old_pte;
145 }
146
147 /* Helper: maps pages from va to pa for size bytes, all for a given page size */
148 static void map_my_pages(pte_t *pgdir, uintptr_t va, size_t size,
149                          physaddr_t pa, int perm, int pml_shift)
150 {
151         /* set to trigger a pml walk on the first get_next */
152         pte_t *pte = (pte_t*)PGSIZE - 1;
153         size_t pgsize = 1UL << pml_shift;
154
155         for (size_t i = 0; i < size; i += pgsize, va += pgsize,
156              pa += pgsize) {
157                 pte = get_next_pte(pte, pgdir, va, PG_WALK_CREATE | pml_shift);
158                 assert(pte);
159                 *pte = PTE_ADDR(pa) | PTE_P | perm |
160                        (pml_shift != PML1_SHIFT ? PTE_PS : 0);
161                 printd("Wrote *pte %p, for va %p to pa %p tried to cover %p\n",
162                        *pte, va, pa, amt_mapped);
163         }
164 }
165
166 /* Maps all pages possible from va->pa, up to size, preferring to use pages of
167  * type pml_shift (size == (1 << shift)).  Assumes that it is possible to map va
168  * to pa at the given shift. */
169 static uintptr_t __map_segment(pte_t *pgdir, uintptr_t va, size_t size,
170                                physaddr_t pa, int perm, int pml_shift)
171 {
172         printd("__map_segment, va %p, size %p, pa %p, shift %d\n", va, size,
173                pa, pml_shift);
174         uintptr_t amt_to_submap, amt_to_map, amt_mapped = 0;
175
176         amt_to_submap = amt_til_aligned(va, pml_shift);
177         amt_to_submap = MIN(amt_to_submap, size);
178         if (amt_to_submap) {
179                 amt_mapped = __map_segment(pgdir, va, amt_to_submap, pa, perm,
180                                            pml_shift - BITS_PER_PML);
181                 va += amt_mapped;
182                 pa += amt_mapped;
183                 size -= amt_mapped;
184         }
185         /* Now we're either aligned and ready to map, or size == 0 */
186         amt_to_map = amt_of_aligned_bytes(size, pml_shift);
187         if (amt_to_map) {
188                 map_my_pages(pgdir, va, amt_to_map, pa, perm, pml_shift);
189                 va += amt_to_map;
190                 pa += amt_to_map;
191                 size -= amt_to_map;
192                 amt_mapped += amt_to_map;
193         }
194         /* Map whatever is left over */
195         if (size)
196                 amt_mapped += __map_segment(pgdir, va, amt_to_submap, pa, perm,
197                                             pml_shift - BITS_PER_PML);
198         return amt_mapped;
199 }
200
201 /* Returns the maximum pml shift possible between a va->pa mapping.  It is the
202  * number of least-significant bits the two addresses have in common.  For
203  * instance, if the two pages are 0x456000 and 0x156000, this returns 20.  For
204  * regular pages, it will be at least 12 (every page ends in 0x000).
205  *
206  * The max pml shift possible for an va->pa mapping is determined by the
207  * least bit that differs between va and pa.
208  *
209  * We can optimize this a bit, since we know the first 12 bits are the same, and
210  * we won't go higher than max_pml_shift. */
211 static int max_possible_shift(uintptr_t va, uintptr_t pa)
212 {
213         int shift = 0;
214         if (va == pa)
215                 return sizeof(uintptr_t) * 8;
216         while ((va & 1) == (pa & 1)) {
217                 va >>= 1;
218                 pa >>= 1;
219                 shift++;
220         }
221         return shift;
222 }
223
224 /* Map [va, va+size) of virtual (linear) address space to physical [pa, pa+size)
225  * in the page table rooted at pgdir.  Size is a multiple of PGSIZE.  Use
226  * permission bits perm|PTE_P for the entries.  Set pml_shift to the shift of
227  * the largest page size you're willing to use.
228  *
229  * Doesn't handle having pages currently mapped yet, and while supporting that
230  * is relatively easy, doing an insertion of small pages into an existing jumbo
231  * would be trickier.  Might have the vmem region code deal with this.
232  *
233  * Don't use this to set the PAT flag on jumbo pages in perm, unless you are
234  * absolultely sure you won't map regular pages.  */
235 void map_segment(pde_t *pgdir, uintptr_t va, size_t size, physaddr_t pa,
236                  int perm, int pml_shift)
237 {
238         int max_shift_possible;
239         if (PGOFF(va) || PGOFF(pa) || PGOFF(size))
240                 panic("Asked to map with bad alignment.  va %p, pa %p, size %p\n", va,
241                       pa, size);
242         /* Given the max_page_size, try and use larger pages.  We'll figure out the
243          * largest possible jumbo page, up to whatever we were asked for. */
244         if (pml_shift != PGSHIFT) {
245                 max_shift_possible = max_possible_shift(va, pa);
246                 /* arch-specific limitation (can't have jumbos beyond PML3) */
247                 max_shift_possible = MIN(max_shift_possible, PML3_SHIFT);
248                 /* Assumes we were given a proper PML shift 12, 21, 30, etc */
249                 while (pml_shift > max_shift_possible)
250                         pml_shift -= BITS_PER_PML;
251         }
252         assert((pml_shift == PML1_SHIFT) ||
253                (pml_shift == PML2_SHIFT) ||
254                (pml_shift == PML3_SHIFT));
255         __map_segment(pgdir, va, size, pa, perm, pml_shift);
256 }
257
258 /* For every present PTE in [start, start + len), call callback(pte, shift,
259  * etc).  pml_shift is the shift/size of pml.
260  *
261  * This will recurse down into sub PMLs, and perform the CB in a
262  * depth-first-search.  The CB will be told which level of the paging it is at,
263  * via 'shift'.
264  *
265  * The CB will also run on intermediate PTEs: meaning, PTEs that point to page
266  * tables (and not (jumbo) pages) will be executed.  If the CB returns anything
267  * other than 0, we'll abort and propagate that back out from for_each. */
268 static int __pml_for_each(pte_t *pml,  uintptr_t start, size_t len,
269                           pte_cb_t callback, void *arg, int pml_shift)
270 {
271         int ret;
272         bool visited_all_subs;
273         pte_t *pte_s, *pte_e, *pte_i;
274         uintptr_t kva, pgsize = 1UL << pml_shift;
275
276         if (!len)
277                 return 0;
278         pte_s = &pml[PMLx(start, pml_shift)];
279         /* Later, we'll loop up to and including pte_e.  Since start + len might not
280          * be page aligned, we'll need to include the final pte.  If it is aligned,
281          * we don't want to visit, so we subtract one so that the aligned case maps
282          * to the index below it's normal pte. */
283         pte_e = &pml[PMLx(start + len - 1, pml_shift)];
284         /* tracks the virt addr pte_i works on, rounded for this PML */
285         kva = ROUNDDOWN(start, pgsize);
286         printd("PFE, start %p PMLx(S) %d, end-inc %p PMLx(E) %d shift %d, kva %p\n",
287                start, PMLx(start, pml_shift), start + len - 1,
288                PMLx(start + len - 1, pml_shift), pml_shift, kva);
289         for (pte_i = pte_s; pte_i <= pte_e; pte_i++, kva += pgsize) {
290                 if (!(*pte_i & PTE_P))
291                         continue;
292                 visited_all_subs = FALSE;
293                 /* Complete only on the last level (PML1_SHIFT) or on a jumbo */
294                 if (!walk_is_complete(pte_i, pml_shift, PML1_SHIFT)) {
295                         /* only pass truncated end points (e.g. start may not be page
296                          * aligned) when we're on the first (or last) item.  For the middle
297                          * entries, we want the subpmls to process the full range they are
298                          * responsible for: [kva, kva + pgsize). */
299                         uintptr_t sub_start = MAX(kva, start);
300                         size_t sub_len = MIN(start + len, kva + pgsize) - sub_start;
301                         ret = __pml_for_each(pte2pml(*pte_i), sub_start, sub_len, callback,
302                                              arg, pml_shift - BITS_PER_PML);
303                         if (ret)
304                                 return ret;
305                         /* based on sub_{start,end}, we can tell if our sub visited all of
306                          * its PTES. */
307                         if ((sub_start == kva) && (sub_len == pgsize))
308                                 visited_all_subs = TRUE;
309                 }
310                 if ((ret = callback(pte_i, kva, pml_shift, visited_all_subs, arg)))
311                         return ret;
312         }
313         return 0;
314 }
315
316 int pml_for_each(pte_t *pml, uintptr_t start, size_t len, pte_cb_t callback,
317                  void *arg)
318 {
319         return __pml_for_each(pml, start, len, callback, arg, PML4_SHIFT);
320 }
321
322 /* Unmaps [va, va + size) from pgdir, freeing any intermediate page tables.
323  * This does not free the actual memory pointed to by the page tables, nor does
324  * it flush the TLB. */
325 int unmap_segment(pde_t *pgdir, uintptr_t va, size_t size)
326 {
327         int pt_free_cb(pte_t *pte, uintptr_t kva, int shift, bool visited_subs,
328                        void *data)
329         {
330                 if ((shift == PML1_SHIFT) || (*pte * PTE_PS)) {
331                         *pte = 0;       /* helps with debugging */
332                         return 0;
333                 }
334                 /* If we haven't visited all of our subs, we might still have some
335                  * mappings hanging our this page table. */
336                 if (!visited_subs) {
337                         pte_t *pte_i = pte2pml(*pte);   /* first pte == pml */
338                         /* make sure we have no PTEs in use */
339                         for (int i = 0; i < NPTENTRIES; i++, pte_i++) {
340                                 if (*pte_i & PTE_P)
341                                         return 0;
342                         }
343                 }
344                 page_decref(ppn2page(LA2PPN(pte)));
345                 *pte = 0;
346                 return 0;
347         }
348
349         return pml_for_each(pgdir, va, size, pt_free_cb, 0);
350 }
351
352 /* Older interface for page table walks - will return the PTE corresponding to
353  * VA.  If create is 1, it'll create intermediate tables.  This can return jumbo
354  * PTEs, but only if they already exist.  Otherwise, (with create), it'll walk
355  * to the lowest PML.  If the walk fails due to a lack of intermediate tables or
356  * memory, this returns 0. */
357 pte_t *pgdir_walk(pde_t *pgdir, const void *va, int create)
358 {
359         int flags = PML1_SHIFT;
360         if (create == 1)
361                 flags |= PG_WALK_CREATE;
362         return pml_walk(pgdir, (uintptr_t)va, flags);
363 }
364
365 static int pml_perm_walk(pte_t *pml, const void *va, int pml_shift)
366 {
367         pte_t *pte;
368         int perms_here;
369
370         pte = &pml[PMLx(va, pml_shift)];
371         if (!(*pte & PTE_P))
372                 return 0;
373         perms_here = *pte & (PTE_PERM | PTE_P);
374         if (walk_is_complete(pte, pml_shift, PML1_SHIFT))
375                 return perms_here;
376         return pml_perm_walk(pte2pml(*pte), va, pml_shift - BITS_PER_PML) &
377                perms_here;
378 }
379
380 /* Returns the effective permissions for PTE_U, PTE_W, and PTE_P on a given
381  * virtual address.  Note we need to consider the composition of every PTE in
382  * the page table walk (we bit-and all of them together) */
383 int get_va_perms(pde_t *pgdir, const void *va)
384 {
385         return pml_perm_walk(pgdir, va, PML4_SHIFT);
386 }
387
388 #define check_sym_va(sym, addr)                                                \
389 ({                                                                             \
390         if ((sym) != (addr))                                                       \
391                 printk("Error: " #sym " is %p, should be " #addr "\n", sym);           \
392 })
393
394 static void check_syms_va(void)
395 {
396         /* Make sure our symbols are up to date (see arch/ros/mmu64.h) */
397         check_sym_va(KERN_LOAD_ADDR, 0xffffffffc0000000);
398         check_sym_va(LAPIC_BASE,     0xffffffffbffff000);
399         check_sym_va(IOAPIC_BASE,    0xffffffffbfffe000);
400         check_sym_va(VPT_TOP,        0xffffff0000000000);
401         check_sym_va(VPT,            0xfffffe8000000000);
402         check_sym_va(KERN_VMAP_TOP,  0xfffffe8000000000);
403         check_sym_va(KERNBASE,       0xffff800000000000);
404         check_sym_va(ULIM,           0x0000800000000000);
405         check_sym_va(UVPT,           0x00007f8000000000);
406         check_sym_va(UINFO,          0x00007f7fffe00000);
407         check_sym_va(UWLIM,          0x00007f7fffe00000);
408         check_sym_va(UDATA,          0x00007f7fffc00000);
409         check_sym_va(UGDATA,         0x00007f7fffbff000);
410         check_sym_va(UMAPTOP,        0x00007f7fffbff000);
411         check_sym_va(USTACKTOP,      0x00007f7fffbff000);
412         check_sym_va(BRK_END,        0x0000400000000000);
413 }
414
415 /* Initializes anything related to virtual memory.  Paging is already on, but we
416  * have a slimmed down page table. */
417 void vm_init(void)
418 {
419         boot_cr3 = (physaddr_t)boot_pml4;
420         boot_pgdir = KADDR((uintptr_t)boot_pml4);
421         gdt = KADDR((uintptr_t)gdt64);
422
423         check_syms_va();
424         /* KERNBASE mapping: we already have 512 GB complete (one full PML3_REACH).
425          * It's okay if we have extra, just need to make sure we reach max_paddr. */
426         if (KERNBASE + PML3_REACH < (uintptr_t)KADDR(max_paddr)) {
427                 map_segment(boot_pgdir, KERNBASE + PML3_REACH,
428                             max_paddr - PML3_REACH, 0x0 + PML3_REACH,
429                             PTE_W | PTE_G, MAX_JUMBO_SHIFT);
430         }
431         /* For the LAPIC and IOAPIC, we use PAT (but not *the* PAT flag) to make
432          * these type UC */
433         map_segment(boot_pgdir, LAPIC_BASE, PGSIZE, LAPIC_PBASE,
434                     PTE_PCD | PTE_PWT | PTE_W | PTE_G, MAX_JUMBO_SHIFT);
435         map_segment(boot_pgdir, IOAPIC_BASE, PGSIZE, IOAPIC_PBASE,
436                     PTE_PCD | PTE_PWT | PTE_W | PTE_G, MAX_JUMBO_SHIFT);
437         /* VPT mapping: recursive PTE inserted at the VPT spot */
438         boot_pgdir[PDX(VPT)] = PADDR(boot_pgdir) | PTE_W | PTE_P | PTE_G;
439         /* same for UVPT, accessible by userspace (RO). */
440         boot_pgdir[PDX(UVPT)] = PADDR(boot_pgdir) | PTE_U | PTE_P | PTE_G;
441         /* set up core0s now (mostly for debugging) */
442         setup_default_mtrrs(0);
443         /* Our current gdt_pd (gdt64desc) is pointing to a physical address for the
444          * GDT.  We need to switch over to pointing to one with a virtual address,
445          * so we can later unmap the low memory */
446         gdt_pd = (pseudodesc_t) {sizeof(segdesc_t) * SEG_COUNT - 1,
447                                  (uintptr_t)gdt};
448         asm volatile("lgdt %0" : : "m"(gdt_pd));
449 }
450
451 void x86_cleanup_bootmem(void)
452 {
453         unmap_segment(boot_pgdir, 0, PML3_PTE_REACH);
454         tlbflush();
455 }
456
457 /* Walks len bytes from start, executing 'callback' on every PTE, passing it a
458  * specific VA and whatever arg is passed in.  Note, this cannot handle jumbo
459  * pages.
460  *
461  * This is just a clumsy wrapper around the more powerful pml_for_each, which
462  * can handle jumbo and intermediate pages. */
463 int env_user_mem_walk(struct proc *p, void *start, size_t len,
464                       mem_walk_callback_t callback, void *arg)
465 {
466         struct tramp_package {
467                 struct proc *p;
468                 mem_walk_callback_t cb;
469                 void *cb_arg;
470         };
471         int trampoline_cb(pte_t *pte, uintptr_t kva, int shift, bool visited_subs,
472                           void *data)
473         {
474                 struct tramp_package *tp = (struct tramp_package*)data;
475                 assert(tp->cb);
476                 /* memwalk CBs don't know how to handle intermediates or jumbos */
477                 if (shift != PML1_SHIFT)
478                         return 0;
479                 return tp->cb(tp->p, pte, (void*)kva, tp->cb_arg);
480         }
481
482         struct tramp_package local_tp;
483         local_tp.p = p;
484         local_tp.cb = callback;
485         local_tp.cb_arg = arg;
486         return pml_for_each(p->env_pgdir, (uintptr_t)start, len, trampoline_cb,
487                             &local_tp);
488 }
489
490 /* Frees (decrefs) all pages of the process's page table, including the page
491  * directory.  Does not free the memory that is actually mapped. */
492 void env_pagetable_free(struct proc *p)
493 {
494         /* callback: given an intermediate pte (not a final one), removes the page
495          * table the PTE points to */
496         int pt_free_cb(pte_t *pte, uintptr_t kva, int shift, bool visited_subs,
497                        void *data)
498         {
499                 if ((shift == PML1_SHIFT) || (*pte * PTE_PS))
500                         return 0;
501                 page_decref(ppn2page(LA2PPN(pte)));
502                 return 0;
503         }
504                 
505         assert(p->env_cr3 != rcr3());
506         pml_for_each(p->env_pgdir, 0, UVPT, pt_free_cb, 0);
507         /* the page directory is not a PTE, so it never was freed */
508         page_decref(pa2page(p->env_cr3));
509         tlbflush();
510 }
511
512 /* Remove the inner page tables along va's walk.  The internals are more
513  * powerful.  We'll eventually want better arch-indep VM functions. */
514 error_t pagetable_remove(pde_t *pgdir, void *va)
515 {
516         return unmap_segment(pgdir, (uintptr_t)va, PGSIZE);
517 }
518
519 void page_check(void)
520 {
521 }
522
523 /* Debugging */
524 static int print_pte(pte_t *pte, uintptr_t kva, int shift, bool visited_subs,
525                      void *data)
526 {
527         switch (shift) {
528                 case (PML1_SHIFT):
529                         printk("\t");
530                         /* fall-through */
531                 case (PML2_SHIFT):
532                         printk("\t");
533                         /* fall-through */
534                 case (PML3_SHIFT):
535                         printk("\t");
536         }
537         printk("KVA: %p, PTE val %p, shift %d, visit %d%s\n", kva, *pte, shift,
538                visited_subs, (*pte & PTE_PS ? " (jumbo)" : ""));
539         return 0;
540 }
541
542 void debug_print_pgdir(pte_t *pgdir)
543 {
544         printk("Printing the entire page table set for %p, DFS\n", pgdir);
545         /* Need to be careful we avoid VPT/UVPT, o/w we'll recurse */
546         pml_for_each(pgdir, 0, UVPT, print_pte, 0);
547         pml_for_each(pgdir, ULIM, VPT - ULIM, print_pte, 0);
548         pml_for_each(pgdir, VPT_TOP, MAX_VADDR - VPT_TOP, print_pte, 0);
549 }