1//Original:/proj/frio/dv/testcases/seq/se_usermode_protviol/se_usermode_protviol.dsp
2// Description: User mode "Illegal Use Supervsor Resource" Exceptions
3# mach: bfin
4# sim: --environment operating
5
6#include "test.h"
7.include "testutils.inc"
8start
9
10//
11// Constants and Defines
12//
13
14include(gen_int.inc)
15include(selfcheck.inc)
16include(std.inc)
17include(mmrs.inc)
18include(symtable.inc)
19
20#ifndef STACKSIZE
21#define STACKSIZE 0x100   // change for how much stack you need
22#endif
23#ifndef ITABLE
24#define ITABLE 0xF0000000
25#endif
26
27GEN_INT_INIT(ITABLE) // set location for interrupt table
28
29//
30// Reset/Bootstrap Code
31//   (Here we should set the processor operating modes, initialize registers,
32//    etc.)
33//
34
35BOOT:
36INIT_R_REGS(0);     // initialize general purpose regs
37
38INIT_P_REGS(0);     // initialize the pointers
39
40INIT_I_REGS(0);     // initialize the dsp address regs
41INIT_M_REGS(0);
42INIT_L_REGS(0);
43INIT_B_REGS(0);
44
45CLI R1;           // inhibit events during MMR writes
46
47LD32_LABEL(sp, USTACK);   // setup the user stack pointer
48USP = SP;
49
50LD32_LABEL(sp, KSTACK);   // setup the kernel stack pointer
51FP = SP;        // and frame pointer
52
53LD32(p0, EVT0);      // Setup Event Vectors and Handlers
54
55    P0 += 4;            // EVT0 not used (Emulation)
56
57    P0 += 4;            // EVT1 not used (Reset)
58
59LD32_LABEL(r0, NHANDLE);  // NMI Handler (Int2)
60    [ P0 ++ ] = R0;
61
62LD32_LABEL(r0, XHANDLE);  // Exception Handler (Int3)
63    [ P0 ++ ] = R0;
64
65    P0 += 4;            // EVT4 not used (Global Interrupt Enable)
66
67LD32_LABEL(r0, HWHANDLE); // HW Error Handler (Int5)
68    [ P0 ++ ] = R0;
69
70LD32_LABEL(r0, THANDLE);  // Timer Handler (Int6)
71    [ P0 ++ ] = R0;
72
73LD32_LABEL(r0, I7HANDLE); // IVG7 Handler
74    [ P0 ++ ] = R0;
75
76LD32_LABEL(r0, I8HANDLE); // IVG8 Handler
77    [ P0 ++ ] = R0;
78
79LD32_LABEL(r0, I9HANDLE); // IVG9 Handler
80    [ P0 ++ ] = R0;
81
82LD32_LABEL(r0, I10HANDLE);// IVG10 Handler
83    [ P0 ++ ] = R0;
84
85LD32_LABEL(r0, I11HANDLE);// IVG11 Handler
86    [ P0 ++ ] = R0;
87
88LD32_LABEL(r0, I12HANDLE);// IVG12 Handler
89    [ P0 ++ ] = R0;
90
91LD32_LABEL(r0, I13HANDLE);// IVG13 Handler
92    [ P0 ++ ] = R0;
93
94LD32_LABEL(r0, I14HANDLE);// IVG14 Handler
95    [ P0 ++ ] = R0;
96
97LD32_LABEL(r0, I15HANDLE);// IVG15 Handler
98    [ P0 ++ ] = R0;
99
100LD32(p0, EVT_OVERRIDE);
101    R0 = 0;
102    [ P0 ++ ] = R0;
103
104    R1 = -1;     // Change this to mask interrupts (*)
105CSYNC;       // wait for MMR writes to finish
106STI R1;      // sync and reenable events (implicit write to IMASK)
107
108DUMMY:
109
110    R0 = 0 (Z);
111
112LT0 = r0;       // set loop counters to something deterministic
113LB0 = r0;
114LC0 = r0;
115LT1 = r0;
116LB1 = r0;
117LC1 = r0;
118
119ASTAT = r0;     // reset other internal regs
120SYSCFG = r0;
121RETS = r0;      // prevent X's breaking LINK instruction
122
123RETI = r0;      // prevent Xs later on
124RETX = r0;
125RETN = r0;
126RETE = r0;
127
128
129// The following code sets up the test for running in USER mode
130
131LD32_LABEL(r0, STARTUSER);// One gets to user mode by doing a
132                        // ReturnFromInterrupt (RTI)
133RETI = r0;      // We need to load the return address
134
135// Comment the following line for a USER Mode test
136
137//    JUMP    STARTSUP;   // jump to code start for SUPERVISOR mode
138
139RTI;
140
141STARTSUP:
142LD32_LABEL(p1, BEGIN);
143
144LD32(p0, EVT15);
145
146CLI R1;   // inhibit events during write to MMR
147    [ P0 ] = P1;  // IVG15 (General) handler (Int 15) load with start
148CSYNC;      // wait for it
149STI R1;     // reenable events with proper imask
150
151RAISE 15;       // after we RTI, INT 15 should be taken
152
153RTI;
154
155//
156// The Main Program
157//
158
159STARTUSER:
160
161LD32_LABEL(sp, USTACK);   // setup the user stack pointer
162FP = SP;
163LINK 0;     // change for how much stack frame space you need.
164
165JUMP BEGIN;
166
167//*********************************************************************
168
169BEGIN:
170
171                // COMMENT the following line for USER MODE tests
172//    [--sp] = RETI;  // enable interrupts in supervisor mode
173
174    R0 = 0;
175    R1 = -1;
176
177// the following instructions should EXCEPT
178    R6 = 0x2E;      // EXCAUSE 0x2E means Illegal Use Supervidor Resource
179
180RAISE 15;
181CLI R0;
182STI r0;
183//    TESTSET (p0);  // now allowed in user mode
184r5 += 1;
185//    IDLE;          // works in user mode
186
187USP = r1;
188SEQSTAT = r1;
189SYSCFG = r1;
190RETI = r1;
191RETX = r1;
192RETN = r1;
193RETE = r1;
194
195    R2 = USP;
196    R2 = SEQSTAT;
197    R2 = SYSCFG;
198    R2 = RETI;
199    R2 = RETX;
200    R2 = RETN;
201    R2 = RETE;
202
203    [ -- SP ] = USP;
204    [ -- SP ] = SEQSTAT;
205    [ -- SP ] = SYSCFG;
206    [ -- SP ] = RETI;
207    [ -- SP ] = RETX;
208    [ -- SP ] = RETN;
209    [ -- SP ] = RETE;
210
211SEQSTAT = [sp++];
212SYSCFG = [sp++];
213RETI = [sp++];
214RETX = [sp++];
215RETN = [sp++];
216RETE = [sp++];
217
218RTX;
219RTN;
220RTI;
221RTE;
222
223    R6 = 0x22;      // EXCAUSE 0x22 means Illegal Insn Combination
224USP = [sp++];
225
226CHECK_INIT_DEF(p0); //CHECK_INIT(p0, 0xFF7FFFFC);
227                    // Xhandler counts all EXCAUSE = 0x2B;
228CHECKREG(r5, 36); // count of all IF protection violations.
229
230END:
231dbg_pass;            // End the test
232
233//*********************************************************************
234
235//
236// Handlers for Events
237//
238
239NHANDLE:            // NMI Handler 2
240RTN;
241
242XHANDLE:            // Exception Handler 3
243    [ -- SP ] = ASTAT; // save what we damage
244    [ -- SP ] = ( R7:6 );
245    R7 = SEQSTAT;
246    R7 <<= 26;
247    R7 >>= 26;      // only want EXCAUSE
248CC = r7 == r6;
249IF CC JUMP IFETCHPROTVIOL;   // If EXCAUSE != 0x2E then leave
250
251dbg_fail;       // if the EXCAUSE is wrong the test will infinite loop
252
253IFETCHPROTVIOL:
254    R7 = RETX;      // Fix up return address
255    R7 += 2;        // skip instruction
256RETX = r7;      // and put back in RETX
257
258    R5 += 1;        // Count
259
260OUT:
261    ( R7:6 ) = [ SP ++ ];
262ASTAT = [sp++];
263RTX;
264
265HWHANDLE:           // HW Error Handler 5
266RTI;
267
268THANDLE:            // Timer Handler 6
269RTI;
270
271I7HANDLE:           // IVG 7 Handler
272RTI;
273
274I8HANDLE:           // IVG 8 Handler
275RTI;
276
277I9HANDLE:           // IVG 9 Handler
278RTI;
279
280I10HANDLE:          // IVG 10 Handler
281RTI;
282
283I11HANDLE:          // IVG 11 Handler
284RTI;
285
286I12HANDLE:          // IVG 12 Handler
287RTI;
288
289I13HANDLE:          // IVG 13 Handler
290RTI;
291
292I14HANDLE:          // IVG 14 Handler
293RTI;
294
295I15HANDLE:          // IVG 15 Handler
296RTI;
297
298
299    // padding for the icache
300
301EXCPT 0; EXCPT 0; EXCPT 0; EXCPT 0; EXCPT 0; EXCPT 0; EXCPT 0;
302
303//
304// Data Segment
305//
306
307.data
308DATA:
309    .space (0x10);
310
311// Stack Segments (Both Kernel and User)
312
313    .space (STACKSIZE);
314KSTACK:
315
316    .space (STACKSIZE);
317USTACK:
318