|
|
1.1 ! root 1: ! 2: #include "fpp_defs.h" ! 3: ! 4: #define TBL_SIZE 1024 /* size of the prom table */ ! 5: ! 6: /***************************************************************************** ! 7: * ! 8: * MTPR - TEST THE "READ TABLE DATA" MTPR INSTRUCTION ! 9: * ! 10: * This test checks the ability to use an MTPR to the Diagnostic Control ! 11: * Register (DCR) to read an entry in the FPP tables. ! 12: * ! 13: * The instruction is: ! 14: * MTPR $2048,$DCR ! 15: * R0 = the table address to check ! 16: * ! 17: * The MTPR instruction will put the table data into R1. ! 18: * ! 19: *****************************************************************************/ ! 20: mtpr_tst() ! 21: { ! 22: asm(".globl _mtpr_t"); ! 23: asm("_mtpr_t:"); /* entry address */ ! 24: if( (cycle == 1) && (prt_hdrs) ) /* print headers on 1st cycle */ ! 25: writes(" MTPR"); ! 26: mtpr_1(); /* read w/ sgl accumulator */ ! 27: mtpr_2(); /* read w/ dbl accumulator */ ! 28: mtpr_3(); /* read during "sinf" */ ! 29: asm("jmp *return"); /* return to the test monitor */ ! 30: } ! 31: ! 32: ! 33: ! 34: /************************************************************************ ! 35: * ! 36: * SUBTEST 1 - Read the tables with a single precision accumulator ! 37: * ! 38: ************************************************************************/ ! 39: mtpr_1() ! 40: { ! 41: force_loop = FALSE; ! 42: subtest = 1; ! 43: index = 0; ! 44: for( sgl_value_1 = 0; sgl_value_1 < TBL_SIZE; sgl_value_1++ ) { ! 45: sgl_ld_acc = ldf_1_data[index].ld; /* get a sgl value */ ! 46: sgl_expected = ldf_1_data[index].exp; /* & expected acc. */ ! 47: /* ! 48: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 49: * The force loop flag is set after the first error. ! 50: */ ! 51: asm("_mtpr_1_lp1:"); ! 52: asm("ldf _sgl_ld_acc"); /* load the accumulator */ ! 53: asm("movl _sgl_value_1,r0"); /* move table address to r0 */ ! 54: asm("clrl r1"); /* clear R1 */ ! 55: asm("mtpr $0x800,$27"); /* read the table entry */ ! 56: asm("stf _sgl_st_acc"); /* save the accumulator */ ! 57: asm("movl r1,_sgl_value_2"); /* save the value read */ ! 58: if( force_loop ) ! 59: asm("brb _mtpr_1_lp1");; /* loop on the error */ ! 60: /* ! 61: * end error loop ! 62: */ ! 63: if( sgl_st_acc != sgl_expected ) { /* verify the accumulator */ ! 64: errcnt++; /* bump the error count */ ! 65: if( prt_error ) ! 66: print_mtpr_error( ! 67: " (SGL Accumulator) -THE ACC WAS MODIFIED"); ! 68: if( halt_flg ) ! 69: mtpr_er_halt( 2 ); ! 70: if( loop_on_err ) { ! 71: force_loop = TRUE; /* set the force loop flag */ ! 72: asm("jmp _mtpr_1_lp1"); /* and loop */ ! 73: } ! 74: } /* end of compare error */ ! 75: if( ++index > max_ldf_1_index ) ! 76: index = 0; /* reset the Acc's index */ ! 77: } ! 78: } /* end of subtest 1 */ ! 79: ! 80: ! 81: ! 82: ! 83: ! 84: /************************************************************************ ! 85: * ! 86: * SUBTEST 2 - Read the tables with a double precision accumulator ! 87: * ! 88: ************************************************************************/ ! 89: mtpr_2() ! 90: { ! 91: force_loop = FALSE; ! 92: subtest = 2; ! 93: index = 0; ! 94: for( sgl_value_1 = 0; sgl_value_1 < TBL_SIZE; sgl_value_1++ ) { ! 95: dbl_ld_acc = ldd_1_data[index].ld; /* get a dbl value */ ! 96: dbl_expected = ldd_1_data[index].exp; /* & expected acc. */ ! 97: /* ! 98: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 99: * The force loop flag is set after the first error. ! 100: */ ! 101: asm("_mtpr_2_lp1:"); ! 102: asm("ldd _dbl_ld_acc"); /* load the accumulator */ ! 103: asm("movl _sgl_value_1,r0"); /* move table address to r0 */ ! 104: asm("clrl r1"); /* clear R1 */ ! 105: asm("mtpr $0x800,$27"); /* read the table entry */ ! 106: asm("std _dbl_st_acc"); /* save the accumulator */ ! 107: asm("movl r1,_sgl_value_2"); /* save the value read */ ! 108: if( force_loop ) ! 109: asm("brb _mtpr_2_lp1");; /* loop on the error */ ! 110: /* ! 111: * end error loop ! 112: */ ! 113: if( (dbl_st_acc.m != dbl_expected.m) || /* verify the acc. */ ! 114: (dbl_st_acc.l != dbl_expected.l) ) { ! 115: errcnt++; /* bump the error count */ ! 116: if( prt_error ) ! 117: print_mtpr_error( ! 118: " (DBL Accumulator) -THE ACC WAS MODIFIED"); ! 119: if( halt_flg ) ! 120: mtpr_er_halt( 2 ); ! 121: if( loop_on_err ) { ! 122: force_loop = TRUE; /* set the force loop flag */ ! 123: asm("jmp _mtpr_2_lp1"); /* and loop */ ! 124: } ! 125: } /* end of compare error */ ! 126: if( ++index > max_ldf_1_index ) ! 127: index = 0; /* reset the Acc's index */ ! 128: } ! 129: } /* end of subtest 2 */ ! 130: ! 131: ! 132: ! 133: ! 134: ! 135: /************************************************************************ ! 136: * ! 137: * SUBTEST 3 - Read table data during a SINF function ! 138: * ! 139: * Read every 10th table entry while doing SINF's. ! 140: * Read the entry once, read it again during a SINF, verify that the SINF ! 141: * result is correct and that the same table data was read. ! 142: ************************************************************************/ ! 143: mtpr_3() ! 144: { ! 145: int max_index; ! 146: force_loop = FALSE; ! 147: subtest = 3; ! 148: max_index = TBL_SIZE / 10; ! 149: if( max_index > max_sinf_1_index ) /* don't go over the SIN data */ ! 150: max_index = max_sinf_1_index; /* set the max index value */ ! 151: for( index = 0; index < max_sinf_1_index; index++ ) { ! 152: sgl_value_1 = index * 10; /* get table entry to read */ ! 153: sgl_ld_acc = sinf_1_data[index].ld; /* get a sgl value */ ! 154: sgl_expected = sinf_1_data[index].exp; /* & expected acc. */ ! 155: asm("movl _sgl_value_1,r0"); /* move table address to r0 */ ! 156: asm("clrl r1"); /* clear R1 */ ! 157: asm("mtpr $0x800,$27"); /* read the table entry */ ! 158: asm("movl r1,_sgl_value_3"); /* save the value read */ ! 159: /* ! 160: * If LOOP ON ERROR is set, this is the loop for this subtest. ! 161: * The force loop flag is set after the first error. ! 162: */ ! 163: asm("_mtpr_3_lp1:"); ! 164: asm("ldf _sgl_ld_acc"); /* load the accumulator */ ! 165: asm("movl _sgl_value_1,r0"); /* move table address to r0 */ ! 166: asm("clrl r1"); /* clear R1 */ ! 167: asm("sinf"); /* start the SIN function */ ! 168: asm("mtpr $0x800,$27"); /* read the table entry */ ! 169: asm("stf _sgl_st_acc"); /* save the accumulator */ ! 170: asm("movl r1,_sgl_value_2"); /* save the value read */ ! 171: if( force_loop ) ! 172: asm("brb _mtpr_3_lp1");; /* loop on the error */ ! 173: /* ! 174: * end error loop ! 175: */ ! 176: if( sgl_value_2 != sgl_value_3 ) { /* verify the data read */ ! 177: errcnt++; /* bump the error count */ ! 178: if( prt_error ) ! 179: print_mtpr_error( bad_tbl_entry_msg ); ! 180: if( halt_flg ) ! 181: mtpr_er_halt( 1 ); ! 182: if( loop_on_err ) { ! 183: force_loop = TRUE; /* set the force loop flag */ ! 184: asm("jmp _mtpr_3_lp1"); /* and loop */ ! 185: } ! 186: } /* end of table data compare error */ ! 187: if( sgl_st_acc != sgl_expected ) { /* verify the accumulator */ ! 188: errcnt++; /* bump the error count */ ! 189: if( prt_error ) ! 190: print_mtpr_error(" -BAD FINAL ACC"); ! 191: if( halt_flg ) ! 192: mtpr_er_halt( 3 ); ! 193: if( loop_on_err ) { ! 194: force_loop = TRUE; /* set the force loop flag */ ! 195: asm("jmp _mtpr_3_lp1"); /* and loop */ ! 196: } ! 197: } /* end of SINF compare error */ ! 198: if( ++index > max_sinf_1_index ) ! 199: index = 0; /* reset the Acc's index */ ! 200: } ! 201: } /* end of subtest 3 */ ! 202: ! 203: ! 204: ! 205: /****************************************************************************** ! 206: * ! 207: * Print an error message of the form: ! 208: * ! 209: * cycle: xx MTPR test xx, subtest xx <your message here> ! 210: * table index = xxxxxxxx, table entry read = xxxxxxxx (2nd read) ! 211: * expected entry = xxxxxxxx (1st read) ! 212: * or ! 213: * cycle: xx MTPR test xx, subtest xx <your message here> ! 214: * table index = xxxxxxxx, table entry = xxxxxxxx ! 215: * initial Acc = xxxxxxxx xxxxxxxx, final Acc = xxxxxxxx xxxxxxxx ! 216: * expected Acc = xxxxxxxx xxxxxxxx ! 217: ******************************************************************************/ ! 218: print_mtpr_error( msg ) ! 219: char *msg; ! 220: { ! 221: writes(" \n"); /* start a new print line */ ! 222: writes("cycle: "); ! 223: writed( cycle ); ! 224: writes(" MTPR test "); ! 225: writed( test_no ); ! 226: writes( msg ); ! 227: writes("\ntable index = "); ! 228: write32h( sgl_value_1 ); ! 229: if( msg == bad_tbl_entry_msg ) { /* bad data read? */ ! 230: writes(", table entry = "); ! 231: write32h( sgl_value_2 ); ! 232: writes(" (2nd read)\n"); ! 233: writes(" entry expected = "); ! 234: write32h( sgl_value_3 ); ! 235: writes(" (1st read)\n"); ! 236: } else { /* bad accumulator error */ ! 237: writes(", table entry = "); ! 238: write32h( sgl_value_2 ); ! 239: writes("\ninitial Acc = "); ! 240: if( subtest == 2 ) { /* DBL precision? */ ! 241: write32h( dbl_ld_acc.m ); ! 242: writec(' '); ! 243: write32h( dbl_ld_acc.l ); ! 244: writes(", final Acc = "); ! 245: write32h( dbl_st_acc.m ); ! 246: writec(' '); ! 247: write32h( dbl_st_acc.l ); ! 248: writes("\n expected Acc = "); ! 249: write32h( dbl_expected.m ); ! 250: writec(' '); ! 251: write32h( dbl_expected.l ); ! 252: } else { /* SGL precision */ ! 253: write32h( sgl_ld_acc ); ! 254: writes(", final Acc = "); ! 255: write32h( sgl_st_acc ); ! 256: writes("\n expected Acc = "); ! 257: write32h( sgl_expected ); ! 258: } ! 259: writec('\n'); ! 260: } ! 261: } ! 262: ! 263: ! 264: ! 265: ! 266: /****************************************************************************** ! 267: * ! 268: * halt with the failure information in registers ! 269: * ! 270: ******************************************************************************/ ! 271: mtpr_er_halt( code ) ! 272: int code; /* error code to halt with */ ! 273: { ! 274: sgl_dummy1 = code; /* get the halt code */ ! 275: if( subtest != 2 ) { /* check for DBL accumulator */ ! 276: dbl_ld_acc.m = sgl_ld_acc; /* get the init Acc */ ! 277: dbl_ld_acc.l = 0; ! 278: dbl_st_acc.m = sgl_st_acc; /* get the final Acc */ ! 279: dbl_st_acc.l = 0; ! 280: dbl_expected.m = sgl_expected; /* get the expected Acc */ ! 281: dbl_expected.l = 0; ! 282: } ! 283: asm("movl _test_no,r0"); /* r0 = test number */ ! 284: asm("movl _subtest,r1"); /* r1 = subtest # */ ! 285: asm("movl _sgl_dummy1,r2"); /* r2 = error code */ ! 286: asm("movl _cycle,r3"); /* r3 = cycle count */ ! 287: if( code == 2 ) { /* corrupted Acc */ ! 288: asm("movl _dbl_ld_acc,r4"); /* r4 = MS initial Acc */ ! 289: asm("movl _dbl_ld_acc+4,r5"); /* r5 = LS initial Acc */ ! 290: asm("movl _dbl_st_acc,r6"); /* r6 = MS final Acc */ ! 291: asm("movl _dbl_st_acc+4,r7"); /* r7 = LS final Acc */ ! 292: asm("movl _dbl_expected,r8"); /* r8 = MS expected */ ! 293: asm("movl _dbl_expected+4,r9"); /* r9 = LS expected */ ! 294: asm("movl _sgl_value_1,r10"); /* r10 = table addr. */ ! 295: asm("movl _sgl_value_2,r11");; /* r11 = entry read */ ! 296: } else { /* wrong data read or wrong final Acc */ ! 297: asm("movl _sgl_value_1,r4"); /* r4 = table addr. */ ! 298: asm("movl _sgl_value_2,r5"); /* r5 = entry read */ ! 299: asm("movl _sgl_value_3,r6"); /* r6 = expected entry */ ! 300: asm("movl _sgl_ld_acc,r7"); /* r7 = initial Acc */ ! 301: asm("movl _sgl_st_acc,r8"); /* r8 = final Acc */ ! 302: asm("movl _sgl_expected,r9");; /* r9 = sgl expected */ ! 303: }; ! 304: asm("halt");; /* HALT ... */ ! 305: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.