diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-11 19:29:47 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-11-11 19:29:47 -0500 |
| commit | 401221501af4b87b502eca36ece97b4191380082 (patch) | |
| tree | d67687b4ceb8c78213296039cafe8602514e4cd3 | |
| parent | 63f45b80947cb0819673860f6970f483e2cab21d (diff) | |
| parent | ff51224cab12845c8bd539ca1f2dc18cc851b445 (diff) | |
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6
| -rw-r--r-- | arch/ia64/Kconfig | 13 | ||||
| -rw-r--r-- | arch/ia64/configs/sn2_defconfig | 2 | ||||
| -rw-r--r-- | arch/ia64/defconfig | 2 | ||||
| -rw-r--r-- | arch/ia64/kernel/ivt.S | 63 | ||||
| -rw-r--r-- | arch/ia64/sn/kernel/setup.c | 157 | ||||
| -rw-r--r-- | include/asm-ia64/page.h | 8 | ||||
| -rw-r--r-- | include/asm-ia64/pgalloc.h | 19 | ||||
| -rw-r--r-- | include/asm-ia64/pgtable.h | 76 |
8 files changed, 303 insertions, 37 deletions
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index d4de8a4814be..8796e12c56f3 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
| @@ -164,6 +164,19 @@ config IA64_PAGE_SIZE_64KB | |||
| 164 | 164 | ||
| 165 | endchoice | 165 | endchoice |
| 166 | 166 | ||
| 167 | choice | ||
| 168 | prompt "Page Table Levels" | ||
| 169 | default PGTABLE_3 | ||
| 170 | |||
| 171 | config PGTABLE_3 | ||
| 172 | bool "3 Levels" | ||
| 173 | |||
| 174 | config PGTABLE_4 | ||
| 175 | depends on !IA64_PAGE_SIZE_64KB | ||
| 176 | bool "4 Levels" | ||
| 177 | |||
| 178 | endchoice | ||
| 179 | |||
| 167 | source kernel/Kconfig.hz | 180 | source kernel/Kconfig.hz |
| 168 | 181 | ||
| 169 | config IA64_BRL_EMU | 182 | config IA64_BRL_EMU |
diff --git a/arch/ia64/configs/sn2_defconfig b/arch/ia64/configs/sn2_defconfig index 08112ab38468..87cfd31a4a39 100644 --- a/arch/ia64/configs/sn2_defconfig +++ b/arch/ia64/configs/sn2_defconfig | |||
| @@ -80,6 +80,8 @@ CONFIG_MCKINLEY=y | |||
| 80 | # CONFIG_IA64_PAGE_SIZE_8KB is not set | 80 | # CONFIG_IA64_PAGE_SIZE_8KB is not set |
| 81 | CONFIG_IA64_PAGE_SIZE_16KB=y | 81 | CONFIG_IA64_PAGE_SIZE_16KB=y |
| 82 | # CONFIG_IA64_PAGE_SIZE_64KB is not set | 82 | # CONFIG_IA64_PAGE_SIZE_64KB is not set |
| 83 | # CONFIG_PGTABLE_3 is not set | ||
| 84 | CONFIG_PGTABLE_4=y | ||
| 83 | # CONFIG_HZ_100 is not set | 85 | # CONFIG_HZ_100 is not set |
| 84 | CONFIG_HZ_250=y | 86 | CONFIG_HZ_250=y |
| 85 | # CONFIG_HZ_1000 is not set | 87 | # CONFIG_HZ_1000 is not set |
diff --git a/arch/ia64/defconfig b/arch/ia64/defconfig index 6e3f147e03e5..275a26c6e5aa 100644 --- a/arch/ia64/defconfig +++ b/arch/ia64/defconfig | |||
| @@ -82,6 +82,8 @@ CONFIG_MCKINLEY=y | |||
| 82 | # CONFIG_IA64_PAGE_SIZE_8KB is not set | 82 | # CONFIG_IA64_PAGE_SIZE_8KB is not set |
| 83 | CONFIG_IA64_PAGE_SIZE_16KB=y | 83 | CONFIG_IA64_PAGE_SIZE_16KB=y |
| 84 | # CONFIG_IA64_PAGE_SIZE_64KB is not set | 84 | # CONFIG_IA64_PAGE_SIZE_64KB is not set |
| 85 | CONFIG_PGTABLE_3=y | ||
| 86 | # CONFIG_PGTABLE_4 is not set | ||
| 85 | # CONFIG_HZ_100 is not set | 87 | # CONFIG_HZ_100 is not set |
| 86 | CONFIG_HZ_250=y | 88 | CONFIG_HZ_250=y |
| 87 | # CONFIG_HZ_1000 is not set | 89 | # CONFIG_HZ_1000 is not set |
diff --git a/arch/ia64/kernel/ivt.S b/arch/ia64/kernel/ivt.S index c13ca0d49c4a..e06f21f60dc5 100644 --- a/arch/ia64/kernel/ivt.S +++ b/arch/ia64/kernel/ivt.S | |||
| @@ -114,7 +114,7 @@ ENTRY(vhpt_miss) | |||
| 114 | shl r21=r16,3 // shift bit 60 into sign bit | 114 | shl r21=r16,3 // shift bit 60 into sign bit |
| 115 | shr.u r17=r16,61 // get the region number into r17 | 115 | shr.u r17=r16,61 // get the region number into r17 |
| 116 | ;; | 116 | ;; |
| 117 | shr r22=r21,3 | 117 | shr.u r22=r21,3 |
| 118 | #ifdef CONFIG_HUGETLB_PAGE | 118 | #ifdef CONFIG_HUGETLB_PAGE |
| 119 | extr.u r26=r25,2,6 | 119 | extr.u r26=r25,2,6 |
| 120 | ;; | 120 | ;; |
| @@ -140,20 +140,34 @@ ENTRY(vhpt_miss) | |||
| 140 | (p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=PTA + IFA(33,42)*8 | 140 | (p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=PTA + IFA(33,42)*8 |
| 141 | (p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=PTA + (((IFA(61,63) << 7) | IFA(33,39))*8) | 141 | (p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=PTA + (((IFA(61,63) << 7) | IFA(33,39))*8) |
| 142 | cmp.eq p7,p6=0,r21 // unused address bits all zeroes? | 142 | cmp.eq p7,p6=0,r21 // unused address bits all zeroes? |
| 143 | shr.u r18=r22,PMD_SHIFT // shift L2 index into position | 143 | #ifdef CONFIG_PGTABLE_4 |
| 144 | shr.u r28=r22,PUD_SHIFT // shift L2 index into position | ||
| 145 | #else | ||
| 146 | shr.u r18=r22,PMD_SHIFT // shift L3 index into position | ||
| 147 | #endif | ||
| 144 | ;; | 148 | ;; |
| 145 | ld8 r17=[r17] // fetch the L1 entry (may be 0) | 149 | ld8 r17=[r17] // fetch the L1 entry (may be 0) |
| 146 | ;; | 150 | ;; |
| 147 | (p7) cmp.eq p6,p7=r17,r0 // was L1 entry NULL? | 151 | (p7) cmp.eq p6,p7=r17,r0 // was L1 entry NULL? |
| 148 | dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry | 152 | #ifdef CONFIG_PGTABLE_4 |
| 153 | dep r28=r28,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry | ||
| 154 | ;; | ||
| 155 | shr.u r18=r22,PMD_SHIFT // shift L3 index into position | ||
| 156 | (p7) ld8 r29=[r28] // fetch the L2 entry (may be 0) | ||
| 149 | ;; | 157 | ;; |
| 150 | (p7) ld8 r20=[r17] // fetch the L2 entry (may be 0) | 158 | (p7) cmp.eq.or.andcm p6,p7=r29,r0 // was L2 entry NULL? |
| 151 | shr.u r19=r22,PAGE_SHIFT // shift L3 index into position | 159 | dep r17=r18,r29,3,(PAGE_SHIFT-3) // compute address of L3 page table entry |
| 160 | #else | ||
| 161 | dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L3 page table entry | ||
| 162 | #endif | ||
| 152 | ;; | 163 | ;; |
| 153 | (p7) cmp.eq.or.andcm p6,p7=r20,r0 // was L2 entry NULL? | 164 | (p7) ld8 r20=[r17] // fetch the L3 entry (may be 0) |
| 154 | dep r21=r19,r20,3,(PAGE_SHIFT-3) // compute address of L3 page table entry | 165 | shr.u r19=r22,PAGE_SHIFT // shift L4 index into position |
| 155 | ;; | 166 | ;; |
| 156 | (p7) ld8 r18=[r21] // read the L3 PTE | 167 | (p7) cmp.eq.or.andcm p6,p7=r20,r0 // was L3 entry NULL? |
| 168 | dep r21=r19,r20,3,(PAGE_SHIFT-3) // compute address of L4 page table entry | ||
| 169 | ;; | ||
| 170 | (p7) ld8 r18=[r21] // read the L4 PTE | ||
| 157 | mov r19=cr.isr // cr.isr bit 0 tells us if this is an insn miss | 171 | mov r19=cr.isr // cr.isr bit 0 tells us if this is an insn miss |
| 158 | ;; | 172 | ;; |
| 159 | (p7) tbit.z p6,p7=r18,_PAGE_P_BIT // page present bit cleared? | 173 | (p7) tbit.z p6,p7=r18,_PAGE_P_BIT // page present bit cleared? |
| @@ -192,14 +206,21 @@ ENTRY(vhpt_miss) | |||
| 192 | * between reading the pagetable and the "itc". If so, flush the entry we | 206 | * between reading the pagetable and the "itc". If so, flush the entry we |
| 193 | * inserted and retry. | 207 | * inserted and retry. |
| 194 | */ | 208 | */ |
| 195 | ld8 r25=[r21] // read L3 PTE again | 209 | ld8 r25=[r21] // read L4 entry again |
| 196 | ld8 r26=[r17] // read L2 entry again | 210 | ld8 r26=[r17] // read L3 PTE again |
| 211 | #ifdef CONFIG_PGTABLE_4 | ||
| 212 | ld8 r18=[r28] // read L2 entry again | ||
| 213 | #endif | ||
| 214 | cmp.ne p6,p7=r0,r0 | ||
| 197 | ;; | 215 | ;; |
| 198 | cmp.ne p6,p7=r26,r20 // did L2 entry change | 216 | cmp.ne.or.andcm p6,p7=r26,r20 // did L3 entry change |
| 217 | #ifdef CONFIG_PGTABLE_4 | ||
| 218 | cmp.ne.or.andcm p6,p7=r29,r18 // did L4 PTE change | ||
| 219 | #endif | ||
| 199 | mov r27=PAGE_SHIFT<<2 | 220 | mov r27=PAGE_SHIFT<<2 |
| 200 | ;; | 221 | ;; |
| 201 | (p6) ptc.l r22,r27 // purge PTE page translation | 222 | (p6) ptc.l r22,r27 // purge PTE page translation |
| 202 | (p7) cmp.ne.or.andcm p6,p7=r25,r18 // did L3 PTE change | 223 | (p7) cmp.ne.or.andcm p6,p7=r25,r18 // did L4 PTE change |
| 203 | ;; | 224 | ;; |
| 204 | (p6) ptc.l r16,r27 // purge translation | 225 | (p6) ptc.l r16,r27 // purge translation |
| 205 | #endif | 226 | #endif |
| @@ -432,18 +453,30 @@ ENTRY(nested_dtlb_miss) | |||
| 432 | (p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=PTA + IFA(33,42)*8 | 453 | (p6) dep r17=r18,r19,3,(PAGE_SHIFT-3) // r17=PTA + IFA(33,42)*8 |
| 433 | (p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=PTA + (((IFA(61,63) << 7) | IFA(33,39))*8) | 454 | (p7) dep r17=r18,r17,3,(PAGE_SHIFT-6) // r17=PTA + (((IFA(61,63) << 7) | IFA(33,39))*8) |
| 434 | cmp.eq p7,p6=0,r21 // unused address bits all zeroes? | 455 | cmp.eq p7,p6=0,r21 // unused address bits all zeroes? |
| 435 | shr.u r18=r22,PMD_SHIFT // shift L2 index into position | 456 | #ifdef CONFIG_PGTABLE_4 |
| 457 | shr.u r18=r22,PUD_SHIFT // shift L2 index into position | ||
| 458 | #else | ||
| 459 | shr.u r18=r22,PMD_SHIFT // shift L3 index into position | ||
| 460 | #endif | ||
| 436 | ;; | 461 | ;; |
| 437 | ld8 r17=[r17] // fetch the L1 entry (may be 0) | 462 | ld8 r17=[r17] // fetch the L1 entry (may be 0) |
| 438 | ;; | 463 | ;; |
| 439 | (p7) cmp.eq p6,p7=r17,r0 // was L1 entry NULL? | 464 | (p7) cmp.eq p6,p7=r17,r0 // was L1 entry NULL? |
| 440 | dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry | 465 | dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry |
| 441 | ;; | 466 | ;; |
| 467 | #ifdef CONFIG_PGTABLE_4 | ||
| 442 | (p7) ld8 r17=[r17] // fetch the L2 entry (may be 0) | 468 | (p7) ld8 r17=[r17] // fetch the L2 entry (may be 0) |
| 443 | shr.u r19=r22,PAGE_SHIFT // shift L3 index into position | 469 | shr.u r18=r22,PMD_SHIFT // shift L3 index into position |
| 444 | ;; | 470 | ;; |
| 445 | (p7) cmp.eq.or.andcm p6,p7=r17,r0 // was L2 entry NULL? | 471 | (p7) cmp.eq.or.andcm p6,p7=r17,r0 // was L2 entry NULL? |
| 446 | dep r17=r19,r17,3,(PAGE_SHIFT-3) // compute address of L3 page table entry | 472 | dep r17=r18,r17,3,(PAGE_SHIFT-3) // compute address of L2 page table entry |
| 473 | ;; | ||
| 474 | #endif | ||
| 475 | (p7) ld8 r17=[r17] // fetch the L3 entry (may be 0) | ||
| 476 | shr.u r19=r22,PAGE_SHIFT // shift L4 index into position | ||
| 477 | ;; | ||
| 478 | (p7) cmp.eq.or.andcm p6,p7=r17,r0 // was L3 entry NULL? | ||
| 479 | dep r17=r19,r17,3,(PAGE_SHIFT-3) // compute address of L4 page table entry | ||
