Было бы неплохо. Вдвоем веселее. Я вот не разобрался еще с необходимым минимумом реализации, для запуска тестов из riscv-tests репазитория. Там каждый бинарник с тестами это образ с ресет обработчиком. То есть эти тесты уже предъявляют условия к системе (environment).
Разобрался пока как они переходят на сами тесты из ресета:
они инициализируют статусный регистр mepc адресом начала тестов и делают следом mret. По идее тесты исполняются на пользовательском уровне превилегий. А где говорится что надо вернутся именно на тот уровень? Наверное, в mstatus.
И похоже вектор прерываний и системных вызовов один и тот же. Поэтому обработчик должен смотреть в mcause чтобы различать их. Если в старшем бите единица, значит это прерывание, иначе программное исключение.
Пока не ясна роль misa в обработчике ресет. Они проверяют старший бит и потом либо сразу дергают ecall либо проводят начальную инициализацию. Непонятно, зачем из ресет делать еcall и куда он после этого перейдет. Т.е. чему равно mtvec.
Comments 3
Reply
Я вот не разобрался еще с необходимым минимумом реализации, для запуска тестов из riscv-tests репазитория. Там каждый бинарник с тестами это образ с ресет обработчиком.
То есть эти тесты уже предъявляют условия к системе (environment).
Разобрался пока как они переходят на сами тесты из ресета:
они инициализируют статусный регистр mepc адресом начала тестов
и делают следом mret. По идее тесты исполняются на пользовательском уровне превилегий. А где говорится что надо вернутся именно на тот уровень? Наверное, в mstatus.
И похоже вектор прерываний и системных вызовов один и тот же. Поэтому обработчик должен
смотреть в mcause чтобы различать их. Если в старшем бите единица, значит это прерывание, иначе программное исключение.
Пока не ясна роль misa в обработчике ресет. Они проверяют старший бит и потом либо сразу дергают ecall либо проводят начальную инициализацию. Непонятно, зачем из ресет делать еcall и куда он после этого перейдет. Т.е. чему равно mtvec.
Reply
Reply
Leave a comment