Annotation of coherent/b/STREAMS/coh.386/main.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * File:       main.c
                      3:  */
                      4: 
                      5: /*
                      6:  * Includes.
                      7:  */
                      8: #include <kernel/param.h>
                      9: #include <kernel/typed.h>
                     10: 
                     11: #include <sys/coherent.h>
                     12: #include <sys/devices.h>
                     13: #include <sys/fdisk.h>
                     14: #include <sys/proc.h>
                     15: #include <sys/seg.h>
                     16: #include <sys/stat.h>
                     17: 
                     18: /*
                     19:  * Definitions.
                     20:  *     Constants.
                     21:  *     Macros with argument lists.
                     22:  *     Typedefs.
                     23:  *     Enums.
                     24:  */
                     25: #ifndef VERSION                /* This should be specified at compile time */
                     26: #define VERSION        "..."
                     27: #endif
                     28: #ifndef RELEASE
                     29: #define RELEASE "0"
                     30: #endif
                     31: 
                     32: /*
                     33:  * Functions.
                     34:  *     Import Functions.
                     35:  *     Export Functions.
                     36:  *     Local Functions.
                     37:  */
                     38: int read_cmos();
                     39: 
                     40: static void set_at_drive_ct();
                     41: static void rpdev();
                     42: 
                     43: /*
                     44:  * Global Data.
                     45:  *     Import Variables.
                     46:  *     Export Variables.
                     47:  *     Local Variables.
                     48:  */
                     49: 
                     50: /*
                     51:  * Configurable variables - see ker/conf/cohmain/Space.c
                     52:  *
                     53:  * at_drive_ct must be initialized at the number of "at" drives for PS1
                     54:  * and ValuePoint systems as the number of hard drives is not in CMOS.
                     55:  */
                     56: extern short at_drive_ct;
                     57: 
                     58: extern dev_t rootdev;
                     59: extern dev_t pipedev;
                     60: extern int ronflag;
                     61: extern int PHYS_MEM;
                     62: extern unsigned long _entry;           /* really the serial number */
                     63: extern unsigned long _bar;             /* really the serial number also */
                     64: 
                     65: /* End of configurable variables. */
                     66: 
                     67: char version[] = VERSION;
                     68: char release[] = RELEASE;
                     69: char copyright[] = "Copyright 1982,1993 Mark Williams Company\n";
                     70: 
                     71: #ifdef TRACER
                     72: 
                     73: /*
                     74:  * Take a checksum of the kernel text.
                     75:  */
                     76: static unsigned                theSum;
                     77: 
                     78: static unsigned
                     79: checkSum ()
                     80: {
                     81:        extern  char    stext [], __end_text [];
                     82:        char          * tmp = stext;
                     83:        unsigned        sum = 0;
                     84:        while (tmp != __end_text)
                     85:                sum = sum * 5 + * tmp ++;
                     86:        return sum;
                     87: }
                     88: 
                     89: /*
                     90:  * Check the current kernel text segment against the boot checksum
                     91:  */
                     92: 
                     93: int
                     94: checkTheSum ()
                     95: {
                     96:        unsigned        newSum;
                     97:        
                     98:        if ((newSum = checkSum ()) != theSum)
                     99:                panic ("Kernel checksum failure, %x vs %x", theSum, newSum);
                    100:        return 0;
                    101: }
                    102: #endif /* defined (TRACER) */
                    103: 
                    104: 
                    105: main()
                    106: {
                    107:        extern int BPFMAX;
                    108:        char * ndpTypeName();
                    109:        extern int (*ndpEmFn)();
                    110:        extern short ndpType;
                    111: 
                    112: #ifdef TRACER
                    113:        theSum = checkSum ();
                    114: #endif
                    115:        
                    116:        CHIRP('a');
                    117:        while (& u + 1 < & u) {
                    118:                _CHIRP ('t', 8);
                    119:                _CHIRP ('k', 6);
                    120:                _CHIRP ('u', 4);
                    121:                _CHIRP ('h', 2);
                    122:                _CHIRP ('p', 0);
                    123:        }
                    124: 
                    125: #if    _I386
                    126:        wrNdpUser(0);
                    127:        wrNdpSaved(0);
                    128:        u.u_bpfmax = BPFMAX;
                    129: #endif
                    130:        u.u_error = 0;
                    131:        bufinit();
                    132:        _CHIRP('0', 156);
                    133:        cltinit();
                    134:        _CHIRP('1', 156);
                    135:        pcsinit();
                    136:        _CHIRP('2', 156);
                    137:        seginit();
                    138:        _CHIRP('3', 156);
                    139:        set_at_drive_ct();
                    140:        _CHIRP('4', 156);
                    141:        rpdev();
                    142:        _CHIRP('5', 156);
                    143:        devinit();
                    144:        _CHIRP('6', 156);
                    145:        rlinit();
                    146:        _CHIRP('7', 156);
                    147: 
                    148:        putchar_init();
                    149:        _CHIRP('8', 156);
                    150:        printf("*** COHERENT Version %s - 386 Mode.  %uKB free memory. ***\n",
                    151:                release, ctob(allocno())/1024);
                    152: 
                    153:        /* Print default display type, based on BIOS int11h call. */
                    154:        if ((int11 () & 0x30) == 0x30)
                    155:                printf ("Monochrome.  ");
                    156:        else
                    157:                printf ("Color.  ");
                    158: 
                    159:        /* Display FP coprocessor/emulation setting. */
                    160:        senseNdp ();
                    161:        printf (ndpTypeName ());
                    162:        if (ndpType <= 1 && ndpEmFn)
                    163:                printf ("FP Emulation.  ");
                    164: 
                    165:        /* Display general system configuration parameters. */
                    166:        printf ("%u buffers.  %u buckets.  %u clists.\n",
                    167:          NBUF, NHASH, NCLIST);
                    168:        printf ("%uKB kalloc pool.  %u KB phys pool.\n",
                    169:          ALLSIZE / 1024, PHYS_MEM / 1024);
                    170:        printf (copyright);
                    171: 
                    172:        if (_entry) {
                    173:                printf ("Serial Number ");
                    174:                printf ("%lu\n", _entry);
                    175:        }
                    176: 
                    177:        /*
                    178:         * Verify correct serial number
                    179:         */
                    180:        if (_entry != _bar)
                    181: panic("Verification error - call Mark Williams Company at +1-708-291-6700\n");
                    182: 
                    183:        /*
                    184:         * Turn on clock, mount root device, start off processes
                    185:         * and return.
                    186:         */
                    187:        batflag = 1;
                    188: 
                    189:        iprocp = SELF;
                    190:        CHIRP('b');
                    191:        if (pfork()) {
                    192:                CHIRP('i');
                    193:                idle();
                    194:        } else {
                    195:                fsminit();
                    196:                CHIRP('-');
                    197:                eprocp = SELF;
                    198:                eveinit();
                    199:                CHIRP('=');
                    200:        }
                    201: 
                    202: #ifdef TRACER
                    203:        checkTheSum ();
                    204: #endif
                    205:        CHIRP ('c');
                    206: }
                    207: 
                    208: /*
                    209:  * set_at_drive_ct()
                    210:  *
                    211:  * If "at_drive_ct" is already nonzero, don't change it.
                    212:  * Else, read CMOS and return 0,1, or 2 as number of installed "at" drives.
                    213:  */
                    214: void
                    215: set_at_drive_ct()
                    216: {
                    217:        int u;
                    218: 
                    219:         if (at_drive_ct <= 0) {
                    220:                /*
                    221:                 * Count nonzero drive types.
                    222:                 *
                    223:                 *      High nibble of CMOS 0x12 is drive 0's type.
                    224:                 *      Low  nibble of CMOS 0x12 is drive 1's type.
                    225:                 */
                    226:                u = read_cmos(0x12);
                    227:                if (u & 0x00F0)
                    228:                        at_drive_ct++;
                    229:                if (u & 0x000F)
                    230:                        at_drive_ct++;
                    231:        }
                    232: }
                    233: 
                    234: /*
                    235:  * rpdev()
                    236:  *
                    237:  * If rootdev is zero, try to use data from tboot to set it.
                    238:  * If pipedev is zero, make it 0x883 if ronflag == 1, else make it rootdev.
                    239:  * Call rpdev() AFTER calling set_at_drive_ct().
                    240:  */
                    241: static void rpdev()
                    242: {
                    243:        FIFO *ffp;
                    244:        typed_space *tp;
                    245:        int found;
                    246:        extern typed_space boot_gift;
                    247:        unsigned root_ptn, root_drv, root_maj, root_min;
                    248: 
                    249:        if (rootdev == makedev(0,0)) {
                    250:                found = 0;
                    251:                if (ffp = fifo_open(&boot_gift, 0)) {
                    252:                        int rc;
                    253: 
                    254:                        for (rc = 0; !found && (tp = fifo_read(ffp)); rc++) {
                    255:                                BIOS_ROOTDEV *brp = (BIOS_ROOTDEV *)tp->ts_data;
                    256:                                if (T_BIOS_ROOTDEV == tp->ts_type) {
                    257:                                        found = 1;
                    258:                                        root_ptn = brp->rd_partition;
                    259:                                }
                    260:                        }
                    261:                        fifo_close(ffp);
                    262: 
                    263:                }
                    264: 
                    265:                if (found) {
                    266:                        /*
                    267:                         * root_drv = BIOS # of root drive
                    268:                         * root_ptn = partition # in range 0..3
                    269:                         * if root on second "at" device, add 4 to minor #
                    270:                         * if root on second scsi device, add 16 to minor #
                    271:                         */
                    272:                        root_drv = root_ptn/NPARTN;
                    273:                        root_ptn %= NPARTN;
                    274:                        if (at_drive_ct > root_drv) {
                    275:                                root_maj = AT_MAJOR;
                    276:                                root_min = root_drv*NPARTN + root_ptn;
                    277:                        } else { /* root on SCSI device */
                    278:                                root_maj = SCSI_MAJOR;
                    279:                                root_min = (root_drv-at_drive_ct)*16 + root_ptn;
                    280:                        }
                    281:                        rootdev = makedev(root_maj, root_min);
                    282:                        printf("rootdev=(%d,%d)\n", root_maj, root_min);
                    283:                }
                    284:        }
                    285: 
                    286:        if (pipedev == makedev(0,0)) {
                    287:                if (ronflag)
                    288:                        pipedev = makedev(RM_MAJOR, 0x83);
                    289:                else
                    290:                        pipedev = rootdev;
                    291:                printf("pipedev=(%d,%d)\n", (pipedev>>8)&0xff, pipedev&0xff);
                    292:        }
                    293: }

unix.superglobalmegacorp.com

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