--- nono/vm/bootloader.cpp 2026/04/29 17:05:17 1.1.1.1 +++ nono/vm/bootloader.cpp 2026/04/29 17:05:24 1.1.1.2 @@ -43,11 +43,48 @@ BootLoader::~BootLoader() { } -// info->path で指定されたホストの実行ファイルをゲストにロードする。 +// info で指定されたデータファイルをゲストにロードする。 +// info->data, size が指定されていればバッファから読み込む (現状こちらのみ)。 +// info->start には読み込み先アドレスを指定する (戻り値ではない)。 +// info->end にはロードした最終アドレス(の次のアドレス) が返る (ここは同じ)。 +// 成功すれば true、失敗すれば false を返す。 +bool +BootLoader::LoadData(LoadInfo *info) +{ + assert(info->data != NULL); + assert(info->size != 0); + + // ゲストにコピー。 + IODeviceStream ds(ram, info->start); + WriteFromHost(ds, info->data, info->size); + + info->end = info->start + info->size; + + return true; +} + +// info で指定された実行ファイルをゲストにロードする。 +// info->data, size が指定されていればバッファから読み込む。 +// 指定されてなければホストの info->path から読み込む (その際 data, size は +// 内部で使用する)。 +// info->path はいずれにしてもエラー表示の際に使用する。 +// 実行ファイルのフォーマットは自動で認識する。 +// 成功すれば true、失敗すれば false を返す。 +bool +BootLoader::LoadExec(LoadInfo *info) +{ + if (info->data == NULL || info->size == 0) { + return LoadExecFromFile(info); + } else { + return LoadExecFromBuf(info); + } +} + +// info->path で指定された実行ファイルをゲストにロードする。 // ファイルのフォーマットは自動で認識する。 // 成功すれば true、失敗すれば false を返す。 bool -BootLoader::LoadFromFile(LoadInfo *info) +BootLoader::LoadExecFromFile(LoadInfo *info) { uint8 *filedata; size_t filesize; @@ -93,7 +130,7 @@ BootLoader::LoadFromFile(LoadInfo *info) rv = LoadGzFile(info); } else { // 通常ファイル - rv = LoadFromData(info); + rv = LoadExecFromBuf(info); } munmap(filedata, filesize); @@ -143,14 +180,14 @@ BootLoader::LoadGzFile(LoadInfo *info) // 展開できたのでロード info->data = dstbuf.get(); info->size = decompsize; - return LoadFromData(info); + return LoadExecFromBuf(info); } // info->data, size で指定されたバッファを実行ファイルとみなしてゲストに // ロードする。ファイルのフォーマットは自動で認識する。 // 成功すれば true、失敗すれば false を返す。 bool -BootLoader::LoadFromData(LoadInfo *info) +BootLoader::LoadExecFromBuf(LoadInfo *info) { bool rv; @@ -488,10 +525,13 @@ BootLoader::Load_elf32_exec(LoadInfo *in } info->end = ds.GetAddr(); + info->sym = info->end; // シンボルテーブルをロード。出来なくても構わないので続行する。 // 本当は NetBSD カーネルの時に限るのだが、とりあえず。 - Load_elf32_sym(info, bootmsg); + if (info->loadsym) { + Load_elf32_sym(info, bootmsg); + } // boot がカーネルを読んだ時と同じ形式のログを出しておく。(検証用) putmsg(1, "%s=0x%x", bootmsg.c_str(), info->end - info->start); @@ -929,6 +969,7 @@ BootLoader::readfile_global(uint32 dstad LoadInfo::LoadInfo() { + loadsym = true; entry = -1; }