sparc: increase the KVA region for all to match KRUPS, etc. the current kernel text address limits the total KVA available to 224MB, which can easily be hit on a system with 512MB ram and an active kernel cache. the krups port already had to handle this address being taken and moved the kernel down 128MB to 0xE8004000, so we know the systems works fine with this for some, so make it used for all, adding 128MB to the KVA maximum. move some hard-coded magic addresses into #defines. bump NKMEMPAGES_MAX_DEFAULT (give it max 7/8th of the new section.) remove some KRUSP/MSIIEP #ifdefs, make them runtime detection. tested on Krups years ago by uwe. Index: sys/arch/sparc/conf/KRUPS =================================================================== RCS file: /cvsroot/src/sys/arch/sparc/conf/KRUPS,v retrieving revision 1.82 diff -p -u -r1.82 KRUPS --- sys/arch/sparc/conf/KRUPS 15 Sep 2024 19:19:58 -0000 1.82 +++ sys/arch/sparc/conf/KRUPS 18 Nov 2024 09:21:13 -0000 @@ -24,10 +24,6 @@ options SUN4M # sun4m - SS10, SS20, Cl # with this option turned on will refuse to work on normal 4m. options MSIIEP # microSPARC-IIep -# XXX: uwe: PROM location conflicts with kernel VA space !!! -options PROM_AT_F0 -makeoptions TEXTADDR=E8004000 - ## System options specific to the sparc machine type Index: sys/arch/sparc/conf/Makefile.sparc =================================================================== RCS file: /cvsroot/src/sys/arch/sparc/conf/Makefile.sparc,v retrieving revision 1.96 diff -p -u -r1.96 Makefile.sparc --- sys/arch/sparc/conf/Makefile.sparc 22 Sep 2018 12:24:03 -0000 1.96 +++ sys/arch/sparc/conf/Makefile.sparc 18 Nov 2024 09:21:13 -0000 @@ -61,7 +61,7 @@ amd7930intr.o bsd_fdintr.o lock_stubs.o: ## ## (5) link settings ## -TEXTADDR?= F0004000 +TEXTADDR?= E8004000 EXTRA_LINKFLAGS= -X KERNLDSCRIPT?= ${SPARC}/conf/kern.ldscript LINKFORMAT= -n Index: sys/arch/sparc/include/bsd_openprom.h =================================================================== RCS file: /cvsroot/src/sys/arch/sparc/include/bsd_openprom.h,v retrieving revision 1.25 diff -p -u -r1.25 bsd_openprom.h --- sys/arch/sparc/include/bsd_openprom.h 24 Dec 2007 15:46:45 -0000 1.25 +++ sys/arch/sparc/include/bsd_openprom.h 18 Nov 2024 09:21:13 -0000 @@ -56,6 +56,9 @@ */ #define OPENPROM_STARTVADDR 0xffd00000 #define OPENPROM_ENDVADDR 0xfff00000 +#define OPENPROM_STARTVADDR_JS 0xf0000000 +#define OPENPROM_ENDVADDR_JS 0xf0080000 +#define OPENPROM_ENDVADDR_KRUPS 0xf0800000 #define OPENPROM_MAGIC 0x10010407 Index: sys/arch/sparc/include/param.h =================================================================== RCS file: /cvsroot/src/sys/arch/sparc/include/param.h,v retrieving revision 1.75 diff -p -u -r1.75 param.h --- sys/arch/sparc/include/param.h 2 Jun 2023 08:51:46 -0000 1.75 +++ sys/arch/sparc/include/param.h 18 Nov 2024 09:21:13 -0000 @@ -70,16 +70,17 @@ extern int nbpg, pgofset, pgshift; #endif -#if !(defined(PROM_AT_F0) || defined(MSIIEP)) -#define KERNBASE 0xf0000000 /* start of kernel virtual space */ -#else /* - * JS1/OF has prom sitting in f000.0000..f007.ffff, modify kernel VA - * layout to work around that. XXX - kernel should live beyond prom on - * those machines. + * SPARC KVA is from KERNBASE until 0xfe00.0000 where the PROM normally + * lives. NetBSD originally used KERNBASE of 0xf000.0000 (except for + * systems like Krups, that put the PROM here), but was switched to + * 0xe800.000 for NetBSD 11.0 as it's quite easy to use more than 224MB + * of KVA on a 512MB system (max for sun4m.) + * + * JS1/OF has prom sitting in f000.0000..f007.ffff, Krups has it from to + * f070.ffff. */ -#define KERNBASE 0xe8000000 -#endif +#define KERNBASE 0xe8000000 /* start of kernel virtual space */ #define KERNEND 0xfe000000 /* end of kernel virtual space */ #define PROM_LOADADDR 0x00004000 /* where the prom loads us */ #define KERNTEXTOFF (KERNBASE+PROM_LOADADDR)/* start of kernel text */ @@ -108,7 +109,7 @@ extern int nbpg, pgofset, pgshift; * logical pages. */ #define NKMEMPAGES_MIN_DEFAULT ((16 * 1024 * 1024) >> PAGE_SHIFT) -#define NKMEMPAGES_MAX_DEFAULT ((128 * 1024 * 1024) >> PAGE_SHIFT) +#define NKMEMPAGES_MAX_DEFAULT ((240 * 1024 * 1024) >> PAGE_SHIFT) #if defined(_KERNEL) || defined(_STANDALONE) #ifndef _LOCORE Index: sys/arch/sparc/sparc/pmap.c =================================================================== RCS file: /cvsroot/src/sys/arch/sparc/sparc/pmap.c,v retrieving revision 1.378 diff -p -u -r1.378 pmap.c --- sys/arch/sparc/sparc/pmap.c 10 Feb 2024 09:30:06 -0000 1.378 +++ sys/arch/sparc/sparc/pmap.c 18 Nov 2024 09:21:14 -0000 @@ -565,8 +565,7 @@ int updatepte4m(vaddr_t, int *, int, in #if defined(SUN4M) || defined(SUN4D) static void mmu_setup4m_L1(int, struct pmap *); static void mmu_setup4m_L2(int, struct regmap *); -static void mmu_setup4m_L3(int, struct segmap *); -/*static*/ void mmu_reservemon4m(struct pmap *); +static void mmu_setup4m_L3(int, struct segmap *); /*static*/ void pmap_changeprot4m(pmap_t, vaddr_t, vm_prot_t, int); /*static*/ void pmap_rmk4m(struct pmap *, vaddr_t, vaddr_t, int, int); @@ -1382,24 +1381,12 @@ srmmu_bypass_read(u_long paddr) * Also installs ROM mappings into the kernel pmap. * NOTE: This also revokes all user-mode access to the mapped regions. */ -void +static void mmu_reservemon4m(struct pmap *kpmap) { unsigned int rom_ctxtbl; int te; -#if !(defined(PROM_AT_F0) || defined(MSIIEP)) - prom_vstart = OPENPROM_STARTVADDR; - prom_vend = OPENPROM_ENDVADDR; -#else /* OBP3/OFW in JavaStations */ - prom_vstart = 0xf0000000; -#if defined(MSIIEP) - prom_vend = 0xf0800000; -#else - prom_vend = 0xf0080000; -#endif -#endif - /* * XXX: although the sun4m can handle 36 bits of physical * address space, we assume that all these page tables, etc @@ -3530,6 +3517,7 @@ pmap_bootstrap4m(void *top) vaddr_t pagetables_start, pagetables_end; paddr_t pagetables_start_pa; vaddr_t va; + bool mr_coffee, krups; #if defined(MULTIPROCESSOR) vsize_t off; size_t cpuinfo_len = sizeof(struct cpu_info); @@ -3766,6 +3754,21 @@ pmap_bootstrap4m(void *top) } } + mr_coffee = strcmp(machine_model, "SUNW,JavaStation-1") == 0; + krups = strcmp(machine_model, "SUNW,JSIIep") == 0; + + if (!mr_coffee && !krups) { + prom_vstart = OPENPROM_STARTVADDR; + prom_vend = OPENPROM_ENDVADDR; + } else { + /* OBP3/OFW in JavaStations */ + prom_vstart = OPENPROM_STARTVADDR_JS; + if (krups) + prom_vend = OPENPROM_ENDVADDR_KRUPS; + else + prom_vend = OPENPROM_ENDVADDR_JS; + } + /* * Preserve the monitor ROM's reserved VM region, so that * we can use L1-A or the monitor's debugger. @@ -3792,13 +3795,12 @@ pmap_bootstrap4m(void *top) &sp->sg_pte[VA_SUN4M_VPG(cpuinfo.vpage[i])]; } -#if !(defined(PROM_AT_F0) || defined(MSIIEP)) - virtual_avail = p; -#elif defined(MSIIEP) - virtual_avail = (vaddr_t)0xf0800000; /* Krups */ -#else - virtual_avail = (vaddr_t)0xf0080000; /* Mr.Coffee/OFW */ -#endif + if (!mr_coffee && !krups) + virtual_avail = p; + else if (krups) + virtual_avail = (vaddr_t)OPENPROM_ENDVADDR_KRUPS; + else + virtual_avail = (vaddr_t)OPENPROM_ENDVADDR_JS; virtual_end = VM_MAX_KERNEL_ADDRESS; p = q; /* retract to first free phys */