Annotation of researchv8dc/cmd/config/config.y, revision 1.1

1.1     ! root        1: %union {
        !             2:        int i;
        !             3:        char *cp;
        !             4:        struct idlst *idlst;
        !             5: }
        !             6: %token CPU IDENT CONFIG ANY DEVICE UBA MBA NEXUS CSR DRIVE VECTOR OPTIONS
        !             7: %token CONTROLLER PSEUDO_DEVICE FLAGS ID SEMICOLON NUMBER FPNUMBER TRACE
        !             8: %token DISK SLAVE AT HZ TIMEZONE DST MAXUSERS MASTER COMMA MINUS
        !             9: %type <cp> Save_id ID Dev
        !            10: %type <i> NUMBER FPNUMBER
        !            11: %type <idlst> Id_list
        !            12: %{
        !            13: /*     config.y        1.11    81/05/22        */
        !            14: #include "config.h"
        !            15: #include <stdio.h>
        !            16:        struct device cur;
        !            17:        struct device *curp = NULL;
        !            18:        char *temp_id;
        !            19: %}
        !            20: %%
        !            21: Configuration:
        !            22:        Many_specs
        !            23:        ;
        !            24: 
        !            25: Many_specs:
        !            26:        Many_specs Spec
        !            27:        |
        !            28:        ;
        !            29: 
        !            30: Spec:
        !            31:        Device_spec SEMICOLON  = { newdev(&cur); } |
        !            32:        Config_spec SEMICOLON |
        !            33:        TRACE SEMICOLON = { do_trace = ! do_trace; } |
        !            34:        SEMICOLON |
        !            35:        error SEMICOLON
        !            36:        ;
        !            37: 
        !            38: Config_spec:
        !            39:        CPU Save_id = {
        !            40:                    struct cputype *cp = (struct cputype *)malloc(sizeof (struct cputype));
        !            41:                    cp->cpu_name = ns($2);
        !            42:                    cp->cpu_next = cputype;
        !            43:                    cputype = cp;
        !            44:                    free(temp_id);
        !            45:                    } |
        !            46:        OPTIONS Opt_list |
        !            47:        IDENT ID { ident = ns($2); } |
        !            48:        CONFIG Save_id ID = { mkconf(temp_id, $3); free(temp_id); } |
        !            49:        HZ NUMBER = {
        !            50:                yyerror("HZ specification obsolete; delete");
        !            51:                hz = 60;
        !            52:                } |
        !            53:        TIMEZONE NUMBER = { timezone = 60 * $2; check_tz(); } |
        !            54:        TIMEZONE NUMBER DST = { timezone = 60 * $2; dst = 1; check_tz(); } |
        !            55:        TIMEZONE FPNUMBER = { timezone = $2; check_tz(); } |
        !            56:        TIMEZONE FPNUMBER DST = { timezone = $2; dst = 1; check_tz(); } |
        !            57:        MINUS TIMEZONE NUMBER =
        !            58:            { timezone = -60 * $3; check_tz(); } |
        !            59:        MINUS TIMEZONE NUMBER DST =
        !            60:            { timezone = -60 * $3; dst = 1; check_tz(); } |
        !            61:        MINUS TIMEZONE FPNUMBER =
        !            62:            { timezone = -$3; check_tz(); } |
        !            63:        MINUS TIMEZONE FPNUMBER DST =
        !            64:            { timezone = -$3; dst = 1; check_tz(); } |
        !            65:        MAXUSERS NUMBER = { maxusers = $2; }
        !            66:        ;
        !            67: 
        !            68: Opt_list:
        !            69:        Opt_list COMMA Option |
        !            70:        Option
        !            71:        ;
        !            72: 
        !            73: Option:
        !            74:        Save_id = {
        !            75:                    struct opt *op = (struct opt *)malloc(sizeof (struct opt));
        !            76:                    op->op_name = ns($1);
        !            77:                    op->op_next = opt;
        !            78:                    opt = op;
        !            79:                    free(temp_id);
        !            80:        }
        !            81:        ;
        !            82: 
        !            83: Save_id:
        !            84:        ID = { $$ = temp_id = ns($1); }
        !            85:        ;
        !            86: 
        !            87: Dev:
        !            88:        UBA  = { $$ = ns("uba"); } |
        !            89:        MBA  = { $$ = ns("mba"); } |
        !            90:        ID = { $$ = ns($1); }
        !            91:        ;
        !            92: 
        !            93: Device_spec:
        !            94:        DEVICE Dev_name Dev_info Int_spec = {  cur.d_type = DEVICE; } |
        !            95:        MASTER Dev_name Dev_info Int_spec = {  cur.d_type = MASTER; } |
        !            96:        DISK Dev_name Dev_info Int_spec =
        !            97:                                {  cur.d_dk = 1; cur.d_type = DEVICE; } |
        !            98:        CONTROLLER Dev_name Dev_info Int_spec = {  cur.d_type = CONTROLLER; } |
        !            99:        PSEUDO_DEVICE Init_dev Dev =
        !           100:                        { cur.d_name = $3; cur.d_type = PSEUDO_DEVICE; } |
        !           101:        PSEUDO_DEVICE Init_dev Dev NUMBER =
        !           102:                        { cur.d_name = $3; cur.d_type = PSEUDO_DEVICE;
        !           103:                          cur.d_count = $4; }
        !           104:        ;
        !           105: 
        !           106: Dev_name:
        !           107:        Init_dev Dev NUMBER =   {
        !           108:                        cur.d_name = $2;
        !           109:                        if (eq($2, "mba"))
        !           110:                            seen_mba = TRUE;
        !           111:                        else if (eq($2, "uba"))
        !           112:                            seen_uba = TRUE;
        !           113:                        cur.d_unit = $3;
        !           114:                }
        !           115:        ;
        !           116: 
        !           117: Init_dev:
        !           118:        = { init_dev(&cur); }
        !           119:        ;
        !           120: 
        !           121: Dev_info:
        !           122:        Con_info Info_list
        !           123:        |
        !           124:        ;
        !           125: 
        !           126: Con_info:
        !           127:        AT Dev NUMBER = {
        !           128:                if (eq(cur.d_name, "mba") || eq(cur.d_name, "uba")) {
        !           129:                        sprintf(errbuf,
        !           130:                                "%s must be connected to a nexus", cur.d_name);
        !           131:                        yyerror(errbuf);
        !           132:                }
        !           133:                cur.d_conn = connect($2, $3);
        !           134:        } |
        !           135:        AT NEXUS NUMBER = { check_nexus(&cur, $3); cur.d_conn = TO_NEXUS; }
        !           136:        ;
        !           137:     
        !           138: Info_list:
        !           139:        Info_list Info
        !           140:        |
        !           141:        ;
        !           142: 
        !           143: Info:
        !           144:        CSR NUMBER = { cur.d_addr = $2; } |
        !           145:        DRIVE NUMBER = { cur.d_drive = $2; } |
        !           146:        SLAVE NUMBER =
        !           147:        {
        !           148:                if (cur.d_conn != NULL && cur.d_conn != TO_NEXUS
        !           149:                    && cur.d_conn->d_type == MASTER)
        !           150:                        cur.d_slave = $2;
        !           151:                else
        !           152:                        yyerror("can't specify slave--not to master");
        !           153:        } |
        !           154:        FLAGS NUMBER = { cur.d_flags = $2; }
        !           155:        ;
        !           156: 
        !           157: Int_spec:
        !           158:        VECTOR Id_list = { cur.d_vec = $2; } | ;
        !           159: 
        !           160: Id_list:
        !           161:        Save_id =
        !           162:            { struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
        !           163:              a->id = $1; a->id_next = 0; $$ = a; } |
        !           164:        Save_id Id_list =
        !           165:            { struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
        !           166:              a->id = $1; a->id_next = $2; $$ = a; } ;
        !           167: %%
        !           168: 
        !           169: yyerror(s)
        !           170: char *s;
        !           171: {
        !           172:        fprintf(stderr, "config: %s at line %d\n", s, yyline);
        !           173: }
        !           174: 
        !           175: /*
        !           176:  * ns:
        !           177:  *     Return the passed string in a new space
        !           178:  */
        !           179: 
        !           180: char *
        !           181: ns(str)
        !           182: register char *str;
        !           183: {
        !           184:        register char *cp;
        !           185: 
        !           186:        cp = malloc(strlen(str)+1);
        !           187:        strcpy(cp, str);
        !           188:        return cp;
        !           189: }
        !           190: 
        !           191: /*
        !           192:  * newdev
        !           193:  *     Add a device to the list
        !           194:  */
        !           195: 
        !           196: newdev(dp)
        !           197: register struct device *dp;
        !           198: {
        !           199:        register struct device *np;
        !           200: 
        !           201:        np = (struct device *) malloc(sizeof *np);
        !           202:        *np = *dp;
        !           203:        if (curp == NULL)
        !           204:                dtab = np;
        !           205:        else
        !           206:                curp->d_next = np;
        !           207:        curp = np;
        !           208: }
        !           209: 
        !           210: /*
        !           211:  * mkconf
        !           212:  *     Note that a configuration should be made
        !           213:  */
        !           214: 
        !           215: mkconf(dev, sysname)
        !           216: char *dev, *sysname;
        !           217: {
        !           218:        register struct file_list *fl;
        !           219: 
        !           220:        fl = (struct file_list *) malloc(sizeof *fl);
        !           221:        fl->f_fn = ns(dev);
        !           222:        fl->f_needs = ns(sysname);
        !           223:        if (confp == NULL)
        !           224:            conf_list = fl;
        !           225:        else
        !           226:            confp->f_next = fl;
        !           227:        confp = fl;
        !           228: }
        !           229: 
        !           230: /*
        !           231:  * Connect:
        !           232:  *     Find the pointer to connect to the given device and number.
        !           233:  *     returns NULL if no such device and prints an error message
        !           234:  */
        !           235: 
        !           236: struct device *connect(dev, num)
        !           237: register char *dev;
        !           238: register int num;
        !           239: {
        !           240:        register struct device *dp;
        !           241:        struct device *huhcon();
        !           242: 
        !           243:        if (num == QUES)
        !           244:            return huhcon(dev);
        !           245:        for (dp = dtab; dp != NULL; dp = dp->d_next)
        !           246:                if ((num == dp->d_unit) && eq(dev, dp->d_name))
        !           247:                    if (dp->d_type != CONTROLLER && dp->d_type != MASTER)
        !           248:                    {
        !           249:                        sprintf(errbuf, "%s connected to non-controller", dev);
        !           250:                        yyerror(errbuf);
        !           251:                        return NULL;
        !           252:                    }
        !           253:                    else
        !           254:                        return dp;
        !           255:        sprintf(errbuf, "%s %d not defined", dev, num);
        !           256:        yyerror(errbuf);
        !           257:        return NULL;
        !           258: }
        !           259: 
        !           260: /*
        !           261:  * huhcon
        !           262:  *     Connect to an unspecific thing
        !           263:  */
        !           264: 
        !           265: struct device *huhcon(dev)
        !           266: register char *dev;
        !           267: {
        !           268:     register struct device *dp, *dcp;
        !           269:     struct device rdev;
        !           270:     int oldtype;
        !           271: 
        !           272:     /*
        !           273:      * First make certain that there are some of these to wildcard on
        !           274:      */
        !           275:     for (dp = dtab; dp != NULL; dp = dp->d_next)
        !           276:        if (eq(dp->d_name, dev))
        !           277:            break;
        !           278:     if (dp == NULL)
        !           279:     {
        !           280:        sprintf(errbuf, "no %s's to wildcard", dev);
        !           281:        yyerror(errbuf);
        !           282:        return NULL;
        !           283:     }
        !           284:     oldtype = dp->d_type;
        !           285:     dcp = dp->d_conn;
        !           286:     /*
        !           287:      * Now see if there is already a wildcard entry for this device
        !           288:      * (e.g. Search for a "uba ?")
        !           289:      */
        !           290:     for (; dp != NULL; dp = dp->d_next)
        !           291:        if (eq(dev, dp->d_name) && dp->d_unit == -1)
        !           292:            break;
        !           293:     /*
        !           294:      * If there isn't, make one becuase everything needs to be connected
        !           295:      * to something.
        !           296:      */
        !           297:     if (dp == NULL)
        !           298:     {
        !           299:        dp = &rdev;
        !           300:        init_dev(dp);
        !           301:        dp->d_unit = QUES;
        !           302:        dp->d_name = ns(dev);
        !           303:        dp->d_type = oldtype;
        !           304:        newdev(dp);
        !           305:        dp = curp;
        !           306:        /*
        !           307:         * Connect it to the same thing that other similar things are
        !           308:         * connected to, but make sure it is a wildcard unit
        !           309:         * (e.g. up connected to sc ?, here we make connect sc? to a uba?)
        !           310:         * If other things like this are on the NEXUS or if the aren't
        !           311:         * connected to anything, then make the same connection, else
        !           312:         * call ourself to connect to another unspecific device.
        !           313:         */
        !           314:        if (dcp == TO_NEXUS || dcp == NULL)
        !           315:            dp->d_conn = dcp;
        !           316:        else
        !           317:            dp->d_conn = connect(dcp->d_name, QUES);
        !           318:     }
        !           319:     return dp;
        !           320: }
        !           321: 
        !           322: /*
        !           323:  * init_dev:
        !           324:  *     Set up the fields in the current device to their
        !           325:  *     default values.
        !           326:  */
        !           327: 
        !           328: init_dev(dp)
        !           329: register struct device *dp;
        !           330: {
        !           331:     dp->d_name = "OHNO!!!";
        !           332:     dp->d_type = DEVICE;
        !           333:     dp->d_conn = NULL;
        !           334:     dp->d_vec = NULL;
        !           335:     dp->d_addr = dp->d_flags = dp->d_dk = 0;
        !           336:     dp->d_slave = dp->d_drive = dp->d_unit = UNKNOWN;
        !           337:     dp->d_count = 0;
        !           338: }
        !           339: 
        !           340: /*
        !           341:  * Check_nexus:
        !           342:  *     Make certain that this is a reasonable type of thing to put
        !           343:  *     on the nexus.
        !           344:  */
        !           345: 
        !           346: check_nexus(dev, num)
        !           347: register struct device *dev;
        !           348: int num;
        !           349: {
        !           350:     if (!eq(dev->d_name, "uba") && !eq(dev->d_name, "mba"))
        !           351:        yyerror("only uba's and mba's should be connected to the nexus");
        !           352:     if (num != QUES)
        !           353:        yyerror("can't give specific nexus numbers");
        !           354: }
        !           355: 
        !           356: /*
        !           357:  * Check the timezone to make certain it is sensible
        !           358:  */
        !           359: 
        !           360: check_tz()
        !           361: {
        !           362:        if (timezone > 24 * 60)
        !           363:                yyerror("timezone is unreasonable");
        !           364:        else
        !           365:                hadtz = TRUE;
        !           366: }

unix.superglobalmegacorp.com

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