 da60ecd6d8
			
		
	
	
		da60ecd6d8
		
	
	
	
	
		
			
			MMU test suite is disabled for cores that have spanning TLB way, i.e. for all MMUv3 cores. Instead of disabling it make testing region virtual addresses explicit and invalidate TLB mappings for entries that conflict with the test. Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
		
			
				
	
	
		
			772 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			772 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| #include "macros.inc"
 | |
| 
 | |
| test_suite mmu
 | |
| 
 | |
| #if XCHAL_HAVE_PTP_MMU
 | |
| #define BASE 0x20000000
 | |
| #define TLB_BASE 0x80000000
 | |
| 
 | |
| .purgem test_init
 | |
| 
 | |
| .macro clean_tlb_way way, page_size, n_entries
 | |
|     movi    a2, \way
 | |
|     movi    a3, \page_size
 | |
|     movi    a4, \n_entries
 | |
|     loop    a4, 1f
 | |
|     idtlb   a2
 | |
|     iitlb   a2
 | |
|     add     a2, a2, a3
 | |
| 1:
 | |
| .endm
 | |
| 
 | |
| .macro test_init
 | |
|     clean_tlb_way 0, 0x00001000, 4
 | |
|     clean_tlb_way 1, 0x00001000, 4
 | |
|     clean_tlb_way 2, 0x00001000, 4
 | |
|     clean_tlb_way 3, 0x00001000, 4
 | |
|     clean_tlb_way 4, 0x00100000, 4
 | |
|     movi    a2, 0x00000007
 | |
|     idtlb   a2
 | |
|     movi    a2, 0x00000008
 | |
|     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, BASE + 0x01200004 /* VPN */
 | |
|     wdtlb   a2, a3
 | |
|     witlb   a2, a3
 | |
|     movi    a3, 0x00200004
 | |
|     rdtlb0  a1, a3
 | |
|     ritlb0  a2, a3
 | |
|     movi    a3, BASE + 0x01000001
 | |
|     assert  eq, a1, a3
 | |
|     assert  eq, a2, a3
 | |
|     movi    a3, 0x00200004
 | |
|     rdtlb1  a1, a3
 | |
|     ritlb1  a2, a3
 | |
|     movi    a3, 0x04000002
 | |
|     assert  eq, a1, a3
 | |
|     assert  eq, a2, a3
 | |
|     movi    a3, BASE + 0x01234567
 | |
|     pdtlb   a1, a3
 | |
|     pitlb   a2, a3
 | |
|     movi    a3, BASE + 0x01234014
 | |
|     assert  eq, a1, a3
 | |
|     movi    a3, BASE + 0x0123400c
 | |
|     assert  eq, a2, a3
 | |
|     movi    a3, 0x00200004
 | |
|     idtlb   a3
 | |
|     iitlb   a3
 | |
|     movi    a3, BASE + 0x01234567
 | |
|     pdtlb   a1, a3
 | |
|     pitlb   a2, a3
 | |
|     movi    a3, 0x00000010
 | |
|     and     a1, a1, a3
 | |
|     assert  eqi, a1, 0
 | |
|     movi    a3, 0x00000008
 | |
|     and     a2, a2, a3
 | |
|     assert  eqi, a2, 0
 | |
| test_end
 | |
| 
 | |
| test itlb_miss
 | |
|     set_vector kernel, 1f
 | |
| 
 | |
|     movi    a3, BASE + 0x00100000
 | |
|     jx      a3
 | |
|     test_fail
 | |
| 1:
 | |
|     rsr     a2, excvaddr
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 16
 | |
|     assert  eq, a2, a3
 | |
| test_end
 | |
| 
 | |
| test dtlb_miss
 | |
|     set_vector kernel, 1f
 | |
| 
 | |
|     movi    a3, BASE + 0x00100000
 | |
|     l8ui    a2, a3, 0
 | |
|     test_fail
 | |
| 1:
 | |
