Annotation of coherent/d/conf/tboot/builtin.c, revision 1.1

1.1     ! root        1: /* builtin.c -- builtin routines for tboot.
        !             2:  *
        !             3:  * Add new ones by adding a check for them in interpret().
        !             4:  *
        !             5:  * La Monte H. Yarroll <[email protected]>, September 1991
        !             6:  */
        !             7: 
        !             8: #include <string.h>
        !             9: #include <sys/inode.h>
        !            10: #include <sys/ino.h>
        !            11: #include <sys/dir.h>
        !            12: #include <sys/typed.h>
        !            13: #include "tboot.h"
        !            14: 
        !            15: extern int slow_flag;  /* Slow down pacifier.  */
        !            16: extern int feet_flag;  /* Enable pacifier footprints.  */
        !            17: 
        !            18: /*
        !            19:  * If possible, execute "command".
        !            20:  * Return "true" if the command exists, "false" otherwise.
        !            21:  */
        !            22: int
        !            23: interpret(command)
        !            24:        char *command;
        !            25: {
        !            26:        char *argv[MAX_TOKENS+1];       /* Command vector.  */
        !            27:        char *current_token;
        !            28:        char *cmd_name; /* The first token of the command line.  */
        !            29:        int i;
        !            30: 
        !            31:        current_token = strtok(command, WS);
        !            32:        cmd_name = current_token;               /* Extract the command.  */
        !            33:        /* Build the command argv.  */
        !            34:        for (i = 0; NULL != current_token && i < MAX_TOKENS; ++i) {
        !            35:                argv[i] = current_token;
        !            36:                current_token = strtok(NULL, WS);
        !            37:        }
        !            38: 
        !            39:        argv[i] = NULL; /* NULL terminate the list of pointers.  */
        !            40: 
        !            41:        /*
        !            42:         * If we ran out of token slots, print a warning.
        !            43:         */
        !            44:        if (i >= MAX_TOKENS) {
        !            45:                puts("\r\nWarning: truncating line to:\r\n");
        !            46:                for (i = 0 ; i < MAX_TOKENS; ++i) {
        !            47:                        puts(argv[i]);
        !            48:                        puts(" ");
        !            49:                }
        !            50:                puts("\r\n");
        !            51:        }
        !            52: 
        !            53:        /*
        !            54:         * Interpret the lexed command.
        !            55:         */
        !            56:        if (0 == strcmp(cmd_name, "info")) {
        !            57:                dpb();
        !            58:                return(TRUE);
        !            59:        } else if ((0 == strcmp(cmd_name, "dir")) ||
        !            60:                   (0 == strcmp(cmd_name, "ls") ) ||
        !            61:                   (0 == strcmp(cmd_name, "lc") )) {
        !            62:                dir();
        !            63:                return(TRUE);
        !            64:        } else if ( (0 == strncmp(cmd_name, "sys_base", strlen("sys_base")) ) ||
        !            65:                   (0 == strncmp(cmd_name, "scs", strlen("scs")) )
        !            66:                ) {
        !            67:                char lbuf[5]; /* 5 == strlen("0000") + 1 */
        !            68:                if (NULL != strchr(cmd_name, '=')){
        !            69:                        puts("Setting sys_base.\r\n");
        !            70:                        sys_base_set = (1==1);
        !            71:                        sys_base = (uint16)
        !            72:                                basetoi(1 + strchr(cmd_name, '='), 16);
        !            73:                }
        !            74:                if (!sys_base_set) {
        !            75:                        puts("sys_base will default to ");
        !            76:                        print16(DEF_SYS_BASE);
        !            77:                        puts(" for l.out executables,\r\n and to ");
        !            78:                        print16(COFF_SYS_BASE);
        !            79:                        puts(" for COFF executables.\r\n");
        !            80:                } else {
        !            81:                        puts("sys_base is ");
        !            82:                        itobase((uint16) sys_base, lbuf, 16);
        !            83:                        puts(lbuf);
        !            84:                        puts("\r\n");
        !            85:                }
        !            86:                return(TRUE);
        !            87:        } else if (0 == strcmp(cmd_name, "monitor")) {
        !            88:                monitor();
        !            89:                return(TRUE);
        !            90:        } else if (0 == strcmp(cmd_name, "cpu_type")) {
        !            91:                switch(get_cpu_type()) {
        !            92:                case 0: puts("less than 286\r\n");      break;
        !            93:                case 1: puts("286\r\n");                break;
        !            94:                case 2: puts("386 or better\r\n");      break;
        !            95:                }
        !            96:                return(TRUE);
        !            97:        } else if ((0 == strcmp(cmd_name, "verbose"))) {
        !            98:                verbose_flag = TRUE;
        !            99:                puts("Verbose mode.\r\n");
        !           100:                return(TRUE); 
        !           101:        } else if ((0 == strcmp(cmd_name, "terse"))) {
        !           102:                verbose_flag = FALSE;
        !           103:                puts("Terse mode.\r\n");
        !           104:                return(TRUE); 
        !           105:        } else if ((0 == strcmp(cmd_name, "slow"))) {
        !           106:                slow_flag = TRUE;
        !           107:                puts("Slow pacifier mode.\r\n");
        !           108:                return(TRUE); 
        !           109:        } else if ((0 == strcmp(cmd_name, "fast"))) {
        !           110:                slow_flag = FALSE;
        !           111:                puts("Normal pacifier mode.\r\n");
        !           112:                return(TRUE); 
        !           113:        } else if ((0 == strcmp(cmd_name, "feet"))) {
        !           114:                feet_flag = TRUE;
        !           115:                puts("Pacifier footprints enabled.\r\n");
        !           116:                return(TRUE); 
        !           117:        } else if ((0 == strcmp(cmd_name, "nofeet"))) {
        !           118:                feet_flag = FALSE;
        !           119:                puts("No pacifier footprints.\r\n");
        !           120:                return(TRUE); 
        !           121:        } else if ((0 == strcmp(cmd_name, "gift"))) {
        !           122:                dump_gift();    /* Dump boot_gift.  */
        !           123:                return(TRUE);
        !           124:        } else if ((0 == strcmp(cmd_name, "test"))) {
        !           125:                if (arg_exist("arg")) {
        !           126:                        puts("Yep.\r\n");
        !           127:                } else {
        !           128:                        puts("Nope.\r\n");
        !           129:                }
        !           130:                return(TRUE);
        !           131:        } else if ((0 == strcmp(cmd_name, "help")) ||
        !           132:                   (0 == strcmp(cmd_name, "?")) ) {
        !           133:                   puts("info          Print disk information.\r\n");
        !           134:                   puts("dir|ls        List contents of /.\r\n");
        !           135:                   puts("?|help        Print this list.\r\n");
        !           136:                   return(TRUE);
        !           137:        } else if (0 == strcmp(cmd_name, "mon_on")) {
        !           138:                want_monitor = TRUE;
        !           139:                puts("Mini-monitor will autoinvoke before running kernel.\r\n");
        !           140:                return(TRUE);
        !           141:        } else if (0 == strcmp(cmd_name, "??")) {
        !           142:                   puts("UNSUPPORTED FEATURES:  (don't call :-)\r\n");
        !           143:                   puts("sys_base|scs  Print current load segment.\r\n");
        !           144:                   puts("sys_base=tttt Set current load segment to 0xtttt.\r\n");
        !           145:                   puts("test arg      Test for the presence of arg.\r\n");
        !           146:                   puts("monitor       Invoke the mini-monitor.\r\n");
        !           147:                   puts("mon_on        Autoinvoke the mini-monitor before kernel.\r\n");
        !           148:                   puts("cpu_type      print the cpu type.\r\n");
        !           149:                   puts("verbose       Be verbose.\r\n");
        !           150:                   puts("terse         Do not be verbose.\r\n");
        !           151:                   puts("slow          Slow down pacifier.\r\n");
        !           152:                   puts("fast          Normal speed pacifier.\r\n");
        !           153:                   puts("feet          Enable pacifier footprints.\r\n");
        !           154:                   puts("nofeet        Disable pacifier footprints.\r\n");
        !           155:                   return(TRUE);
        !           156:        } else {
        !           157:                execute(argv);
        !           158:                return(FALSE);
        !           159:        }
        !           160:        puts("\r\nUNREACHABLE CODE IN interpret() EXECUTED.\r\n");
        !           161:        puts("There is probably a missing return() in interpret().\r\n");
        !           162:        return(FALSE);  /* This should be an unreachable line.  */
        !           163: } /* interpret() */
        !           164: 
        !           165: /* Display the BIOS parameters loaded up by the startup code.  */
        !           166: void
        !           167: dpb()
        !           168: {
        !           169:        char buffer[BLOCK];
        !           170:        int i;
        !           171:        int num_of_drives;
        !           172:        struct reg r;
        !           173:        
        !           174:        
        !           175:        num_of_drives = get_num_of_drives();
        !           176: 
        !           177:        puts("\r\nHere are the BIOS parameters for your hard drive");
        !           178:        if (num_of_drives > 1) { putchar('s'); }
        !           179:        puts(".\r\n");
        !           180:        puts("Write them down for use during installation.\r\n");
        !           181:        
        !           182:        for (i = 0; i < num_of_drives; ++i) {
        !           183:         
        !           184:                r.r_ax = DISK_PARAMS;
        !           185:                r.r_dx = HARD_DRIVE + i;
        !           186:        
        !           187:                intcall(&r, &r, DISKINT);       /* Ask the BIOS.  */
        !           188: 
        !           189:                puts("Drive ");
        !           190:                itobase((uint16) i, buffer, 10);
        !           191:                puts(buffer);
        !           192:        
        !           193: 
        !           194:                /* ch is the lower 8 bits of number of cylinders.
        !           195:                 * The high two bits of cl are the top two bits of
        !           196:                 * 10 bit number of cylinders.
        !           197:                 *
        !           198:                 * The cylinder count is actually 1 short.
        !           199:                 */
        !           200:                puts(":  Cylinders=");
        !           201:                itobase((uint16) (
        !           202:                          ((LOW(r.r_cx) >> 6) * 256) + /* Top two bits...  */
        !           203:                          (HIGH(r.r_cx) + 1)
        !           204:                        ),
        !           205:                        buffer, 10);
        !           206:                puts(buffer);
        !           207:        
        !           208:                /* The head count is actually 1 short.  */
        !           209:                puts("  Heads=");
        !           210:                itobase((uint16) HIGH(r.r_dx) + 1, buffer, 10);
        !           211:                puts(buffer);
        !           212:        
        !           213:                /* Only the lower 6 bits of cl are the sectors per track.  */
        !           214:                puts("  Sectors per track=");
        !           215:                itobase((uint16) SIXBITS & LOW(r.r_cx), buffer, 10);
        !           216:                puts(buffer);
        !           217:        
        !           218:                puts("\r\n");
        !           219:        } /* for i = 0 to num_of_drives - 1 */
        !           220: } /* dpb() */
        !           221: 
        !           222: 
        !           223: /*
        !           224:  * Ask the BIOS how many drives are attached.
        !           225:  *
        !           226:  * If the BIOS says more than MAX_DRIVES, ask again.  Some BIOS's
        !           227:  * seem to answer this question differently on alternate calls, or
        !           228:  * on the first call.
        !           229:  */
        !           230: #define MAX_DRIVES 8
        !           231: int get_num_of_drives()
        !           232: {
        !           233:        struct reg r;
        !           234: 
        !           235:        r.r_ax = DISK_PARAMS;   /* ah = 8 -- Return disk drive parameters */
        !           236:        r.r_dx = HARD_DRIVE;    /* set bit 7 of dl for hard disk info.  */
        !           237:        
        !           238:        intcall(&r, &r, DISKINT);
        !           239: 
        !           240:        if ( verbose_flag ) {
        !           241:                /*
        !           242:                 * Print out the flags for debugging purposes.
        !           243:                 */
        !           244:                puts("flags: ");
        !           245:                print16(r.r_flags);
        !           246:                puts(" ");
        !           247:        }
        !           248: 
        !           249:        if (LOW(r.r_dx) > MAX_DRIVES) {
        !           250:                puts("I doubt that you have 0x");
        !           251:                print8(LOW(r.r_dx));
        !           252:                puts(" disk drives.  Let's try again.\r\n");
        !           253: 
        !           254:                r.r_ax = DISK_PARAMS;   /* ah = 8 -- Return disk drive parameters */
        !           255:                r.r_dx = HARD_DRIVE;    /* set bit 7 of dl for hard disk info.  */
        !           256:                
        !           257:                intcall(&r, &r, DISKINT);
        !           258: 
        !           259:                if (LOW(r.r_dx) <= MAX_DRIVES) {
        !           260:                        puts(" That's better!");
        !           261:                }
        !           262:        }
        !           263:        
        !           264:        if (LOW(r.r_dx) > MAX_DRIVES) {
        !           265:                puts("I simply don't believe that you have 0x");
        !           266:                print8(LOW(r.r_dx));
        !           267:                puts(" disk drives.\r\n");
        !           268:                puts("I'm going to guess that you have 0x");
        !           269:                print8(MAX_DRIVES);
        !           270:                puts(" drives.\r\n");
        !           271: 
        !           272:                return(MAX_DRIVES);
        !           273:        } else {
        !           274:                return(LOW(r.r_dx));
        !           275:        }
        !           276: } /* get_num_of_drives() */
        !           277: 
        !           278: /* Create a listing of file names in /.  */
        !           279: void
        !           280: dir()
        !           281: {
        !           282:        int i, j;
        !           283:        char outbuff[LINESIZE]; /* Buffer for outputing numbers.  */
        !           284:        struct inode rootinode;
        !           285:        struct direct dirent;
        !           286: 
        !           287:        /* Open "/" and print out the direct block file entries.  */
        !           288:        iopen(&rootinode, (ino_t) 2);
        !           289: 
        !           290:        /* Read each directory entry one at a time.  */
        !           291:        /* We are careful to print an even fraction of 80 for each
        !           292:         * directory entry, so that everything lines up nicely.
        !           293:         */
        !           294:        for (i = 0; i < rootinode.i_size; i += sizeof(struct direct)) {
        !           295: 
        !           296:                iread(&rootinode, (char *) &dirent, (fsize_t) i,
        !           297:                      (uint16) sizeof(struct direct));
        !           298:                
        !           299:                /* If the entry is not active, skip the rest.  */
        !           300:                if (0 == dirent.d_ino) {
        !           301:                        continue;
        !           302:                }
        !           303:                
        !           304:                /* NUL terminate the name.  */
        !           305:                strncpy(outbuff,
        !           306:                        dirent.d_name,
        !           307:                        DIRSIZ);
        !           308:                outbuff[DIRSIZ] = '\0';
        !           309:                /* Print the file name.  */
        !           310:                puts(outbuff);
        !           311:                for (j = DIRSIZ - strlen(outbuff); j > 0; --j) {
        !           312:                        putchar(' ');
        !           313:                }
        !           314:                puts(" :"); /* Bring total to 16 (80/5) characters.  */
        !           315:        }
        !           316:        puts("\r\n");
        !           317:        
        !           318: } /* dir() */

unix.superglobalmegacorp.com

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