|
|
1.1 root 1: #include "fpp_defs.h"
2:
3:
4:
5: /****************************************************************************
6: * Floating Point Test RESERVED_ADDRESS FAULT Handler
7: *
8: * The only way to this code is via an RESERVED ADDRESS fault and the
9: * EVENT handler. The fault may or may not be expected.
10: *
11: * 13-Feb-85 JJM: removed the messages from here & made code prettier
12: ****************************************************************************/
13: reserved_address()
14: {
15: asm(".globl _res_addr_handler"); /* entry point */
16: asm("_res_addr_handler:");
17: asm("movl _pre_event_fp,r13"); /* set the frame pointer */
18: if( address_fault_expected )
19: {
20: asm("movl _post_event_sp,r14"); /* point SP to stack data */
21: asm("movl (sp)+,_pop_val_1"); /* pop the PC of the instr. */
22: asm("movl (sp)+,_pop_val_2"); /* pop the pushed PSL */
23: asm("movl _pre_event_sp,r14"); /* restore stack_pointer */
24: /*
25: * check the data on the stack
26: */
27: if( (pop_val_1 != exp_pc) || /* expected PC ? */
28: (pop_val_2 != exp_psl) ) /* expected PSL ? */
29: {
30: errcnt++; /* bump the error count */
31: if( prt_error )
32: {
33: writes("\ncyle: ");
34: writed( cycle );
35: writes(" FPP - ");
36: writeh( test_no );
37: writes(" - invalid stack after Reserved Addr fault");
38: writes("\n addressing mode = ");
39: writes( addressing_modes[addr_mode] );
40: writes("\n stack PC = ");
41: write32h( pop_val_1 );
42: writes(", PSL = ");
43: write32h( pop_val_2 );
44: writes(", exp PC = ");
45: write32h( exp_pc );
46: writes(", PSL = ");
47: write32h( exp_psl );
48: }
49: if ( halt_flg ) /* if halt on error */
50: {
51: asm("movl _test_no,r0"); /* r0 = test number */
52: asm("movl $0,r1"); /* r1 = 0 (subtest number) */
53: asm("movl $1,r2"); /* r2 = error code */
54: asm("movl _cycle,r3"); /* r3 = cycle count */
55: asm("movl _pop_val_1,r4"); /* r4 = actual PC on stack */
56: asm("movl _pop_val_2,r5"); /* r5 = actual PSL on stck */
57: asm("movl _exp_pc,r6"); /* r6 = expected PC */
58: asm("movl _exp_psl,r7"); /* r7 = expected PSL */
59: asm("_resaddr_hlt_1:"); /* PC after the halt */
60: asm("halt"); /* HALT ... */
61: }
62: if( loop_on_err )
63: {
64: force_loop = TRUE; /* set the forced loop flag */
65: asm("jmp *_loop_addr"); /* and go loop */
66: }
67: } /* end of stack data error */
68: }
69: else /* the address fault was not expected */
70: {
71: errcnt++; /* increment the error count */
72: if( prt_error )
73: {
74: writes("\ncyle: ");
75: writed( cycle );
76: writes(" FPP-");
77: writeh( test_no );
78: writes(" - invalid Reserved Addr fault");
79: writes("\n addressing mode = ");
80: writes( addressing_modes[addr_mode] );
81: }
82: if ( halt_flg ) /* if halt on error */
83: {
84: asm("movl _test_no,r0"); /* r0 = test number */
85: asm("clrl r1"); /* r1 = 0 (subtest number) */
86: asm("movl $2,r2"); /* r2 = error code */
87: asm("movl _cycle,r3"); /* r3 = cycle count */
88: asm("movl _addr_mode,r4"); /* r4 = addressing mode */
89: asm(".globl _resaddr_hlt_2");
90: asm("_resaddr_hlt_2:"); /* PC after the halt */
91: asm("halt"); /* HALT ... */
92: }
93: if( loop_on_err )
94: {
95: force_loop = TRUE; /* We're going to loop */
96: asm("jmp *_loop_addr"); /* loop forever */
97: };
98: }; /* end of ELSE (unexpected fault) */
99: asm("jmp *_next_addr"); /* go to the next mode */
100: }
101:
102:
103:
104:
105:
106:
107:
108:
109: /****************************************************************************
110: * No RESERVED_ADDRESS FAULT Occurred routine
111: *
112: * The only way to this code is if an expected RESERVED ADDRESS Fault did
113: * NOT occurr.
114: ****************************************************************************/
115: no_res_address()
116: {
117: asm(".globl _no_res_addr_fault");
118: asm("_no_res_addr_fault:"); /* start of "no fault" stuff */
119: errcnt++; /* increment the error count */
120: if( prt_error )
121: {
122: writes("\ncyle: ");
123: writed( cycle );
124: writes(" FPP-");
125: writeh( test_no );
126: writes(" Expected Reserved Address fault did not occur");
127: writes("\n Addressing Mode = ");
128: writes( addressing_modes[addr_mode] );
129: }
130: if ( halt_flg ) /* if halt on error */
131: {
132: asm("movl _test_no,r0"); /* r0 = test number */
133: asm("clrl r1"); /* r1 = 0 (subtest number) */
134: asm("movl $3,r2"); /* r2 = error code */
135: asm("movl _cycle,r3"); /* r3 = cycle count */
136: asm("movl _addr_mode,r4"); /* r4 = addressing mode */
137: asm("_res_addr_hlt3:"); /* PC after the halt */
138: asm("halt"); /* HALT ... */
139: }
140: if( loop_on_err )
141: {
142: force_loop = TRUE; /* We're going to loop */
143: asm("jmp *_loop_addr"); /* loop forever */
144: } else
145: asm("jmp *_next_addr");; /* go to the next mode */
146: }
147:
148:
149:
150:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.