Revision c305e32f
b/tests/tcg/xtensa/test_mmu.S | ||
---|---|---|
293 | 293 |
assert eq, a2, a3 |
294 | 294 |
test_end |
295 | 295 |
|
296 |
test dtlb_autoload |
|
297 |
set_vector kernel, 0 |
|
298 |
|
|
299 |
movi a2, 0xd4000000 |
|
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 |
|
300 | 301 |
wsr a2, ptevaddr |
301 |
movi a3, 0x00001013 |
|
302 |
s32i a3, a2, 4 |
|
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 |
|
303 | 369 |
pdtlb a2, a3 |
304 | 370 |
movi a1, 0x10 |
305 | 371 |
and a1, a1, a2 |
306 | 372 |
assert eqi, a1, 0 |
307 |
l8ui a1, a3, 0 |
|
308 |
pdtlb a2, a3 |
|
309 |
movi a1, 0xfffff010 |
|
310 |
and a1, a1, a2 |
|
311 |
movi a3, 0x00001010 |
|
312 |
assert eq, a1, a3 |
|
313 |
movi a1, 0xf |
|
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 |
|
314 | 384 |
and a1, a1, a2 |
315 |
assert lti, a1, 4 |
|
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 |
|
316 | 509 |
test_end |
317 | 510 |
|
318 | 511 |
test_suite_end |
Also available in: Unified diff