Commit fde5a905 authored by LEROY Christophe's avatar LEROY Christophe Committed by Scott Wood

powerpc/8xx: Optimise access to swapper_pg_dir

All accessed to PGD entries are done via 0(r11).
By using lower part of swapper_pg_dir as load index to r11, we can remove the
ori instruction.
Signed-off-by: default avatarChristophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: default avatarScott Wood <scottwood@freescale.com>
parent 17bb312f
...@@ -319,16 +319,15 @@ InstructionTLBMiss: ...@@ -319,16 +319,15 @@ InstructionTLBMiss:
* pin the first 8MB of kernel memory */ * pin the first 8MB of kernel memory */
andis. r11, r10, 0x8000 /* Address >= 0x80000000 */ andis. r11, r10, 0x8000 /* Address >= 0x80000000 */
#endif #endif
mfspr r11, SPRN_M_TW /* Get level 1 table base address */ mfspr r11, SPRN_M_TW /* Get level 1 table */
#ifdef CONFIG_MODULES #ifdef CONFIG_MODULES
beq 3f beq 3f
lis r11, (swapper_pg_dir-PAGE_OFFSET)@h lis r11, (swapper_pg_dir-PAGE_OFFSET)@ha
ori r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
3: 3:
#endif #endif
/* Insert level 1 index */ /* Insert level 1 index */
rlwimi r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29 rlwimi r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
lwz r11, 0(r11) /* Get the level 1 entry */ lwz r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11) /* Get the level 1 entry */
/* Load the MI_TWC with the attributes for this "segment." */ /* Load the MI_TWC with the attributes for this "segment." */
MTSPR_CPU6(SPRN_MI_TWC, r11, r3) /* Set segment attributes */ MTSPR_CPU6(SPRN_MI_TWC, r11, r3) /* Set segment attributes */
...@@ -374,14 +373,13 @@ DataStoreTLBMiss: ...@@ -374,14 +373,13 @@ DataStoreTLBMiss:
* kernel page tables. * kernel page tables.
*/ */
andis. r11, r10, 0x8000 andis. r11, r10, 0x8000
mfspr r11, SPRN_M_TW /* Get level 1 table base address */ mfspr r11, SPRN_M_TW /* Get level 1 table */
beq 3f beq 3f
lis r11, (swapper_pg_dir-PAGE_OFFSET)@h lis r11, (swapper_pg_dir-PAGE_OFFSET)@ha
ori r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
3: 3:
/* Insert level 1 index */ /* Insert level 1 index */
rlwimi r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29 rlwimi r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
lwz r11, 0(r11) /* Get the level 1 entry */ lwz r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11) /* Get the level 1 entry */
/* 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.
*/ */
...@@ -506,13 +504,12 @@ FixupDAR:/* Entry point for dcbx workaround. */ ...@@ -506,13 +504,12 @@ 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 */
mfspr r11, SPRN_M_TW /* Get level 1 table base address */ mfspr r11, SPRN_M_TW /* Get level 1 table */
beq- 3f /* Branch if user space */ beq 3f
lis r11, (swapper_pg_dir-PAGE_OFFSET)@h lis r11, (swapper_pg_dir-PAGE_OFFSET)@ha
ori r11, r11, (swapper_pg_dir-PAGE_OFFSET)@l
/* Insert level 1 index */ /* Insert level 1 index */
3: rlwimi r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29 3: rlwimi r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
lwz r11, 0(r11) /* Get the level 1 entry */ lwz r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11) /* Get the level 1 entry */
rlwinm r11, r11,0,0,19 /* Extract page descriptor page address */ rlwinm r11, r11,0,0,19 /* Extract page descriptor page address */
/* Insert level 2 index */ /* Insert level 2 index */
rlwimi r11, r10, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29 rlwimi r11, r10, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29
...@@ -667,8 +664,7 @@ start_here: ...@@ -667,8 +664,7 @@ start_here:
* init's THREAD like the context switch code does, but this is * init's THREAD like the context switch code does, but this is
* easier......until someone changes init's static structures. * easier......until someone changes init's static structures.
*/ */
lis r6, swapper_pg_dir@h lis r6, swapper_pg_dir@ha
ori r6, r6, swapper_pg_dir@l
tophys(r6,r6) tophys(r6,r6)
#ifdef CONFIG_8xx_CPU6 #ifdef CONFIG_8xx_CPU6
lis r4, cpu6_errata_word@h lis r4, cpu6_errata_word@h
...@@ -847,6 +843,13 @@ _GLOBAL(set_context) ...@@ -847,6 +843,13 @@ _GLOBAL(set_context)
stw r4, 0x4(r5) stw r4, 0x4(r5)
#endif #endif
/* Register M_TW will contain base address of level 1 table minus the
* lower part of the kernel PGDIR base address, so that all accesses to
* level 1 table are done relative to lower part of kernel PGDIR base
* address.
*/
li r5, (swapper_pg_dir-PAGE_OFFSET)@l
sub r4, r4, r5
#ifdef CONFIG_8xx_CPU6 #ifdef CONFIG_8xx_CPU6
lis r6, cpu6_errata_word@h lis r6, cpu6_errata_word@h
ori r6, r6, cpu6_errata_word@l ori r6, r6, cpu6_errata_word@l
...@@ -854,7 +857,7 @@ _GLOBAL(set_context) ...@@ -854,7 +857,7 @@ _GLOBAL(set_context)
li r7, 0x3f80 li r7, 0x3f80
stw r7, 12(r6) stw r7, 12(r6)
lwz r7, 12(r6) lwz r7, 12(r6)
mtspr SPRN_M_TW, r4 /* Update MMU base address */ mtspr SPRN_M_TW, r4 /* Update pointeur to level 1 table */
li r7, 0x3380 li r7, 0x3380
stw r7, 12(r6) stw r7, 12(r6)
lwz r7, 12(r6) lwz r7, 12(r6)
......
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