|
|
1.1 ! root 1: ! 2: #include "dmp_defs.h" ! 3: ! 4: ! 5: /************************************************************************ ! 6: * Verify the accmulator after a page fault ! 7: * ! 8: * The accumulator should not be changed until after all of the instruction ! 9: * was read from valid memory. This routine is called from the Page Fault ! 10: * handler to make sure that the accumulator is still unmodified. This ! 11: * is to detect if any instructions are getting executed from an invalid ! 12: * page of memory. ! 13: * The "no-fpp" firmware will not clear double precision "bad 0's". ! 14: * ! 15: ************************************************************************/ ! 16: chk_trans_acc() ! 17: { ! 18: if( acc_ld_size == DBL ) { ! 19: asm("std _trans_acc"); /* store the DBL Acc. */ ! 20: } else { ! 21: asm("stf _trans_acc"); /* store the SGL Acc. */ ! 22: } ! 23: if( (dbl_ld_acc.m & 0x7f800000) || ! 24: ( (no_fpp_wcs) && (precision == DBL) ) ) { ! 25: exp_trans_acc.m = dbl_ld_acc.m; ! 26: exp_trans_acc.l = dbl_ld_acc.l; ! 27: } else { /* zero accumulator */ ! 28: exp_trans_acc.m = 0; /* clear any bad 0's */ ! 29: exp_trans_acc.l = 0; ! 30: } ! 31: if( (trans_acc.m != exp_trans_acc.m) || /* compare current Acc */ ! 32: ( (acc_ld_size == DBL) && /* to the Acc loaded */ ! 33: (trans_acc.l != exp_trans_acc.l) ) ) { ! 34: errcnt++; /* bump the error count */ ! 35: trans_acc_error = TRUE; /* set the error flag */ ! 36: if( prt_error ) ! 37: prt_trans_acc_er(); /* print an error message */ ! 38: if( halt_flg ) ! 39: trans_acc_er_hlt(); /* halt on the error */ ! 40: if( loop_on_err ) ! 41: force_loop = TRUE; /* set the error loop flag */ ! 42: } ! 43: } ! 44: ! 45: ! 46: ! 47: ! 48: /************************************************************************ ! 49: * print a Accumulator Corrupted After a Page Fault error message ! 50: * ! 51: * The message will be of the form: ! 52: * cycle: xx. DMP test xx. <inst>. Bad Acc. after a page fault, index = xx ! 53: * addressing mode: <addressing mode description> ! 54: * inst buf= xx xx xx xx xx xx xx xx xx xx xx -page faults on byte(s) 0, x ! 55: * Acc loaded = xxxxxxxx xxxxxxxx, operand 1 = xxxxxxxx xxxxxxxx ! 56: * Acc stored = xxxxxxxx xxxxxxxx, operand 2 = xxxxxxxx xxxxxxxx ! 57: * Acc expected = xxxxxxxx xxxxxxxx, error after page fault #xx ! 58: ************************************************************************/ ! 59: prt_trans_acc_er() ! 60: { ! 61: ! 62: prt_dmp_er_msg( trans_acc_er_msg ); /* print the error msg */ ! 63: writes(" Acc loaded = "); ! 64: write32h( dbl_ld_acc.m ); ! 65: if( acc_ld_size == DBL ) { ! 66: writec(' '); ! 67: write32h( dbl_ld_acc.l ); ! 68: } ! 69: writes(", "); ! 70: if( no_ops ) { ! 71: writes(" operand 1 = "); ! 72: write32h( dbl_value_1.m ); ! 73: if( acc_ld_size == DBL ) { ! 74: writec(' '); ! 75: write32h( dbl_value_1.l ); ! 76: } ! 77: writec('\n'); ! 78: } ! 79: writes(" Acc stored = "); ! 80: write32h( trans_acc.m ); ! 81: if( acc_ld_size == DBL ) { ! 82: writec(' '); ! 83: write32h( trans_acc.l ); ! 84: } ! 85: if( no_ops == 2 ) { ! 86: writes(", operand 2 = "); ! 87: write32h( dbl_value_2.m ); ! 88: if( acc_ld_size == DBL ) { ! 89: writec(' '); ! 90: write32h( dbl_value_2.l ); ! 91: } ! 92: } ! 93: writes("\nAcc expected = "); ! 94: write32h( exp_trans_acc.m ); ! 95: if( acc_ld_size == DBL ) { ! 96: writec(' '); ! 97: write32h( exp_trans_acc.l ); ! 98: } ! 99: writes(", error after page fault #"); ! 100: writed( no_page_faults ); ! 101: writec('\n'); ! 102: } ! 103: ! 104: ! 105: ! 106: ! 107: /************************************************************************* ! 108: * ! 109: * Error Halt for a bad Accumulator after a page fault ! 110: * ! 111: *************************************************************************/ ! 112: trans_acc_er_hlt() ! 113: { ! 114: sgl_value_1 = dbl_ld_acc.m; ! 115: sgl_value_2 = dbl_ld_acc.l; ! 116: sgl_value_3 = trans_acc.m; ! 117: sgl_value_4 = trans_acc.l; ! 118: sgl_value_5 = exp_trans_acc.m; ! 119: sgl_value_6 = exp_trans_acc.l; ! 120: asm("movl _test_no,r0"); /* r0 = test number */ ! 121: asm("movl _addr_code,r1"); /* r1 = addr mode code */ ! 122: asm("movl $6,r2"); /* r2 = error code (6) */ ! 123: asm("movl _cycle,r3"); /* r3 = cycle count */ ! 124: asm("movl _sgl_value_1,r4"); /* r4 = MS of initial Acc */ ! 125: asm("movl _sgl_value_2,r5"); /* r5 = LS of initial Acc */ ! 126: asm("movl _sgl_value_3,r6"); /* r6 = MS of final Acc */ ! 127: asm("movl _sgl_value_4,r7"); /* r7 = LS of final Acc */ ! 128: asm("movl _sgl_value_5,r8"); /* r8 = MS of expected Acc */ ! 129: asm("movl _sgl_value_6,r9"); /* r9 = LS of expected Acc */ ! 130: asm("movl _no_page_faults,r10"); /* r10 = pg fault # of err. */ ! 131: asm("movl _dbl_value_1,r11"); /* r11 = MS of operand 1 */ ! 132: asm("movl _dbl_value_1+4,r12"); /* r12 = LS of operand 1 */ ! 133: asm("movl _dbl_value_2,r13"); /* r13 = MS of operand 2 */ ! 134: asm("halt"); /* halt */ ! 135: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.