--- nono/vm/goldfish_timer.cpp 2026/04/29 17:05:43 1.1.1.5 +++ nono/vm/goldfish_timer.cpp 2026/04/29 17:05:50 1.1.1.6 @@ -48,6 +48,7 @@ // 読み込み時は割り込み許可なら $1、禁止なら $0。 #include "goldfish_timer.h" +#include "event.h" #include "goldfish_pic.h" #include "goldfish_rtc.h" #include "monitor.h" @@ -86,17 +87,18 @@ GFTimerDevice::Init() gfrtc = dynamic_cast(GetRTCDevice()); syncer = GetSyncer(); + auto evman = GetEventManager(); + event = evman->Regist(this, NULL, "Goldfish Timer"); + // クロックの同期方法 sync_rt = syncer->GetSyncRealtime(); // それによってイベントを分けてある。(time はどちらも都度セットする) if (sync_rt) { - event.func = ToEventCallback(&GFTimerDevice::CallbackRT); + event->func = ToEventCallback(&GFTimerDevice::CallbackRT); } else { - event.func = ToEventCallback(&GFTimerDevice::CallbackVT); + event->func = ToEventCallback(&GFTimerDevice::CallbackVT); } - event.SetName("Goldfish Timer"); - scheduler->RegistEvent(event); return true; } @@ -146,7 +148,7 @@ GFTimerDevice::ReadPort(uint32 offset) break; case GFRTC::ALARM_STATUS: - data = event.IsRunning() ? 1 : 0; + data = event->IsRunning() ? 1 : 0; putlog(2, "ALARM_STATUS -> $%08x", data.Data()); break; @@ -229,7 +231,7 @@ GFTimerDevice::PeekPort(uint32 offset) case GFRTC::INTR_STATUS: return intr_assert ? 1 : 0; case GFRTC::ALARM_STATUS: - return event.IsRunning() ? 1 : 0; + return event->IsRunning() ? 1 : 0; default: return BusData::BusErr; } @@ -281,29 +283,29 @@ GFTimerDevice::StartAlarm() // 仮想時間モードなら ALARM 時刻に発火するイベントをセットするだけ。 // 実時間モードならひとまず仮に本来の仮想時刻にイベントは起こすが、 // 割り込みを上げるかどうかは向こうで調整する。 - // event.code は VT モードの時には不要だが気にせず立てる。 + // event->code は VT モードの時には不要だが気にせず立てる。 // 指定されたアラームがすでに過去の時刻なら QEMU は即発火するようだ。 if (__predict_true(alarm > now)) { - event.time = alarm - now; + event->time = alarm - now; } else { if (__predict_false(loglevel >= 1)) { uint64 delta = now - alarm; putlogn("ALARM: past alarm -%s", TimeToStr(delta).c_str()); } - event.time = 0; + event->time = 0; } - event.code = 1; + event->code = 1; scheduler->RestartEvent(event); } // 実時間モードでのコールバック。 void -GFTimerDevice::CallbackRT(Event& ev) +GFTimerDevice::CallbackRT(Event *ev) { // アラーム開始後最初の1回だけ自分の時間軸をアラーム分だけ進める。 - if (event.code) { - mtime += ev.time; - event.code = 0; + if (event->code) { + mtime += event->time; + event->code = 0; } uint64 mnow = syncer->GetRealTime() - mtime_epoch; @@ -320,7 +322,7 @@ GFTimerDevice::CallbackRT(Event& ev) // 仮想時間モードでのコールバック。 void -GFTimerDevice::CallbackVT(Event& ev) +GFTimerDevice::CallbackVT(Event *ev) { // 仮想時間モードなら、イベントが起きたここがゴール。 // アラームは単発イベントなのでリスタート不要。