При использовании эмулятора C ++ происходит сбой при вызове системного вызова printf из голой металлической программы RISC-V

Я работаю над проектом, основанным на инструментах Rocket-Chip. Я сделал простую голую металлическую программу, которая хорошо работает на Spike (даже с несколькими ядрами … и т. Д.).

Проблема в том, что когда я запускаю его в эмуляторе C ++, последний останавливается при первом вызове printf.

Мой вопрос: можно ли вызвать системные вызовы (например, printf, putchar ..) из эмулятора C? Или есть какой-нибудь способ распечатать результаты программы из симуляции, например извлечь данные из памяти или что-то еще? (Я боролся с этим, и я не нашел, где он сохраняет переменные данных).

PS: программа основана на riscv-тесты / тесты системные вызовы там уже определены.

0

Решение

Можно ли вызвать системные вызовы (например, printf, putchar ..) из C
Эмулятор?

Да эти функции уже определены Вот в кодовой базе

В соответствии с базой кода, адресом данных, указывающим на глобальную внешнюю переменную, с этого адреса необходимо прочитать 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];
}
1

Другие решения

Других решений пока нет …