まずは一折ビルドしていきながら、コンパイルエラーになったところを順番に直していくという作業だった。
trap.cでいくつかのエラーが出てくる。やはり、トラップフレームを書き換えたことによるものだ。
x86の版では、例外の要因を確かめるために、tf->trapnoという変数を参照している。
//PAGEBREAK: 41 void trap(struct trapframe *tf) { if(tf->trapno == T_SYSCALL){
これはRISC-Vになってトラップフレームから削除してしまったので、RISC-Vのシステムレジスタであるmcauseを参照するように変更する。
//PAGEBREAK: 41 void trap(struct trapframe *tf) { uint exccode = tf->mcause & CAUSE_CODE; if(exccode == T_SYSCALL){
このあたりのトラップ処理の修正を一つ一つ実施していった。とりあえずtrap.cは修正したが、今度は例外ベクトルの編集をしなければならない。
例外ベクトルは、オリジナルのxv6ではvector.plにより自動的に生成されるようになっている。しかしRISC-Vではそのようにする訳にはいかないので、riscv-testsの例外ベクタをコピーして、実装することにした。
handle_exception: \ /* we don't know how to handle whatever the exception was */ \ other_exception: \ /* some unhandlable exception occurred */ \ 1: ori TESTNUM, TESTNUM, 1337; \ write_tohost: \ csrw mtohost, TESTNUM; \ j write_tohost; \ reset_vector: \ RISCV_MULTICORE_DISABLE; \ CHECK_XLEN; \ li TESTNUM, 0; \ /* if an stvec_handler is defined, delegate exceptions to it */ \ la t0, stvec_handler; \ beqz t0, 1f; \ csrw stvec, t0; ...
って今見てみたら僕が使っているコードからまたアップデートがかかっているな。後でチェックしよう。
さらにentry.Sも修正してみる。これはmain()を呼ぶだけだ。
.globl _start _start: csrci mstatus, STATUS_IE la sp, stack + KSTACKSIZE # Jump to main() la t0, main jr t0 nop
まだまだ修正する部分はある。続く。