165 other.is_valid_ =
false;
202 return (hi << 32) | lo;
214 static_cast<uint32_t
>(features));
218 static_cast<uint32_t
>(features >> 32));
249 static_cast<uint32_t
>(addr));
251 static_cast<uint32_t
>(addr >> 32));
263 static_cast<uint32_t
>(addr));
265 static_cast<uint32_t
>(addr >> 32));
277 static_cast<uint32_t
>(addr));
279 static_cast<uint32_t
>(addr >> 32));
353 static constexpr uint32_t kMaxConfigRetries = 1000;
354 uint32_t retries = 0;
358 auto* ptr =
reinterpret_cast<volatile uint32_t*
>(
360 uint64_t lo = ptr[0];
361 uint64_t hi = ptr[1];
362 value = (hi << 32) | lo;
365 }
while (gen1 != gen2 && ++retries < kMaxConfigRetries);
uint32_t device_id_
设备 ID(缓存以避免重复读取)
auto AckInterrupt(uint32_t ack_bits) -> void
auto GetInterruptStatus() const -> uint32_t
auto SetDriverFeatures(uint64_t features) -> void
写入 64 位驱动特性
auto GetStatus() const -> uint32_t
uint32_t vendor_id_
供应商 ID(缓存以避免重复读取)
MmioTransport(uint64_t base)
构造函数
MmioAccessor mmio_
MMIO 寄存器访问器
auto GetDeviceFeatures() -> uint64_t
读取 64 位设备特性
auto GetDeviceId() const -> uint32_t
auto ReadConfigU64(uint32_t offset) const -> uint64_t
读取配置空间 64 位值
auto SetQueueDesc(uint32_t queue_idx, uint64_t addr) -> void
设置描述符表物理地址
auto GetQueueReady(uint32_t queue_idx) -> bool
auto GetConfigGeneration() const -> uint32_t
auto ReadConfigU8(uint32_t offset) const -> uint8_t
读取配置空间 8 位值
auto operator=(MmioTransport &&) noexcept -> MmioTransport &=delete
auto GetVendorId() const -> uint32_t
auto GetQueueNumMax(uint32_t queue_idx) -> uint32_t
获取队列最大容量
auto ReadConfigU32(uint32_t offset) const -> uint32_t
读取配置空间 32 位值
auto IsValid() const -> bool
检查设备是否成功初始化
auto SetQueueReady(uint32_t queue_idx, bool ready) -> void
auto NotifyQueue(uint32_t queue_idx) -> void
通知设备有新的可用缓冲区
auto SetQueueNum(uint32_t queue_idx, uint32_t num) -> void
auto SetQueueAvail(uint32_t queue_idx, uint64_t addr) -> void
设置 Available Ring 物理地址
auto SetStatus(uint32_t status) -> void
MmioTransport(MmioTransport &&other) noexcept
auto SetQueueUsed(uint32_t queue_idx, uint64_t addr) -> void
设置 Used Ring 物理地址
auto ReadConfigU16(uint32_t offset) const -> uint16_t
读取配置空间 16 位值
Virtio 传输层基类(零虚表开销,C++23 Deducing this)
auto Reset(this auto &&self) -> void
重置设备
InterruptStatus
MMIO 中断状态位
@ kConfigChange
设备配置已更改 Configuration Change Notification
@ kUsedBuffer
设备在至少一个活动虚拟队列中使用了缓冲区 Used Buffer Notification
static constexpr uint32_t kMmioMagicValue
MMIO 魔数: little-endian "virt" = 0x74726976.
static constexpr uint32_t kMmioVersionModern
Modern VirtIO MMIO 版本号(VirtIO 1.0+)
auto Write(size_t offset, T val) const -> void
Write to MMIO register.
auto Read(size_t offset) const -> T
Read from MMIO register.