]> git.proxmox.com Git - mirror_qemu.git/blob - tests/tcg/xtensa/test_mmu.S
Merge remote-tracking branch 'remotes/otubo/tags/pull-seccomp-20141111' into staging
[mirror_qemu.git] / tests / tcg / xtensa / test_mmu.S
1 #include "macros.inc"
2
3 test_suite mmu
4
5 .purgem test_init
6
7 .macro clean_tlb_way way, page_size, n_entries
8 movi a2, \way
9 movi a3, \page_size
10 movi a4, \n_entries
11 loop a4, 1f
12 idtlb a2
13 iitlb a2
14 add a2, a2, a3
15 1:
16 .endm
17
18 .macro test_init
19 clean_tlb_way 0, 0x00001000, 4
20 clean_tlb_way 1, 0x00001000, 4
21 clean_tlb_way 2, 0x00001000, 4
22 clean_tlb_way 3, 0x00001000, 4
23 clean_tlb_way 4, 0x00100000, 4
24 movi a2, 0x00000007
25 idtlb a2
26 movi a2, 0x00000008
27 idtlb a2
28 movi a2, 0x00000009
29 idtlb a2
30 .endm
31
32 test tlb_group
33 movi a2, 0x04000002 /* PPN */
34 movi a3, 0x01200004 /* VPN */
35 wdtlb a2, a3
36 witlb a2, a3
37 movi a3, 0x00200004
38 rdtlb0 a1, a3
39 ritlb0 a2, a3
40 movi a3, 0x01000001
41 assert eq, a1, a3
42 assert eq, a2, a3
43 movi a3, 0x00200004
44 rdtlb1 a1, a3
45 ritlb1 a2, a3
46 movi a3, 0x04000002
47 assert eq, a1, a3
48 assert eq, a2, a3
49 movi a3, 0x01234567
50 pdtlb a1, a3
51 pitlb a2, a3
52 movi a3, 0x01234014
53 assert eq, a1, a3
54 movi a3, 0x0123400c
55 assert eq, a2, a3
56 movi a3, 0x00200004
57 idtlb a3
58 iitlb a3
59 movi a3, 0x01234567
60 pdtlb a1, a3
61 pitlb a2, a3
62 movi a3, 0x00000010
63 and a1, a1, a3
64 assert eqi, a1, 0
65 movi a3, 0x00000008
66 and a2, a2, a3
67 assert eqi, a2, 0
68 test_end
69
70 test itlb_miss
71 set_vector kernel, 1f
72
73 movi a3, 0x00100000
74 jx a3
75 test_fail
76 1:
77 rsr a2, excvaddr
78 assert eq, a2, a3
79 rsr a2, exccause
80 movi a3, 16
81 assert eq, a2, a3
82 test_end
83
84 test dtlb_miss
85 set_vector kernel, 1f
86
87 movi a3, 0x00100000
88 l8ui a2, a3, 0
89 test_fail
90 1:
91 rsr a2, excvaddr
92 assert eq, a2, a3
93 rsr a2, exccause
94 movi a3, 24
95 assert eq, a2, a3
96 test_end
97
98 test itlb_multi_hit
99 set_vector kernel, 1f
100
101 movi a2, 0x04000002 /* PPN */
102 movi a3, 0xf0000004 /* VPN */
103 witlb a2, a3
104 movi a3, 0xf0000000
105 pitlb a2, a3
106 test_fail
107 1:
108 rsr a2, exccause
109 movi a3, 17
110 assert eq, a2, a3
111 test_end
112
113 test dtlb_multi_hit
114 set_vector kernel, 1f
115
116 movi a2, 0x04000002 /* PPN */
117 movi a3, 0x01200004 /* VPN */
118 wdtlb a2, a3
119 movi a3, 0x01200007 /* VPN */
120 wdtlb a2, a3
121 movi a3, 0x01200000
122 pdtlb a2, a3
123 test_fail
124 1:
125 rsr a2, exccause
126 movi a3, 25
127 assert eq, a2, a3
128 test_end
129
130 test inst_fetch_privilege
131 set_vector kernel, 3f
132
133 movi a2, 0x4004f
134 wsr a2, ps
135 1:
136 isync
137 nop
138 2:
139 test_fail
140 3:
141 movi a1, 1b
142 rsr a2, excvaddr
143 rsr a3, epc1
144 assert ge, a2, a1
145 assert ge, a3, a1
146 movi a1, 2b
147 assert lt, a2, a1
148 assert lt, a3, a1
149 rsr a2, exccause
150 movi a3, 18
151 assert eq, a2, a3
152 rsr a2, ps
153 movi a3, 0x4005f
154 assert eq, a2, a3
155 test_end
156
157 test load_store_privilege
158 set_vector kernel, 2f
159
160 movi a3, 10f
161 pitlb a3, a3
162 ritlb1 a2, a3
163 movi a1, 0x10
164 or a2, a2, a1
165 movi a1, 0x000ff000
166 and a3, a3, a1
167 movi a1, 4
168 or a3, a3, a1
169 witlb a2, a3
170 movi a3, 10f
171 movi a1, 0x000fffff
172 and a1, a3, a1
173
174 movi a2, 0x04000003 /* PPN */
175 movi a3, 0x01200004 /* VPN */
176 wdtlb a2, a3
177 movi a3, 0x01200001
178 movi a2, 0x4004f
179 jx a1
180 10:
181 wsr a2, ps
182 isync
183 1:
184 l8ui a2, a3, 0
185 test_fail
186 2:
187 rsr a2, excvaddr
188 assert eq, a2, a3
189 rsr a2, epc1
190 movi a3, 1b
191 movi a1, 0x000fffff
192 and a3, a3, a1
193 assert eq, a2, a3
194 rsr a2, exccause
195 movi a3, 26
196 assert eq, a2, a3
197 rsr a2, ps
198 movi a3, 0x4005f
199 assert eq, a2, a3
200 test_end
201
202 test cring_load_store_privilege
203 set_vector kernel, 0
204 set_vector double, 2f
205
206 movi a2, 0x04000003 /* PPN */
207 movi a3, 0x01200004 /* VPN */
208 wdtlb a2, a3
209 movi a3, 0x01200004
210 movi a2, 0x4005f /* ring 1 + excm => cring == 0 */
211 wsr a2, ps
212 isync
213 l8ui a2, a3, 0 /* cring used */
214 1:
215 l32e a2, a3, -4 /* ring used */
216 test_fail
217 2:
218 rsr a2, excvaddr
219 addi a2, a2, 4
220 assert eq, a2, a3
221 rsr a2, depc
222 movi a3, 1b
223 assert eq, a2, a3
224 rsr a2, exccause
225 movi a3, 26
226 assert eq, a2, a3
227 rsr a2, ps
228 movi a3, 0x4005f
229 assert eq, a2, a3
230 test_end
231
232 test inst_fetch_prohibited
233 set_vector kernel, 2f
234
235 movi a3, 10f
236 pitlb a3, a3
237 ritlb1 a2, a3
238 movi a1, 0xfffff000
239 and a2, a2, a1
240 movi a1, 0x4
241 or a2, a2, a1
242 movi a1, 0x000ff000
243 and a3, a3, a1
244 movi a1, 4
245 or a3, a3, a1
246 witlb a2, a3
247 movi a3, 10f
248 movi a1, 0x000fffff
249 and a1, a3, a1
250 jx a1
251 .align 4
252 10:
253 nop
254 test_fail
255 2:
256 rsr a2, excvaddr
257 assert eq, a2, a1
258 rsr a2, epc1
259 assert eq, a2, a1
260 rsr a2, exccause
261 movi a3, 20
262 assert eq, a2, a3
263 test_end
264
265 test load_prohibited
266 set_vector kernel, 2f
267
268 movi a2, 0x0400000c /* PPN */
269 movi a3, 0x01200004 /* VPN */
270 wdtlb a2, a3
271 movi a3, 0x01200002
272 1:
273 l8ui a2, a3, 0
274 test_fail
275 2:
276 rsr a2, excvaddr
277 assert eq, a2, a3
278 rsr a2, epc1
279 movi a3, 1b
280 assert eq, a2, a3
281 rsr a2, exccause
282 movi a3, 28
283 assert eq, a2, a3
284 test_end
285
286 test store_prohibited
287 set_vector kernel, 2f
288
289 movi a2, 0x04000001 /* PPN */
290 movi a3, 0x01200004 /* VPN */
291 wdtlb a2, a3
292 movi a3, 0x01200003
293 l8ui a2, a3, 0
294 1:
295 s8i a2, a3, 0
296 test_fail
297 2:
298 rsr a2, excvaddr
299 assert eq, a2, a3
300 rsr a2, epc1
301 movi a3, 1b
302 assert eq, a2, a3
303 rsr a2, exccause
304 movi a3, 29
305 assert eq, a2, a3
306 test_end
307
308 /* Set up page table entry vaddr->paddr, ring=pte_ring, attr=pte_attr
309 * and DTLB way 7 to cover this PTE, ring=pt_ring, attr=pt_attr
310 */
311 .macro pt_setup pt_ring, pt_attr, pte_ring, vaddr, paddr, pte_attr
312 movi a2, 0x80000000
313 wsr a2, ptevaddr
314
315 movi a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
316 movi a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */
317 wdtlb a4, a3
318 isync
319
320 movi a3, ((\paddr) & 0xfffff000) | ((\pte_ring) << 4) | (\pte_attr)
321 movi a1, ((\vaddr) >> 12) << 2
322 add a2, a1, a2
323 s32i a3, a2, 0
324
325 movi a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
326 movi a4, 0x04000000 | ((\pt_ring) << 4) | (\pt_attr) /* PADDR 64M */
327 wdtlb a4, a3
328 isync
329
330 movi a3, (\vaddr)
331 .endm
332
333 /* out: PS.RING=ring, PS.EXCM=excm, a3=vaddr */
334 .macro go_ring ring, excm, vaddr
335 movi a3, 10f
336 pitlb a3, a3
337 ritlb1 a2, a3
338 movi a1, 0x10
339 or a2, a2, a1
340 movi a1, 0x000ff000
341 and a3, a3, a1
342 movi a1, 4
343 or a3, a3, a1
344 witlb a2, a3
345 movi a3, 10f
346 movi a1, 0x000fffff
347 and a1, a3, a1
348
349 movi a2, 0
350 wsr a2, excvaddr
351
352 movi a3, \vaddr
353 movi a2, 0x4000f | ((\ring) << 6) | ((\excm) << 4)
354 jx a1
355 10:
356 wsr a2, ps
357 isync
358 .endm
359
360 /* in: a3 -- virtual address to test */
361 .macro assert_auto_tlb
362 movi a2, 0x4000f
363 wsr a2, ps
364 isync
365 pdtlb a2, a3
366 movi a1, 0xfffff01f
367 and a2, a2, a1
368 movi a1, 0xfffff000
369 and a1, a1, a3
370 xor a1, a1, a2
371 assert gei, a1, 0x10
372 movi a2, 0x14
373 assert lt, a1, a2
374 .endm
375
376 /* in: a3 -- virtual address to test */
377 .macro assert_no_auto_tlb
378 movi a2, 0x4000f
379 wsr a2, ps
380 isync
381 pdtlb a2, a3
382 movi a1, 0x10
383 and a1, a1, a2
384 assert eqi, a1, 0
385 .endm
386
387 .macro assert_sr sr, v
388 rsr a2, \sr
389 movi a1, (\v)
390 assert eq, a1, a2
391 .endm
392
393 .macro assert_epc1_1m vaddr
394 movi a2, (\vaddr)
395 movi a1, 0xfffff
396 and a1, a1, a2
397 rsr a2, epc1
398 assert eq, a1, a2
399 .endm
400
401 test dtlb_autoload
402 set_vector kernel, 0
403
404 pt_setup 0, 3, 1, 0x1000, 0x1000, 3
405 assert_no_auto_tlb
406
407 l8ui a1, a3, 0
408
409 rsr a2, excvaddr
410 assert eq, a2, a3
411
412 assert_auto_tlb
413 test_end
414
415 test autoload_load_store_privilege
416 set_vector kernel, 0
417 set_vector double, 2f
418
419 pt_setup 0, 3, 0, 0x2000, 0x2000, 3
420 movi a3, 0x2004
421 assert_no_auto_tlb
422
423 movi a2, 0x4005f /* ring 1 + excm => cring == 0 */
424 wsr a2, ps
425 isync
426 1:
427 l32e a2, a3, -4 /* ring used */
428 test_fail
429 2:
430 rsr a2, excvaddr
431 addi a1, a3, -4
432 assert eq, a1, a2
433
434 assert_auto_tlb
435 assert_sr depc, 1b
436 assert_sr exccause, 26
437 test_end
438
439 test autoload_pte_load_prohibited
440 set_vector kernel, 2f
441
442 pt_setup 0, 3, 0, 0x3000, 0, 0xc
443 assert_no_auto_tlb
444 1:
445 l32i a2, a3, 0
446 test_fail
447 2:
448 rsr a2, excvaddr
449 assert eq, a2, a3
450
451 assert_auto_tlb
452 assert_sr epc1, 1b
453 assert_sr exccause, 28
454 test_end
455
456 test autoload_pt_load_prohibited
457 set_vector kernel, 2f
458
459 pt_setup 0, 0xc, 0, 0x4000, 0x4000, 3
460 assert_no_auto_tlb
461 1:
462 l32i a2, a3, 0
463 test_fail
464 2:
465 rsr a2, excvaddr
466 assert eq, a2, a3
467
468 assert_no_auto_tlb
469 assert_sr epc1, 1b
470 assert_sr exccause, 24
471 test_end
472
473 test autoload_pt_privilege
474 set_vector kernel, 2f
475 pt_setup 0, 3, 1, 0x5000, 0, 3
476 go_ring 1, 0, 0x5001
477
478 l8ui a2, a3, 0
479 1:
480 syscall
481 2:
482 rsr a2, excvaddr
483 assert eq, a2, a3
484
485 assert_auto_tlb
486 assert_epc1_1m 1b
487 assert_sr exccause, 1
488 test_end
489
490 test autoload_pte_privilege
491 set_vector kernel, 2f
492 pt_setup 0, 3, 0, 0x6000, 0, 3
493 go_ring 1, 0, 0x6001
494 1:
495 l8ui a2, a3, 0
496 syscall
497 2:
498 rsr a2, excvaddr
499 assert eq, a2, a3
500
501 assert_auto_tlb
502 assert_epc1_1m 1b
503 assert_sr exccause, 26
504 test_end
505
506 test autoload_3_level_pt
507 set_vector kernel, 2f
508 pt_setup 1, 3, 1, 0x00400000, 0, 3
509 pt_setup 1, 3, 1, 0x80001000, 0x2000000, 3
510 go_ring 1, 0, 0x00400001
511 1:
512 l8ui a2, a3, 0
513 syscall
514 2:
515 rsr a2, excvaddr
516 assert eq, a2, a3
517
518 assert_no_auto_tlb
519 assert_epc1_1m 1b
520 assert_sr exccause, 24
521 test_end
522
523 test cross_page_insn
524 set_vector kernel, 2f
525
526 movi a2, 0x04000003 /* PPN */
527 movi a3, 0x00007000 /* VPN */
528 witlb a2, a3
529 wdtlb a2, a3
530 movi a3, 0x00008000 /* VPN */
531 witlb a2, a3
532 wdtlb a2, a3
533
534 movi a2, 0x00007fff
535 movi a3, 20f
536 movi a4, 21f
537 sub a4, a4, a3
538 loop a4, 1f
539 l8ui a5, a3, 0
540 s8i a5, a2, 0
541 addi a2, a2, 1
542 addi a3, a3, 1
543 1:
544 movi a2, 0x00007fff
545 movi a3, 0x00008000
546 /* DTLB: OK, ITLB: OK */
547 jx a2
548
549 .begin no-transform
550 20:
551 l32i a2, a3, 0
552 syscall
553 21:
554 .end no-transform
555
556 2:
557 rsr a2, exccause
558 movi a3, 1
559 assert eq, a2, a3
560 rsr a2, epc1
561 movi a3, 0x8002
562 assert eq, a2, a3
563 rsr a2, excsave1
564 movi a3, 0x00007fff
565 assert ne, a2, a3
566
567 reset_ps
568 set_vector kernel, 3f
569
570 movi a2, 0x0400000c /* PPN */
571 movi a3, 0x00008000 /* VPN */
572 wdtlb a2, a3
573 movi a2, 0x00007fff
574 movi a3, 0x00008000
575 /* DTLB: FAIL, ITLB: OK */
576 jx a2
577 3:
578 rsr a2, exccause
579 movi a3, 28
580 assert eq, a2, a3
581 rsr a2, epc1
582 movi a3, 0x7fff
583 assert eq, a2, a3
584 rsr a2, excsave1
585 movi a3, 0x00007fff
586 assert eq, a2, a3
587
588 reset_ps
589 set_vector kernel, 4f
590
591 movi a2, 0x0400000c /* PPN */
592 movi a3, 0x00008000 /* VPN */
593 witlb a2, a3
594 movi a2, 0x04000003 /* PPN */
595 wdtlb a2, a3
596 movi a2, 0x00007fff
597 movi a3, 0x00008000
598 /* DTLB: OK, ITLB: FAIL */
599 jx a2
600 4:
601 rsr a2, exccause
602 movi a3, 20
603 assert eq, a2, a3
604 rsr a2, epc1
605 movi a3, 0x7fff
606 assert eq, a2, a3
607 rsr a2, excsave1
608 movi a3, 0x00007fff
609 assert eq, a2, a3
610
611 reset_ps
612 set_vector kernel, 5f
613
614 movi a2, 0x0400000c /* PPN */
615 movi a3, 0x00008000 /* VPN */
616 wdtlb a2, a3
617 movi a2, 0x00007fff
618 movi a3, 0x00008000
619 /* DTLB: FAIL, ITLB: FAIL */
620 jx a2
621 5:
622 rsr a2, exccause
623 movi a3, 20
624 assert eq, a2, a3
625 rsr a2, epc1
626 movi a3, 0x7fff
627 assert eq, a2, a3
628 rsr a2, excsave1
629 movi a3, 0x00007fff
630 assert eq, a2, a3
631 test_end
632
633 test cross_page_tb
634 set_vector kernel, 2f
635
636 movi a2, 0x04000003 /* PPN */
637 movi a3, 0x00007000 /* VPN */
638 witlb a2, a3
639 wdtlb a2, a3
640 movi a3, 0x00008000 /* VPN */
641 witlb a2, a3
642 wdtlb a2, a3
643
644 movi a2, 0x00007ffd
645 movi a3, 20f
646 movi a4, 21f
647 sub a4, a4, a3
648 loop a4, 1f
649 l8ui a5, a3, 0
650 s8i a5, a2, 0
651 addi a2, a2, 1
652 addi a3, a3, 1
653 1:
654 movi a2, 0x00007ffd
655 movi a3, 0x00008000
656 /* DTLB: OK, ITLB: OK */
657 jx a2
658
659 .begin no-transform
660 20:
661 l32i a2, a3, 0
662 syscall
663 21:
664 .end no-transform
665
666 2:
667 rsr a2, exccause
668 movi a3, 1
669 assert eq, a2, a3
670 rsr a2, epc1
671 movi a3, 0x8000
672 assert eq, a2, a3
673 rsr a2, excsave1
674 movi a3, 0x00007ffd
675 assert ne, a2, a3
676
677 reset_ps
678 set_vector kernel, 3f
679
680 movi a2, 0x0400000c /* PPN */
681 movi a3, 0x00008000 /* VPN */
682 wdtlb a2, a3
683 movi a2, 0x00007ffd
684 movi a3, 0x00008000
685 /* DTLB: FAIL, ITLB: OK */
686 jx a2
687 3:
688 rsr a2, exccause
689 movi a3, 28
690 assert eq, a2, a3
691 rsr a2, epc1
692 movi a3, 0x7ffd
693 assert eq, a2, a3
694 rsr a2, excsave1
695 movi a3, 0x00007ffd
696 assert eq, a2, a3
697
698 reset_ps
699 set_vector kernel, 4f
700
701 movi a2, 0x0400000c /* PPN */
702 movi a3, 0x00008000 /* VPN */
703 witlb a2, a3
704 movi a2, 0x04000003 /* PPN */
705 wdtlb a2, a3
706 movi a2, 0x00007ffd
707 movi a3, 0x00008000
708 /* DTLB: OK, ITLB: FAIL */
709 jx a2
710 4:
711 rsr a2, exccause
712 movi a3, 20
713 assert eq, a2, a3
714 rsr a2, epc1
715 movi a3, 0x8000
716 assert eq, a2, a3
717 rsr a2, excsave1
718 movi a3, 0x00007ffd
719 assert ne, a2, a3
720
721 reset_ps
722 set_vector kernel, 5f
723
724 movi a2, 0x0400000c /* PPN */
725 movi a3, 0x00008000 /* VPN */
726 wdtlb a2, a3
727 movi a2, 0x00007ffd
728 movi a3, 0x00008000
729 /* DTLB: FAIL, ITLB: FAIL */
730 jx a2
731 5:
732 rsr a2, exccause
733 movi a3, 28
734 assert eq, a2, a3
735 rsr a2, epc1
736 movi a3, 0x7ffd
737 assert eq, a2, a3
738 rsr a2, excsave1
739 movi a3, 0x00007ffd
740 assert eq, a2, a3
741 test_end
742
743 test_suite_end