Lines Matching +full:user +full:- +full:level
1 // SPDX-License-Identifier: GPL-2.0-only
30 int level; member
81 [USER_SPACE_NR] = { 0, "User Space" },
108 [END_OF_SPACE_NR] = { -1, NULL }
132 [USER_SPACE_NR] = { 0, "User Space" },
144 [END_OF_SPACE_NR] = { -1, NULL }
179 static void printk_prot(struct seq_file *m, pgprotval_t pr, int level, bool dmsg) in printk_prot() argument
205 /* Bit 7 has a different meaning on level 3 vs 4 */ in printk_prot()
206 if (level <= 3 && pr & _PAGE_PSE) in printk_prot()
210 if ((level == 4 && pr & _PAGE_PAT) || in printk_prot()
211 ((level == 3 || level == 2) && pr & _PAGE_PAT_LARGE)) in printk_prot()
224 pt_dump_cont_printf(m, dmsg, "%s\n", level_name[level]); in printk_prot()
231 npages = (addr - st->start_address) / PAGE_SIZE; in note_wx()
238 if (pcibios_enabled && st->start_address >= PAGE_OFFSET + BIOS_BEGIN && in note_wx()
245 st->wx_pages += npages; in note_wx()
248 (void *)st->start_address); in note_wx()
251 static void effective_prot(struct ptdump_state *pt_st, int level, u64 val) in effective_prot() argument
257 if (level > 0) { in effective_prot()
258 pgprotval_t higher_prot = st->prot_levels[level - 1]; in effective_prot()
266 st->prot_levels[level] = effective; in effective_prot()
274 static void note_page(struct ptdump_state *pt_st, unsigned long addr, int level, in note_page() argument
281 struct seq_file *m = st->seq; in note_page()
287 new_eff = st->prot_levels[level]; in note_page()
294 cur = st->current_prot; in note_page()
295 eff = st->effective_prot; in note_page()
297 if (st->level == -1) { in note_page()
299 st->current_prot = new_prot; in note_page()
300 st->effective_prot = new_eff; in note_page()
301 st->level = level; in note_page()
302 st->marker = address_markers; in note_page()
303 st->lines = 0; in note_page()
304 pt_dump_seq_printf(m, st->to_dmesg, "---[ %s ]---\n", in note_page()
305 st->marker->name); in note_page()
306 } else if (new_prot != cur || new_eff != eff || level != st->level || in note_page()
307 addr >= st->marker[1].start_address) { in note_page()
312 if (st->check_wx && (eff & _PAGE_RW) && !(eff & _PAGE_NX)) in note_page()
318 if (!st->marker->max_lines || in note_page()
319 st->lines < st->marker->max_lines) { in note_page()
320 pt_dump_seq_printf(m, st->to_dmesg, in note_page()
321 "0x%0*lx-0x%0*lx ", in note_page()
322 width, st->start_address, in note_page()
325 delta = addr - st->start_address; in note_page()
330 pt_dump_cont_printf(m, st->to_dmesg, "%9lu%c ", in note_page()
332 printk_prot(m, st->current_prot, st->level, in note_page()
333 st->to_dmesg); in note_page()
335 st->lines++; in note_page()
342 if (addr >= st->marker[1].start_address) { in note_page()
343 if (st->marker->max_lines && in note_page()
344 st->lines > st->marker->max_lines) { in note_page()
346 st->lines - st->marker->max_lines; in note_page()
347 pt_dump_seq_printf(m, st->to_dmesg, in note_page()
352 st->marker++; in note_page()
353 st->lines = 0; in note_page()
354 pt_dump_seq_printf(m, st->to_dmesg, "---[ %s ]---\n", in note_page()
355 st->marker->name); in note_page()
358 st->start_address = addr; in note_page()
359 st->current_prot = new_prot; in note_page()
360 st->effective_prot = new_eff; in note_page()
361 st->level = level; in note_page()
385 .level = -1, in ptdump_walk_pgd_level_core()
404 ptdump_walk_pgd_level_core(m, mm, mm->pgd, false, true); in ptdump_walk_pgd_level()
408 bool user) in ptdump_walk_pgd_level_debugfs() argument
410 pgd_t *pgd = mm->pgd; in ptdump_walk_pgd_level_debugfs()
412 if (user && boot_cpu_has(X86_FEATURE_PTI)) in ptdump_walk_pgd_level_debugfs()
428 pr_info("x86/mm: Checking user space page tables\n"); in ptdump_walk_user_pgd_level_checkwx()
442 * Various markers are not compile-time constants, so assign them in pt_dump_init()