|     rsr     a2, excvaddr
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 24
 | |
|     assert  eq, a2, a3
 | |
| test_end
 | |
| 
 | |
| test itlb_multi_hit
 | |
|     set_vector kernel, 1f
 | |
| 
 | |
|     movi    a2, 0x04000002 /* PPN */
 | |
|     movi    a3, 0xf0000004 /* VPN */
 | |
|     witlb   a2, a3
 | |
|     movi    a3, 0xf0000000
 | |
|     pitlb   a2, a3
 | |
|     test_fail
 | |
| 1:
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 17
 | |
|     assert  eq, a2, a3
 | |
| test_end
 | |
| 
 | |
| test dtlb_multi_hit
 | |
|     set_vector kernel, 1f
 | |
| 
 | |
|     movi    a2, 0x04000002 /* PPN */
 | |
|     movi    a3, BASE + 0x01200004 /* VPN */
 | |
|     wdtlb   a2, a3
 | |
|     movi    a3, BASE + 0x01200007 /* VPN */
 | |
|     wdtlb   a2, a3
 | |
|     movi    a3, BASE + 0x01200000
 | |
|     pdtlb   a2, a3
 | |
|     test_fail
 | |
| 1:
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 25
 | |
|     assert  eq, a2, a3
 | |
| test_end
 | |
| 
 | |
| test inst_fetch_privilege
 | |
|     set_vector kernel, 3f
 | |
| 
 | |
|     movi    a2, 0x4004f
 | |
|     wsr     a2, ps
 | |
| 1:
 | |
|     isync
 | |
|     nop
 | |
| 2:
 | |
|     test_fail
 | |
| 3:
 | |
|     movi    a1, 1b
 | |
|     rsr     a2, excvaddr
 | |
|     rsr     a3, epc1
 | |
|     assert  ge, a2, a1
 | |
|     assert  ge, a3, a1
 | |
|     movi    a1, 2b
 | |
|     assert  lt, a2, a1
 | |
|     assert  lt, a3, a1
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 18
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, ps
 | |
|     movi    a3, 0x4005f
 | |
|     assert  eq, a2, a3
 | |
| test_end
 | |
| 
 | |
| test load_store_privilege
 | |
|     set_vector kernel, 2f
 | |
| 
 | |
|     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
 | |
|     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, BASE + 0x01200004 /* VPN */
 | |
|     wdtlb   a2, a3
 | |
|     movi    a3, BASE + 0x01200001
 | |
|     movi    a2, 0x4004f
 | |
|     jx      a1
 | |
| 10:
 | |
|     wsr     a2, ps
 | |
|     isync
 | |
| 1:
 | |
|     l8ui    a2, a3, 0
 | |
|     test_fail
 | |
| 2:
 | |
|     rsr     a2, excvaddr
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, epc1
 | |
|     movi    a3, 1b
 | |
|     movi    a1, 0x000fffff
 | |
|     and     a3, a3, a1
 | |
|     add     a3, a3, a5
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 26
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, ps
 | |
|     movi    a3, 0x4005f
 | |
|     assert  eq, a2, a3
 | |
| test_end
 | |
| 
 | |
| test cring_load_store_privilege
 | |
|     set_vector kernel, 0
 | |
|     set_vector double, 2f
 | |
| 
 | |
|     movi    a2, 0x04000003 /* PPN */
 | |
|     movi    a3, BASE + 0x01200004 /* VPN */
 | |
|     wdtlb   a2, a3
 | |
|     movi    a3, BASE + 0x01200004
 | |
|     movi    a2, 0x4005f    /* ring 1 + excm => cring == 0 */
 | |
|     wsr     a2, ps
 | |
|     isync
 | |
|     l8ui    a2, a3, 0      /* cring used */
 | |
| 1:
 | |
|     l32e    a2, a3, -4     /* ring used */
 | |
|     test_fail
 | |
| 2:
 | |
|     rsr     a2, excvaddr
 | |
