don't get stuck on stray interrupts,
entries_pageable set TRUE for buffer map (set vm_map.c change).
SCCS-vsn: sys/hp300/hp300/machdep.c 8.4
*
* from: Utah $Hdr: machdep.c 1.74 92/12/20$
*
*
* from: Utah $Hdr: machdep.c 1.74 92/12/20$
*
- * @(#)machdep.c 8.3 (Berkeley) %G%
+ * @(#)machdep.c 8.4 (Berkeley) %G%
*/
#include <sys/param.h>
*/
#include <sys/param.h>
int base, residual;
vm_offset_t minaddr, maxaddr;
vm_size_t size;
int base, residual;
vm_offset_t minaddr, maxaddr;
vm_size_t size;
+#ifdef BUFFERS_UNMANAGED
+ vm_offset_t bufmemp;
+ caddr_t buffermem;
+ int ix;
+#endif
#ifdef DEBUG
extern int pmapdebug;
int opmapdebug = pmapdebug;
#ifdef DEBUG
extern int pmapdebug;
int opmapdebug = pmapdebug;
firstaddr = (caddr_t) kmem_alloc(kernel_map, round_page(size));
if (firstaddr == 0)
panic("startup: no room for tables");
firstaddr = (caddr_t) kmem_alloc(kernel_map, round_page(size));
if (firstaddr == 0)
panic("startup: no room for tables");
+#ifdef BUFFERS_UNMANAGED
+ buffermem = (caddr_t) kmem_alloc(kernel_map, bufpages*CLBYTES);
+ if (buffermem == 0)
+ panic("startup: no room for buffers");
+#endif
*/
size = MAXBSIZE * nbuf;
buffer_map = kmem_suballoc(kernel_map, (vm_offset_t *)&buffers,
*/
size = MAXBSIZE * nbuf;
buffer_map = kmem_suballoc(kernel_map, (vm_offset_t *)&buffers,
- &maxaddr, size, FALSE);
minaddr = (vm_offset_t)buffers;
if (vm_map_find(buffer_map, vm_object_allocate(size), (vm_offset_t)0,
&minaddr, size, FALSE) != KERN_SUCCESS)
panic("startup: cannot allocate buffers");
base = bufpages / nbuf;
residual = bufpages % nbuf;
minaddr = (vm_offset_t)buffers;
if (vm_map_find(buffer_map, vm_object_allocate(size), (vm_offset_t)0,
&minaddr, size, FALSE) != KERN_SUCCESS)
panic("startup: cannot allocate buffers");
base = bufpages / nbuf;
residual = bufpages % nbuf;
+#ifdef BUFFERS_UNMANAGED
+ bufmemp = (vm_offset_t) buffermem;
+#endif
for (i = 0; i < nbuf; i++) {
vm_size_t curbufsize;
vm_offset_t curbuf;
for (i = 0; i < nbuf; i++) {
vm_size_t curbufsize;
vm_offset_t curbuf;
*/
curbuf = (vm_offset_t)buffers + i * MAXBSIZE;
curbufsize = CLBYTES * (i < residual ? base+1 : base);
*/
curbuf = (vm_offset_t)buffers + i * MAXBSIZE;
curbufsize = CLBYTES * (i < residual ? base+1 : base);
+#ifdef BUFFERS_UNMANAGED
+ /*
+ * Move the physical pages over from buffermem.
+ */
+ for (ix = 0; ix < curbufsize/CLBYTES; ix++) {
+ vm_offset_t pa;
+
+ pa = pmap_extract(kernel_pmap, bufmemp);
+ if (pa == 0)
+ panic("startup: unmapped buffer");
+ pmap_remove(kernel_pmap, bufmemp, bufmemp+CLBYTES);
+ pmap_enter(kernel_pmap,
+ (vm_offset_t)(curbuf + ix * CLBYTES),
+ pa, VM_PROT_READ|VM_PROT_WRITE, TRUE);
+ bufmemp += CLBYTES;
+ }
+#else
vm_map_pageable(buffer_map, curbuf, curbuf+curbufsize, FALSE);
vm_map_simplify(buffer_map, curbuf);
vm_map_pageable(buffer_map, curbuf, curbuf+curbufsize, FALSE);
vm_map_simplify(buffer_map, curbuf);
+#ifdef BUFFERS_UNMANAGED
+#if 0
+ /*
+ * We would like to free the (now empty) original address range
+ * but too many bad things will happen if we try.
+ */
+ kmem_free(kernel_map, (vm_offset_t)buffermem, bufpages*CLBYTES);
+#endif
+#endif
/*
* Allocate a submap for exec arguments. This map effectively
* limits the number of processes exec'ing at any time.
/*
* Allocate a submap for exec arguments. This map effectively
* limits the number of processes exec'ing at any time.
register int howto;
{
/* take a snap shot before clobbering any registers */
register int howto;
{
/* take a snap shot before clobbering any registers */
+ if (curproc && curproc->p_addr)
savectx(curproc->p_addr, 0);
boothowto = howto;
savectx(curproc->p_addr, 0);
boothowto = howto;
if (panicstr == 0)
vnode_pager_umount(NULL);
#ifdef notdef
if (panicstr == 0)
vnode_pager_umount(NULL);
#ifdef notdef
-#include "fd.h"
-#if NFD > 0
- fdshutdown();
+#include "vn.h"
+#if NVN > 0
+ vnshutdown();
#endif
#endif
sync(&proc0, (void *)NULL, (int *)NULL);
#endif
#endif
sync(&proc0, (void *)NULL, (int *)NULL);
register int found = 0;
register int ipl;
extern struct isr isrqueue[];
register int found = 0;
register int ipl;
extern struct isr isrqueue[];
ipl = (sr >> 8) & 7;
switch (ipl) {
ipl = (sr >> 8) & 7;
switch (ipl) {
+ if (found)
+ straycount = 0;
+ else if (++straycount > 50)
+ panic("intrhand: stray interrupt");
+ else
printf("stray interrupt, sr 0x%x\n", sr);
break;
printf("stray interrupt, sr 0x%x\n", sr);
break;
- printf("intrhand: unexpected sr 0x%x\n", sr);
+ if (++straycount > 50)
+ panic("intrhand: unexpected sr");
+ else
+ printf("intrhand: unexpected sr 0x%x\n", sr);