Annotation of cci/d/dmp4/chk_fpm_trap.c, revision 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.