--- nono/vm/virtio_base.h 2026/04/29 17:05:28 1.1.1.2 +++ nono/vm/virtio_base.h 2026/04/29 17:05:32 1.1.1.3 @@ -12,7 +12,6 @@ #include "device.h" #include "message.h" -#include "monitor.h" #include "thread.h" #include #include @@ -21,13 +20,15 @@ class InterruptDevice; class MainbusDevice; class MainRAMDevice; class TextScreen; +class VirtIODevice; class VirtIOThread; class VirtQDesc; class VirtQueue { public: - VirtQueue(int idx_, const std::string& name_, int num_max_); + VirtQueue(VirtIODevice *parent_, int idx_, const std::string& name_, + int num_max_); // idx_ % num を返す。 // num が 0 なら何でもいいので死なないように 0 を返す。 @@ -49,6 +50,15 @@ class VirtQueue uint num {}; // QUEUE_NUM (合意できたディスクリプタ数) uint num_max {}; // QUEUE_NUM の上限 + + // QUEUE_READY の設定と取得。 + // Get は副作用を起こしてはいけない。 + void SetReady(uint32 val); + uint32 GetReady() const noexcept { return ready; } + + private: + VirtIODevice *parent {}; + uint32 ready {}; // QUEUE_READY }; @@ -86,6 +96,7 @@ class VirtIOReq class VirtIODevice : public IODevice { using inherited = IODevice; + friend class VirtQueue; protected: // 仕様書には名前が出てこないけど上限 @@ -121,7 +132,7 @@ class VirtIODevice : public IODevice int MonitorUpdateVirtQDesc(TextScreen&, int y, const VirtQueue&) const; void Reset(); virtual uint32 GetReg(uint32 addr) const; - virtual void QueueReady(); + virtual void QueueReadyChanged(VirtQueue *); // ディスクリプタを一つ処理する。 virtual void ProcessDesc(VirtIOReq&) = 0; @@ -204,7 +215,7 @@ class VirtIODevice : public IODevice MainbusDevice *mainbus {}; MainRAMDevice *mainram {}; - Monitor monitor { this }; + Monitor *monitor {}; }; // VirtIO 空きスロット用