[BACK]Return to autoconf.c CVS log [TXT][DIR] Up to [local] / sys / arch / vax / boot / boot

Annotation of sys/arch/vax/boot/boot/autoconf.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: autoconf.c,v 1.9 2003/08/15 23:16:30 deraadt Exp $ */
                      2: /*     $NetBSD: autoconf.c,v 1.19 2002/06/01 15:33:22 ragge Exp $ */
                      3: /*
                      4:  * Copyright (c) 1994, 1998 Ludd, University of Lule}, Sweden.
                      5:  * All rights reserved.
                      6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  * 2. Redistributions in binary form must reproduce the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer in the
                     14:  *    documentation and/or other materials provided with the distribution.
                     15:  * 3. All advertising materials mentioning features or use of this software
                     16:  *    must display the following acknowledgement:
                     17:  *     This product includes software developed at Ludd, University of Lule}.
                     18:  * 4. The name of the author may not be used to endorse or promote products
                     19:  *    derived from this software without specific prior written permission
                     20:  *
                     21:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     22:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     23:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     24:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     25:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     26:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     27:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     28:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     29:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     30:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     31:  */
                     32:
                     33:  /* All bugs are subject to removal without further notice */
                     34:
                     35:
                     36:
                     37: #include <sys/param.h>
                     38:
                     39: #include <lib/libsa/stand.h>
                     40:
                     41: #include "../../include/mtpr.h"
                     42: #include "../../include/sid.h"
                     43: #include "../../include/intr.h"
                     44: #include "../../include/rpb.h"
                     45: #include "../../include/scb.h"
                     46: #include "vaxstand.h"
                     47:
                     48: void autoconf(void);
                     49: void findcpu(void);
                     50: void consinit(void);
                     51: void scbinit(void);
                     52: int getsecs(void);
                     53: void scb_stray(void *);
                     54: void longjmp(int *, int);
                     55: void rtimer(void *);
                     56:
                     57: long *bootregs;
                     58:
                     59: /*
                     60:  * Do some initial setup. Also create a fake RPB for net-booted machines
                     61:  * that don't have an in-prom VMB.
                     62:  */
                     63:
                     64: void
                     65: autoconf(void)
                     66: {
                     67:        int copyrpb = 1;
                     68:        int fromnet = (bootregs[12] != -1);
                     69:
                     70:        findcpu(); /* Configures CPU variables */
                     71:        consinit(); /* Allow us to print out things */
                     72:        scbinit(); /* Fix interval clock etc */
                     73:
                     74: #ifdef DEV_DEBUG
                     75:        printf("Register contents:\n");
                     76:        for (copyrpb = 0; copyrpb < 13; copyrpb++)
                     77:                printf("r%d: %lx\n", copyrpb, bootregs[copyrpb]);
                     78: #endif
                     79:        switch (vax_boardtype) {
                     80:
                     81:        case VAX_BTYP_780:
                     82:        case VAX_BTYP_790:
                     83:        case VAX_BTYP_8000:
                     84:        case VAX_BTYP_9CC:
                     85:        case VAX_BTYP_9RR:
                     86:        case VAX_BTYP_1202:
                     87:                if (fromnet == 0)
                     88:                        break;
                     89:                copyrpb = 0;
                     90:                bootrpb.devtyp = bootregs[0];
                     91:                bootrpb.adpphy = bootregs[1];
                     92:                bootrpb.csrphy = bootregs[2];
                     93:                bootrpb.unit = bootregs[3];
                     94:                bootrpb.rpb_bootr5 = bootregs[5];
                     95:                bootrpb.pfncnt = 0;
                     96:                break;
                     97:
                     98:        case VAX_BTYP_46:
                     99:        case VAX_BTYP_48:
                    100:                {int *map, i;
                    101:
                    102:                /* Map all 16MB of I/O space to low 16MB of memory */
                    103:                map = (int *)0x700000; /* XXX */
                    104:                *(int *)0x20080008 = (int)map; /* XXX */
                    105:                for (i = 0; i < 0x8000; i++)
                    106:                        map[i] = 0x80000000 | i;
                    107:                }break;
                    108:
                    109:                break;
                    110:        }
                    111:
                    112:        if (copyrpb) {
                    113:                struct rpb *prpb = (struct rpb *)bootregs[11];
                    114:                bcopy((caddr_t)prpb, &bootrpb, sizeof(struct rpb));
                    115:                if (prpb->iovec) {
                    116:                        bootrpb.iovec = (int)alloc(prpb->iovecsz);
                    117:                        bcopy((caddr_t)prpb->iovec, (caddr_t)bootrpb.iovec,
                    118:                            prpb->iovecsz);
                    119:                }
                    120:        }
                    121: }
                    122:
                    123: /*
                    124:  * Clock handling routines, needed to do timing in standalone programs.
                    125:  */
                    126:
                    127: volatile int tickcnt;
                    128:
                    129: int
                    130: getsecs(void)
                    131: {
                    132:        return tickcnt/100;
                    133: }
                    134:
                    135: struct ivec_dsp **scb;
                    136: struct ivec_dsp *scb_vec;
                    137: extern struct ivec_dsp idsptch;
                    138: extern int jbuf[10];
                    139:
                    140: static void
                    141: mcheck(void *arg)
                    142: {
                    143:        int off, *mfp = (int *)&arg;
                    144:
                    145:        off = (mfp[7]/4 + 8);
                    146:        printf("Machine check, pc=%x, psl=%x\n", mfp[off], mfp[off+1]);
                    147:        longjmp(jbuf, 1);
                    148: }
                    149:
                    150: /*
                    151:  * Init the SCB and set up a handler for all vectors in the lower space,
                    152:  * to detect unwanted interrupts.
                    153:  */
                    154: void
                    155: scbinit(void)
                    156: {
                    157:        int i;
                    158:
                    159:        /*
                    160:         * Allocate space. We need one page for the SCB, and 128*20 == 2.5k
                    161:         * for the vectors. The SCB must be on a page boundary.
                    162:         */
                    163:        i = (int)alloc(VAX_NBPG + 128*sizeof(scb_vec[0])) + VAX_PGOFSET;
                    164:        i &= ~VAX_PGOFSET;
                    165:
                    166:        mtpr(i, PR_SCBB);
                    167:        scb = (void *)i;
                    168:        scb_vec = (struct ivec_dsp *)(i + VAX_NBPG);
                    169:
                    170:        for (i = 0; i < 128; i++) {
                    171:                scb[i] = &scb_vec[i];
                    172:                (int)scb[i] |= SCB_ISTACK;      /* Only interrupt stack */
                    173:                scb_vec[i] = idsptch;
                    174:                scb_vec[i].hoppaddr = scb_stray;
                    175:                scb_vec[i].pushlarg = (void *) (i * 4);
                    176:                scb_vec[i].ev = NULL;
                    177:        }
                    178:        scb_vec[0xc0/4].hoppaddr = rtimer;
                    179:        scb_vec[4/4].hoppaddr = mcheck;
                    180:
                    181:        if (vax_boardtype != VAX_BTYP_VXT)
                    182:                mtpr(-10000, PR_NICR);          /* Load in count register */
                    183:        mtpr(0x800000d1, PR_ICCS);      /* Start clock and enable interrupt */
                    184:
                    185:        mtpr(20, PR_IPL);
                    186: }
                    187:
                    188: extern int sluttid, senast, skip;
                    189:
                    190: void
                    191: rtimer(void *arg)
                    192: {
                    193:        mtpr(31, PR_IPL);
                    194:        tickcnt++;
                    195:        mtpr(0xc1, PR_ICCS);
                    196:        if (skip)
                    197:                return;
                    198:        if ((vax_boardtype == VAX_BTYP_46) ||
                    199:            (vax_boardtype == VAX_BTYP_48) ||
                    200:            (vax_boardtype == VAX_BTYP_49)) {
                    201:                int nu = sluttid - getsecs();
                    202:                if (senast != nu) {
                    203:                        mtpr(20, PR_IPL);
                    204:                        longjmp(jbuf, 1);
                    205:                }
                    206:        }
                    207: }
                    208:
                    209: #ifdef __ELF__
                    210: #define        IDSPTCH "idsptch"
                    211: #define        EIDSPTCH "eidsptch"
                    212: #define        CMN_IDSPTCH "cmn_idsptch"
                    213: #else
                    214: #define        IDSPTCH "_idsptch"
                    215: #define        EIDSPTCH "_eidsptch"
                    216: #define        CMN_IDSPTCH "_cmn_idsptch"
                    217: #endif
                    218:
                    219: asm("
                    220:        .text
                    221:        .align  2
                    222:        .globl  " IDSPTCH ", " EIDSPTCH "
                    223: " IDSPTCH ":
                    224:        pushr   $0x3f
                    225:        .word   0x9f16
                    226:        .long   " CMN_IDSPTCH "
                    227:        .long   0
                    228:        .long   0
                    229:        .long   0
                    230: " EIDSPTCH ":
                    231:
                    232: " CMN_IDSPTCH ":
                    233:        movl    (sp)+,r0
                    234:        pushl   4(r0)
                    235:        calls   $1,*(r0)
                    236:        popr    $0x3f
                    237:        rei
                    238: ");
                    239:
                    240: /*
                    241:  * Stray interrupt handler.
                    242:  * This function must _not_ save any registers (in the reg save mask).
                    243:  */
                    244: void
                    245: scb_stray(void *arg)
                    246: {
                    247:        static int vector, ipl;
                    248:
                    249:        ipl = mfpr(PR_IPL);
                    250:        vector = (int) arg;
                    251:        printf("stray interrupt: vector 0x%x, ipl %d\n", vector, ipl);
                    252: }

CVSweb