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

Annotation of sys/arch/vax/vax/locore.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: locore.c,v 1.32 2006/08/27 16:55:41 miod Exp $        */
                      2: /*     $NetBSD: locore.c,v 1.43 2000/03/26 11:39:45 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: #include <sys/param.h>
                     37: #include <sys/reboot.h>
                     38: #include <sys/device.h>
                     39: #include <sys/systm.h>
                     40: #include <sys/user.h>
                     41:
                     42: #include <uvm/uvm_extern.h>
                     43:
                     44: #include <machine/cpu.h>
                     45: #include <machine/sid.h>
                     46: #include <machine/param.h>
                     47: #include <machine/vmparam.h>
                     48: #include <machine/pcb.h>
                     49: #include <machine/pte.h>
                     50: #include <machine/pmap.h>
                     51: #include <machine/nexus.h>
                     52: #include <machine/rpb.h>
                     53:
                     54: void   start(struct rpb *);
                     55: void   main(void);
                     56:
                     57: extern paddr_t avail_end;
                     58: paddr_t        esym;
                     59: u_int  proc0paddr;
                     60: char   cpu_model[100];
                     61:
                     62: /*
                     63:  * The strict cpu-dependent information is set up here, in
                     64:  * form of a pointer to a struct that is specific for each cpu.
                     65:  */
                     66: extern struct cpu_dep ka780_calls;
                     67: extern struct cpu_dep ka750_calls;
                     68: extern struct cpu_dep ka860_calls;
                     69: extern struct cpu_dep ka820_calls;
                     70: extern struct cpu_dep ka43_calls;
                     71: extern struct cpu_dep ka46_calls;
                     72: extern struct cpu_dep ka48_calls;
                     73: extern struct cpu_dep ka49_calls;
                     74: extern struct cpu_dep ka53_calls;
                     75: extern struct cpu_dep ka410_calls;
                     76: extern struct cpu_dep ka630_calls;
                     77: extern struct cpu_dep ka650_calls;
                     78: extern struct cpu_dep ka660_calls;
                     79: extern struct cpu_dep ka670_calls;
                     80: extern struct cpu_dep ka680_calls;
                     81: extern struct cpu_dep vxt_calls;
                     82:
                     83: /*
                     84:  * Start is called from boot; the first routine that is called
                     85:  * in kernel. Kernel stack is setup somewhere in a safe place;
                     86:  * but we need to move it to a better known place. Memory
                     87:  * management is disabled, and no interrupt system is active.
                     88:  */
                     89: void
                     90: start(struct rpb *prpb)
                     91: {
                     92:        extern void *scratch;
                     93:
                     94:        mtpr(AST_NO, PR_ASTLVL); /* Turn off ASTs */
                     95:
                     96:        findcpu(); /* Set up the CPU identifying variables */
                     97:
                     98:        if (vax_confdata & 0x80)
                     99:                strlcpy(cpu_model, "MicroVAX ", sizeof cpu_model);
                    100:        else
                    101:                strlcpy(cpu_model, "VAXstation ", sizeof cpu_model);
                    102:
                    103:        switch (vax_boardtype) {
                    104: #if VAX780
                    105:        case VAX_BTYP_780:
                    106:                dep_call = &ka780_calls;
                    107:                strlcpy(cpu_model,"VAX 11/780", sizeof cpu_model);
                    108:                if (vax_cpudata & 0x100)
                    109:                        cpu_model[9] = '5';
                    110:                break;
                    111: #endif
                    112: #if VAX750
                    113:        case VAX_BTYP_750:
                    114:                dep_call = &ka750_calls;
                    115:                strlcpy(cpu_model, "VAX 11/750", sizeof cpu_model);
                    116:                break;
                    117: #endif
                    118: #if VAX8600
                    119:        case VAX_BTYP_790:
                    120:                dep_call = &ka860_calls;
                    121:                strlcpy(cpu_model,"VAX 8600", sizeof cpu_model);
                    122:                if (vax_cpudata & 0x100)
                    123:                        cpu_model[6] = '5';
                    124:                break;
                    125: #endif
                    126: #if VAX410
                    127:        case VAX_BTYP_420: /* They are very similar */
                    128:                dep_call = &ka410_calls;
                    129:                strlcat(cpu_model, "3100", sizeof cpu_model);
                    130:                switch ((vax_siedata >> 8) & 0xff) {
                    131:                case 0x00:
                    132:                        strlcat(cpu_model, "/m{30,40}", sizeof cpu_model);
                    133:                        break;
                    134:                case 0x01:
                    135:                        strlcat(cpu_model, "/m{38,48}", sizeof cpu_model);
                    136:                        break;
                    137:                case 0x02:
                    138:                        strlcat(cpu_model, "/m{10,20}{,e}", sizeof cpu_model);
                    139:                        break;
                    140:                }
                    141:                break;
                    142:
                    143:        case VAX_BTYP_410:
                    144:                dep_call = &ka410_calls;
                    145:                strlcat(cpu_model, "2000", sizeof cpu_model);
                    146:                break;
                    147: #endif
                    148: #if VAX43
                    149:        case VAX_BTYP_43:
                    150:                dep_call = &ka43_calls;
                    151:                strlcat(cpu_model, "3100/m76", sizeof cpu_model);
                    152:                break;
                    153: #endif
                    154: #if VAX46
                    155:        case VAX_BTYP_46:
                    156:                dep_call = &ka46_calls;
                    157:                switch(vax_siedata & 0xff) {
                    158:                case VAX_VTYP_47:
                    159:                        strlcpy(cpu_model, "MicroVAX 3100 m80", sizeof cpu_model);
                    160:                        break;
                    161:                case VAX_VTYP_46:
                    162:                        strlcpy(cpu_model, "VAXstation 4000/60", sizeof cpu_model);
                    163:                        break;
                    164:                default:
                    165:                        strlcat(cpu_model, " - Unknown Mariah", sizeof cpu_model);
                    166:                }
                    167:                break;
                    168: #endif
                    169: #ifdef VXT
                    170:        case VAX_BTYP_VXT:
                    171:                dep_call = &vxt_calls;
                    172:                strlcpy(cpu_model, "VXT2000", sizeof cpu_model);
                    173:                break;
                    174: #endif
                    175: #if VAX48
                    176:        case VAX_BTYP_48:
                    177:                dep_call = &ka48_calls;
                    178:                switch ((vax_siedata >> 8) & 0xff) {
                    179:                case VAX_STYP_45:
                    180:                        strlcpy(cpu_model, "MicroVAX 3100/m{30,40}", sizeof cpu_model);
                    181:                        break;
                    182:                case VAX_STYP_48:
                    183:                        strlcpy(cpu_model, "VAXstation 4000/VLC", sizeof cpu_model);
                    184:                        break;
                    185:                default:
                    186:                        strlcat(cpu_model, " - Unknown SOC", sizeof cpu_model);
                    187:                }
                    188:                break;
                    189: #endif
                    190: #if VAX49
                    191:        case VAX_BTYP_49:
                    192:                dep_call = &ka49_calls;
                    193:                strlcpy(cpu_model, "VAXstation 4000/90", sizeof cpu_model);
                    194:                break;
                    195: #endif
                    196: #if VAX53
                    197:        case VAX_BTYP_1303:
                    198:                dep_call = &ka53_calls;
                    199:                switch ((vax_siedata >> 8) & 0xff) {
                    200:                case VAX_STYP_50:
                    201:                        strlcpy(cpu_model, "MicroVAX 3100 model 85 or 90", sizeof cpu_model);
                    202:                        break;
                    203:                case VAX_STYP_51:
                    204:                        strlcpy(cpu_model, "MicroVAX 3100 model 90 or 95", sizeof cpu_model);
                    205:                        break;
                    206:                case VAX_STYP_52:
                    207:                        strlcpy(cpu_model, "VAX 4000 100", sizeof cpu_model);
                    208:                        break;
                    209:                case VAX_STYP_53:
                    210:                        strlcpy(cpu_model, "VAX 4000 105A", sizeof cpu_model);
                    211:                        break;
                    212:                default:
                    213:                        strlcpy(cpu_model, "VAX - Unknown Cheetah Class", sizeof cpu_model);
                    214:                }
                    215:                break;
                    216: #endif
                    217: #if VAX630
                    218:        case VAX_BTYP_630:
                    219:                dep_call = &ka630_calls;
                    220:                strlcpy(cpu_model,"MicroVAX II", sizeof cpu_model);
                    221:                break;
                    222: #endif
                    223: #if VAX650
                    224:        case VAX_BTYP_650:
                    225:                dep_call = &ka650_calls;
                    226:                strlcpy(cpu_model,"MicroVAX ", sizeof cpu_model);
                    227:                switch ((vax_siedata >> 8) & 255) {
                    228:                case VAX_SIE_KA640:
                    229:                        strlcat(cpu_model, "3300/3400", sizeof cpu_model);
                    230:                        break;
                    231:
                    232:                case VAX_SIE_KA650:
                    233:                        strlcat(cpu_model, "3500/3600", sizeof cpu_model);
                    234:                        break;
                    235:
                    236:                case VAX_SIE_KA655:
                    237:                        strlcat(cpu_model, "3800/3900", sizeof cpu_model);
                    238:                        break;
                    239:
                    240:                default:
                    241:                        strlcat(cpu_model, "III", sizeof cpu_model);
                    242:                        break;
                    243:                }
                    244:                break;
                    245: #endif
                    246: #if VAX660
                    247:        case VAX_BTYP_660:
                    248:                dep_call = &ka660_calls;
                    249:                strlcpy(cpu_model,"VAX 4000 200", sizeof cpu_model);
                    250:                break;
                    251: #endif
                    252: #if VAX670
                    253:        case VAX_BTYP_670:
                    254:                dep_call = &ka670_calls;
                    255:                strlcpy(cpu_model,"VAX 4000 300", sizeof cpu_model);
                    256:                break;
                    257: #endif
                    258: #if VAX680
                    259:        case VAX_BTYP_1301:
                    260:                dep_call = &ka680_calls;
                    261:                strlcpy(cpu_model,"VAX 4000 ", sizeof cpu_model);
                    262:                switch ((vax_siedata >> 8) & 0xff) {
                    263:                case VAX_STYP_675:
                    264:                        strlcat(cpu_model,"400", sizeof cpu_model);
                    265:                        break;
                    266:                case VAX_STYP_680:
                    267:                        strlcat(cpu_model,"500", sizeof cpu_model);
                    268:                        break;
                    269:                case VAX_STYP_690:
                    270:                        strlcat(cpu_model,"600", sizeof cpu_model);
                    271:                        break;
                    272:                default:
                    273:                        strlcat(cpu_model,"- Unknown Omega Class", sizeof cpu_model);
                    274:                }
                    275:                break;
                    276:        case VAX_BTYP_1305:
                    277:                dep_call = &ka680_calls;
                    278:                strlcpy(cpu_model,"VAX 4000 ", sizeof cpu_model);
                    279:                switch ((vax_siedata >> 8) & 0xff) {
                    280:                case VAX_STYP_681:
                    281:                        strlcat(cpu_model,"500A", sizeof cpu_model);
                    282:                        break;
                    283:                case VAX_STYP_691:
                    284:                        strlcat(cpu_model,"605A", sizeof cpu_model);
                    285:                        break;
                    286:                case VAX_STYP_694:
                    287:                        if (vax_cpudata & 0x1000)
                    288:                                strlcat(cpu_model,"705A", sizeof cpu_model);
                    289:                        else
                    290:                                strlcat(cpu_model,"700A", sizeof cpu_model);
                    291:                        break;
                    292:                default:
                    293:                        strlcat(cpu_model,"- Unknown Legacy Class", sizeof cpu_model);
                    294:                }
                    295:                break;
                    296: #endif
                    297: #if VAX8200
                    298:        case VAX_BTYP_8000:
                    299:                mastercpu = mfpr(PR_BINID);
                    300:                dep_call = &ka820_calls;
                    301:                strlcpy(cpu_model, "VAX 8200", sizeof cpu_model);
                    302:                break;
                    303: #endif
                    304:        default:
                    305:                /* CPU not supported, just give up */
                    306:                asm("halt");
                    307:        }
                    308:
                    309:        /*
                    310:         * Machines older than MicroVAX II have their boot blocks
                    311:         * loaded directly or the boot program loaded from console
                    312:         * media, so we need to figure out their memory size.
                    313:         * This is not easily done on MicroVAXen, so we get it from
                    314:         * VMB instead.
                    315:         *
                    316:         * In post-1.4 a RPB is always provided from the boot blocks.
                    317:         */
                    318: #if 1 /* compat with old bootblocks */
                    319:        if (prpb == 0) {
                    320:                bzero((caddr_t)proc0paddr + REDZONEADDR, sizeof(struct rpb));
                    321:                prpb = (struct rpb *)(proc0paddr + REDZONEADDR);
                    322:                prpb->pfncnt = avail_end >> VAX_PGSHIFT;
                    323:                prpb->rpb_base = (void *)-1;    /* RPB is fake */
                    324:        } else
                    325: #endif
                    326:        bcopy(prpb, (caddr_t)proc0paddr + REDZONEADDR, sizeof(struct rpb));
                    327:        if (prpb->pfncnt)
                    328:                avail_end = prpb->pfncnt << VAX_PGSHIFT;
                    329:        else
                    330:                while (badaddr((caddr_t)avail_end, 4) == 0)
                    331:                        avail_end += VAX_NBPG * 128;
                    332:        boothowto = prpb->rpb_bootr5;
                    333:
                    334:         avail_end = TRUNC_PAGE(avail_end); /* be sure */
                    335:
                    336:        proc0.p_addr = (struct user *)proc0paddr; /* XXX */
                    337:        bzero((struct user *)proc0paddr, sizeof(struct user));
                    338:
                    339:        /* Clear the used parts of the uarea except for the pcb */
                    340:        bzero(&proc0.p_addr->u_stats, sizeof(struct user) - sizeof(struct pcb));
                    341:
                    342:        pmap_bootstrap();
                    343:
                    344:        /* Now running virtual. set red zone for proc0 */
                    345:        *kvtopte((u_int)proc0.p_addr + REDZONEADDR) &= ~PG_V;
                    346:
                    347:        ((struct pcb *)proc0paddr)->framep = scratch;
                    348:
                    349:        /*
                    350:         * Change mode down to userspace is done by faking a stack
                    351:         * frame that is setup in cpu_set_kpc(). Not done by returning
                    352:         * from main anymore.
                    353:         */
                    354:        main();
                    355:        /* NOTREACHED */
                    356: }

CVSweb