Annotation of researchv8dc/sys/pcs/ldpcs.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * load comet microcode patches
        !             3:  */
        !             4: 
        !             5: #include <stdio.h>
        !             6: #include <sys/types.h>
        !             7: #include <sys/mtpr.h>
        !             8: 
        !             9: typedef long preg_t;           /* type of a processor register */
        !            10: typedef long word_t;           /* type of a `word' in pcs */
        !            11: 
        !            12: /*
        !            13:  * format of the patch file, as distributed by DEC
        !            14:  * first 1k bytes are patch bits:
        !            15:  *     each bit goes in a successive 32-bit word
        !            16:  * remaining 10k bytes are the microcode proper
        !            17:  *     each 20 bits goes in a successive 32-bit word
        !            18:  */
        !            19: 
        !            20: #define        FPATLEN 1024    /* number of bytes of packed patch bit */
        !            21: #define        FMICLEN 10240   /* number of bytes of packed microcode */
        !            22: 
        !            23: #define        NPAT1   (FPATLEN*8)     /* number of patch bits */
        !            24: #define        NMIC20  ((FMICLEN*8)/20)        /* number of 20-bit microcode lumps */
        !            25: 
        !            26: word_t pat[NPAT1];
        !            27: word_t mic[NMIC20]; 
        !            28: 
        !            29: /*
        !            30:  * PCS definitions
        !            31:  */
        !            32: 
        !            33: #define        PCSPAT  0xf00000        /* first patchbit loc */
        !            34: #define        PCSMIC  0xf08000        /* first microcode loc */
        !            35: #define        PCSENA  0xf0c000        /* patchbit enable addr */
        !            36: #define        ENABLE  0xfff00000      /* bits to enable pcs */
        !            37: 
        !            38: #define        MINVER  0x5f            /* minimum ucode version supporting pcs */
        !            39: #define        STYPE   0xff000000      /* processor type in SID */
        !            40: #define        SCOMET  0x02000000      /* VAX-11/750 */
        !            41: 
        !            42: int fmem, freg;
        !            43: int force = 0;
        !            44: int babble = 0;
        !            45: 
        !            46: main(argc, argv)
        !            47: int argc;
        !            48: char **argv;
        !            49: {
        !            50: 
        !            51:        while (--argc > 0 && **++argv == '-') {
        !            52:                if (strcmp(argv[0], "-f") == 0)
        !            53:                        force++;
        !            54:                else if (strcmp(argv[0], "-v") == 0)
        !            55:                        babble++;
        !            56:                else
        !            57:                        usage();
        !            58:        }
        !            59:        if (argc != 1)
        !            60:                usage();
        !            61:        openmem();
        !            62:        if (force == 0 && micver() < MINVER) {
        !            63:                fprintf(stderr, "no pcs hardware");
        !            64:                exit(1);
        !            65:        }
        !            66:        getpcs(argv[0]);
        !            67:        loadpcs();
        !            68:        if (babble)
        !            69:                printf("ucode rev x%x\n", micver());
        !            70:        exit(0);
        !            71: }
        !            72: 
        !            73: usage()
        !            74: {
        !            75: 
        !            76:        fprintf(stderr, "usage: ldpcs [ -f ] [ -v ] pcsfile\n");
        !            77:        exit(1);
        !            78: }
        !            79: 
        !            80: openmem()
        !            81: {
        !            82: 
        !            83:        if ((fmem = open("/dev/mem", 2)) < 0) {
        !            84:                perror("/dev/mem");
        !            85:                exit(1);
        !            86:        }
        !            87:        if ((freg = open("/dev/mtpr", 2)) < 0) {
        !            88:                perror("/dev/mtpr");
        !            89:                exit(1);
        !            90:        }
        !            91: }
        !            92: 
        !            93: micver()
        !            94: {
        !            95:        preg_t sid;
        !            96:        preg_t mfpr();
        !            97: 
        !            98:        sid = mfpr(SID);
        !            99:        if (force == 0 && (sid & STYPE) != SCOMET) {
        !           100:                fprintf(stderr, "not a VAX-11/750\n");
        !           101:                exit(1);
        !           102:        }
        !           103:        return ((sid >> 8) & 0xff);
        !           104: }
        !           105: 
        !           106: /*
        !           107:  * get the patch bits and microcode out of the file
        !           108:  * leave them unpacked and ready to load in pat and mic
        !           109:  */
        !           110: 
        !           111: getpcs(f)
        !           112: char *f;
        !           113: {
        !           114:        int fd;
        !           115:        char ppat[FPATLEN];
        !           116:        char pmic[FMICLEN];
        !           117:        char junk;
        !           118: 
        !           119:        if ((fd = open(f, 0)) < 0) {
        !           120:                perror(f);
        !           121:                exit(1);
        !           122:        }
        !           123:        if (read(fd, ppat, sizeof(ppat)) != sizeof(ppat)) {
        !           124:                fprintf(stderr, "%s: can't read patch bits\n", f);
        !           125:                close(fd);
        !           126:                exit(1);
        !           127:        }
        !           128:        if (read(fd, pmic, sizeof(pmic)) != sizeof(pmic)) {
        !           129:                fprintf(stderr, "%s: can't read microcode\n", f);
        !           130:                close(fd);
        !           131:                exit(1);
        !           132:        }
        !           133:        /* sanity check */
        !           134:        if (read(fd, &junk, 1) != 0) {
        !           135:                fprintf(stderr, "%s: bad format\n", f);
        !           136:                close(fd);
        !           137:                exit(1);
        !           138:        }
        !           139:        close(fd);
        !           140:        unpack(ppat, pat, NPAT1, 1);
        !           141:        unpack(pmic, mic, NMIC20, 20);
        !           142: }
        !           143: 
        !           144: /*
        !           145:  * load the PCS:
        !           146:  *     for safety, turn off any ucode now running there
        !           147:  *     enable patching; write patch bits; disable patching
        !           148:  *     write microcode
        !           149:  *     enable the PCS, i.e. turn it on
        !           150:  */
        !           151: 
        !           152: loadpcs()
        !           153: {
        !           154:        long w;
        !           155: 
        !           156:        w = 0;
        !           157:        mwrite(fmem, (off_t)PCSMIC, (char *)&w, sizeof(w));     /* disable pcs */
        !           158:        w = 1;
        !           159:        mwrite(fmem, (off_t)PCSENA, (char *)&w, sizeof(w));     /* enable patching */
        !           160:        mwrite(fmem, (off_t)PCSPAT, (char *)pat, sizeof(pat));  /* write patch bits */
        !           161:        w = 0;
        !           162:        mwrite(fmem, (off_t)PCSENA, (char *)&w, sizeof(w));     /* disable patching */
        !           163:        mwrite(fmem, (off_t)PCSMIC, (char *)mic, sizeof(mic));  /* write microcode */
        !           164:        w = mic[0] | ENABLE;
        !           165:        mwrite(fmem, (off_t)PCSMIC, (char *)&w, sizeof(w));     /* enable pcs */
        !           166: }
        !           167: 
        !           168: mwrite(fd, addr, buf, size)
        !           169: int fd;
        !           170: off_t addr;
        !           171: char *buf;
        !           172: int size;
        !           173: {
        !           174: 
        !           175:        lseek(fd, addr, 0);
        !           176:        if (write(fd, buf, size) != size) {
        !           177:                perror("write");
        !           178:                exit(1);
        !           179:        }
        !           180: }
        !           181: 
        !           182: preg_t
        !           183: mfpr(rno)
        !           184: int rno;
        !           185: {
        !           186:        long reg;
        !           187: 
        !           188:        lseek(freg, (off_t)rno * sizeof(reg), 0);
        !           189:        if (read(freg, (char *)&reg, sizeof(reg)) != sizeof(reg)) {
        !           190:                perror("mtpr");
        !           191:                exit(1);
        !           192:        }
        !           193:        return (reg);
        !           194: }

unix.superglobalmegacorp.com

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