FPGA開発日記

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

Luaからバイナリファイルから読み込んでISSに渡す

msyksphinz.hatenablog.com

バイナリファイルを読み込むことができるようになったため、Luaから制御できるようにしよう。

github.com

load関数を実装して、環境に対してバイナリをロードするようにする。

riscv = make_core ("risc-v")
load (riscv, "/home/vagrant/benchmarks/coremark_v1.0/coremark.bin")
set_pc (riscv, 0x00100)

run (riscv)

実装はこちら。

int Lua_LoadBin (lua_State *L)
{
    // Getting Arguments
#ifdef ARCH_MIPS
    MipsEnv *env = static_cast<MipsEnv *>(lua_touserdata (L, 1));
#else  // ARCH_MIPS
#ifdef ARCH_RISCV
    RiscvEnv *env = static_cast<RiscvEnv *>(lua_touserdata (L, 1));
#endif // ARCH_RISCV
#endif // ARCH_MIPS

    std::string path = lua_tostring (L, 2);
    env->DebugPrint ("<Load: %s>\n", path.c_str());

    env->LoadBinary (path);

    return 0;
}

ここまで実装して、いろいろ問題が分かってきた。

  • Lua側で、make_coreによりenvを作成するので、Luaを使わない環境との共存が出きない。例えば、シミュレータの引数としてバイナリファイルを指定しても、それをenvに渡すことができない。 これを解決するためには、Luaのルーチンでcoreを作成するときに、デフォルト値としてバイナリファイルを渡すしかない。まあしようがないのかなあ。

  • Lua側のload()で文字列としてファイル名を指定するのだが、相対パス(特にチルダ)を利用すると関数にそのまま渡され、オープンすることができないことがある。 realpathを利用してもチルダが処理されないため、場合によってはバイナリファイルを開くことができない。これも困ったなあ。