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