Return to BSD News archive
Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!agate!dog.ee.lbl.gov!horse.ee.lbl.gov!torek
From: torek@horse.ee.lbl.gov (Chris Torek)
Newsgroups: comp.unix.bsd
Subject: Fixes for 4.4BSD SPARC kernels (was 4.4BSD on SPARCstation IPC)
Date: 30 Sep 1993 23:13:42 GMT
Organization: Lawrence Berkeley Laboratory, Berkeley CA
Lines: 961
Message-ID: <34305@dog.ee.lbl.gov>
References: <ma5la6INNfdn@news.bbn.com> <34206@dog.ee.lbl.gov>
NNTP-Posting-Host: 128.3.112.15
In article <34206@dog.ee.lbl.gov> I wrote:
>The problem with 4.4BSD on machines with other than 16 MB has now been
>found (now that we have a 32 MB machine at LBL). Several other less-
>important (but still significant) bugs have also been fixed. I plan to
>post patches as soon as I can re-integrate the changes with the
>official 4.4BSD sources.
Here are the various changes. WARNING: these have *not* been tested
in an official 4.4BSD kernel. Indeed, some of them have been tested
at best quite lightly, but I felt they were important enough to post
anyway.
The patch to pmap.c fixes the `> 16 MB' problem, and is by far the
most important of these. (If you read the comments attached to the
patch, you should be able to figure out what was going wrong. :-) )
In-Real-Life: Chris Torek, Lawrence Berkeley Lab CSE/EE (+1 510 486 5427)
Berkeley, CA Domain: torek@ee.lbl.gov
diff -r -c2 /nbsd/sys/sparc/include/autoconf.h ./include/autoconf.h
*** /nbsd/sys/sparc/include/autoconf.h Fri Jun 11 15:11:37 1993
--- ./include/autoconf.h Thu Sep 30 15:43:56 1993
***************
*** 40,46 ****
* SUCH DAMAGE.
*
! * @(#)autoconf.h 8.1 (Berkeley) 6/11/93
*
! * from: $Header: autoconf.h,v 1.10 92/11/26 02:04:32 torek Exp $ (LBL)
*/
--- 40,46 ----
* SUCH DAMAGE.
*
! * @(#)autoconf.h 8.2 (Berkeley) 9/30/93
*
! * from: $Header: autoconf.h,v 1.11 93/09/28 05:26:41 leres Exp $ (LBL)
*/
***************
*** 138,139 ****
--- 138,142 ----
struct device *bootdv; /* found during autoconfiguration */
+
+ /* Parse a disk string into a dev_t, return device struct pointer */
+ struct device *parsedisk __P((char *, int, int, dev_t *));
diff -r -c2 /nbsd/sys/sparc/include/psl.h ./include/psl.h
*** /nbsd/sys/sparc/include/psl.h Fri Jun 11 15:12:29 1993
--- ./include/psl.h Mon Sep 27 14:08:28 1993
***************
*** 40,46 ****
* SUCH DAMAGE.
*
! * @(#)psl.h 8.1 (Berkeley) 6/11/93
*
! * from: $Header: psl.h,v 1.12 92/11/26 02:04:42 torek Exp $
*/
--- 40,46 ----
* SUCH DAMAGE.
*
! * @(#)psl.h 8.2 (Berkeley) 9/27/93
*
! * from: $Header: psl.h,v 1.13 93/09/27 01:37:25 torek Exp $
*/
***************
*** 78,82 ****
#define PIL_CLOCK 10
! #ifndef LOCORE
/*
* GCC pseudo-functions for manipulating PSR (primarily PIL field).
--- 78,82 ----
#define PIL_CLOCK 10
! #if defined(KERNEL) && !defined(LOCORE)
/*
* GCC pseudo-functions for manipulating PSR (primarily PIL field).
***************
*** 180,184 ****
__asm __volatile("nop; nop; nop");
}
! #endif /* LOCORE */
#endif /* PSR_IMPL */
--- 180,184 ----
__asm __volatile("nop; nop; nop");
}
! #endif /* KERNEL && !LOCORE */
#endif /* PSR_IMPL */
diff -r -c2 /nbsd/sys/sparc/include/stdarg.h ./include/stdarg.h
*** /nbsd/sys/sparc/include/stdarg.h Fri Jun 11 15:12:48 1993
--- ./include/stdarg.h Mon Sep 27 14:13:28 1993
***************
*** 40,46 ****
* SUCH DAMAGE.
*
! * @(#)stdarg.h 8.1 (Berkeley) 6/11/93
*
! * from: $Header: stdarg.h,v 1.8 93/05/07 18:10:14 torek Exp $
*/
--- 40,46 ----
* SUCH DAMAGE.
*
! * @(#)stdarg.h 8.2 (Berkeley) 9/27/93
*
! * from: $Header: stdarg.h,v 1.9 93/09/27 21:12:38 torek Exp $
*/
***************
*** 61,66 ****
* va_end cleans up after va_start. There is nothing to do there.
*/
#define va_start(ap, l) (__builtin_saveregs(), \
! ap = (char *)__builtin_next_arg())
#define va_end(ap) /* empty */
--- 61,70 ----
* va_end cleans up after va_start. There is nothing to do there.
*/
+ #ifdef __GCC_NEW_VARARGS__ /* gcc 2.4.5 */
+ #define va_start(ap, l) ((ap) = (char *)__builtin_saveregs())
+ #else /* gcc 2.3.3 */
#define va_start(ap, l) (__builtin_saveregs(), \
! (ap) = (char *)__builtin_next_arg())
! #endif
#define va_end(ap) /* empty */
diff -r -c2 /nbsd/sys/sparc/include/varargs.h ./include/varargs.h
*** /nbsd/sys/sparc/include/varargs.h Fri Jun 11 15:12:58 1993
--- ./include/varargs.h Mon Sep 27 14:13:28 1993
***************
*** 40,46 ****
* SUCH DAMAGE.
*
! * @(#)varargs.h 8.1 (Berkeley) 6/11/93
*
! * from: $Header: varargs.h,v 1.7 93/05/07 18:10:36 torek Exp $
*/
--- 40,46 ----
* SUCH DAMAGE.
*
! * @(#)varargs.h 8.2 (Berkeley) 9/27/93
*
! * from: $Header: varargs.h,v 1.8 93/09/27 00:53:20 torek Exp $
*/
***************
*** 54,62 ****
#define __extension__
#define va_dcl int va_alist;
! #else /* gcc2 wants to see the '...' token */
#define va_dcl int va_alist; ...
#endif
#define va_start(ap) (__builtin_saveregs(), (ap) = (char *)&va_alist)
#define va_end(ap) /* empty */
--- 54,71 ----
#define __extension__
#define va_dcl int va_alist;
! #else /* gcc2 */
! #ifdef __GCC_NEW_VARARGS__ /* gcc 2.4.5 */
! #define va_alist __builtin_va_alist
! #define va_dcl int __builtin_va_alist;
! #else /* gcc 2.3.3 */
#define va_dcl int va_alist; ...
#endif
+ #endif
+ #ifdef __GCC_NEW_VARARGS__
+ #define va_start(ap) ((ap) = (char *)__builtin_saveregs())
+ #else
#define va_start(ap) (__builtin_saveregs(), (ap) = (char *)&va_alist)
+ #endif
#define va_end(ap) /* empty */
diff -r -c2 /nbsd/sys/sparc/rcons/rcons_kern.c ./rcons/rcons_kern.c
*** /nbsd/sys/sparc/rcons/rcons_kern.c Fri Jun 11 15:14:02 1993
--- ./rcons/rcons_kern.c Mon Sep 27 14:16:15 1993
***************
*** 40,46 ****
* SUCH DAMAGE.
*
! * @(#)rcons_kern.c 8.1 (Berkeley) 6/11/93
*
! * from: $Header: rcons_kern.c,v 1.28 93/04/20 11:15:38 torek Exp $
*/
--- 40,46 ----
* SUCH DAMAGE.
*
! * @(#)rcons_kern.c 8.2 (Berkeley) 9/27/93
*
! * from: $Header: rcons_kern.c,v 1.29 93/09/27 00:52:02 torek Exp $
*/
***************
*** 200,204 ****
register int i;
static int row, col;
- char buf[100];
myfbdevicep = fb;
--- 200,203 ----
***************
*** 259,268 ****
/* Determine addresses of prom emulator row and column */
! fb->fb_row = fb->fb_col = NULL;
! sprintf(buf, "' line# >body >user %x !", &fb->fb_row);
! rominterpret(buf);
! sprintf(buf, "' column# >body >user %x !", &fb->fb_col);
! rominterpret(buf);
! if (fb->fb_row == NULL || fb->fb_col == NULL) {
/* Can't find addresses; use private copies */
fb->fb_row = &row;
--- 258,262 ----
/* Determine addresses of prom emulator row and column */
! if (romgetcursoraddr(&fb->fb_row, &fb->fb_col)) {
/* Can't find addresses; use private copies */
fb->fb_row = &row;
diff -r -c2 /nbsd/sys/sparc/sparc/autoconf.c ./sparc/autoconf.c
*** /nbsd/sys/sparc/sparc/autoconf.c Fri Jun 11 15:15:55 1993
--- ./sparc/autoconf.c Thu Sep 30 15:37:47 1993
***************
*** 40,46 ****
* SUCH DAMAGE.
*
! * @(#)autoconf.c 8.1 (Berkeley) 6/11/93
*
! * from: $Header: autoconf.c,v 1.32 93/05/28 03:55:59 torek Exp $ (LBL)
*/
--- 40,46 ----
* SUCH DAMAGE.
*
! * @(#)autoconf.c 8.3 (Berkeley) 9/30/93
*
! * from: $Header: autoconf.c,v 1.37 93/09/28 07:19:48 leres Exp $ (LBL)
*/
***************
*** 82,86 ****
static int findblkmajor __P((struct dkdevice *));
static struct device *getdisk __P((char *, int, int, dev_t *));
- static struct device *parsedisk __P((char *, int, int, dev_t *));
struct bootpath bootpath[8];
--- 82,85 ----
***************
*** 439,447 ****
static const char *const special[] = {
/* find these first (end with empty string) */
! "memory-error", "eeprom", "counter-timer", "",
/* ignore these (end with NULL) */
! "options", "packages", "openprom", "memory", "virtual-memory",
! "interrupt-enable", NULL
};
--- 438,455 ----
static const char *const special[] = {
/* find these first (end with empty string) */
! "eeprom",
! "counter-timer",
! "memory-error",
! "",
/* ignore these (end with NULL) */
! "aliases",
! "interrupt-enable",
! "memory",
! "openprom",
! "options",
! "packages",
! "virtual-memory",
! NULL
};
***************
*** 722,725 ****
--- 730,734 ----
}
+ #ifdef RCONSOLE
/* Pass a string to the FORTH PROM to be interpreted */
void
***************
*** 734,737 ****
--- 743,775 ----
}
+ /*
+ * Try to figure out where the PROM stores the cursor row & column
+ * variables. Returns nonzero on error.
+ */
+ int
+ romgetcursoraddr(rowp, colp)
+ register int **rowp, **colp;
+ {
+ char buf[100];
+
+ /*
+ * line# and column# are global in older proms (rom vector < 2)
+ * and in some newer proms. They are local in version 2.9. The
+ * correct cutoff point is unknown, as yet; we use 2.9 here.
+ */
+ if (promvec->pv_romvec_vers < 2 || promvec->pv_printrev < 0x00020009)
+ sprintf(buf,
+ "' line# >body >user %x ! ' column# >body >user %x !",
+ rowp, colp);
+ else
+ sprintf(buf,
+ "stdout @ is my-self addr line# %x ! addr column# %x !",
+ rowp, colp);
+ *rowp = *colp = NULL;
+ rominterpret(buf);
+ return (*rowp == NULL || *colp == NULL);
+ }
+ #endif
+
volatile void
romhalt()
***************
*** 816,820 ****
}
! static struct device *
parsedisk(str, len, defpart, devp)
char *str;
--- 854,858 ----
}
! struct device *
parsedisk(str, len, defpart, devp)
char *str;
***************
*** 823,827 ****
{
register struct device *dv;
! register char *cp;
int majdev, mindev, part;
--- 861,865 ----
{
register struct device *dv;
! register char *cp, c;
int majdev, mindev, part;
***************
*** 829,839 ****
return (NULL);
cp = str + len - 1;
! if (*cp >= 'a' && *cp <= 'h') {
! part = *cp - 'a';
! *cp-- = '\0';
} else
part = defpart;
! for (dv = alldevs; dv != NULL; dv = dv->dv_next)
if (dv->dv_class == DV_DISK &&
strcmp(str, dv->dv_xname) == 0) {
--- 867,878 ----
return (NULL);
cp = str + len - 1;
! c = *cp;
! if (c >= 'a' && c <= 'h') {
! part = c - 'a';
! *cp = '\0';
} else
part = defpart;
! for (dv = alldevs; dv != NULL; dv = dv->dv_next) {
if (dv->dv_class == DV_DISK &&
strcmp(str, dv->dv_xname) == 0) {
***************
*** 843,850 ****
mindev = (dv->dv_unit << PARTITIONSHIFT) + part;
*devp = makedev(majdev, mindev);
! return (dv);
}
! return (NULL);
}
--- 882,891 ----
mindev = (dv->dv_unit << PARTITIONSHIFT) + part;
*devp = makedev(majdev, mindev);
! break;
}
+ }
! *cp = c;
! return (dv);
}
***************
*** 921,927 ****
case DV_IFNET:
mountroot = nfs_mountroot;
- #ifdef LBL
- lbl_diskless_setup();
- #endif
return;
#endif
--- 962,965 ----
diff -r -c2 /nbsd/sys/sparc/sparc/cpu.c ./sparc/cpu.c
*** /nbsd/sys/sparc/sparc/cpu.c Fri Jun 11 15:16:25 1993
--- ./sparc/cpu.c Thu Sep 30 15:40:07 1993
***************
*** 40,46 ****
* SUCH DAMAGE.
*
! * @(#)cpu.c 8.1 (Berkeley) 6/11/93
*
! * from: $Header: cpu.c,v 1.12 93/05/03 09:47:57 torek Exp $ (LBL)
*/
--- 40,46 ----
* SUCH DAMAGE.
*
! * @(#)cpu.c 8.3 (Berkeley) 9/30/93
*
! * from: $Header: cpu.c,v 1.16.1.1 93/09/30 22:38:50 torek Exp $ (LBL)
*/
***************
*** 51,54 ****
--- 51,55 ----
#include <machine/cpu.h>
#include <machine/reg.h>
+ #include <machine/trap.h>
#include <sparc/sparc/cache.h>
***************
*** 57,70 ****
struct cacheinfo cacheinfo;
! /* the following are used externally (sysctl_hw) */
char machine[] = "sparc";
! char cpu_model[80];
! static char *psrtoname();
! static char *fsrtoname();
/*
* Attach the CPU.
! * Discover interesting goop about the virtual address cache.
*/
static void
--- 58,106 ----
struct cacheinfo cacheinfo;
! /* The following are used externally (sysctl_hw). */
char machine[] = "sparc";
! char cpu_model[100];
! /* The CPU configuration driver. */
! static void cpu_attach __P((struct device *, struct device *, void *));
+ struct cfdriver cpucd =
+ { NULL, "cpu", matchbyname, cpu_attach, DV_CPU, sizeof(struct device) };
+
+ static char *psrtoname __P((int, int, int, char *));
+ static char *fsrtoname __P((int, int, int, char *));
+
+ #define IU_IMPL(psr) ((u_int)(psr) >> 28)
+ #define IU_VERS(psr) (((psr) >> 24) & 0xf)
+
+ #ifdef notdef
/*
+ * IU implementations are parceled out to vendors (with some slight
+ * glitches). Printing these is cute but takes too much space.
+ */
+ static char *iu_vendor[16] = {
+ "Fujitsu", /* and also LSI Logic */
+ "ROSS", /* ROSS (ex-Cypress) */
+ "BIT",
+ "LSIL", /* LSI Logic finally got their own */
+ "TI", /* Texas Instruments */
+ "Matsushita",
+ "Philips",
+ "Harvest", /* Harvest VLSI Design Center */
+ "SPEC", /* Systems and Processes Engineering Corporation */
+ "Weitek",
+ "vendor#10",
+ "vendor#11",
+ "vendor#12",
+ "vendor#13",
+ "vendor#14",
+ "vendor#15"
+ };
+ #endif
+
+ /*
* Attach the CPU.
! * Discover interesting goop about the virtual address cache
! * (slightly funny place to do it, but this is where it is to be found).
*/
static void
***************
*** 75,81 ****
{
register int node, clk, i, l;
! register u_int psr, fver;
register char *fpuname;
struct fpstate fpstate;
/*
--- 111,118 ----
{
register int node, clk, i, l;
! register int impl, vers, fver;
register char *fpuname;
struct fpstate fpstate;
+ char iubuf[40], fpbuf[40];
/*
***************
*** 91,98 ****
savefpstate(&fpstate);
fver = (fpstate.fs_fsr >> FSR_VER_SHIFT) & (FSR_VER >> FSR_VER_SHIFT);
! psr = getpsr();
if (fver != 7) {
foundfpu = 1;
! fpuname = fsrtoname(psr, fver);
} else
fpuname = "no";
--- 128,137 ----
savefpstate(&fpstate);
fver = (fpstate.fs_fsr >> FSR_VER_SHIFT) & (FSR_VER >> FSR_VER_SHIFT);
! i = getpsr();
! impl = IU_IMPL(i);
! vers = IU_VERS(i);
if (fver != 7) {
foundfpu = 1;
! fpuname = fsrtoname(impl, vers, fver, fpbuf);
} else
fpuname = "no";
***************
*** 102,107 ****
clk = getpropint(node, "clock-frequency", 0);
sprintf(cpu_model, "%s (%s @ %s MHz, %s FPU)",
! getpropstring(node, "name"), psrtoname(psr),
! clockfreq(clk), fpuname);
printf(": %s\n", cpu_model);
--- 141,146 ----
clk = getpropint(node, "clock-frequency", 0);
sprintf(cpu_model, "%s (%s @ %s MHz, %s FPU)",
! getpropstring(node, "name"),
! psrtoname(impl, vers, fver, iubuf), clockfreq(clk), fpuname);
printf(": %s\n", cpu_model);
***************
*** 119,206 ****
panic("bad cache line size %d", l);
cacheinfo.c_l2linesize = i;
! vactype = VAC_WRITETHROUGH; /* ??? */
}
! struct cfdriver cpucd =
! { NULL, "cpu", matchbyname, cpu_attach, DV_CPU, sizeof(struct device) };
static char *
! psrtoname(psr)
! register u_int psr;
{
! int impl = psr >> 28, vers = (psr >> 24) & 15;
! switch (impl) {
! case 0:
! if (vers == 0)
! return ("MB86900/1A or L64801");
! break;
! case 1:
! if (vers < 2)
! return ("CY7C601 or L64811");
! if (vers == 3)
! return ("CY7C611");
! break;
! case 2:
! if (vers == 0)
! return ("B5010");
! break;
! case 5:
! if (vers == 0)
! return ("MN10501");
! break;
! }
! return ("???");
! }
! static char *
! fsrtoname(psr, fver)
! register u_int psr, fver;
! {
! switch (psr >> 28) {
! case 0:
! switch (fver) {
! case 0:
! return ("MB86910 or WTL1164/5");
! case 1:
! return ("MB86911 or WTL1164/5");
! case 2:
! return ("L64802 or ACT8847");
! case 3:
! return ("WTL3170/2");
! case 4:
! return ("L64804");
! }
! break;
! case 1:
! switch (fver) {
! case 0:
! return ("L64812 or ACT8847");
! case 1:
! return ("L64814");
! case 2:
! return ("TMS390C602A");
! case 3:
! return ("WTL3171");
! }
! break;
! case 2:
! if (fver == 0)
! return ("B5010 or B5110/20 or B5210");
! break;
! case 5:
! if (fver == 0)
! return ("MN10501");
! }
! return ("???");
}
--- 158,289 ----
panic("bad cache line size %d", l);
cacheinfo.c_l2linesize = i;
+ vactype = VAC_WRITETHROUGH;
! /*
! * Machines with "buserr-type" 1 have a bug in the cache
! * chip that affects traps. (I wish I knew more about this
! * mysterious buserr-type variable....)
! */
! if (getpropint(node, "buserr-type", 0) == 1) {
! kvm_uncache((caddr_t)trapbase, 1);
! printf("%s: cache chip bug; trap page uncached\n",
! dev->dv_xname);
! }
!
! printf("%s: %d byte write-through, %d bytes/line, %cw flush ",
! dev->dv_xname, cacheinfo.c_totalsize, l,
! cacheinfo.c_hwflush ? 'h' : 's');
! cache_enable();
}
! /*
! * The following tables convert <IU impl, IU version, FPU version> triples
! * into names for the CPU and FPU chip. In most cases we do not need to
! * inspect the FPU version to name the IU chip, but there is one exception
! * (for Tsunami), and this makes the tables the same.
! *
! * The table contents (and much of the structure here) are from Guy Harris.
! *
! * NOTE: we have Sun-4m cpu types here, even though this only runs on the
! * Sun-4c (yet)...
! */
! struct info {
! u_char valid;
! u_char iu_impl;
! u_char iu_vers;
! u_char fpu_vers;
! char *name;
! };
+ #define ANY 0xff /* match any FPU version (or, later, IU version) */
+
+ static struct info iu_types[] = {
+ { 1, 0x0, 0x0, ANY, "MB86900/1A or L64801" },
+ { 1, 0x1, 0x0, ANY, "RT601 or L64811 v1" },
+ { 1, 0x1, 0x1, ANY, "RT601 or L64811 v2" },
+ { 1, 0x1, 0x3, ANY, "RT611" },
+ { 1, 0x1, 0xf, ANY, "RT620" },
+ { 1, 0x2, 0x0, ANY, "B5010" },
+ { 1, 0x4, 0x0, 0, "TMS390Z50 v0" },
+ { 1, 0x4, 0x1, 0, "TMS390Z50 v1" },
+ { 1, 0x4, 0x1, 4, "TMS390S10" },
+ { 1, 0x5, 0x0, ANY, "MN10501" },
+ { 1, 0x9, 0x0, ANY, "W8601/8701 or MB86903" },
+ { 0 }
+ };
+
static char *
! psrtoname(impl, vers, fver, buf)
! register int impl, vers, fver;
! char *buf;
{
! register struct info *p;
! for (p = iu_types; p->valid; p++)
! if (p->iu_impl == impl && p->iu_vers == vers &&
! (p->fpu_vers == fver || p->fpu_vers == ANY))
! return (p->name);
! /* Not found. */
! sprintf(buf, "IU impl 0x%x vers 0x%x", impl, vers);
! return (buf);
! }
! /* NB: table order matters here; specific numbers must appear before ANY. */
! static struct info fpu_types[] = {
! /*
! * Vendor 0, IU Fujitsu0.
! */
! { 1, 0x0, ANY, 0, "MB86910 or WTL1164/5" },
! { 1, 0x0, ANY, 1, "MB86911 or WTL1164/5" },
! { 1, 0x0, ANY, 2, "L64802 or ACT8847" },
! { 1, 0x0, ANY, 3, "WTL3170/2" },
! { 1, 0x0, ANY, 4, "L64804" },
! /*
! * Vendor 1, IU ROSS0/1.
! */
! { 1, 0x1, ANY, 0, "L64812 or ACT8847" },
! { 1, 0x1, ANY, 1, "L64814" },
! { 1, 0x1, ANY, 2, "TMS390C602A" },
! { 1, 0x1, ANY, 3, "RT602 or WTL3171" },
! /*
! * Vendor 2, IU BIT0.
! */
! { 1, 0x2, ANY, 0, "B5010 or B5110/20 or B5210" },
! /*
! * Vendor 4, Texas Instruments.
! */
! { 1, 0x4, ANY, 0, "on-chip" }, /* Viking */
! { 1, 0x4, ANY, 4, "on-chip" }, /* Tsunami */
! /*
! * Vendor 5, IU Matsushita0.
! */
! { 1, 0x5, ANY, 0, "on-chip" },
! /*
! * Vendor 9, Weitek.
! */
! { 1, 0x9, ANY, 3, "on-chip" },
! { 0 }
! };
! static char *
! fsrtoname(impl, vers, fver, buf)
! register int impl, vers, fver;
! char *buf;
! {
! register struct info *p;
! for (p = fpu_types; p->valid; p++)
! if (p->iu_impl == impl &&
! (p->iu_vers == vers || p->iu_vers == ANY) &
! p->fpu_vers == fver)
! return (p->name);
! sprintf(buf, "version %x", fver);
! return (buf);
}
diff -r -c2 /nbsd/sys/sparc/sparc/intr.c ./sparc/intr.c
*** /nbsd/sys/sparc/sparc/intr.c Fri Jun 11 15:16:33 1993
--- ./sparc/intr.c Mon Sep 27 14:02:53 1993
***************
*** 40,46 ****
* SUCH DAMAGE.
*
! * @(#)intr.c 8.1 (Berkeley) 6/11/93
*
! * from: $Header: intr.c,v 1.20 92/11/26 03:04:53 torek Exp $ (LBL)
*/
--- 40,46 ----
* SUCH DAMAGE.
*
! * @(#)intr.c 8.2 (Berkeley) 9/27/93
*
! * from: $Header: intr.c,v 1.22 93/09/26 19:48:06 torek Exp $ (LBL)
*/
***************
*** 48,51 ****
--- 48,53 ----
#include <sys/kernel.h>
+ #include <vm/vm.h>
+
#include <net/netisr.h>
***************
*** 73,77 ****
fp->ipl, fp->pc, fp->npc, fp->psr, PSR_BITS);
timesince = time.tv_sec - straytime;
- straytime = time.tv_sec;
if (timesince <= 10) {
if (++nstray > 9)
--- 75,78 ----
***************
*** 251,257 ****
--- 252,262 ----
I_MOVi(I_L3, level), I_BA(0, displ), I_RDPSR(I_L0));
#endif
+ /* kernel text is write protected -- let us in for a moment */
+ pmap_changeprot(kernel_pmap, (vm_offset_t)tv,
+ VM_PROT_READ|VM_PROT_WRITE, 1);
tv->tv_instr[0] = I_SETHI(I_L3, hi22); /* sethi %hi(vec),%l3 */
tv->tv_instr[1] = I_JMPLri(I_G0, I_L3, lo10);/* jmpl %l3+%lo(vec),%g0 */
tv->tv_instr[2] = I_RDPSR(I_L0); /* mov %psr, %l0 */
+ pmap_changeprot(kernel_pmap, (vm_offset_t)tv, VM_PROT_READ, 1);
fastvec |= 1 << level;
splx(s);
diff -r -c2 /nbsd/sys/sparc/sparc/machdep.c ./sparc/machdep.c
*** /nbsd/sys/sparc/sparc/machdep.c Fri Jun 11 15:17:03 1993
--- ./sparc/machdep.c Thu Sep 30 15:41:39 1993
***************
*** 40,46 ****
* SUCH DAMAGE.
*
! * @(#)machdep.c 8.1 (Berkeley) 6/11/93
*
! * from: $Header: machdep.c,v 1.41 93/05/27 04:39:05 torek Exp $
*/
--- 40,46 ----
* SUCH DAMAGE.
*
! * @(#)machdep.c 8.2 (Berkeley) 9/30/93
*
! * from: $Header: machdep.c,v 1.42 93/09/29 05:40:34 torek Exp $
*/
***************
*** 222,234 ****
/*
! * Configure the system.
*/
configure();
-
- /*
- * Turn on the cache (do after configuration due to a bug in
- * some versions of the SPARC chips -- this info from Gilmore).
- */
- cache_enable();
}
--- 222,228 ----
/*
! * Configure the system. The cpu code will turn on the cache.
*/
configure();
}
diff -r -c2 /nbsd/sys/sparc/sparc/pmap.c ./sparc/pmap.c
*** /nbsd/sys/sparc/sparc/pmap.c Fri Jun 11 15:17:25 1993
--- ./sparc/pmap.c Mon Sep 27 14:04:45 1993
***************
*** 40,46 ****
* SUCH DAMAGE.
*
! * @(#)pmap.c 8.1 (Berkeley) 6/11/93
*
! * from: $Header: pmap.c,v 1.39 93/04/20 11:17:12 torek Exp $
*/
--- 40,46 ----
* SUCH DAMAGE.
*
! * @(#)pmap.c 8.2 (Berkeley) 9/27/93
*
! * from: $Header: pmap.c,v 1.40 93/09/27 19:20:44 torek Exp $
*/
***************
*** 344,347 ****
--- 344,375 ----
#define SWTOHW(pg) (pmap_dtos[(pg) >> BSHIFT] | ((pg) & BOFFSET))
+ /*
+ * Sort a memory array by address.
+ */
+ static void
+ sortm(mp, n)
+ register struct memarr *mp;
+ register int n;
+ {
+ register struct memarr *mpj;
+ register int i, j;
+ register u_int addr, len;
+
+ /* Insertion sort. This is O(n^2), but so what? */
+ for (i = 1; i < n; i++) {
+ /* save i'th entry */
+ addr = mp[i].addr;
+ len = mp[i].len;
+ /* find j such that i'th entry goes before j'th */
+ for (j = 0, mpj = mp; j < i; j++, mpj++)
+ if (addr < mpj->addr)
+ break;
+ /* slide up any additional entries */
+ ovbcopy(mpj, mpj + 1, (i - j) * sizeof(*mp));
+ mpj->addr = addr;
+ mpj->len = len;
+ }
+ }
+
#ifdef DEBUG
struct memarr pmap_ama[MA_SIZE];
***************
*** 366,369 ****
--- 394,412 ----
nmem = makememarr(ama, MA_SIZE, MEMARR_AVAILPHYS);
+
+ /*
+ * Open Boot supposedly guarantees at least 3 MB free mem at 0;
+ * this is where the kernel has been loaded (we certainly hope the
+ * kernel is <= 3 MB). We need the memory array to be sorted, and
+ * to start at 0, so that `software page 0' and `hardware page 0'
+ * are the same (otherwise the VM reserves the wrong pages for the
+ * kernel).
+ */
+ sortm(ama, nmem);
+ if (ama[0].addr != 0) {
+ /* cannot panic here; there's no real kernel yet. */
+ printf("init_translations: no kernel memory?!\n");
+ callrom();
+ }
#ifdef DEBUG
pmap_nama = nmem;