OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [or1ksim/] [testsuite/] [test-code-or1k/] [int-test/] [int-test.S] - Blame information for rev 90

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 90 jeremybenn
/* int-test.S. Test of Or1ksim interrupt controller
2
 
3
   Copyright (C) 1999-2006 OpenCores
4
   Copyright (C) 2010 Embecosm Limited
5
 
6
   Contributors various OpenCores participants
7
   Contributor Jeremy Bennett 
8
 
9
   This file is part of OpenRISC 1000 Architectural Simulator.
10
 
11
   This program is free software; you can redistribute it and/or modify it
12
   under the terms of the GNU General Public License as published by the Free
13
   Software Foundation; either version 3 of the License, or (at your option)
14
   any later version.
15
 
16
   This program is distributed in the hope that it will be useful, but WITHOUT
17
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
19
   more details.
20
 
21
   You should have received a copy of the GNU General Public License along
22
   with this program.  If not, see .  */
23
 
24
/* ----------------------------------------------------------------------------
25
   This code is commented throughout for use with Doxygen.
26
   --------------------------------------------------------------------------*/
27
 
28
/* Within the test we'll use following global variables:
29
 
30
   r16 interrupt counter
31
   r17 current tick timer comparison counter
32
   r18 sanity counter
33
   r19 loop counter
34
   r20 temp value of SR reg
35
   r21 temp value of TTMR reg.
36
   r23 RAM_START
37
 
38
   r25-r31 used by int handler
39
 
40
   The test do the following:
41
   We set up the tick timer to trigger once and then we trigger interrupts incrementally
42
   on every cycle in the specified test program; on interrupt handler we check if data computed
43
   so far exactly matches precalculated values. If interrupt has returned incorreclty, we can
44
   detect this using assertion routine at the end.
45
*/
46
 
47
#include "spr-defs.h"
48
#include "board.h"
49
 
50
#define  RAM_START 0x00000000
51
 
52
#define MC_CSR          (0x00)
53
#define MC_POC          (0x04)
54
#define MC_BA_MASK      (0x08)
55
#define MC_CSC(i)       (0x10 + (i) * 8)
56
#define MC_TMS(i)       (0x14 + (i) * 8)
57
 
58
.section  .reset, "ax"
59
 
60
.org 0x100
61
 
62
_reset_vector:
63
  l.addi  r2,r0,0x0
64
  l.addi  r3,r0,0x0
65
  l.addi  r4,r0,0x0
66
  l.addi  r5,r0,0x0
67
  l.addi  r6,r0,0x0
68
  l.addi  r7,r0,0x0
69
  l.addi  r8,r0,0x0
70
  l.addi  r9,r0,0x0
71
  l.addi  r10,r0,0x0
72
  l.addi  r11,r0,0x0
73
  l.addi  r12,r0,0x0
74
  l.addi  r13,r0,0x0
75
  l.addi  r14,r0,0x0
76
  l.addi  r15,r0,0x0
77
  l.addi  r16,r0,0x0
78
  l.addi  r17,r0,0x0
79
  l.addi  r18,r0,0x0
80
  l.addi  r19,r0,0x0
81
  l.addi  r20,r0,0x0
82
  l.addi  r21,r0,0x0
83
  l.addi  r22,r0,0x0
84
  l.addi  r23,r0,0x0
85
  l.addi  r24,r0,0x0
86
  l.addi  r25,r0,0x0
87
  l.addi  r26,r0,0x0
88
  l.addi  r27,r0,0x0
89
  l.addi  r28,r0,0x0
90
  l.addi  r29,r0,0x0
91
  l.addi  r30,r0,0x0
92
  l.addi  r31,r0,0x0
93
 
94
  l.movhi r3,hi(start)
95
  l.ori   r3,r3,lo(start)
96
  l.jr    r3
97
  l.nop
98
start:
99
  l.jal   _init_mc
100
  l.nop
101
 
102
  /* Setup exception wrapper */
103
  l.movhi r3,hi(_src_beg)
104
  l.ori   r3,r3,lo(_src_beg)
