FPGA開発日記

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

RISC-Vにおける可変長引数関数cprintf()のデバッグ

msyksphinz.hatenablog.com

RISC-V向けにxv6を移植するのに、cprintf()がないとどうにもうまく行かないので、とりあえず即席でcprintf()の引数を調整するアセンブラを作成した。

前回の記事で試行し、失敗したものを多少修正。可変長引数の場合は引数の位置を合わせないといけないということで、スタックに格納する引数の場所を調整した。

msyksphinz.hatenablog.com

ここではconsole_asm.Sという関数を作り、cprintf()の呼出ではこちらを使用するようにする。

github.com

cprintf:
.LFB20:
.LM25:
    .cfi_startproc
.LVL26:
    add sp,sp,-96
.LCFI8:
    .cfi_def_cfa_offset 96
    sw  ra,60(sp)
    sw  s0,56(sp)
    .cfi_offset 1, -36
    .cfi_offset 8, -40
    add s0,sp,64
.LCFI9:
    .cfi_def_cfa 8, 32
    sw  a0,-52(s0)
    sw  a1,-48(s0)
    sw  a2,-44(s0)
    sw  a3,-40(s0)
    sw  a4,-36(s0)
    sw  a5,-32(s0)
    sw  a6,-24(s0)
    sw  a7,-28(s0)
.LM26:

これで、とりあえずは無事にcprintf()が使えるようになった。以下のcprintf()に対し、

  cprintf("cpu%d %: starting...\n", cpu_id);
  cprintf("mpmain = 0x%p\n", mpmain);

以下のような出力が得られる。デバッグメッセージ出すぎだけど。

<CRT: Store (000003d4)<=0f>
<CRT: Store (000003d5)<=01>
<UART: Store (000003f8)<=67> g
<CRT: Store (000003d4)<=0e>
<CRT: Store (000003d4)<=0f>
<CRT: Store (000003d4)<=0e>
<CRT: Store (000003d5)<=00>
<CRT: Store (000003d4)<=0f>
<CRT: Store (000003d5)<=01>
<UART: Store (000003f8)<=0a>

cpu0: starting
<CRT: Store (000003d4)<=0e>
<CRT: Store (000003d4)<=0f>
<CRT: Store (000003d4)<=0e>
...
mpmain = 0x80104f84
...