Hazard3/test/sim/sw_testcases/ecall_simple.c

50 lines
1.1 KiB
C

#include "tb_cxxrtl_io.h"
#include "hazard3_csr.h"
#include <stdint.h>
/*EXPECTED-OUTPUT***************************************************************
mcause initial value:
00000000
Handling ecall. Call number:
00000123
Handling ecall. Call number:
00000456
Handling ecall. Call number:
deadbeef
Finished making calls.
mcause final value:
0000000b
*******************************************************************************/
void __attribute__((interrupt)) handle_exception() {
uint32_t call_num;
asm volatile ("mv %0, a7" : "=r" (call_num));
tb_puts("Handling ecall. Call number:\n");
tb_put_u32(call_num);
write_csr(mepc, read_csr(mepc) + 4);
}
static inline void make_ecall(uint32_t call) {
asm volatile ("mv a7, %0 \n ecall" : : "r" (call));
}
const uint32_t call_nums[] = {
0x123,
0x456,
0xdeadbeef
};
void main() {
tb_puts("mcause initial value:\n");
tb_put_u32(read_csr(mcause));
for (int i = 0; i < sizeof(call_nums) / sizeof(*call_nums); ++i)
make_ecall(call_nums[i]);
tb_puts("Finished making calls.\n");
tb_puts("mcause final value:\n");
tb_put_u32(read_csr(mcause));
tb_exit(0);
}