Luaのインタフェースを使用して、CPUコアを生成して、シミュレーションをすることができる。 インタフェースのサンプルとして、以下を用意した。
riscv = make_core ("risc-v") set_pc (riscv, 0x00100) run (riscv)
まず、make_coreを利用して、RISC-VのCPUコアを生成する。 実際に動くのは、C++側の以下のプログラムになる。
int Lua_MakeCore (lua_State *L) { // Getting Arguments std::string arch_name = lua_tostring (L, 1); #ifdef ARCH_MIPS MipsEnv *env; if (arch_name == "mips") { env = new MipsEnv (g_debug_fp, false, g_debug_enable); env->DebugPrint ("<make core: %s %d>\n", arch_name.c_str(), g_debug_enable); } else { std::cout << "<Unsupported Architecture : " << arch_name << ">\n"; return 0; } #else // ARCH_MIPS #ifdef ARCH_RISCV RiscvEnv *env; if (arch_name == "risc-v") { env = new RiscvEnv (g_debug_fp, false, g_debug_enable); env->DebugPrint ("<make core: %s %d>\n", arch_name.c_str(), g_debug_enable); } else { std::cout << "<Unsupported Architecture : " << arch_name << ">\n"; return 0; } #else // ARCH_RISCV #error "No architecture is specified." #endif // ARCH_RISCV #endif // ARCH_MIPS env->SetMaxCycle (g_max_cycle); env->SetPC (g_init_pc); env->SetMaxCycle (g_max_cycle); env->LoadSrec (g_srec_fp); lua_pushlightuserdata (L, static_cast<void *>(env)); return 1; }
シミュレーション環境をenvを生成して、各種設定をした後、
lua_pushlightuserdata (L, static_cast<void *>(env));
で、make_coreの戻り値としてCPUコアを返す。 それ以降の命令では、全てこの環境を引数として指定している。
int Lua_Run (lua_State *L) { // Getting Arguments #ifdef ARCH_MIPS MipsEnv *env = static_cast<MipsEnv *>(lua_touserdata (L, 1)); env->DebugPrint ("<Run: MIPS>\n", env->GetMaxCycle()); #else // ARCH_MIPS #ifdef ARCH_RISCV RiscvEnv *env = static_cast<RiscvEnv *>(lua_touserdata (L, 1)); env->DebugPrint ("<Run: RISC-V>\n", env->GetMaxCycle()); #endif // ARCH_RISCV #endif // ARCH_MIPS env->StepSimulation (env->GetMaxCycle()); return 0; }
Lua_Run ()はCPUをシミュレーションする関数だ。第一引数にCPUコアを指定している。
set_pc (riscv, 0x00100)
run (riscv)
これのスクリプトは今のところCPUの生成、PCの設定、シミュレーション開始の3つしかコマンドを用意していないが、いろいろ増やしていって、デバッグで利用できるようにしたい。