Index: linux-2.6.18-mm3/arch/ia64/kernel/ivt.S =================================================================== --- linux-2.6.18-mm3.orig/arch/ia64/kernel/ivt.S 2006-10-09 16:04:12.920458173 -0700 +++ linux-2.6.18-mm3/arch/ia64/kernel/ivt.S 2006-10-09 16:16:22.810999873 -0700 @@ -430,17 +430,18 @@ ENTRY(nested_dtlb_miss) shl r21=r16,3 // shift bit 60 into sign bit mov r18=cr.itir shr.u r17=r16,61 // get the region number into r17 - movl r22=(1 << (PGDIR_SHIFT+PAGE_SHIFT))// End of mappable space +// movl r22=(1 << (PGDIR_SHIFT+PAGE_SHIFT))// End of mappable space ;; cmp.eq p6,p7=5,r17 // is faulting address in region 5? - cmp.gt p9,p0=r21,r22 // Above mappable space -(p9) br.cond.spnt vary_pagesize // If the higher bits were set check +// cmp.gt p9,p0=r21,r22 // Above mappable space +//(p9) br.cond.spnt vary_pagesize // If the higher bits were set check +nested_dtlb_cont: ;; extr.u r18=r18,2,6 // get the faulting page size srlz.d LOAD_PHYSICAL(p6, r19, swapper_pg_dir) // region 5 is rooted at swapper_pg_dir ;; -nested_dtlb: +nested_dtlb_pgdir: add r22=-PAGE_SHIFT,r18 // adjustment for hugetlb address add r18=PGDIR_SHIFT-PAGE_SHIFT+3,r18 ;; @@ -507,7 +508,7 @@ END(nested_dtlb_miss) // ENTRY(vary_pagesize) cmp.eq p6,p7=4,r17 // Huge region? -(p7) br.cond.spnt page_fault // Hmm... illegal address... +(p7) br.cond.spnt nested_dtlb_cont // Not for us ;; mov r21=16 // +2 is first large page size extr r22=r16,(PGDIR_SHIFT-PAGE_SHIFT-3),3 // Get page size bits @@ -525,7 +526,7 @@ ENTRY(vary_pagesize) ;; mov r18=r22; // r18 must have page size on return shl r21=r16,3 // realign r21. - br.cond.spnt.many nested_dtlb // Continue + br.cond.spnt.many nested_dtlb_pgdir // Continue END(vary_pagesize) .org ia64_ivt+0x1800