target-xtensa: add MMU pagewalking tests

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
This commit is contained in:
Max Filippov 2012-05-27 18:34:54 +04:00 committed by Blue Swirl
parent 57705a676c
commit c305e32f43

View file

@ -293,26 +293,219 @@ test store_prohibited
assert eq, a2, a3
test_end
test dtlb_autoload
set_vector kernel, 0
movi a2, 0xd4000000
/* Set up page table entry vaddr->paddr, ring=pte_ring, attr=pte_attr
* and DTLB way 7 to cover this PTE, ring=pt_ring, attr=pt_attr
*/
.macro pt_setup pt_ring, pt_attr, pte_ring, vaddr, paddr, pte_attr
movi a2, 0x80000000
wsr a2, ptevaddr
movi a3, 0x00001013
s32i a3, a2, 4
movi a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
movi a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */
wdtlb a4, a3
isync
movi a3, ((\paddr) & 0xfffff000) | ((\pte_ring) << 4) | (\pte_attr)
movi a1, ((\vaddr) >> 12) << 2
add a2, a1, a2
s32i a3, a2, 0
movi a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
movi a4, 0x04000000 | ((\pt_ring) << 4) | (\pt_attr) /* PADDR 64M */
wdtlb a4, a3
isync
movi a3, (\vaddr)
.endm
/* out: PS.RING=ring, PS.EXCM=excm, a3=vaddr */
.macro go_ring ring, excm, vaddr
movi a3, 10f
pitlb a3, a3
ritlb1 a2, a3
movi a1, 0x10
or a2, a2, a1
movi a1, 0x000ff000
and a3, a3, a1
movi a1, 4
or a3, a3, a1
witlb a2, a3
movi a3, 10f
movi a1, 0x000fffff
and a1, a3, a1
movi a2, 0
wsr a2, excvaddr
movi a3, \vaddr
movi a2, 0x4000f | ((\ring) << 6) | ((\excm) << 4)
jx a1
10:
wsr a2, ps
isync
.endm
/* in: a3 -- virtual address to test */
.macro assert_auto_tlb
movi a2, 0x4000f
wsr a2, ps
isync
pdtlb a2, a3
movi a1, 0xfffff01f
and a2, a2, a1
movi a1, 0xfffff000
and a1, a1, a3
xor a1, a1, a2
assert gei, a1, 0x10
movi a2, 0x14
assert lt, a1, a2
.endm
/* in: a3 -- virtual address to test */
.macro assert_no_auto_tlb
movi a2, 0x4000f
wsr a2, ps
isync
pdtlb a2, a3
movi a1, 0x10
and a1, a1, a2
assert eqi, a1, 0
.endm
.macro assert_sr sr, v
rsr a2, \sr
movi a1, (\v)
assert eq, a1, a2
.endm
.macro assert_epc1_1m vaddr
movi a2, (\vaddr)
movi a1, 0xfffff
and a1, a1, a2
rsr a2, epc1
assert eq, a1, a2
.endm
test dtlb_autoload
set_vector kernel, 0
pt_setup 0, 3, 1, 0x1000, 0x1000, 3
assert_no_auto_tlb
l8ui a1, a3, 0
pdtlb a2, a3
movi a1, 0xfffff010
and a1, a1, a2
movi a3, 0x00001010
assert eq, a1, a3
movi a1, 0xf
and a1, a1, a2
assert lti, a1, 4
rsr a2, excvaddr
assert eq, a2, a3
assert_auto_tlb
test_end
test autoload_load_store_privilege
set_vector kernel, 0
set_vector double, 2f
pt_setup 0, 3, 0, 0x2000, 0x2000, 3
movi a3, 0x2004
assert_no_auto_tlb
movi a2, 0x4005f /* ring 1 + excm => cring == 0 */
wsr a2, ps
isync
1:
l32e a2, a3, -4 /* ring used */
test_fail
2:
rsr a2, excvaddr
addi a1, a3, -4
assert eq, a1, a2
assert_auto_tlb
assert_sr depc, 1b
assert_sr exccause, 26
test_end
test autoload_pte_load_prohibited
set_vector kernel, 2f
pt_setup 0, 3, 0, 0x3000, 0, 0xc
assert_no_auto_tlb
1:
l32i a2, a3, 0
test_fail
2:
rsr a2, excvaddr
assert eq, a2, a3
assert_auto_tlb
assert_sr epc1, 1b
assert_sr exccause, 28
test_end
test autoload_pt_load_prohibited
set_vector kernel, 2f
pt_setup 0, 0xc, 0, 0x4000, 0x4000, 3
assert_no_auto_tlb
1:
l32i a2, a3, 0
test_fail
2:
rsr a2, excvaddr
assert eq, a2, a3
assert_no_auto_tlb
assert_sr epc1, 1b
assert_sr exccause, 24
test_end
test autoload_pt_privilege
set_vector kernel, 2f
pt_setup 0, 3, 1, 0x5000, 0, 3
go_ring 1, 0, 0x5001
l8ui a2, a3, 0
1:
syscall
2:
rsr a2, excvaddr
assert eq, a2, a3
assert_auto_tlb
assert_epc1_1m 1b
assert_sr exccause, 1
test_end
test autoload_pte_privilege
set_vector kernel, 2f
pt_setup 0, 3, 0, 0x6000, 0, 3
go_ring 1, 0, 0x6001
1:
l8ui a2, a3, 0
syscall
2:
rsr a2, excvaddr
assert eq, a2, a3
assert_auto_tlb
assert_epc1_1m 1b
assert_sr exccause, 26
test_end
test autoload_3_level_pt
set_vector kernel, 2f
pt_setup 1, 3, 1, 0x00400000, 0, 3
pt_setup 1, 3, 1, 0x80001000, 0x2000000, 3
go_ring 1, 0, 0x00400001
1:
l8ui a2, a3, 0
syscall
2:
rsr a2, excvaddr
assert eq, a2, a3
assert_no_auto_tlb
assert_epc1_1m 1b
assert_sr exccause, 24
test_end
test_suite_end