从RISC-V裸机程序调用printf syscall时,使用C ++ Emulator失败

时间:2018-04-11 09:52:26

标签: c++ c riscv bare-metal chisel

我正在开发一个基于Rocket-Chip工具的项目。我制作了一个简单的裸金属程序,适用于Spike(即使有多个核心等等)。

问题在于,当我在C ++模拟器中运行它时,后者在第一次printf调用中停止。

我的问题是:是否可以从C模拟器调用syscalls(如printf,putchar ..)?或者有没有办法从模拟中打印出程序的结果,比如获取数据存储器或其他东西? (我一直在努力,我没有找到保存数据变量的地方)。

PS:该程序基于riscv-tests/benchmarks已经定义了系统调用。

1 个答案:

答案 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];
}