bring siginfo stuff for the pmax in sync with the arc and add
authorgraichen <graichen@openbsd.org>
Wed, 5 Feb 1997 23:48:46 +0000 (23:48 +0000)
committergraichen <graichen@openbsd.org>
Wed, 5 Feb 1997 23:48:46 +0000 (23:48 +0000)
BUFCACHEPERCENT for the pmax

sys/arch/pmax/pmax/machdep.c
sys/arch/pmax/pmax/trap.c

index 932b07f..715a4d8 100644 (file)
@@ -723,6 +723,10 @@ mach_init(argc, argv, code, cv)
        valloc(msqids, struct msqid_ds, msginfo.msgmni);
 #endif
 
+#ifndef BUFCACHEPERCENT
+#define BUFCACHEPERCENT 5
+#endif
+
        /*
         * Determine how many buffers to allocate.
         * We allocate more buffer space than the BSD standard of
@@ -730,13 +734,29 @@ mach_init(argc, argv, code, cv)
         * We just allocate a flat 10%.  Ensure a minimum of 16 buffers.
         * We allocate 1/2 as many swap buffer headers as file i/o buffers.
         */
-       if (bufpages == 0)
-               bufpages = physmem / 10 / CLSIZE;
+       if (bufpages == 0) {
+               if (physmem < btoc(2 * 1024 * 1024))
+                       bufpages = physmem / (10 * CLSIZE);
+               else
+                       bufpages = (btoc(2 * 1024 * 1024) + physmem) /
+                           ((100/BUFCACHEPERCENT) * CLSIZE);
+       }
        if (nbuf == 0) {
                nbuf = bufpages;
                if (nbuf < 16)
                        nbuf = 16;
        }
+
+       /* Restrict to at most 70% filled kvm */
+       if (nbuf * MAXBSIZE >
+           (VM_MAX_KERNEL_ADDRESS-VM_MIN_KERNEL_ADDRESS) * 7 / 10)
+               nbuf = (VM_MAX_KERNEL_ADDRESS-VM_MIN_KERNEL_ADDRESS) /
+                   MAXBSIZE * 7 / 10;
+
+       /* More buffer pages than fits into the buffers is senseless.  */
+       if (bufpages > nbuf * MAXBSIZE / CLBYTES)
+               bufpages = nbuf * MAXBSIZE / CLBYTES;
+
        if (nswbuf == 0) {
                nswbuf = (nbuf / 2) &~ 1;       /* force even */
                if (nswbuf > 256)
@@ -798,6 +818,12 @@ cpu_startup()
                panic("startup: cannot allocate buffers");
        base = bufpages / nbuf;
        residual = bufpages % nbuf;
+       if (base >= MAXBSIZE / CLBYTES) {
+               /* don't want to alloc more physical mem than needed */
+               base = MAXBSIZE / CLBYTES;
+               residual = 0;
+       }
+
        for (i = 0; i < nbuf; i++) {
                vm_size_t curbufsize;
                vm_offset_t curbuf;
index 9552a66..88ba03e 100644 (file)
@@ -411,7 +411,7 @@ trap(statusReg, causeReg, vadr, pc, args)
        u_quad_t sticks;
        vm_prot_t ftype;
        extern unsigned onfault_table[];
-       int typ;
+       int typ = 0;
 
 #ifdef DEBUG
        trp->status = statusReg;
@@ -596,7 +596,7 @@ trap(statusReg, causeReg, vadr, pc, args)
                        }
                        goto err;
                }
-               ucode = vadr;
+               ucode = ftype;
                i = SIGSEGV;
                typ = SEGV_MAPERR;
                break;
@@ -604,11 +604,13 @@ trap(statusReg, causeReg, vadr, pc, args)
 
        case T_ADDR_ERR_LD+T_USER:      /* misaligned or kseg access */
        case T_ADDR_ERR_ST+T_USER:      /* misaligned or kseg access */
+               ucode = 0;              /* XXX should be VM_PROT_something */
                i = SIGBUS;
                typ = BUS_ADRALN;
                break;
        case T_BUS_ERR_IFETCH+T_USER:   /* BERR asserted to cpu */
        case T_BUS_ERR_LD_ST+T_USER:    /* BERR asserted to cpu */
+               ucode = 0;              /* XXX should be VM_PROT_something */
                i = SIGBUS;
                typ = BUS_OBJERR;
                break;