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