Annotation of coherent/d/conf/old_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 "tboot.h"
        !            13: 
        !            14: /* If possible, execute "command".
        !            15:  * Return "true" if the command exists, "false" otherwise.
        !            16:  */
        !            17: int
        !            18: interpret(command)
        !            19:        char *command;
        !            20: {
        !            21:        if (0 == strcmp(command, "info")) {
        !            22:                dpb();
        !            23:                return(TRUE);
        !            24:        } else if ((0 == strcmp(command, "dir")) ||
        !            25:                   (0 == strcmp(command, "ls") ) ||
        !            26:                   (0 == strcmp(command, "lc") )) {
        !            27:                dir();
        !            28:                return(TRUE);
        !            29:        } else if ( (0 == strncmp(command, "sys_base", strlen("sys_base")) ) ||
        !            30:                   (0 == strncmp(command, "scs", strlen("scs")) )
        !            31:                ) {
        !            32:                char lbuf[5]; /* 5 == strlen("0000") + 1 */
        !            33:                if (NULL != strchr(command, '=')){
        !            34:                        puts("Setting sys_base.\r\n");
        !            35:                        sys_base_set = (1==1);
        !            36:                        sys_base = (uint16)
        !            37:                                basetoi(1 + strchr(command, '='), 16);
        !            38:                }
        !            39:                if (!sys_base_set) {
        !            40:                        puts("sys_base will default to ");
        !            41:                        print16(DEF_SYS_BASE);
        !            42:                        puts(" for l.out executables,\r\n and to ");
        !            43:                        print16(COFF_SYS_BASE);
        !            44:                        puts(" for COFF executables.\r\n");
        !            45:                } else {
        !            46:                        puts("sys_base is ");
        !            47:                        itobase((uint16) sys_base, lbuf, 16);
        !            48:                        puts(lbuf);
        !            49:                        puts("\r\n");
        !            50:                }
        !            51:                return(TRUE);
        !            52:        } else if (0 == strcmp(command, "monitor")) {
        !            53:                monitor();
        !            54:                return(TRUE);
        !            55:        } else if ((0 == strcmp(command, "gift"))) {
        !            56:                dump_gift();    /* Dump boot_gift.  */
        !            57:                return(TRUE);
        !            58:        } else if ((0 == strcmp(command, "test arg"))) {
        !            59:                if (arg_exist("arg")) {
        !            60:                        puts("Yep.\r\n");
        !            61:                } else {
        !            62:                        puts("Nope.\r\n");
        !            63:                }
        !            64:                return(TRUE);
        !            65:        } else if ((0 == strcmp(command, "help")) ||
        !            66:                   (0 == strcmp(command, "?")) ) {
        !            67:                   puts("info          Print disk information.\r\n");
        !            68:                   puts("dir|ls        List contents of /.\r\n");
        !            69:                   puts("?|help        Print this list.\r\n");
        !            70:                   return(TRUE);
        !            71:        } else if (0 == strcmp(command, "mon_on")) {
        !            72:                want_monitor = TRUE;
        !            73:                puts("Mini-monitor will autoinvoke before running kernel.\r\n");
        !            74:                return(TRUE);
        !            75:        } else if (0 == strcmp(command, "??")) {
        !            76:                   puts("UNSUPPORTED FEATURES:  (don't call :-)\r\n");
        !            77:                   puts("sys_base|scs  Print current load segment.\r\n");
        !            78:                   puts("sys_base=tttt Set current load segment to 0xtttt.\r\n");
        !            79:                   puts("test arg      Test for the presence of arg.\r\n");
        !            80:                   puts("monitor       Invoke the mini-monitor.\r\n");
        !            81:                   puts("mon_on        Autoinvoke the mini-monitor before kernel.\r\n");
        !            82:                   return(TRUE);
        !            83:        } else {
        !            84:                return(FALSE);
        !            85:        }
        !            86:        puts("\r\nUNREACHABLE CODE IN interpret() EXECUTED.\r\n");
        !            87:        puts("There is probably a missing return() in interpret().\r\n");
        !            88:        return(FALSE);  /* This should be an unreachable line.  */
        !            89: } /* interpret() */
        !            90: 
        !            91: /* Display the BIOS parameters loaded up by the startup code.  */
        !            92: void
        !            93: dpb()
        !            94: {
        !            95:        char buffer[BLOCK];
        !            96:        int i;
        !            97:        int num_of_drives;
        !            98:        struct reg r;
        !            99:        
        !           100:        
        !           101:        num_of_drives = get_num_of_drives();
        !           102: 
        !           103:        puts("\r\nHere are the BIOS parameters for your hard drive");
        !           104:        if (num_of_drives > 1) { putchar('s'); }
        !           105:        puts(".\r\n");
        !           106:        puts("Write them down for use during installation.\r\n");
        !           107:        
        !           108:        for (i = 0; i < num_of_drives; ++i) {
        !           109:         
        !           110:                r.r_ax = DISK_PARAMS;
        !           111:                r.r_dx = HARD_DRIVE + i;
        !           112:        
        !           113:                intcall(&r, &r, DISKINT);       /* Ask the BIOS.  */
        !           114: 
        !           115:                puts("Drive ");
        !           116:                itobase((uint16) i, buffer, 10);
        !           117:                puts(buffer);
        !           118:        
        !           119: 
        !           120:                /* ch is the lower 8 bits of number of cylinders.
        !           121:                 * The high two bits of cl are the top two bits of
        !           122:                 * 10 bit number of cylinders.
        !           123:                 *
        !           124:                 * The cylinder count is actually 1 short.
        !           125:                 */
        !           126:                puts(":  Cylinders=");
        !           127:                itobase((uint16) (
        !           128:                          ((LOW(r.r_cx) >> 6) * 256) + /* Top two bits...  */
        !           129:                          (HIGH(r.r_cx) + 1)
        !           130:                        ),
        !           131:                        buffer, 10);
        !           132:                puts(buffer);
        !           133:        
        !           134:                /* The head count is actually 1 short.  */
        !           135:                puts("  Heads=");
        !           136:                itobase((uint16) HIGH(r.r_dx) + 1, buffer, 10);
        !           137:                puts(buffer);
        !           138:        
        !           139:                /* Only the lower 6 bits of cl are the sectors per track.  */
        !           140:                puts("  Sectors per track=");
        !           141:                itobase((uint16) SIXBITS & LOW(r.r_cx), buffer, 10);
        !           142:                puts(buffer);
        !           143:        
        !           144:                puts("\r\n");
        !           145:        } /* for i = 0 to num_of_drives - 1 */
        !           146: } /* dpb() */
        !           147: 
        !           148: 
        !           149: /* Ask the BIOS how many drives are attached.  */
        !           150: int get_num_of_drives()
        !           151: {
        !           152:        struct reg r;
        !           153: 
        !           154:        r.r_ax = DISK_PARAMS;   /* ah = 8 -- Return disk drive parameters */
        !           155:        r.r_dx = HARD_DRIVE;    /* set bit 7 of dl for hard disk info.  */
        !           156:        
        !           157:        intcall(&r, &r, DISKINT);
        !           158: 
        !           159:        return(LOW(r.r_dx));
        !           160: } /* get_num_of_drives() */
        !           161: 
        !           162: /* Create a listing of file names in /.  */
        !           163: void
        !           164: dir()
        !           165: {
        !           166:        int i, j;
        !           167:        char outbuff[LINESIZE]; /* Buffer for outputing numbers.  */
        !           168:        struct inode rootinode;
        !           169:        struct direct dirent;
        !           170: 
        !           171:        /* Open "/" and print out the direct block file entries.  */
        !           172:        iopen(&rootinode, (ino_t) 2);
        !           173: 
        !           174:        /* Read each directory entry one at a time.  */
        !           175:        /* We are careful to print an even fraction of 80 for each
        !           176:         * directory entry, so that everything lines up nicely.
        !           177:         */
        !           178:        for (i = 0; i < rootinode.i_size; i += sizeof(struct direct)) {
        !           179: 
        !           180:                iread(&rootinode, (char *) &dirent, (fsize_t) i,
        !           181:                      (uint16) sizeof(struct direct));
        !           182:                
        !           183:                /* If the entry is not active, skip the rest.  */
        !           184:                if (0 == dirent.d_ino) {
        !           185:                        continue;
        !           186:                }
        !           187:                
        !           188:                /* NUL terminate the name.  */
        !           189:                strncpy(outbuff,
        !           190:                        dirent.d_name,
        !           191:                        DIRSIZ);
        !           192:                outbuff[DIRSIZ] = '\0';
        !           193:                /* Print the file name.  */
        !           194:                puts(outbuff);
        !           195:                for (j = DIRSIZ - strlen(outbuff); j > 0; --j) {
        !           196:                        putchar(' ');
        !           197:                }
        !           198:                puts(" :"); /* Bring total to 16 (80/5) characters.  */
        !           199:        }
        !           200:        puts("\r\n");
        !           201:        
        !           202: } /* dir() */

unix.superglobalmegacorp.com

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