RV32 CV32核心移植中M-mode环境调用异常排查求助
问题:CV32移植中time()/rand()调用触发默认异常的疑问
我们正将核心从Pulpino移植到CV32,编译运行代码无异常,但调用time()、srand()、rand()时会触发默认异常处理,此时相关CSR值如下:
mcause : 0x0000000b mstatus : 0x00001880 (mstatus.MPP : 03, mstatus.MIE : 01) mepc : 0x00003476 mtval : 0x00000000 mip : 0x00000000 mie : 0xffff0000 misa : 0x40101104
通过仅调用rand()的测试程序验证,在默认异常处理中打印CSR值确认mcause=0xB,对应M-mode环境调用异常。反汇编二进制文件发现time()、rand()函数中存在ecall指令,而div()中没有,说明是ecall触发了异常。
现提出两个问题:
- 为何
ecall会触发该异常? - 为何异常触发的是
default_exception_handler_c而非配置的ecall_insn_handler?是否为硬件接线问题?
附crt0.S代码片段:
.section .vectors, "ax" .option norvc; .global intvec intvec: .org 0x00 jal x0, default_exception_handler_c [...] .org 0x88 jal x0, ecall_insn_handler
工具链信息:使用riscv32-corev-elf-gcc 11.0.0实验版本,编译参数包含-Os -Wa,-march=rv32ic -Wall -Wdouble-promotion -Wextra -Wformat=2 -fdata-sections -ffunction-sections -fno-builtin -fno-builtin-printf -fno-merge-all-constants -g0 -march=rv32ic -s -std=gnu11
内容的提问来源于stack exchange,提问作者Guillaume D
相关产品推荐
相关产品推荐

