fault.c (4f2c0a4acffbec01079c28f839422e64ddeff004) fault.c (a050ba1e7422f2cc60ff8bfde3f96d34d00cb585)
1/*
2 * Page fault handler for SH with an MMU.
3 *
4 * Copyright (C) 1999 Niibe Yutaka
5 * Copyright (C) 2003 - 2012 Paul Mundt
6 *
7 * Based on linux/arch/i386/mm/fault.c:
8 * Copyright (C) 1995 Linus Torvalds

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

434 * with pagefaults disabled then we must not take the fault:
435 */
436 if (unlikely(faulthandler_disabled() || !mm)) {
437 bad_area_nosemaphore(regs, error_code, address);
438 return;
439 }
440
441retry:
1/*
2 * Page fault handler for SH with an MMU.
3 *
4 * Copyright (C) 1999 Niibe Yutaka
5 * Copyright (C) 2003 - 2012 Paul Mundt
6 *
7 * Based on linux/arch/i386/mm/fault.c:
8 * Copyright (C) 1995 Linus Torvalds

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

434 * with pagefaults disabled then we must not take the fault:
435 */
436 if (unlikely(faulthandler_disabled() || !mm)) {
437 bad_area_nosemaphore(regs, error_code, address);
438 return;
439 }
440
441retry:
442 mmap_read_lock(mm);
443
444 vma = find_vma(mm, address);
442 vma = lock_mm_and_find_vma(mm, address, regs);
445 if (unlikely(!vma)) {
443 if (unlikely(!vma)) {
446 bad_area(regs, error_code, address);
444 bad_area_nosemaphore(regs, error_code, address);
447 return;
448 }
445 return;
446 }
449 if (likely(vma->vm_start <= address))
450 goto good_area;
451 if (unlikely(!(vma->vm_flags & VM_GROWSDOWN))) {
452 bad_area(regs, error_code, address);
453 return;
454 }
455 if (unlikely(expand_stack(vma, address))) {
456 bad_area(regs, error_code, address);
457 return;
458 }
459
460 /*
461 * Ok, we have a good vm_area for this memory access, so
462 * we can handle it..
463 */
447
448 /*
449 * Ok, we have a good vm_area for this memory access, so
450 * we can handle it..
451 */
464good_area:
465 if (unlikely(access_error(error_code, vma))) {
466 bad_area_access_error(regs, error_code, address);
467 return;
468 }
469
470 set_thread_fault_code(error_code);
471
472 if (user_mode(regs))

--- 32 unchanged lines hidden ---
452 if (unlikely(access_error(error_code, vma))) {
453 bad_area_access_error(regs, error_code, address);
454 return;
455 }
456
457 set_thread_fault_code(error_code);
458
459 if (user_mode(regs))

--- 32 unchanged lines hidden ---