Я работаю над проектом, основанным на инструментах Rocket-Chip. Я сделал простую голую металлическую программу, которая хорошо работает на Spike (даже с несколькими ядрами … и т. Д.).
Проблема в том, что когда я запускаю его в эмуляторе C ++, последний останавливается при первом вызове printf.
Мой вопрос: можно ли вызвать системные вызовы (например, printf, putchar ..) из эмулятора C? Или есть какой-нибудь способ распечатать результаты программы из симуляции, например извлечь данные из памяти или что-то еще? (Я боролся с этим, и я не нашел, где он сохраняет переменные данных).
PS: программа основана на riscv-тесты / тесты системные вызовы там уже определены.
Можно ли вызвать системные вызовы (например, 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];
}
Других решений пока нет …