105
  l.movhi r4,hi(_dst_beg)
106
  l.ori   r4,r4,lo(_dst_beg)
107
  l.movhi r5,hi(_dst_end)
108
  l.ori   r5,r5,lo(_dst_end)
109
  l.sub   r5,r5,r4
110
  l.sfeqi r5,0
111
  l.bf    2f
112
  l.nop
113
1:
114
  l.lwz   r6,0(r3)
115
  l.sw    0(r4),r6
116
  l.addi  r3,r3,4
117
  l.addi  r4,r4,4
118
  l.addi  r5,r5,-4
119
  l.sfgtsi r5,0
120
  l.bf          1b
121
  l.nop
122
2:
123
  l.movhi r2,hi(_main)
124
  l.ori   r2,r2,lo(_main)
125
  l.jr    r2
126
  l.nop
127
 
128
_init_mc:
129
 
130
  l.movhi r3,hi(MC_BASE_ADDR)
131
  l.ori   r3,r3,lo(MC_BASE_ADDR)
132
 
133
  l.addi  r4,r3,MC_CSC(0)
134
  l.movhi r5,hi(FLASH_BASE_ADDR)
135
  l.srai  r5,r5,6
136
  l.ori   r5,r5,0x0025
137
  l.sw    0(r4),r5
138
 
139
  l.addi  r4,r3,MC_TMS(0)
140
  l.movhi r5,hi(FLASH_TMS_VAL)
141
  l.ori   r5,r5,lo(FLASH_TMS_VAL)
142
  l.sw    0(r4),r5
143
 
144
  l.addi  r4,r3,MC_BA_MASK
145
  l.addi  r5,r0,MC_MASK_VAL
146
  l.sw    0(r4),r5
147
 
148
  l.addi  r4,r3,MC_CSR
149
  l.movhi r5,hi(MC_CSR_VAL)
150
  l.ori   r5,r5,lo(MC_CSR_VAL)
151
  l.sw    0(r4),r5
152
 
153
  l.addi  r4,r3,MC_TMS(1)
154
  l.movhi r5,hi(SDRAM_TMS_VAL)
155
  l.ori   r5,r5,lo(SDRAM_TMS_VAL)
156
  l.sw    0(r4),r5
157
 
158
  l.addi  r4,r3,MC_CSC(1)
159
  l.movhi r5,hi(SDRAM_BASE_ADDR)
160
  l.srai  r5,r5,6
161
  l.ori   r5,r5,0x0411
162
  l.sw    0(r4),r5
163
 
164
  l.jr    r9
165
  l.nop
166
 
167
.section .text
168
 
169
#
170
# Tick timer exception handler
171
#
172
 
173
  l.addi  r31,r3,0
174
# get interrupted program pc
175
  l.mfspr r25,r0,SPR_EPCR_BASE
176
 
177
# calculate instruction address
178
  l.movhi r26,hi(_ie_start)
179
  l.ori   r26,r26,lo(_ie_start)
180
  l.addi  r3,r25,0    #print insn index
181
  l.nop   2
182
  l.sub   r25,r25,r26
183
  l.addi  r3,r25,0    #print insn index
184
  l.nop   2
185
 
186
  l.addi  r3,r31,0    # restore r3
187
  l.sfeqi r25, 0x00
188
  l.bf    _i00
189
  l.sfeqi r25, 0x04
190
  l.bf    _i04
191
  l.sfeqi r25, 0x08
192
  l.bf    _i08
193
  l.sfeqi r25, 0x0c
194
  l.bf    _i0c
195
  l.sfeqi r25, 0x10
196
  l.bf    _i10
197
  l.sfeqi r25, 0x14
198
  l.bf    _i14
199
  l.sfeqi r25, 0x18
200
  l.bf    _i18
201
  l.sfeqi r25, 0x1c
202
  l.bf    _i1c
203
  l.sfeqi r25, 0x20
204
  l.bf    _i20
205
  l.sfeqi r25, 0x24
206
  l.bf    _i24
207
  l.sfeqi r25, 0x28
208
  l.bf    _i28
