diff options
| -rw-r--r-- | arch/powerpc/kernel/head_8xx.S | 41 |
1 files changed, 8 insertions, 33 deletions
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S index 73715cd0de45..32cc9e55b772 100644 --- a/arch/powerpc/kernel/head_8xx.S +++ b/arch/powerpc/kernel/head_8xx.S | |||
| @@ -329,12 +329,9 @@ InstructionTLBMiss: | |||
| 329 | /* Extract level 1 index */ | 329 | /* Extract level 1 index */ |
| 330 | rlwinm r10, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29 | 330 | rlwinm r10, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29 |
| 331 | lwzx r11, r10, r11 /* Get the level 1 entry */ | 331 | lwzx r11, r10, r11 /* Get the level 1 entry */ |
| 332 | rlwinm. r10, r11,0,0,19 /* Extract page descriptor page address */ | 332 | rlwinm r10, r11,0,0,19 /* Extract page descriptor page address */ |
| 333 | beq 2f /* If zero, don't try to find a pte */ | ||
| 334 | 333 | ||
| 335 | /* We have a pte table, so load the MI_TWC with the attributes | 334 | /* Load the MI_TWC with the attributes for this "segment." */ |
| 336 | * for this "segment." | ||
| 337 | */ | ||
| 338 | MTSPR_CPU6(SPRN_MI_TWC, r11, r3) /* Set segment attributes */ | 335 | MTSPR_CPU6(SPRN_MI_TWC, r11, r3) /* Set segment attributes */ |
| 339 | mfspr r11, SPRN_SRR0 /* Get effective address of fault */ | 336 | mfspr r11, SPRN_SRR0 /* Get effective address of fault */ |
| 340 | /* Extract level 2 index */ | 337 | /* Extract level 2 index */ |
| @@ -342,13 +339,11 @@ InstructionTLBMiss: | |||
| 342 | lwzx r10, r10, r11 /* Get the pte */ | 339 | lwzx r10, r10, r11 /* Get the pte */ |
| 343 | 340 | ||
| 344 | #ifdef CONFIG_SWAP | 341 | #ifdef CONFIG_SWAP |
| 345 | andi. r11, r10, _PAGE_ACCESSED | _PAGE_PRESENT | 342 | rlwinm r11, r10, 32-5, _PAGE_PRESENT |
| 346 | cmpwi cr0, r11, _PAGE_ACCESSED | _PAGE_PRESENT | 343 | and r11, r11, r10 |
| 347 | li r11, RPN_PATTERN | 344 | rlwimi r10, r11, 0, _PAGE_PRESENT |
| 348 | bne- cr0, 2f | ||
| 349 | #else | ||
| 350 | li r11, RPN_PATTERN | ||
| 351 | #endif | 345 | #endif |
| 346 | li r11, RPN_PATTERN | ||
| 352 | /* The Linux PTE won't go exactly into the MMU TLB. | 347 | /* The Linux PTE won't go exactly into the MMU TLB. |
| 353 | * Software indicator bits 21 and 28 must be clear. | 348 | * Software indicator bits 21 and 28 must be clear. |
| 354 | * Software indicator bits 24, 25, 26, and 27 must be | 349 | * Software indicator bits 24, 25, 26, and 27 must be |
| @@ -366,21 +361,6 @@ InstructionTLBMiss: | |||
| 366 | mfspr r10, SPRN_SPRG_SCRATCH2 | 361 | mfspr r10, SPRN_SPRG_SCRATCH2 |
| 367 | EXCEPTION_EPILOG_0 | 362 | EXCEPTION_EPILOG_0 |
| 368 | rfi | 363 | rfi |
| 369 | 2: | ||
| 370 | mfspr r10, SPRN_SRR1 | ||
| 371 | /* clear all error bits as TLB Miss | ||
| 372 | * sets a few unconditionally | ||
| 373 | */ | ||
| 374 | rlwinm r10, r10, 0, 0xffff | ||
| 375 | mtspr SPRN_SRR1, r10 | ||
| 376 | |||
| 377 | /* Restore registers */ | ||
| 378 | #ifdef CONFIG_8xx_CPU6 | ||
| 379 | mfspr r3, SPRN_DAR | ||
| 380 | mtspr SPRN_DAR, r11 /* Tag DAR */ | ||
| 381 | #endif | ||
| 382 | mfspr r10, SPRN_SPRG_SCRATCH2 | ||
| 383 | b InstructionTLBError1 | ||
| 384 | 364 | ||
| 385 | . = 0x1200 | 365 | . = 0x1200 |
| 386 | DataStoreTLBMiss: | 366 | DataStoreTLBMiss: |
| @@ -403,8 +383,6 @@ DataStoreTLBMiss: | |||
| 403 | /* Extract level 1 index */ | 383 | /* Extract level 1 index */ |
| 404 | rlwinm r10, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29 | 384 | rlwinm r10, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29 |
| 405 | lwzx r11, r10, r11 /* Get the level 1 entry */ | 385 | lwzx r11, r10, r11 /* Get the level 1 entry */ |
| 406 | rlwinm. r10, r11,0,0,19 /* Extract page descriptor page address */ | ||
| 407 | beq 2f /* If zero, don't try to find a pte */ | ||
| 408 | 386 | ||
| 409 | /* We have a pte table, so load fetch the pte from the table. | 387 | /* We have a pte table, so load fetch the pte from the table. |
| 410 | */ | 388 | */ |
| @@ -447,7 +425,7 @@ DataStoreTLBMiss: | |||
| 447 | * set. All other Linux PTE bits control the behavior | 425 | * set. All other Linux PTE bits control the behavior |
| 448 | * of the MMU. | 426 | * of the MMU. |
| 449 | */ | 427 | */ |
| 450 | 2: li r11, RPN_PATTERN | 428 | li r11, RPN_PATTERN |
| 451 | rlwimi r10, r11, 0, 24, 28 /* Set 24-27, clear 28 */ | 429 | rlwimi r10, r11, 0, 24, 28 /* Set 24-27, clear 28 */ |
| 452 | MTSPR_CPU6(SPRN_MD_RPN, r10, r3) /* Update TLB entry */ | 430 | MTSPR_CPU6(SPRN_MD_RPN, r10, r3) /* Update TLB entry */ |
| 453 | 431 | ||
| @@ -466,10 +444,7 @@ DataStoreTLBMiss: | |||
| 466 | */ | 444 | */ |
| 467 | . = 0x1300 | 445 | . = 0x1300 |
| 468 | InstructionTLBError: | 446 | InstructionTLBError: |
| 469 | EXCEPTION_PROLOG_0 | 447 | EXCEPTION_PROLOG |
| 470 | InstructionTLBError1: | ||
| 471 | EXCEPTION_PROLOG_1 | ||
| 472 | EXCEPTION_PROLOG_2 | ||
| 473 | mr r4,r12 | 448 | mr r4,r12 |
| 474 | mr r5,r9 | 449 | mr r5,r9 |
| 475 | andis. r10,r5,0x4000 | 450 | andis. r10,r5,0x4000 |
