tizen 2.4 release
[external/binutils.git] / sim / testsuite / sim / bfin / c_interr_timer.S
1 //Original:/proj/frio/dv/testcases/core/c_interr_timer/c_interr_timer.dsp
2 // Spec Reference: interrupt on HW TIMER
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,   0xE0000000);
57 include(symtable.inc)
58 CHECK_INIT_DEF(p5);
59
60
61 LD32(sp, 0x000FF200);
62 LD32(p0, EVT);              // Setup Event Vectors and Handlers
63
64 LD32_LABEL(r0, EHANDLE);    // Emulation Handler (Int0)
65         [ P0 ++ ] = R0;
66
67 LD32_LABEL(r0, RHANDLE);    // Reset Handler (Int1)
68         [ P0 ++ ] = R0;
69
70 LD32_LABEL(r0, NHANDLE);    // NMI Handler (Int2)
71         [ P0 ++ ] = R0;
72
73 LD32_LABEL(r0, XHANDLE);    // Exception Handler (Int3)
74         [ P0 ++ ] = R0;
75
76         [ P0 ++ ] = R0;                // IVT4 not used
77
78 LD32_LABEL(r0, HWHANDLE);   // HW Error Handler (Int5)
79         [ P0 ++ ] = R0;
80
81 LD32_LABEL(r0, THANDLE);    // Timer Handler (Int6)
82         [ P0 ++ ] = R0;
83
84 LD32_LABEL(r0, I7HANDLE);   // IVG7 Handler
85         [ P0 ++ ] = R0;
86
87 LD32_LABEL(r0, I8HANDLE);   // IVG8 Handler
88         [ P0 ++ ] = R0;
89
90 LD32_LABEL(r0, I9HANDLE);   // IVG9 Handler
91         [ P0 ++ ] = R0;
92
93 LD32_LABEL(r0, I10HANDLE);  // IVG10 Handler
94         [ P0 ++ ] = R0;
95
96 LD32_LABEL(r0, I11HANDLE);  // IVG11 Handler
97         [ P0 ++ ] = R0;
98
99 LD32_LABEL(r0, I12HANDLE);  // IVG12 Handler
100         [ P0 ++ ] = R0;
101
102 LD32_LABEL(r0, I13HANDLE);  // IVG13 Handler
103         [ P0 ++ ] = R0;
104
105 LD32_LABEL(r0, I14HANDLE);  // IVG14 Handler
106         [ P0 ++ ] = R0;
107
108 LD32_LABEL(r0, I15HANDLE);  // IVG15 Handler
109         [ P0 ++ ] = R0;
110
111 LD32(p0, EVT_OVERRIDE);
112         R0 = 0;
113         [ P0 ++ ] = R0;
114         R0 = -1;     // Change this to mask interrupts (*)
115         [ P0 ] = R0;   // IMASK
116
117 LD32_LABEL(p1, START);
118
119 LD32(p0, EVT15);
120         [ P0 ] = P1;   // IVG15 (General) handler (Int 15) load with start
121 CSYNC;
122 RAISE 15;    // after we RTI, INT 15 should be taken
123
124 LD32_LABEL(r7, START);
125 RETI = r7;
126 NOP;        // Workaround for Bug 217
127 RTI;
128 NOP;
129 NOP;
130 NOP;
131 NOP;
132 NOP;
133 NOP;
134 NOP;
135 NOP;
136 DUMMY:
137           NOP;
138 NOP;
139 NOP;
140 NOP;
141 NOP;
142 NOP;
143 NOP;
144 NOP;
145 NOP;
146 NOP;
147
148 //.code 0x200
149  START :
150         R7 = 0x0;
151         R6 = 0x1;
152         [ -- SP ] = RETI;        // Enable Nested Interrupts
153
154 WR_MMR(TCNTL,   0x00000001, p0, r0);        // Turn ON TMPWR(0) (active state)
155 WR_MMR(TPERIOD, 0x00000050, p0, r0);
156     //  WR_MMR(TCOUNT,  0x00000013, p0, r0);
157 WR_MMR(TCOUNT,  0x00000000, p0, r0);
158 WR_MMR(TSCALE,  0x00000000, p0, r0);
159 CSYNC;
160         // Read the contents of the Timer
161
162 RD_MMR(TPERIOD, p0, r2);
163 CHECKREG(r2,    0x00000050);
164
165
166 WR_MMR(TCNTL,   0x00000003, p0, r0);    // enable Timer (TMPWR(0), TMREN(1))
167 CSYNC;                                  // TIMER interrupt
168
169 RD_MMR(TCOUNT, p0, r3);
170 CSYNC;
171 CHECKREG(r3,    0x00000000);
172 CHECKREG(r7,    0x00000001);
173 WR_MMR(TCNTL,   0x00000001, p0, r0);    // enable Timer (TMPWR(0), TMREN(1)=0)
174 WR_MMR(TCOUNT,  0x00000013, p0, r0);
175 WR_MMR(TCNTL,   0x00000003, p0, r0);    // enable Timer (TMPWR(0), TMREN(1))
176 CSYNC;
177 NOP; NOP; NOP;
178 NOP; NOP; NOP;
179 NOP; NOP; NOP;
180 NOP; NOP; NOP;
181 NOP; NOP; NOP;
182 NOP; NOP; NOP;
183 NOP; NOP; NOP;
184 NOP; NOP; NOP;
185 RD_MMR(TCOUNT, p0, r4);
186 CHECKREG(r4,    0x00000000);
187
188 RD_MMR(TCNTL, p0, r5);
189 CHECKREG(r5,    0x0000000B);
190
191 WR_MMR(TCNTL,   0x00000000, p0, r0);        // Turn OFF Timer
192 CSYNC;
193 NOP;
194 WR_MMR(TCNTL,   0x00000001, p0, r0);        // Turn ON Timer Power
195 WR_MMR(TCNTL,   0x00000003, p0, r0);        // Turn ON Power, EN -> interr
196 CSYNC;
197 CHECKREG(r7,    0x00000003);              // 3 interr already happened
198         R7 = 0;                                     // reset r7
199 WR_MMR(TPERIOD, 0x00000040, p0, r0);
200 WR_MMR(TCOUNT,  0x00000013, p0, r0);
201 WR_MMR(TSCALE,  0x00000002, p0, r0);
202 WR_MMR(TCNTL,   0x00000007, p0, r0);        // Turn ON Timer auto load
203 CSYNC;
204 NOP;
205 NOP;
206 NOP;
207 NOP;
208 NOP;
209 NOP;
210 NOP;
211 NOP;
212 NOP;
213 NOP;
214 NOP;
215 NOP;
216 NOP;
217 NOP;
218 NOP;
219 JUMP.S label4;
220         R4.L = 0x1111;                             // Will be killed
221         R4.H = 0x1111;                             // Will be killed
222 NOP;
223 NOP;
224 NOP;
225 label5: R5.H = 0x7777;
226         R5.L = 0x7888;
227 JUMP.S label6;
228         R5.L = 0x1111;                             // Will be killed
229         R5.H = 0x1111;                             // Will be killed
230 NOP;
231 NOP;
232 NOP;
233 NOP;
234 NOP;
235 NOP;
236 label4: R4.H = 0x5555;
237         R4.L = 0x6666;
238 NOP;
239 JUMP.S label5;
240         R5.L = 0x2222;     // Will be killed
241         R5.H = 0x2222;     // Will be killed
242 NOP;
243 NOP;
244 NOP;
245 NOP;
246 label6: R3.H = 0x7999;
247         R3.L = 0x7aaa;
248 NOP;
249 NOP;
250 NOP;
251 NOP;
252 NOP;
253 NOP;
254 NOP;
255                                                     // With auto reload
256         // Read the contents of the Timer
257
258 RD_MMR(TPERIOD, p0, r2);
259 CHECKREG(r2,    0x00000040);
260
261 //      CHECKREG(r7,    0x00000002);
262 CC = R7 == 0;
263 IF !CC JUMP LABEL1;
264 WR_MMR(TPERIOD, 0x00000030, p0, r0);   // SHOULD NOT EXECUTE
265
266 LABEL1:
267
268 NOP; NOP; NOP; NOP; NOP;
269 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
270 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
271 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
272 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
273 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
274
275
276 RD_MMR(TCNTL , p0, r3);
277 CHECKREG(r3,    0x0000000F);
278
279
280 WR_MMR(TCNTL,   0x00000003, p0, r0);        // Turn ON Timer
281 CSYNC;
282 RD_MMR(TPERIOD, p0, r2);
283 CHECKREG(r2,    0x00000040);
284
285
286 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
287 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
288 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
289 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
290 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
291 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
292 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
293 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
294 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
295 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
296 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
297 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
298 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
299 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
300 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
301 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
302 NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP; NOP;
303 RD_MMR(TCOUNT, p0, r4);
304 CHECKREG(r4,    0x00000000);
305
306 RD_MMR(TCNTL, p0, r5);
307 CHECKREG(r5,    0x0000000B);
308
309 WR_MMR(TCNTL,   0x00000000, p0, r0);        // Turn OFF Timer
310 CSYNC;
311 NOP; NOP; NOP;
312
313 WR_MMR(TPERIOD, 0x00000060, p0, r0);
314 CSYNC;
315 NOP;
316 RD_MMR(TPERIOD, p0, r6);
317 CHECKREG(r6,    0x00000060);
318
319
320
321
322 dbg_pass;        // Call Endtest Macro
323
324
325
326 //*********************************************************************
327 //
328 // Handlers for Events
329 //
330
331 EHANDLE:            // Emulation Handler 0
332 RTE;
333
334 RHANDLE:            // Reset Handler 1
335 RTI;
336
337 NHANDLE:            // NMI Handler 2
338 RTN;
339
340 XHANDLE:            // Exception Handler 3
341 RTX;
342
343 HWHANDLE:           // HW Error Handler 5
344 RTI;
345
346 THANDLE:            // Timer Handler 6
347         R7 = R7 + R6;
348 RTI;
349
350 I7HANDLE:           // IVG 7 Handler
351 RTI;
352
353 I8HANDLE:           // IVG 8 Handler
354 RTI;
355
356 I9HANDLE:           // IVG 9 Handler
357 RTI;
358
359 I10HANDLE:          // IVG 10 Handler
360 RTI;
361
362 I11HANDLE:          // IVG 11 Handler
363 RTI;
364
365 I12HANDLE:          // IVG 12 Handler
366 RTI;
367
368 I13HANDLE:          // IVG 13 Handler
369 RTI;
370
371 I14HANDLE:          // IVG 14 Handler
372 RTI;
373
374 I15HANDLE:          // IVG 15 Handler
375         R5 = RETI;
376         P0 = R5;
377 JUMP ( P0 );
378 RTI;
379
380 .section MEM_DATA_ADDR_1,"aw"
381
382 .space (STACKSIZE);
383 STACK:
384 NOP;NOP;NOP;NOP;NOP;NOP;NOP; // needed for icache bug