source: trunk/softs/tests_cc_vcache/test_excep_intr/test.S @ 1024

Last change on this file since 1024 was 520, checked in by bouyer, 11 years ago

Re-add the tests; reverting previous which was done at the wrong level (sorry)

File size: 3.8 KB
Line 
1/*
2 * Check interrupt while in trap handler.
3 * Cache is enabled so we have one instruction/cycle
4 */
5#include <registers.h>
6#include <misc.h>
7#include <vcache.h>
8#include <xicu.h>
9
10#define DOLOAD_ADDR 0x80000000
11
12        .text
13        .globl  _start
14_start:
15        .set noreorder
16        la      k0, TTY_BASE
17        la      k1, EXIT_BASE
18        la      sp, 0x00200000 - 16
19
20        /* reset cause, make sure IV is off */
21        mtc0    zero, COP0_CAUSE
22
23        la      a0, pte1
24        srl     a0, a0, 13
25        mtc2    a0, VC_PTPR
26        nop
27        nop
28
29        li      a0, VC_TLB_EN_ITLB | VC_TLB_EN_DTLB | VC_TLB_EN_ICACHE | VC_TLB_EN_DCACHE
30        mtc2    a0, VC_TLB_EN
31
32        PRINT(startstr)
33
34        /* program xicu */
35        la      t0, XICU_BASE
36        /* clear pending interrupt */
37        lw      a0, XICU_PTI_ACK(0)(t0)
38        /* route PTI0 to irq 0 */
39        li      a0, 1 << 0
40        sw      a0, XICU_MSK_PTI_E(0)(t0)
41        /* init s0 */
42        li      s0, MAGIC2
43        /*
44         * interrupt in INTERRUPT_DELAY cycles.
45         */
46        li      a0, INTERRUPT_DELAY
47        sw      a0, XICU_PTI_PER(0)(t0)
48        /* clear pending interrupt */
49        lw      a0, XICU_PTI_ACK(0)(t0)
50        /* reset cop0 status (keep BEV), enable interrupt 0 */
51        lui     a0, 0x0040;
52        addiu   a0, 0x0401;
53        mtc0    a0, COP0_STATUS
54        nop
55        nop
56        nop
57        nop
58        nop
59
60        nop
61        move    a1, zero
62        la      s0, DOLOAD_ADDR
63        jalr    s0
64        nop
65        j       end
66        nop
67        /* we should not end there */
68        EXIT(1)
69
70end:
71        PRINT(endstr)
72        move    a0, a1
73        PRINTX
74        PUTCHAR(' ')
75        la      a0, myvar
76        lw      a0, 0(a0)
77        PRINTX
78        PUTCHAR('\n')
79        EXIT(0)
80
81        .globl excep
82excep:
83        .set noreorder
84        /* don't clobber a0 and ra */
85        addiu   sp, sp, -8
86        sw      a0, 4(sp)
87        sw      ra, 8(sp)
88
89        PRINT(statusstr)
90        mfc0    a0, COP0_STATUS
91        PRINTX
92
93        PRINT(causestr)
94        mfc0    a0, COP0_CAUSE
95        move    s0, a0
96        PRINTX
97
98        PRINT(pcstr)
99        mfc0    a0, COP0_EXPC
100        PRINTX
101
102        PRINT(badvastr)
103        mfc0    a0, COP_0_BADVADDR
104        PRINTX
105
106        PRINT(xicustr)
107        la      t0, XICU_BASE
108        lw      a0, XICU_PRIO(0)(t0)
109        PRINTX
110        PUTCHAR('\n')
111        /* map VA DOLOAD_ADDR at PA 0xbfc01000 */
112        la      t0, pte22 + VADDR_TO_PTE2I(DOLOAD_ADDR) * 8
113        la      a0, (0xbfc01000 >> PTE2_SHIFT)
114        sw      a0, 4(t0)
115        la      a0, (PTE2_V | PTE2_C | PTE2_X)
116        sw      a0, 0(t0)
117        mtc2    zero, VC_DCACHE_FLUSH /* flush the whole data cache */
118
119        andi    a0, s0, 0xff00
120        beq     a0, zero, notintr
121        nop
122
123        /* disable timer0 */
124        la      t0, XICU_BASE
125        sw      zero, XICU_PTI_PER(0)(t0)
126notintr:
127        la      a1, myvar
128        la      a0, 0(a1)
129        beq     a0, zero, noex
130        nop
131        EXIT(2)
132noex:
133        li      a0, 1
134        sw      a0, 0(a1)
135        lw      a0, 4(sp)
136        lw      ra, 8(sp)
137        addiu   sp, sp, 8
138        eret
139        /* we should not end there */
140        EXIT(1)
141
142        .rodata:
143statusstr: .ascii "status \0"
144causestr: .ascii " cause \0"
145pcstr: .ascii " pc \0"
146badvastr: .ascii " badva \0"
147xicustr: .ascii " xicu \0"
148startstr: .ascii "start\n\0"
149endstr: .ascii "end \0"
150
151        .org EXCEP_ADDRESS - BOOT_ADDRESS
152        .globl evect
153evect:
154        j       excep
155        nop
156        /*
157         * we use a ldscript trick here, to load this function at
158         * the appropriate address
159         */
160        .section .text2, "ax"
161        .globl doload
162doload:
163        la      s0, testval
164        jr      ra
165        lw      a1, 0(s0) /* this should trigger the exception */
166        /* we should not get there */
167        EXIT(1)
168        nop
169        .data
170myvar:  .word 0
171testval:
172        .word MAGIC2
173        .globl pte2
174pte2:
175        .align 12
176        .word PTE2_V | PTE2_C | PTE2_X
177        .word BOOT_ADDRESS >> 12
178        .org pte2 + 4092
179        .globl pte22
180pte22:
181        .align 12
182        .word 0
183        .word 0
184        .org pte22 + 4092
185        .globl pte1
186pte1:
187        .align 13
188        .word PTE1_V | PTE1_C | PTE1_W | 0x0 /* map PA 0 at VA 0 */
189        .org pte1 + (DOLOAD_ADDR >> 21) * 4
190        .word PTE1_V | PTE1_T | (0x2000 >> 12) /* map VA DOLOAD_ADDR with 4k page: check real address of PTE22 !!! */
191        .org pte1 + (BOOT_ADDRESS >> 21) * 4
192        .word PTE1_V | PTE1_T | (0x1000 >> 12) /* map PA 0xbfc00000 at VA 0xbfc00000 with 4k page: check real address of PTE2 !!! */
193        .org pte1 + (TTY_BASE >> 21) * 4
194        .word PTE1_V | PTE1_W | (TTY_BASE >> 21) /* map PA 0xd0200000 at VA 0xd0200000 */
195        .org pte1 + (XICU_BASE >> 21) * 4
196        .word PTE1_V | PTE1_W | (XICU_BASE >> 21) /* map PA 0xd2000000 at VA 0xd2000000 */
197        .org pte1 + (EXIT_BASE >> 21) * 4
198        .word PTE1_V | PTE1_W | (EXIT_BASE >> 21) /* map PA 0xe0000000 at VA 0xe0000000 */
199        .org pte1 + 8192
200        .word 0
201
Note: See TracBrowser for help on using the repository browser.