1 //Original:/proj/frio/dv/testcases/seq/se_excpt_ifprotviol/se_excpt_ifprotviol.dsp
2 // Description: EXCPT instruction and IF Prot Viol priority
4 # sim: --environment operating
7 .include "testutils.inc"
11 include(selfcheck.inc)
17 #define STACKSIZE 0x100 // change for how much stack you need
20 #define ITABLE 0xF0000000
23 GEN_INT_INIT(ITABLE) // set location for interrupt table
26 // Reset/Bootstrap Code
27 // (Here we should set the processor operating modes, initialize registers,
32 INIT_R_REGS(0); // initialize general purpose regs
34 INIT_P_REGS(0); // initialize the pointers
36 INIT_I_REGS(0); // initialize the dsp address regs
41 CLI R1; // inhibit events during MMR writes
43 LD32_LABEL(sp, USTACK); // setup the user stack pointer
46 LD32_LABEL(sp, KSTACK); // setup the kernel stack pointer
47 FP = SP; // and frame pointer
49 LD32(p0, EVT0); // Setup Event Vectors and Handlers
51 P0 += 4; // EVT0 not used (Emulation)
53 P0 += 4; // EVT1 not used (Reset)
55 LD32_LABEL(r0, NHANDLE); // NMI Handler (Int2)
58 LD32_LABEL(r0, XHANDLE); // Exception Handler (Int3)
61 P0 += 4; // EVT4 not used (Global Interrupt Enable)
63 LD32_LABEL(r0, HWHANDLE); // HW Error Handler (Int5)
66 LD32_LABEL(r0, THANDLE); // Timer Handler (Int6)
69 LD32_LABEL(r0, I7HANDLE); // IVG7 Handler
72 LD32_LABEL(r0, I8HANDLE); // IVG8 Handler
75 LD32_LABEL(r0, I9HANDLE); // IVG9 Handler
78 LD32_LABEL(r0, I10HANDLE);// IVG10 Handler
81 LD32_LABEL(r0, I11HANDLE);// IVG11 Handler
84 LD32_LABEL(r0, I12HANDLE);// IVG12 Handler
87 LD32_LABEL(r0, I13HANDLE);// IVG13 Handler
90 LD32_LABEL(r0, I14HANDLE);// IVG14 Handler
93 LD32_LABEL(r0, I15HANDLE);// IVG15 Handler
96 LD32(p0, EVT_OVERRIDE);
100 R1 = -1; // Change this to mask interrupts (*)
101 CSYNC; // wait for MMR writes to finish
102 STI R1; // sync and reenable events (implicit write to IMASK)
108 LT0 = r0; // set loop counters to something deterministic
115 ASTAT = r0; // reset other internal regs
117 RETS = r0; // prevent X's breaking LINK instruction
119 RETI = r0; // prevent Xs later on
125 // The following code sets up the test for running in USER mode
127 LD32_LABEL(r0, STARTUSER);// One gets to user mode by doing a
128 // ReturnFromInterrupt (RTI)
129 RETI = r0; // We need to load the return address
131 // Comment the following line for a USER Mode test
133 // JUMP STARTSUP; // jump to code start for SUPERVISOR mode
138 LD32_LABEL(p1, BEGIN);
142 CLI R1; // inhibit events during write to MMR
143 [ P0 ] = P1; // IVG15 (General) handler (Int 15) load with start
144 CSYNC; // wait for it
145 STI R1; // reenable events with proper imask
147 RAISE 15; // after we RTI, INT 15 should be taken
157 LD32_LABEL(sp, USTACK); // setup the user stack pointer
159 LINK 0; // change for how much stack frame space you need.
163 //*********************************************************************
167 // COMMENT the following line for USER MODE tests
168 // [--sp] = RETI; // enable interrupts in supervisor mode
174 EXCPT 2; // the RAISE should not prevent the EXCPT from being taken
177 CHECK_INIT_DEF(p0); //CHECK_INIT(p0, 0xFF7FFFFC);
179 CHECKREG(r5, 2); // check the flag
182 dbg_pass; // End the test
184 //*********************************************************************
187 // Handlers for Events
190 NHANDLE: // NMI Handler 2
193 XHANDLE: // Exception Handler 3
195 [ -- SP ] = ASTAT; // save what we damage
196 [ -- SP ] = ( R7:6 );
199 R7 >>= 26; // only want EXCAUSE
200 R6 = 0x02; // EXCAUSE 0x02 means EXCPT 2 instruction
204 R6 = 0x2E; // EXCAUSE 0x2E means Illegal Use Supervisor Resource
206 IF CC JUMP IFPROTVIOL;
208 JUMP.S OUT; // if the EXCAUSE is wrong the test will infinite loop
211 R5 = 1; // Set a Flag
215 R7 = RETX; // Fix up return address
217 R7 += 2; // skip offending 16 bit instruction
219 RETX = r7; // and put back in RETX
221 R5 <<= 1; // Alter Global Flag
224 ( R7:6 ) = [ SP ++ ];
228 HWHANDLE: // HW Error Handler 5
231 THANDLE: // Timer Handler 6
234 I7HANDLE: // IVG 7 Handler
237 I8HANDLE: // IVG 8 Handler
240 I9HANDLE: // IVG 9 Handler
243 I10HANDLE: // IVG 10 Handler
246 I11HANDLE: // IVG 11 Handler
249 I12HANDLE: // IVG 12 Handler
252 I13HANDLE: // IVG 13 Handler
255 I14HANDLE: // IVG 14 Handler
258 I15HANDLE: // IVG 15 Handler
262 // padding for the icache
264 EXCPT 0; EXCPT 0; EXCPT 0; EXCPT 0; EXCPT 0; EXCPT 0; EXCPT 0;
274 // Stack Segments (Both Kernel and User)