| // See LICENSE for license details. |
| |
| #ifndef _ENV_PHYSICAL_SINGLE_CORE_H |
| #define _ENV_PHYSICAL_SINGLE_CORE_H |
| |
| #include "../encoding.h" |
| |
| //----------------------------------------------------------------------- |
| // Begin Macro |
| //----------------------------------------------------------------------- |
| |
| #define RVTEST_RV64U \ |
| .macro init; \ |
| .endm |
| |
| #define RVTEST_RV64UF \ |
| .macro init; \ |
| RVTEST_FP_ENABLE; \ |
| .endm |
| |
| #define RVTEST_RV32U \ |
| .macro init; \ |
| .endm |
| |
| #define RVTEST_RV32UF \ |
| .macro init; \ |
| RVTEST_FP_ENABLE; \ |
| .endm |
| |
| #define RVTEST_RV64M \ |
| .macro init; \ |
| RVTEST_ENABLE_MACHINE; \ |
| .endm |
| |
| #define RVTEST_RV64S \ |
| .macro init; \ |
| RVTEST_ENABLE_SUPERVISOR; \ |
| .endm |
| |
| #define RVTEST_RV32M \ |
| .macro init; \ |
| RVTEST_ENABLE_MACHINE; \ |
| .endm |
| |
| #define RVTEST_RV32S \ |
| .macro init; \ |
| RVTEST_ENABLE_SUPERVISOR; \ |
| .endm |
| |
| #if __riscv_xlen == 64 |
| # define CHECK_XLEN li a0, 1; slli a0, a0, 31; bgez a0, 1f; RVTEST_PASS; 1: |
| #else |
| # define CHECK_XLEN li a0, 1; slli a0, a0, 31; bltz a0, 1f; RVTEST_PASS; 1: |
| #endif |
| |
| #define INIT_PMP \ |
| la t0, 1f; \ |
| csrw mtvec, t0; \ |
| li t0, -1; /* Set up a PMP to permit all accesses */ \ |
| csrw pmpaddr0, t0; \ |
| li t0, PMP_NAPOT | PMP_R | PMP_W | PMP_X; \ |
| csrw pmpcfg0, t0; \ |
| .align 2; \ |
| 1: |
| |
| #define INIT_SATP \ |
| la t0, 1f; \ |
| csrw mtvec, t0; \ |
| csrwi sptbr, 0; \ |
| .align 2; \ |
| 1: |
| |
| #define DELEGATE_NO_TRAPS \ |
| la t0, 1f; \ |
| csrw mtvec, t0; \ |
| csrwi medeleg, 0; \ |
| csrwi mideleg, 0; \ |
| csrwi mie, 0; \ |
| .align 2; \ |
| 1: |
| |
| #define RVTEST_ENABLE_SUPERVISOR \ |
| li a0, MSTATUS_MPP & (MSTATUS_MPP >> 1); \ |
| csrs mstatus, a0; \ |
| li a0, SIP_SSIP | SIP_STIP; \ |
| csrs mideleg, a0; \ |
| |
| #define RVTEST_ENABLE_MACHINE \ |
| li a0, MSTATUS_MPP; \ |
| csrs mstatus, a0; \ |
| |
| #define RVTEST_FP_ENABLE \ |
| li a0, MSTATUS_FS & (MSTATUS_FS >> 1); \ |
| csrs mstatus, a0; \ |
| csrwi fcsr, 0 |
| |
| #define RISCV_MULTICORE_DISABLE \ |
| csrr a0, mhartid; \ |
| 1: bnez a0, 1b |
| |
| #define EXTRA_TVEC_USER |
| #define EXTRA_TVEC_MACHINE |
| #define EXTRA_INIT |
| #define EXTRA_INIT_TIMER |
| |
| //----------------------------------------------------------------------- |
| // Begin Macro |
| // Jump to the first test case |
| //----------------------------------------------------------------------- |
| |
| #define RVTEST_CODE_BEGIN \ |
| .section .text.init; \ |
| .align 6; \ |
| .weak stvec_handler; \ |
| .weak mtvec_handler; \ |
| .globl _start; \ |
| _start: \ |
| la t0, 1f; \ |
| jr t0; \ |
| .align 2; \ |
| 1: |
| |
| //----------------------------------------------------------------------- |
| // RVTEST_CODE_END Macro |
| // Call exit syscall to terminate the simulation |
| //----------------------------------------------------------------------- |
| |
| #define EXIT_SYSCALL 93 |
| #define RVTEST_CODE_END \ |
| li a7, EXIT_SYSCALL; \ |
| ecall |
| |
| //----------------------------------------------------------------------- |
| // RVTEST_PASS Macro |
| // Pass 0 as a return code to an EXIT ecall |
| //----------------------------------------------------------------------- |
| |
| #define TESTNUM gp |
| #define RVTEST_PASS \ |
| fence; \ |
| li a0, 0; |
| |
| //----------------------------------------------------------------------- |
| // RVTEST_FAIL Macro |
| // Pass test case number as a return code to an EXIT ecall |
| //----------------------------------------------------------------------- |
| |
| #define TESTNUM gp |
| #define RVTEST_FAIL \ |
| fence; \ |
| mv a0, TESTNUM; \ |
| RVTEST_CODE_END |
| |
| //----------------------------------------------------------------------- |
| // Data Section Macro |
| //----------------------------------------------------------------------- |
| |
| #define EXTRA_DATA |
| |
| #define RVTEST_DATA_BEGIN \ |
| EXTRA_DATA \ |
| .pushsection .tohost,"aw",@progbits; \ |
| .align 6; .global tohost; tohost: .dword 0; \ |
| .align 6; .global fromhost; fromhost: .dword 0; \ |
| .popsection; \ |
| .align 4; .global begin_signature; begin_signature: |
| |
| #define RVTEST_DATA_END .align 4; .global end_signature; end_signature: |
| |
| #endif |