fault.c (e23c34bb41da65f354fb7eee04300c56ee48f60c) fault.c (4ed89f2228061422ce5f62545fd0b6f6648bd2cc)
1/*
2 * linux/arch/arm/mm/fault.c
3 *
4 * Copyright (C) 1995 Linus Torvalds
5 * Modifications for ARM processor (c) 1995-2004 Russell King
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as

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

58 */
59void show_pte(struct mm_struct *mm, unsigned long addr)
60{
61 pgd_t *pgd;
62
63 if (!mm)
64 mm = &init_mm;
65
1/*
2 * linux/arch/arm/mm/fault.c
3 *
4 * Copyright (C) 1995 Linus Torvalds
5 * Modifications for ARM processor (c) 1995-2004 Russell King
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as

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

58 */
59void show_pte(struct mm_struct *mm, unsigned long addr)
60{
61 pgd_t *pgd;
62
63 if (!mm)
64 mm = &init_mm;
65
66 printk(KERN_ALERT "pgd = %p\n", mm->pgd);
66 pr_alert("pgd = %p\n", mm->pgd);
67 pgd = pgd_offset(mm, addr);
67 pgd = pgd_offset(mm, addr);
68 printk(KERN_ALERT "[%08lx] *pgd=%08llx",
68 pr_alert("[%08lx] *pgd=%08llx",
69 addr, (long long)pgd_val(*pgd));
70
71 do {
72 pud_t *pud;
73 pmd_t *pmd;
74 pte_t *pte;
75
76 if (pgd_none(*pgd))
77 break;
78
79 if (pgd_bad(*pgd)) {
69 addr, (long long)pgd_val(*pgd));
70
71 do {
72 pud_t *pud;
73 pmd_t *pmd;
74 pte_t *pte;
75
76 if (pgd_none(*pgd))
77 break;
78
79 if (pgd_bad(*pgd)) {
80 printk("(bad)");
80 pr_cont("(bad)");
81 break;
82 }
83
84 pud = pud_offset(pgd, addr);
85 if (PTRS_PER_PUD != 1)
81 break;
82 }
83
84 pud = pud_offset(pgd, addr);
85 if (PTRS_PER_PUD != 1)
86 printk(", *pud=%08llx", (long long)pud_val(*pud));
86 pr_cont(", *pud=%08llx", (long long)pud_val(*pud));
87
88 if (pud_none(*pud))
89 break;
90
91 if (pud_bad(*pud)) {
87
88 if (pud_none(*pud))
89 break;
90
91 if (pud_bad(*pud)) {
92 printk("(bad)");
92 pr_cont("(bad)");
93 break;
94 }
95
96 pmd = pmd_offset(pud, addr);
97 if (PTRS_PER_PMD != 1)
93 break;
94 }
95
96 pmd = pmd_offset(pud, addr);
97 if (PTRS_PER_PMD != 1)
98 printk(", *pmd=%08llx", (long long)pmd_val(*pmd));
98 pr_cont(", *pmd=%08llx", (long long)pmd_val(*pmd));
99
100 if (pmd_none(*pmd))
101 break;
102
103 if (pmd_bad(*pmd)) {
99
100 if (pmd_none(*pmd))
101 break;
102
103 if (pmd_bad(*pmd)) {
104 printk("(bad)");
104 pr_cont("(bad)");
105 break;
106 }
107
108 /* We must not map this if we have highmem enabled */
109 if (PageHighMem(pfn_to_page(pmd_val(*pmd) >> PAGE_SHIFT)))
110 break;
111
112 pte = pte_offset_map(pmd, addr);
105 break;
106 }
107
108 /* We must not map this if we have highmem enabled */
109 if (PageHighMem(pfn_to_page(pmd_val(*pmd) >> PAGE_SHIFT)))
110 break;
111
112 pte = pte_offset_map(pmd, addr);
113 printk(", *pte=%08llx", (long long)pte_val(*pte));
113 pr_cont(", *pte=%08llx", (long long)pte_val(*pte));
114#ifndef CONFIG_ARM_LPAE
114#ifndef CONFIG_ARM_LPAE
115 printk(", *ppte=%08llx",
115 pr_cont(", *ppte=%08llx",
116 (long long)pte_val(pte[PTE_HWTABLE_PTRS]));
117#endif
118 pte_unmap(pte);
119 } while(0);
120
116 (long long)pte_val(pte[PTE_HWTABLE_PTRS]));
117#endif
118 pte_unmap(pte);
119 } while(0);
120
121 printk("\n");
121 pr_cont("\n");
122}
123#else /* CONFIG_MMU */
124void show_pte(struct mm_struct *mm, unsigned long addr)
125{ }
126#endif /* CONFIG_MMU */
127
128/*
129 * Oops. The kernel tried to access some page that wasn't present.

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

137 */
138 if (fixup_exception(regs))
139 return;
140
141 /*
142 * No handler, we'll have to terminate things with extreme prejudice.
143 */
144 bust_spinlocks(1);
122}
123#else /* CONFIG_MMU */
124void show_pte(struct mm_struct *mm, unsigned long addr)
125{ }
126#endif /* CONFIG_MMU */
127
128/*
129 * Oops. The kernel tried to access some page that wasn't present.

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

137 */
138 if (fixup_exception(regs))
139 return;
140
141 /*
142 * No handler, we'll have to terminate things with extreme prejudice.
143 */
144 bust_spinlocks(1);
145 printk(KERN_ALERT
146 "Unable to handle kernel %s at virtual address %08lx\n",
147 (addr < PAGE_SIZE) ? "NULL pointer dereference" :
148 "paging request", addr);
145 pr_alert("Unable to handle kernel %s at virtual address %08lx\n",
146 (addr < PAGE_SIZE) ? "NULL pointer dereference" :
147 "paging request", addr);
149
150 show_pte(mm, addr);
151 die("Oops", regs, fsr);
152 bust_spinlocks(0);
153 do_exit(SIGKILL);
154}
155
156/*

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

546do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
547{
548 const struct fsr_info *inf = fsr_info + fsr_fs(fsr);
549 struct siginfo info;
550
551 if (!inf->fn(addr, fsr & ~FSR_LNX_PF, regs))
552 return;
553
148
149 show_pte(mm, addr);
150 die("Oops", regs, fsr);
151 bust_spinlocks(0);
152 do_exit(SIGKILL);
153}
154
155/*

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

545do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
546{
547 const struct fsr_info *inf = fsr_info + fsr_fs(fsr);
548 struct siginfo info;
549
550 if (!inf->fn(addr, fsr & ~FSR_LNX_PF, regs))
551 return;
552
554 printk(KERN_ALERT "Unhandled fault: %s (0x%03x) at 0x%08lx\n",
553 pr_alert("Unhandled fault: %s (0x%03x) at 0x%08lx\n",
555 inf->name, fsr, addr);
556
557 info.si_signo = inf->sig;
558 info.si_errno = 0;
559 info.si_code = inf->code;
560 info.si_addr = (void __user *)addr;
561 arm_notify_die("", regs, &info, fsr, 0);
562}

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

578do_PrefetchAbort(unsigned long addr, unsigned int ifsr, struct pt_regs *regs)
579{
580 const struct fsr_info *inf = ifsr_info + fsr_fs(ifsr);
581 struct siginfo info;
582
583 if (!inf->fn(addr, ifsr | FSR_LNX_PF, regs))
584 return;
585
554 inf->name, fsr, addr);
555
556 info.si_signo = inf->sig;
557 info.si_errno = 0;
558 info.si_code = inf->code;
559 info.si_addr = (void __user *)addr;
560 arm_notify_die("", regs, &info, fsr, 0);
561}

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

577do_PrefetchAbort(unsigned long addr, unsigned int ifsr, struct pt_regs *regs)
578{
579 const struct fsr_info *inf = ifsr_info + fsr_fs(ifsr);
580 struct siginfo info;
581
582 if (!inf->fn(addr, ifsr | FSR_LNX_PF, regs))
583 return;
584
586 printk(KERN_ALERT "Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n",
585 pr_alert("Unhandled prefetch abort: %s (0x%03x) at 0x%08lx\n",
587 inf->name, ifsr, addr);
588
589 info.si_signo = inf->sig;
590 info.si_errno = 0;
591 info.si_code = inf->code;
592 info.si_addr = (void __user *)addr;
593 arm_notify_die("", regs, &info, ifsr, 0);
594}

--- 25 unchanged lines hidden ---
586 inf->name, ifsr, addr);
587
588 info.si_signo = inf->sig;
589 info.si_errno = 0;
590 info.si_code = inf->code;
591 info.si_addr = (void __user *)addr;
592 arm_notify_die("", regs, &info, ifsr, 0);
593}

--- 25 unchanged lines hidden ---