Lines Matching +full:addr +full:- +full:mode

1 // SPDX-License-Identifier: GPL-2.0-only
6 * Modifications for ARM processor (c) 1995-2004 Russell King
15 #include <linux/page-flags.h>
32 unsigned long addr = (unsigned long)unsafe_src; in copy_from_kernel_nofault_allowed() local
34 return addr >= TASK_SIZE && ULONG_MAX - addr >= size; in copy_from_kernel_nofault_allowed()
39 * 'addr' in mm 'mm'.
41 void show_pte(const char *lvl, struct mm_struct *mm, unsigned long addr) in show_pte() argument
48 pgd = pgd_offset(mm, addr); in show_pte()
49 printk("%s[%08lx] *pgd=%08llx", lvl, addr, (long long)pgd_val(*pgd)); in show_pte()
57 p4d = p4d_offset(pgd, addr); in show_pte()
66 pud = pud_offset(p4d, addr); in show_pte()
78 pmd = pmd_offset(pud, addr); in show_pte()
94 pte = pte_offset_map(pmd, addr); in show_pte()
109 void show_pte(const char *lvl, struct mm_struct *mm, unsigned long addr) in show_pte() argument
145 unsigned long addr, unsigned int fsr, in die_kernel_fault() argument
149 pr_alert("8<--- cut here ---\n"); in die_kernel_fault()
151 msg, addr, fsr & FSR_LNX_PF ? "execute" : str_write_read(fsr & FSR_WRITE)); in die_kernel_fault()
153 show_pte(KERN_ALERT, mm, addr); in die_kernel_fault()
163 __do_kernel_fault(struct mm_struct *mm, unsigned long addr, unsigned int fsr, in __do_kernel_fault() argument
176 if (addr < PAGE_SIZE) { in __do_kernel_fault()
182 kfence_handle_page_fault(addr, is_write_fault(fsr), regs)) in __do_kernel_fault()
188 die_kernel_fault(msg, mm, addr, fsr, regs); in __do_kernel_fault()
193 * User mode accesses just cause a SIGSEGV
196 __do_user_fault(unsigned long addr, unsigned int fsr, unsigned int sig, in __do_user_fault() argument
204 pr_err("8<--- cut here ---\n"); in __do_user_fault()
206 tsk->comm, sig, addr, fsr); in __do_user_fault()
207 show_pte(KERN_ERR, tsk->mm, addr); in __do_user_fault()
212 if ((sig == SIGSEGV) && ((addr & PAGE_MASK) == 0xffff0000)) in __do_user_fault()
215 tsk->comm, addr); in __do_user_fault()
218 tsk->thread.address = addr; in __do_user_fault()
219 tsk->thread.error_code = fsr; in __do_user_fault()
220 tsk->thread.trap_no = 14; in __do_user_fault()
221 force_sig_fault(sig, code, (void __user *)addr); in __do_user_fault()
224 void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs) in do_bad_area() argument
227 struct mm_struct *mm = tsk->active_mm; in do_bad_area()
230 * If we are in kernel mode at this point, we in do_bad_area()
234 __do_user_fault(addr, fsr, SIGSEGV, SEGV_MAPERR, regs); in do_bad_area()
236 __do_kernel_fault(mm, addr, fsr, regs); in do_bad_area()
245 /* If we are in user mode: permission granted */ in ttbr0_usermode_access_allowed()
252 return !(svcregs->ttbcr & TTBCR_EPD0); in ttbr0_usermode_access_allowed()
262 do_kernel_address_page_fault(struct mm_struct *mm, unsigned long addr, in do_kernel_address_page_fault() argument
267 * Fault from user mode for a kernel space address. User mode in do_kernel_address_page_fault()
273 __do_user_fault(addr, fsr, SIGSEGV, SEGV_MAPERR, regs); in do_kernel_address_page_fault()
276 * Fault from kernel mode. Enable interrupts if they were in do_kernel_address_page_fault()
279 * so we will only get here for a non-present kernel space in do_kernel_address_page_fault()
286 __do_kernel_fault(mm, addr, fsr, regs); in do_kernel_address_page_fault()
293 do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) in do_page_fault() argument
295 struct mm_struct *mm = current->mm; in do_page_fault()
309 if (addr >= TASK_SIZE) in do_page_fault()
310 return do_kernel_address_page_fault(mm, addr, fsr, regs); in do_page_fault()
336 mm, addr, fsr, regs); in do_page_fault()
339 perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, addr); in do_page_fault()
344 * is disabled while in kernel mode. in do_page_fault()
352 vma = lock_vma_under_rcu(mm, addr); in do_page_fault()
356 if (!(vma->vm_flags & vm_flags)) { in do_page_fault()
363 fault = handle_mm_fault(vma, addr, flags | FAULT_FLAG_VMA_LOCK, regs); in do_page_fault()
384 vma = lock_mm_and_find_vma(mm, addr, regs); in do_page_fault()
395 if (!(vma->vm_flags & vm_flags)) { in do_page_fault()
402 fault = handle_mm_fault(vma, addr & PAGE_MASK, flags, regs); in do_page_fault()
435 * If we are in kernel mode at this point, we in do_page_fault()
445 * got oom-killed) in do_page_fault()
466 __do_user_fault(addr, fsr, sig, code, regs); in do_page_fault()
470 __do_kernel_fault(mm, addr, fsr, regs); in do_page_fault()
475 do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) in do_page_fault() argument
487 * If this is a user address (addr < TASK_SIZE), we handle this as a
491 * Since user mode is not permitted to access kernel addresses, pass these
498 * If vmalloc() fixup fails, that means the non-leaf page tables did not
504 do_translation_fault(unsigned long addr, unsigned int fsr, in do_translation_fault() argument
513 if (addr < TASK_SIZE) in do_translation_fault()
514 return do_page_fault(addr, fsr, regs); in do_translation_fault()
519 index = pgd_index(addr); in do_translation_fault()
524 p4d = p4d_offset(pgd, addr); in do_translation_fault()
525 p4d_k = p4d_offset(pgd_k, addr); in do_translation_fault()
532 pud = pud_offset(p4d, addr); in do_translation_fault()
533 pud_k = pud_offset(p4d_k, addr); in do_translation_fault()
540 pmd = pmd_offset(pud, addr); in do_translation_fault()
541 pmd_k = pmd_offset(pud_k, addr); in do_translation_fault()
557 index = (addr >> SECTION_SHIFT) & 1; in do_translation_fault()
566 do_kernel_address_page_fault(current->mm, addr, fsr, regs); in do_translation_fault()
572 do_translation_fault(unsigned long addr, unsigned int fsr, in do_translation_fault() argument
585 do_sect_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) in do_sect_fault() argument
588 * If this is a kernel address, but from user mode, then userspace in do_sect_fault()
592 if (addr >= TASK_SIZE && user_mode(regs)) in do_sect_fault()
595 do_bad_area(addr, fsr, regs); in do_sect_fault()
605 do_bad(unsigned long addr, unsigned int fsr, struct pt_regs *regs) in do_bad() argument
611 int (*fn)(unsigned long addr, unsigned int fsr, struct pt_regs *regs);
619 #include "fsr-3level.c"
621 #include "fsr-2level.c"
641 do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs) in do_DataAbort() argument
645 if (!inf->fn(addr, fsr & ~FSR_LNX_PF, regs)) in do_DataAbort()
648 pr_alert("8<--- cut here ---\n"); in do_DataAbort()
650 inf->name, fsr, addr); in do_DataAbort()
651 show_pte(KERN_ALERT, current->mm, addr); in do_DataAbort()
653 arm_notify_die("", regs, inf->sig, inf->code, (void __user *)addr, in do_DataAbort()
671 do_PrefetchAbort(unsigned long addr, unsigned int ifsr, struct pt_regs *regs) in do_PrefetchAbort() argument
675 if (!inf->fn(addr, ifsr | FSR_LNX_PF, regs)) in do_PrefetchAbort()
678 pr_alert("8<--- cut here ---\n"); in do_PrefetchAbort()
680 inf->name, ifsr, addr); in do_PrefetchAbort()
682 arm_notify_die("", regs, inf->sig, inf->code, (void __user *)addr, in do_PrefetchAbort()
691 static int __init early_abort_handler(unsigned long addr, unsigned int fsr, in early_abort_handler() argument
713 "I-cache maintenance fault"); in exceptions_init()