Annotation of Net2/arch/i386/boot/version.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Ported to boot 386BSD by Julian Elischer ([email protected]) Sept 1992
                      3:  *
                      4:  * Mach Operating System
                      5:  * Copyright (c) 1992, 1991 Carnegie Mellon University
                      6:  * All Rights Reserved.
                      7:  * 
                      8:  * Permission to use, copy, modify and distribute this software and its
                      9:  * documentation is hereby granted, provided that both the copyright
                     10:  * notice and this permission notice appear in all copies of the
                     11:  * software, derivative works or modified versions, and any portions
                     12:  * thereof, and that both notices appear in supporting documentation.
                     13:  * 
                     14:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     15:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     16:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     17:  * 
                     18:  * Carnegie Mellon requests users of this software to return to
                     19:  * 
                     20:  *  Software Distribution Coordinator  or  [email protected]
                     21:  *  School of Computer Science
                     22:  *  Carnegie Mellon University
                     23:  *  Pittsburgh PA 15213-3890
                     24:  * 
                     25:  * any improvements or extensions that they make and grant Carnegie Mellon
                     26:  * the rights to redistribute these changes.
                     27:  */
                     28: 
                     29: /*
                     30:  * HISTORY
                     31:  * $Log: version.c,v $
                     32:  * Revision 1.1  1993/03/21 18:08:26  cgd
                     33:  * after 0.2.2 "stable" patches applied
                     34:  *
                     35:  * Revision 2.2  92/04/04  11:34:37  rpd
                     36:  *     Change date in banner.
                     37:  *     [92/04/03  16:51:14  rvb]
                     38:  * 
                     39:  *     Fix Intel Copyright as per B. Davies authorization.
                     40:  *     [92/04/03            rvb]
                     41:  *     From 2.5 version.
                     42:  *     [92/03/30            mg32]
                     43:  * 
                     44:  */
                     45: 
                     46: /*
                     47:   Copyright 1988, 1989, 1990, 1991, 1992 
                     48:    by Intel Corporation, Santa Clara, California.
                     49: 
                     50:                 All Rights Reserved
                     51: 
                     52: Permission to use, copy, modify, and distribute this software and
                     53: its documentation for any purpose and without fee is hereby
                     54: granted, provided that the above copyright notice appears in all
                     55: copies and that both the copyright notice and this permission notice
                     56: appear in supporting documentation, and that the name of Intel
                     57: not be used in advertising or publicity pertaining to distribution
                     58: of the software without specific, written prior permission.
                     59: 
                     60: INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
                     61: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
                     62: IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
                     63: CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
                     64: LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
                     65: NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
                     66: WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     67: */
                     68: 
                     69: #include <sys/param.h>
                     70: #include "boot.h"
                     71: #include <a.out.h>
                     72: #include <sys/reboot.h>
                     73: 
                     74: 
                     75: struct exec head;
                     76: int argv[10], esym;
                     77: char *name;
                     78: char *names[] = {
                     79:        "/386bsd", "/386bsd.old",
                     80:        "/vmunix", "/vmunix.old"
                     81: };
                     82: #define NUMNAMES       (sizeof(names)/sizeof(char *))
                     83: 
                     84: extern int end;
                     85: boot(drive)
                     86: int drive;
                     87: {
                     88:        int loadflags, currname = 0;
                     89:        printf("\n>> 386bsd BOOT @ 0x%x: %d/%d k of memory  [20/9/92]\n",
                     90:                ouraddr,
                     91:                argv[7] = memsize(0),
                     92:                argv[8] = memsize(1));
                     93:        printf("use options hd(1,...... to boot sd0 when wd0 is also installed\n");
                     94:        gateA20();
                     95: loadstart:
                     96:        /***************************************************************\
                     97:        * As a default set it to the first partition of the first       *
                     98:        * floppy or hard drive                                          *
                     99:        \***************************************************************/
                    100:        part = unit = 0;
                    101:        maj = (drive&0x80 ? 0 : 2);             /* a good first bet */
                    102:        name = names[currname++];
                    103: 
                    104:        loadflags = 0;
                    105:        if (currname == NUMNAMES)
                    106:                currname = 0;
                    107:        getbootdev(&loadflags);
                    108:        if (openrd()) {
                    109:                printf("Can't find %s\n", name);
                    110:                goto loadstart;
                    111:        }
                    112: /*     if (inode.i_mode&IEXEC)
                    113:                loadflags |= RB_KDB;
                    114: */
                    115:        loadprog(loadflags);
                    116:        goto loadstart;
                    117: }
                    118: 
                    119: loadprog(howto)
                    120:        int             howto;
                    121: {
                    122:        long int startaddr;
                    123:        long int addr;  /* physical address.. not directly useable */
                    124:        int i;
                    125:        static int (*x_entry)() = 0;
                    126:        unsigned char   tmpbuf[4096]; /* we need to load the first 4k here */
                    127: 
                    128:        argv[3] = 0;
                    129:        argv[4] = 0;
                    130:        read(&head, sizeof(head));
                    131:        if (head.a_magic == 0413 )
                    132:        {
                    133:                poff = 4096;
                    134:        }
                    135:        else
                    136:        {
                    137:                printf("Invalid format!\n");
                    138:                return;
                    139:        }
                    140: 
                    141:        startaddr = (int)head.a_entry;
                    142:        addr = (startaddr & 0x00f00000); /* some MEG boundary */
                    143:        printf("Booting %s(%d,%c)%s @ 0x%x\n"
                    144:                        , devs[maj]
                    145:                        , unit
                    146:                        , 'a'+part
                    147:                        , name
                    148:                        , addr);
                    149:        if(addr < ouraddr)
                    150:        {
                    151:                if((addr + head.a_text + head.a_data) > ouraddr)
                    152:                {
                    153:                        printf("kernel will not fit below loader\n");
                    154:                        return;
                    155:                }
                    156:                if((addr + head.a_text + head.a_data + head.a_bss) > 0xa0000)
                    157:                {
                    158:                        printf("kernel too big, won't fit in 640K with bss\n");
                    159:                        printf("Only hope is to link the kernel for > 1MB\n");
                    160:                        return;
                    161:                }
                    162:                if((addr + head.a_text + head.a_data + head.a_bss) > ouraddr)
                    163:                {
                    164:                        printf("loader overlaps bss, kernel must bzero\n");
                    165:                }
                    166:        }
                    167:        printf("text=0x%x", head.a_text);
                    168:        /********************************************************/
                    169:        /* LOAD THE TEXT SEGMENT                                */
                    170:        /* don't clobber the first 4k yet (BIOS NEEDS IT)       */
                    171:        /********************************************************/
                    172:        read(tmpbuf,4096);
                    173:        addr += 4096; 
                    174:        xread(addr, head.a_text - 4096);
                    175:        addr += head.a_text - 4096;
                    176: 
                    177:        /********************************************************/
                    178:        /* Load the Initialised data after the text             */
                    179:        /********************************************************/
                    180:        while (addr & CLOFSET)
                    181:                 *(char *)addr++ = 0;
                    182: 
                    183:        printf(" data=0x%x", head.a_data);
                    184:        xread(addr, head.a_data);
                    185:        addr += head.a_data;
                    186: 
                    187:        /********************************************************/
                    188:        /* Skip over the uninitialised data                     */
                    189:        /* (but clear it)                                       */
                    190:        /********************************************************/
                    191:        printf(" bss=0x%x", head.a_bss);
                    192:        if( (addr < ouraddr) && ((addr + head.a_bss) > ouraddr))
                    193:        {
                    194:                pbzero(addr,ouraddr - (int)addr);
                    195:        }
                    196:        else
                    197:        {
                    198:                pbzero(addr,head.a_bss);
                    199:        }
                    200:        argv[3] = (addr += head.a_bss);
                    201: 
                    202: #ifdef LOADSYMS /* not yet, haven't worked this out yet */
                    203:        if (addr > 0x100000)
                    204:        {
                    205:                /********************************************************/
                    206:                /*copy in the symbol header                             */
                    207:                /********************************************************/
                    208:                pcpy(&head.a_syms, addr, sizeof(head.a_syms));
                    209:                addr += sizeof(head.a_syms);
                    210:        
                    211:                /********************************************************/
                    212:                /* READ in the symbol table                             */
                    213:                /********************************************************/
                    214:                printf(" symbols=[+0x%x", head.a_syms);
                    215:                xread(addr, head.a_syms);
                    216:                addr += head.a_syms;
                    217:        
                    218:                /********************************************************/
                    219:                /* Followed by the next integer (another header)        */
                    220:                /* more debug symbols?                                  */
                    221:                /********************************************************/
                    222:                read(&i, sizeof(int));
                    223:                pcpy(&i, addr, sizeof(int));
                    224:                i -= sizeof(int);
                    225:                addr += sizeof(int);
                    226:        
                    227:        
                    228:                /********************************************************/
                    229:                /* and that many bytes of (debug symbols?)              */
                    230:                /********************************************************/
                    231:                printf("+0x%x]", i);
                    232:                xread(addr, i);
                    233:                addr += i;
                    234:        }
                    235: #endif LOADSYMS
                    236:        /********************************************************/
                    237:        /* and note the end address of all this                 */
                    238:        /********************************************************/
                    239: 
                    240:        argv[4] = ((addr+sizeof(int)-1))&~(sizeof(int)-1);
                    241:        printf(" total=0x%x",argv[4]);
                    242: 
                    243: 
                    244:        /*
                    245:         *  We now pass the various bootstrap parameters to the loaded
                    246:         *  image via the argument list
                    247:         *  (THIS IS A BIT OF HISTORY FROM MACH.. LEAVE FOR NOW)
                    248:         *  arg1 = boot flags
                    249:         *  arg2 = boot device
                    250:         *  arg3 = start of symbol table (0 if not loaded)
                    251:         *  arg4 = end of symbol table (0 if not loaded)
                    252:         *  arg5 = transfer address from image
                    253:         *  arg6 = transfer address for next image pointer
                    254:         */
                    255:        switch(maj)
                    256:        {
                    257:        case 2:
                    258:                printf("\n\nInsert file system floppy \n");
                    259:                getchar();
                    260:                break;
                    261:        case 4:
                    262:                break;
                    263:        }
                    264:        argv[1] = howto;
                    265:        argv[2] = (MAKEBOOTDEV(maj, 0, 0, unit, part)) ;
                    266:        argv[5] = (head.a_entry &= 0xfffffff);
                    267:        argv[6] = (int) &x_entry;
                    268:        argv[0] = 8;
                    269:        /****************************************************************/
                    270:        /* copy that first page and overwrite any BIOS variables        */
                    271:        /****************************************************************/
                    272:        printf(" entry point=0x%x \n" ,((int)startaddr) & 0xffffff);
                    273:        pcpy(tmpbuf, 0, 4096);
                    274:        startprog(((int)startaddr & 0xffffff),argv);
                    275: }
                    276: 
                    277: char namebuf[100];
                    278: getbootdev(howto)
                    279:      int *howto;
                    280: {
                    281:        char c, *ptr = namebuf;
                    282:        printf("Boot: [[[%s(%d,%c)]%s][-s][-a][-d]] :- "
                    283:                        , devs[maj]
                    284:                        , unit
                    285:                        , 'a'+part
                    286:                        , name);
                    287:        if (gets(namebuf)) {
                    288:                while (c=*ptr) {
                    289:                        while (c==' ')
                    290:                                c = *++ptr;
                    291:                        if (!c)
                    292:                                return;
                    293:                        if (c=='-')
                    294:                                while ((c = *++ptr) && c!=' ')
                    295:                                        switch (c) {
                    296:                                              case 'a':
                    297:                                                *howto |= RB_ASKNAME; continue;
                    298:                                              case 's':
                    299:                                                *howto |= RB_SINGLE; continue;
                    300:                                              case 'd':
                    301:                                                *howto |= RB_KDB; continue;
                    302:                                              case 'b':
                    303:                                                *howto |= RB_HALT; continue;
                    304:                                        }
                    305:                        else {
                    306:                                name = ptr;
                    307:                                while ((c = *++ptr) && c!=' ');
                    308:                                if (c)
                    309:                                        *ptr++ = 0;
                    310:                        }
                    311:                }
                    312:        }
                    313: }
                    314: 

unix.superglobalmegacorp.com

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