--- nono/vm/v68kio.cpp 2026/04/29 17:05:25 1.1.1.1 +++ nono/vm/v68kio.cpp 2026/04/29 17:05:29 1.1.1.2 @@ -5,11 +5,11 @@ // // -// virt68k の I/O 空間担当 +// virt-m68k の I/O 空間担当 // // メモリマップ。 -// NetBSD/virt68k は $ff00'0000 以降が I/O 空間で、デバイス配置は +// virt-m68k は $ff00'0000 以降が I/O 空間で、デバイス配置は // ブートローダ (実質 BIOS) からカーネルにパラメータとして渡される。 // 各デバイスの先頭番地こそ自由だが、同種のデバイスが連続する場合 // 配置間隔がデバイスによって異なっておりその長さはハードコードのようだ。 @@ -33,26 +33,27 @@ // $ff07'xxxx VirtIO // // VirtIO は間隔が違うので最後に置く。 -// ここは 1スロット $200 で、最大 127個まで置けるようだ。 +// ここは 1スロット $200 で、最大 128個まで置けるようだ。 // デバイスが存在しないスロットはバスエラーではなく、DEVICE_ID = INVALID // で応答しなければならない。 // -// $ff07'0000-$ff07'01ff VirtIO(00) -// $ff07'0200-$ff07'03ff VirtIO(01) +// $ff07'0000-$ff07'01ff VirtIO (slot $00) +// $ff07'0200-$ff07'03ff VirtIO (slot $01) // : -// $ff07'fe00-$ff07'ffff VirtIO(7f) +// $ff07'fe00-$ff07'ffff VirtIO (slot $7f) #include "v68kio.h" +#include "busio.h" #include "config.h" #include "goldfish_pic.h" #include "goldfish_rtc.h" #include "goldfish_timer.h" #include "goldfish_tty.h" -#include "mainbus.h" #include "qemusysctlr.h" #include "romemu_virt68k.h" #include "virtio_base.h" #include "virtio_block.h" +#include "virtio_entropy.h" #include "virtio_net.h" #include "vm.h" @@ -61,17 +62,17 @@ V68kIODevice::V68kIODevice() : inherited(OBJ_V68KIO) { NEWDV(PROM, new Virt68kROMEmuDevice()); - NEWDV(GFPIC1, new GFPICDevice(1)); - NEWDV(GFPIC2, new GFPICDevice(2)); - NEWDV(GFPIC3, new GFPICDevice(3)); - NEWDV(GFPIC4, new GFPICDevice(4)); - NEWDV(GFPIC5, new GFPICDevice(5)); - NEWDV(GFPIC6, new GFPICDevice(6)); - NEWDV(GFRTC, new GFRTCDevice()); // required by GFTimer - NEWDV(GFTimer, new GFTimerDevice()); - NEWDV(GFTTY, new GFTTYDevice()); - NEWDV(QemuSysCtlr, new QemuSysCtlrDevice()); - NEWDV(VirtIONone, new VirtIONoneDevice()); + NEWDV(GFPIC1, new BusIO_L(1)); + NEWDV(GFPIC2, new BusIO_L(2)); + NEWDV(GFPIC3, new BusIO_L(3)); + NEWDV(GFPIC4, new BusIO_L(4)); + NEWDV(GFPIC5, new BusIO_L(5)); + NEWDV(GFPIC6, new BusIO_L(6)); + NEWDV(GFRTC, new BusIO_L()); // required by GFTimer + NEWDV(GFTimer, new BusIO_L()); + NEWDV(GFTTY, new BusIO_L()); + NEWDV(QemuSysCtlr, new BusIO_L()); + NEWDV(VirtIONone, new BusIO_L()); buserr = GetBusErrDevice(); @@ -111,21 +112,31 @@ V68kIODevice::~V68kIODevice() bool V68kIODevice::Create() { - int slot; + uint slot; - // (QEMU virt68k の?) + // (QEMU virt-m68k の?) // virtio はスロットによって割り込み先を固定してあるようだ。 // スロット 0 .. 31 は PIC2(Lv2) の IRQ1..32、 // スロット 32 .. 63 は PIC3(Lv3) の IRQ1..32、 // スロット 64 .. 95 は PIC4(Lv4) の IRQ1..32、 // スロット 96 ..127 は PIC5(Lv5) の IRQ1..32 となる。 // - // Block、Net はとりあえず先例にならって Lv5 につなぐことにしてみる。 + // VirtIO* はとりあえず先例にならって Lv5 につなぐことにしてみる。 slot = 96; // Net if (true) { - pVirtIO[slot].reset(new VirtIONetDevice(slot)); + pVirtIO[slot].reset(new BusIO_L(slot)); + if ((bool)pVirtIO[slot] == false) { + return false; + } + viotable[slot] = pVirtIO[slot].get(); + slot++; + } + + // Entropy + if (true) { + pVirtIO[slot].reset(new BusIO_L(slot)); if ((bool)pVirtIO[slot] == false) { return false; } @@ -135,7 +146,7 @@ V68kIODevice::Create() // Block (とりあえず8個まで) for (int id = 0; id < 8; id++) { - const std::string key = string_format("virtio-block%d-image", id); + const std::string key = string_format("virtio-block%u-image", id); const ConfigItem& item = gConfig->Find(key); const std::string& image = item.AsString(); @@ -143,11 +154,11 @@ V68kIODevice::Create() if (image.empty()) { // 未接続部分のパラメータは減らしておくか。 // --show-config するとさすがに無駄に多くて邪魔なので。 - gConfig->Delete(string_format("virtio-block%d-writeignore", id)); + gConfig->Delete(string_format("virtio-block%u-writeignore", id)); continue; } - pVirtIO[slot].reset(new VirtIOBlockDevice(slot, id)); + pVirtIO[slot].reset(new BusIO_L(slot, id)); if ((bool)pVirtIO[slot] == false) { item.Err(); // ? return false; @@ -186,57 +197,29 @@ V68kIODevice::SearchDevice(uint32 addr) } busdata -V68kIODevice::Read8(uint32 addr) -{ - IODevice *d = SearchDevice(addr); - return d->Read8(addr); -} - -busdata -V68kIODevice::Read16(uint32 addr) -{ - IODevice *d = SearchDevice(addr); - return d->Read16(addr); -} - -busdata -V68kIODevice::Read32(uint32 addr) +V68kIODevice::Read(busaddr addr) { - IODevice *d = SearchDevice(addr); - return d->Read32(addr); + IODevice *d = SearchDevice(addr.Addr()); + return d->Read(addr); } busdata -V68kIODevice::Write8(uint32 addr, uint32 data) +V68kIODevice::Write(busaddr addr, uint32 data) { - IODevice *d = SearchDevice(addr); - return d->Write8(addr, data); -} - -busdata -V68kIODevice::Write16(uint32 addr, uint32 data) -{ - IODevice *d = SearchDevice(addr); - return d->Write16(addr, data); -} - -busdata -V68kIODevice::Write32(uint32 addr, uint32 data) -{ - IODevice *d = SearchDevice(addr); - return d->Write32(addr, data); + IODevice *d = SearchDevice(addr.Addr()); + return d->Write(addr, data); } busdata -V68kIODevice::Peek8(uint32 addr) +V68kIODevice::Peek1(uint32 addr) { IODevice *d = SearchDevice(addr); - return d->Peek8(addr); + return d->Peek1(addr); } bool -V68kIODevice::Poke8(uint32 addr, uint32 data) +V68kIODevice::Poke1(uint32 addr, uint32 data) { IODevice *d = SearchDevice(addr); - return d->Poke8(addr, data); + return d->Poke1(addr, data); }