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 --- |