|     addi    a2, a2, 4
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, depc
 | |
|     movi    a3, 1b
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 26
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, ps
 | |
|     movi    a3, 0x4005f
 | |
|     assert  eq, a2, a3
 | |
| test_end
 | |
| 
 | |
| test inst_fetch_prohibited
 | |
|     set_vector kernel, 2f
 | |
| 
 | |
|     movi    a3, 10f
 | |
|     pitlb   a3, a3
 | |
|     ritlb1  a2, a3
 | |
|     movi    a1, 0xfffff000
 | |
|     and     a2, a2, a1
 | |
|     movi    a1, 0x4
 | |
|     or      a2, a2, a1
 | |
|     movi    a1, 0x000ff000
 | |
|     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:
 | |
|     nop
 | |
|     test_fail
 | |
| 2:
 | |
|     rsr     a2, excvaddr
 | |
|     assert  eq, a2, a1
 | |
|     rsr     a2, epc1
 | |
|     assert  eq, a2, a1
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 20
 | |
|     assert  eq, a2, a3
 | |
| test_end
 | |
| 
 | |
| test load_prohibited
 | |
|     set_vector kernel, 2f
 | |
| 
 | |
|     movi    a2, 0x0400000c /* PPN */
 | |
|     movi    a3, BASE + 0x01200004 /* VPN */
 | |
|     wdtlb   a2, a3
 | |
|     movi    a3, BASE + 0x01200002
 | |
| 1:
 | |
|     l8ui    a2, a3, 0
 | |
|     test_fail
 | |
| 2:
 | |
|     rsr     a2, excvaddr
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, epc1
 | |
|     movi    a3, 1b
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 28
 | |
|     assert  eq, a2, a3
 | |
| test_end
 | |
| 
 | |
| test store_prohibited
 | |
|     set_vector kernel, 2f
 | |
| 
 | |
|     movi    a2, 0x04000001 /* PPN */
 | |
|     movi    a3, BASE + 0x01200004 /* VPN */
 | |
|     wdtlb   a2, a3
 | |
|     movi    a3, BASE + 0x01200003
 | |
|     l8ui    a2, a3, 0
 | |
| 1:
 | |
|     s8i     a2, a3, 0
 | |
|     test_fail
 | |
| 2:
 | |
|     rsr     a2, excvaddr
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, epc1
 | |
|     movi    a3, 1b
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 29
 | |
|     assert  eq, a2, a3
 | |
| test_end
 | |
| 
 | |
| /* 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, TLB_BASE
 | |
|     wsr     a2, ptevaddr
 | |
| 
 | |
|     movi    a3, TLB_BASE | 7 | (((\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, TLB_BASE | 7 | (((\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
 | |
|     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    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
 | |
|     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, BASE + 0x1000, 0x1000, 3
 | |
|     assert_no_auto_tlb
 | |
| 
 | |
|     l8ui    a1, a3, 0
 | |
| 
 | |
|     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, BASE + 0x2000, 0x2000, 3
 | |
|     movi    a3, BASE + 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, BASE + 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, BASE + 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, BASE + 0x5000, 0, 3
 | |
|     go_ring     1, 0, BASE + 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, BASE + 0x6000, 0, 3
 | |
|     go_ring     1, 0, BASE + 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, 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
 | |
| 2:
 | |
|     rsr     a2, excvaddr
 | |
|     assert  eq, a2, a3
 | |
| 
 | |
|     assert_no_auto_tlb
 | |
|     assert_epc1_1m 1b
 | |
|     assert_sr exccause, 24
 | |
| test_end
 | |
| 
 | |
| test cross_page_insn
 | |
|     set_vector kernel, 2f
 | |
| 
 | |
|     movi    a2, 0x04000003 /* PPN */
 | |
|     movi    a3, BASE + 0x00007000 /* VPN */
 | |
|     witlb   a2, a3
 | |
|     wdtlb   a2, a3
 | |
