diff options
Diffstat (limited to 'arch/powerpc/kernel/head_8xx.S')
-rw-r--r-- | arch/powerpc/kernel/head_8xx.S | 321 |
1 files changed, 200 insertions, 121 deletions
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S index 6ded19d01891..3ef743fa5d7c 100644 --- a/arch/powerpc/kernel/head_8xx.S +++ b/arch/powerpc/kernel/head_8xx.S | |||
@@ -206,6 +206,8 @@ MachineCheck: | |||
206 | EXCEPTION_PROLOG | 206 | EXCEPTION_PROLOG |
207 | mfspr r4,SPRN_DAR | 207 | mfspr r4,SPRN_DAR |
208 | stw r4,_DAR(r11) | 208 | stw r4,_DAR(r11) |
209 | li r5,0x00f0 | ||
210 | mtspr SPRN_DAR,r5 /* Tag DAR, to be used in DTLB Error */ | ||
209 | mfspr r5,SPRN_DSISR | 211 | mfspr r5,SPRN_DSISR |
210 | stw r5,_DSISR(r11) | 212 | stw r5,_DSISR(r11) |
211 | addi r3,r1,STACK_FRAME_OVERHEAD | 213 | addi r3,r1,STACK_FRAME_OVERHEAD |
@@ -222,6 +224,8 @@ DataAccess: | |||
222 | stw r10,_DSISR(r11) | 224 | stw r10,_DSISR(r11) |
223 | mr r5,r10 | 225 | mr r5,r10 |
224 | mfspr r4,SPRN_DAR | 226 | mfspr r4,SPRN_DAR |
227 | li r10,0x00f0 | ||
228 | mtspr SPRN_DAR,r10 /* Tag DAR, to be used in DTLB Error */ | ||
225 | EXC_XFER_EE_LITE(0x300, handle_page_fault) | 229 | EXC_XFER_EE_LITE(0x300, handle_page_fault) |
226 | 230 | ||
227 | /* Instruction access exception. | 231 | /* Instruction access exception. |
@@ -244,6 +248,8 @@ Alignment: | |||
244 | EXCEPTION_PROLOG | 248 | EXCEPTION_PROLOG |
245 | mfspr r4,SPRN_DAR | 249 | mfspr r4,SPRN_DAR |
246 | stw r4,_DAR(r11) | 250 | stw r4,_DAR(r11) |
251 | li r5,0x00f0 | ||
252 | mtspr SPRN_DAR,r5 /* Tag DAR, to be used in DTLB Error */ | ||
247 | mfspr r5,SPRN_DSISR | 253 | mfspr r5,SPRN_DSISR |
248 | stw r5,_DSISR(r11) | 254 | stw r5,_DSISR(r11) |
249 | addi r3,r1,STACK_FRAME_OVERHEAD | 255 | addi r3,r1,STACK_FRAME_OVERHEAD |
@@ -333,26 +339,20 @@ InstructionTLBMiss: | |||
333 | mfspr r11, SPRN_MD_TWC /* ....and get the pte address */ | 339 | mfspr r11, SPRN_MD_TWC /* ....and get the pte address */ |
334 | lwz r10, 0(r11) /* Get the pte */ | 340 | lwz r10, 0(r11) /* Get the pte */ |
335 | 341 | ||
336 | #ifdef CONFIG_SWAP | 342 | andi. r11, r10, _PAGE_ACCESSED | _PAGE_PRESENT |
337 | /* do not set the _PAGE_ACCESSED bit of a non-present page */ | 343 | cmpwi cr0, r11, _PAGE_ACCESSED | _PAGE_PRESENT |
338 | andi. r11, r10, _PAGE_PRESENT | 344 | bne- cr0, 2f |
339 | beq 4f | 345 | |
340 | ori r10, r10, _PAGE_ACCESSED | 346 | /* Clear PP lsb, 0x400 */ |
341 | mfspr r11, SPRN_MD_TWC /* get the pte address again */ | 347 | rlwinm r10, r10, 0, 22, 20 |
342 | stw r10, 0(r11) | ||
343 | 4: | ||
344 | #else | ||
345 | ori r10, r10, _PAGE_ACCESSED | ||
346 | stw r10, 0(r11) | ||
347 | #endif | ||
348 | 348 | ||
349 | /* The Linux PTE won't go exactly into the MMU TLB. | 349 | /* The Linux PTE won't go exactly into the MMU TLB. |
350 | * Software indicator bits 21, 22 and 28 must be clear. | 350 | * Software indicator bits 22 and 28 must be clear. |
351 | * Software indicator bits 24, 25, 26, and 27 must be | 351 | * Software indicator bits 24, 25, 26, and 27 must be |
352 | * set. All other Linux PTE bits control the behavior | 352 | * set. All other Linux PTE bits control the behavior |
353 | * of the MMU. | 353 | * of the MMU. |
354 | */ | 354 | */ |
355 | 2: li r11, 0x00f0 | 355 | li r11, 0x00f0 |
356 | rlwimi r10, r11, 0, 24, 28 /* Set 24-27, clear 28 */ | 356 | rlwimi r10, r11, 0, 24, 28 /* Set 24-27, clear 28 */ |
357 | DO_8xx_CPU6(0x2d80, r3) | 357 | DO_8xx_CPU6(0x2d80, r3) |
358 | mtspr SPRN_MI_RPN, r10 /* Update TLB entry */ | 358 | mtspr SPRN_MI_RPN, r10 /* Update TLB entry */ |
@@ -365,6 +365,22 @@ InstructionTLBMiss: | |||
365 | lwz r3, 8(r0) | 365 | lwz r3, 8(r0) |
366 | #endif | 366 | #endif |
367 | rfi | 367 | rfi |
368 | 2: | ||
369 | mfspr r11, SPRN_SRR1 | ||
370 | /* clear all error bits as TLB Miss | ||
371 | * sets a few unconditionally | ||
372 | */ | ||
373 | rlwinm r11, r11, 0, 0xffff | ||
374 | mtspr SPRN_SRR1, r11 | ||
375 | |||
376 | mfspr r10, SPRN_M_TW /* Restore registers */ | ||
377 | lwz r11, 0(r0) | ||
378 | mtcr r11 | ||
379 | lwz r11, 4(r0) | ||
380 | #ifdef CONFIG_8xx_CPU6 | ||
381 | lwz r3, 8(r0) | ||
382 | #endif | ||
383 | b InstructionAccess | ||
368 | 384 | ||
369 | . = 0x1200 | 385 | . = 0x1200 |
370 | DataStoreTLBMiss: | 386 | DataStoreTLBMiss: |
@@ -406,29 +422,45 @@ DataStoreTLBMiss: | |||
406 | * above. | 422 | * above. |
407 | */ | 423 | */ |
408 | rlwimi r11, r10, 0, 27, 27 | 424 | rlwimi r11, r10, 0, 27, 27 |
425 | /* Insert the WriteThru flag into the TWC from the Linux PTE. | ||
426 | * It is bit 25 in the Linux PTE and bit 30 in the TWC | ||
427 | */ | ||
428 | rlwimi r11, r10, 32-5, 30, 30 | ||
409 | DO_8xx_CPU6(0x3b80, r3) | 429 | DO_8xx_CPU6(0x3b80, r3) |
410 | mtspr SPRN_MD_TWC, r11 | 430 | mtspr SPRN_MD_TWC, r11 |
411 | 431 | ||
412 | #ifdef CONFIG_SWAP | 432 | /* Both _PAGE_ACCESSED and _PAGE_PRESENT has to be set. |
413 | /* do not set the _PAGE_ACCESSED bit of a non-present page */ | 433 | * We also need to know if the insn is a load/store, so: |
414 | andi. r11, r10, _PAGE_PRESENT | 434 | * Clear _PAGE_PRESENT and load that which will |
415 | beq 4f | 435 | * trap into DTLB Error with store bit set accordinly. |
416 | ori r10, r10, _PAGE_ACCESSED | 436 | */ |
417 | 4: | 437 | /* PRESENT=0x1, ACCESSED=0x20 |
418 | /* and update pte in table */ | 438 | * r11 = ((r10 & PRESENT) & ((r10 & ACCESSED) >> 5)); |
419 | #else | 439 | * r10 = (r10 & ~PRESENT) | r11; |
420 | ori r10, r10, _PAGE_ACCESSED | 440 | */ |
421 | #endif | 441 | rlwinm r11, r10, 32-5, _PAGE_PRESENT |
422 | mfspr r11, SPRN_MD_TWC /* get the pte address again */ | 442 | and r11, r11, r10 |
423 | stw r10, 0(r11) | 443 | rlwimi r10, r11, 0, _PAGE_PRESENT |
444 | |||
445 | /* Honour kernel RO, User NA */ | ||
446 | /* 0x200 == Extended encoding, bit 22 */ | ||
447 | /* r11 = (r10 & _PAGE_USER) >> 2 */ | ||
448 | rlwinm r11, r10, 32-2, 0x200 | ||
449 | or r10, r11, r10 | ||
450 | /* r11 = (r10 & _PAGE_RW) >> 1 */ | ||
451 | rlwinm r11, r10, 32-1, 0x200 | ||
452 | or r10, r11, r10 | ||
453 | /* invert RW and 0x200 bits */ | ||
454 | xori r10, r10, _PAGE_RW | 0x200 | ||
424 | 455 | ||
425 | /* The Linux PTE won't go exactly into the MMU TLB. | 456 | /* The Linux PTE won't go exactly into the MMU TLB. |
426 | * Software indicator bits 21, 22 and 28 must be clear. | 457 | * Software indicator bits 22 and 28 must be clear. |
427 | * Software indicator bits 24, 25, 26, and 27 must be | 458 | * Software indicator bits 24, 25, 26, and 27 must be |
428 | * set. All other Linux PTE bits control the behavior | 459 | * set. All other Linux PTE bits control the behavior |
429 | * of the MMU. | 460 | * of the MMU. |
430 | */ | 461 | */ |
431 | 2: li r11, 0x00f0 | 462 | 2: li r11, 0x00f0 |
463 | mtspr SPRN_DAR,r11 /* Tag DAR */ | ||
432 | rlwimi r10, r11, 0, 24, 28 /* Set 24-27, clear 28 */ | 464 | rlwimi r10, r11, 0, 24, 28 /* Set 24-27, clear 28 */ |
433 | DO_8xx_CPU6(0x3d80, r3) | 465 | DO_8xx_CPU6(0x3d80, r3) |
434 | mtspr SPRN_MD_RPN, r10 /* Update TLB entry */ | 466 | mtspr SPRN_MD_RPN, r10 /* Update TLB entry */ |
@@ -469,97 +501,10 @@ DataTLBError: | |||
469 | stw r10, 0(r0) | 501 | stw r10, 0(r0) |
470 | stw r11, 4(r0) | 502 | stw r11, 4(r0) |
471 | 503 | ||
472 | /* First, make sure this was a store operation. | ||
473 | */ | ||
474 | mfspr r10, SPRN_DSISR | ||
475 | andis. r11, r10, 0x0200 /* If set, indicates store op */ | ||
476 | beq 2f | ||
477 | |||
478 | /* The EA of a data TLB miss is automatically stored in the MD_EPN | ||
479 | * register. The EA of a data TLB error is automatically stored in | ||
480 | * the DAR, but not the MD_EPN register. We must copy the 20 most | ||
481 | * significant bits of the EA from the DAR to MD_EPN before we | ||
482 | * start walking the page tables. We also need to copy the CASID | ||
483 | * value from the M_CASID register. | ||
484 | * Addendum: The EA of a data TLB error is _supposed_ to be stored | ||
485 | * in DAR, but it seems that this doesn't happen in some cases, such | ||
486 | * as when the error is due to a dcbi instruction to a page with a | ||
487 | * TLB that doesn't have the changed bit set. In such cases, there | ||
488 | * does not appear to be any way to recover the EA of the error | ||
489 | * since it is neither in DAR nor MD_EPN. As a workaround, the | ||
490 | * _PAGE_HWWRITE bit is set for all kernel data pages when the PTEs | ||
491 | * are initialized in mapin_ram(). This will avoid the problem, | ||
492 | * assuming we only use the dcbi instruction on kernel addresses. | ||
493 | */ | ||
494 | mfspr r10, SPRN_DAR | 504 | mfspr r10, SPRN_DAR |
495 | rlwinm r11, r10, 0, 0, 19 | 505 | cmpwi cr0, r10, 0x00f0 |
496 | ori r11, r11, MD_EVALID | 506 | beq- FixupDAR /* must be a buggy dcbX, icbi insn. */ |
497 | mfspr r10, SPRN_M_CASID | 507 | DARFixed:/* Return from dcbx instruction bug workaround, r10 holds value of DAR */ |
498 | rlwimi r11, r10, 0, 28, 31 | ||
499 | DO_8xx_CPU6(0x3780, r3) | ||
500 | mtspr SPRN_MD_EPN, r11 | ||
501 | |||
502 | mfspr r10, SPRN_M_TWB /* Get level 1 table entry address */ | ||
503 | |||
504 | /* If we are faulting a kernel address, we have to use the | ||
505 | * kernel page tables. | ||
506 | */ | ||
507 | andi. r11, r10, 0x0800 | ||
508 | beq 3f | ||
509 | lis r11, swapper_pg_dir@h | ||
510 | ori r11, r11, swapper_pg_dir@l | ||
511 | rlwimi r10, r11, 0, 2, 19 | ||
512 | 3: | ||
513 | lwz r11, 0(r10) /* Get the level 1 entry */ | ||
514 | rlwinm. r10, r11,0,0,19 /* Extract page descriptor page address */ | ||
515 | beq 2f /* If zero, bail */ | ||
516 | |||
517 | /* We have a pte table, so fetch the pte from the table. | ||
518 | */ | ||
519 | ori r11, r11, 1 /* Set valid bit in physical L2 page */ | ||
520 | DO_8xx_CPU6(0x3b80, r3) | ||
521 | mtspr SPRN_MD_TWC, r11 /* Load pte table base address */ | ||
522 | mfspr r11, SPRN_MD_TWC /* ....and get the pte address */ | ||
523 | lwz r10, 0(r11) /* Get the pte */ | ||
524 | |||
525 | andi. r11, r10, _PAGE_RW /* Is it writeable? */ | ||
526 | beq 2f /* Bail out if not */ | ||
527 | |||
528 | /* Update 'changed', among others. | ||
529 | */ | ||
530 | #ifdef CONFIG_SWAP | ||
531 | ori r10, r10, _PAGE_DIRTY|_PAGE_HWWRITE | ||
532 | /* do not set the _PAGE_ACCESSED bit of a non-present page */ | ||
533 | andi. r11, r10, _PAGE_PRESENT | ||
534 | beq 4f | ||
535 | ori r10, r10, _PAGE_ACCESSED | ||
536 | 4: | ||
537 | #else | ||
538 | ori r10, r10, _PAGE_DIRTY|_PAGE_ACCESSED|_PAGE_HWWRITE | ||
539 | #endif | ||
540 | mfspr r11, SPRN_MD_TWC /* Get pte address again */ | ||
541 | stw r10, 0(r11) /* and update pte in table */ | ||
542 | |||
543 | /* The Linux PTE won't go exactly into the MMU TLB. | ||
544 | * Software indicator bits 21, 22 and 28 must be clear. | ||
545 | * Software indicator bits 24, 25, 26, and 27 must be | ||
546 | * set. All other Linux PTE bits control the behavior | ||
547 | * of the MMU. | ||
548 | */ | ||
549 | li r11, 0x00f0 | ||
550 | rlwimi r10, r11, 0, 24, 28 /* Set 24-27, clear 28 */ | ||
551 | DO_8xx_CPU6(0x3d80, r3) | ||
552 | mtspr SPRN_MD_RPN, r10 /* Update TLB entry */ | ||
553 | |||
554 | mfspr r10, SPRN_M_TW /* Restore registers */ | ||
555 | lwz r11, 0(r0) | ||
556 | mtcr r11 | ||
557 | lwz r11, 4(r0) | ||
558 | #ifdef CONFIG_8xx_CPU6 | ||
559 | lwz r3, 8(r0) | ||
560 | #endif | ||
561 | rfi | ||
562 | 2: | ||
563 | mfspr r10, SPRN_M_TW /* Restore registers */ | 508 | mfspr r10, SPRN_M_TW /* Restore registers */ |
564 | lwz r11, 0(r0) | 509 | lwz r11, 0(r0) |
565 | mtcr r11 | 510 | mtcr r11 |
@@ -588,6 +533,140 @@ DataTLBError: | |||
588 | 533 | ||
589 | . = 0x2000 | 534 | . = 0x2000 |
590 | 535 | ||
536 | /* This is the procedure to calculate the data EA for buggy dcbx,dcbi instructions | ||
537 | * by decoding the registers used by the dcbx instruction and adding them. | ||
538 | * DAR is set to the calculated address and r10 also holds the EA on exit. | ||
539 | */ | ||
540 | /* define if you don't want to use self modifying code */ | ||
541 | #define NO_SELF_MODIFYING_CODE | ||
542 | FixupDAR:/* Entry point for dcbx workaround. */ | ||
543 | /* fetch instruction from memory. */ | ||
544 | mfspr r10, SPRN_SRR0 | ||
545 | andis. r11, r10, 0x8000 /* Address >= 0x80000000 */ | ||
546 | DO_8xx_CPU6(0x3780, r3) | ||
547 | mtspr SPRN_MD_EPN, r10 | ||
548 | mfspr r11, SPRN_M_TWB /* Get level 1 table entry address */ | ||
549 | beq- 3f /* Branch if user space */ | ||
550 | lis r11, (swapper_pg_dir-PAGE_OFFSET)@h | ||
551 | ori r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l | ||
552 | rlwimi r11, r10, 32-20, 0xffc /* r11 = r11&~0xffc|(r10>>20)&0xffc */ | ||
553 | 3: lwz r11, 0(r11) /* Get the level 1 entry */ | ||
554 | DO_8xx_CPU6(0x3b80, r3) | ||
555 | mtspr SPRN_MD_TWC, r11 /* Load pte table base address */ | ||
556 | mfspr r11, SPRN_MD_TWC /* ....and get the pte address */ | ||
557 | lwz r11, 0(r11) /* Get the pte */ | ||
558 | /* concat physical page address(r11) and page offset(r10) */ | ||
559 | rlwimi r11, r10, 0, 20, 31 | ||
560 | lwz r11,0(r11) | ||
561 | /* Check if it really is a dcbx instruction. */ | ||
562 | /* dcbt and dcbtst does not generate DTLB Misses/Errors, | ||
563 | * no need to include them here */ | ||
564 | srwi r10, r11, 26 /* check if major OP code is 31 */ | ||
565 | cmpwi cr0, r10, 31 | ||
566 | bne- 141f | ||
567 | rlwinm r10, r11, 0, 21, 30 | ||
568 | cmpwi cr0, r10, 2028 /* Is dcbz? */ | ||
569 | beq+ 142f | ||
570 | cmpwi cr0, r10, 940 /* Is dcbi? */ | ||
571 | beq+ 142f | ||
572 | cmpwi cr0, r10, 108 /* Is dcbst? */ | ||
573 | beq+ 144f /* Fix up store bit! */ | ||
574 | cmpwi cr0, r10, 172 /* Is dcbf? */ | ||
575 | beq+ 142f | ||
576 | cmpwi cr0, r10, 1964 /* Is icbi? */ | ||
577 | beq+ 142f | ||
578 | 141: mfspr r10, SPRN_DAR /* r10 must hold DAR at exit */ | ||
579 | b DARFixed /* Nope, go back to normal TLB processing */ | ||
580 | |||
581 | 144: mfspr r10, SPRN_DSISR | ||
582 | rlwinm r10, r10,0,7,5 /* Clear store bit for buggy dcbst insn */ | ||
583 | mtspr SPRN_DSISR, r10 | ||
584 | 142: /* continue, it was a dcbx, dcbi instruction. */ | ||
585 | #ifdef CONFIG_8xx_CPU6 | ||
586 | lwz r3, 8(r0) /* restore r3 from memory */ | ||
587 | #endif | ||
588 | #ifndef NO_SELF_MODIFYING_CODE | ||
589 | andis. r10,r11,0x1f /* test if reg RA is r0 */ | ||
590 | li r10,modified_instr@l | ||
591 | dcbtst r0,r10 /* touch for store */ | ||
592 | rlwinm r11,r11,0,0,20 /* Zero lower 10 bits */ | ||
593 | oris r11,r11,640 /* Transform instr. to a "add r10,RA,RB" */ | ||
594 | ori r11,r11,532 | ||
595 | stw r11,0(r10) /* store add/and instruction */ | ||
596 | dcbf 0,r10 /* flush new instr. to memory. */ | ||
597 | icbi 0,r10 /* invalidate instr. cache line */ | ||
598 | lwz r11, 4(r0) /* restore r11 from memory */ | ||
599 | mfspr r10, SPRN_M_TW /* restore r10 from M_TW */ | ||
600 | isync /* Wait until new instr is loaded from memory */ | ||
601 | modified_instr: | ||
602 | .space 4 /* this is where the add instr. is stored */ | ||
603 | bne+ 143f | ||
604 | subf r10,r0,r10 /* r10=r10-r0, only if reg RA is r0 */ | ||
605 | 143: mtdar r10 /* store faulting EA in DAR */ | ||
606 | b DARFixed /* Go back to normal TLB handling */ | ||
607 | #else | ||
608 | mfctr r10 | ||
609 | mtdar r10 /* save ctr reg in DAR */ | ||
610 | rlwinm r10, r11, 24, 24, 28 /* offset into jump table for reg RB */ | ||
611 | addi r10, r10, 150f@l /* add start of table */ | ||
612 | mtctr r10 /* load ctr with jump address */ | ||
613 | xor r10, r10, r10 /* sum starts at zero */ | ||
614 | bctr /* jump into table */ | ||
615 | 150: | ||
616 | add r10, r10, r0 ;b 151f | ||
617 | add r10, r10, r1 ;b 151f | ||
618 | add r10, r10, r2 ;b 151f | ||
619 | add r10, r10, r3 ;b 151f | ||
620 | add r10, r10, r4 ;b 151f | ||
621 | add r10, r10, r5 ;b 151f | ||
622 | add r10, r10, r6 ;b 151f | ||
623 | add r10, r10, r7 ;b 151f | ||
624 | add r10, r10, r8 ;b 151f | ||
625 | add r10, r10, r9 ;b 151f | ||
626 | mtctr r11 ;b 154f /* r10 needs special handling */ | ||
627 | mtctr r11 ;b 153f /* r11 needs special handling */ | ||
628 | add r10, r10, r12 ;b 151f | ||
629 | add r10, r10, r13 ;b 151f | ||
630 | add r10, r10, r14 ;b 151f | ||
631 | add r10, r10, r15 ;b 151f | ||
632 | add r10, r10, r16 ;b 151f | ||
633 | add r10, r10, r17 ;b 151f | ||
634 | add r10, r10, r18 ;b 151f | ||
635 | add r10, r10, r19 ;b 151f | ||
636 | add r10, r10, r20 ;b 151f | ||
637 | add r10, r10, r21 ;b 151f | ||
638 | add r10, r10, r22 ;b 151f | ||
639 | add r10, r10, r23 ;b 151f | ||
640 | add r10, r10, r24 ;b 151f | ||
641 | add r10, r10, r25 ;b 151f | ||
642 | add r10, r10, r26 ;b 151f | ||
643 | add r10, r10, r27 ;b 151f | ||
644 | add r10, r10, r28 ;b 151f | ||
645 | add r10, r10, r29 ;b 151f | ||
646 | add r10, r10, r30 ;b 151f | ||
647 | add r10, r10, r31 | ||
648 | 151: | ||
649 | rlwinm. r11,r11,19,24,28 /* offset into jump table for reg RA */ | ||
650 | beq 152f /* if reg RA is zero, don't add it */ | ||
651 | addi r11, r11, 150b@l /* add start of table */ | ||
652 | mtctr r11 /* load ctr with jump address */ | ||
653 | rlwinm r11,r11,0,16,10 /* make sure we don't execute this more than once */ | ||
654 | bctr /* jump into table */ | ||
655 | 152: | ||
656 | mfdar r11 | ||
657 | mtctr r11 /* restore ctr reg from DAR */ | ||
658 | mtdar r10 /* save fault EA to DAR */ | ||
659 | b DARFixed /* Go back to normal TLB handling */ | ||
660 | |||
661 | /* special handling for r10,r11 since these are modified already */ | ||
662 | 153: lwz r11, 4(r0) /* load r11 from memory */ | ||
663 | b 155f | ||
664 | 154: mfspr r11, SPRN_M_TW /* load r10 from M_TW */ | ||
665 | 155: add r10, r10, r11 /* add it */ | ||
666 | mfctr r11 /* restore r11 */ | ||
667 | b 151b | ||
668 | #endif | ||
669 | |||
591 | .globl giveup_fpu | 670 | .globl giveup_fpu |
592 | giveup_fpu: | 671 | giveup_fpu: |
593 | blr | 672 | blr |
@@ -689,12 +768,12 @@ start_here: | |||
689 | */ | 768 | */ |
690 | initial_mmu: | 769 | initial_mmu: |
691 | tlbia /* Invalidate all TLB entries */ | 770 | tlbia /* Invalidate all TLB entries */ |
692 | #ifdef CONFIG_PIN_TLB | 771 | /* Always pin the first 8 MB ITLB to prevent ITLB |
772 | misses while mucking around with SRR0/SRR1 in asm | ||
773 | */ | ||
693 | lis r8, MI_RSV4I@h | 774 | lis r8, MI_RSV4I@h |
694 | ori r8, r8, 0x1c00 | 775 | ori r8, r8, 0x1c00 |
695 | #else | 776 | |
696 | li r8, 0 | ||
697 | #endif | ||
698 | mtspr SPRN_MI_CTR, r8 /* Set instruction MMU control */ | 777 | mtspr SPRN_MI_CTR, r8 /* Set instruction MMU control */ |
699 | 778 | ||
700 | #ifdef CONFIG_PIN_TLB | 779 | #ifdef CONFIG_PIN_TLB |