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