RISC-V向けにxv6を移植するのに、cprintf()がないとどうにもうまく行かないので、とりあえず即席でcprintf()の引数を調整するアセンブラを作成した。
前回の記事で試行し、失敗したものを多少修正。可変長引数の場合は引数の位置を合わせないといけないということで、スタックに格納する引数の場所を調整した。
ここではconsole_asm.Sという関数を作り、cprintf()の呼出ではこちらを使用するようにする。
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 ...