112771Sqtt2@cornell.edu# See LICENSE for license details.
212771Sqtt2@cornell.edu
312771Sqtt2@cornell.edu#*****************************************************************************
412771Sqtt2@cornell.edu# ma_fetch.S
512771Sqtt2@cornell.edu#-----------------------------------------------------------------------------
612771Sqtt2@cornell.edu#
712771Sqtt2@cornell.edu# Test misaligned fetch 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 sbadaddr mbadaddr
2112771Sqtt2@cornell.edu  #define sepc mepc
2212771Sqtt2@cornell.edu  #define sret mret
2312771Sqtt2@cornell.edu  #define stvec_handler mtvec_handler
2412771Sqtt2@cornell.edu#endif
2512771Sqtt2@cornell.edu
2612771Sqtt2@cornell.edu  .align 2
2712771Sqtt2@cornell.edu  .option norvc
2812771Sqtt2@cornell.edu
2912771Sqtt2@cornell.edu  # Without RVC, the jalr should trap, and the handler will skip ahead.
3012771Sqtt2@cornell.edu  # With RVC, the jalr should not trap, and "j fail" should get skipped.
3112771Sqtt2@cornell.edu  li TESTNUM, 2
3212771Sqtt2@cornell.edu  li t1, 0
3312771Sqtt2@cornell.edu  la t0, 1f
3412771Sqtt2@cornell.edu  jalr t1, t0, 2
3512771Sqtt2@cornell.edu1:
3612771Sqtt2@cornell.edu  .option rvc
3712771Sqtt2@cornell.edu  c.j 1f
3812771Sqtt2@cornell.edu  c.j 2f
3912771Sqtt2@cornell.edu  .option norvc
4012771Sqtt2@cornell.edu1:
4112771Sqtt2@cornell.edu  j fail
4212771Sqtt2@cornell.edu2:
4312771Sqtt2@cornell.edu
4412771Sqtt2@cornell.edu  // This test should pass, since JALR ignores the target LSB
4512771Sqtt2@cornell.edu  li TESTNUM, 3
4612771Sqtt2@cornell.edu  la t0, 1f
4712771Sqtt2@cornell.edu  jalr t1, t0, 1
4812771Sqtt2@cornell.edu1:
4912771Sqtt2@cornell.edu  j 1f
5012771Sqtt2@cornell.edu  j fail
5112771Sqtt2@cornell.edu1:
5212771Sqtt2@cornell.edu
5312771Sqtt2@cornell.edu  li TESTNUM, 4
5412771Sqtt2@cornell.edu  li t1, 0
5512771Sqtt2@cornell.edu  la t0, 1f
5612771Sqtt2@cornell.edu  jalr t1, t0, 3
5712771Sqtt2@cornell.edu1:
5812771Sqtt2@cornell.edu  .option rvc
5912771Sqtt2@cornell.edu  c.j 1f
6012771Sqtt2@cornell.edu  c.j 2f
6112771Sqtt2@cornell.edu  .option norvc
6212771Sqtt2@cornell.edu1:
6312771Sqtt2@cornell.edu  j fail
6412771Sqtt2@cornell.edu2:
6512771Sqtt2@cornell.edu
6612771Sqtt2@cornell.edu  # Like test 2, but with jal instead of jalr.
6712771Sqtt2@cornell.edu  li TESTNUM, 5
6812771Sqtt2@cornell.edu  li t1, 0
6912771Sqtt2@cornell.edu  la t0, 1f
7012771Sqtt2@cornell.edu  jal t1, 2f
7112771Sqtt2@cornell.edu1:
7212771Sqtt2@cornell.edu  .option rvc
7312771Sqtt2@cornell.edu  c.j 1f
7412771Sqtt2@cornell.edu2:
7512771Sqtt2@cornell.edu  c.j 2f
7612771Sqtt2@cornell.edu  .option norvc
7712771Sqtt2@cornell.edu1:
7812771Sqtt2@cornell.edu  j fail
7912771Sqtt2@cornell.edu2:
8012771Sqtt2@cornell.edu
8112771Sqtt2@cornell.edu  # Like test 2, but with a taken branch instead of jalr.
8212771Sqtt2@cornell.edu  li TESTNUM, 6
8312771Sqtt2@cornell.edu  li t1, 0
8412771Sqtt2@cornell.edu  la t0, 1f
8512771Sqtt2@cornell.edu  beqz x0, 2f
8612771Sqtt2@cornell.edu1:
8712771Sqtt2@cornell.edu  .option rvc
8812771Sqtt2@cornell.edu  c.j 1f
8912771Sqtt2@cornell.edu2:
9012771Sqtt2@cornell.edu  c.j 2f
9112771Sqtt2@cornell.edu  .option norvc
9212771Sqtt2@cornell.edu1:
9312771Sqtt2@cornell.edu  j fail
9412771Sqtt2@cornell.edu2:
9512771Sqtt2@cornell.edu
9612771Sqtt2@cornell.edu  # Not-taken branches should not trap, even without RVC.
9712771Sqtt2@cornell.edu  li TESTNUM, 7
9812771Sqtt2@cornell.edu  bnez x0, 1f
9912771Sqtt2@cornell.edu  j 2f
10012771Sqtt2@cornell.edu  .option rvc
10112771Sqtt2@cornell.edu  c.j 1f
10212771Sqtt2@cornell.edu1:
10312771Sqtt2@cornell.edu  c.j 1f
10412771Sqtt2@cornell.edu  .option norvc
10512771Sqtt2@cornell.edu1:
10612771Sqtt2@cornell.edu  j fail
10712771Sqtt2@cornell.edu2:
10812771Sqtt2@cornell.edu
10912771Sqtt2@cornell.edu  j pass
11012771Sqtt2@cornell.edu
11112771Sqtt2@cornell.edu  TEST_PASSFAIL
11212771Sqtt2@cornell.edu
11312771Sqtt2@cornell.edu  .align 2
11412771Sqtt2@cornell.edu  .global stvec_handler
11512771Sqtt2@cornell.edustvec_handler:
11612771Sqtt2@cornell.edu  # tests 2, 4, 5, and 6 should trap
11712771Sqtt2@cornell.edu  li a0, 2
11812771Sqtt2@cornell.edu  beq TESTNUM, a0, 1f
11912771Sqtt2@cornell.edu  li a0, 4
12012771Sqtt2@cornell.edu  beq TESTNUM, a0, 1f
12112771Sqtt2@cornell.edu  li a0, 5
12212771Sqtt2@cornell.edu  beq TESTNUM, a0, 1f
12312771Sqtt2@cornell.edu  li a0, 6
12412771Sqtt2@cornell.edu  beq TESTNUM, a0, 1f
12512771Sqtt2@cornell.edu  j fail
12612771Sqtt2@cornell.edu1:
12712771Sqtt2@cornell.edu
12812771Sqtt2@cornell.edu  # verify that return address was not written
12912771Sqtt2@cornell.edu  bnez t1, fail
13012771Sqtt2@cornell.edu
13112771Sqtt2@cornell.edu  # verify trap cause
13212771Sqtt2@cornell.edu  li a1, CAUSE_MISALIGNED_FETCH
13312771Sqtt2@cornell.edu  csrr a0, scause
13412771Sqtt2@cornell.edu  bne a0, a1, fail
13512771Sqtt2@cornell.edu
13612771Sqtt2@cornell.edu  # verify that epc == &jalr (== t0 - 4)
13712771Sqtt2@cornell.edu  csrr a1, sepc
13812771Sqtt2@cornell.edu  addi a1, a1, 4
13912771Sqtt2@cornell.edu  bne t0, a1, fail
14012771Sqtt2@cornell.edu
14112771Sqtt2@cornell.edu  # verify that badaddr == 0 or badaddr == t0+2.
14212771Sqtt2@cornell.edu  csrr a0, sbadaddr
14312771Sqtt2@cornell.edu  beqz a0, 1f
14412771Sqtt2@cornell.edu  addi a0, a0, -2
14512771Sqtt2@cornell.edu  bne a0, t0, fail
14612771Sqtt2@cornell.edu1:
14712771Sqtt2@cornell.edu
14812771Sqtt2@cornell.edu  addi a1, a1, 12
14912771Sqtt2@cornell.edu  csrw sepc, a1
15012771Sqtt2@cornell.edu  sret
15112771Sqtt2@cornell.edu
15212771Sqtt2@cornell.eduRVTEST_CODE_END
15312771Sqtt2@cornell.edu
15412771Sqtt2@cornell.edu  .data
15512771Sqtt2@cornell.eduRVTEST_DATA_BEGIN
15612771Sqtt2@cornell.edu
15712771Sqtt2@cornell.edu  TEST_DATA
15812771Sqtt2@cornell.edu
15912771Sqtt2@cornell.eduRVTEST_DATA_END
160