22
22
23
23
#include "../kernel/head.h"
24
24
25
+ static void show_pte (unsigned long addr )
26
+ {
27
+ pgd_t * pgdp , pgd ;
28
+ p4d_t * p4dp , p4d ;
29
+ pud_t * pudp , pud ;
30
+ pmd_t * pmdp , pmd ;
31
+ pte_t * ptep , pte ;
32
+ struct mm_struct * mm = current -> mm ;
33
+
34
+ if (!mm )
35
+ mm = & init_mm ;
36
+
37
+ pr_alert ("Current %s pgtable: %luK pagesize, %d-bit VAs, pgdp=0x%016llx\n" ,
38
+ current -> comm , PAGE_SIZE / SZ_1K , VA_BITS ,
39
+ mm == & init_mm ? (u64 )__pa_symbol (mm -> pgd ) : virt_to_phys (mm -> pgd ));
40
+
41
+ pgdp = pgd_offset (mm , addr );
42
+ pgd = pgdp_get (pgdp );
43
+ pr_alert ("[%016lx] pgd=%016lx" , addr , pgd_val (pgd ));
44
+ if (pgd_none (pgd ) || pgd_bad (pgd ) || pgd_leaf (pgd ))
45
+ goto out ;
46
+
47
+ p4dp = p4d_offset (pgdp , addr );
48
+ p4d = p4dp_get (p4dp );
49
+ pr_cont (", p4d=%016lx" , p4d_val (p4d ));
50
+ if (p4d_none (p4d ) || p4d_bad (p4d ) || p4d_leaf (p4d ))
51
+ goto out ;
52
+
53
+ pudp = pud_offset (p4dp , addr );
54
+ pud = pudp_get (pudp );
55
+ pr_cont (", pud=%016lx" , pud_val (pud ));
56
+ if (pud_none (pud ) || pud_bad (pud ) || pud_leaf (pud ))
57
+ goto out ;
58
+
59
+ pmdp = pmd_offset (pudp , addr );
60
+ pmd = pmdp_get (pmdp );
61
+ pr_cont (", pmd=%016lx" , pmd_val (pmd ));
62
+ if (pmd_none (pmd ) || pmd_bad (pmd ) || pmd_leaf (pmd ))
63
+ goto out ;
64
+
65
+ ptep = pte_offset_map (pmdp , addr );
66
+ if (!ptep )
67
+ goto out ;
68
+
69
+ pte = ptep_get (ptep );
70
+ pr_cont (", pte=%016lx" , pte_val (pte ));
71
+ pte_unmap (ptep );
72
+ out :
73
+ pr_cont ("\n" );
74
+ }
75
+
25
76
static void die_kernel_fault (const char * msg , unsigned long addr ,
26
77
struct pt_regs * regs )
27
78
{
@@ -31,6 +82,7 @@ static void die_kernel_fault(const char *msg, unsigned long addr,
31
82
addr );
32
83
33
84
bust_spinlocks (0 );
85
+ show_pte (addr );
34
86
die (regs , "Oops" );
35
87
make_task_dead (SIGKILL );
36
88
}
0 commit comments