|
|
1.1 root 1:
2: #include "dmp_defs.h"
3:
4:
5: /***********************************************************************
6: *
7: * Verify results after a double precision TSTD or CMPD(2) instruction
8: *
9: * The final PSL value is compared to the expected value. Also, the
10: * final accumulator and the registers are checked to make sure that
11: * they weren't modified.
12: * The "no-fpp" firmware will not clear "bad 0" double precision accumulators.
13: ***********************************************************************/
14: chk_dbl_psl()
15: {
16: if( (dbl_ld_acc.m & 0x7f800000) || /* get the exp'd Acc */
17: (no_fpp_wcs) ) {
18: sgl_value_1 = dbl_ld_acc.m;
19: sgl_value_2 = dbl_ld_acc.l;
20: } else { /* zero accumulator */
21: sgl_value_1 = 0; /* clear any bad 0's */
22: sgl_value_2 = 0;
23: } /* end of "0" accumulator */
24: exp_psl = init_psl; /* get the initial PSL */
25: exp_psl &= 0xfffffff1; /* clear the flag bits */
26: exp_psl |= PSL_DBL; /* set the DBL Acc. bit */
27: exp_psl |= PSL_C; /* set the CARRY bit */
28: if( dbl_expected.m == ZERO )
29: exp_psl |= PSL_Z; /* expect the ZERO bit set */
30: if( dbl_expected.m == NEGATIVE )
31: exp_psl |= PSL_N; /* expect the NEG bit set */
32: if( psl_val != exp_psl ) {
33: errcnt++;
34: if( prt_error )
35: prt_d_psl_e( bad_psl_msg );
36: if( halt_flg )
37: hlt_d_psl_e( 2 ); /* error code 2 */
38: if( loop_on_err )
39: force_loop = TRUE; /* set loop flag */
40: }
41: else if( no_page_faults != exp_page_faults ) {
42: errcnt++;
43: if( prt_error )
44: prt_d_psl_e( trans_flt_cnt_msg );
45: if( halt_flg )
46: hlt_d_psl_e( 3 ); /* error code 3 */
47: if( loop_on_err )
48: force_loop = TRUE; /* set loop flag */
49: }
50: else if( (dbl_st_acc.m != sgl_value_1) || /* check final Acc. */
51: (dbl_st_acc.l != sgl_value_2) ) {
52: errcnt++;
53: if( prt_error )
54: prt_d_psl_e( acc_modified_msg );
55: if( halt_flg )
56: hlt_d_psl_e( 5 ); /* error code 5 */
57: if( loop_on_err )
58: force_loop = TRUE; /* set loop flag */
59: }
60: else {
61: reg_no = 0;
62: regs_ok = TRUE;
63: while( (reg_no <= 13) && (regs_ok) ) /* check 1st 13 regs */
64: if( store_regs[ reg_no ] == exp_regs[ reg_no ] )
65: reg_no++;
66: else
67: regs_ok = FALSE;
68: if( !regs_ok )
69: {
70: errcnt++;
71: if( prt_error )
72: prt_d_psl_e( reg_modified_msg );
73: if( halt_flg )
74: hlt_d_psl_e( 4 ); /* error code 4 */
75: if( loop_on_err )
76: force_loop = TRUE; /* set loop flag */
77: }
78: }
79: }
80:
81:
82:
83: /************************************************************************
84: * PRINT AN ERROR MESSAGE OF THE FORM
85: *
86: * cycle: xx. DMP test xx. <inst>. <error message>, index = xx
87: * addressing mode: <addressing mode description>
88: * inst buf= xx xx xx xx xx xx xx xx xx xx xx -page faults on byte(s) 0, x
89: * initial Acc = xxxxxxxx xxxxxxxx, operand1 = xxxxxxxx xxxxxxxx, xx pg faults
90: * final Acc = xxxxxxxx xxxxxxxx, operand2 = xxxxxxxx xxxxxxxx, xx expected
91: * initial PSL = xxxxxxxx, final PSL = xxxxxxxx, expected PSL = xxxxxxxx
92: ************************************************************************/
93: prt_d_psl_e( message )
94: char *message;
95: {
96: prt_dmp_er_msg( message ); /* print the error header */
97: writes("initial Acc = ");
98: write32h( dbl_ld_acc.m ); /* print Acc loaded */
99: writec(' ');
100: write32h( dbl_ld_acc.l );
101: if( no_ops ) {
102: writes(", operand1 = ");
103: write32h( dbl_value_1.m ); /* write op 1 data */
104: writec(' ');
105: write32h( dbl_value_1.l );
106: }
107: writes(", ");
108: writed( no_page_faults );
109: writes(" pg faults\n");
110: writes(" final Acc = "); /* write final ACC data */
111: write32h( dbl_st_acc.m );
112: writec(' ');
113: write32h( dbl_st_acc.l );
114: if( no_ops == 2 ) {
115: writes(", operand2 = ");
116: write32h( dbl_value_2.m ); /* write op 2 data */
117: writec(' ');
118: write32h( dbl_value_2.l );
119: }
120: if( no_ops )
121: writes(", ");
122: else
123: writes(", ");
124: writed( exp_page_faults );
125: writes(" expected\n");
126: writes("\ninitial PSL = "); /* print PSL data */
127: write32h( init_psl );
128: writes(", final PSL = ");
129: write32h( psl_val );
130: writes(", expected PSL = ");
131: write32h( exp_psl );
132: writec('\n');
133: if( message == reg_modified_msg ) /* print modified register */
134: prt_reg_data(); /* print bad register */
135: }
136:
137:
138:
139: /**************************************************************************
140: * Set up the registers and halt
141: **************************************************************************/
142: hlt_d_psl_e( code )
143: int code;
144: {
145: sgl_dummy1 = code;
146: asm("movl _test_no,r0"); /* r0 = test number */
147: asm("movl _addr_code,r1"); /* r1 = addressing mode */
148: asm("movl _sgl_dummy1,r2"); /* r2 = error code */
149: asm("movl _cycle,r3"); /* r3 = cycle count */
150: sgl_dummy1 = dbl_ld_acc.m;
151: sgl_dummy2 = dbl_ld_acc.l;
152: asm("movl _sgl_dummy1,r4"); /* r4 = MS of initial Acc */
153: asm("movl _sgl_dummy2,r5"); /* r5 = LS of initial Acc */
154: if( no_ops ) {
155: sgl_dummy1 = dbl_value_1.m;
156: sgl_dummy2 = dbl_value_1.m;
157: asm("movl _sgl_dummy1,r6"); /* r6 = MS of operand 1 */
158: asm("movl _sgl_dummy2,r7"); /* r7 = LS of operand 1 */
159: } else {
160: asm("clrl r6"); /* r6, r7 = 0 for TSTD */
161: asm("clrl r7");;
162: }
163: if( no_ops == 2 ) {
164: sgl_dummy1 = dbl_value_2.m;
165: sgl_dummy2 = dbl_value_2.m;
166: asm("movl _sgl_dummy1,r8"); /* r8 = MS of operand 2 */
167: asm("movl _sgl_dummy2,r9"); /* r9 = LS of operand 2 */
168: } else {
169: asm("clrl r8"); /* r8, r9 = 0 for TSTD,CMPD */
170: asm("clrl r9");;
171: }
172: if( code == 2 ) { /* wrong PSL */
173: asm("movl _init_psl,r10"); /* r10 = initial psl */
174: asm("movl _psl_val,r11"); /* r11 = final psl */
175: asm("movl _exp_psl,r12"); /* r12 = expected psl */
176: asm("movl _index,r13"); /* r13 = data index */
177: }
178: else if( code == 3 ) { /* wrong # page faults */
179: asm("movl _no_page_faults,r10"); /* r10 = # page faults */
180: asm("movl _exp_page_faults,r11"); /* r11 = # faults expected */
181: }
182: else if( code == 5 ) { /* corrupted accumulator */
183: sgl_dummy1 = dbl_st_acc.m;
184: sgl_dummy2 = dbl_st_acc.l;
185: asm("movl _sgl_dummy1,r10"); /* r10 = MS of final Acc. */
186: asm("movl _sgl_dummy2,r11"); /* r11 = LS of final Acc. */
187: }
188: else { /* corrupted register */
189: asm("movl _reg_no,r10"); /* r10 = bad register # */
190: asm("movl _store_regs[r9],r11"); /* r11 = final (bad) value */
191: asm("movl _exp_regs[r9],r12"); /* r12 = expected value */
192: }
193: asm(".globl _hlt_dbl_psl");
194: asm("_hlt_dbl_psl:");
195: asm("halt");
196: }
197:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.