1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * From split of dump_linuxpagetables.c 4 * Copyright 2016, Rashmica Gupta, IBM Corp. 5 * 6 */ 7 #include <linux/kernel.h> 8 #include <asm/pgtable.h> 9 10 #include "ptdump.h" 11 12 static const struct flag_info flag_array[] = { 13 { 14 .mask = _PAGE_PRIVILEGED, 15 .val = 0, 16 .set = "user", 17 .clear = " ", 18 }, { 19 .mask = _PAGE_READ, 20 .val = _PAGE_READ, 21 .set = "r", 22 .clear = " ", 23 }, { 24 .mask = _PAGE_WRITE, 25 .val = _PAGE_WRITE, 26 .set = "w", 27 .clear = " ", 28 }, { 29 .mask = _PAGE_EXEC, 30 .val = _PAGE_EXEC, 31 .set = " X ", 32 .clear = " ", 33 }, { 34 .mask = _PAGE_PTE, 35 .val = _PAGE_PTE, 36 .set = "pte", 37 .clear = " ", 38 }, { 39 .mask = _PAGE_PRESENT, 40 .val = _PAGE_PRESENT, 41 .set = "valid", 42 .clear = " ", 43 }, { 44 .mask = _PAGE_PRESENT | _PAGE_INVALID, 45 .val = 0, 46 .set = " ", 47 .clear = "present", 48 }, { 49 .mask = H_PAGE_HASHPTE, 50 .val = H_PAGE_HASHPTE, 51 .set = "hpte", 52 .clear = " ", 53 }, { 54 .mask = _PAGE_DIRTY, 55 .val = _PAGE_DIRTY, 56 .set = "dirty", 57 .clear = " ", 58 }, { 59 .mask = _PAGE_ACCESSED, 60 .val = _PAGE_ACCESSED, 61 .set = "accessed", 62 .clear = " ", 63 }, { 64 .mask = _PAGE_NON_IDEMPOTENT, 65 .val = _PAGE_NON_IDEMPOTENT, 66 .set = "non-idempotent", 67 .clear = " ", 68 }, { 69 .mask = _PAGE_TOLERANT, 70 .val = _PAGE_TOLERANT, 71 .set = "tolerant", 72 .clear = " ", 73 }, { 74 .mask = H_PAGE_BUSY, 75 .val = H_PAGE_BUSY, 76 .set = "busy", 77 }, { 78 #ifdef CONFIG_PPC_64K_PAGES 79 .mask = H_PAGE_COMBO, 80 .val = H_PAGE_COMBO, 81 .set = "combo", 82 }, { 83 .mask = H_PAGE_4K_PFN, 84 .val = H_PAGE_4K_PFN, 85 .set = "4K_pfn", 86 }, { 87 #else /* CONFIG_PPC_64K_PAGES */ 88 .mask = H_PAGE_F_GIX, 89 .val = H_PAGE_F_GIX, 90 .set = "f_gix", 91 .is_val = true, 92 .shift = H_PAGE_F_GIX_SHIFT, 93 }, { 94 .mask = H_PAGE_F_SECOND, 95 .val = H_PAGE_F_SECOND, 96 .set = "f_second", 97 }, { 98 #endif /* CONFIG_PPC_64K_PAGES */ 99 .mask = _PAGE_SPECIAL, 100 .val = _PAGE_SPECIAL, 101 .set = "special", 102 } 103 }; 104 105 struct pgtable_level pg_level[5] = { 106 { 107 }, { /* pgd */ 108 .flag = flag_array, 109 .num = ARRAY_SIZE(flag_array), 110 }, { /* pud */ 111 .flag = flag_array, 112 .num = ARRAY_SIZE(flag_array), 113 }, { /* pmd */ 114 .flag = flag_array, 115 .num = ARRAY_SIZE(flag_array), 116 }, { /* pte */ 117 .flag = flag_array, 118 .num = ARRAY_SIZE(flag_array), 119 }, 120 }; 121