From 378ad8db5541b6dc81178746d03a2bec04793d91 Mon Sep 17 00:00:00 2001 From: tsutsui Date: Sun, 6 Dec 2009 02:42:34 +0000 Subject: [PATCH] Sync MMU table initialization with amiga and atari a bit: - for 040/060, move L2 descs for Sysptmap from the last L2 block in segment table pages to the contiguous block with ones for segment table mappings - for 020/030, invalidate ste and pte entries separately since ste size (TIA_SIZE) and pte size (TIB_SIZE) could be different on 8KB/page systems Tested on hp300 (040), mac68k (LC040), and news68k (030) (and untested on others). XXX: some more stuff in pmap_bootstrap.c could be moved into XXX: common pmap_bootstrap_finalize()? --- sys/arch/cesfic/cesfic/pmap_bootstrap.c | 92 ++++++++++--------- sys/arch/hp300/hp300/pmap_bootstrap.c | 92 ++++++++++--------- sys/arch/luna68k/luna68k/pmap_bootstrap.c | 89 ++++++++++--------- sys/arch/mac68k/mac68k/pmap_bootstrap.c | 92 ++++++++++--------- sys/arch/mvme68k/mvme68k/pmap_bootstrap.c | 103 ++++++++++++---------- sys/arch/news68k/news68k/pmap_bootstrap.c | 99 +++++++++++---------- sys/arch/next68k/next68k/pmap_bootstrap.c | 99 +++++++++++---------- sys/arch/x68k/x68k/pmap_bootstrap.c | 99 +++++++++++---------- 8 files changed, 413 insertions(+), 352 deletions(-) diff --git a/sys/arch/cesfic/cesfic/pmap_bootstrap.c b/sys/arch/cesfic/cesfic/pmap_bootstrap.c index 306f95415dd0..dbb5bbefde88 100644 --- a/sys/arch/cesfic/cesfic/pmap_bootstrap.c +++ b/sys/arch/cesfic/cesfic/pmap_bootstrap.c @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_bootstrap.c,v 1.23 2009/12/05 23:16:57 tsutsui Exp $ */ +/* $NetBSD: pmap_bootstrap.c,v 1.24 2009/12/06 02:42:34 tsutsui Exp $ */ /* * Copyright (c) 1991, 1993 @@ -36,7 +36,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.23 2009/12/05 23:16:57 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.24 2009/12/06 02:42:34 tsutsui Exp $"); #include #include @@ -87,6 +87,7 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) u_int nptpages, kstsize; st_entry_t protoste, *ste, *este; pt_entry_t protopte, *pte, *epte; + u_int stfree = 0; /* XXX: gcc -Wuninitialized */ /* * Calculate important physical addresses: @@ -159,7 +160,7 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) * likely be insufficient in the future (at least for the kernel). */ if (RELOC(mmutype, int) == MMU_68040) { - int num; + int nl1desc, nl2desc, i; /* * First invalidate the entire "segment table" pages @@ -169,7 +170,6 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) este = &ste[kstsize * NPTEPG]; while (ste < este) *ste++ = SG_NV; - /* * Initialize level 2 descriptors (which immediately * follow the level 1 table). We need: @@ -178,10 +178,10 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) * pages of PTEs. Note that we set the "used" bit * now to save the HW the expense of doing it. */ - num = nptpages * (NPTEPG / SG4_LEV3SIZE); + nl2desc = nptpages * (NPTEPG / SG4_LEV3SIZE); ste = (st_entry_t *)kstpa; ste = &ste[SG4_LEV1SIZE]; - este = &ste[num]; + este = &ste[nl2desc]; protoste = kptpa | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; @@ -190,11 +190,12 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) /* * Initialize level 1 descriptors. We need: - * howmany(num, SG4_LEV2SIZE) - * level 1 descriptors to map the `num' level 2's. + * howmany(nl2desc, SG4_LEV2SIZE) + * level 1 descriptors to map the `nl2desc' level 2's. */ + nl1desc = howmany(nl2desc, SG4_LEV2SIZE); ste = (st_entry_t *)kstpa; - este = &ste[howmany(num, SG4_LEV2SIZE)]; + este = &ste[nl1desc]; protoste = (paddr_t)&ste[SG4_LEV1SIZE] | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; @@ -202,20 +203,19 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) } /* - * Initialize the final level 1 descriptor to map the last - * block of level 2 descriptors. + * Initialize the final level 1 descriptor to map the next + * block of level 2 descriptors for Sysptmap. */ ste = (st_entry_t *)kstpa; ste = &ste[SG4_LEV1SIZE - 1]; - este = (st_entry_t *)kstpa; - este = &este[kstsize * NPTEPG - SG4_LEV2SIZE]; - *ste = (paddr_t)este | SG_U | SG_RW | SG_V; + *ste = protoste; /* * Now initialize the final portion of that block of * descriptors to map kptmpa and the "last PT page". */ + i = SG4_LEV1SIZE + (nl1desc * SG4_LEV2SIZE); ste = (st_entry_t *)kstpa; - ste = &ste[kstsize * NPTEPG - NPTEPG / SG4_LEV3SIZE * 2]; + ste = &ste[i + SG4_LEV2SIZE - NPTEPG / SG4_LEV3SIZE * 2]; epte = &ste[NPTEPG / SG4_LEV3SIZE]; protoste = kptmpa | SG_U | SG_RW | SG_V; while (ste < este) { @@ -228,6 +228,23 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) *ste++ = protoste; protoste += (SG4_LEV3SIZE * sizeof(st_entry_t)); } + /* + * Calculate the free level 2 descriptor mask + * noting that we have used: + * 0: level 1 table + * 1 to nl1desc: map page tables + * nl1desc + 1: maps kptmpa and last-page page table + */ + /* mark an entry for level 1 table */ + stfree = ~l2tobm(0); + /* mark entries for map page tables */ + for (i = 1; i <= nl1desc; i++) + stfree &= ~l2tobm(i); + /* mark an entry for kptmpa and lkptpa */ + stfree &= ~l2tobm(i); + /* mark entries not available */ + for (i = MAXKL2SIZE; i < sizeof(stfree) * NBBY; i++) + stfree &= ~l2tobm(i); /* * Initialize Sysptmap @@ -241,10 +258,10 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) } /* - * Invalidate all but the last remaining entry. + * Invalidate all remaining entries. */ epte = (pt_entry_t *)kptmpa; - epte = &epte[NPTEPG - 2]; + epte = &epte[NPTEPG]; /* XXX: should be TIB_SIZE */ while (pte < epte) { *pte++ = PG_NV; } @@ -252,6 +269,8 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) * Initialize the last to point to kptmpa and the page * table page allocated earlier. */ + pte = (pt_entry_t *)kptmpa; + pte = &pte[NPTEPG - 2]; /* XXX: should be TIA_SIZE */ *pte = kptmpa | PG_RW | PG_CI | PG_V; pte++; *pte = lkptpa | PG_RW | PG_CI | PG_V; @@ -272,18 +291,24 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) protopte += PAGE_SIZE; } /* - * Invalidate all but the last remaining entries in both. + * Invalidate all remaining entries in both. */ - epte = (pt_entry_t *)kptmpa; - epte = &epte[NPTEPG - 2]; - while (pte < epte) { + este = (st_entry_t *)kstpa; + este = &epte[NPTEPG]; /* XXX: should be TIA_SIZE */ + while (ste < este) *ste++ = SG_NV; + epte = (pt_entry_t *)kptmpa; + epte = &epte[NPTEPG]; /* XXX: should be TIB_SIZE */ + while (pte < epte) *pte++ = PG_NV; - } /* * Initialize the last to point to kptmpa and the page * table page allocated earlier. */ + ste = (st_entry_t *)kstpa; + ste = &ste[NPTEPG - 2]; /* XXX: should be TIA_SIZE */ + pte = (pt_entry_t *)kptmpa; + pte = &pte[NPTEPG - 2]; /* XXX: should be TIA_SIZE */ *ste = kptmpa | SG_RW | SG_V; *pte = kptmpa | PG_RW | PG_CI | PG_V; ste++; @@ -424,27 +449,8 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) simple_lock_init(&kpm->pm_lock); kpm->pm_count = 1; kpm->pm_stpa = (st_entry_t *)kstpa; - /* - * For the 040 we also initialize the free level 2 - * descriptor mask noting that we have used: - * 0: level 1 table - * 1 to `num': map page tables - * MAXKL2SIZE-1: maps kptmpa and last-page page table - */ - if (RELOC(mmutype, int) == MMU_68040) { - int num; - - kpm->pm_stfree = ~l2tobm(0); - num = roundup(nptpages * (NPTEPG / SG4_LEV3SIZE), - SG4_LEV2SIZE) / SG4_LEV2SIZE; - while (num) - kpm->pm_stfree &= ~l2tobm(num--); - kpm->pm_stfree &= ~l2tobm(MAXKL2SIZE-1); - for (num = MAXKL2SIZE; - num < sizeof(kpm->pm_stfree)*NBBY; - num++) - kpm->pm_stfree &= ~l2tobm(num); - } + if (RELOC(mmutype, int) == MMU_68040) + kpm->pm_stfree = stfree; } /* diff --git a/sys/arch/hp300/hp300/pmap_bootstrap.c b/sys/arch/hp300/hp300/pmap_bootstrap.c index 79fef647dd2a..b345e65cb791 100644 --- a/sys/arch/hp300/hp300/pmap_bootstrap.c +++ b/sys/arch/hp300/hp300/pmap_bootstrap.c @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_bootstrap.c,v 1.43 2009/12/05 23:16:57 tsutsui Exp $ */ +/* $NetBSD: pmap_bootstrap.c,v 1.44 2009/12/06 02:42:34 tsutsui Exp $ */ /* * Copyright (c) 1991, 1993 @@ -36,7 +36,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.43 2009/12/05 23:16:57 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.44 2009/12/06 02:42:34 tsutsui Exp $"); #include @@ -97,6 +97,7 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) u_int nptpages, kstsize; st_entry_t protoste, *ste, *este; pt_entry_t protopte, *pte, *epte; + u_int stfree = 0; /* XXX: gcc -Wuninitialized */ /* * Calculate important physical addresses: @@ -167,7 +168,7 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) * likely be insufficient in the future (at least for the kernel). */ if (RELOC(mmutype, int) == MMU_68040) { - int num; + int nl1desc, nl2desc, i; /* * First invalidate the entire "segment table" pages @@ -185,10 +186,10 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) * pages of PTEs. Note that we set the "used" bit * now to save the HW the expense of doing it. */ - num = nptpages * (NPTEPG / SG4_LEV3SIZE); + nl2desc = nptpages * (NPTEPG / SG4_LEV3SIZE); ste = (st_entry_t *)kstpa; ste = &ste[SG4_LEV1SIZE]; - este = &ste[num]; + este = &ste[nl2desc]; protoste = kptpa | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; @@ -196,31 +197,31 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) } /* * Initialize level 1 descriptors. We need: - * howmany(num, SG4_LEV2SIZE) - * level 1 descriptors to map the `num' level 2's. + * howmany(nl2desc, SG4_LEV2SIZE) + * level 1 descriptors to map the `nl2desc' level 2's. */ + nl1desc = howmany(nl2desc, SG4_LEV2SIZE); ste = (st_entry_t *)kstpa; - este = &ste[howmany(num, SG4_LEV2SIZE)]; + este = &ste[nl1desc]; protoste = (paddr_t)&ste[SG4_LEV1SIZE] | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; protoste += (SG4_LEV2SIZE * sizeof(st_entry_t)); } /* - * Initialize the final level 1 descriptor to map the last - * block of level 2 descriptors. + * Initialize the final level 1 descriptor to map the next + * block of level 2 descriptors for Sysptmap. */ ste = (st_entry_t *)kstpa; ste = &ste[SG4_LEV1SIZE - 1]; - este = (st_entry_t *)kstpa; - este = &este[kstsize * NPTEPG - SG4_LEV2SIZE]; - *ste = (paddr_t)este | SG_U | SG_RW | SG_V; + *ste = protoste; /* * Now initialize the final portion of that block of * descriptors to map kptmpa and the "last PT page". */ + i = SG4_LEV1SIZE + (nl1desc * SG4_LEV2SIZE); ste = (st_entry_t *)kstpa; - ste = &ste[kstsize * NPTEPG - NPTEPG / SG4_LEV3SIZE * 2]; + ste = &ste[i + SG4_LEV2SIZE - (NPTEPG / SG4_LEV3SIZE) * 2]; este = &ste[NPTEPG / SG4_LEV3SIZE]; protoste = kptmpa | SG_U | SG_RW | SG_V; while (ste < este) { @@ -233,6 +234,24 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) *ste++ = protoste; protoste += (SG4_LEV3SIZE * sizeof(st_entry_t)); } + /* + * Calculate the free level 2 descriptor mask + * noting that we have used: + * 0: level 1 table + * 1 to nl1desc: map page tables + * nl1desc + 1: maps kptmpa and last-page page table + */ + /* mark an entry for level 1 table */ + stfree = ~l2tobm(0); + /* mark entries for map page tables */ + for (i = 1; i <= nl1desc; i++) + stfree &= ~l2tobm(i); + /* mark an entry for kptmpa and lkptpa */ + stfree &= ~l2tobm(i); + /* mark entries not available */ + for (i = MAXKL2SIZE; i < sizeof(stfree) * NBBY; i++) + stfree &= ~l2tobm(i); + /* * Initialize Sysptmap */ @@ -244,10 +263,10 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) protopte += PAGE_SIZE; } /* - * Invalidate all but the last remaining entry. + * Invalidate all remaining entries. */ epte = (pt_entry_t *)kptmpa; - epte = &epte[NPTEPG - 2]; + epte = &epte[NPTEPG]; /* XXX: should be TIB_SIZE */ while (pte < epte) { *pte++ = PG_NV; } @@ -255,6 +274,8 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) * Initialize the last ones to point to kptmpa and the page * table page allocated earlier. */ + pte = (pt_entry_t *)kptmpa; + pte = &pte[NPTEPG - 2]; /* XXX: should be TIA_SIZE */ *pte = kptmpa | PG_RW | PG_CI | PG_V; pte++; *pte = lkptpa | PG_RW | PG_CI | PG_V; @@ -275,18 +296,24 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) protopte += PAGE_SIZE; } /* - * Invalidate all but the last remaining entries in both. + * Invalidate all remaining entries in both. */ - epte = (pt_entry_t *)kptmpa; - epte = &epte[NPTEPG - 2]; - while (pte < epte) { + este = (st_entry_t *)kstpa; + este = &epte[NPTEPG]; /* XXX: should be TIA_SIZE */ + while (ste < este) *ste++ = SG_NV; + epte = (pt_entry_t *)kptmpa; + epte = &epte[NPTEPG]; /* XXX: should be TIB_SIZE */ + while (pte < epte) *pte++ = PG_NV; - } /* * Initialize the last ones to point to kptmpa and the page * table page allocated earlier. */ + ste = (st_entry_t *)kstpa; + ste = &ste[NPTEPG - 2]; /* XXX: should be TIA_SIZE */ + pte = (pt_entry_t *)kptmpa; + pte = &pte[NPTEPG - 2]; /* XXX: should be TIA_SIZE */ *ste = kptmpa | SG_RW | SG_V; *pte = kptmpa | PG_RW | PG_CI | PG_V; ste++; @@ -469,27 +496,8 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) simple_lock_init(&kpm->pm_lock); kpm->pm_count = 1; kpm->pm_stpa = (st_entry_t *)kstpa; - /* - * For the 040 we also initialize the free level 2 - * descriptor mask noting that we have used: - * 0: level 1 table - * 1 to `num': map page tables - * MAXKL2SIZE-1: maps kptmpa and last-page page table - */ - if (RELOC(mmutype, int) == MMU_68040) { - int num; - - kpm->pm_stfree = ~l2tobm(0); - num = howmany(nptpages * (NPTEPG / SG4_LEV3SIZE), - SG4_LEV2SIZE); - while (num) - kpm->pm_stfree &= ~l2tobm(num--); - kpm->pm_stfree &= ~l2tobm(MAXKL2SIZE-1); - for (num = MAXKL2SIZE; - num < sizeof(kpm->pm_stfree)*NBBY; - num++) - kpm->pm_stfree &= ~l2tobm(num); - } + if (RELOC(mmutype, int) == MMU_68040) + kpm->pm_stfree = stfree; } /* diff --git a/sys/arch/luna68k/luna68k/pmap_bootstrap.c b/sys/arch/luna68k/luna68k/pmap_bootstrap.c index 1ac268f51d32..dcb4dd34a086 100644 --- a/sys/arch/luna68k/luna68k/pmap_bootstrap.c +++ b/sys/arch/luna68k/luna68k/pmap_bootstrap.c @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_bootstrap.c,v 1.23 2009/12/05 23:16:57 tsutsui Exp $ */ +/* $NetBSD: pmap_bootstrap.c,v 1.24 2009/12/06 02:42:34 tsutsui Exp $ */ /* * Copyright (c) 1991, 1993 @@ -36,7 +36,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.23 2009/12/05 23:16:57 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.24 2009/12/06 02:42:34 tsutsui Exp $"); #include @@ -85,12 +85,12 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) { paddr_t kstpa, kptpa, kptmpa, lwp0upa; u_int nptpages, kstsize; - st_entry_t protoste, *ste; -#if defined(M68040) - st_entry_t *este; -#endif + st_entry_t protoste, *ste, *este; pt_entry_t protopte, *pte, *epte; u_int iiomapsize; +#if defined(M68040) + u_int stfree = 0; /* XXX: gcc -Wuninitialized */ +#endif /* * Calculate important physical addresses: @@ -151,7 +151,7 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) */ #if defined(M68040) if (RELOC(mmutype, int) == MMU_68040) { - int num; + int nl1desc, nl2desc, i; /* * First invalidate the entire "segment table" pages @@ -169,10 +169,10 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) * pages of PTEs. Note that we set the "used" bit * now to save the HW the expense of doing it. */ - num = nptpages * (NPTEPG / SG4_LEV3SIZE); + nl2desc = nptpages * (NPTEPG / SG4_LEV3SIZE); ste = (st_entry_t *)kstpa; ste = &ste[SG4_LEV1SIZE]; - este = &ste[num]; + este = &ste[nl2desc]; protoste = kptpa | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; @@ -180,11 +180,12 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) } /* * Initialize level 1 descriptors. We need: - * howmany(num, SG4_LEV2SIZE) - * level 1 descriptors to map the `num' level 2's. + * howmany(nl2desc, SG4_LEV2SIZE) + * level 1 descriptors to map the `nl2desc' level 2's. */ + nl1desc = howmany(nl2desc, SG4_LEV2SIZE); ste = (st_entry_t *)kstpa; - este = &ste[howmany(num, SG4_LEV2SIZE)]; + este = &ste[nl1desc]; protoste = (paddr_t)&pte[SG4_LEV1SIZE] | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; @@ -196,20 +197,38 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) */ ste = (st_entry_t *)kstpa; ste = &ste[SYSMAP_VA >> SG4_SHIFT1]; - este = (st_entry_t *)kstpa; - este = &este[kstsize * NPTEPG - SG4_LEV2SIZE]; - *ste = (paddr_t)este | SG_U | SG_RW | SG_V; + *ste = protoste; /* * Now initialize the portion of that block of * descriptors to map Sysptmap. */ - ste = &este[((SYSMAP_VA & SG4_MASK2) >> SG4_SHIFT2)]; + i = SG4_LEV1SIZE + (nl1desc * SG4_LEV2SIZE); + ste = (st_entry_t *)kstpa; + ste = &ste[i + ((SYSMAP_VA & SG4_MASK2) >> SG4_SHIFT2)]; este = &ste[NPTEPG / SG4_LEV3SIZE]; protoste = kptmpa | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; protoste += (SG4_LEV3SIZE * sizeof(st_entry_t)); } + /* + * Calculate the free level 2 descriptor mask + * noting that we have used: + * 0: level 1 table + * 1 to nl1desc: map page tables + * nl1desc + 1: maps kptmpa and last-page page table + */ + /* mark an entry for level 1 table */ + stfree = ~l2tobm(0); + /* mark entries for map page tables */ + for (i = 1; i <= nl1desc; i++) + stfree &= ~l2tobm(i); + /* mark an entry for kptmpa and lkptpa */ + stfree &= ~l2tobm(i); + /* mark entries not available */ + for (i = MAXKL2SIZE; i < sizeof(stfree) * NBBY; i++) + stfree &= ~l2tobm(i); + /* * Initialize Sysptmap */ @@ -233,6 +252,7 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) * to point to Sysptmap. */ pte = (pt_entry_t *)kptmpa; + /* XXX should be (TIA_SIZE * PAGE_SIZE) */ pte[SYSMAP_VA / (NPTEPG * PAGE_SIZE)] = kptmpa | PG_RW | PG_CI | PG_V; } else @@ -256,20 +276,24 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) /* * Invalidate all remaining entries in both. */ - epte = (pt_entry_t *)kptmpa; - epte = &epte[NPTEPG]; - while (pte < epte) { + este = (st_entry_t *)kstpa; + este = &este[NPTEPG]; /* XXX: should be TIA_SIZE */ + while (ste < este) *ste++ = SG_NV; + epte = (pt_entry_t *)kptmpa; + epte = &epte[NPTEPG]; /* XXX: should be TIB_SIZE */ + while (pte < epte) *pte++ = PG_NV; - } /* * Initialize the one corresponding to SYSMAP_VA * to point to Sysptmap. */ ste = (st_entry_t *)kstpa; pte = (pt_entry_t *)kptmpa; + /* XXX should be (TIA_SIZE * PAGE_SIZE) */ pte[SYSMAP_VA / (NPTEPG * PAGE_SIZE)] = kptmpa | SG_RW | SG_V; + /* XXX should be (TIA_SIZE * PAGE_SIZE) */ ste[SYSMAP_VA / (NPTEPG * PAGE_SIZE)] = kptmpa | PG_RW | PG_CI | PG_V; } @@ -392,27 +416,10 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) simple_lock_init(&kpm->pm_lock); kpm->pm_count = 1; kpm->pm_stpa = (st_entry_t *)kstpa; - /* - * For the 040 we also initialize the free level 2 - * descriptor mask noting that we have used: - * 0: level 1 table - * 1 to `num': map page tables - * MAXKL2SIZE-1: maps kptama - */ - if (RELOC(mmutype, int) == MMU_68040) { - int num; - - kpm->pm_stfree = ~l2tobm(0); - num = howmany(nptpages * (NPTEPG / SG4_LEV3SIZE), - SG4_LEV2SIZE); - while (num) - kpm->pm_stfree &= ~l2tobm(num--); - kpm->pm_stfree &= ~l2tobm(MAXKL2SIZE-1); - for (num = MAXKL2SIZE; - num < sizeof(kpm->pm_stfree)*NBBY; - num++) - kpm->pm_stfree &= ~l2tobm(num); - } +#if defined(M68040) + if (RELOC(mmutype, int) == MMU_68040) + kpm->pm_stfree = stfree; +#endif } /* diff --git a/sys/arch/mac68k/mac68k/pmap_bootstrap.c b/sys/arch/mac68k/mac68k/pmap_bootstrap.c index 50f103f4665c..cdd89c01b151 100644 --- a/sys/arch/mac68k/mac68k/pmap_bootstrap.c +++ b/sys/arch/mac68k/mac68k/pmap_bootstrap.c @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_bootstrap.c,v 1.84 2009/12/05 23:16:57 tsutsui Exp $ */ +/* $NetBSD: pmap_bootstrap.c,v 1.85 2009/12/06 02:42:34 tsutsui Exp $ */ /* * Copyright (c) 1991, 1993 @@ -36,7 +36,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.84 2009/12/05 23:16:57 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.85 2009/12/06 02:42:34 tsutsui Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -118,6 +118,7 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) int i; st_entry_t protoste, *ste, *este; pt_entry_t protopte, *pte, *epte; + u_int stfree = 0; /* XXX: gcc -Wuninitialized */ extern char start[]; vidlen = m68k_round_page(mac68k_video.mv_height * @@ -196,7 +197,7 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) * likely be insufficient in the future (at least for the kernel). */ if (mmutype == MMU_68040) { - int num; + int nl1desc, nl2desc; /* * First invalidate the entire "segment table" pages @@ -214,10 +215,10 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) * pages of PTEs. Note that we set the "used" bit * now to save the HW the expense of doing it. */ - num = nptpages * (NPTEPG / SG4_LEV3SIZE); + nl2desc = nptpages * (NPTEPG / SG4_LEV3SIZE); ste = PA2VA(kstpa, st_entry_t *); ste = &ste[SG4_LEV1SIZE]; - este = &ste[num]; + este = &ste[nl2desc]; protoste = kptpa | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; @@ -225,37 +226,55 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) } /* * Initialize level 1 descriptors. We need: - * howmany(num, SG4_LEV2SIZE) - * level 1 descriptors to map the `num' level 2's. + * howmany(nl2desc, SG4_LEV2SIZE) + * level 1 descriptors to map the `nl2desc' level 2's. */ + nl1desc = howmany(nl2desc, SG4_LEV2SIZE); ste = PA2VA(kstpa, u_int *); - este = &ste[howmany(num, SG4_LEV2SIZE)]; + este = &ste[nl1desc]; protoste = (paddr_t)&ste[SG4_LEV1SIZE] | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; protoste += (SG4_LEV2SIZE * sizeof(st_entry_t)); } /* - * Initialize the final level 1 descriptor to map the last - * block of level 2 descriptors. + * Initialize the final level 1 descriptor to map the next + * block of level 2 descriptors for Sysptmap. */ ste = PA2VA(kstpa, st_entry_t *); ste = &ste[SG4_LEV1SIZE - 1]; - este = PA2VA(kstpa, st_entry_t *); - este = &este[kstsize * NPTEPG - SG4_LEV2SIZE]; - *ste = (paddr_t)este | SG_U | SG_RW | SG_V; + *ste = protoste; /* * Now initialize the final portion of that block of * descriptors to map Sysmap. */ + i = SG4_LEV1SIZE + (nl1desc * SG4_LEV2SIZE); ste = PA2VA(kstpa, st_entry_t *); - ste = &ste[kstsize * NPTEPG - NPTEPG / SG4_LEV3SIZE]; + ste = &ste[i + SG4_LEV2SIZE - (NPTEPG / SG4_LEV3SIZE)]; este = &ste[NPTEPG / SG4_LEV3SIZE]; protoste = kptmpa | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; protoste += (SG4_LEV3SIZE * sizeof(st_entry_t)); } + /* + * Calculate the free level 2 descriptor mask + * noting that we have used: + * 0: level 1 table + * 1 to nl1desc: map page tables + * nl1desc + 1: maps kptmpa and last-page page table + */ + /* mark an entry for level 1 table */ + stfree = ~l2tobm(0); + /* mark entries for map page tables */ + for (i = 1; i <= nl1desc; i++) + stfree &= ~l2tobm(i); + /* mark an entry for kptmpa and lkptpa */ + stfree &= ~l2tobm(i); + /* mark entries not available */ + for (i = MAXKL2SIZE; i < sizeof(stfree) * NBBY; i++) + stfree &= ~l2tobm(i); + /* * Initialize Sysptmap */ @@ -267,16 +286,18 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) protopte += PAGE_SIZE; } /* - * Invalidate all but the last remaining entry. + * Invalidate all remaining entries. */ epte = PA2VA(kptmpa, pt_entry_t *); - epte = &epte[NPTEPG - 1]; + epte = &epte[NPTEPG]; /* XXX: should be TIB_SIZE */ while (pte < epte) { *pte++ = PG_NV; } /* * Initialize the last one to point to Sysptmap. */ + pte = PA2VA(kptmpa, pt_entry_t *); + pte = &pte[NPTEPG - 1]; /* XXX: should be TIA_SIZE */ *pte = kptmpa | PG_RW | PG_CI | PG_V; } else { /* @@ -295,18 +316,24 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) protopte += PAGE_SIZE; } /* - * Invalidate all but the last remaining entries in both. + * Invalidate all remaining entries in both. */ - epte = PA2VA(kptmpa, pt_entry_t *); - epte = &epte[NPTEPG - 1]; - while (pte < epte) { + este = PA2VA(kstpa, st_entry_t *); + este = &este[NPTEPG]; /* XXX: should be TIA_SIZE */ + while (ste < este) *ste++ = SG_NV; + epte = PA2VA(kptmpa, pt_entry_t *); + epte = &epte[NPTEPG]; /* XXX: should be TIB_SIZE */ + while (pte < epte) *pte++ = PG_NV; - } /* * Initialize the last one to point to Sysptmap. */ + ste = PA2VA(kstpa, st_entry_t *); + ste = &ste[NPTEPG - 1]; /* XXX: should be TIA_SIZE */ *ste = kptmpa | SG_RW | SG_V; + pte = PA2VA(kptmpa, pt_entry_t *); + pte = &pte[NPTEPG - 1]; /* XXX: should be TIA_SIZE */ *pte = kptmpa | PG_RW | PG_CI | PG_V; } @@ -474,27 +501,8 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) simple_lock_init(&kpm->pm_lock); kpm->pm_count = 1; kpm->pm_stpa = (st_entry_t *)kstpa; - /* - * For the 040 we also initialize the free level 2 - * descriptor mask noting that we have used: - * 0: level 1 table - * 1 to `num': map page tables - * MAXKL2SIZE-1: maps kptmpa - */ - if (mmutype == MMU_68040) { - int num; - - kpm->pm_stfree = ~l2tobm(0); - num = howmany(nptpages * (NPTEPG / SG4_LEV3SIZE), - SG4_LEV2SIZE); - while (num) - kpm->pm_stfree &= ~l2tobm(num--); - kpm->pm_stfree &= ~l2tobm(MAXKL2SIZE-1); - for (num = MAXKL2SIZE; - num < sizeof(kpm->pm_stfree)*NBBY; - num++) - kpm->pm_stfree &= ~l2tobm(num); - } + if (mmutype == MMU_68040) + kpm->pm_stfree = stfree; } /* diff --git a/sys/arch/mvme68k/mvme68k/pmap_bootstrap.c b/sys/arch/mvme68k/mvme68k/pmap_bootstrap.c index fd5279962852..eb402efdd169 100644 --- a/sys/arch/mvme68k/mvme68k/pmap_bootstrap.c +++ b/sys/arch/mvme68k/mvme68k/pmap_bootstrap.c @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_bootstrap.c,v 1.37 2009/12/05 23:16:57 tsutsui Exp $ */ +/* $NetBSD: pmap_bootstrap.c,v 1.38 2009/12/06 02:42:34 tsutsui Exp $ */ /* * Copyright (c) 1991, 1993 @@ -36,7 +36,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.37 2009/12/05 23:16:57 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.38 2009/12/06 02:42:34 tsutsui Exp $"); #include #include @@ -90,14 +90,14 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) { paddr_t kstpa, kptpa, kptmpa, lkptpa, lwp0upa; u_int nptpages, kstsize; - st_entry_t protoste, *ste; -#if defined(M68040) || defined(M68060) - st_entry_t *este; -#endif + st_entry_t protoste, *ste, *este; pt_entry_t protopte, *pte, *epte; psize_t size; u_int iiomappages; int i; +#if defined(M68040) || defined(M68060) + u_int stfree = 0; /* XXX: gcc -Wuninitialized */ +#endif /* * Calculate important physical addresses: @@ -182,7 +182,7 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) */ #if defined(M68040) || defined(M68060) if (RELOC(mmutype, int) == MMU_68040) { - int num; + int nl1desc, nl2desc; /* * First invalidate the entire "segment table" pages @@ -200,10 +200,10 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) * pages of PTEs. Note that we set the "used" bit * now to save the HW the expense of doing it. */ - num = nptpages * (NPTEPG / SG4_LEV3SIZE); + nl2desc = nptpages * (NPTEPG / SG4_LEV3SIZE); ste = (st_entry_t *)kstpa; ste = &ste[SG4_LEV1SIZE]; - este = &ste[num]; + este = &ste[nl2desc]; protoste = kptpa | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; @@ -211,31 +211,31 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) } /* * Initialize level 1 descriptors. We need: - * roundup(num, SG4_LEV2SIZE) / SG4_LEV2SIZE - * level 1 descriptors to map the `num' level 2's. + * roundup(nl2desc, SG4_LEV2SIZE) / SG4_LEV2SIZE + * level 1 descriptors to map the `nl2desc' level 2's. */ + nl1desc = howmany(nl2desc, SG4_LEV2SIZE); ste = (st_entry_t *)kstpa; - este = &ste[howmany(num, SG4_LEV2SIZE)]; + este = &ste[nl1desc]; protoste = (paddr_t)&ste[SG4_LEV1SIZE] | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; protoste += (SG4_LEV2SIZE * sizeof(st_entry_t)); } /* - * Initialize the final level 1 descriptor to map the last - * block of level 2 descriptors. + * Initialize the final level 1 descriptor to map the next + * block of level 2 descriptors for Sysptmap. */ ste = (st_entry_t *)kstpa; ste = &ste[SG4_LEV1SIZE - 1]; - este = (st_entry_t *)kstpa; - este = &este[kstsize * NPTEPG - SG4_LEV2SIZE]; - *ste = (paddr_t)este | SG_U | SG_RW | SG_V; + *ste = protoste; /* * Now initialize the final portion of that block of * descriptors to map kptmpa and the "last PT page". */ + i = SG4_LEV1SIZE + (nl1desc * SG4_LEV2SIZE); ste = (st_entry_t *)kstpa; - ste = &ste[kstsize * NPTEPG - NPTEPG / SG4_LEV3SIZE * 2]; + ste = &ste[i + SG4_LEV2SIZE - (NPTEPG / SG4_LEV3SIZE) * 2]; este = &ste[NPTEPG / SG4_LEV3SIZE]; protoste = kptmpa | SG_U | SG_RW | SG_V; while (ste < este) { @@ -248,6 +248,24 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) *ste++ = protoste; protoste += (SG4_LEV3SIZE * sizeof(st_entry_t)); } + /* + * Calculate the free level 2 descriptor mask + * noting that we have used: + * 0: level 1 table + * 1 to nl1desc: map page tables + * nl1desc + 1: maps kptmpa and last-page page table + */ + /* mark an entry for level 1 table */ + stfree = ~l2tobm(0); + /* mark entries for map page tables */ + for (i = 1; i <= nl1desc; i++) + stfree &= ~l2tobm(i); + /* mark an entry for kptmpa and lkptpa */ + stfree &= ~l2tobm(i); + /* mark entries not available */ + for (i = MAXKL2SIZE; i < sizeof(stfree) * NBBY; i++) + stfree &= ~l2tobm(i); + /* * Initialize Sysptmap */ @@ -259,13 +277,19 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) protopte += PAGE_SIZE; } /* - * Invalidate all but the last remaining entry. + * Invalidate all remaining entries. */ epte = (pt_entry_t *)kptmpa; - epte = &epte[NPTEPG - 2]; + epte = &epte[NPTEPG]; /* XXX: should be TIB_SIZE */ while (pte < epte) { *pte++ = PG_NV; } + /* + * Initialize the last ones to point to kptmpa and the page + * table page allocated earlier. + */ + pte = (pt_entry_t *)kptmpa; + pte = &pte[NPTEPG - 2]; /* XXX: should be TIA_SIZE */ *pte = kptmpa | PG_RW | PG_CI | PG_V; pte++; *pte = lkptpa | PG_RW | PG_CI | PG_U | PG_V; @@ -288,18 +312,24 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) protopte += PAGE_SIZE; } /* - * Invalidate all but the last two remaining entries in both. + * Invalidate all remaining entries in both. */ - epte = (st_entry_t *)kptmpa; - epte = &epte[NPTEPG - 2]; - while (pte < epte) { + este = (st_entry_t *)kstpa; + este = &epte[NPTEPG]; /* XXX: should be TIA_SIZE */ + while (ste < este) *ste++ = SG_NV; + epte = (st_entry_t *)kptmpa; + epte = &epte[NPTEPG]; /* XXX: should be TIB_SIZE */ + while (pte < epte) *pte++ = PG_NV; - } /* * Initialize the last ones to point to Sysptmap and the page * table page allocated earlier. */ + ste = (st_entry_t *)kstpa; + ste = &ste[NPTEPG - 2]; /* XXX: should be TIA_SIZE */ + pte = (pt_entry_t *)kptmpa; + pte = &pte[NPTEPG - 2]; /* XXX: should be TIA_SIZE */ *ste = kptmpa | SG_RW | SG_V; *pte = kptmpa | PG_RW | PG_CI | PG_V; ste++; @@ -525,27 +555,8 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) kpm->pm_count = 1; kpm->pm_stpa = (st_entry_t *)kstpa; #if defined(M68040) || defined(M68060) - /* - * For the 040 we also initialize the free level 2 - * descriptor mask noting that we have used: - * 0: level 1 table - * 1 to `num': map page tables - * MAXKL2SIZE-1: maps kptmpa and last-page page table - */ - if (RELOC(mmutype, int) == MMU_68040) { - int num; - - kpm->pm_stfree = ~l2tobm(0); - num = howmany(nptpages * (NPTEPG / SG4_LEV3SIZE), - SG4_LEV2SIZE); - while (num) - kpm->pm_stfree &= ~l2tobm(num--); - kpm->pm_stfree &= ~l2tobm(MAXKL2SIZE-1); - for (num = MAXKL2SIZE; - num < sizeof(kpm->pm_stfree)*NBBY; - num++) - kpm->pm_stfree &= ~l2tobm(num); - } + if (RELOC(mmutype, int) == MMU_68040) + kpm->pm_stfree = stfree; #endif } diff --git a/sys/arch/news68k/news68k/pmap_bootstrap.c b/sys/arch/news68k/news68k/pmap_bootstrap.c index 8826d28cd2be..f2954515dae0 100644 --- a/sys/arch/news68k/news68k/pmap_bootstrap.c +++ b/sys/arch/news68k/news68k/pmap_bootstrap.c @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_bootstrap.c,v 1.27 2009/12/05 23:16:58 tsutsui Exp $ */ +/* $NetBSD: pmap_bootstrap.c,v 1.28 2009/12/06 02:42:35 tsutsui Exp $ */ /* * Copyright (c) 1991, 1993 @@ -39,7 +39,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.27 2009/12/05 23:16:58 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.28 2009/12/06 02:42:35 tsutsui Exp $"); #include @@ -91,12 +91,12 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) { paddr_t kstpa, kptpa, kptmpa, lwp0upa; u_int nptpages, kstsize; - st_entry_t protoste, *ste; -#ifdef M68040 - st_entry_t *este; -#endif + st_entry_t protoste, *ste, *este; pt_entry_t protopte, *pte, *epte; u_int iiomapsize, eiomapsize; +#ifdef M68040 + u_int stfree = 0; /* XXX: gcc -Wuninitialized */ +#endif /* * Calculate important physical addresses: @@ -178,7 +178,7 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) */ #ifdef M68040 if (RELOC(mmutype, int) == MMU_68040) { - int num; + int nl1desc, nl2desc, i; /* * First invalidate the entire "segment table" pages @@ -196,10 +196,10 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) * pages of PTEs. Note that we set the "used" bit * now to save the HW the expense of doing it. */ - num = nptpages * (NPTEPG / SG4_LEV3SIZE); + nl2desc = nptpages * (NPTEPG / SG4_LEV3SIZE); ste = (st_entry_t *)kstpa; ste = &ste[SG4_LEV1SIZE]; - este = &ste[num]; + este = &ste[nl2desc]; protoste = kptpa | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; @@ -207,37 +207,55 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) } /* * Initialize level 1 descriptors. We need: - * howmany(num, SG4_LEV2SIZE) - * level 1 descriptors to map the `num' level 2's. + * howmany(nl2desc, SG4_LEV2SIZE) + * level 1 descriptors to map the `nl2desc' level 2's. */ + nl1desc = howmany(nl2desc, SG4_LEV2SIZE); ste = (st_entry_t *)kstpa; - este = &ste[howmany(num, SG4_LEV2SIZE)]; + este = &ste[nl1desc]; protoste = (paddr_t)&ste[SG4_LEV1SIZE] | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; protoste += (SG4_LEV2SIZE * sizeof(st_entry_t)); } /* - * Initialize the final level 1 descriptor to map the last - * block of level 2 descriptors. + * Initialize the final level 1 descriptor to map the next + * block of level 2 descriptors for Sysptmap. */ ste = (st_entry_t *)kstpa; ste = &ste[SG4_LEV1SIZE - 1]; - este = (st_entry_t *)kstpa; - este = &este[kstsize * NPTEPG - SG4_LEV2SIZE]; - *ste = (paddr_t)epte | SG_U | SG_RW | SG_V; + *ste = protoste; /* * Now initialize the final portion of that block of * descriptors to map Sysmap. */ + i = SG4_LEV1SIZE + (nl1desc * SG4_LEV2SIZE); ste = (st_entry_t *)kstpa; - ste = &ste[kstsize * NPTEPG - NPTEPG / SG4_LEV3SIZE]; + ste = &ste[i + SG4_LEV2SIZE - (NPTEPG / SG4_LEV3SIZE)]; este = &ste[NPTEPG / SG4_LEV3SIZE]; protoste = kptmpa | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; protoste += (SG4_LEV3SIZE * sizeof(st_entry_t)); } + /* + * Calculate the free level 2 descriptor mask + * noting that we have used: + * 0: level 1 table + * 1 to nl1desc: map page tables + * nl1desc + 1: maps kptmpa and last-page page table + */ + /* mark an entry for level 1 table */ + stfree = ~l2tobm(0); + /* mark entries for map page tables */ + for (i = 1; i <= nl1desc; i++) + stfree &= ~l2tobm(i); + /* mark an entry for kptmpa and lkptpa */ + stfree &= ~l2tobm(i); + /* mark entries not available */ + for (i = MAXKL2SIZE; i < sizeof(stfree) * NBBY; i++) + stfree &= ~l2tobm(i); + /* * Initialize Sysptmap */ @@ -249,16 +267,18 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) protopte += PAGE_SIZE; } /* - * Invalidate all but the last remaining entry. + * Invalidate all remaining entries. */ epte = (pt_entry_t *)kptmpa; - epte = &epte[NPTEPG - 1]; + epte = &epte[NPTEPG]; /* XXX: should be TIB_SIZE */ while (pte < epte) { *pte++ = PG_NV; } /* * Initialize the last one to point to Sysptmap. */ + pte = (pt_entry_t *)kptmpa; + pte = &pte[NPTEPG - 1]; /* XXX: should be TIA_SIZE */ *pte = kptmpa | PG_RW | PG_CI | PG_V; } else #endif @@ -279,18 +299,24 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) protopte += PAGE_SIZE; } /* - * Invalidate all but the last remaining entries in both. + * Invalidate all remaining entries in both. */ - epte = (pt_entry_t *)kptmpa; - epte = &epte[NPTEPG - 1]; - while (pte < epte) { + este = (st_entry_t *)kstpa; + este = &este[NPTEPG]; /* XXX: should be TIA_SIZE */ + while (ste < este) *ste++ = SG_NV; + epte = (pt_entry_t *)kptmpa; + epte = &epte[NPTEPG]; /* XXX: should be TIB_SIZE */ + while (pte < epte) *pte++ = PG_NV; - } /* * Initialize the last one to point to Sysptmap. */ + ste = (st_entry_t *)kstpa; + ste = &ste[NPTEPG - 1]; /* XXX: should be TIA_SIZE */ *ste = kptmpa | SG_RW | SG_V; + pte = (pt_entry_t *)kptmpa; + pte = &pte[NPTEPG - 1]; /* XXX: should be TIA_SIZE */ *pte = kptmpa | PG_RW | PG_CI | PG_V; } @@ -441,28 +467,9 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) simple_lock_init(&kpm->pm_lock); kpm->pm_count = 1; kpm->pm_stpa = (st_entry_t *)kstpa; - /* - * For the 040 we also initialize the free level 2 - * descriptor mask noting that we have used: - * 0: level 1 table - * 1 to `num': map page tables - * MAXKL2SIZE-1: maps kptmpa - */ #ifdef M68040 - if (RELOC(mmutype, int) == MMU_68040) { - int num; - - kpm->pm_stfree = ~l2tobm(0); - num = howmany(nptpages * (NPTEPG / SG4_LEV3SIZE), - SG4_LEV2SIZE); - while (num) - kpm->pm_stfree &= ~l2tobm(num--); - kpm->pm_stfree &= ~l2tobm(MAXKL2SIZE-1); - for (num = MAXKL2SIZE; - num < sizeof(kpm->pm_stfree)*NBBY; - num++) - kpm->pm_stfree &= ~l2tobm(num); - } + if (RELOC(mmutype, int) == MMU_68040) + kpm->pm_stfree = stfree; #endif } diff --git a/sys/arch/next68k/next68k/pmap_bootstrap.c b/sys/arch/next68k/next68k/pmap_bootstrap.c index 0c9d860cd648..351a22b96a4b 100644 --- a/sys/arch/next68k/next68k/pmap_bootstrap.c +++ b/sys/arch/next68k/next68k/pmap_bootstrap.c @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_bootstrap.c,v 1.32 2009/12/05 23:16:58 tsutsui Exp $ */ +/* $NetBSD: pmap_bootstrap.c,v 1.33 2009/12/06 02:42:35 tsutsui Exp $ */ /* * This file was taken from mvme68k/mvme68k/pmap_bootstrap.c @@ -45,7 +45,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.32 2009/12/05 23:16:58 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.33 2009/12/06 02:42:35 tsutsui Exp $"); #include #include @@ -103,13 +103,13 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) { paddr_t kstpa, kptpa, kptmpa, lkptpa, lwp0upa; u_int nptpages, kstsize; - st_entry_t protoste, *ste; -#if defined(M68040) || defined(M68060) - st_entry_t *este; -#endif + st_entry_t protoste, *ste, *este; pt_entry_t protopte, *pte, *epte; psize_t size; int i; +#if defined(M68040) || defined(M68060) + u_int stfree = 0; /* XXX: gcc -Wuninitialized */ +#endif /* * Calculate important physical addresses: @@ -192,7 +192,7 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) */ #if defined(M68040) || defined(M68060) if (RELOC(mmutype, int) == MMU_68040) { - int num; + int nl1desc, nl2desc; /* * First invalidate the entire "segment table" pages @@ -210,10 +210,10 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) * pages of PTEs. Note that we set the "used" bit * now to save the HW the expense of doing it. */ - num = nptpages * (NPTEPG / SG4_LEV3SIZE); + nl2desc = nptpages * (NPTEPG / SG4_LEV3SIZE); ste = (st_entry_t *)kstpa; ste = &ste[SG4_LEV1SIZE]; - este = &ste[num]; + este = &ste[nl2desc]; protoste = kptpa | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; @@ -221,31 +221,31 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) } /* * Initialize level 1 descriptors. We need: - * howmany(num, SG4_LEV2SIZE) - * level 1 descriptors to map the `num' level 2's. + * howmany(nl2desc, SG4_LEV2SIZE) + * level 1 descriptors to map the `nl2desc' level 2's. */ + nl1desc = howmany(nl2desc, SG4_LEV2SIZE); ste = (st_entry_t *)kstpa; - este = &ste[howmany(num, SG4_LEV2SIZE)]; + este = &ste[nl1desc]; protoste = (paddr_t)&ste[SG4_LEV1SIZE] | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; protoste += (SG4_LEV2SIZE * sizeof(st_entry_t)); } /* - * Initialize the final level 1 descriptor to map the last - * block of level 2 descriptors. + * Initialize the final level 1 descriptor to map the next + * block of level 2 descriptors for Sysptmap. */ ste = (st_entry_t *)kstpa; ste = &ste[SG4_LEV1SIZE - 1]; - este = (st_entry_t *)kstpa; - este = &este[kstsize * NPTEPG - SG4_LEV2SIZE]; - *ste = (paddr_t)este | SG_U | SG_RW | SG_V; + *ste = protoste; /* * Now initialize the final portion of that block of * descriptors to map the "last PT page". */ + i = SG4_LEV1SIZE + (nl1desc * SG4_LEV2SIZE); ste = (st_entry_t *)kstpa; - ste = &ste[kstsize * NPTEPG - NPTEPG / SG4_LEV3SIZE * 2]; + ste = &ste[i + SG4_LEV2SIZE - (NPTEPG / SG4_LEV3SIZE) * 2]; este = &ste[NPTEPG / SG4_LEV3SIZE]; protoste = kptmpa | SG_U | SG_RW | SG_V; while (ste < este) { @@ -258,6 +258,24 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) *ste++ = protoste; protoste += (SG4_LEV3SIZE * sizeof(st_entry_t)); } + /* + * Calculate the free level 2 descriptor mask + * noting that we have used: + * 0: level 1 table + * 1 to nl1desc: map page tables + * nl1desc + 1: maps kptmpa and last-page page table + */ + /* mark an entry for level 1 table */ + stfree = ~l2tobm(0); + /* mark entries for map page tables */ + for (i = 1; i <= nl1desc; i++) + stfree &= ~l2tobm(i); + /* mark an entry for kptmpa and lkptpa */ + stfree &= ~l2tobm(i); + /* mark entries not available */ + for (i = MAXKL2SIZE; i < sizeof(stfree) * NBBY; i++) + stfree &= ~l2tobm(i); + /* * Initialize Sysptmap */ @@ -269,10 +287,10 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) protopte += PAGE_SIZE; } /* - * Invalidate all but the last two remaining entries. + * Invalidate all remaining entries. */ epte = (pt_entry_t *)kptmpa; - epte = &epte[NPTEPG - 2]; + epte = &epte[NPTEPG]; /* XXX: should be TIB_SIZE */ while (pte < epte) { *pte++ = PG_NV; } @@ -280,6 +298,8 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) * Initialize the last ones to point to Sysptmap and the page * table page allocated earlier. */ + pte = (pt_entry_t *)kptmpa; + pte = &pte[NPTEPG - 2]; /* XXX: should be TIA_SIZE */ *pte = kptmpa | PG_RW | PG_CI | PG_V; pte++; *pte = lkptpa | PG_RW | PG_CI | PG_U | PG_V; @@ -302,18 +322,24 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) protopte += PAGE_SIZE; } /* - * Invalidate all but the last two remaining entries in both. + * Invalidate all remaining entries in both. */ - epte = (pt_entry_t *)kptmpa; - epte = &epte[NPTEPG - 2]; - while (pte < epte) { + este = (st_entry_t *)kstpa; + este = &epte[NPTEPG]; /* XXX: should be TIA_SIZE */ + while (ste < este) *ste++ = SG_NV; + epte = (pt_entry_t *)kptmpa; + epte = &epte[NPTEPG]; /* XXX: should be TIB_SIZE */ + while (pte < epte) *pte++ = PG_NV; - } /* * Initialize the last ones to point to Sysptmap and the page * table page allocated earlier. */ + ste = (st_entry_t *)kstpa; + ste = &ste[NPTEPG - 2]; /* XXX: should be TIA_SIZE */ + pte = (pt_entry_t *)kptmpa; + pte = &pte[NPTEPG - 2]; /* XXX: should be TIA_SIZE */ *ste = kptmpa | SG_RW | SG_V; *pte = kptmpa | PG_RW | PG_CI | PG_V; ste++; @@ -566,27 +592,8 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) kpm->pm_count = 1; kpm->pm_stpa = (st_entry_t *)kstpa; #if defined(M68040) || defined(M68060) - /* - * For the 040 we also initialize the free level 2 - * descriptor mask noting that we have used: - * 0: level 1 table - * 1 to `num': map page tables - * MAXKL2SIZE-1: maps kptmpa and last-page page table - */ - if (RELOC(mmutype, int) == MMU_68040) { - int num; - - kpm->pm_stfree = ~l2tobm(0); - num = howmany(nptpages * (NPTEPG / SG4_LEV3SIZE), - SG4_LEV2SIZE); - while (num) - kpm->pm_stfree &= ~l2tobm(num--); - kpm->pm_stfree &= ~l2tobm(MAXKL2SIZE-1); - for (num = MAXKL2SIZE; - num < sizeof(kpm->pm_stfree)*NBBY; - num++) - kpm->pm_stfree &= ~l2tobm(num); - } + if (RELOC(mmutype, int) == MMU_68040) + kpm->pm_stfree = stfree; #endif } diff --git a/sys/arch/x68k/x68k/pmap_bootstrap.c b/sys/arch/x68k/x68k/pmap_bootstrap.c index 1bbdd0682ae1..35150ed9f42d 100644 --- a/sys/arch/x68k/x68k/pmap_bootstrap.c +++ b/sys/arch/x68k/x68k/pmap_bootstrap.c @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_bootstrap.c,v 1.46 2009/12/05 23:16:58 tsutsui Exp $ */ +/* $NetBSD: pmap_bootstrap.c,v 1.47 2009/12/06 02:42:35 tsutsui Exp $ */ /* * Copyright (c) 1991, 1993 @@ -36,7 +36,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.46 2009/12/05 23:16:58 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_bootstrap.c,v 1.47 2009/12/06 02:42:35 tsutsui Exp $"); #include "opt_m680x0.h" @@ -86,11 +86,11 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) { paddr_t kstpa, kptpa, kptmpa, lwp0upa; u_int nptpages, kstsize; - st_entry_t protoste, *ste; -#if defined(M68040) || defined(M68060) - st_entry_t *este; -#endif + st_entry_t protoste, *ste, *este; pt_entry_t protopte, *pte, *epte; +#if defined(M68040) || defined(M68060) + u_int stfree = 0; /* XXX: gcc -Wuninitialized */ +#endif /* * Calculate important physical addresses: @@ -154,7 +154,7 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) */ #if defined(M68040) || defined(M68060) if (RELOC(mmutype, int) == MMU_68040) { - int num; + int nl1desc, nl2desc, i; /* * First invalidate the entire "segment table" pages @@ -172,10 +172,10 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) * pages of PTEs. Note that we set the "used" bit * now to save the HW the expense of doing it. */ - num = nptpages * (NPTEPG / SG4_LEV3SIZE); + nl2desc = nptpages * (NPTEPG / SG4_LEV3SIZE); ste = (st_entry_t *)kstpa; ste = &ste[SG4_LEV1SIZE]; - este = &ste[num]; + este = &ste[nl2desc]; protoste = kptpa | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; @@ -183,37 +183,55 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) } /* * Initialize level 1 descriptors. We need: - * howmany(num, SG4_LEV2SIZE) - * level 1 descriptors to map the `num' level 2's. + * howmany(nl2desc, SG4_LEV2SIZE) + * level 1 descriptors to map the `nl2desc' level 2's. */ + nl1desc = howmany(nl2desc, SG4_LEV2SIZE); ste = (st_entry_t *)kstpa; - este = &ste[howmany(num, SG4_LEV2SIZE)]; + este = &ste[nl1desc]; protoste = (paddr_t)este[SG4_LEV1SIZE] | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; protoste += (SG4_LEV2SIZE * sizeof(st_entry_t)); } /* - * Initialize the final level 1 descriptor to map the last - * block of level 2 descriptors. + * Initialize the final level 1 descriptor to map the next + * block of level 2 descriptors for Sysptmap. */ ste = (st_entry_t *)kstpa; ste = &ste[SG4_LEV1SIZE - 1]; - este = (st_entry_t *)kstpa; - este = &este[kstsize * NPTEPG - SG4_LEV2SIZE]; - *ste = (paddr_t)este | SG_U | SG_RW | SG_V; + *ste = protoste; /* * Now initialize the final portion of that block of * descriptors to map kptmpa. */ + i = SG4_LEV1SIZE + (nl1desc * SG4_LEV2SIZE); ste = (st_entry_t *)kstpa; - ste = &ste[kstsize * NPTEPG - NPTEPG / SG4_LEV3SIZE]; + ste = &ste[i + SG4_LEV2SIZE - (NPTEPG / SG4_LEV3SIZE)]; este = &ste[NPTEPG / SG4_LEV3SIZE]; protoste = kptmpa | SG_U | SG_RW | SG_V; while (ste < este) { *ste++ = protoste; protoste += (SG4_LEV3SIZE * sizeof(st_entry_t)); } + /* + * Calculate the free level 2 descriptor mask + * noting that we have used: + * 0: level 1 table + * 1 to nl1desc: map page tables + * nl1desc + 1: maps kptmpa and last-page page table + */ + /* mark an entry for level 1 table */ + stfree = ~l2tobm(0); + /* mark entries for map page tables */ + for (i = 1; i <= nl1desc; i++) + stfree &= ~l2tobm(i); + /* mark an entry for kptmpa and lkptpa */ + stfree &= ~l2tobm(i); + /* mark entries not available */ + for (i = MAXKL2SIZE; i < sizeof(stfree) * NBBY; i++) + stfree &= ~l2tobm(i); + /* * Initialize Sysptmap */ @@ -225,16 +243,18 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) protopte += PAGE_SIZE; } /* - * Invalidate all but the last remaining entry. + * Invalidate all remaining entries. */ epte = (pt_entry_t *)kptmpa; - epte = &epte[NPTEPG - 1]; + epte = &epte[NPTEPG]; /* XXX: should be TIB_SIZE */ while (pte < epte) { *pte++ = PG_NV; } /* * Initialize the last one to point to Sysptmap. */ + pte = (pt_entry_t *)kptmpa; + pte = &pte[NPTEPG - 1]; /* XXX: should be TIA_SIZE */ *pte = kptmpa | PG_RW | PG_CI | PG_V; } else #endif /* M68040 || M68060 */ @@ -255,18 +275,24 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) protopte += PAGE_SIZE; } /* - * Invalidate all but the last remaining entries in both. + * Invalidate all remaining entries in both. */ - epte = (pt_entry_t *)kptmpa; - epte = &epte[NPTEPG - 1]; - while (pte < epte) { + este = (st_entry_t *)kstpa; + este = &este[NPTEPG]; /* XXX: should be TIA_SIZE */ + while (ste < este) *ste++ = SG_NV; + epte = (pt_entry_t *)kptmpa; + epte = &epte[NPTEPG]; /* XXX: should be TIB_SIZE */ + while (pte < epte) *pte++ = PG_NV; - } /* * Initialize the last one to point to Sysptmap. */ + ste = (st_entry_t *)kstpa; + ste = &ste[NPTEPG - 1]; /* XXX: should be TIA_SIZE */ *ste = kptmpa | SG_RW | SG_V; + pte = (pt_entry_t *)kptmpa; + pte = &pte[NPTEPG - 1]; /* XXX: should be TIA_SIZE */ *pte = kptmpa | PG_RW | PG_CI | PG_V; } @@ -411,27 +437,8 @@ pmap_bootstrap(paddr_t nextpa, paddr_t firstpa) kpm->pm_count = 1; kpm->pm_stpa = (st_entry_t *)kstpa; #if defined(M68040) || defined(M68060) - /* - * For the 040 we also initialize the free level 2 - * descriptor mask noting that we have used: - * 0: level 1 table - * 1 to `num': map page tables - * MAXKL2SIZE-1: maps kptmpa and last-page page table - */ - if (RELOC(mmutype, int) == MMU_68040) { - int num; - - kpm->pm_stfree = ~l2tobm(0); - num = howmany(nptpages * (NPTEPG / SG4_LEV3SIZE), - SG4_LEV2SIZE); - while (num) - kpm->pm_stfree &= ~l2tobm(num--); - kpm->pm_stfree &= ~l2tobm(MAXKL2SIZE-1); - for (num = MAXKL2SIZE; - num < sizeof(kpm->pm_stfree)*NBBY; - num++) - kpm->pm_stfree &= ~l2tobm(num); - } + if (RELOC(mmutype, int) == MMU_68040) + kpm->pm_stfree = stfree; #endif }