Annotation of lucent/sys/src/boot/pc/install.c, revision 1.1.1.1

1.1       root        1: #include "u.h"
                      2: #include "lib.h"
                      3: #include "mem.h"
                      4: #include "dat.h"
                      5: #include "fns.h"
                      6: #include "io.h"
                      7: 
                      8: #include "dosfs.h"
                      9: 
                     10: typedef struct Type Type;
                     11: typedef struct Medium Medium;
                     12: typedef struct Mode Mode;
                     13: 
                     14: enum {
                     15:        Maxdev          = 7,
                     16:        Dany            = -1,
                     17:        Nmedia          = 16,
                     18: };
                     19: 
                     20: enum {                                 /* type */
                     21:        Tfloppy         = 0x00,
                     22:        Thard           = 0x01,
                     23:        Tscsi           = 0x02,
                     24:        Tether          = 0x03,
                     25:        NType           = 0x04,
                     26: 
                     27:        Tany            = -1,
                     28: };
                     29: 
                     30: enum {                                 /* flag and name */
                     31:        Fnone           = 0x00,
                     32: 
                     33:        Fdos            = 0x01,
                     34:        Ndos            = 0x00,
                     35:        Fboot           = 0x02,
                     36:        Nboot           = 0x01,
                     37:        Fbootp          = 0x04,
                     38:        Nbootp          = 0x02,
                     39:        NName           = 0x03,
                     40: 
                     41:        Fany            = Fbootp|Fboot|Fdos,
                     42: 
                     43:        Fini            = 0x10,
                     44:        Freverse        = 0x20,
                     45:        Fprobe          = 0x80,
                     46: };
                     47: 
                     48: enum {                                 /* mode */
                     49:        Mauto           = 0x00,
                     50:        Mlocal          = 0x01,
                     51:        Manual          = 0x02,
                     52:        NMode           = 0x03,
                     53: };
                     54: 
                     55: enum
                     56: {
                     57:        CGAWIDTH        = 160,
                     58:        CGAHEIGHT       = 24,
                     59: 
                     60:        NLINES          = 10,
                     61:        NWIDTH          = 60,
                     62:        WLOCX           = 5,
                     63:        WLOCY           = 5,
                     64: 
                     65:        MENUATTR        = 7,
                     66:        HIGHMENUATTR    = 112,
                     67: };
                     68: 
                     69: typedef struct Type {
                     70:        int     type;
                     71:        int     flag;
                     72:        int     (*init)(void);
                     73:        long    (*read)(int, void*, long);
                     74:        long    (*seek)(int, long);
                     75:        Partition* (*setpart)(int, char*);
                     76:        char*   name[NName];
                     77: 
                     78:        int     mask;
                     79:        Medium* media;
                     80: } Type;
                     81: 
                     82: typedef struct Medium {
                     83:        Type*   type;
                     84:        int     flag;
                     85:        Partition* partition;
                     86:        Dos;
                     87: 
                     88:        Medium* next;
                     89: } Medium;
                     90: 
                     91: typedef struct Mode {
                     92:        char*   name;
                     93:        int     mode;
                     94: } Mode;
                     95: 
                     96: static Type types[NType] = {
                     97:        {       Tfloppy,
                     98:                Fini|Fdos,
                     99:                floppyinit, floppyread, floppyseek, 0,
                    100:                { "fd", }
                    101:        },
                    102: };
                    103: 
                    104: static Medium media[Nmedia];
                    105: static Medium *curmedium = media;
                    106: 
                    107: static Mode modes[NMode+1] = {
                    108:        [Mauto]         { "auto",   Mauto,  },
                    109:        [Mlocal]        { "local",  Mlocal, },
                    110:        [Manual]        { "manual", Manual, },
                    111: };
                    112: 
                    113: static Medium*
                    114: allocm(Type *tp)
                    115: {
                    116:        Medium **l;
                    117: 
                    118:        if(curmedium >= &media[Nmedia])
                    119:                return 0;
                    120: 
                    121:        for(l = &tp->media; *l; l = &(*l)->next)
                    122:                ;
                    123:        *l = curmedium++;
                    124:        return *l;
                    125: }
                    126: 
                    127: void
                    128: xclrscrn(int attr)
                    129: {
                    130:        int i;
                    131: 
                    132:        for(i = 0; i < CGAWIDTH*CGAHEIGHT; i += 2) {
                    133:                cga[i] = ' ';
                    134:                cga[i+1] = attr;
                    135:        }
                    136: }
                    137: 
                    138: void
                    139: xprint(int x, int y, int attr, char *fmt, ...)
                    140: {
                    141:        uchar *p;
                    142:        int out, i;
                    143:        char buf[CGAWIDTH];
                    144: 
                    145:        x *= 2;
                    146: 
                    147:        out = doprint(buf, buf+sizeof(buf), fmt, DOTDOT) - buf;
                    148:        p = (uchar*)(cga + x + (y*CGAWIDTH));
                    149:        for(i = 0; i < out; i++) {
                    150:                *p++ = buf[i];
                    151:                *p++ = attr;
                    152:        }
                    153: }
                    154: 
                    155: void
                    156: xputc(int x, int y, int attr, int c)
                    157: {
                    158:        uchar *p;
                    159: 
                    160:        x *= 2;
                    161:        p = (uchar*)(cga + x + (y*CGAWIDTH));
                    162:        p[0] = c;
                    163:        p[1] = attr;
                    164: }
                    165: 
                    166: Medium*
                    167: probe(int type, int flag, int dev)
                    168: {
                    169:        Type *tp;
                    170:        int d, i, m;
                    171:        Medium *mp;
                    172: 
                    173:        for(tp = types; tp < &types[NType]; tp++){
                    174:                if(type != Tany && type != tp->type)
                    175:                        continue;
                    176: 
                    177:                if(flag != Fnone){
                    178:                        for(mp = tp->media; mp; mp = mp->next){
                    179:                                if((flag & mp->flag) && (dev == Dany || dev == mp->dev))
                    180:                                        return mp;
                    181:                        }
                    182:                }
                    183: 
                    184:                if((tp->flag & Fprobe) == 0){
                    185:                        tp->flag |= Fprobe;
                    186:                        tp->mask = (*tp->init)();
                    187:                }
                    188: 
                    189:                for(i = 0; tp->mask; i++){
                    190:                        if(tp->flag & Freverse){
                    191:                                m = 1<<(Maxdev-i);
                    192:                                d = (Maxdev-i);
                    193:                        }
                    194:                        else{
                    195:                                m = 1<<i;
                    196:                                d = i;
                    197:                        }
                    198:                        if((tp->mask & m) == 0)
                    199:                                continue;
                    200:                        tp->mask &= ~m;
                    201: 
                    202:                        if((mp = allocm(tp)) == 0)
                    203:                                continue;
                    204: 
                    205:                        mp->dev = d;
                    206:                        mp->flag = tp->flag;
                    207:                        mp->seek = tp->seek;
                    208:                        mp->read = tp->read;
                    209:                        mp->type = tp;
                    210: 
                    211:                        if(mp->flag & Fboot){
                    212:                                if((mp->partition = (*tp->setpart)(d, "boot")) == 0)
                    213:                                        mp->flag &= ~Fboot;
                    214:                                (*tp->setpart)(d, "disk");
                    215:                        }
                    216: 
                    217:                        if((mp->flag & Fdos) && (dosinit(mp) < 0))
                    218:                                mp->flag &= ~(Fini|Fdos);
                    219: 
                    220:                        if((flag & mp->flag) && (dev == Dany || dev == d))
                    221:                                return mp;
                    222:                }
                    223:        }
                    224: 
                    225:        return 0;
                    226: }
                    227: 
                    228: char n1[] = "System Boot Program";
                    229: char n2[] = "  Plan 9 (TM) Copyright (c) 1995 AT&T Bell Laboratories";
                    230: 
                    231: void
                    232: main(void)
                    233: {
                    234:        Medium *mp;
                    235:        int port;
                    236:        char scsi[64], line[80], *p;
                    237: 
                    238:        i8042a20();
                    239:        memset(m, 0, sizeof(Mach));
                    240:        trapinit();
                    241:        clockinit();
                    242:        alarminit();
                    243:        spllo();
                    244: 
                    245:        consinit();
                    246:        if((ulong)&end > (KZERO|(640*1024)))
                    247:                panic("install.com too big\n");
                    248: 
                    249:        xclrscrn(17);
                    250:        xprint(0, 0, 116, "%-80s", n1);
                    251:        xprint(0, 23, 116, "%-80s", n2);
                    252: 
                    253:        /*
                    254:         *  look for a floppy with DOS (should be us) and boot 9dos
                    255:         */
                    256:        mp = probe(Tfloppy, Fdos, Dany);
                    257:        if(mp == 0){
                    258:                print("Can't find the installation floppy\n");
                    259:                delay(15000);
                    260:                panic("Rebooting\n");
                    261:        }
                    262: 
                    263:        /*
                    264:         *  get configuration info
                    265:         */
                    266:        *BOOTARGS = 0;
                    267: 
                    268:        print("\n\nBooting the Plan 9 kernel, wait...\n");
                    269: 
                    270:        sprint(BOOTLINE, "%s!%d!9dos", mp->type->name[Ndos], mp->dev);
                    271:        dosboot(mp, "9dos");
                    272:        print("Can't boot 9dos\n");
                    273:        delay(15000);
                    274:        panic("Rebooting");
                    275: }
                    276: 
                    277: int
                    278: getfields(char *lp, char **fields, int n, char sep)
                    279: {
                    280:        int i;
                    281: 
                    282:        for(i=0; lp && *lp && i<n; i++){
                    283:                while(*lp == sep)
                    284:                        *lp++=0;
                    285:                if(*lp == 0)
                    286:                        break;
                    287:                fields[i]=lp;
                    288:                while(*lp && *lp != sep)
                    289:                        lp++;
                    290:        }
                    291:        return i;
                    292: }
                    293: 
                    294: void*
                    295: ialloc(ulong n, int align)
                    296: {
                    297: 
                    298:        static struct {
                    299:                ulong   addr;
                    300:        } palloc;
                    301:        ulong p;
                    302: 
                    303:        if(palloc.addr == 0)
                    304:                palloc.addr = ((ulong)&end)&~KZERO;
                    305:        if(align)
                    306:                palloc.addr = PGROUND(palloc.addr);
                    307:        if((palloc.addr <= 640*1024) && (palloc.addr + n > 640*1024))
                    308:                palloc.addr = 2*1024*1024;
                    309: 
                    310:        memset((void*)(palloc.addr|KZERO), 0, n);
                    311:        p = palloc.addr;
                    312:        palloc.addr += n;
                    313:        if(align)
                    314:                palloc.addr = PGROUND(palloc.addr);
                    315: 
                    316:        return (void*)(p|KZERO);
                    317: }
                    318: 
                    319: enum {
                    320:        Paddr=          0x70,   /* address port */
                    321:        Pdata=          0x71,   /* data port */
                    322: };
                    323: 
                    324: uchar
                    325: nvramread(int offset)
                    326: {
                    327:        outb(Paddr, offset);
                    328:        return inb(Pdata);
                    329: }
                    330: 
                    331: char*
                    332: getconf(char*)
                    333: {
                    334:        return 0;
                    335: }

unix.superglobalmegacorp.com

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