Annotation of cci/d/fpevent/pipe2.c, revision 1.1.1.1

1.1       root        1: 
                      2: #include "evt_defs.h"
                      3: 
                      4: /*
                      5:  *********************************************************************
                      6:  *     FPP PIPELINED EVENTS TEST #2
                      7:  *
                      8:  *  This test will execute the following code: "LDD MULD MTPR LDD"
                      9:  * with a reserved operand fault on the MTPR. We will make sure that:
                     10:  * 1. The fault is detected, 
                     11:  * 2. the multiply operation completes, and
                     12:  * 3. the 2nd load instruction is not executed.
                     13:  *
                     14:  * NOTE: pipe6 also uses this test's data patterns
                     15:  *********************************************************************
                     16: */
                     17: pipe2()
                     18: {
                     19:        asm("moval (r13),_pre_event_fp");       /* save the frame pointer */
                     20:        asm("moval (r14),_pre_event_sp");       /* save the stack pointer */
                     21:        precision = DBL;
                     22:        test_event = RESOP_CODE;                /* alignment fault expected */
                     23:        exp_event = FALSE;                      /* ... but not yet          */
                     24:        asm("movab _pipe2_ret,_event_return"); /* set post - event return  */
                     25:        dbl_value_2.m = 0x12345678;             /* data pattern for the     */
                     26:        dbl_value_2.l = 0xfedcba98;             /*     2nd LDD instruction  */
                     27:        for( index = 0; index < max_pipe2_index; index++ )
                     28:        {
                     29:             dbl_ld_acc =   pipe2_data[index].op_1;     /* get the data */
                     30:             dbl_value_1 =  pipe2_data[index].op_2;
                     31:             dbl_expected = pipe2_data[index].exp;
                     32:             asm(".globl _pipe2_lp1");
                     33:             asm("_pipe2_lp1:");
                     34:             asm("bispsw $0x60");               /* enable ovfl & undfl  */
                     35:             asm("ldd _dbl_ld_acc");            /* load the Acc.        */
                     36:             exp_event = test_event;            /* expect event soon    */
                     37:             asm("muld _dbl_value_1");          /* start the multiply   */
                     38:             asm("mtpr $1,$0x40");;             /* trigger the fault    */
                     39:             asm("ldd _dbl_value_2");           /* we shouldn't get to here  */
                     40: /*
                     41:  * If we got to here then there was no event
                     42: */
                     43:             if( force_loop )
                     44:                  asm("brw _pipe2_lp1");;       /* loop on the error         */
                     45:             exp_event = FALSE;                 /* reset event expected flag */
                     46:             asm("movl _pre_event_fp,fp");      /* restore the frame pointer */
                     47:             asm("movl _pre_event_sp,sp");      /* restore the stack pointer */
                     48:             asm("bicpsw $0x60");               /* disable ovfl & undfl evts */
                     49:             no_pipe2_evt();;                   /* report the error          */
                     50: /*
                     51:  * Come here after the event
                     52: */
                     53:             asm(".globl _pipe2_ret");
                     54:             asm("_pipe2_ret:");
                     55:             asm("movl _pre_event_fp,fp");      /* restore the frame pointer */
                     56:             asm("movl _pre_event_sp,sp");      /* restore the stack pointer */
                     57:             if( force_loop )
                     58:                  asm("brw _pipe2_lp1");;       /* loop on the error         */
                     59:             asm("bicpsw $0x60");               /* disable ovfl & undfl evts */
                     60:             if( post_evt_acc.l != dbl_expected.l )
                     61:                  bad_pipe2_result();           /* incorrect result error    */
                     62:             else if( post_evt_acc.m != dbl_expected.m )
                     63:             {
                     64:                  if( (post_evt_acc.m == dbl_value_2.m) && 
                     65:                      (post_evt_acc.l == dbl_value_2.l) )
                     66:                       pipe2_queue_er();        /* queue not cleared error   */
                     67:                  else
                     68:                       bad_pipe2_result();      /* incorrect result error    */
                     69:             }
                     70:        }
                     71: }
                     72: 
                     73: 
                     74: 
                     75: /****************************************************************************
                     76: *              Report an "EVENT NOT DETECTED" error
                     77: *
                     78: * Cycle: xx. EVT test xx. subtest xx. No Reserved Operand fault. index = xx
                     79: * inst = LDD op1, MULD op2, MTPR 1,0x40, LDD op3 (Reserved Op. fault on MTPR)
                     80: * op1 = xxxxxxxx xxxxxxxx,   op2 = xxxxxxxx xxxxxxxx
                     81: ****************************************************************************/
                     82: no_pipe2_evt()
                     83: {
                     84:        errcnt++;                               /* bump the error count    */
                     85:        if ( prt_error ) {
                     86:             print_pipe2_err( "  No Reserved Operand fault." );
                     87:             writes("op1 = ");
                     88:             write32h( dbl_ld_acc.m );
                     89:             writes(" ");
                     90:             write32h( dbl_ld_acc.l );
                     91:             writes(",   op2 = ");
                     92:             write32h( dbl_value_1.m );
                     93:             writes(" ");
                     94:             write32h( dbl_value_1.l );
                     95:             writec('\n');
                     96:        }
                     97:        if ( halt_flg )                         /* halt on error?           */
                     98:             pipe2_halt( 1 );                   /* halt with a code of 1    */
                     99:        if ( loop_on_err ) {
                    100:             force_loop = TRUE;         /* set the force loop flag */
                    101:             asm("jmp _pipe2_lp1");     /* and loop                */
                    102:        };
                    103: }
                    104: 
                    105: 
                    106: 
                    107: 
                    108: /****************************************************************************
                    109: *              Report an "BAD ACCUMULATOR AFTER THE EVENT" error
                    110: *
                    111: * Cycle: xx. EVT test xx. subtest xx. Bad final Accumulator. index = xx
                    112: * inst = LDD op1, MULD op2, MTPR 1,0x40, LDD op3 (Reserved Op. fault on MTPR)
                    113: * The 2nd LDD should not be executed. 
                    114: * op1 = xxxxxxxx xxxxxxxx,   final Acc. = xxxxxxxx xxxxxxxx
                    115: * op2 = xxxxxxxx xxxxxxxx,   expected   = xxxxxxxx xxxxxxxx
                    116: * op3 = xxxxxxxx xxxxxxxx
                    117: ****************************************************************************/
                    118: bad_pipe2_result()
                    119: {
                    120:        errcnt++;                               /* bump the error count    */
                    121:        if ( prt_error ) {
                    122:             print_pipe2_err( ". Bad final Accumulator." );
                    123:             writes("The 2nd LDD should not be executed\n");
                    124:             writes("op1 = ");
                    125:             write32h( dbl_ld_acc.m );
                    126:             writes(" ");
                    127:             write32h( dbl_ld_acc.l );
                    128:             writes(",   final Acc. = ");
                    129:             write32h( post_evt_acc.m );
                    130:             writec(' ');
                    131:             write32h( post_evt_acc.l );
                    132:             writes("\nop2 = ");
                    133:             write32h( dbl_value_1.m );
                    134:             writes(" ");
                    135:             write32h( dbl_value_1.l );
                    136:             writes(",   expected   = ");
                    137:             write32h( dbl_expected.m );
                    138:             writes(" ");
                    139:             write32h( dbl_expected.l );
                    140:             writes("\nop3 = ");
                    141:             write32h( dbl_value_2.m );
                    142:             writes(" ");
                    143:             write32h( dbl_value_2.l );
                    144:             writec('\n');
                    145:        }
                    146:        if ( halt_flg )                         /* halt on error?           */
                    147:             pipe2_halt( 2 );                   /* halt with a code of 2    */
                    148:        if ( loop_on_err ) {
                    149:             force_loop = TRUE;         /* set the force loop flag */
                    150:             asm("jmp _pipe2_lp1");     /* and loop                */
                    151:        };
                    152: }
                    153: 
                    154: 
                    155: 
                    156: 
                    157: /****************************************************************************
                    158: *              Report an "FPP Queue not cleared" error
                    159: *
                    160: * Cycle: xx. EVT test xx. subtest xx. FPP queue not cleared. index = xx
                    161: * inst = LDD op1, MULD op2, MTPR 1,0x40, LDD op3 (Reserved Op. fault on MTPR)
                    162: * The 2nd LDD should not have been executed but apparently was.
                    163: * op1 = xxxxxxxx xxxxxxxx,   final Acc. = xxxxxxxx xxxxxxxx
                    164: * op2 = xxxxxxxx xxxxxxxx,   expected   = xxxxxxxx xxxxxxxx
                    165: * op3 = xxxxxxxx xxxxxxxx
                    166: ****************************************************************************/
                    167: pipe2_queue_er()
                    168: {
                    169:        errcnt++;                               /* bump the error count    */
                    170:        if ( prt_error ) {
                    171:             print_pipe2_err( ". FPP queue not cleared." );
                    172:             writes(
                    173:             "The 2nd LDD should not have been executed but apparently was.\n");
                    174:             writes("op1 = ");
                    175:             write32h( dbl_ld_acc.m );
                    176:             writes(" ");
                    177:             write32h( dbl_ld_acc.l );
                    178:             writes(",   final Acc. = ");
                    179:             write32h( post_evt_acc.m );
                    180:             writec(' ');
                    181:             write32h( post_evt_acc.l );
                    182:             writes("\nop2 = ");
                    183:             write32h( dbl_value_1.m );
                    184:             writes(" ");
                    185:             write32h( dbl_value_1.l );
                    186:             writes(",   expected   = ");
                    187:             write32h( dbl_expected.m );
                    188:             writes(" ");
                    189:             write32h( dbl_expected.l );
                    190:             writes("\nop3 = ");
                    191:             write32h( dbl_value_2.m );
                    192:             writes(" ");
                    193:             write32h( dbl_value_2.l );
                    194:             writec('\n');
                    195:        }
                    196:        if ( halt_flg )                         /* halt on error?           */
                    197:             pipe2_halt( 3 );                   /* halt with a code of 3    */
                    198:        if ( loop_on_err ) {
                    199:             force_loop = TRUE;         /* set the force loop flag */
                    200:             asm("jmp _pipe2_lp1");     /* and loop                */
                    201:        };
                    202: }
                    203: 
                    204: 
                    205: 
                    206: 
                    207: 
                    208: /****************************************************************************
                    209: *              Report an error message of the form
                    210: *
                    211: * Cycle: xx. EVT test xx. subtest xx  <your message here> index = xx
                    212: * inst = LDD op1, MULD op2, MTPR 1,0x40, LDD op3  (fault expected on the MTPR)
                    213: ****************************************************************************/
                    214: print_pipe2_err( msg )
                    215: char *msg;                                     /* pointer to error message */
                    216: {
                    217:             if( errcnt == 1 )                  /* 1st error?               */
                    218:                  writes(" \n");                /* start a new print line   */
                    219:             writes("Cycle: ");
                    220:             writed( cycle );
                    221:             writes("  EVT test ");
                    222:             writed( test_no );
                    223:             writes(". subtest ");
                    224:             writed( subtest );
                    225:             writes( msg );                     /* print the error message */
                    226:             writes(" index = ");
                    227:             writed( index );
                    228:             writes("\ninst = LDD op1, MULD op2, MTPR 1,0x40, LDD op3");
                    229:             writes(" (Reserved Op. fault on the MTPR)\n");
                    230: }
                    231: 
                    232: 
                    233: /****************************************************************************
                    234: *              Error Halt Routine
                    235: ****************************************************************************/
                    236: pipe2_halt( code )
                    237: int code;                                      /* halt code to use  */
                    238: {
                    239:        err_code = code;
                    240:        sgl_value_1 = dbl_ld_acc.m;
                    241:        sgl_value_2 = dbl_ld_acc.l;
                    242:        sgl_value_3 = dbl_value_1.m;
                    243:        sgl_value_4 = dbl_value_1.l;
                    244:        asm("movl _test_no,r0");                /* r0  = test number        */
                    245:        asm("movl _subtest,r1");                /* r1  = subtest number     */
                    246:        asm("movl _err_code,r2");               /* r2  = error code         */
                    247:        asm("movl _cycle,r3");                  /* r3  = cycle count        */
                    248:        asm("movl _sgl_value_1,r4");            /* r4  = MSW of operand 1   */
                    249:        asm("movl _sgl_value_2,r5");            /* r5  = LSW of operand 1   */
                    250:        asm("movl _sgl_value_3,r6");            /* r6  = MSW of operand 2   */
                    251:        asm("movl _sgl_value_4,r7");            /* r7  = LSW of operand 2   */
                    252:        if( code == 1 ) {
                    253:             asm("movl _index,r8");             /* r8  = data index         */
                    254:             asm("halt");                       /* HALT ...                 */
                    255:        } else {
                    256:             sgl_value_1 = post_evt_acc.m;
                    257:             sgl_value_2 = post_evt_acc.l;
                    258:             sgl_value_3 = dbl_expected.m;
                    259:             sgl_value_4 = dbl_expected.l;
                    260:             sgl_value_5 = dbl_value_2.m;
                    261:             sgl_value_6 = dbl_value_2.l;
                    262:             asm("movl _sgl_value_1,r8");       /* r8  = MSW of final acc.  */
                    263:             asm("movl _sgl_value_2,r9");       /* r9  = LSW of final acc.  */
                    264:             asm("movl _sgl_value_3,r10");      /* r10 = MSW of expected    */
                    265:             asm("movl _sgl_value_4,r11");      /* r11 = LSW of expected    */
                    266:             asm("movl _sgl_value_5,r12");      /* r12 = MSW of operand 3   */
                    267:             asm("movl _sgl_value_6,r13");      /* r13 = LSW of operand 3   */
                    268:             asm("movl _index,r14");            /* r14 = data index         */
                    269:        }
                    270:        asm("halt");                    /* HALT ...                 */
                    271: }

unix.superglobalmegacorp.com

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