xref: /qemu/tests/tcg/xtensa/test_mmu.S (revision d1f3a23b)
1.include "macros.inc"
2
3test_suite mmu
4
5.purgem test
6
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
19
20test 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
56test_end
57
58test itlb_miss
59    set_vector kernel, 1f
60
61    movi    a3, 0x00100000
62    jx      a3
63    test_fail
641:
65    rsr     a2, excvaddr
66    assert  eq, a2, a3
67    rsr     a2, exccause
68    movi    a3, 16
69    assert  eq, a2, a3
70test_end
71
72test dtlb_miss
73    set_vector kernel, 1f
74
75    movi    a3, 0x00100000
76    l8ui    a2, a3, 0
77    test_fail
781:
79    rsr     a2, excvaddr
80    assert  eq, a2, a3
81    rsr     a2, exccause
82    movi    a3, 24
83    assert  eq, a2, a3
84test_end
85
86test itlb_multi_hit
87    set_vector kernel, 1f
88
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
951:
96    rsr     a2, exccause
97    movi    a3, 17
98    assert  eq, a2, a3
99test_end
100
101test dtlb_multi_hit
102    set_vector kernel, 1f
103
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
1121:
113    rsr     a2, exccause
114    movi    a3, 25
115    assert  eq, a2, a3
116test_end
117
118test inst_fetch_privilege
119    set_vector kernel, 3f
120
121    movi    a2, 0x4004f
122    wsr     a2, ps
1231:
124    isync
125    nop
1262:
127    test_fail
1283:
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
143test_end
144
145test load_store_privilege
146    set_vector kernel, 2f
147
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
161
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
16810:
169    wsr     a2, ps
170    isync
1711:
172    l8ui    a2, a3, 0
173    test_fail
1742:
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
188test_end
189
190test cring_load_store_privilege
191    set_vector kernel, 0
192    set_vector double, 2f
193
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 */
2021:
203    l32e    a2, a3, -4     /* ring used */
204    test_fail
2052:
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
218test_end
219
220test inst_fetch_prohibited
221    set_vector kernel, 2f
222
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
24010:
241    nop
242    test_fail
2432:
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
251test_end
252
253test load_prohibited
254    set_vector kernel, 2f
255
256    movi    a2, 0x0400000c /* PPN */
257    movi    a3, 0x01200004 /* VPN */
258    wdtlb   a2, a3
259    movi    a3, 0x01200002
2601:
261    l8ui    a2, a3, 0
262    test_fail
2632:
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
272test_end
273
274test store_prohibited
275    set_vector kernel, 2f
276
277    movi    a2, 0x04000001 /* PPN */
278    movi    a3, 0x01200004 /* VPN */
279    wdtlb   a2, a3
280    movi    a3, 0x01200003
281    l8ui    a2, a3, 0
2821:
283    s8i     a2, a3, 0
284    test_fail
2852:
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
294test_end
295
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
302
303    movi    a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
304    movi    a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */
305    wdtlb   a4, a3
306    isync
307
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
312
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
317
318    movi    a3, (\vaddr)
319.endm
320
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
336
337    movi    a2, 0
338    wsr     a2, excvaddr
339
340    movi    a3, \vaddr
341    movi    a2, 0x4000f | ((\ring) << 6) | ((\excm) << 4)
342    jx      a1
34310:
344    wsr     a2, ps
345    isync
346.endm
347
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
363
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
374
375.macro assert_sr sr, v
376    rsr     a2, \sr
377    movi    a1, (\v)
378    assert  eq, a1, a2
379.endm
380
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
388
389test dtlb_autoload
390    set_vector kernel, 0
391
392    pt_setup    0, 3, 1, 0x1000, 0x1000, 3
393    assert_no_auto_tlb
394
395    l8ui    a1, a3, 0
396
397    rsr     a2, excvaddr
398    assert  eq, a2, a3
399
400    assert_auto_tlb
401test_end
402
403test autoload_load_store_privilege
404    set_vector kernel, 0
405    set_vector double, 2f
406
407    pt_setup    0, 3, 0, 0x2000, 0x2000, 3
408    movi    a3, 0x2004
409    assert_no_auto_tlb
410
411    movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
412    wsr     a2, ps
413    isync
4141:
415    l32e    a2, a3, -4     /* ring used */
416    test_fail
4172:
418    rsr     a2, excvaddr
419    addi    a1, a3, -4
420    assert  eq, a1, a2
421
422    assert_auto_tlb
423    assert_sr depc, 1b
424    assert_sr exccause, 26
425test_end
426
427test autoload_pte_load_prohibited
428    set_vector kernel, 2f
429
430    pt_setup    0, 3, 0, 0x3000, 0, 0xc
431    assert_no_auto_tlb
4321:
433    l32i    a2, a3, 0
434    test_fail
4352:
436    rsr     a2, excvaddr
437    assert  eq, a2, a3
438
439    assert_auto_tlb
440    assert_sr epc1, 1b
441    assert_sr exccause, 28
442test_end
443
444test autoload_pt_load_prohibited
445    set_vector kernel, 2f
446
447    pt_setup    0, 0xc, 0, 0x4000, 0x4000, 3
448    assert_no_auto_tlb
4491:
450    l32i    a2, a3, 0
451    test_fail
4522:
453    rsr     a2, excvaddr
454    assert  eq, a2, a3
455
456    assert_no_auto_tlb
457    assert_sr epc1, 1b
458    assert_sr exccause, 24
459test_end
460
461test autoload_pt_privilege
462    set_vector  kernel, 2f
463    pt_setup    0, 3, 1, 0x5000, 0, 3
464    go_ring     1, 0, 0x5001
465
466    l8ui    a2, a3, 0
4671:
468    syscall
4692:
470    rsr     a2, excvaddr
471    assert  eq, a2, a3
472
473    assert_auto_tlb
474    assert_epc1_1m 1b
475    assert_sr exccause, 1
476test_end
477
478test autoload_pte_privilege
479    set_vector  kernel, 2f
480    pt_setup    0, 3, 0, 0x6000, 0, 3
481    go_ring     1, 0, 0x6001
4821:
483    l8ui    a2, a3, 0
484    syscall
4852:
486    rsr     a2, excvaddr
487    assert  eq, a2, a3
488
489    assert_auto_tlb
490    assert_epc1_1m 1b
491    assert_sr exccause, 26
492test_end
493
494test 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
4991:
500    l8ui    a2, a3, 0
501    syscall
5022:
503    rsr     a2, excvaddr
504    assert  eq, a2, a3
505
506    assert_no_auto_tlb
507    assert_epc1_1m 1b
508    assert_sr exccause, 24
509test_end
510
511test_suite_end
512