|     movi    a3, BASE + 0x00008000 /* VPN */
 | |
|     witlb   a2, a3
 | |
|     wdtlb   a2, a3
 | |
| 
 | |
|     movi    a2, BASE + 0x00007fff
 | |
|     movi    a3, 20f
 | |
|     movi    a4, 21f
 | |
|     sub     a4, a4, a3
 | |
|     loop    a4, 1f
 | |
|     l8ui    a5, a3, 0
 | |
|     s8i     a5, a2, 0
 | |
|     addi    a2, a2, 1
 | |
|     addi    a3, a3, 1
 | |
| 1:
 | |
|     movi    a2, BASE + 0x00007fff
 | |
|     movi    a3, BASE + 0x00008000
 | |
|     /* DTLB: OK, ITLB: OK */
 | |
|     jx      a2
 | |
| 
 | |
|     .begin  no-transform
 | |
| 20:
 | |
|     l32i    a2, a3, 0
 | |
|     syscall
 | |
| 21:
 | |
|     .end    no-transform
 | |
| 
 | |
| 2:
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 1
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, epc1
 | |
|     movi    a3, BASE + 0x8002
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, excsave1
 | |
|     movi    a3, BASE + 0x00007fff
 | |
|     assert  ne, a2, a3
 | |
| 
 | |
|     reset_ps
 | |
|     set_vector kernel, 3f
 | |
| 
 | |
|     movi    a2, 0x0400000c /* PPN */
 | |
|     movi    a3, BASE + 0x00008000 /* VPN */
 | |
|     wdtlb   a2, a3
 | |
|     movi    a2, BASE + 0x00007fff
 | |
|     movi    a3, BASE + 0x00008000
 | |
|     /* DTLB: FAIL, ITLB: OK */
 | |
|     jx      a2
 | |
| 3:
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 28
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, epc1
 | |
|     movi    a3, BASE + 0x7fff
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, excsave1
 | |
|     movi    a3, BASE + 0x00007fff
 | |
|     assert  eq, a2, a3
 | |
| 
 | |
|     reset_ps
 | |
|     set_vector kernel, 4f
 | |
| 
 | |
|     movi    a2, 0x0400000c /* PPN */
 | |
|     movi    a3, BASE + 0x00008000 /* VPN */
 | |
|     witlb   a2, a3
 | |
|     movi    a2, 0x04000003 /* PPN */
 | |
|     wdtlb   a2, a3
 | |
|     movi    a2, BASE + 0x00007fff
 | |
|     movi    a3, BASE + 0x00008000
 | |
|     /* DTLB: OK, ITLB: FAIL */
 | |
|     jx      a2
 | |
| 4:
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 20
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, epc1
 | |
|     movi    a3, BASE + 0x7fff
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, excsave1
 | |
|     movi    a3, BASE + 0x00007fff
 | |
|     assert  eq, a2, a3
 | |
| 
 | |
|     reset_ps
 | |
|     set_vector kernel, 5f
 | |
| 
 | |
|     movi    a2, 0x0400000c /* PPN */
 | |
|     movi    a3, BASE + 0x00008000 /* VPN */
 | |
|     wdtlb   a2, a3
 | |
|     movi    a2, BASE + 0x00007fff
 | |
|     movi    a3, BASE + 0x00008000
 | |
|     /* DTLB: FAIL, ITLB: FAIL */
 | |
|     jx      a2
 | |
| 5:
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 20
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, epc1
 | |
|     movi    a3, BASE + 0x7fff
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, excsave1
 | |
|     movi    a3, BASE + 0x00007fff
 | |
|     assert  eq, a2, a3
 | |
| test_end
 | |
| 
 | |
| test cross_page_tb
 | |
|     set_vector kernel, 2f
 | |
| 
 | |
|     movi    a2, 0x04000003 /* PPN */
 | |
|     movi    a3, BASE + 0x00007000 /* VPN */
 | |
|     witlb   a2, a3
 | |
