112771Sqtt2@cornell.edu# See LICENSE for license details.
212771Sqtt2@cornell.edu
312771Sqtt2@cornell.edu#*****************************************************************************
412771Sqtt2@cornell.edu# scall.S
512771Sqtt2@cornell.edu#-----------------------------------------------------------------------------
612771Sqtt2@cornell.edu#
712771Sqtt2@cornell.edu# Test syscall trap.
812771Sqtt2@cornell.edu#
912771Sqtt2@cornell.edu
1012771Sqtt2@cornell.edu#include "riscv_test.h"
1112771Sqtt2@cornell.edu#include "test_macros.h"
1212771Sqtt2@cornell.edu
1312771Sqtt2@cornell.eduRVTEST_RV64S
1412771Sqtt2@cornell.eduRVTEST_CODE_BEGIN
1512771Sqtt2@cornell.edu
1612771Sqtt2@cornell.edu#ifdef __MACHINE_MODE
1712771Sqtt2@cornell.edu  #define sscratch mscratch
1812771Sqtt2@cornell.edu  #define sstatus mstatus
1912771Sqtt2@cornell.edu  #define scause mcause
2012771Sqtt2@cornell.edu  #define sepc mepc
2112771Sqtt2@cornell.edu  #define sret mret
2212771Sqtt2@cornell.edu  #define stvec_handler mtvec_handler
2312771Sqtt2@cornell.edu  #undef SSTATUS_SPP
2412771Sqtt2@cornell.edu  #define SSTATUS_SPP MSTATUS_MPP
2512771Sqtt2@cornell.edu#endif
2612771Sqtt2@cornell.edu
2712771Sqtt2@cornell.edu  li TESTNUM, 2
2812771Sqtt2@cornell.edu
2912771Sqtt2@cornell.edu  # This is the expected trap code.
3012771Sqtt2@cornell.edu  li t1, CAUSE_USER_ECALL
3112771Sqtt2@cornell.edu
3212771Sqtt2@cornell.edu#ifdef __MACHINE_MODE
3312771Sqtt2@cornell.edu  # If running in M mode, use mstatus.MPP to check existence of U mode.
3412771Sqtt2@cornell.edu  # Otherwise, if in S mode, then U mode must exist and we don't need to check.
3512771Sqtt2@cornell.edu  li t0, MSTATUS_MPP
3612771Sqtt2@cornell.edu  csrc mstatus, t0
3712771Sqtt2@cornell.edu  csrr t1, mstatus
3812771Sqtt2@cornell.edu  and t0, t0, t1
3912771Sqtt2@cornell.edu  beqz t0, 1f
4012771Sqtt2@cornell.edu
4112771Sqtt2@cornell.edu  # If U mode doesn't exist, mcause should indicate ECALL from M mode.
4212771Sqtt2@cornell.edu  li t1, CAUSE_MACHINE_ECALL
4312771Sqtt2@cornell.edu#endif
4412771Sqtt2@cornell.edu
4512771Sqtt2@cornell.edu1:
4612771Sqtt2@cornell.edu  li t0, SSTATUS_SPP
4712771Sqtt2@cornell.edu  csrc sstatus, t0
4812771Sqtt2@cornell.edu  la t0, 1f
4912771Sqtt2@cornell.edu  csrw sepc, t0
5012771Sqtt2@cornell.edu  sret
5112771Sqtt2@cornell.edu1:
5212771Sqtt2@cornell.edu
5312771Sqtt2@cornell.edu  li TESTNUM, 1
5412771Sqtt2@cornell.edudo_scall:
5512771Sqtt2@cornell.edu  scall
5612771Sqtt2@cornell.edu  j fail
5712771Sqtt2@cornell.edu
5812771Sqtt2@cornell.edu  TEST_PASSFAIL
5912771Sqtt2@cornell.edu
6012771Sqtt2@cornell.edu  .align 2
6112771Sqtt2@cornell.edu  .global stvec_handler
6212771Sqtt2@cornell.edustvec_handler:
6312771Sqtt2@cornell.edu  csrr t0, scause
6412771Sqtt2@cornell.edu  bne t0, t1, fail
6512771Sqtt2@cornell.edu  la t2, do_scall
6612771Sqtt2@cornell.edu  csrr t0, sepc
6712771Sqtt2@cornell.edu  bne t0, t2, fail
6812771Sqtt2@cornell.edu  j pass
6912771Sqtt2@cornell.edu
7012771Sqtt2@cornell.eduRVTEST_CODE_END
7112771Sqtt2@cornell.edu
7212771Sqtt2@cornell.edu  .data
7312771Sqtt2@cornell.eduRVTEST_DATA_BEGIN
7412771Sqtt2@cornell.edu
7512771Sqtt2@cornell.edu  TEST_DATA
7612771Sqtt2@cornell.edu
7712771Sqtt2@cornell.eduRVTEST_DATA_END
78