1# Blackfin testcase for the CEC 2# mach: bfin 3# sim: --environment operating 4 5 .include "testutils.inc" 6 7 start 8 9 INIT_R_REGS 0; 10 INIT_P_REGS 0; 11 INIT_I_REGS 0; 12 INIT_M_REGS 0; 13 INIT_L_REGS 0; 14 INIT_B_REGS 0; 15 16 CLI R1; // inhibit events during MMR writes 17 18 loadsym sp, USTACK; // setup the user stack pointer 19 usp = sp; // and frame pointer 20 21 loadsym sp, KSTACK; // setup the stack pointer 22 fp = sp; // and frame pointer 23 24 imm32 p0, 0xFFE02000; 25 loadsym r0, EHANDLE; // Emulation Handler (Int0) 26 [p0++] = r0; 27 28 loadsym r0, RHANDLE; // Reset Handler (Int1) 29 [p0++] = r0; 30 31 loadsym r0, NHANDLE; // NMI Handler (Int2) 32 [p0++] = r0; 33 34 loadsym r0, XHANDLE; // Exception Handler (Int3) 35 [p0++] = r0; 36 37 [p0++] = r0; // EVT4 not used global Interr Enable (INT4) 38 39 loadsym r0, HWHANDLE; // HW Error Handler (Int5) 40 [p0++] = r0; 41 42 loadsym r0, THANDLE; // Timer Handler (Int6) 43 [p0++] = r0; 44 45 loadsym r0, I7HANDLE; // IVG7 Handler 46 [p0++] = r0; 47 48 loadsym r0, I8HANDLE; // IVG8 Handler 49 [p0++] = r0; 50 51 loadsym r0, I9HANDLE; // IVG9 Handler 52 [p0++] = r0; 53 54 loadsym r0, I10HANDLE;// IVG10 Handler 55 [p0++] = r0; 56 57 loadsym r0, I11HANDLE;// IVG11 Handler 58 [p0++] = r0; 59 60 loadsym r0, I12HANDLE;// IVG12 Handler 61 [p0++] = r0; 62 63 loadsym r0, I13HANDLE;// IVG13 Handler 64 [p0++] = r0; 65 66 loadsym r0, I14HANDLE;// IVG14 Handler 67 [p0++] = r0; 68 69 loadsym r0, I15HANDLE;// IVG15 Handler 70 [p0++] = r0; 71 72 imm32 p0, 0xFFE02100 // EVT_OVERRIDE 73 r0 = 0; 74 [p0++] = r0; 75 76 r1 = -1; // Change this to mask interrupts (*) 77 csync; // wait for MMR writes to finish 78 sti r1; // sync and reenable events (implicit write to IMASK) 79 80 imm32 p0, 0xFFE02104; 81 r0 = [p0]; 82 // ckeck that sti allows the lower 5 bits of imask to be written 83 CHECKREG r0, 0xffff; 84 85DUMMY: 86 87 r0 = 0 (z); 88 89 LT0 = r0; // set loop counters to something deterministic 90 LB0 = r0; 91 LC0 = r0; 92 LT1 = r0; 93 LB1 = r0; 94 LC1 = r0; 95 96 ASTAT = r0; // reset other internal regs 97 SYSCFG = r0; 98 RETS = r0; // prevent X's breaking LINK instruction 99 100// The following code sets up the test for running in USER mode 101 102 loadsym r0, STARTUSER;// One gets to user mode by doing a 103 // ReturnFromInterrupt (RTI) 104 RETI = r0; // We need to load the return address 105 106// Comment the following line for a USER Mode test 107 108 JUMP STARTSUP; // jump to code start for SUPERVISOR mode 109 110 RTI; 111 112STARTSUP: 113 loadsym p1, BEGIN; 114 115 imm32 p0, (0xFFE02000 + 4 * 15); 116 117 CLI R1; // inhibit events during write to MMR 118 [p0] = p1; // IVG15 (General) handler (Int 15) load with start 119 csync; // wait for it 120 sti r1; // reenable events with proper imask 121 122 RAISE 15; // after we RTI, INT 15 should be taken 123 124 RTI; 125 126// 127// The Main Program 128// 129STARTUSER: 130 LINK 0; // change for how much stack frame space you need. 131 132 JUMP BEGIN; 133 134// ********************************************************************* 135 136BEGIN: 137 138 // COMMENT the following line for USER MODE tests 139 [--sp] = RETI; // enable interrupts in supervisor mode 140 141 // **** YOUR CODE GOES HERE **** 142// EVTx 143 // wrt-rd EVT0: 0 bits, rw=0 = 0xFFE02000 144 imm32 p0, 0xFFE02000; 145 imm32 r0, 0x00000000 146 [p0] = r0; 147 148 // wrt-rd EVT1: 32 bits, rw=0 = 0xFFE02004 149 imm32 p0, 0xFFE02004; 150 imm32 r0, 0x00000000 151 [p0] = r0; 152 153 // wrt-rd EVT2 = 0xFFE02008 154 imm32 p0, 0xFFE02008 155 imm32 r0, 0xE1DE5D1C 156 [p0] = r0; 157 158 // wrt-rd EVT3 = 0xFFE0200C 159 imm32 p0, 0xFFE0200C 160 imm32 r0, 0x9CC20332 161 [p0] = r0; 162 163 // wrt-rd EVT4 = 0xFFE02010 164 imm32 p0, 0xFFE02010 165 imm32 r0, 0x00000000 166 [p0] = r0; 167 168 // wrt-rd EVT5 = 0xFFE02014 169 imm32 p0, 0xFFE02014 170 imm32 r0, 0x55552345 171 [p0] = r0; 172 173 // wrt-rd EVT6 = 0xFFE02018 174 imm32 p0, 0xFFE02018 175 imm32 r0, 0x66663456 176 [p0] = r0; 177 178 // wrt-rd EVT7 = 0xFFE0201C 179 imm32 p0, 0xFFE0201C 180 imm32 r0, 0x77774567 181 [p0] = r0; 182 183 // wrt-rd EVT8 = 0xFFE02020 184 imm32 p0, 0xFFE02020 185 imm32 r0, 0x88885678 186 [p0] = r0; 187 188 // wrt-rd EVT9 = 0xFFE02024 189 imm32 p0, 0xFFE02024 190 imm32 r0, 0x99996789 191 [p0] = r0; 192 193 // wrt-rd EVT10 = 0xFFE02028 194 imm32 p0, 0xFFE02028 195 imm32 r0, 0xaaaa1234 196 [p0] = r0; 197 198 // wrt-rd EVT11 = 0xFFE0202C 199 imm32 p0, 0xFFE0202C 200 imm32 r0, 0xBBBBABC6 201 [p0] = r0; 202 203 // wrt-rd EVT12 = 0xFFE02030 204 imm32 p0, 0xFFE02030 205 imm32 r0, 0xCCCCABC6 206 [p0] = r0; 207 208 // wrt-rd EVT13 = 0xFFE02034 209 imm32 p0, 0xFFE02034 210 imm32 r0, 0xDDDDABC6 211 [p0] = r0; 212 213 // wrt-rd EVT14 = 0xFFE02038 214 imm32 p0, 0xFFE02038 215 imm32 r0, 0xEEEEABC6 216 [p0] = r0; 217 218 // wrt-rd EVT15 = 0xFFE0203C 219 imm32 p0, 0xFFE0203C 220 imm32 r0, 0xFFFFABC6 221 [p0] = r0; 222 223 // wrt-rd EVT_OVERRIDE:9 bits = 0xFFE02100 224 imm32 p0, 0xFFE02100 225 imm32 r0, 0x000001ff 226 [p0] = r0; 227 228 // wrt-rd IMASK: 16 bits = 0xFFE02104 229 imm32 p0, 0xFFE02104 230 imm32 r0, 0x00000fff 231 [p0] = r0; 232 233 // wrt-rd IPEND: 16 bits, rw=0 = 0xFFE02108 234 imm32 p0, 0xFFE02108 235 imm32 r0, 0x00000000 236 //[p0] = r0; 237 raise 12; 238 raise 13; 239 240 // wrt-rd ILAT: 16 bits, rw=0 = 0xFFE0210C 241 imm32 p0, 0xFFE0210C 242 imm32 r0, 0x00000000 243 //[p0] = r0; 244 csync; 245 246 // *** read ops 247 imm32 p0, 0xFFE02000 248 r0 = [p0]; 249 CHECKREG r0, 0; 250 251 imm32 p0, 0xFFE02004 252 r1 = [p0]; 253 CHECKREG r1, 0; 254 255 imm32 p0, 0xFFE02008 256 r2 = [p0]; 257 CHECKREG r2, 0xE1DE5D1C; 258 259 imm32 p0, 0xFFE0200C 260 r3 = [p0]; 261 CHECKREG r3, 0x9CC20332; 262 263 imm32 p0, 0xFFE02014 264 r4 = [p0]; 265 imm32 p0, 0xFFE02018 266 r5 = [p0]; 267 imm32 p0, 0xFFE0201C 268 r6 = [p0]; 269 imm32 p0, 0xFFE02020 /* EVT8 */ 270 r7 = [p0]; 271CHECKREG r0, 0x00000000; 272//CHECKREG(r1, 0x00000000); /// mismatch = 00 273CHECKREG r2, 0xE1DE5D1C; 274CHECKREG r3, 0x9CC20332; 275CHECKREG r4, 0x55552345; 276CHECKREG r5, 0x66663456; 277CHECKREG r6, 0x77774567; 278CHECKREG r7, 0x88885678; 279 280 imm32 p0, 0xFFE02024 /* EVT9 */ 281 r0 = [p0]; 282 imm32 p0, 0xFFE02028 /* EVT10 */ 283 r1 = [p0]; 284 imm32 p0, 0xFFE0202C /* EVT11 */ 285 r2 = [p0]; 286 imm32 p0, 0xFFE02030 /* EVT12 */ 287 r3 = [p0]; 288 imm32 p0, 0xFFE02034 /* EVT13 */ 289 r4 = [p0]; 290 imm32 p0, 0xFFE02038 /* EVT14 */ 291 r5 = [p0]; 292 imm32 p0, 0xFFE0203C /* EVT15 */ 293 r6 = [p0]; 294CHECKREG r0, 0x99996789; 295CHECKREG r1, 0xaaaa1234; 296CHECKREG r2, 0xBBBBABC6; 297CHECKREG r3, 0xCCCCABC6; 298CHECKREG r4, 0xDDDDABC6; 299CHECKREG r5, 0xEEEEABC6; 300CHECKREG r6, 0xFFFFABC6; 301 302 imm32 p0, 0xFFE02100 /* EVT_OVERRIDE */ 303 r0 = [p0]; 304 imm32 p0, 0xFFE02104 /* IMASK */ 305 r1 = [p0]; 306 imm32 p0, 0xFFE02108 /* IPEND */ 307 r2 = [p0]; 308 imm32 p0, 0xFFE0210C /* ILAT */ 309 r3 = [p0]; 310CHECKREG r0, 0x000001ff; 311CHECKREG r1, 0x00000fff; /* XXX: original had 0xfe0 ?? */ 312CHECKREG r2, 0x00008000; 313CHECKREG r3, 0x00003000; 314 315 dbg_pass; 316 317// ********************************************************************* 318 319// 320// Handlers for Events 321// 322 323EHANDLE: // Emulation Handler 0 324 RTE; 325 326RHANDLE: // Reset Handler 1 327 RTI; 328 329NHANDLE: // NMI Handler 2 330 r0 = 2; 331 RTN; 332 333XHANDLE: // Exception Handler 3 334 335 RTX; 336 337HWHANDLE: // HW Error Handler 5 338 r2 = 5; 339 RTI; 340 341THANDLE: // Timer Handler 6 342 r3 = 6; 343 RTI; 344 345I7HANDLE: // IVG 7 Handler 346 r4 = 7; 347 RTI; 348 349I8HANDLE: // IVG 8 Handler 350 r5 = 8; 351 RTI; 352 353I9HANDLE: // IVG 9 Handler 354 r6 = 9; 355 RTI; 356 357I10HANDLE: // IVG 10 Handler 358 r7 = 10; 359 RTI; 360 361I11HANDLE: // IVG 11 Handler 362 r0 = 11; 363 RTI; 364 365I12HANDLE: // IVG 12 Handler 366 r1 = 12; 367 RTI; 368 369I13HANDLE: // IVG 13 Handler 370 r2 = 13; 371 RTI; 372 373I14HANDLE: // IVG 14 Handler 374 r3 = 14; 375 RTI; 376 377I15HANDLE: // IVG 15 Handler 378 r4 = 15; 379 RTI; 380 381 nop;nop;nop;nop;nop;nop;nop; // needed for icache bug 382 383// 384// Data Segment 385// 386 387.data 388// Stack Segments (Both Kernel and User) 389 390.rep 0x10 391.byte 0 392.endr 393KSTACK: 394 395.rep 0x10 396.byte 0 397.endr 398USTACK: 399