--- nono/vm/goldfish_timer.cpp 2026/04/29 17:05:29 1.1.1.2 +++ nono/vm/goldfish_timer.cpp 2026/04/29 17:05:33 1.1.1.3 @@ -50,6 +50,7 @@ #include "goldfish_timer.h" #include "goldfish_pic.h" #include "goldfish_rtc.h" +#include "monitor.h" #include "mpu.h" #include "scheduler.h" #include "syncer.h" @@ -63,9 +64,9 @@ GFTimerDevice::GFTimerDevice() : inherited(OBJ_GFTIMER) { // モニタは GFRTC + GFTimer で共有。 - monitor.func = ToMonitorCallback(&GFTimerDevice::MonitorUpdate); - monitor.SetSize(38, 7); - monitor.Regist(ID_MONITOR_RTC); + monitor = gMonitorManager->Regist(ID_MONITOR_RTC, this); + monitor->func = ToMonitorCallback(&GFTimerDevice::MonitorUpdate); + monitor->SetSize(38, 7); } // デストラクタ @@ -273,10 +274,12 @@ GFTimerDevice::Now() const void GFTimerDevice::StartAlarm() { + uint64 now = Now(); + if (__predict_false(mtime_epoch == 0)) { // 最初のアラーム書き込み時を修正実時間軸の基準点にする。 - mtime_epoch = syncer->GetRealTime(); - mtime = mtime_epoch; + mtime_epoch = now; + mtime = 0; } // 仮想時間モードなら ALARM 時刻に発火するイベントをセットするだけ。 @@ -284,7 +287,6 @@ GFTimerDevice::StartAlarm() // 割り込みを上げるかどうかは向こうで調整する。 // event.code は VT モードの時には不要だが気にせず立てる。 // 指定されたアラームがすでに過去の時刻なら QEMU は即発火するようだ。 - uint64 now = Now(); if (__predict_true(alarm > now)) { event.time = alarm - now; } else {