Annotation of coherent/b/STREAMS/coh.386/main.c, revision 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.