hw/omap1.c: Add fallthrough markers and breaks
[qemu/pbrook.git] / tests / tcg / xtensa / test_mmu.S
blob5d87fbb7039641d54e5d9a860f660ea4065f62b3
1 .include "macros.inc"
3 test_suite mmu
5 .purgem test
7 .macro test name
8     movi    a2, 0x00000004
9     idtlb   a2
10     movi    a2, 0x00100004
11     idtlb   a2
12     movi    a2, 0x00200004
13     idtlb   a2
14     movi    a2, 0x00300004
15     idtlb   a2
16     movi    a2, 0x00000007
17     idtlb   a2
18 .endm
20 test tlb_group
21     movi    a2, 0x04000002 /* PPN */
22     movi    a3, 0x01200004 /* VPN */
23     wdtlb   a2, a3
24     witlb   a2, a3
25     movi    a3, 0x00200004
26     rdtlb0  a1, a3
27     ritlb0  a2, a3
28     movi    a3, 0x01000001
29     assert  eq, a1, a3
30     assert  eq, a2, a3
31     movi    a3, 0x00200004
32     rdtlb1  a1, a3
33     ritlb1  a2, a3
34     movi    a3, 0x04000002
35     assert  eq, a1, a3
36     assert  eq, a2, a3
37     movi    a3, 0x01234567
38     pdtlb   a1, a3
39     pitlb   a2, a3
40     movi    a3, 0x01234014
41     assert  eq, a1, a3
42     movi    a3, 0x0123400c
43     assert  eq, a2, a3
44     movi    a3, 0x00200004
45     idtlb   a3
46     iitlb   a3
47     movi    a3, 0x01234567
48     pdtlb   a1, a3
49     pitlb   a2, a3
50     movi    a3, 0x00000010
51     and     a1, a1, a3
52     assert  eqi, a1, 0
53     movi    a3, 0x00000008
54     and     a2, a2, a3
55     assert  eqi, a2, 0
56 test_end
58 test itlb_miss
59     set_vector kernel, 1f
61     movi    a3, 0x00100000
62     jx      a3
63     test_fail
65     rsr     a2, excvaddr
66     assert  eq, a2, a3
67     rsr     a2, exccause
68     movi    a3, 16
69     assert  eq, a2, a3
70 test_end
72 test dtlb_miss
73     set_vector kernel, 1f
75     movi    a3, 0x00100000
76     l8ui    a2, a3, 0
77     test_fail
79     rsr     a2, excvaddr
80     assert  eq, a2, a3
81     rsr     a2, exccause
82     movi    a3, 24
83     assert  eq, a2, a3
84 test_end
86 test itlb_multi_hit
87     set_vector kernel, 1f
89     movi    a2, 0x04000002 /* PPN */
90     movi    a3, 0xf0000004 /* VPN */
91     witlb   a2, a3
92     movi    a3, 0xf0000000
93     pitlb   a2, a3
94     test_fail
96     rsr     a2, exccause
97     movi    a3, 17
98     assert  eq, a2, a3
99 test_end
101 test dtlb_multi_hit
102     set_vector kernel, 1f
104     movi    a2, 0x04000002 /* PPN */
105     movi    a3, 0x01200004 /* VPN */
106     wdtlb   a2, a3
107     movi    a3, 0x01200007 /* VPN */
108     wdtlb   a2, a3
109     movi    a3, 0x01200000
110     pdtlb   a2, a3
111     test_fail
113     rsr     a2, exccause
114     movi    a3, 25
115     assert  eq, a2, a3
116 test_end
118 test inst_fetch_privilege
119     set_vector kernel, 3f
121     movi    a2, 0x4004f
122     wsr     a2, ps
124     isync
125     nop
127     test_fail
129     movi    a1, 1b
130     rsr     a2, excvaddr
131     rsr     a3, epc1
132     assert  ge, a2, a1
133     assert  ge, a3, a1
134     movi    a1, 2b
135     assert  lt, a2, a1
136     assert  lt, a3, a1
137     rsr     a2, exccause
138     movi    a3, 18
139     assert  eq, a2, a3
140     rsr     a2, ps
141     movi    a3, 0x4005f
142     assert  eq, a2, a3
143 test_end
145 test load_store_privilege
146     set_vector kernel, 2f
148     movi    a3, 10f
149     pitlb   a3, a3
150     ritlb1  a2, a3
151     movi    a1, 0x10
152     or      a2, a2, a1
153     movi    a1, 0x000ff000
154     and     a3, a3, a1
155     movi    a1, 4
156     or      a3, a3, a1
157     witlb   a2, a3
158     movi    a3, 10f
159     movi    a1, 0x000fffff
160     and     a1, a3, a1
162     movi    a2, 0x04000003 /* PPN */
163     movi    a3, 0x01200004 /* VPN */
164     wdtlb   a2, a3
165     movi    a3, 0x01200001
166     movi    a2, 0x4004f
167     jx      a1
169     wsr     a2, ps
170     isync
172     l8ui    a2, a3, 0
173     test_fail
175     rsr     a2, excvaddr
176     assert  eq, a2, a3
177     rsr     a2, epc1
178     movi    a3, 1b
179     movi    a1, 0x000fffff
180     and     a3, a3, a1
181     assert  eq, a2, a3
182     rsr     a2, exccause
183     movi    a3, 26
184     assert  eq, a2, a3
185     rsr     a2, ps
186     movi    a3, 0x4005f
187     assert  eq, a2, a3
188 test_end
190 test cring_load_store_privilege
191     set_vector kernel, 0
192     set_vector double, 2f
194     movi    a2, 0x04000003 /* PPN */
195     movi    a3, 0x01200004 /* VPN */
196     wdtlb   a2, a3
197     movi    a3, 0x01200004
198     movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
199     wsr     a2, ps
200     isync
201     l8ui    a2, a3, 0      /* cring used */
203     l32e    a2, a3, -4     /* ring used */
204     test_fail
206     rsr     a2, excvaddr
207     addi    a2, a2, 4
208     assert  eq, a2, a3
209     rsr     a2, depc
210     movi    a3, 1b
211     assert  eq, a2, a3
212     rsr     a2, exccause
213     movi    a3, 26
214     assert  eq, a2, a3
215     rsr     a2, ps
216     movi    a3, 0x4005f
217     assert  eq, a2, a3
218 test_end
220 test inst_fetch_prohibited
221     set_vector kernel, 2f
223     movi    a3, 10f
224     pitlb   a3, a3
225     ritlb1  a2, a3
226     movi    a1, 0xfffff000
227     and     a2, a2, a1
228     movi    a1, 0x4
229     or      a2, a2, a1
230     movi    a1, 0x000ff000
231     and     a3, a3, a1
232     movi    a1, 4
233     or      a3, a3, a1
234     witlb   a2, a3
235     movi    a3, 10f
236     movi    a1, 0x000fffff
237     and     a1, a3, a1
238     jx      a1
239     .align  4
241     nop
242     test_fail
244     rsr     a2, excvaddr
245     assert  eq, a2, a1
246     rsr     a2, epc1
247     assert  eq, a2, a1
248     rsr     a2, exccause
249     movi    a3, 20
250     assert  eq, a2, a3
251 test_end
253 test load_prohibited
254     set_vector kernel, 2f
256     movi    a2, 0x0400000c /* PPN */
257     movi    a3, 0x01200004 /* VPN */
258     wdtlb   a2, a3
259     movi    a3, 0x01200002
261     l8ui    a2, a3, 0
262     test_fail
264     rsr     a2, excvaddr
265     assert  eq, a2, a3
266     rsr     a2, epc1
267     movi    a3, 1b
268     assert  eq, a2, a3
269     rsr     a2, exccause
270     movi    a3, 28
271     assert  eq, a2, a3
272 test_end
274 test store_prohibited
275     set_vector kernel, 2f
277     movi    a2, 0x04000001 /* PPN */
278     movi    a3, 0x01200004 /* VPN */
279     wdtlb   a2, a3
280     movi    a3, 0x01200003
281     l8ui    a2, a3, 0
283     s8i     a2, a3, 0
284     test_fail
286     rsr     a2, excvaddr
287     assert  eq, a2, a3
288     rsr     a2, epc1
289     movi    a3, 1b
290     assert  eq, a2, a3
291     rsr     a2, exccause
292     movi    a3, 29
293     assert  eq, a2, a3
294 test_end
296 /* Set up page table entry vaddr->paddr, ring=pte_ring, attr=pte_attr
297  * and DTLB way 7 to cover this PTE, ring=pt_ring, attr=pt_attr
298  */
299 .macro pt_setup pt_ring, pt_attr, pte_ring, vaddr, paddr, pte_attr
300     movi    a2, 0x80000000
301     wsr     a2, ptevaddr
303     movi    a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
304     movi    a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */
305     wdtlb   a4, a3
306     isync
308     movi    a3, ((\paddr) & 0xfffff000) | ((\pte_ring) << 4) | (\pte_attr)
309     movi    a1, ((\vaddr) >> 12) << 2
310     add     a2, a1, a2
311     s32i    a3, a2, 0
313     movi    a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
314     movi    a4, 0x04000000 | ((\pt_ring) << 4) | (\pt_attr) /* PADDR 64M */
315     wdtlb   a4, a3
316     isync
318     movi    a3, (\vaddr)
319 .endm
321 /* out: PS.RING=ring, PS.EXCM=excm, a3=vaddr */
322 .macro go_ring ring, excm, vaddr
323     movi    a3, 10f
324     pitlb   a3, a3
325     ritlb1  a2, a3
326     movi    a1, 0x10
327     or      a2, a2, a1
328     movi    a1, 0x000ff000
329     and     a3, a3, a1
330     movi    a1, 4
331     or      a3, a3, a1
332     witlb   a2, a3
333     movi    a3, 10f
334     movi    a1, 0x000fffff
335     and     a1, a3, a1
337     movi    a2, 0
338     wsr     a2, excvaddr
340     movi    a3, \vaddr
341     movi    a2, 0x4000f | ((\ring) << 6) | ((\excm) << 4)
342     jx      a1
344     wsr     a2, ps
345     isync
346 .endm
348 /* in: a3 -- virtual address to test */
349 .macro assert_auto_tlb
350     movi    a2, 0x4000f
351     wsr     a2, ps
352     isync
353     pdtlb   a2, a3
354     movi    a1, 0xfffff01f
355     and     a2, a2, a1
356     movi    a1, 0xfffff000
357     and     a1, a1, a3
358     xor     a1, a1, a2
359     assert  gei, a1, 0x10
360     movi    a2, 0x14
361     assert  lt, a1, a2
362 .endm
364 /* in: a3 -- virtual address to test */
365 .macro assert_no_auto_tlb
366     movi    a2, 0x4000f
367     wsr     a2, ps
368     isync
369     pdtlb   a2, a3
370     movi    a1, 0x10
371     and     a1, a1, a2
372     assert  eqi, a1, 0
373 .endm
375 .macro assert_sr sr, v
376     rsr     a2, \sr
377     movi    a1, (\v)
378     assert  eq, a1, a2
379 .endm
381 .macro assert_epc1_1m vaddr
382     movi    a2, (\vaddr)
383     movi    a1, 0xfffff
384     and     a1, a1, a2
385     rsr     a2, epc1
386     assert  eq, a1, a2
387 .endm
389 test dtlb_autoload
390     set_vector kernel, 0
392     pt_setup    0, 3, 1, 0x1000, 0x1000, 3
393     assert_no_auto_tlb
395     l8ui    a1, a3, 0
397     rsr     a2, excvaddr
398     assert  eq, a2, a3
400     assert_auto_tlb
401 test_end
403 test autoload_load_store_privilege
404     set_vector kernel, 0
405     set_vector double, 2f
407     pt_setup    0, 3, 0, 0x2000, 0x2000, 3
408     movi    a3, 0x2004
409     assert_no_auto_tlb
411     movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
412     wsr     a2, ps
413     isync
415     l32e    a2, a3, -4     /* ring used */
416     test_fail
418     rsr     a2, excvaddr
419     addi    a1, a3, -4
420     assert  eq, a1, a2
422     assert_auto_tlb
423     assert_sr depc, 1b
424     assert_sr exccause, 26
425 test_end
427 test autoload_pte_load_prohibited
428     set_vector kernel, 2f
430     pt_setup    0, 3, 0, 0x3000, 0, 0xc
431     assert_no_auto_tlb
433     l32i    a2, a3, 0
434     test_fail
436     rsr     a2, excvaddr
437     assert  eq, a2, a3
439     assert_auto_tlb
440     assert_sr epc1, 1b
441     assert_sr exccause, 28
442 test_end
444 test autoload_pt_load_prohibited
445     set_vector kernel, 2f
447     pt_setup    0, 0xc, 0, 0x4000, 0x4000, 3
448     assert_no_auto_tlb
450     l32i    a2, a3, 0
451     test_fail
453     rsr     a2, excvaddr
454     assert  eq, a2, a3
456     assert_no_auto_tlb
457     assert_sr epc1, 1b
458     assert_sr exccause, 24
459 test_end
461 test autoload_pt_privilege
462     set_vector  kernel, 2f
463     pt_setup    0, 3, 1, 0x5000, 0, 3
464     go_ring     1, 0, 0x5001
466     l8ui    a2, a3, 0
468     syscall
470     rsr     a2, excvaddr
471     assert  eq, a2, a3
473     assert_auto_tlb
474     assert_epc1_1m 1b
475     assert_sr exccause, 1
476 test_end
478 test autoload_pte_privilege
479     set_vector  kernel, 2f
480     pt_setup    0, 3, 0, 0x6000, 0, 3
481     go_ring     1, 0, 0x6001
483     l8ui    a2, a3, 0
484     syscall
486     rsr     a2, excvaddr
487     assert  eq, a2, a3
489     assert_auto_tlb
490     assert_epc1_1m 1b
491     assert_sr exccause, 26
492 test_end
494 test autoload_3_level_pt
495     set_vector  kernel, 2f
496     pt_setup    1, 3, 1, 0x00400000, 0, 3
497     pt_setup    1, 3, 1, 0x80001000, 0x2000000, 3
498     go_ring     1, 0, 0x00400001
500     l8ui    a2, a3, 0
501     syscall
503     rsr     a2, excvaddr
504     assert  eq, a2, a3
506     assert_no_auto_tlb
507     assert_epc1_1m 1b
508     assert_sr exccause, 24
509 test_end
511 test_suite_end