209
  l.sfeqi r25, 0x2c
210
  l.bf    _i2c
211
  l.sfeqi r25, 0x30
212
  l.bf    _i30
213
  l.sfeqi r25, 0x34
214
  l.bf    _i34
215
  l.sfeqi r25, 0x38
216
  l.bf    _i38
217
  l.nop
218
 
219
# value not defined
220
_die:
221
  l.nop   2             #print r3
222
 
223
  l.addi  r3,r0,0xeeee
224
  l.nop   2
225
  l.addi  r3,r0,1
226
  l.nop   1
227
1:
228
  l.j     1b
229
  l.nop
230
 
231
 
232
_main:
233
        l.nop
234
  l.addi  r3,r0,SPR_SR_SM
235
  l.mtspr r0,r3,SPR_SR
236
        l.nop
237
 
238
#
239
# set tick counter to initial 3 cycles
240
#
241
  l.addi r16,r0,0
242
  l.addi r17,r0,1
243
  l.addi r18,r0,0
244
  l.addi r19,r0,0
245
  l.addi r22,r0,0
246
 
247
  l.movhi r23,hi(RAM_START)
248
  l.ori   r23,r23,lo(RAM_START)
249
 
250
# Set r20 to hold enable tick exception
251
        l.mfspr r20,r0,SPR_SR
252
        l.ori r20,r20,SPR_SR_SM|SPR_SR_TEE|SPR_SR_F
253
 
254
# Set r21 to hold value of TTMR
255
        l.movhi r5,hi(SPR_TTMR_SR | SPR_TTMR_IE)
256
        l.add  r21,r5,r17
257
 
258
#
259
# MAIN LOOP
260
#
261
_main_loop:
262
# reinitialize memory and registers
263
  l.addi  r3,r0,0xaaaa
264
  l.addi  r9,r0,0xbbbb
265
  l.sw    0(r23),r3
266
  l.sw    4(r23),r9
267
  l.sw    8(r23),r3
268
 
269
# Reinitializes tick timer
270
  l.addi  r17,r17,1
271
  l.mtspr r0,r0,SPR_TTCR                # set TTCR
272
  l.mtspr r0,r21,SPR_TTMR               # set TTMR
273
  l.mtspr r0,r0,SPR_TTCR                # set TTCR
274
        l.addi  r21,r21,1
275
 
276
# Enable exceptions and interrupts
277
        l.mtspr r0,r20,SPR_SR   # set SR
278
 
279
##### TEST CODE #####
280
_ie_start:
281
  l.movhi r3,0x1234         #00
282
  l.sw    0(r23),r3         #04
283
  l.movhi r3,hi(RAM_START)  #08
284
  l.lwz   r3,0(r3)          #0c
285
  l.movhi r3,hi(RAM_START)  #10
286
  l.addi  r3,r3,4           #14
287
  l.j     1f                #18
288
  l.lwz   r3,0(r3)          #1c
289
  l.addi  r3,r3,1           #20
290
1:
291
  l.sfeqi r3,0xdead         #24
292
  l.jal   2f                #28
293
  l.addi  r3,r0,0x5678      #2c
294
 
295
_return_addr:
296
2:
297
  l.bf    _die              #30
298
  l.sw    8(r23),r3         #34
299
_ie_end:
300
  l.nop                     #38
301
##### END OF TEST CODE #####
302
 
303
# do some testing
304
 
305
  l.j     _main_loop
306
  l.nop
307
 
308
_i00:
309
  l.sfeqi r3,0xaaaa
310
  l.bnf   _die
311
  l.nop
312
  l.j     _resume
313
  l.nop
314
_i04:
315
  l.movhi  r26,0x1234
316
  l.sfeq   r3,r26
317
  l.bnf   _die
318
  l.nop
319
  l.lwz   r26,0(r23)
320
  l.sfeqi r26,0xaaaa
321
  l.bnf   _die
322
  l.nop
323
  l.j     _resume
324
  l.nop
325
_i08:
326
  l.movhi r26,0x1234
327
  l.sfeq  r3,r26
