50 lines
1.1 KiB
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);
|
|
}
|