Feb 28, 2017 08:08
Я тут разбираюсь с системными вызовами на Risc-V. ECall как-то слабовато документировал. Да и MRET местами не без вопросом, поэтому полез в исходники эмулятора spike.
Если опустить делигирование прерываний и исключений то логика выглядит следующим образом:
state.pc = state.mtvec;
state.mepc = epc;
state.mcause = t.cause();
if (t.has_badaddr())
state.mbadaddr = t.get_badaddr();
reg_t s = state.mstatus;
s = set_field(s, MSTATUS_MPIE, get_field(s, MSTATUS_UIE << state.prv));
s = set_field(s, MSTATUS_MPP, state.prv);
s = set_field(s, MSTATUS_MIE, 0);
set_csr(CSR_MSTATUS, s);
set_privilege(PRV_M);
Если представить что у нас есть специальный регистровый файл для CSR's, то нам понадобится четыре записи в него. И два чтения.
C однопортовым файлом получится 6 циклов для работы с csr файлом. Плюс еще fetch и decode если не конвеер.
Посмотрел на реализацию Z-scale. Там вроде один порт записи.
risc-v