Annotation of cci/d/dmp4/chk_fpm_trap.c, revision 1.1.1.1

1.1       root        1: 
                      2: #include "dmp_defs.h"
                      3: 
                      4: /**********************************************************************
                      5: *
                      6: *      Check the results of an FPP Emulation Trap (FPM)
                      7: *
                      8: * This code will verify:
                      9: *   - the data pushed onto the stack by the trap 
                     10: *   - the PSL saved after the event
                     11: *   - the number of page faults
                     12: *   - the final accumulator value
                     13: *   - the register values 
                     14: *
                     15: **********************************************************************/
                     16: chk_fpm_trap()
                     17: {
                     18:        error = FALSE;
                     19:        if( !fpm_trap_occurred ) {      /* Did we get an FPM trap?  */
                     20:             error = TRUE;
                     21:             errcnt++;
                     22:             if( prt_error ) 
                     23:                  prt_no_fpm_trap();    /* print an error message */
                     24:             if( halt_flg ) 
                     25:                  fpm_halt( 7 );        /* halt with code = 7 */
                     26:             if( loop_on_err )
                     27:                  force_loop = TRUE;
                     28:        }
                     29:         else {                         /* got trap -check the results */
                     30:             chk_fpm_data();            /* check data pushed on stack  */
                     31:             if( !error ) 
                     32:                  chk_fpm_faults();     /* check # of page faults      */
                     33:             if( !error )
                     34:                  chk_final_acc();      /* check final Acc value       */
                     35:             if( !error )
                     36:                  chk_fpm_regs();       /* check final REG values      */
                     37:        } 
                     38: } 
                     39: 
                     40: 
                     41: 
                     42: /****************************************************************************
                     43: *
                     44: *      Check the results of an FPP Emulation Trap.
                     45: *
                     46: *  Check the stack data, the final accumulator, and the registers. The data
                     47: *  was saved by the FPM trap handler.
                     48: *  The stack data is:
                     49: *   - the PSL
                     50: *   - the PC of the next instruction
                     51: *   - the op-code
                     52: *   - the operand's LS longword  { for double precision instructions }
                     53: *   - the operand's MS longword
                     54: *
                     55: ****************************************************************************/
                     56: chk_fpm_data()
                     57: {
                     58:        exp_pc = code_addr + inst_size;         /* expected PC on stack */
                     59: /*
                     60:  * check the FPM variables pushed onto the stack
                     61: */
                     62:        if( !no_ops ) {
                     63:            dbl_value_1.m = fpm_ms_op;          /* accept anything for the */
                     64:            dbl_value_1.l = fpm_ls_op;          /* operand if no operands  */
                     65:        }
                     66:        if( (fpm_ms_op != dbl_value_1.m) ||
                     67:            ((fpm_ls_op != dbl_value_1.l) && (precision == DBL) && (!s_to_d)) ||
                     68:            (fpm_op_code != op_code) ||
                     69:            (fpm_pc != exp_pc) ||
                     70:            (fpm_psl != init_psl) ) {
                     71:             error = TRUE;
                     72:             errcnt++;
                     73:             if( prt_error ) 
                     74:                  prt_fpm_stack_er();
                     75:             if( halt_flg ) 
                     76:                  fpm_halt( 8 );                /* halt on the error */
                     77:             if( loop_on_err )
                     78:                  force_loop = TRUE;            /* set loop flag */
                     79:        }
                     80: }
                     81: 
                     82: 
                     83: /****************************************************************************
                     84: *
                     85: *      Check the number of page faults that were generated
                     86: *
                     87: ****************************************************************************/
                     88: chk_fpm_faults()
                     89: {
                     90:        if( no_page_faults != exp_page_faults ) {
                     91:             error = TRUE;
                     92:             errcnt++;
                     93:             if( prt_error ) {
                     94:                  prt_dmp_er_msg( trans_flt_cnt_msg );
                     95:                  writed( no_page_faults);
                     96:                  writes(" occurred\n");
                     97:                  writed( exp_page_faults);
                     98:                  writes(" were expected\n");
                     99:                  prt_reg_data();               /* print the bad register */
                    100:             }
                    101:             if( halt_flg ) 
                    102:                       fpm_halt( 3 );           /* halt on the error */
                    103:             if( loop_on_err )
                    104:                  force_loop = TRUE;            /* set loop flag */
                    105:        } 
                    106: }
                    107: 
                    108: 
                    109: 
                    110: /****************************************************************************
                    111: *
                    112: *      Check the final Accumulator value
                    113: *
                    114: *  The "no-fpp" firmware will not clear "bad 0" accumulators if the
                    115: *  MS of the operand loaded has any bits set. The LS will be cleared if
                    116: *  the MS is already all 0's.
                    117: *
                    118: ****************************************************************************/
                    119: chk_final_acc()
                    120: {
                    121:        if( dbl_ld_acc.m & 0x7f800000 ) {       /* get final ACC expected */
                    122:             dbl_expected.m = dbl_ld_acc.m;     /* non-zero accumulator */
                    123:             dbl_expected.l = dbl_ld_acc.l;
                    124:        } else {                                /* zero accumulator */
                    125:             if( (no_fpp_wcs) && (dbl_ld_acc.m) ) {
                    126:                 dbl_expected.m = dbl_ld_acc.m; /* don't clear the bad 0 */
                    127:                 dbl_expected.l = dbl_ld_acc.l;
                    128:             } else {
                    129:                 dbl_expected.m = 0;            /* clear any bad 0's */
                    130:                 dbl_expected.l = 0;
                    131:             }
                    132:        }  /* end of "0" accumulator */
                    133:        if( ( dbl_expected.m != dbl_st_acc.m ) ||
                    134:            ( (precision == DBL) && (dbl_expected.l != dbl_st_acc.l) ) ) {
                    135:             error = TRUE;
                    136:             errcnt++;
                    137:             if( prt_error ) 
                    138:                  prt_fpm_acc_er();
                    139:             if( halt_flg ) 
                    140:                       fpm_halt( 5 );           /* halt on the error */
                    141:             if( loop_on_err )
                    142:                  force_loop = TRUE;                    /* set loop flag */
                    143:        } 
                    144: }
                    145: 
                    146: 
                    147: 
                    148: 
                    149: 
                    150: /****************************************************************************
                    151: *
                    152: *      Check the final register values
                    153: *
                    154: ****************************************************************************/
                    155: chk_fpm_regs()
                    156: {
                    157:         reg_no = 0;                    /* check regs 0 - 12 */
                    158:         regs_ok = TRUE;
                    159:         while( (reg_no < 13) && (regs_ok) )  
                    160:              if( store_regs[ reg_no ] == exp_regs[ reg_no ] )
                    161:                   reg_no++;
                    162:              else
                    163:                   regs_ok = FALSE;
                    164:         if( !regs_ok ) {
                    165:              error = TRUE;
                    166:              errcnt++;
                    167:              if( prt_error ) {
                    168:                   prt_dmp_er_msg( reg_modified_msg );
                    169:                   prt_reg_data();              /* print the bad register */
                    170:              }
                    171:              if( halt_flg )
                    172:                   fpm_halt( 4 );               /* halt on the error */
                    173:              if( loop_on_err )
                    174:                   force_loop = TRUE;           /* set loop flag */
                    175:        }
                    176: }
                    177: 
                    178: 
                    179: 
                    180: 
                    181: 
                    182: /****************************************************************************
                    183: *
                    184: *      print a "no FPM trap occurred" error message
                    185: *
                    186: ****************************************************************************/
                    187: prt_no_fpm_trap()
                    188: {
                    189:        prt_dmp_er_msg( " - EXPECTED FPM TRAP DID NOT OCCUR" );
                    190:        writes("initial Acc = ");
                    191:        write32h( dbl_ld_acc.m );
                    192:        if( precision == DBL ) {
                    193:             writec(' ');
                    194:             write32h( dbl_ld_acc.l );
                    195:        }
                    196:        writes(",    ");
                    197:        writed( no_page_faults );
                    198:        writes(" page faults occurred\n");
                    199:        writes("    operand = ");
                    200:        write32h( dbl_value_1.m );
                    201:        if( precision == DBL ) {
                    202:             writec(' ');
                    203:             write32h( dbl_value_1.l );
                    204:        }
                    205:        writes(",    ");
                    206:        writed( exp_page_faults );
                    207:        writes(" page faults occurred\n");
                    208: }
                    209: 
                    210: 
                    211: 
                    212: 
                    213: /****************************************************************************
                    214: *
                    215: *      print a "bad data on the stack after an fpm event" message
                    216: *
                    217: ****************************************************************************/
                    218: prt_fpm_stack_er()
                    219: {
                    220:        prt_dmp_er_msg( bad_fpm_stack_msg );
                    221:        writes("initial Acc = ");
                    222:        write32h( dbl_ld_acc.m );
                    223:        if( precision == DBL ) {
                    224:             writec(' ');
                    225:             write32h( dbl_ld_acc.l );
                    226:        }
                    227:        writes(",    ");
                    228:        writed( no_page_faults );
                    229:        writes(" page faults occurred\n");
                    230:        writes("  final Acc = ");
                    231:        write32h( dbl_st_acc.m );
                    232:        if( precision == DBL ) {
                    233:             writec(' ');
                    234:             write32h( dbl_st_acc.l );
                    235:        }
                    236:        writes(",    ");
                    237:        writed( exp_page_faults );
                    238:        writes(" page faults occurred\n");
                    239:        writes("  data on the stack      expected\n");
                    240:        writes(" MS operand = ");
                    241:        write32h( fpm_ms_op );                  /* MS operand */
                    242:        writes(",  ");
                    243:        write32h( dbl_value_1.m );
                    244:        writes("\n LS operand = ");
                    245:        write32h( fpm_ls_op );                  /* LS operand */
                    246:        writes(",  ");
                    247:        write32h( dbl_value_1.l );
                    248:        writes("\n    op-code = ");
                    249:        write32h( fpm_op_code );                /* op-code */
                    250:        writes(",  ");
                    251:        write32h( op_code );
                    252:        writes("\n        PC  = ");
                    253:        write32h( fpm_pc );                     /* PC */
                    254:        writes(",  ");
                    255:        write32h( exp_pc );
                    256:        writes("\n        PSL = ");
                    257:        write32h( fpm_psl );                    /* PSL */
                    258:        writes(",  ");
                    259:        write32h( init_psl );
                    260:        writec('\n');
                    261: }
                    262: 
                    263: 
                    264: 
                    265: /****************************************************************************
                    266: *
                    267: *      print a "bad Accumulator after an fpm event" message
                    268: *
                    269: ****************************************************************************/
                    270: prt_fpm_acc_er()
                    271: {
                    272:        prt_dmp_er_msg( bad_fpm_acc_msg );
                    273:        writes(" initial Acc = ");
                    274:        write32h( dbl_ld_acc.m );
                    275:        if( precision == DBL ) {
                    276:             writec(' ');
                    277:             write32h( dbl_ld_acc.l );
                    278:        }
                    279:        writes(",    ");
                    280:        writed( no_page_faults );
                    281:        writes(" page faults occurred\n");
                    282:        writes("   final Acc = ");
                    283:        write32h( dbl_st_acc.m );
                    284:        if( precision == DBL ) {
                    285:             writec(' ');
                    286:             write32h( dbl_st_acc.l );
                    287:        }
                    288:        writes(",    ");
                    289:        writed( exp_page_faults );
                    290:        writes(" page faults occurred\n");
                    291:        writes("expected Acc = ");
                    292:        write32h( dbl_expected.m );
                    293:        if( precision == DBL ) {
                    294:             writec(' ');
                    295:             write32h( dbl_expected.l );
                    296:        }
                    297:        writec('\n');
                    298: }
                    299: 
                    300: 
                    301: 
                    302: 
                    303: /****************************************************************************
                    304: *
                    305: *      Halt on an error
                    306: *
                    307: ****************************************************************************/
                    308: fpm_halt( code )
                    309: int code;                              /* error code to halt with */
                    310: {
                    311:        sgl_dummy1 = code;
                    312:        asm("movl _test_no,r0");                /* r0  = test number       */
                    313:        asm("movl _addr_code,r1");              /* r1  = addr mode code    */
                    314:        asm("movl _sgl_dummy1,r2");             /* r2  = error code        */
                    315:        asm("movl _cycle,r3");                  /* r3  = cycle count       */
                    316:        if( code == 7 ) {       /* no FPM trap */
                    317:             sgl_value_1 = dbl_ld_acc.l;
                    318:             sgl_value_2 = dbl_st_acc.l;
                    319:             if( precision == DBL )
                    320:                  sgl_value_3 = dbl_value_1.l;    /* LS of the operand */  
                    321:             else
                    322:                  sgl_value_4 = 0;                /* there is no LS op */  
                    323:             asm("movl _dbl_ld_acc,r4");        /* r4  = MS of initial Acc */
                    324:             asm("movl _sgl_value_1,r5");       /* r5  = LS of initial Acc */
                    325:             asm("movl _dbl_st_acc,r6");        /* r6  = MS of final Acc   */
                    326:             asm("movl _sgl_value_2,r7");       /* r7  = LS of final Acc   */
                    327:             asm("movl _no_page_faults,r8");    /* r8  = # page faults     */
                    328:             asm("movl _exp_page_faults,r9");   /* r9  = exp # page faults */
                    329:             asm("movl _dbl_value_1,r10");      /* r10 = MS operand 1      */
                    330:             asm("movl _sgl_value_3,r11");      /* r11 = LS operand 1      */
                    331:             asm("movl _index,r12");            /* r12 = data index        */
                    332:        } else {                /* got an FPM trap */
                    333:             asm("movl _fpm_psl,r4");           /* r4  = PSL on the stack  */
                    334:             asm("movl _fpm_pc,r5");            /* r5  = PC on the stack   */
                    335:             asm("movl _fpm_op_code,r6");       /* r6  = OP-CODE on stack  */
                    336:             asm("movl _fpm_ls_op,r7");         /* r7  = LS op. on stack   */
                    337:             asm("movl _fpm_ms_op,r8");         /* r8  = MS op. on stack   */
                    338:        }
                    339:        if( code == 8 ) {       /* bad stack */
                    340:             sgl_value_1 = dbl_value_1.l;
                    341:             asm("movl _exp_psl,r9");           /* r9  = PSL expected      */
                    342:             asm("movl _exp_pc,r10");           /* r10 = PC expected       */
                    343:             asm("movl _op_code,r11");          /* r11 = OP-CODE expected  */
                    344:             asm("movl _sgl_value_1,r12");      /* r12 = LS op. expected   */
                    345:             asm("movl _dbl_value_1,r13");      /* r13 = MS op. expected   */
                    346:             asm("movl _no_page_faults,r14");   /* r14 = # page faults     */
                    347:        } 
                    348:         else if( code == 5 ) { /* bad final Acc */
                    349:             sgl_value_1 = dbl_st_acc.l;
                    350:             sgl_value_2 = dbl_expected.l;
                    351:             asm("movl _dbl_st_acc,r9");        /* r9  = MS final Acc.     */
                    352:             asm("movl _sgl_value_1,r10");      /* r10 = LS final Acc.     */
                    353:             asm("movl _dbl_expected,r11");     /* r11 = MS expected Acc.  */
                    354:             asm("movl _sgl_value_2,r12");      /* r12 = LS expected Acc.  */
                    355:             asm("movl _index,r13");            /* r13 = data index        */
                    356:             asm("movl _no_page_faults,r14");   /* r14 = # page faults     */
                    357:        }
                    358:         else if( code == 5 ) { /* bad final Acc */
                    359:             asm("movl _reg_no,r9");            /* r9  = bad register #    */
                    360:             asm("movl _store_regs[r9],r10");   /* r10 = final (bad) value */
                    361:             asm("movl _exp_regs[r9],r11");     /* r11 = expected value    */
                    362:             asm("movl _no_page_faults,r12");   /* r12 = # page faults     */
                    363:             asm("movl _index,r13");            /* r13 = data index        */
                    364:        }
                    365:         else if( code == 3 ) { /* wrong # page faults */
                    366:             asm("movl _no_page_faults,r9");    /* r9  = # page faults     */
                    367:             asm("movl _exp_page_faults,r10");  /* r10 = exp # page faults */
                    368:             asm("movl _index,r11");            /* r11 = data index        */
                    369:        };
                    370:        asm("halt");
                    371: }
                    372: 
                    373: 
                    374: 

unix.superglobalmegacorp.com

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