text: // See LICENSE for license details.
  
  #ifndef _ENV_VIRTUAL_SINGLE_CORE_H
  #define _ENV_VIRTUAL_SINGLE_CORE_H
  
  #include "../p/riscv_test.h"
  
  //-----------------------------------------------------------------------
  // Begin Macro
  //-----------------------------------------------------------------------
  
  #undef RVTEST_FP_ENABLE
  #define RVTEST_FP_ENABLE fssr x0
  
  #undef RVTEST_VECTOR_ENABLE
  #define RVTEST_VECTOR_ENABLE                                            \
    csrwi fcsr, 0;                                                        \
    csrwi vcsr, 0;
  
  #undef RVTEST_CODE_BEGIN
  #define RVTEST_CODE_BEGIN                                               \
          .text;                                                          \
          .global extra_boot;                                             \
  extra_boot:                                                             \
          EXTRA_INIT                                                      \
          ret;                                                            \
          .global userstart;                                              \
  userstart:                                                              \
          init
  
  //-----------------------------------------------------------------------
  // Pass/Fail Macro
  //-----------------------------------------------------------------------
  
  #undef RVTEST_PASS
  #define RVTEST_PASS li a0, 1; scall
  
  #undef RVTEST_FAIL
  #define RVTEST_FAIL sll a0, TESTNUM, 1; 1:beqz a0, 1b; or a0, a0, 1; scall;
  
  //-----------------------------------------------------------------------
  // Data Section Macro
  //-----------------------------------------------------------------------
  
  #undef RVTEST_DATA_BEGIN
  #define RVTEST_DATA_BEGIN                                               \
          .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:
  
  #undef RVTEST_DATA_END
  #define RVTEST_DATA_END \
          .align 4; .global end_signature; end_signature:
  
  //-----------------------------------------------------------------------
  // Supervisor mode definitions and macros
  //-----------------------------------------------------------------------
  
  #define MAX_TEST_PAGES 127 // this must be the period of the LFSR below
  #define LFSR_NEXT(x) (((((x)^((x)>>1)) & 1) << 5) | ((x) >> 1))
  
  #define PGSHIFT 12
  #define PGSIZE (1UL << PGSHIFT)
  
  #define SIZEOF_TRAPFRAME_T ((__riscv_xlen / 8) * 36)
  
  #ifndef __ASSEMBLER__
  
  typedef unsigned long pte_t;
  #define LEVELS (sizeof(pte_t) == sizeof(uint64_t) ? 3 : 2)
  #define PTIDXBITS (PGSHIFT - (sizeof(pte_t) == 8 ? 3 : 2))
  #define VPN_BITS (PTIDXBITS * LEVELS)
  #define VA_BITS (VPN_BITS + PGSHIFT)
  #define PTES_PER_PT (1UL << RISCV_PGLEVEL_BITS)
  #define MEGAPAGE_SIZE (PTES_PER_PT * PGSIZE)
  
  typedef struct
  {
    long gpr[32];
    long sr;
    long epc;
    long badvaddr;
    long cause;
  } trapframe_t;
  #endif
  
  #endif
  