|
|
1.1 root 1: .include "macros.inc"
2:
3: test_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:
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
57:
58: test itlb_miss
59: set_vector kernel, 1f
60:
61: movi a3, 0x00100000
62: jx a3
63: test_fail
64: 1:
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
71:
72: test dtlb_miss
73: set_vector kernel, 1f
74:
75: movi a3, 0x00100000
76: l8ui a2, a3, 0
77: test_fail
78: 1:
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
85:
86: test 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
95: 1:
96: rsr a2, exccause
97: movi a3, 17
98: assert eq, a2, a3
99: test_end
100:
101: test 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
112: 1:
113: rsr a2, exccause
114: movi a3, 25
115: assert eq, a2, a3
116: test_end
117:
118: test inst_fetch_privilege
119: set_vector kernel, 3f
120:
121: movi a2, 0x4004f
122: wsr a2, ps
123: 1:
124: isync
125: nop
126: 2:
127: test_fail
128: 3:
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
144:
145: test 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
168: 10:
169: wsr a2, ps
170: isync
171: 1:
172: l8ui a2, a3, 0
173: test_fail
174: 2:
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
189:
190: test 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 */
202: 1:
203: l32e a2, a3, -4 /* ring used */
204: test_fail
205: 2:
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
219:
220: test 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
240: 10:
241: nop
242: test_fail
243: 2:
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
252:
253: test 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
260: 1:
261: l8ui a2, a3, 0
262: test_fail
263: 2:
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
273:
274: test 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
282: 1:
283: s8i a2, a3, 0
284: test_fail
285: 2:
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
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
343: 10:
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:
389: test 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
401: test_end
402:
403: test 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
414: 1:
415: l32e a2, a3, -4 /* ring used */
416: test_fail
417: 2:
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
425: test_end
426:
427: test autoload_pte_load_prohibited
428: set_vector kernel, 2f
429:
430: pt_setup 0, 3, 0, 0x3000, 0, 0xc
431: assert_no_auto_tlb
432: 1:
433: l32i a2, a3, 0
434: test_fail
435: 2:
436: rsr a2, excvaddr
437: assert eq, a2, a3
438:
439: assert_auto_tlb
440: assert_sr epc1, 1b
441: assert_sr exccause, 28
442: test_end
443:
444: test autoload_pt_load_prohibited
445: set_vector kernel, 2f
446:
447: pt_setup 0, 0xc, 0, 0x4000, 0x4000, 3
448: assert_no_auto_tlb
449: 1:
450: l32i a2, a3, 0
451: test_fail
452: 2:
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
459: test_end
460:
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
465:
466: l8ui a2, a3, 0
467: 1:
468: syscall
469: 2:
470: rsr a2, excvaddr
471: assert eq, a2, a3
472:
473: assert_auto_tlb
474: assert_epc1_1m 1b
475: assert_sr exccause, 1
476: test_end
477:
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
482: 1:
483: l8ui a2, a3, 0
484: syscall
485: 2:
486: rsr a2, excvaddr
487: assert eq, a2, a3
488:
489: assert_auto_tlb
490: assert_epc1_1m 1b
491: assert_sr exccause, 26
492: test_end
493:
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
499: 1:
500: l8ui a2, a3, 0
501: syscall
502: 2:
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
509: test_end
510:
511: test_suite_end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.