fault.c (eadcbfa58ae8693f0d6a0f591d8f51d55cf068e1) fault.c (6c690ee1039b251e583fc65b28da30e97d6a7385)
1/*
2 * Copyright (C) 1995 Linus Torvalds
3 * Copyright (C) 2001, 2002 Andi Kleen, SuSE Labs.
4 * Copyright (C) 2008-2009, Red Hat Inc., Ingo Molnar
5 */
6#include <linux/sched.h> /* test_thread_flag(), ... */
7#include <linux/sched/task_stack.h> /* task_stack_*(), ... */
8#include <linux/kdebug.h> /* oops_begin/end, ... */

--- 332 unchanged lines hidden (view full) ---

341
342 /*
343 * Synchronize this task's top level page-table
344 * with the 'reference' page table.
345 *
346 * Do _not_ use "current" here. We might be inside
347 * an interrupt in the middle of a task switch..
348 */
1/*
2 * Copyright (C) 1995 Linus Torvalds
3 * Copyright (C) 2001, 2002 Andi Kleen, SuSE Labs.
4 * Copyright (C) 2008-2009, Red Hat Inc., Ingo Molnar
5 */
6#include <linux/sched.h> /* test_thread_flag(), ... */
7#include <linux/sched/task_stack.h> /* task_stack_*(), ... */
8#include <linux/kdebug.h> /* oops_begin/end, ... */

--- 332 unchanged lines hidden (view full) ---

341
342 /*
343 * Synchronize this task's top level page-table
344 * with the 'reference' page table.
345 *
346 * Do _not_ use "current" here. We might be inside
347 * an interrupt in the middle of a task switch..
348 */
349 pgd_paddr = read_cr3();
349 pgd_paddr = read_cr3_pa();
350 pmd_k = vmalloc_sync_one(__va(pgd_paddr), address);
351 if (!pmd_k)
352 return -1;
353
354 if (pmd_huge(*pmd_k))
355 return 0;
356
357 pte_k = pte_offset_kernel(pmd_k, address);

--- 25 unchanged lines hidden (view full) ---

383
384static bool low_pfn(unsigned long pfn)
385{
386 return pfn < max_low_pfn;
387}
388
389static void dump_pagetable(unsigned long address)
390{
350 pmd_k = vmalloc_sync_one(__va(pgd_paddr), address);
351 if (!pmd_k)
352 return -1;
353
354 if (pmd_huge(*pmd_k))
355 return 0;
356
357 pte_k = pte_offset_kernel(pmd_k, address);

--- 25 unchanged lines hidden (view full) ---

383
384static bool low_pfn(unsigned long pfn)
385{
386 return pfn < max_low_pfn;
387}
388
389static void dump_pagetable(unsigned long address)
390{
391 pgd_t *base = __va(read_cr3());
391 pgd_t *base = __va(read_cr3_pa());
392 pgd_t *pgd = &base[pgd_index(address)];
393 p4d_t *p4d;
394 pud_t *pud;
395 pmd_t *pmd;
396 pte_t *pte;
397
398#ifdef CONFIG_X86_PAE
399 printk("*pdpt = %016Lx ", pgd_val(*pgd));

--- 46 unchanged lines hidden (view full) ---

446
447 WARN_ON_ONCE(in_nmi());
448
449 /*
450 * Copy kernel mappings over when needed. This can also
451 * happen within a race in page table update. In the later
452 * case just flush:
453 */
392 pgd_t *pgd = &base[pgd_index(address)];
393 p4d_t *p4d;
394 pud_t *pud;
395 pmd_t *pmd;
396 pte_t *pte;
397
398#ifdef CONFIG_X86_PAE
399 printk("*pdpt = %016Lx ", pgd_val(*pgd));

--- 46 unchanged lines hidden (view full) ---

446
447 WARN_ON_ONCE(in_nmi());
448
449 /*
450 * Copy kernel mappings over when needed. This can also
451 * happen within a race in page table update. In the later
452 * case just flush:
453 */
454 pgd = (pgd_t *)__va(read_cr3()) + pgd_index(address);
454 pgd = (pgd_t *)__va(read_cr3_pa()) + pgd_index(address);
455 pgd_ref = pgd_offset_k(address);
456 if (pgd_none(*pgd_ref))
457 return -1;
458
459 if (pgd_none(*pgd)) {
460 set_pgd(pgd, *pgd_ref);
461 arch_flush_lazy_mmu_mode();
462 } else if (CONFIG_PGTABLE_LEVELS > 4) {

--- 87 unchanged lines hidden (view full) ---

550{
551 unsigned long dummy;
552
553 return probe_kernel_address((unsigned long *)p, dummy);
554}
555
556static void dump_pagetable(unsigned long address)
557{
455 pgd_ref = pgd_offset_k(address);
456 if (pgd_none(*pgd_ref))
457 return -1;
458
459 if (pgd_none(*pgd)) {
460 set_pgd(pgd, *pgd_ref);
461 arch_flush_lazy_mmu_mode();
462 } else if (CONFIG_PGTABLE_LEVELS > 4) {

--- 87 unchanged lines hidden (view full) ---

550{
551 unsigned long dummy;
552
553 return probe_kernel_address((unsigned long *)p, dummy);
554}
555
556static void dump_pagetable(unsigned long address)
557{
558 pgd_t *base = __va(read_cr3() & PHYSICAL_PAGE_MASK);
558 pgd_t *base = __va(read_cr3_pa());
559 pgd_t *pgd = base + pgd_index(address);
560 p4d_t *p4d;
561 pud_t *pud;
562 pmd_t *pmd;
563 pte_t *pte;
564
565 if (bad_address(pgd))
566 goto bad;

--- 128 unchanged lines hidden (view full) ---

695 if (!oops_may_print())
696 return;
697
698 if (error_code & PF_INSTR) {
699 unsigned int level;
700 pgd_t *pgd;
701 pte_t *pte;
702
559 pgd_t *pgd = base + pgd_index(address);
560 p4d_t *p4d;
561 pud_t *pud;
562 pmd_t *pmd;
563 pte_t *pte;
564
565 if (bad_address(pgd))
566 goto bad;

--- 128 unchanged lines hidden (view full) ---

695 if (!oops_may_print())
696 return;
697
698 if (error_code & PF_INSTR) {
699 unsigned int level;
700 pgd_t *pgd;
701 pte_t *pte;
702
703 pgd = __va(read_cr3() & PHYSICAL_PAGE_MASK);
703 pgd = __va(read_cr3_pa());
704 pgd += pgd_index(address);
705
706 pte = lookup_address_in_pgd(pgd, address, &level);
707
708 if (pte && pte_present(*pte) && !pte_exec(*pte))
709 printk(nx_warning, from_kuid(&init_user_ns, current_uid()));
710 if (pte && pte_present(*pte) && pte_exec(*pte) &&
711 (pgd_flags(*pgd) & _PAGE_USER) &&

--- 831 unchanged lines hidden ---
704 pgd += pgd_index(address);
705
706 pte = lookup_address_in_pgd(pgd, address, &level);
707
708 if (pte && pte_present(*pte) && !pte_exec(*pte))
709 printk(nx_warning, from_kuid(&init_user_ns, current_uid()));
710 if (pte && pte_present(*pte) && pte_exec(*pte) &&
711 (pgd_flags(*pgd) & _PAGE_USER) &&

--- 831 unchanged lines hidden ---