FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

xv6を移植するときに書き換えるルーチンについて調査(3)

まずは一折ビルドしていきながら、コンパイルエラーになったところを順番に直していくという作業だった。

trap.cでいくつかのエラーが出てくる。やはり、トラップフレームを書き換えたことによるものだ。

github.com

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の例外ベクタをコピーして、実装することにした。

github.com

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

まだまだ修正する部分はある。続く。