--- nono/vm/qemusysctlr.cpp 2026/04/29 17:05:29 1.1.1.2 +++ nono/vm/qemusysctlr.cpp 2026/04/29 17:06:00 1.1.1.3 @@ -11,8 +11,9 @@ // https://www.qemu.org/docs/master/specs/virt-ctlr.html #include "qemusysctlr.h" -#include "mpu.h" +#include "mainbus.h" #include "power.h" +#include "syncer.h" // コンストラクタ QemuSysCtlrDevice::QemuSysCtlrDevice() @@ -37,7 +38,7 @@ QemuSysCtlrDevice::ReadPort(uint32 offse } else { // 他のポートがどうなるのかは仕様に書いてない。 data.SetBusErr(); - putlog(1, "Read $%08x (BusErr)", mpu->GetPaddr()); + putlog(1, "Read $%08x (BusErr)", GetMainbusDevice()->GetPaddr()); } data |= BusData::Size4; @@ -69,13 +70,17 @@ QemuSysCtlrDevice::WritePort(uint32 offs break; case 2: // halt - case 3: // panic GetPowerDevice()->PushPowerButton(); break; + + case 3: // panic + DoPanic(); + break; } } else { // 他のポートがどうなるのかは仕様に書いてない。 - putlog(1, "Write $%08x <- $%08x (BusErr)", mpu->GetPaddr(), data); + putlog(1, "Write $%08x <- $%08x (BusErr)", + GetMainbusDevice()->GetPaddr(), data); r.SetBusErr(); } @@ -92,3 +97,13 @@ QemuSysCtlrDevice::PeekPort(uint32 offse return BusData::BusErr; } } + +// ゲストがパニックしたので、状態を保全して停止。 +// 本当はデバッガで止まるとかすればいいんだろうけど。 +void +QemuSysCtlrDevice::DoPanic() +{ + // 速度だけは落としておく。 + auto syncer = GetSyncer(); + syncer->NotifyFullSpeed(false); +}