test_suite mmu
-#if XCHAL_HAVE_PTP_MMU && !XCHAL_HAVE_SPANNING_WAY
+#if XCHAL_HAVE_PTP_MMU
+#define BASE 0x20000000
+#define TLB_BASE 0x80000000
.purgem test_init
idtlb a2
movi a2, 0x00000009
idtlb a2
+#if XCHAL_HAVE_SPANNING_WAY
+ movi a2, BASE | XCHAL_SPANNING_WAY
+ idtlb a2
+ iitlb a2
+ movi a2, TLB_BASE | XCHAL_SPANNING_WAY
+ idtlb a2
+ iitlb a2
+ movi a2, TLB_BASE
+ wsr a2, ptevaddr
+#endif
.endm
test tlb_group
movi a2, 0x04000002 /* PPN */
- movi a3, 0x01200004 /* VPN */
+ movi a3, BASE + 0x01200004 /* VPN */
wdtlb a2, a3
witlb a2, a3
movi a3, 0x00200004
rdtlb0 a1, a3
ritlb0 a2, a3
- movi a3, 0x01000001
+ movi a3, BASE + 0x01000001
assert eq, a1, a3
assert eq, a2, a3
movi a3, 0x00200004
movi a3, 0x04000002
assert eq, a1, a3
assert eq, a2, a3
- movi a3, 0x01234567
+ movi a3, BASE + 0x01234567
pdtlb a1, a3
pitlb a2, a3
- movi a3, 0x01234014
+ movi a3, BASE + 0x01234014
assert eq, a1, a3
- movi a3, 0x0123400c
+ movi a3, BASE + 0x0123400c
assert eq, a2, a3
movi a3, 0x00200004
idtlb a3
iitlb a3
- movi a3, 0x01234567
+ movi a3, BASE + 0x01234567
pdtlb a1, a3
pitlb a2, a3
movi a3, 0x00000010
test itlb_miss
set_vector kernel, 1f
- movi a3, 0x00100000
+ movi a3, BASE + 0x00100000
jx a3
test_fail
1:
test dtlb_miss
set_vector kernel, 1f
- movi a3, 0x00100000
+ movi a3, BASE + 0x00100000
l8ui a2, a3, 0
test_fail
1:
set_vector kernel, 1f
movi a2, 0x04000002 /* PPN */
- movi a3, 0x01200004 /* VPN */
+ movi a3, BASE + 0x01200004 /* VPN */
wdtlb a2, a3
- movi a3, 0x01200007 /* VPN */
+ movi a3, BASE + 0x01200007 /* VPN */
wdtlb a2, a3
- movi a3, 0x01200000
+ movi a3, BASE + 0x01200000
pdtlb a2, a3
test_fail
1:
and a3, a3, a1
movi a1, 4
or a3, a3, a1
+ movi a5, BASE
+ add a3, a3, a5
witlb a2, a3
movi a3, 10f
movi a1, 0x000fffff
and a1, a3, a1
+ add a1, a1, a5
movi a2, 0x04000003 /* PPN */
- movi a3, 0x01200004 /* VPN */
+ movi a3, BASE + 0x01200004 /* VPN */
wdtlb a2, a3
- movi a3, 0x01200001
+ movi a3, BASE + 0x01200001
movi a2, 0x4004f
jx a1
10:
movi a3, 1b
movi a1, 0x000fffff
and a3, a3, a1
+ add a3, a3, a5
assert eq, a2, a3
rsr a2, exccause
movi a3, 26
set_vector double, 2f
movi a2, 0x04000003 /* PPN */
- movi a3, 0x01200004 /* VPN */
+ movi a3, BASE + 0x01200004 /* VPN */
wdtlb a2, a3
- movi a3, 0x01200004
+ movi a3, BASE + 0x01200004
movi a2, 0x4005f /* ring 1 + excm => cring == 0 */
wsr a2, ps
isync
and a3, a3, a1
movi a1, 4
or a3, a3, a1
+ movi a5, BASE
+ add a3, a3, a5
witlb a2, a3
movi a3, 10f
movi a1, 0x000fffff
and a1, a3, a1
+ add a1, a1, a5
jx a1
.align 4
10:
set_vector kernel, 2f
movi a2, 0x0400000c /* PPN */
- movi a3, 0x01200004 /* VPN */
+ movi a3, BASE + 0x01200004 /* VPN */
wdtlb a2, a3
- movi a3, 0x01200002
+ movi a3, BASE + 0x01200002
1:
l8ui a2, a3, 0
test_fail
set_vector kernel, 2f
movi a2, 0x04000001 /* PPN */
- movi a3, 0x01200004 /* VPN */
+ movi a3, BASE + 0x01200004 /* VPN */
wdtlb a2, a3
- movi a3, 0x01200003
+ movi a3, BASE + 0x01200003
l8ui a2, a3, 0
1:
s8i a2, a3, 0
* 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
+ movi a2, TLB_BASE
wsr a2, ptevaddr
- movi a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
+ movi a3, TLB_BASE | 7 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
movi a4, 0x04000003 | ((\pt_ring) << 4) /* PADDR 64M */
wdtlb a4, a3
isync
add a2, a1, a2
s32i a3, a2, 0
- movi a3, 0x80000007 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
+ movi a3, TLB_BASE | 7 | (((\vaddr) >> 10) & 0xfffff000) /* way 7 */
movi a4, 0x04000000 | ((\pt_ring) << 4) | (\pt_attr) /* PADDR 64M */
wdtlb a4, a3
isync
and a3, a3, a1
movi a1, 4
or a3, a3, a1
+ movi a5, BASE
+ add a3, a3, a5
witlb a2, a3
movi a3, 10f
movi a1, 0x000fffff
and a1, a3, a1
+ add a1, a1, a5
movi a2, 0
wsr a2, excvaddr
movi a2, (\vaddr)
movi a1, 0xfffff
and a1, a1, a2
+ movi a5, BASE
+ add a1, a1, a5
rsr a2, epc1
assert eq, a1, a2
.endm
test dtlb_autoload
set_vector kernel, 0
- pt_setup 0, 3, 1, 0x1000, 0x1000, 3
+ pt_setup 0, 3, 1, BASE + 0x1000, 0x1000, 3
assert_no_auto_tlb
l8ui a1, a3, 0
set_vector kernel, 0
set_vector double, 2f
- pt_setup 0, 3, 0, 0x2000, 0x2000, 3
- movi a3, 0x2004
+ pt_setup 0, 3, 0, BASE + 0x2000, 0x2000, 3
+ movi a3, BASE + 0x2004
assert_no_auto_tlb
movi a2, 0x4005f /* ring 1 + excm => cring == 0 */
test autoload_pte_load_prohibited
set_vector kernel, 2f
- pt_setup 0, 3, 0, 0x3000, 0, 0xc
+ pt_setup 0, 3, 0, BASE + 0x3000, 0, 0xc
assert_no_auto_tlb
1:
l32i a2, a3, 0
test autoload_pt_load_prohibited
set_vector kernel, 2f
- pt_setup 0, 0xc, 0, 0x4000, 0x4000, 3
+ pt_setup 0, 0xc, 0, BASE + 0x4000, 0x4000, 3
assert_no_auto_tlb
1:
l32i a2, a3, 0
test autoload_pt_privilege
set_vector kernel, 2f
- pt_setup 0, 3, 1, 0x5000, 0, 3
- go_ring 1, 0, 0x5001
+ pt_setup 0, 3, 1, BASE + 0x5000, 0, 3
+ go_ring 1, 0, BASE + 0x5001
l8ui a2, a3, 0
1:
test autoload_pte_privilege
set_vector kernel, 2f
- pt_setup 0, 3, 0, 0x6000, 0, 3
- go_ring 1, 0, 0x6001
+ pt_setup 0, 3, 0, BASE + 0x6000, 0, 3
+ go_ring 1, 0, BASE + 0x6001
1:
l8ui a2, a3, 0
syscall
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
+ pt_setup 1, 3, 1, BASE + 0x00400000, 0, 3
+ pt_setup 1, 3, 1, TLB_BASE + ((BASE + 0x00400000) >> 10), 0x2000000, 3
+ go_ring 1, 0, BASE + 0x00400001
1:
l8ui a2, a3, 0
syscall
set_vector kernel, 2f
movi a2, 0x04000003 /* PPN */
- movi a3, 0x00007000 /* VPN */
+ movi a3, BASE + 0x00007000 /* VPN */
witlb a2, a3
wdtlb a2, a3
- movi a3, 0x00008000 /* VPN */
+ movi a3, BASE + 0x00008000 /* VPN */
witlb a2, a3
wdtlb a2, a3
- movi a2, 0x00007fff
+ movi a2, BASE + 0x00007fff
movi a3, 20f
movi a4, 21f
sub a4, a4, a3
addi a2, a2, 1
addi a3, a3, 1
1:
- movi a2, 0x00007fff
- movi a3, 0x00008000
+ movi a2, BASE + 0x00007fff
+ movi a3, BASE + 0x00008000
/* DTLB: OK, ITLB: OK */
jx a2
movi a3, 1
assert eq, a2, a3
rsr a2, epc1
- movi a3, 0x8002
+ movi a3, BASE + 0x8002
assert eq, a2, a3
rsr a2, excsave1
- movi a3, 0x00007fff
+ movi a3, BASE + 0x00007fff
assert ne, a2, a3
reset_ps
set_vector kernel, 3f
movi a2, 0x0400000c /* PPN */
- movi a3, 0x00008000 /* VPN */
+ movi a3, BASE + 0x00008000 /* VPN */
wdtlb a2, a3
- movi a2, 0x00007fff
- movi a3, 0x00008000
+ movi a2, BASE + 0x00007fff
+ movi a3, BASE + 0x00008000
/* DTLB: FAIL, ITLB: OK */
jx a2
3:
movi a3, 28
assert eq, a2, a3
rsr a2, epc1
- movi a3, 0x7fff
+ movi a3, BASE + 0x7fff
assert eq, a2, a3
rsr a2, excsave1
- movi a3, 0x00007fff
+ movi a3, BASE + 0x00007fff
assert eq, a2, a3
reset_ps
set_vector kernel, 4f
movi a2, 0x0400000c /* PPN */
- movi a3, 0x00008000 /* VPN */
+ movi a3, BASE + 0x00008000 /* VPN */
witlb a2, a3
movi a2, 0x04000003 /* PPN */
wdtlb a2, a3
- movi a2, 0x00007fff
- movi a3, 0x00008000
+ movi a2, BASE + 0x00007fff
+ movi a3, BASE + 0x00008000
/* DTLB: OK, ITLB: FAIL */
jx a2
4:
movi a3, 20
assert eq, a2, a3
rsr a2, epc1
- movi a3, 0x7fff
+ movi a3, BASE + 0x7fff
assert eq, a2, a3
rsr a2, excsave1
- movi a3, 0x00007fff
+ movi a3, BASE + 0x00007fff
assert eq, a2, a3
reset_ps
set_vector kernel, 5f
movi a2, 0x0400000c /* PPN */
- movi a3, 0x00008000 /* VPN */
+ movi a3, BASE + 0x00008000 /* VPN */
wdtlb a2, a3
- movi a2, 0x00007fff
- movi a3, 0x00008000
+ movi a2, BASE + 0x00007fff
+ movi a3, BASE + 0x00008000
/* DTLB: FAIL, ITLB: FAIL */
jx a2
5:
movi a3, 20
assert eq, a2, a3
rsr a2, epc1
- movi a3, 0x7fff
+ movi a3, BASE + 0x7fff
assert eq, a2, a3
rsr a2, excsave1
- movi a3, 0x00007fff
+ movi a3, BASE + 0x00007fff
assert eq, a2, a3
test_end
set_vector kernel, 2f
movi a2, 0x04000003 /* PPN */
- movi a3, 0x00007000 /* VPN */
+ movi a3, BASE + 0x00007000 /* VPN */
witlb a2, a3
wdtlb a2, a3
- movi a3, 0x00008000 /* VPN */
+ movi a3, BASE + 0x00008000 /* VPN */
witlb a2, a3
wdtlb a2, a3
- movi a2, 0x00007ffc
+ movi a2, BASE + 0x00007ffc
movi a3, 20f
movi a4, 21f
sub a4, a4, a3
addi a2, a2, 1
addi a3, a3, 1
1:
- movi a2, 0x00007ffc
- movi a3, 0x00008000
+ movi a2, BASE + 0x00007ffc
+ movi a3, BASE + 0x00008000
/* DTLB: OK, ITLB: OK */
jx a2
movi a3, 1
assert eq, a2, a3
rsr a2, epc1
- movi a3, 0x7fff
+ movi a3, BASE + 0x7fff
assert eq, a2, a3
rsr a2, excsave1
- movi a3, 0x00007ffc
+ movi a3, BASE + 0x00007ffc
assert ne, a2, a3
reset_ps
set_vector kernel, 3f
movi a2, 0x0400000c /* PPN */
- movi a3, 0x00008000 /* VPN */
+ movi a3, BASE + 0x00008000 /* VPN */
wdtlb a2, a3
- movi a2, 0x00007ffc
- movi a3, 0x00008000
+ movi a2, BASE + 0x00007ffc
+ movi a3, BASE + 0x00008000
/* DTLB: FAIL, ITLB: OK */
jx a2
3:
movi a3, 28
assert eq, a2, a3
rsr a2, epc1
- movi a3, 0x7ffc
+ movi a3, BASE + 0x7ffc
assert eq, a2, a3
rsr a2, excsave1
- movi a3, 0x00007ffc
+ movi a3, BASE + 0x00007ffc
assert eq, a2, a3
reset_ps
set_vector kernel, 4f
movi a2, 0x0400000c /* PPN */
- movi a3, 0x00008000 /* VPN */
+ movi a3, BASE + 0x00008000 /* VPN */
witlb a2, a3
movi a2, 0x04000003 /* PPN */
wdtlb a2, a3
- movi a2, 0x00007ffc
- movi a3, 0x00008000
+ movi a2, BASE + 0x00007ffc
+ movi a3, BASE + 0x00008000
/* DTLB: OK, ITLB: FAIL */
jx a2
4:
movi a3, 20
assert eq, a2, a3
rsr a2, epc1
- movi a3, 0x7fff
+ movi a3, BASE + 0x7fff
assert eq, a2, a3
rsr a2, excsave1
- movi a3, 0x00007ffc
+ movi a3, BASE + 0x00007ffc
assert ne, a2, a3
reset_ps
set_vector kernel, 5f
movi a2, 0x0400000c /* PPN */
- movi a3, 0x00008000 /* VPN */
+ movi a3, BASE + 0x00008000 /* VPN */
wdtlb a2, a3
- movi a2, 0x00007ffc
- movi a3, 0x00008000
+ movi a2, BASE + 0x00007ffc
+ movi a3, BASE + 0x00008000
/* DTLB: FAIL, ITLB: FAIL */
jx a2
5:
movi a3, 28
assert eq, a2, a3
rsr a2, epc1
- movi a3, 0x7ffc
+ movi a3, BASE + 0x7ffc
assert eq, a2, a3
rsr a2, excsave1
- movi a3, 0x00007ffc
+ movi a3, BASE + 0x00007ffc
assert eq, a2, a3
test_end