aboutsummaryrefslogtreecommitdiff
path: root/isa/rv64si/ma_fetch.S
diff options
context:
space:
mode:
Diffstat (limited to 'isa/rv64si/ma_fetch.S')
-rw-r--r--isa/rv64si/ma_fetch.S83
1 files changed, 83 insertions, 0 deletions
diff --git a/isa/rv64si/ma_fetch.S b/isa/rv64si/ma_fetch.S
new file mode 100644
index 0000000..ae8377d
--- /dev/null
+++ b/isa/rv64si/ma_fetch.S
@@ -0,0 +1,83 @@
+# See LICENSE for license details.
+
+#*****************************************************************************
+# ma_fetch.S
+#-----------------------------------------------------------------------------
+#
+# Test misaligned fetch trap.
+#
+
+#include "riscv_test.h"
+#include "test_macros.h"
+
+RVTEST_RV64S
+RVTEST_CODE_BEGIN
+
+ la t0, stvec
+ csrw stvec, t0
+
+#ifndef __rvc
+ li TESTNUM, 2
+ li t1, 0
+ la t0, 1f
+ jalr t1, t0, 2
+1:
+ j fail
+#endif
+
+ // This test should pass, since JALR ignores the target LSB
+ li TESTNUM, 3
+ la t0, 1f
+ jalr t1, t0, 1
+1:
+ j 1f
+ j fail
+1:
+
+#ifndef __rvc
+ li TESTNUM, 4
+ li t1, 0
+ la t0, 3f
+ jr t0, 3
+3:
+ j fail
+#endif
+
+ j pass
+
+ TEST_PASSFAIL
+
+stvec:
+ # tests 2 and 4 should trap
+ li a0, 2
+ beq TESTNUM, a0, 1f
+ li a0, 4
+ beq TESTNUM, a0, 1f
+ j fail
+1:
+
+ # verify that return address was not written
+ bnez t1, fail
+
+ # verify trap cause
+ li a1, CAUSE_MISALIGNED_FETCH
+ csrr a0, scause
+ bne a0, a1, fail
+
+ # verify that epc == &jalr (== t0 - 4)
+ csrr a1, sepc
+ addi t0, t0, -4
+ bne t0, a1, fail
+
+ addi a1, a1, 8
+ csrw sepc, a1
+ sret
+
+RVTEST_CODE_END
+
+ .data
+RVTEST_DATA_BEGIN
+
+ TEST_DATA
+
+RVTEST_DATA_END