[BACK]Return to bootxx.c CVS log [TXT][DIR] Up to [local] / sys / arch / alpha / stand

Annotation of sys/arch/alpha/stand/bootxx.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: bootxx.c,v 1.10 2004/07/05 19:59:17 deraadt Exp $     */
                      2: /*     $NetBSD: bootxx.c,v 1.4 1997/01/18 00:28:59 cgd Exp $   */
                      3:
                      4: /*
                      5:  * Copyright (c) 1995 Carnegie-Mellon University.
                      6:  * All rights reserved.
                      7:  *
                      8:  * Author: Chris G. Demetriou
                      9:  *
                     10:  * Permission to use, copy, modify and distribute this software and
                     11:  * its documentation is hereby granted, provided that both the copyright
                     12:  * notice and this permission notice appear in all copies of the
                     13:  * software, derivative works or modified versions, and any portions
                     14:  * thereof, and that both notices appear in supporting documentation.
                     15:  *
                     16:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     17:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
                     18:  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     19:  *
                     20:  * Carnegie Mellon requests users of this software to return to
                     21:  *
                     22:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
                     23:  *  School of Computer Science
                     24:  *  Carnegie Mellon University
                     25:  *  Pittsburgh PA 15213-3890
                     26:  *
                     27:  * any improvements or extensions that they make and grant Carnegie the
                     28:  * rights to redistribute these changes.
                     29:  */
                     30:
                     31: #include <sys/param.h>
                     32: #include <machine/rpb.h>
                     33: #include <machine/prom.h>
                     34:
                     35: #include "bbinfo.h"
                     36:
                     37: extern _end, start;
                     38:
                     39: struct bbinfoloc desc = {
                     40:        0xbabefacedeadbeef,
                     41:        (u_int64_t)&start,
                     42:        (u_int64_t)&_end,
                     43:        { 0, },
                     44:        0xdeadbeeffacebabe
                     45: };
                     46:
                     47: int
                     48: open_dev(fd)
                     49:        int *fd;
                     50: {
                     51:        prom_return_t ret;
                     52:        char devname[64];
                     53:        int devlen;
                     54:
                     55:        /*
                     56:         * XXX
                     57:          * We don't know what device names look like yet,
                     58:          * so we can't change them.
                     59:          */
                     60:         ret.bits = prom_getenv(PROM_E_BOOTED_DEV, devname, sizeof(devname));
                     61:         devlen = ret.u.retval;
                     62:
                     63:         ret.bits = prom_open(devname, devlen);
                     64:         if (ret.u.status)
                     65:                 return 0;
                     66:
                     67:        *fd = ret.u.retval;
                     68:
                     69:        return 1;
                     70: }
                     71:
                     72: int
                     73: load_file(bbinfop, loadaddr)
                     74:        struct bbinfo *bbinfop;
                     75:        char *loadaddr;
                     76: {
                     77:        prom_return_t ret;
                     78:        int32_t cksum, *int32p;
                     79:        int i, n, fd, rv;
                     80:        char *cp;
                     81:
                     82:        if (bbinfop->nblocks <= 0) {
                     83:                puts("invalid number of blocks in boot program description\n");
                     84:                return 0;
                     85:        }
                     86:        if (bbinfop->bsize < DEV_BSIZE || bbinfop->bsize > MAXBSIZE) {
                     87:                puts("invalid block size in boot program description\n");
                     88:                return 0;
                     89:        }
                     90:
                     91:        int32p = (int32_t *)&_end;
                     92:        n = bbinfop->nblocks +
                     93:            (sizeof(*bbinfop) / sizeof(bbinfop->blocks[0])) - 1;
                     94:        if ((long)&_end - (long)&start + sizeof(bbinfop->blocks[0]) * n >
                     95:            15 * 512) {
                     96:                puts("way too many blocks\n");
                     97:                return 0;
                     98:        }
                     99:
                    100:        for (i = 0, cksum = 0; i < n; i++)
                    101:                cksum += *int32p++;
                    102:        if (cksum != 0) {
                    103:                puts("invalid checksum in boot program description\n");
                    104:                return 0;
                    105:        }
                    106:
                    107:        if (!open_dev(&fd)) {
                    108:                puts("couldn't open disk device\n");
                    109:                return 0;
                    110:        }
                    111:
                    112:        cp = loadaddr;
                    113:        rv = 1;
                    114:        for (i = 0; i < bbinfop->nblocks; i++) {
                    115: puts(".");
                    116:                ret.bits = prom_read(fd, bbinfop->bsize, cp,
                    117:                    bbinfop->blocks[i]);
                    118: puts("\b");
                    119:                if (ret.u.status) {
                    120:                        rv = 0;
                    121:                        puts("BLOCK READ ERROR!\n");
                    122:                        break;
                    123:                }
                    124:                cp += bbinfop->bsize;
                    125:        }
                    126:        prom_close(fd);
                    127:
                    128:        return (rv);
                    129: }
                    130:
                    131: int
                    132: main()
                    133: {
                    134:        struct bbinfo *bbinfop;
                    135:        char *loadaddr;
                    136:        void (*entry)(void);
                    137:
                    138:        /* Init prom callback vector. */
                    139:        init_prom_calls();
                    140:
                    141:        puts("\nOpenBSD/Alpha Primary Boot\n");
                    142:
                    143:        bbinfop = (struct bbinfo *)&_end;
                    144:        loadaddr = (char *)SECONDARY_LOAD_ADDRESS;
                    145:        if (!load_file(bbinfop, loadaddr)) {
                    146:                puts("\nLOAD FAILED!\n\n");
                    147:                return;
                    148:        }
                    149:
                    150: #if 0
                    151:        puts("Jumping to entry point...\n");
                    152: #endif
                    153:        entry = (void (*)())loadaddr;
                    154:        (*entry)();
                    155:        puts("SECONDARY BOOT BLOCK RETURNED!\n");
                    156: }

CVSweb