From bad16b3fa7685a8e0ac84e78d778c42d82ebf6b3 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Thu, 16 Aug 2007 10:30:46 -0700 Subject: [PATCH] --- yaml --- r: 64119 b: refs/heads/master c: e8c59c0cf9c91dccfb6367c306d753500d5a0150 h: refs/heads/master i: 64117: 4a68feb639abfc6d528a625a186777fd80f3491f 64115: c1eb9812cbaab3b40d1e4d6a2100e538eaa87cee 64111: 2cb46eaee416f30aca653a00c76bc99a80c54d6d v: v3 --- [refs] | 2 +- trunk/arch/ia64/mm/fault.c | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index b049086cb69d..852af7245600 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 182fdd225de8fc3b1b721ae944fc41146a0bd812 +refs/heads/master: e8c59c0cf9c91dccfb6367c306d753500d5a0150 diff --git a/trunk/arch/ia64/mm/fault.c b/trunk/arch/ia64/mm/fault.c index 73ccb6010c05..9150ffaff9e8 100644 --- a/trunk/arch/ia64/mm/fault.c +++ b/trunk/arch/ia64/mm/fault.c @@ -112,11 +112,17 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re down_read(&mm->mmap_sem); vma = find_vma_prev(mm, address, &prev_vma); - if (!vma) + if (!vma && !prev_vma ) goto bad_area; - /* find_vma_prev() returns vma such that address < vma->vm_end or NULL */ - if (address < vma->vm_start) + /* + * find_vma_prev() returns vma such that address < vma->vm_end or NULL + * + * May find no vma, but could be that the last vm area is the + * register backing store that needs to expand upwards, in + * this case vma will be null, but prev_vma will ne non-null + */ + if (( !vma && prev_vma ) || (address < vma->vm_start) ) goto check_expansion; good_area: @@ -172,6 +178,8 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re check_expansion: if (!(prev_vma && (prev_vma->vm_flags & VM_GROWSUP) && (address == prev_vma->vm_end))) { + if (!vma) + goto bad_area; if (!(vma->vm_flags & VM_GROWSDOWN)) goto bad_area; if (REGION_NUMBER(address) != REGION_NUMBER(vma->vm_start)