--- nono/vm/prom.cpp 2026/04/29 17:05:06 1.1.1.9 +++ nono/vm/prom.cpp 2026/04/29 17:05:10 1.1.1.10 @@ -4,8 +4,10 @@ // Licensed under nono-license.txt // +// // PROM (LUNA-I, LUNA88K 共通) // + // IODevice // | // +-- ROMDevice (LoadROM()、ウェイト、マスク等を持つ) @@ -32,10 +34,10 @@ #include "config.h" #include "ethernet.h" #include "mainapp.h" -#include "scheduler.h" -std::unique_ptr gPROM0; -std::unique_ptr gPROM; +// グローバル参照用 +PROM0Device *gPROM0; +IODevice *gPROM; // // PROM0 @@ -50,26 +52,28 @@ std::unique_ptr gPROM; // コンストラクタ PROM0Device::PROM0Device() - : inherited("PROM(0)") + : inherited("PROM(BOOT)") { ClearAlias(); - AddAlias("PROM0"); + AddAlias("PROMBOOT"); } // デストラクタ PROM0Device::~PROM0Device() { + gPROM0 = NULL; } bool PROM0Device::Init() { - prom = gPROM.get(); + prom = gPROM; return true; } +// リセット void -PROM0Device::ResetHard() +PROM0Device::ResetHard(bool poweron) { gVM->SwitchBootPageToROM(this); } @@ -166,6 +170,7 @@ PROMDevice::PROMDevice() // デストラクタ PROMDevice::~PROMDevice() { + gPROM = NULL; } bool @@ -213,7 +218,7 @@ PROMDevice::InitLuna1() if (strcmp((const char *)&mem[0xd390], "Thu Jul 27 11:45:42 1989") == 0) { // V4.22 - putlog(1, "V4.22 detected"); + putmsg(1, "V4.22 detected"); // MAC アドレスは ROM に書き込まれているので、ここで上書き if (strcmp((const char *)&mem[0x1ffd8], "ENADDR") != 0) { @@ -224,14 +229,14 @@ PROMDevice::InitLuna1() // MAC アドレスは12桁の16進数文字列として書き込まれている。例えば // 前半の 00:00:0A 部分は 30 30 30 30 30 41 "00000A" という感じ。 const macaddr_t macaddr = gEthernet->GetMacAddr(); - memcpy(&mem[0x1ffe0], macaddr.to_string().c_str(), 12); + memcpy(&mem[0x1ffe0], macaddr.ToString().c_str(), 12); // SCSI デバッグビット bool scsi_debug_bit = gConfig->Find(".prom-scsi-debug").AsInt(); mem[0x4100981d - 0x41000000] = (scsi_debug_bit) ? 0x01 : 0; } else { // 他の ROM は何も分からないので何もしない。 - putlog(0, "Unknown PROM Version"); + putmsg(0, "Unknown PROM Version"); } return true; @@ -255,43 +260,3 @@ PROMDevice::InitLuna88k() return true; } - -bool -PROMDevice::PowerOn() -{ - // パフォーマンス測定に電源オン時の実時刻を記憶。 - // Read8() 参照。 - sw.Start(); - return true; -} - -uint64 -PROMDevice::Read8(uint32 addr) -{ - // パフォーマンス測定のためのバックドア。 - // 0x42e576f7 番地をバイト読み込みを行うと VM 電源オン時から現在までの - // 実時間をホスト (ログ) に出力する。NetBSD のマルチユーザブートが - // あらかた終わってログインプロンプトが出る少し前に実行される - // /etc/rc.local に - // dd if=/dev/mem skip=1122334455 bs=1 count=1 - // と書いておくことでここまでにかかる時間を表示できる。ただしこの値は - // ホスト性能に依存するため、同一環境下での相対的な比較のみが可能。 - // 実機ではこの動作では PROM のミラーが読めるだけなので副作用はないはず。 - // 出来れば書き込みをバックドアにしたかったが、たぶんカーネルレベルで - // 弾いてあるので、読み込みを使う。 - if (__predict_false(addr == 0x42e576f7)) { - uint64 rtime; - uint64 vtime; - - // 電源オン時からここまでの時間を表示するだけでリセット等はしない。 - rtime = sw.Elapsed(); - vtime = gMPU->GetVirtTime(); - putlog(0, "電源オンから %d.%03d 秒経過 %3.3f%%", - (int)(rtime / (1000 * 1000 * 1000)), - (int)((rtime / (1000 * 1000)) % 1000), - (double)vtime / rtime * 100); - } - - // それ以外は通常動作 - return inherited::Read8(addr); -}