.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * Debug helper to dump the current kernel pagetables of the system |
---|
3 | 4 | * so that we can see what the various memory ranges are set to. |
---|
.. | .. |
---|
6 | 7 | * (C) Copyright 2008 Intel Corporation |
---|
7 | 8 | * |
---|
8 | 9 | * Author: Arjan van de Ven <arjan@linux.intel.com> |
---|
9 | | - * |
---|
10 | | - * This program is free software; you can redistribute it and/or |
---|
11 | | - * modify it under the terms of the GNU General Public License |
---|
12 | | - * as published by the Free Software Foundation; version 2 |
---|
13 | | - * of the License. |
---|
14 | 10 | */ |
---|
15 | 11 | #include <linux/debugfs.h> |
---|
16 | 12 | #include <linux/fs.h> |
---|
.. | .. |
---|
20 | 16 | #include <asm/domain.h> |
---|
21 | 17 | #include <asm/fixmap.h> |
---|
22 | 18 | #include <asm/memory.h> |
---|
23 | | -#include <asm/pgtable.h> |
---|
24 | 19 | #include <asm/ptdump.h> |
---|
25 | 20 | |
---|
26 | 21 | static struct addr_marker address_markers[] = { |
---|
.. | .. |
---|
211 | 206 | static struct pg_level pg_level[] = { |
---|
212 | 207 | { |
---|
213 | 208 | }, { /* pgd */ |
---|
| 209 | + }, { /* p4d */ |
---|
214 | 210 | }, { /* pud */ |
---|
215 | 211 | }, { /* pmd */ |
---|
216 | 212 | .bits = section_bits, |
---|
.. | .. |
---|
312 | 308 | |
---|
313 | 309 | for (i = 0; i < PTRS_PER_PTE; i++, pte++) { |
---|
314 | 310 | addr = start + i * PAGE_SIZE; |
---|
315 | | - note_page(st, addr, 4, pte_val(*pte), domain); |
---|
| 311 | + note_page(st, addr, 5, pte_val(*pte), domain); |
---|
316 | 312 | } |
---|
317 | 313 | } |
---|
318 | 314 | |
---|
.. | .. |
---|
346 | 342 | addr = start + i * PMD_SIZE; |
---|
347 | 343 | domain = get_domain_name(pmd); |
---|
348 | 344 | if (pmd_none(*pmd) || pmd_large(*pmd) || !pmd_present(*pmd)) |
---|
349 | | - note_page(st, addr, 3, pmd_val(*pmd), domain); |
---|
| 345 | + note_page(st, addr, 4, pmd_val(*pmd), domain); |
---|
350 | 346 | else |
---|
351 | 347 | walk_pte(st, pmd, addr, domain); |
---|
352 | 348 | |
---|
.. | .. |
---|
354 | 350 | addr += SECTION_SIZE; |
---|
355 | 351 | pmd++; |
---|
356 | 352 | domain = get_domain_name(pmd); |
---|
357 | | - note_page(st, addr, 3, pmd_val(*pmd), domain); |
---|
| 353 | + note_page(st, addr, 4, pmd_val(*pmd), domain); |
---|
358 | 354 | } |
---|
359 | 355 | } |
---|
360 | 356 | } |
---|
361 | 357 | |
---|
362 | | -static void walk_pud(struct pg_state *st, pgd_t *pgd, unsigned long start) |
---|
| 358 | +static void walk_pud(struct pg_state *st, p4d_t *p4d, unsigned long start) |
---|
363 | 359 | { |
---|
364 | | - pud_t *pud = pud_offset(pgd, 0); |
---|
| 360 | + pud_t *pud = pud_offset(p4d, 0); |
---|
365 | 361 | unsigned long addr; |
---|
366 | 362 | unsigned i; |
---|
367 | 363 | |
---|
.. | .. |
---|
370 | 366 | if (!pud_none(*pud)) { |
---|
371 | 367 | walk_pmd(st, pud, addr); |
---|
372 | 368 | } else { |
---|
373 | | - note_page(st, addr, 2, pud_val(*pud), NULL); |
---|
| 369 | + note_page(st, addr, 3, pud_val(*pud), NULL); |
---|
| 370 | + } |
---|
| 371 | + } |
---|
| 372 | +} |
---|
| 373 | + |
---|
| 374 | +static void walk_p4d(struct pg_state *st, pgd_t *pgd, unsigned long start) |
---|
| 375 | +{ |
---|
| 376 | + p4d_t *p4d = p4d_offset(pgd, 0); |
---|
| 377 | + unsigned long addr; |
---|
| 378 | + unsigned i; |
---|
| 379 | + |
---|
| 380 | + for (i = 0; i < PTRS_PER_P4D; i++, p4d++) { |
---|
| 381 | + addr = start + i * P4D_SIZE; |
---|
| 382 | + if (!p4d_none(*p4d)) { |
---|
| 383 | + walk_pud(st, p4d, addr); |
---|
| 384 | + } else { |
---|
| 385 | + note_page(st, addr, 2, p4d_val(*p4d), NULL); |
---|
374 | 386 | } |
---|
375 | 387 | } |
---|
376 | 388 | } |
---|
.. | .. |
---|
385 | 397 | for (i = 0; i < PTRS_PER_PGD; i++, pgd++) { |
---|
386 | 398 | addr = start + i * PGDIR_SIZE; |
---|
387 | 399 | if (!pgd_none(*pgd)) { |
---|
388 | | - walk_pud(st, pgd, addr); |
---|
| 400 | + walk_p4d(st, pgd, addr); |
---|
389 | 401 | } else { |
---|
390 | 402 | note_page(st, addr, 1, pgd_val(*pgd), NULL); |
---|
391 | 403 | } |
---|
.. | .. |
---|
450 | 462 | static int ptdump_init(void) |
---|
451 | 463 | { |
---|
452 | 464 | ptdump_initialize(); |
---|
453 | | - return ptdump_debugfs_register(&kernel_ptdump_info, |
---|
454 | | - "kernel_page_tables"); |
---|
| 465 | + ptdump_debugfs_register(&kernel_ptdump_info, "kernel_page_tables"); |
---|
| 466 | + return 0; |
---|
455 | 467 | } |
---|
456 | 468 | __initcall(ptdump_init); |
---|