|     wdtlb   a2, a3
 | |
|     movi    a3, BASE + 0x00008000 /* VPN */
 | |
|     witlb   a2, a3
 | |
|     wdtlb   a2, a3
 | |
| 
 | |
|     movi    a2, BASE + 0x00007ffc
 | |
|     movi    a3, 20f
 | |
|     movi    a4, 21f
 | |
|     sub     a4, a4, a3
 | |
|     loop    a4, 1f
 | |
|     l8ui    a5, a3, 0
 | |
|     s8i     a5, a2, 0
 | |
|     addi    a2, a2, 1
 | |
|     addi    a3, a3, 1
 | |
| 1:
 | |
|     movi    a2, BASE + 0x00007ffc
 | |
|     movi    a3, BASE + 0x00008000
 | |
|     /* DTLB: OK, ITLB: OK */
 | |
|     jx      a2
 | |
| 
 | |
|     .begin  no-transform
 | |
| 20:
 | |
|     l32i    a2, a3, 0
 | |
|     syscall
 | |
| 21:
 | |
|     .end    no-transform
 | |
| 
 | |
| 2:
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 1
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, epc1
 | |
|     movi    a3, BASE + 0x7fff
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, excsave1
 | |
|     movi    a3, BASE + 0x00007ffc
 | |
|     assert  ne, a2, a3
 | |
| 
 | |
|     reset_ps
 | |
|     set_vector kernel, 3f
 | |
| 
 | |
|     movi    a2, 0x0400000c /* PPN */
 | |
|     movi    a3, BASE + 0x00008000 /* VPN */
 | |
|     wdtlb   a2, a3
 | |
|     movi    a2, BASE + 0x00007ffc
 | |
|     movi    a3, BASE + 0x00008000
 | |
|     /* DTLB: FAIL, ITLB: OK */
 | |
|     jx      a2
 | |
| 3:
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 28
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, epc1
 | |
|     movi    a3, BASE + 0x7ffc
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, excsave1
 | |
|     movi    a3, BASE + 0x00007ffc
 | |
|     assert  eq, a2, a3
 | |
| 
 | |
|     reset_ps
 | |
|     set_vector kernel, 4f
 | |
| 
 | |
|     movi    a2, 0x0400000c /* PPN */
 | |
|     movi    a3, BASE + 0x00008000 /* VPN */
 | |
|     witlb   a2, a3
 | |
|     movi    a2, 0x04000003 /* PPN */
 | |
|     wdtlb   a2, a3
 | |
|     movi    a2, BASE + 0x00007ffc
 | |
|     movi    a3, BASE + 0x00008000
 | |
|     /* DTLB: OK, ITLB: FAIL */
 | |
|     jx      a2
 | |
| 4:
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 20
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, epc1
 | |
|     movi    a3, BASE + 0x7fff
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, excsave1
 | |
|     movi    a3, BASE + 0x00007ffc
 | |
|     assert  ne, a2, a3
 | |
| 
 | |
|     reset_ps
 | |
|     set_vector kernel, 5f
 | |
| 
 | |
|     movi    a2, 0x0400000c /* PPN */
 | |
|     movi    a3, BASE + 0x00008000 /* VPN */
 | |
|     wdtlb   a2, a3
 | |
|     movi    a2, BASE + 0x00007ffc
 | |
|     movi    a3, BASE + 0x00008000
 | |
|     /* DTLB: FAIL, ITLB: FAIL */
 | |
|     jx      a2
 | |
| 5:
 | |
|     rsr     a2, exccause
 | |
|     movi    a3, 28
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, epc1
 | |
|     movi    a3, BASE + 0x7ffc
 | |
|     assert  eq, a2, a3
 | |
|     rsr     a2, excsave1
 | |
|     movi    a3, BASE + 0x00007ffc
 | |
|     assert  eq, a2, a3
 | |
| test_end
 | |
| 
 | |
| #endif
 | |
| 
 | |
| test_suite_end
 |