Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 18334
b: refs/heads/master
c: 8f069b1
h: refs/heads/master
v: v3
  • Loading branch information
Marcelo Tosatti authored and Paul Mackerras committed Jan 14, 2006
1 parent 056b0d6 commit ecbeda2
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7d13d21ae85f64e35dcdae4d6a6286e62a38e0ab
refs/heads/master: 8f069b1a90bd97bf6d59a02ecabf0173d9175609
77 changes: 77 additions & 0 deletions trunk/arch/ppc/kernel/head_8xx.S
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,8 @@ DataStoreTLBMiss:
lis r11, swapper_pg_dir@h
ori r11, r11, swapper_pg_dir@l
rlwimi r10, r11, 0, 2, 19
stw r12, 16(r0)
b LoadLargeDTLB
3:
lwz r11, 0(r10) /* Get the level 1 entry */
rlwinm. r10, r11,0,0,19 /* Extract page descriptor page address */
Expand Down Expand Up @@ -430,6 +432,81 @@ DataStoreTLBMiss:
InstructionTLBError:
b InstructionAccess

LoadLargeDTLB:
li r12, 0
lwz r11, 0(r10) /* Get the level 1 entry */
rlwinm. r10, r11,0,0,19 /* Extract page descriptor page address */
beq 3f /* If zero, don't try to find a pte */

/* We have a pte table, so load fetch the pte from the table.
*/
ori r11, r11, 1 /* Set valid bit in physical L2 page */
DO_8xx_CPU6(0x3b80, r3)
mtspr SPRN_MD_TWC, r11 /* Load pte table base address */
mfspr r10, SPRN_MD_TWC /* ....and get the pte address */
lwz r10, 0(r10) /* Get the pte */

/* Insert the Guarded flag into the TWC from the Linux PTE.
* It is bit 27 of both the Linux PTE and the TWC (at least
* I got that right :-). It will be better when we can put
* this into the Linux pgd/pmd and load it in the operation
* above.
*/
rlwimi r11, r10, 0, 27, 27

rlwimi r12, r10, 0, 0, 9 /* extract phys. addr */
mfspr r3, SPRN_MD_EPN
rlwinm r3, r3, 0, 0, 9 /* extract virtual address */
tophys(r3, r3)
cmpw r3, r12 /* only use 8M page if it is a direct
kernel mapping */
bne 1f
ori r11, r11, MD_PS8MEG
li r12, 1
b 2f
1:
li r12, 0 /* can't use 8MB TLB, so zero r12. */
2:
DO_8xx_CPU6(0x3b80, r3)
mtspr SPRN_MD_TWC, r11

/* The Linux PTE won't go exactly into the MMU TLB.
* Software indicator bits 21, 22 and 28 must be clear.
* Software indicator bits 24, 25, 26, and 27 must be
* set. All other Linux PTE bits control the behavior
* of the MMU.
*/
3: li r11, 0x00f0
rlwimi r10, r11, 0, 24, 28 /* Set 24-27, clear 28 */
cmpwi r12, 1
bne 4f
ori r10, r10, 0x8

mfspr r12, SPRN_MD_EPN
lis r3, 0xff80 /* 10-19 must be clear for 8MB TLB */
ori r3, r3, 0x0fff
and r12, r3, r12
DO_8xx_CPU6(0x3780, r3)
mtspr SPRN_MD_EPN, r12

lis r3, 0xff80 /* 10-19 must be clear for 8MB TLB */
ori r3, r3, 0x0fff
and r10, r3, r10
4:
DO_8xx_CPU6(0x3d80, r3)
mtspr SPRN_MD_RPN, r10 /* Update TLB entry */

mfspr r10, SPRN_M_TW /* Restore registers */
lwz r11, 0(r0)
mtcr r11
lwz r11, 4(r0)

lwz r12, 16(r0)
#ifdef CONFIG_8xx_CPU6
lwz r3, 8(r0)
#endif
rfi

/* This is the data TLB error on the MPC8xx. This could be due to
* many reasons, including a dirty update to a pte. We can catch that
* one here, but anything else is an error. First, we track down the
Expand Down

0 comments on commit ecbeda2

Please sign in to comment.