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