--- nono/vm/goldfish_timer.cpp 2026/04/29 17:05:50 1.1.1.6 +++ nono/vm/goldfish_timer.cpp 2026/04/29 17:06:00 1.1.1.7 @@ -51,8 +51,8 @@ #include "event.h" #include "goldfish_pic.h" #include "goldfish_rtc.h" +#include "mainbus.h" #include "monitor.h" -#include "mpu.h" #include "scheduler.h" #include "syncer.h" @@ -66,7 +66,7 @@ GFTimerDevice::GFTimerDevice() { // モニタは GFRTC + GFTimer で共有。 monitor = gMonitorManager->Regist(ID_MONITOR_RTC, this); - monitor->func = ToMonitorCallback(&GFTimerDevice::MonitorUpdate); + monitor->SetCallback(&GFTimerDevice::MonitorScreen); monitor->SetSize(38, 7); } @@ -95,9 +95,9 @@ GFTimerDevice::Init() // それによってイベントを分けてある。(time はどちらも都度セットする) if (sync_rt) { - event->func = ToEventCallback(&GFTimerDevice::CallbackRT); + event->SetCallback(&GFTimerDevice::CallbackRT); } else { - event->func = ToEventCallback(&GFTimerDevice::CallbackVT); + event->SetCallback(&GFTimerDevice::CallbackVT); } return true; @@ -108,8 +108,8 @@ void GFTimerDevice::ResetHard(bool poweron) { scheduler->StopEvent(event); - elapsed = 0; - alarm = 0; + elapsed.q = 0; + alarm.q = 0; mtime = 0; mtime_epoch = 0; @@ -125,20 +125,19 @@ GFTimerDevice::ReadPort(uint32 offset) switch (offset) { case GFRTC::TIME_LOW: - elapsed = Now(); - data = (uint32)elapsed; + elapsed.q = Now(); + data = elapsed.l; if (__predict_false(loglevel >= 2)) { if (loglevel >= 3) { putlogn("TIME_LOW -> $%08x", data.Data()); } else { - putlogn("TIME -> $%08x'%08x", - (uint32)(elapsed >> 32), data.Data()); + putlogn("TIME -> $%08x'%08x", elapsed.h, data.Data()); } } break; case GFRTC::TIME_HIGH: - data = (uint32)(elapsed >> 32); + data = elapsed.h; putlog(3, "TIME_HIGH -> $%08x", data.Data()); break; @@ -153,7 +152,7 @@ GFTimerDevice::ReadPort(uint32 offset) break; default: - putlog(1, "Read unknown $%08x", mpu->GetPaddr()); + putlog(1, "Read unknown $%08x", GetMainbusDevice()->GetPaddr()); data.SetBusErr(); break; } @@ -169,14 +168,14 @@ GFTimerDevice::WritePort(uint32 offset, switch (offset) { case GFRTC::ALARM_LOW: - alarm = alarm_high | data; + alarm.h = alarm_high; + alarm.l = data; alarm_high = 0; if (__predict_false(loglevel >= 2)) { if (loglevel >= 3) { putlogn("ALARM_LOW <- $%08x", data); } else { - putlogn("ALARM <- $%08x'%08x", - (uint32)(alarm >> 32), (uint32)alarm); + putlogn("ALARM <- $%08x'%08x", alarm.h, alarm.l); } } StartAlarm(); @@ -184,7 +183,7 @@ GFTimerDevice::WritePort(uint32 offset, case GFRTC::ALARM_HIGH: putlog(3, "ALARM_HIGH <- $%08x", data); - alarm_high = (uint64)data << 32; + alarm_high = data; break; case GFRTC::INTR_STATUS: @@ -201,7 +200,7 @@ GFTimerDevice::WritePort(uint32 offset, case GFRTC::ALARM_CLEAR: putlog(1, "Clear alarm"); - alarm = 0; + alarm.q = 0; break; case GFRTC::INTR_CLEAR: @@ -211,7 +210,8 @@ GFTimerDevice::WritePort(uint32 offset, break; default: - putlog(1, "Write unknown $%08x <- $%08x", mpu->GetPaddr(), data); + putlog(1, "Write unknown $%08x <- $%08x", + GetMainbusDevice()->GetPaddr(), data); r = BusData::BusErr; break; } @@ -238,7 +238,7 @@ GFTimerDevice::PeekPort(uint32 offset) } void -GFTimerDevice::MonitorUpdate(Monitor *, TextScreen& screen) +GFTimerDevice::MonitorScreen(Monitor *, TextScreen& screen) { int y = 0; @@ -248,10 +248,10 @@ GFTimerDevice::MonitorUpdate(Monitor *, screen.Puts(0, y++, ""); screen.Print(0, y++, "Time: %26s", TimeToStr(now).c_str()); - screen.Print(0, y++, "Alarm: %26s", TimeToStr(alarm).c_str()); + screen.Print(0, y++, "Alarm: %26s", TimeToStr(alarm.q).c_str()); y++; - gfrtc->MonitorUpdateRTC(screen, y); + gfrtc->MonitorScreenRTC(screen, y); } // 現在時刻を返す @@ -285,11 +285,11 @@ GFTimerDevice::StartAlarm() // 割り込みを上げるかどうかは向こうで調整する。 // event->code は VT モードの時には不要だが気にせず立てる。 // 指定されたアラームがすでに過去の時刻なら QEMU は即発火するようだ。 - if (__predict_true(alarm > now)) { - event->time = alarm - now; + if (__predict_true(alarm.q > now)) { + event->time = alarm.q - now; } else { if (__predict_false(loglevel >= 1)) { - uint64 delta = now - alarm; + uint64 delta = now - alarm.q; putlogn("ALARM: past alarm -%s", TimeToStr(delta).c_str()); } event->time = 0;