Annotation of 43BSDReno/sys/hpstand/boot.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1982, 1986, 1990 The Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution is only permitted until one year after the first shipment
        !             6:  * of 4.4BSD by the Regents.  Otherwise, redistribution and use in source and
        !             7:  * binary forms are permitted provided that: (1) source distributions retain
        !             8:  * this entire copyright notice and comment, and (2) distributions including
        !             9:  * binaries display the following acknowledgement:  This product includes
        !            10:  * software developed by the University of California, Berkeley and its
        !            11:  * contributors'' in the documentation or other materials provided with the
        !            12:  * distribution and in all advertising materials mentioning features or use
        !            13:  * of this software.  Neither the name of the University nor the names of
        !            14:  * its contributors may be used to endorse or promote products derived from
        !            15:  * this software without specific prior written permission.
        !            16:  * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
        !            17:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
        !            18:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            19:  *
        !            20:  *     @(#)boot.c      7.1 (Berkeley) 5/8/90
        !            21:  */
        !            22: 
        !            23: #include <a.out.h>
        !            24: #include "saio.h"
        !            25: #include "../sys/reboot.h"
        !            26: 
        !            27: #ifndef INSECURE
        !            28: #include "../sys/stat.h"
        !            29: struct stat sb;
        !            30: #endif
        !            31: 
        !            32: #define B_MAKEDEV(a,u,p,t) \
        !            33:        (((a) << B_ADAPTORSHIFT) | ((u) << B_UNITSHIFT) | \
        !            34:         ((p) << B_PARTITIONSHIFT) | ((t) << B_TYPESHIFT))
        !            35: 
        !            36: /*
        !            37:  * Boot program... arguments in `devtype' and `howto' determine
        !            38:  * whether boot stops to ask for system name and which device
        !            39:  * boot comes from.
        !            40:  */
        !            41: 
        !            42: /* Types in `devtype' specifying major device */
        !            43: char   devname[][2] = {
        !            44:        0,0,            /* 0 = ct */
        !            45:        0,0,            /* 1 = fd */
        !            46:        'r','d',        /* 2 = rd */
        !            47:        0,0,            /* 3 = sw */
        !            48:        's','d',        /* 4 = sd */
        !            49: };
        !            50: #define        MAXTYPE (sizeof(devname) / sizeof(devname[0]))
        !            51: 
        !            52: #define        UNIX    "vmunix"
        !            53: char line[100];
        !            54: 
        !            55: int    retry = 0;
        !            56: extern char *lowram;
        !            57: extern int noconsole;
        !            58: extern int howto, devtype;
        !            59: 
        !            60: #define        MSUS (0xfffffedc)
        !            61: 
        !            62: char rom2mdev[] = {
        !            63:        0,      /*  0 - none */
        !            64:        0,      /*  1 - none */
        !            65:        0,      /*  2 - none */
        !            66:        0,      /*  3 - none */
        !            67:        0,      /*  4 - none */
        !            68:        0,      /*  5 - none */
        !            69:        0,      /*  6 - none */
        !            70:        0,      /*  7 - none */
        !            71:        0,      /*  8 - none */
        !            72:        0,      /*  9 - none */
        !            73:        0,      /* 10 - none */
        !            74:        0,      /* 11 - none */
        !            75:        0,      /* 12 - none */
        !            76:        0,      /* 13 - none */
        !            77:        4,      /* 14 - SCSI disk */
        !            78:        0,      /* 15 - none */
        !            79:        2,      /* 16 - CS/80 device on HPIB */
        !            80:        2,      /* 17 - CS/80 device on HPIB */
        !            81:        0,      /* 18 - none */
        !            82:        0,      /* 19 - none */
        !            83:        0,      /* 20 - none */
        !            84:        0,      /* 21 - none */
        !            85:        0,      /* 22 - none */
        !            86:        0,      /* 23 - none */
        !            87:        0,      /* 24 - none */
        !            88:        0,      /* 25 - none */
        !            89:        0,      /* 26 - none */
        !            90:        0,      /* 27 - none */
        !            91:        0,      /* 28 - none */
        !            92:        0,      /* 29 - none */
        !            93:        0,      /* 30 - none */
        !            94:        0,      /* 31 - none */
        !            95: };
        !            96: 
        !            97: main()
        !            98: {
        !            99:        register type, part, unit, io;
        !           100:        register char *cp;
        !           101: 
        !           102:        printf("\nBoot\n");
        !           103: #ifdef JUSTASK
        !           104:        howto = RB_ASKNAME|RB_SINGLE;
        !           105: #else
        !           106:        type = (devtype >> B_TYPESHIFT) & B_TYPEMASK;
        !           107:        unit = (devtype >> B_UNITSHIFT) & B_UNITMASK;
        !           108:        unit += 8 * ((devtype >> B_ADAPTORSHIFT) & B_ADAPTORMASK);
        !           109:        part = (devtype >> B_PARTITIONSHIFT) & B_PARTITIONMASK;
        !           110:        if ((howto & RB_ASKNAME) == 0) {
        !           111:                if ((devtype & B_MAGICMASK) != B_DEVMAGIC) {
        !           112:                        /*
        !           113:                         * we have to map the ROM device type codes
        !           114:                         * to Unix major device numbers.
        !           115:                         */
        !           116:                        type = rom2mdev[*(char *)MSUS & 0x1f];
        !           117:                        devtype = (devtype &~ (B_TYPEMASK << B_TYPESHIFT))
        !           118:                                  | (type << B_TYPESHIFT);
        !           119:                }
        !           120:                if (type >= 0 && type <= MAXTYPE && devname[type][0]) {
        !           121:                        cp = line;
        !           122:                        *cp++ = devname[type][0];
        !           123:                        *cp++ = devname[type][1];
        !           124:                        *cp++ = '(';
        !           125:                        if (unit >= 10)
        !           126:                                *cp++ = unit / 10 + '0';
        !           127:                        *cp++ = unit % 10 + '0';
        !           128:                        *cp++ = ',';
        !           129:                        *cp++ = part + '0';
        !           130:                        *cp++ = ')';
        !           131:                        strcpy(cp, UNIX);
        !           132:                } else
        !           133:                        howto = RB_SINGLE|RB_ASKNAME;
        !           134:        }
        !           135: #endif
        !           136:        for (;;) {
        !           137:                if (!noconsole && (howto & RB_ASKNAME)) {
        !           138:                        printf(": ");
        !           139:                        gets(line);
        !           140:                } else
        !           141:                        printf(": %s\n", line);
        !           142:                io = open(line, 0);
        !           143:                if (io >= 0) {
        !           144: #ifndef INSECURE
        !           145:                        (void) fstat(io, &sb);
        !           146:                        if (sb.st_uid || (sb.st_mode & 2)) {
        !           147:                                printf("non-secure file, will not load\n");
        !           148:                                howto = RB_SINGLE|RB_ASKNAME;
        !           149:                                continue;
        !           150:                        }
        !           151: #endif
        !           152:                        if (howto & RB_ASKNAME) {
        !           153:                                /*
        !           154:                                 * Build up devtype register to pass on to
        !           155:                                 * booted program.
        !           156:                                 */ 
        !           157:                                cp = line;
        !           158:                                for (type = 0; type <= MAXTYPE; type++)
        !           159:                                        if ((devname[type][0] == cp[0]) && 
        !           160:                                            (devname[type][1] == cp[1]))
        !           161:                                                break;
        !           162:                                if (type <= MAXTYPE) {
        !           163:                                        cp += 3;
        !           164:                                        unit = *cp++ - '0';
        !           165:                                        if (*cp >= '0' && *cp <= '9')
        !           166:                                                unit = unit * 10 + *cp++ - '0';
        !           167:                                        cp++;
        !           168:                                        part = atol(cp);
        !           169:                                        devtype = B_MAKEDEV(unit >> 3, unit & 7, part, type);
        !           170:                                }
        !           171:                        }
        !           172:                        devtype |= B_DEVMAGIC;
        !           173:                        copyunix(howto, devtype, io);
        !           174:                        close(io);
        !           175:                        howto = RB_SINGLE|RB_ASKNAME;
        !           176:                }
        !           177:        bad:
        !           178:                if (++retry > 2)
        !           179:                        howto = RB_SINGLE|RB_ASKNAME;
        !           180:        }
        !           181: }
        !           182: 
        !           183: /*ARGSUSED*/
        !           184: copyunix(howto, devtype, io)
        !           185:        register howto;         /* d7 contains boot flags */
        !           186:        register devtype;       /* d6 contains boot device */
        !           187:        register io;
        !           188: {
        !           189:        struct exec x;
        !           190:        register int i;
        !           191:        register char *load;    /* a5 contains load addr for unix */
        !           192:        register char *addr;
        !           193: 
        !           194:        i = read(io, (char *)&x, sizeof x);
        !           195:        if (i != sizeof x ||
        !           196:            (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410))
        !           197:                _stop("Bad format\n");
        !           198:        printf("%d", x.a_text);
        !           199:        if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1)
        !           200:                goto shread;
        !           201:        load = addr = lowram;
        !           202:        if (read(io, (char *)addr, x.a_text) != x.a_text)
        !           203:                goto shread;
        !           204:        addr += x.a_text;
        !           205:        if (x.a_magic == 0413 || x.a_magic == 0410)
        !           206:                while ((int)addr & CLOFSET)
        !           207:                        *addr++ = 0;
        !           208:        printf("+%d", x.a_data);
        !           209:        if (read(io, addr, x.a_data) != x.a_data)
        !           210:                goto shread;
        !           211:        addr += x.a_data;
        !           212:        printf("+%d", x.a_bss);
        !           213:        x.a_bss += 128*512;     /* slop */
        !           214:        for (i = 0; i < x.a_bss; i++)
        !           215:                *addr++ = 0;
        !           216:        x.a_entry += (int)lowram;
        !           217:        printf(" start 0x%x\n", x.a_entry);
        !           218: #ifdef __GNUC__
        !           219:        asm("   movl %0,d7" : : "m" (howto));
        !           220:        asm("   movl %0,d6" : : "m" (devtype));
        !           221:        asm("   movl %0,a5" : : "a" (load));
        !           222: #endif
        !           223:        (*((int (*)()) x.a_entry))();
        !           224:        exit();
        !           225: shread:
        !           226:        _stop("Short read\n");
        !           227: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.