Marcelo Tosatti wrote: > Hi, > > On Tue, May 03, 2005 at 11:14:39AM -0700, Conn Clark wrote: > >>Marcelo Tosatti wrote: >> >>>Hi 8xx folks, >> >><SNIP> >> >>>Actually, CONFIG_PIN_TLB slowdowns the system, as expected (there are only >>>28 usable TLB's instead of 32). >>> >>> >>>v2.6 CONFIG_PIN_TLB: >>>I-TLB userspace misses: 162113 >>>I-TLB kernel misses: 135911 >>>D-TLB userspace misses: 289452 >>>D-TLB kernel misses: 257039 >>> >>>v2.6 without CONFIG_PIN_TLB: >>>I-TLB userspace misses: 160828 >>>I-TLB kernel misses: 134746 >>>D-TLB userspace misses: 253557 >>>D-TLB kernel misses: 227383 >>> >>> >> >>Considering that the TLB kernel misses are higher with tlb pinning it >>appears as though the pinned TLBs are not marked as valid. > > > Yep > > >>>The following BDI output shows the pinned, 8MByte data page mapping >>>present, >>>at 0xc0000000. >>> >>>BDI>rds 826 >>>SPR 826 : 0x00007f00 32512 >>>BDI>rms 792 0x0c001C00 >>>BDI>rms 824 1 >>>BDI>rds 824 >>>SPR 824 : 0xc00000f0 -1073741584 >>>BDI>rds 825 >>>SPR 825 : 0x00000fe0 4064 >>>BDI>rds 826 >>>SPR 826 : 0x00007fff 32767 <- "0x00007fff" was 0x00007f00" >>>initially. I tried enabling >>> usermode access without >>> success. >>> >>>There are several 4Kb mappings inside the range covered by this 8Mb TLB >>>entry, for example: >>> >>>BDI>rms 792 0x0c000200 >>>BDI>rms 824 1 >>>BDI>rds 824 >>>SPR 824 : 0xc0224f17 -1071493353 >>>BDI>rds 825 >>>SPR 825 : 0x002241e0 2245088 >>>BDI>rds 826 >>>SPR 826 : 0x00007f00 32512 >>> >>>And more, without so much detail: >>>SPR 824 : 0xc0224f17 -1071493353 >>>SPR 824 : 0xc01fbf17 -1071661289 >>>SPR 824 : 0xc0246f17 -1071354089 >>>SPR 824 : 0xc023ff17 -1071382761 >>>SPR 824 : 0xc7e35f17 - 941400297 >>>SPR 824 : 0xc0244f17 -1071362281 >>>SPR 824 : 0xc023ef17 -1071386857 >>> >>>Note that protection (SPR 826) is exactly the same as the 8Mbyte page >>>protection. >>>Why is the translation mechanism rejection the pinned mappings? >>> >>>Dan, have you ever seen this work? Am I misunderstanding how the pinned >>>entries are supposed to work? >> >>When you load the Mx_EPN of the pinned area is the EV bit being set? > > > Yep. > > > "MD_RAM1" (SPR 826) is set: > > SPR 826 : 0x00007fff 32767 <- "0x00007fff" was 0x00007f00" > > Bits 17 and 18 are set. Their meaning is: "Change bit for DTLB entry" and > "Entry valid flag" respectively. > Bits 19...23 are also set, they represent supervisor access. Note that > bit 23 "supervisor access type" is set: 0 is read-only, 1 is read-write. > > so everything looks OK here. > > "MD_RAM0": > > SPR 825 : 0x00000fe0 4064 > > Bits 20...26 are set. > > 20-22: 8Mbyte page set. > 23-26: APGI (access protection group in 1's complement) set. It is > zero (1111 in 1's complement). > 27: guarded memory not set. > > "MD_CAM": > > SPR 824 : 0xc00000f0 -1073741584 > > Bits 24-27 are set. > > 24-26 is "page size" (111 = 8Mb) and 27 indicates "shared page" > (ASID comparisong disabled). > > The 8Mbyte page is used at boot, from "start_here" until "MMU_init()" > gets called... > > The manual says, section "9.3 Address Translation" > > "When TLB logic detects that a new effective page number (EPN) overlaps > one in the TLB (when taking into account page sizes, subpage validity flags, > user/supervisor state, etc. the new EPN is written and the old one is > invalidated." > > I'm trying to boot a kernel which does not create kernel pte's > from 0xc000000 till 0xc080000. >
Well, looking at the sources I currently have, 2.6.8 and 2.4.27, I noticed that InstructionTLBMiss in 2.6 is missing some ifdefs that the 2.4 has that pertain to TLB pinning. Otherwise the code appears basically the same. **** begin 2.6.8 code **** InstructionTLBMiss: #ifdef CONFIG_8xx_CPU6 stw r3, 8(r0) li r3, 0x3f80 stw r3, 12(r0) lwz r3, 12(r0) #endif mtspr M_TW, r20 /* Save a couple of working registers */ mfcr r20 stw r20, 0(r0) stw r21, 4(r0) mfspr r20, SRR0 /* Get effective address of fault */ #ifdef CONFIG_8xx_CPU6 li r3, 0x3780 stw r3, 12(r0) lwz r3, 12(r0) #endif mtspr MD_EPN, r20 /* Have to use MD_EPN for walk, MI_EPN can't */ mfspr r20, M_TWB /* Get level 1 table entry address */ /* If we are faulting a kernel address, we have to use the * kernel page tables. */ andi. r21, r20, 0x0800 /* Address >= 0x80000000 */ beq 3f lis r21, swapper_pg_dir at h ori r21, r21, swapper_pg_dir at l rlwimi r20, r21, 0, 2, 19 3: lwz r21, 0(r20) /* Get the level 1 entry */ rlwinm. r20, r21,0,0,19 /* Extract page descriptor page address */ beq 2f /* If zero, don't try to find a pte */ /* We have a pte table, so load the MI_TWC with the attributes * for this "segment." */ tophys(r21,r21) ori r21,r21,1 /* Set valid bit */ #ifdef CONFIG_8xx_CPU6 li r3, 0x2b80 stw r3, 12(r0) lwz r3, 12(r0) #endif mtspr MI_TWC, r21 /* Set segment attributes */ #ifdef CONFIG_8xx_CPU6 li r3, 0x3b80 stw r3, 12(r0) lwz r3, 12(r0) #endif mtspr MD_TWC, r21 /* Load pte table base address */ mfspr r21, MD_TWC /* ....and get the pte address */ lwz r20, 0(r21) /* Get the pte */ ori r20, r20, _PAGE_ACCESSED stw r20, 0(r21) /* 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. */ li r21, 0x00f0 rlwimi r20, r21, 0, 24, 28 /* Set 24-27, clear 28 */ #ifdef CONFIG_8xx_CPU6 li r3, 0x2d80 stw r3, 12(r0) lwz r3, 12(r0) #endif mtspr MI_RPN, r20 /* Update TLB entry */ mfspr r20, M_TW /* Restore registers */ lwz r21, 0(r0) mtcr r21 lwz r21, 4(r0) #ifdef CONFIG_8xx_CPU6 lwz r3, 8(r0) #endif rfi 2: mfspr r20, M_TW /* Restore registers */ lwz r21, 0(r0) mtcr r21 lwz r21, 4(r0) #ifdef CONFIG_8xx_CPU6 lwz r3, 8(r0) #endif b InstructionAccess **** end 2.6.8 code **** **** begin 2.4.27 code **** InstructionTLBMiss: #ifdef CONFIG_8xx_CPU6 stw r3, 8(r0) li r3, 0x3f80 stw r3, 12(r0) lwz r3, 12(r0) #endif mtspr M_TW, r20 /* Save a couple of working registers */ #if !defined(CONFIG_PIN_TLB) || defined(CONFIG_MODULES) mfcr r20 stw r20, 0(r0) #endif stw r21, 4(r0) mfspr r20, SRR0 /* Get effective address of fault */ #ifdef CONFIG_8xx_CPU6 li r3, 0x3780 stw r3, 12(r0) lwz r3, 12(r0) #endif mtspr MD_EPN, r20 /* Have to use MD_EPN for walk, MI_EPN can't */ mfspr r20, M_TWB /* Get level 1 table entry address */ #if !defined(CONFIG_PIN_TLB) || defined(CONFIG_MODULES) /* If we are faulting a kernel address, we have to use the * kernel page tables. */ andi. r21, r20, 0x0800 /* Address >= 0x80000000 */ beq 3f lis r21, swapper_pg_dir at h ori r21, r21, swapper_pg_dir at l rlwimi r20, r21, 0, 2, 19 3: lwz r21, 0(r20) /* Get the level 1 entry */ rlwinm. r20, r21,0,0,19 /* Extract page descriptor page address */ beq 2f /* If zero, don't try to find a pte */ #else lwz r21, 0(r20) /* Get the level 1 entry */ mfcr r20 cmplwi cr0, r21, 0x0fff /* Test page descriptor page address */ bng- 2f /* If zero, don't try to find a pte */ mtcr r20 #endif /* We have a pte table, so load the MI_TWC with the attributes * for this "segment." */ tophys(r21,r21) ori r21,r21,1 /* Set valid bit */ #ifdef CONFIG_8xx_CPU6 li r3, 0x2b80 stw r3, 12(r0) lwz r3, 12(r0) #endif mtspr MI_TWC, r21 /* Set segment attributes */ #ifdef CONFIG_8xx_CPU6 li r3, 0x3b80 stw r3, 12(r0) lwz r3, 12(r0) #endif mtspr MD_TWC, r21 /* Load pte table base address */ mfspr r21, MD_TWC /* ....and get the pte address */ lwz r20, 0(r21) /* Get the pte */ ori r20, r20, _PAGE_ACCESSED stw r20, 0(r21) /* 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. */ li r21, 0x00f0 rlwimi r20, r21, 0, 24, 28 /* Set 24-27, clear 28 */ #ifdef CONFIG_8xx_CPU6 li r3, 0x2d80 stw r3, 12(r0) lwz r3, 12(r0) #endif mtspr MI_RPN, r20 /* Update TLB entry */ mfspr r20, M_TW /* Restore registers */ #if !defined(CONFIG_PIN_TLB) || defined(CONFIG_MODULES) lwz r21, 0(r0) mtcr r21 #endif lwz r21, 4(r0) #ifdef CONFIG_8xx_CPU6 lwz r3, 8(r0) #endif rfi 2: /* Restore registers */ #if !defined(CONFIG_PIN_TLB) || defined(CONFIG_MODULES) lwz r21, 0(r0) mtcr r21 #else mtcr r20 #endif mfspr r20, M_TW lwz r21, 4(r0) #ifdef CONFIG_8xx_CPU6 lwz r3, 8(r0) #endif b InstructionAccess **** end 2.4.27 code **** Does the current 2.6 kernel have these ifdefs in them? -- Conn ***************************************************************** Blessed be the heretic, for he causes some to think and unites the rest against him. ***************************************************************** Conn Clark Engineering Assistant clark at esteem.com Electronic Systems Technology Inc. www.esteem.com Stock Ticker Symbol ELST