| # See LICENSE for license details. |
| |
| #***************************************************************************** |
| # icache-alias.S |
| #----------------------------------------------------------------------------- |
| # |
| # Test that instruction memory appears to be physically addressed, i.e., |
| # that disagreements in the low-order VPN and PPN bits don't cause the |
| # wrong instruction to be fetched. It also tests that changing a page |
| # mapping takes effect without executing FENCE.I. |
| # |
| |
| #include "riscv_test.h" |
| #include "test_macros.h" |
| |
| RVTEST_RV64M |
| RVTEST_CODE_BEGIN |
| |
| li TESTNUM, 2 |
| |
| # Set up intermediate page tables |
| |
| la t0, page_table_3 |
| srl t0, t0, RISCV_PGSHIFT - PTE_PPN_SHIFT |
| ori t0, t0, PTE_V |
| sd t0, page_table_2, t1 |
| |
| la t0, page_table_2 |
| srl t0, t0, RISCV_PGSHIFT - PTE_PPN_SHIFT |
| ori t0, t0, PTE_V |
| sd t0, page_table_1, t1 |
| |
| # Set up leaf mappings where va[12] != pa[12] |
| |
| la t0, code_page_1 |
| srl t0, t0, RISCV_PGSHIFT - PTE_PPN_SHIFT |
| ori t0, t0, PTE_V | PTE_X | PTE_A |
| sd t0, page_table_3 + 8, t1 |
| |
| la t0, code_page_2 |
| srl t0, t0, RISCV_PGSHIFT - PTE_PPN_SHIFT |
| ori t0, t0, PTE_V | PTE_X | PTE_A |
| sd t0, page_table_3 + 0, t1 |
| |
| # Turn on VM |
| |
| li a0, (SATP_MODE & ~(SATP_MODE<<1)) * SATP_MODE_SV39 |
| la a1, page_table_1 |
| srl a1, a1, RISCV_PGSHIFT |
| or a1, a1, a0 |
| csrw sptbr, a1 |
| sfence.vma |
| |
| # Enter supervisor mode and make sure correct page is accessed |
| |
| la a2, 1f |
| csrwi mepc, 0 |
| li a1, ((MSTATUS_MPP & ~(MSTATUS_MPP<<1)) * PRV_S) |
| csrs mstatus, a1 |
| mret |
| |
| 1: |
| li TESTNUM, 2 |
| addi a0, a0, -321 |
| bnez a0, fail |
| |
| li TESTNUM, 3 |
| la a2, 1f |
| li t0, RISCV_PGSIZE |
| csrw mepc, t0 |
| mret |
| |
| 1: |
| addi a0, a0, -123 |
| bnez a0, fail |
| |
| li TESTNUM, 4 |
| la a2, 1f |
| csrwi mepc, 0 |
| mret |
| |
| .align 2 |
| 1: |
| addi a0, a0, -321 |
| bnez a0, fail |
| |
| li TESTNUM, 5 |
| |
| # Change mapping and try again |
| |
| la t0, code_page_1 |
| srl t0, t0, RISCV_PGSHIFT - PTE_PPN_SHIFT |
| ori t0, t0, PTE_V | PTE_X | PTE_A |
| sd t0, page_table_3 + 0, t1 |
| sfence.vma |
| |
| la a2, 1f |
| csrwi mepc, 0 |
| mret |
| |
| .align 2 |
| 1: |
| addi a0, a0, -123 |
| bnez a0, fail |
| |
| RVTEST_PASS |
| |
| TEST_PASSFAIL |
| |
| .align 2 |
| .global mtvec_handler |
| mtvec_handler: |
| csrr t0, mcause |
| add t0, t0, -CAUSE_STORE_PAGE_FAULT |
| bnez t0, fail |
| |
| jr a2 |
| |
| RVTEST_CODE_END |
| |
| .data |
| RVTEST_DATA_BEGIN |
| |
| TEST_DATA |
| |
| .align 12 |
| page_table_1: .dword 0 |
| .align 12 |
| page_table_2: .dword 0 |
| .align 12 |
| page_table_3: .dword 0 |
| .align 13 |
| code_page_1: |
| li a0, 123 |
| sw x0, (x0) |
| .align 12 |
| code_page_2: |
| li a0, 321 |
| sw x0, (x0) |
| |
| RVTEST_DATA_END |