|
|
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.