バイナリファイルを読み込むことができるようになったため、Luaから制御できるようにしよう。
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を利用してもチルダが処理されないため、場合によってはバイナリファイルを開くことができない。これも困ったなあ。