我正在开发一个基于Rocket-Chip工具的项目。我制作了一个简单的裸金属程序,适用于Spike(即使有多个核心等等)。
问题在于,当我在C ++模拟器中运行它时,后者在第一次printf调用中停止。
我的问题是:是否可以从C模拟器调用syscalls(如printf,putchar ..)?或者有没有办法从模拟中打印出程序的结果,比如获取数据存储器或其他东西? (我一直在努力,我没有找到保存数据变量的地方)。
PS:该程序基于riscv-tests/benchmarks已经定义了系统调用。
答案 0 :(得分:1)
是否可以从C调用syscalls(如printf,putchar ..) 模拟器?
是的,这些函数已在代码库中定义here
根据代码库,数据地址由全局外部变量指向,从这个地址你需要读取4位64位数据的索引
extern volatile uint64_t tohost;
extern volatile uint64_t fromhost;
使用此printf(), putchar()
syscall
static uintptr_t syscall(uintptr_t which, uint64_t arg0, uint64_t arg1, uint64_t arg2)
{
volatile uint64_t magic_mem[8] __attribute__((aligned(64)));
magic_mem[0] = which;
magic_mem[1] = arg0;
magic_mem[2] = arg1;
magic_mem[3] = arg2;
__sync_synchronize();
tohost = (uintptr_t)magic_mem;
while (fromhost == 0)
;
fromhost = 0;
__sync_synchronize();
return magic_mem[0];
}