Annotation of cci/sys/stand/boot.c, revision 1.1.1.1

1.1       root        1: /*     boot.c  6.1     83/07/29        */
                      2: 
                      3: #include "../h/param.h"
                      4: #include "../h/inode.h"
                      5: #include "../h/fs.h"
                      6: #include "../h/vm.h"
                      7: #include "../machine/mtpr.h"
                      8: #include <a.out.h>
                      9: #include "saio.h"
                     10: #include "../h/reboot.h"
                     11: 
                     12: /*
                     13:  * Boot program... arguments passed in r10 and r11 determine
                     14:  * whether boot stops to ask for system name and which device
                     15:  * boot comes from.
                     16:  */
                     17: 
                     18: /*     r11 = 0 -> automatic boot, load file '/vmunix' */
                     19: /*     r11 = 1 -> ask user for file to load */
                     20: 
                     21: /* Types in r10 specifying major device */
                     22: char   devname[][3] = {
                     23:        'f','s','d',    /* 0 = fsd */
                     24:        's','m','d',    /* 1 = smd or cmd */
                     25:        'x','f','d',    /* 2 = xfd */
                     26:        'x','s','d',    /* 2 = xsd */
                     27:        'c','y','p',    /* 3 = cypher tape */
                     28: };
                     29: 
                     30: #ifdef FSD
                     31: char line[100] = "fsd(0,0)vmunix";
                     32: #endif
                     33: #ifdef SMD
                     34: char line[100] = "smd(0,0)vmunix";
                     35: #endif
                     36: #ifdef XFD
                     37: char line[100] = "xfd(0,0)vmunix";
                     38: #endif
                     39: #ifdef XSD
                     40: char line[100] = "xsd(0,0)vmunix";
                     41: #endif
                     42: #ifdef JUSTASK
                     43: char line[100];
                     44: #endif
                     45: 
                     46: int    retry = 0;
                     47: 
                     48: main()
                     49: {
                     50:        register dummy;         /* skip r12 */
                     51:        register howto, devtype;        /* howto=r11, devtype=r10 */
                     52:        int io;
                     53: 
                     54: #ifdef lint
                     55:        howto = 0; devtype = 0;
                     56: #endif
                     57:        printf("\nBoot\n");
                     58: #ifdef JUSTASK
                     59:        howto = RB_ASKNAME|RB_SINGLE;
                     60: #endif
                     61:        for (;;) {
                     62:                if (howto & RB_ASKNAME) {
                     63:                        printf(": ");
                     64:                        gets(line);
                     65:                } else
                     66:                        printf(": %s\n", line);
                     67:                io = open(line, 0);
                     68:                if (io >= 0)
                     69:                        copyunix(howto, io);
                     70:                if (++retry > 2)
                     71:                        howto |= RB_SINGLE|RB_ASKNAME;
                     72:        }
                     73: }
                     74: 
                     75: /*ARGSUSED*/
                     76: copyunix(howto, io)
                     77:        register io, howto;
                     78: {
                     79:        struct exec x;
                     80:        register int i;
                     81:        char *addr;
                     82: 
                     83:        i = read(io, (char *)&x, sizeof x);
                     84:        if (i != sizeof x ||
                     85:            (x.a_magic != 0407 && x.a_magic != 0413 && x.a_magic != 0410))
                     86:                _stop("Bad format\n");
                     87:        printf("%d", x.a_text);
                     88:        if (x.a_magic == 0413 && lseek(io, 0x400, 0) == -1)
                     89:                goto shread;
                     90:        if (read(io, (char *)0x800, x.a_text) != x.a_text)
                     91:                goto shread;
                     92:        addr = (char *)(x.a_text + 0x800);
                     93:        if (x.a_magic == 0413 || x.a_magic == 0410)
                     94:                while ((int)addr & CLOFSET)
                     95:                        *addr++ = 0;
                     96:        printf("+%d", x.a_data);
                     97:        if (read(io, addr, x.a_data) != x.a_data)
                     98:                goto shread;
                     99:        addr += x.a_data;
                    100:        printf("+%d", x.a_bss);
                    101:        x.a_bss += 32*1024;     /* slop */
                    102:        for (i = 0; i < x.a_bss; i++)
                    103:                *addr++ = 0;
                    104:        x.a_entry &= 0x1fffffff;
                    105:        printf(" start 0x%x\n", x.a_entry);
                    106:        mtpr (0, PADC);         /* Purge data cache */
                    107:        mtpr (0, PACC);         /* Purge code cache */
                    108:        if (!(howto & RB_DCOFF)) 
                    109:                mtpr (1, DCR);  /* Enable data cache */
                    110:        (*((int (*)()) x.a_entry))();
                    111: shread:
                    112:        _stop("Short read\n");
                    113: }

unix.superglobalmegacorp.com

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