Annotation of coherent/b/kernel/io.386/xl_dec.c, revision 1.1

1.1     ! root        1: /************************************************************************/
        !             2: /*     Copyright (c) 1988, 1989 ARCHIVE Corporation                    */
        !             3: /*     This program is an unpublished work fully protected by the      */
        !             4: /*     United States Copyright laws and is considered a trade secret   */
        !             5: /*     belonging to Archive Corporation.                               */
        !             6: /************************************************************************/
        !             7: /*     xl_dec.c        ecc for xl.c                                    */
        !             8: /*                                                                     */
        !             9: /*                     13JUL88  14:00                                  */
        !            10: /*     Unix port       05/14/1989                                      */
        !            11: /************************************************************************/
        !            12: /*     file: xl_dec.c                                                  */
        !            13: /************************************************************************/
        !            14: #include <sys/coherent.h>
        !            15: #include <sys/types.h>
        !            16: #include <sys/xl.h>
        !            17: 
        !            18: static unchar  mpy();                  /* declare functions    */
        !            19: static unchar  dvd();
        !            20: extern int     xl_chk();
        !            21: 
        !            22: extern unchar  xl_log2[];              /* ecc tables           */
        !            23: extern unchar  xl_alg2[];
        !            24: extern unchar  xl_mx02[];
        !            25: extern unchar  xl_mxc0[];
        !            26: extern unchar  xl_mxc3[];
        !            27: 
        !            28: static fpchr   pbfr;                   /* adr buffer           */
        !            29: static int     nbfr;                   /* num of bfrs in block */
        !            30: 
        !            31: static unchar  s0, s1, s2;             /* syndromes            */
        !            32: static int     l0, l1, l2;             /* locations            */
        !            33: static unchar  L0, L1, L2;             /* 2** locations        */
        !            34: static unchar  M0, M1, M2;             /* c3** locations       */
        !            35: 
        !            36: static unchar  m00, m01, m02;          /* inverse matrix       */
        !            37: static unchar  m10, m11, m12;
        !            38: static unchar  m20, m21, m22;
        !            39: static unchar  det;
        !            40: 
        !            41: static unchar  n00, n01, n10, n11;     /* 2nd inverse matrix   */
        !            42: 
        !            43: static unchar  e0, e1, e2;             /* error values         */
        !            44: static unchar  c0, c1;                 /* check error values   */
        !            45: 
        !            46: /************************************************************************/
        !            47: /*     xl_dec  correct a block                                         */
        !            48: /************************************************************************/
        !            49: int
        !            50: xl_dec( adr, nb, errc, err0, err1, err2 )
        !            51: fpchr  adr;    /* adr of bfr           */
        !            52: unchar nb;     /* # blocks in bfr      */
        !            53: unchar errc;   /* error count          */
        !            54: unchar err0;   /* location of errors   */
        !            55: unchar err1;   /* location of errors   */
        !            56: unchar err2;   /* location of errors   */
        !            57: {
        !            58:        fpchr   p0;
        !            59:        int     d0;
        !            60: int i = 0;
        !            61: 
        !            62:        /* globalize inputs     */
        !            63:        pbfr = adr;
        !            64:        nbfr = (int)nb;
        !            65:        l0 = (int)err0;
        !            66:        l1 = (int)err1;
        !            67:        l2 = (int)err2;
        !            68:        switch(errc){
        !            69:        case 0:
        !            70:                if( !xl_chk( adr, nb ) )
        !            71:                        return( 1 );
        !            72:                return( fix0() );
        !            73:        case 1:
        !            74:                return( fix1() );
        !            75:        case 2:
        !            76:                return( fix2() );
        !            77:        case 3:
        !            78:                return( fix3() );
        !            79:        default:
        !            80:                break;
        !            81:        }
        !            82:        return( 0 );
        !            83: }
        !            84: 
        !            85: /************************************************************************/
        !            86: /*     3 error case                                                    */
        !            87: /************************************************************************/
        !            88: /*                                                                     */
        !            89: /*     syndrome equations                                              */
        !            90: /*                                                                     */
        !            91: /*     | 1  1  1|   |e0|   |s0|                                        */
        !            92: /*     |L0 L1 L2|   |e1| = |s1|                                        */
        !            93: /*     |M0 M1 M2|   |e2|   |s2|                                        */
        !            94: /*                                                                     */
        !            95: /*     inversing matrix gives error equations                          */
        !            96: /*                                                                     */
        !            97: /*     |e0|    |L1*M2+M1*L2  M1+M2  L1+L2|  |s0|                       */
        !            98: /*     |e1| =  |L0*M2+M0*M2  M0+M2  L0+L2|  |s1|                       */
        !            99: /*     |e2|    |L0*M1+M0*L1  M0+M1  L0+L1|  |s2|                       */
        !           100: /*            -----------------------------------                      */
        !           101: /*            L0*M1+L0*M2+L1*M0+L1*M2+L2*M0+L2*M1                      */
        !           102: /************************************************************************/
        !           103: 
        !           104: static unchar ae, af, bd, bf, cd, ce;  /* temps */
        !           105: static unchar aebd, afcd, bfce;
        !           106: 
        !           107: static
        !           108: fix3()                                 /* 3 error case                 */
        !           109: {
        !           110:        fpchr   p0;
        !           111:        int     d0;
        !           112:        int     d1;
        !           113: 
        !           114:        L0 = xl_alg2[ 31 - l0 ];        /* generate powers of 2 (Lx)    */
        !           115:        M0 = xl_alg2[ 224 + l0 ];       /*  and C3 (Mx) [ C3 = 1/2 ]    */
        !           116:        L1 = xl_alg2[ 31 - l1 ];
        !           117:        M1 = xl_alg2[ 224 + l1 ];
        !           118:        L2 = xl_alg2[ 31 - l2 ];
        !           119:        M2 = xl_alg2[ 224 + l2 ];
        !           120: 
        !           121:        ae = mpy( L0, M1 );             /* generate inverse matrix      */
        !           122:        af = mpy( L0, M2 );
        !           123:        bd = mpy( L1, M0 );
        !           124:        bf = mpy( L1, M2 );
        !           125:        cd = mpy( L2, M0 );
        !           126:        ce = mpy( L2, M1 );
        !           127:        aebd = ae ^ bd;
        !           128:        afcd = af ^ cd;
        !           129:        bfce = bf ^ ce;
        !           130:        det = aebd ^ afcd ^ bfce;
        !           131:        m00 = dvd( bfce, det );
        !           132:        m01 = dvd( M1 ^ M2, det );
        !           133:        m02 = dvd( L1 ^ L2, det );
        !           134:        m10 = dvd( afcd, det );
        !           135:        m11 = dvd( M0 ^ M2, det );
        !           136:        m12 = dvd( L0 ^ L2, det );
        !           137:        m20 = dvd( aebd, det );
        !           138:        m21 = dvd( M0 ^ M1, det );
        !           139:        m22 = dvd( L0 ^ L1, det );
        !           140: 
        !           141:        for ( d1 = 0; d1 < 1024; ++d1 ){
        !           142:                p0 = pbfr;                      /* generate syndromes */
        !           143:                s2 = s1 = s0 = 0;
        !           144:                for ( d0 = 0; d0 < nbfr; ++d0 ){
        !           145:                        s0 ^= *p0;
        !           146:                        s1 = xl_mx02[ s1 ] ^ *p0;
        !           147:                        s2 = xl_mxc3[ s2 ] ^ *p0;
        !           148:                        p0 += 1024;
        !           149:                }
        !           150: 
        !           151:                /* generate error values */
        !           152:                e0 = mpy( m00, s0 ) ^ mpy( m01, s1 ) ^ mpy( m02, s2 );
        !           153:                e1 = mpy( m10, s0 ) ^ mpy( m11, s1 ) ^ mpy( m12, s2 );
        !           154:                e2 = mpy( m20, s0 ) ^ mpy( m21, s1 ) ^ mpy( m22, s2 );
        !           155: 
        !           156:                /* correct errors */
        !           157:                *( pbfr + l0 * 1024 ) ^= e0;
        !           158:                *( pbfr + l1 * 1024 ) ^= e1;
        !           159:                *( pbfr + l2 * 1024 ) ^= e2;
        !           160: 
        !           161:                pbfr++;
        !           162:                /* bump to next column */
        !           163:        }       
        !           164:        /* indicate ok */
        !           165:        return( 1 );
        !           166: }
        !           167: 
        !           168: /************************************************************************/
        !           169: /*     2 error case                                                    */
        !           170: /************************************************************************/
        !           171: /*                                                                     */
        !           172: /*     syndrome equations                                              */
        !           173: /*                                                                     */
        !           174: /*     | 1  1|   |e0|   |s0|                                           */
        !           175: /*     |L0 L1|   |e1| = |s1|                                           */
        !           176: /*     |M0 M1|          |s2|                                           */
        !           177: /*                                                                     */
        !           178: /*     using 2 of the 3 possible inverses:                             */
        !           179: /*                                                                     */
        !           180: /*     |e0|     |L1  1|  |s0|        |M1  1|  |s0|                     */
        !           181: /*     |e1|  =  |L0  1|  |s1|    =   |M0  1|  |s2|                     */
        !           182: /*              -------------        -------------                     */
        !           183: /*                  L0+L1                M0+M1                         */
        !           184: /************************************************************************/
        !           185: 
        !           186: static
        !           187: fix2()
        !           188: {
        !           189:        fpchr   p0;
        !           190:        int     d0;
        !           191:        int     d1;
        !           192: 
        !           193:        L0 = xl_alg2[ 31 - l0 ];        /* generate powers of 2 (Lx) &  */
        !           194:        M0 = xl_alg2[ 224 + l0 ];       /*  and C3 (Mx) [C3 = 1/2]      */
        !           195:        L1 = xl_alg2[ 31 - l1 ];
        !           196:        M1 = xl_alg2[ 224 + l1 ];
        !           197: 
        !           198:        det = L0 ^ L1;                  /* generate inverse matrix      */
        !           199:        m00 = dvd( L1, det );
        !           200:        m01 = dvd( 1, det );
        !           201:        m10 = dvd( L0, det );
        !           202:        m11 = m01;
        !           203: 
        !           204:        det = M0 ^ M1;                  /* generate check inv matrix    */
        !           205:        n00 = dvd( M1, det );
        !           206:        n01 = dvd( 1, det );
        !           207:        n10 = dvd( M0, det );
        !           208:        n11 = n01;
        !           209: 
        !           210:        for( d1 = 0; d1 < 1024; ++d1 ){
        !           211:                /* generate syndromes */
        !           212:                p0 = pbfr;
        !           213:                s2 = s1 = s0 = 0;
        !           214:                for( d0 = 0; d0 < nbfr; ++d0 ){
        !           215:                        s0 ^= *p0;
        !           216:                        s1 = xl_mx02[ s1 ] ^ *p0;
        !           217:                        s2 = xl_mxc3[ s2 ] ^ *p0;
        !           218:                        p0 += 1024;
        !           219:                }
        !           220: 
        !           221:                /* generate error values */
        !           222:                e0 = mpy( m00, s0) ^ mpy( m01, s1 );
        !           223:                e1 = mpy( m10, s0) ^ mpy( m11, s1 );
        !           224: 
        !           225:                /* generate check values */
        !           226:                c0 = mpy( n00, s0) ^ mpy( n01, s2 );
        !           227:                c1 = mpy( n10, s0) ^ mpy( n11, s2 );
        !           228: 
        !           229:                /* exit if uncorrectable */
        !           230:                if ( e0 != c0 || e1 != c1 )
        !           231:                        return( 0 );
        !           232: 
        !           233:                /* correct errors */
        !           234:                *( pbfr + l0 * 1024 ) ^= e0;    
        !           235:                *( pbfr + l1 * 1024 ) ^= e1;
        !           236: 
        !           237:                pbfr++;
        !           238:                /* bump to next column */
        !           239:        }
        !           240:        /* indicate ok */
        !           241:        return( 1 );
        !           242: }
        !           243: 
        !           244: /************************************************************************/
        !           245: /*     1 error case                                                    */
        !           246: /*     also could be 2 errors, 1 known location                        */
        !           247: /************************************************************************/
        !           248: /*                                                                     */
        !           249: /*     syndrome equations                                              */
        !           250: /*                                                                     */
        !           251: /*     | 1|          |s0|                                              */
        !           252: /*     |L0|   |e0| = |s1|                                              */
        !           253: /*     |M0|          |s2|                                              */
        !           254: /*                                                                     */
        !           255: /*     e0 = s0 = s1/L0 = s2/M0                                         */
        !           256: /************************************************************************/
        !           257: 
        !           258: static unchar a, b, c;         /* temps */
        !           259: 
        !           260: static
        !           261: fix1()
        !           262: {
        !           263:        fpchr   p0;
        !           264:        int     d0;
        !           265:        int     d1;
        !           266: 
        !           267:        /* generate powers of 2 (Lx) and */
        !           268:        L0 = xl_alg2[ 31 - l0 ];
        !           269:        /*  and C3 (Mx) [C3 = 1/2] */
        !           270:        M0 = xl_alg2[ 224 + l0 ];
        !           271: 
        !           272:        for( d1 = 0; d1 < 1024; ++d1 ){
        !           273:                /* generate syndromes */
        !           274:                p0 = pbfr;
        !           275:                s2 = s1 = s0 = 0;
        !           276:                for( d0 = 0; d0 < nbfr; ++d0 ){
        !           277:                        s0 ^= *p0;
        !           278:                        s1 = xl_mx02[ s1 ] ^ *p0;
        !           279:                        s2 = xl_mxc3[ s2 ] ^ *p0;
        !           280:                        p0 += 1024;
        !           281:                }
        !           282: 
        !           283:                /* generate error value */
        !           284:                e0 = s0;
        !           285:                /* generate check values */
        !           286:                c0 = dvd( s1, L0 );
        !           287:                c1 = dvd( s2, M0 );
        !           288: 
        !           289:                /* if not 1 error case */
        !           290:                if( e0 != c0 || e0 != c1 ){
        !           291:                        /*   test for 2 error case */
        !           292:                        a = mpy( M0, s0 ) ^ s2;
        !           293:                        /*   and generate l1 */
        !           294:                        b = mpy( M0, s1 ) ^ mpy( L0, s2 );
        !           295:                        c = mpy( L0, s0 ) ^ s1;
        !           296:                        if( !a )
        !           297:                                return( 0 );
        !           298:                        L1 = dvd( b, a ) ^ L0;
        !           299:                        L2 = dvd( dvd( c, a ), L0 );
        !           300:                        if( L1 != L2 )
        !           301:                                return( 0 );
        !           302:                        l1 = xl_log2[ L1 ];
        !           303:                        if( l1 > 31 )
        !           304:                                return( 0 );
        !           305:                        l1 = 31 - l1;
        !           306:                        /* handle as 2 error case */
        !           307:                        return( fix2() );       
        !           308:                }
        !           309: 
        !           310:                /* correct error */
        !           311:                *( pbfr + l0 * 1024 ) ^= e0;
        !           312: 
        !           313:                /* bump to next column */
        !           314:                pbfr++;
        !           315:        }
        !           316:        /* indicate ok */
        !           317:        return( 1 );
        !           318: }
        !           319: 
        !           320: /************************************************************************/
        !           321: /*     1 error case, location unknown                                  */
        !           322: /************************************************************************/
        !           323: /*                                                                     */
        !           324: /*     syndrome equations                                              */
        !           325: /*                                                                     */
        !           326: /*     | 1|          |s0|                                              */
        !           327: /*     |L0|   |e0| = |s1|                                              */
        !           328: /*     |M0|          |s2|                                              */
        !           329: /*                                                                     */
        !           330: /*     location equations                                              */
        !           331: /*                                                                     */
        !           332: /*     L0 = s1/s0 = s0/s2                                              */
        !           333: /*     l0 = log2[L0]                                                   */
        !           334: /*                                                                     */
        !           335: /*     error equation                                                  */
        !           336: /*                                                                     */
        !           337: /*     e0 = s0                                                         */
        !           338: /************************************************************************/
        !           339: 
        !           340: static
        !           341: fix0()
        !           342: {
        !           343:        fpchr   p0;
        !           344:        int     d0;
        !           345:        int     d1;
        !           346: 
        !           347:        for ( d1 = 0; d1 < 1024; ++d1 ){
        !           348:                /* generate syndromes */
        !           349:                p0 = pbfr;
        !           350:                s2 = s1 = s0 = 0;
        !           351:                for( d0 = 0; d0 < nbfr; ++d0 ){
        !           352:                        s0 ^= *p0;
        !           353:                        s1 = xl_mx02[ s1 ] ^ *p0;
        !           354:                        s2 = xl_mxc3[ s2 ] ^ *p0;
        !           355:                        p0 += 1024;
        !           356:                }
        !           357: 
        !           358:                /* br if no error */
        !           359:                if( ( s0 | s1 | s2 ) ){
        !           360:                        /* generate l0 or fail */
        !           361:                        L0 = dvd( s1, s0 );
        !           362:                        L1 = dvd( s0, s2 );
        !           363:                        if ( L0 != L1 )
        !           364:                                return( 0 );
        !           365:                        l0 = xl_log2[ L0 ];
        !           366:                        if( l0 > 31 )
        !           367:                                return( 0 );
        !           368:                        l0 = 31 - l0;
        !           369: 
        !           370:                        /* generate error value */
        !           371:                        e0 = s0;
        !           372: 
        !           373:                        /* correct error */
        !           374:                        *( pbfr + l0 * 1024 ) ^= e0;
        !           375:                }
        !           376: 
        !           377:                /* bump to next column */
        !           378:                pbfr++;
        !           379:        }
        !           380:        /* indicate ok */
        !           381:        return( 1 );
        !           382: }
        !           383: 
        !           384: /************************************************************************/
        !           385: /*     multiply                                                        */
        !           386: /************************************************************************/
        !           387: static unchar
        !           388: mpy( m0, m1 )
        !           389: unchar m0;
        !           390: unchar m1;
        !           391: {
        !           392:        register int m2;
        !           393: 
        !           394:        if ( m0 == 0 || m1 == 0 )
        !           395:                return( 0 );
        !           396:        m2 = xl_log2[ m0 ] + xl_log2[ m1 ];
        !           397:        if ( m2 >= 255 )
        !           398:                m2 -= 255;
        !           399:        return( xl_alg2[ m2 ] );
        !           400: }
        !           401: 
        !           402: /************************************************************************/
        !           403: /*     divide                                                          */
        !           404: /************************************************************************/
        !           405: static unchar
        !           406: dvd( m0, m1 )
        !           407: unchar m0;
        !           408: unchar m1;
        !           409: {
        !           410:        register int    m2;
        !           411: 
        !           412:        if( m0 == 0 )
        !           413:                return( 0 );
        !           414:        m2 = xl_log2[ m0 ] - xl_log2[ m1 ];
        !           415:        if( m2 < 0 )
        !           416:                m2 += 255;
        !           417:        return( xl_alg2[ m2 ] );
        !           418: }

unix.superglobalmegacorp.com

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