--- nono/vm/virtio_block.cpp 2026/04/29 17:05:42 1.1.1.4 +++ nono/vm/virtio_block.cpp 2026/04/29 17:05:50 1.1.1.5 @@ -227,6 +227,10 @@ VirtIOBlockDevice::ProcessDesc(VirtIOReq access_write = q->last_avail_idx; break; + case VIRTIO_BLK_T_GET_ID: + status = CmdGetID(req, datalen); + break; + default: putlog(0, "%s req.type=%u (NOT IMPLEMENTED)", __func__, type); status = VIRTIO_BLK_S_UNSUPP; @@ -264,6 +268,23 @@ VirtIOBlockDevice::CmdWrite(VirtIOReq& r return VIRTIO_BLK_S_IOERR; } + return VIRTIO_BLK_S_OK; +} + +// ID 取得コマンド (BLK_T_GET_ID) 実行。 +uint32 +VirtIOBlockDevice::CmdGetID(VirtIOReq& req, uint32 datalen) +{ + std::vector databuf(datalen); + + // Device ID string を返すらしいが、どういう文字列か分からん。 + // 20バイトで余りはゼロ埋め。20文字なら終端文字なしで 20文字有効。 + snprintf((char *)databuf.data(), datalen, "virtio-block%u", id); + + if (ReqWriteRegion(req, databuf.data(), datalen) != 0) { + return VIRTIO_BLK_S_IOERR; + } + return VIRTIO_BLK_S_OK; }