* Given a leaf PTE, derive the mapping's attributes. If they do not match * those of the current run, dump the address range and its attributes, and * begin a new run. */
| 7094 | * begin a new run. |
| 7095 | */ |
| 7096 | static void |
| 7097 | sysctl_kmaps_check(struct sbuf *sb, struct pmap_kernel_map_range *range, |
| 7098 | vm_offset_t va, pd_entry_t l0e, pd_entry_t l1e, pd_entry_t l2e, |
| 7099 | pt_entry_t l3e) |
| 7100 | { |
| 7101 | pt_entry_t attrs; |
| 7102 | |
| 7103 | attrs = l0e & (ATTR_S1_AP_MASK | ATTR_S1_XN); |
| 7104 | attrs |= l1e & (ATTR_S1_AP_MASK | ATTR_S1_XN); |
| 7105 | if ((l1e & ATTR_DESCR_MASK) == L1_BLOCK) |
| 7106 | attrs |= l1e & ATTR_S1_IDX_MASK; |
| 7107 | attrs |= l2e & (ATTR_S1_AP_MASK | ATTR_S1_XN); |
| 7108 | if ((l2e & ATTR_DESCR_MASK) == L2_BLOCK) |
| 7109 | attrs |= l2e & ATTR_S1_IDX_MASK; |
| 7110 | attrs |= l3e & (ATTR_S1_AP_MASK | ATTR_S1_XN | ATTR_S1_IDX_MASK); |
| 7111 | |
| 7112 | if (range->sva > va || !sysctl_kmaps_match(range, attrs)) { |
| 7113 | sysctl_kmaps_dump(sb, range, va); |
| 7114 | sysctl_kmaps_reinit(range, va, attrs); |
| 7115 | } |
| 7116 | } |
| 7117 | |
| 7118 | static int |
| 7119 | sysctl_kmaps(SYSCTL_HANDLER_ARGS) |
no test coverage detected