1 //Original:/proj/frio/dv/testcases/core/c_interr_timer_tscale/c_interr_timer_tscale.dsp 2 // Spec Reference: interrupt on HW TIMER tscale 3 # mach: bfin 4 # sim: --environment operating 5 6 #include "test.h" 7 .include "testutils.inc" 8 start 9 10 // 11 // Include Files 12 // 13 14 include(std.inc) 15 include(selfcheck.inc) 16 17 // Defines 18 19 #ifndef TCNTL 20 #define TCNTL 0xFFE03000 21 #endif 22 #ifndef TPERIOD 23 #define TPERIOD 0xFFE03004 24 #endif 25 #ifndef TSCALE 26 #define TSCALE 0xFFE03008 27 #endif 28 #ifndef TCOUNT 29 #define TCOUNT 0xFFE0300c 30 #endif 31 #ifndef EVT 32 #define EVT 0xFFE02000 33 #endif 34 #ifndef EVT15 35 #define EVT15 0xFFE0203c 36 #endif 37 #ifndef EVT_OVERRIDE 38 #define EVT_OVERRIDE 0xFFE02100 39 #endif 40 #ifndef ITABLE 41 #define ITABLE 0x000FF000 42 #endif 43 #ifndef PROGRAM_STACK 44 #define PROGRAM_STACK 0x000FF100 45 #endif 46 #ifndef STACKSIZE 47 #define STACKSIZE 0x00000300 48 #endif 49 50 // Boot code 51 52 BOOT : 53 INIT_R_REGS(0); // Initialize Dregs 54 INIT_P_REGS(0); // Initialize Pregs 55 56 // CHECK_INIT(p5, 0x00BFFFFC); 57 // CHECK_INIT(p5, 0xE0000000); 58 include(symtable.inc) 59 CHECK_INIT_DEF(p5); 60 61 62 LD32(sp, 0x000FF200); 63 LD32(p0, EVT); // Setup Event Vectors and Handlers 64 65 LD32_LABEL(r0, EHANDLE); // Emulation Handler (Int0) 66 [ P0 ++ ] = R0; 67 68 LD32_LABEL(r0, RHANDLE); // Reset Handler (Int1) 69 [ P0 ++ ] = R0; 70 71 LD32_LABEL(r0, NHANDLE); // NMI Handler (Int2) 72 [ P0 ++ ] = R0; 73 74 LD32_LABEL(r0, XHANDLE); // Exception Handler (Int3) 75 [ P0 ++ ] = R0; 76 77 [ P0 ++ ] = R0; // IVT4 not used 78 79 LD32_LABEL(r0, HWHANDLE); // HW Error Handler (Int5) 80 [ P0 ++ ] = R0; 81 82 LD32_LABEL(r0, THANDLE); // Timer Handler (Int6) 83 [ P0 ++ ] = R0; 84 85 LD32_LABEL(r0, I7HANDLE); // IVG7 Handler 86 [ P0 ++ ] = R0; 87 88 LD32_LABEL(r0, I8HANDLE); // IVG8 Handler 89 [ P0 ++ ] = R0; 90 91 LD32_LABEL(r0, I9HANDLE); // IVG9 Handler 92 [ P0 ++ ] = R0; 93 94 LD32_LABEL(r0, I10HANDLE); // IVG10 Handler 95 [ P0 ++ ] = R0; 96 97 LD32_LABEL(r0, I11HANDLE); // IVG11 Handler 98 [ P0 ++ ] = R0; 99 100 LD32_LABEL(r0, I12HANDLE); // IVG12 Handler 101 [ P0 ++ ] = R0; 102 103 LD32_LABEL(r0, I13HANDLE); // IVG13 Handler 104 [ P0 ++ ] = R0; 105 106 LD32_LABEL(r0, I14HANDLE); // IVG14 Handler 107 [ P0 ++ ] = R0; 108 109 LD32_LABEL(r0, I15HANDLE); // IVG15 Handler 110 [ P0 ++ ] = R0; 111 112 LD32(p0, EVT_OVERRIDE); 113 R0 = 0; 114 [ P0 ++ ] = R0; 115 R0 = -1; // Change this to mask interrupts (*) 116 [ P0 ] = R0; // IMASK 117 118 LD32_LABEL(p1, START); 119 120 LD32(p0, EVT15); 121 [ P0 ] = P1; // IVG15 (General) handler (Int 15) load with start 122 CSYNC; 123 RAISE 15; // after we RTI, INT 15 should be taken 124 125 LD32_LABEL(r7, START); 126 RETI = r7; 127 NOP; // Workaround for Bug 217 128 RTI; 129 NOP; 130 NOP; 131 132 //.code 0x200 133 START : 134 R7 = 0x0; 135 R6 = 0x1; 136 [ -- SP ] = RETI; // Enable Nested Interrupts 137 138 WR_MMR(TCNTL, 0x00000001, p0, r0); // Turn ON TMPWR (active state) 139 WR_MMR(TPERIOD, 0x00000010, p0, r0); 140 WR_MMR(TCOUNT, 0x00000002, p0, r0); 141 WR_MMR(TSCALE, 0x00000001, p0, r0); 142 CSYNC; 143 // Read the contents of the Timer 144 RD_MMR(TPERIOD, p0, r2); 145 CHECKREG(r2, 0x00000010); 146 147 RD_MMR(TCOUNT, p0, r3); 148 CHECKREG(r3, 0x00000002);// fsim -ro useChecker=regtrace -seed 8b8db910 149 150 151 WR_MMR(TCNTL, 0x00000003, p0, r0); // enable Timer (TMPWR, TMREN) 152 CSYNC; 153 154 RD_MMR(TCOUNT, p0, r4); 155 CHECKREG(r4, 0x00000000); 156 157 RD_MMR(TCNTL, p0, r5); 158 CHECKREG(r5, 0x0000000B); 159 160 WR_MMR(TCNTL, 0x00000000, p0, r0); // Turn OFF Timer 161 CSYNC; 162 CHECKREG(r7, 0x00000001); 163 R7 = 0; 164 NOP; 165 WR_MMR(TCNTL, 0x00000001, p0, r0); // Turn ON Timer Power 166 WR_MMR(TPERIOD, 0x00000010, p0, r0); 167 WR_MMR(TCOUNT, 0x00000003, p0, r0); 168 WR_MMR(TSCALE, 0x00000128, p0, r0); 169 WR_MMR(TCNTL, 0x00000003, p0, r0); // Turn ON Timer 170 CSYNC; 171 NOP; 172 NOP; 173 label5: R5.H = 0x7777; 174 R5.L = 0x7888; 175 JUMP.S label6; 176 R5.L = 0x1111; // Will be killed 177 R5.H = 0x1111; // Will be killed 178 NOP; 179 label4: R4.H = 0x5555; 180 R4.L = 0x6666; 181 NOP; 182 JUMP.S label5; 183 R5.L = 0x2222; // Will be killed 184 R5.H = 0x2222; // Will be killed 185 NOP; 186 label6: R3.H = 0x7999; 187 R3.L = 0x7aaa; 188 NOP; 189 // With auto reload 190 // Read the contents of the Timer 191 192 RD_MMR(TPERIOD, p0, r2); 193 CHECKREG(r2, 0x00000010); 194 195 RD_MMR(TCNTL , p0, r3); 196 CHECKREG(r3, 0x0000000b); 197 198 CHECKREG(r7, 0x00000001); 199 200 WR_MMR(TCNTL, 0x00000000, p0, r0); // Turn ON Timer auto-reload 201 WR_MMR(TPERIOD, 0x00000020, p0, r0); 202 WR_MMR(TSCALE, 0x00000003, p0, r0); 203 WR_MMR(TCNTL, 0x00000007, p0, r0); // Turn ON Timer auto-reload 204 205 NOP; NOP; 206 R7 = 0; 207 CSYNC; 208 209 NOP; NOP; NOP; NOP; NOP; NOP; 210 NOP; NOP; NOP; NOP; NOP; NOP; 211 NOP; NOP; NOP; NOP; NOP; NOP; 212 NOP; NOP; NOP; NOP; NOP; NOP; 213 NOP; NOP; NOP; NOP; NOP; NOP; 214 NOP; NOP; NOP; NOP; NOP; NOP; 215 NOP; NOP; NOP; NOP; NOP; NOP; 216 NOP; NOP; NOP; NOP; NOP; NOP; 217 NOP; NOP; NOP; NOP; NOP; NOP; 218 NOP; NOP; NOP; NOP; NOP; NOP; 219 NOP; NOP; NOP; NOP; NOP; NOP; 220 NOP; NOP; NOP; NOP; NOP; NOP; 221 NOP; NOP; NOP; NOP; NOP; NOP; 222 NOP; NOP; NOP; NOP; NOP; NOP; 223 NOP; NOP; NOP; NOP; NOP; NOP; 224 R1 = 1; 225 R2 = 1; 226 R3 = 2; 227 RD_MMR(TCNTL, p0, r5); 228 CHECKREG(r5, 0x0000000F); 229 CC = R1 < R7; 230 IF CC R2 = R3; 231 232 CHECKREG(r2, 0x00000002); 233 234 WR_MMR(TCNTL, 0x00000000, p0, r0); // Turn OFF Timer 235 CSYNC; 236 NOP; NOP; NOP; 237 238 239 240 241 242 dbg_pass; // Call Endtest Macro 243 244 245 246 //********************************************************************* 247 // 248 // Handlers for Events 249 // 250 251 EHANDLE: // Emulation Handler 0 252 RTE; 253 254 RHANDLE: // Reset Handler 1 255 RTI; 256 257 NHANDLE: // NMI Handler 2 258 RTN; 259 260 XHANDLE: // Exception Handler 3 261 RTX; 262 263 HWHANDLE: // HW Error Handler 5 264 RTI; 265 266 THANDLE: // Timer Handler 6 267 R7 = R7 + R6; 268 RTI; 269 270 I7HANDLE: // IVG 7 Handler 271 RTI; 272 273 I8HANDLE: // IVG 8 Handler 274 RTI; 275 276 I9HANDLE: // IVG 9 Handler 277 RTI; 278 279 I10HANDLE: // IVG 10 Handler 280 RTI; 281 282 I11HANDLE: // IVG 11 Handler 283 RTI; 284 285 I12HANDLE: // IVG 12 Handler 286 RTI; 287 288 I13HANDLE: // IVG 13 Handler 289 RTI; 290 291 I14HANDLE: // IVG 14 Handler 292 RTI; 293 294 I15HANDLE: // IVG 15 Handler 295 R5 = RETI; 296 P0 = R5; 297 JUMP ( P0 ); 298 RTI; 299 300 .section MEM_DATA_ADDR_1,"aw" 301 302 .space (STACKSIZE); 303 STACK: 304 NOP;NOP;NOP;NOP;NOP;NOP;NOP; // needed for icache bug 305