Dan Malek <ppc6...@digitaldans.com> wrote on 2011/06/14 20:11:18: > > Hi Joakim. > > On Jun 14, 2011, at 11:00 AM, Joakim Tjernlund wrote: > > > I don't have a mpc850, do you? > > I have to say I do :-) > > > Probably but that is another matter. You could continue with that > > if you like but I am stopping here ATM. > > Oh, come on... I've been thinking about this for years, wouldn't > you like to work on it? It will be fun :-)
OK, it was fun :) This is a quick impl. for kernel ITLBs. What do you think? diff --git a/arch/ppc/kernel/head_8xx.S b/arch/ppc/kernel/head_8xx.S index 0f9080c..88278b4 100644 --- a/arch/ppc/kernel/head_8xx.S +++ b/arch/ppc/kernel/head_8xx.S @@ -33,6 +33,7 @@ #include <asm/ppc_asm.h> #include "ppc_defs.h" +#undef CONFIG_PIN_TLB /* Macro to make the code more readable. */ #ifdef CONFIG_8xx_CPU6 #define DO_8xx_CPU6(val, reg) \ @@ -357,17 +358,23 @@ InstructionTLBMiss: /* If we are faulting a kernel address, we have to use the * kernel page tables. */ -#ifdef CONFIG_MODULES - /* Since we PIN the first 8MB text, we only get ITLB misses - * for modules - */ andi. r21, r20, 0x0800 /* Address >= 0x80000000 */ beq 3f +#ifdef CONFIG_MODULES lis r21, swapper_pg_dir@h ori r21, r21, swapper_pg_dir@l rlwimi r20, r21, 0, 2, 19 -3: + lwz r21, 0(r20) /* Get the level 1 entry */ + tophys(r21,r21) + ori r21, r21, MI_PS8MEG | MI_SVALID /* Set 8M byte page */ +#else + li r21, MI_PS8MEG | MI_SVALID /* Set 8M byte page */ #endif + DO_8xx_CPU6(0x2b80, r3) + mtspr MI_TWC, r21 /* Set segment attributes */ + li r20, MI_BOOTINIT + b 5f +3: lwz r21, 0(r20) /* Get the level 1 entry */ rlwinm. r20, r21,0,0,19 /* Extract page descriptor page address */ @@ -401,7 +408,7 @@ InstructionTLBMiss: */ 2: li r21, 0x00f0 rlwimi r20, r21, 0, 0x07f8 /* Set 24-27, clear 21-23,28 */ - DO_8xx_CPU6(0x2d80, r3) +5: DO_8xx_CPU6(0x2d80, r3) mtspr MI_RPN, r20 /* Update TLB entry */ mfspr r20, M_TW /* Restore registers */ @@ -942,13 +949,16 @@ start_here: */ initial_mmu: tlbia /* Invalidate all TLB entries */ - +#ifdef CONFIG_PIN_TLB +//#if 1 /* Always pin the first 8 MB ITLB to prevent ITLB misses while mucking around with SRR0/SRR1 in asm */ lis r8, MI_RSV4I@h ori r8, r8, 0x1c00 - +#else + li r8, 0 +#endif mtspr MI_CTR, r8 /* Set instruction MMU control */ #ifdef CONFIG_PIN_TLB _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev