Commit 33fb845a authored by LEROY Christophe's avatar LEROY Christophe Committed by Scott Wood

powerpc/8xx: Don't use MD_TWC for walk

MD_TWC can only be used properly with 4k pages.
So lets calculate level 2 table index by ourselves.
Signed-off-by: default avatarChristophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: default avatarScott Wood <scottwood@freescale.com>
parent cbc130f1
...@@ -299,8 +299,6 @@ InstructionTLBMiss: ...@@ -299,8 +299,6 @@ InstructionTLBMiss:
addi r11, r10, -0x1000 addi r11, r10, -0x1000
tlbie r11 tlbie r11
#endif #endif
DO_8xx_CPU6(0x3780, r3)
mtspr SPRN_MD_EPN, r10 /* Have to use MD_EPN for walk, MI_EPN can't */
/* If we are faulting a kernel address, we have to use the /* If we are faulting a kernel address, we have to use the
* kernel page tables. * kernel page tables.
...@@ -328,10 +326,9 @@ InstructionTLBMiss: ...@@ -328,10 +326,9 @@ InstructionTLBMiss:
ori r11,r11,1 /* Set valid bit */ ori r11,r11,1 /* Set valid bit */
DO_8xx_CPU6(0x2b80, r3) DO_8xx_CPU6(0x2b80, r3)
mtspr SPRN_MI_TWC, r11 /* Set segment attributes */ mtspr SPRN_MI_TWC, r11 /* Set segment attributes */
DO_8xx_CPU6(0x3b80, r3) mfspr r11, SPRN_SRR0 /* Get effective address of fault */
mtspr SPRN_MD_TWC, r11 /* Load pte table base address */ rlwinm r11, r11, 22, 20, 29 /* Extract level 2 index */
mfspr r11, SPRN_MD_TWC /* ....and get the pte address */ lwzx r10, r10, r11 /* Get the pte */
lwz r10, 0(r11) /* Get the pte */
#ifdef CONFIG_SWAP #ifdef CONFIG_SWAP
andi. r11, r10, _PAGE_ACCESSED | _PAGE_PRESENT andi. r11, r10, _PAGE_ACCESSED | _PAGE_PRESENT
...@@ -397,12 +394,13 @@ DataStoreTLBMiss: ...@@ -397,12 +394,13 @@ DataStoreTLBMiss:
/* We have a pte table, so load fetch the pte from the table. /* We have a pte table, so load fetch the pte from the table.
*/ */
ori r11, r11, 1 /* Set valid bit in physical L2 page */ mfspr r10, SPRN_MD_EPN /* Get address of fault */
DO_8xx_CPU6(0x3b80, r3) /* Extract level 2 index */
mtspr SPRN_MD_TWC, r11 /* Load pte table base address */ rlwinm r10, r10, 22, 20, 29
mfspr r10, SPRN_MD_TWC /* ....and get the pte address */ rlwimi r10, r11, 0, 0, 19 /* Add level 2 base */
lwz r10, 0(r10) /* Get the pte */ lwz r10, 0(r10) /* Get the pte */
ori r11, r11, 1 /* Set valid bit in physical L2 page */
/* Insert the Guarded flag into the TWC from the Linux 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 * 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 * I got that right :-). It will be better when we can put
...@@ -528,18 +526,16 @@ FixupDAR:/* Entry point for dcbx workaround. */ ...@@ -528,18 +526,16 @@ FixupDAR:/* Entry point for dcbx workaround. */
/* fetch instruction from memory. */ /* fetch instruction from memory. */
mfspr r10, SPRN_SRR0 mfspr r10, SPRN_SRR0
andis. r11, r10, 0x8000 /* Address >= 0x80000000 */ andis. r11, r10, 0x8000 /* Address >= 0x80000000 */
DO_8xx_CPU6(0x3780, r3)
mtspr SPRN_MD_EPN, r10
mfspr r11, SPRN_M_TW /* Get level 1 table base address */ mfspr r11, SPRN_M_TW /* Get level 1 table base address */
beq- 3f /* Branch if user space */ beq- 3f /* Branch if user space */
lis r11, (swapper_pg_dir-PAGE_OFFSET)@h lis r11, (swapper_pg_dir-PAGE_OFFSET)@h
ori r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l ori r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
3: rlwinm r10, r10, 12, 20, 29 /* Extract level 1 index */ 3: rlwinm r10, r10, 12, 20, 29 /* Extract level 1 index */
lwzx r11, r10, r11 /* Get the level 1 entry */ lwzx r11, r10, r11 /* Get the level 1 entry */
DO_8xx_CPU6(0x3b80, r3) rlwinm r10, r11,0,0,19 /* Extract page descriptor page address */
mtspr SPRN_MD_TWC, r11 /* Load pte table base address */ mfspr r11, SPRN_SRR0 /* Get effective address of fault */
mfspr r11, SPRN_MD_TWC /* ....and get the pte address */ rlwinm r11, r11, 22, 20, 29 /* Extract level 2 index */
lwz r11, 0(r11) /* Get the pte */ lwzx r11, r10, r11 /* Get the pte */
#ifdef CONFIG_8xx_CPU6 #ifdef CONFIG_8xx_CPU6
lwz r3, 8(r0) /* restore r3 from memory */ lwz r3, 8(r0) /* restore r3 from memory */
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment