Сколько циклов требуется для перехода на обработчик прерывания/ловушки

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

Previous post Next post
Up