328
  l.bnf   _die
329
  l.nop
330
  l.lwz   r27,0(r23)
331
  l.sfeq  r27,r26
332
  l.bnf   _die
333
  l.nop
334
  l.j     _resume
335
  l.nop
336
_i0c:
337
  l.sfeq  r3,r23
338
  l.bnf   _die
339
  l.nop
340
  l.j     _resume
341
  l.nop
342
_i10:
343
  l.movhi r26,0x1234
344
  l.sfeq  r26,r3
345
  l.bnf   _die
346
  l.nop
347
  l.j     _resume
348
  l.nop
349
_i14:
350
  l.sfeq  r3,r23
351
  l.bnf   _die
352
  l.nop
353
  l.j     _resume
354
  l.nop
355
_i18:
356
  l.addi  r26,r23,4
357
  l.sfeq  r3,r26
358
  l.bnf   _die
359
  l.nop
360
  l.j     _resume
361
  l.nop
362
_i1c:
363
  l.j     _die
364
  l.nop
365
_i20:
366
  l.j     _die
367
  l.nop
368
_i24:
369
  l.mfspr r26,r0,SPR_ESR_BASE
370
  l.addi  r30,r3,0
371
  l.addi  r3,r26,0
372
  l.nop   2
373
  l.addi  r3,r30,0
374
  l.andi  r26,r26,SPR_SR_F
375
  l.sfeq  r26,r0
376
/*  l.bnf   _die */
377
  l.nop
378
  l.sfeqi  r3,0xbbbb
379
  l.bnf   _die
380
  l.nop
381
  l.j     _resume
382
  l.nop
383
_i28:
384
  l.mfspr r26,r0,SPR_ESR_BASE
385
  l.addi  r30,r3,0
386
  l.addi  r3,r26,0
387
  l.nop   2
388
  l.addi  r3,r30,0
389
  l.andi  r26,r26,SPR_SR_F
390
  l.sfeq  r26,r0
391
  l.bnf    _die
392
  l.nop
393
  l.sfeqi  r22,1
394
  l.bf     _resume
395
  l.addi   r22,r0,1
396
  l.sfeqi  r9,0xbbbb
397
  l.bnf   _die
398
  l.nop
399
  l.j     _resume
400
  l.nop
401
_i2c:
402
  l.movhi  r26,hi(_return_addr)
403
  l.ori    r26,r26,lo(_return_addr)
404
  l.sfeq   r9,r26
405
  l.bnf   _die
406
  l.nop
407
  l.sfeqi  r3,0xbbbb
408
  l.bnf   _die
409
  l.nop
410
  l.j     _resume
411
  l.nop
412
_i30:
413
  l.sfeqi  r3,0x5678
414
  l.bnf   _die
415
  l.nop
416
  l.j     _resume
417
  l.nop
418
_i34:
419
  l.sfeqi  r3,0x5678
420
  l.bnf   _die
421
  l.nop
422
  l.lwz    r26,8(r23)
423
  l.sfeqi  r26,0xaaaa
424
  l.bnf   _die
425
  l.nop
426
  l.j     _resume
427
  l.nop
428
_i38:
429
  l.lwz    r26,8(r23)
430
  l.sfeqi  r26,0x5678
431
  l.bnf   _die
432
  l.nop
433
#
434
# mark finished ok
435
#
436
  l.movhi r3,hi(0xdeaddead)
437
  l.ori   r3,r3,lo(0xdeaddead)
438
  l.nop   2
439
  l.addi  r3,r0,0
440
  l.nop   1
441
_ok:
442
  l.j     _ok
443
  l.nop
444
 
445
_resume:
446
  l.mfspr  r27,r0,SPR_ESR_BASE
447
  l.addi   r26,r0,SPR_SR_TEE
448
  l.addi   r28,r0,-1
449
  l.xor    r26,r26,r28
450
  l.and    r26,r26,r27
451
  l.mtspr  r0,r26,SPR_ESR_BASE
452
 
453
  l.rfe
454
  l.addi    r3,r3,5         # should not be executed

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.