157 lines
6.9 KiB
C
157 lines
6.9 KiB
C
// See LICENSE for license details.
|
|
|
|
#ifndef __RISCV_TEST_H
|
|
#define __RISCV_TEST_H
|
|
|
|
#ifndef __riscv_xlen
|
|
#define __riscv_xlen 32
|
|
#endif
|
|
|
|
//-----------------------------------------------------------------------
|
|
// 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_SPTBR \
|
|
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
|
|
|
|
#define INTERRUPT_HANDLER j other_exception /* No interrupts should occur */
|
|
|
|
#define RVTEST_CODE_BEGIN \
|
|
.section .text.init; \
|
|
.align 6; \
|
|
.globl _start; \
|
|
_start: \
|
|
csrrwi x0, sstatus, 0x0;
|
|
|
|
//-----------------------------------------------------------------------
|
|
// End Macro
|
|
//-----------------------------------------------------------------------
|
|
|
|
#define RVTEST_CODE_END
|
|
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Pass/Fail Macro
|
|
//-----------------------------------------------------------------------
|
|
|
|
#define RVTEST_PASS \
|
|
csrrwi x0, sstatus, 0x3; \
|
|
loop_pass: \
|
|
j loop_pass
|
|
|
|
#define TESTNUM gp
|
|
|
|
#define RVTEST_FAIL \
|
|
csrrwi x0, sstatus, 0x1; \
|
|
loop_fail: \
|
|
j loop_fail
|
|
|
|
//-----------------------------------------------------------------------
|
|
// 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
|