45template <TransportConcept TransportImpl>
79 uint64_t device_features =
transport_.GetDeviceFeatures();
80 uint64_t negotiated_features = device_features & driver_features;
82 transport_.SetDriverFeatures(negotiated_features);
97 return negotiated_features;
116 [[nodiscard]]
auto SetupQueue(uint32_t queue_idx, uint64_t desc_phys,
117 uint64_t avail_phys, uint64_t used_phys,
123 uint32_t max_size =
transport_.GetQueueNumMax(queue_idx);
127 if (queue_size > max_size) {
131 transport_.SetQueueNum(queue_idx, queue_size);
132 transport_.SetQueueDesc(queue_idx, desc_phys);
133 transport_.SetQueueAvail(queue_idx, avail_phys);
134 transport_.SetQueueUsed(queue_idx, used_phys);
158 uint32_t current_status =
transport_.GetStatus();
181 [[nodiscard]]
auto transport() const -> const TransportImpl& {
auto operator=(DeviceInitializer &&) -> DeviceInitializer &=delete
DeviceInitializer(TransportImpl &transport)
构造函数
auto Activate() -> Expected< void >
激活设备,开始正常运行
auto SetupQueue(uint32_t queue_idx, uint64_t desc_phys, uint64_t avail_phys, uint64_t used_phys, uint32_t queue_size) -> Expected< void >
配置并激活指定的 virtqueue
auto transport() const -> const TransportImpl &
auto transport() -> TransportImpl &
获取底层传输层引用
DeviceInitializer(const DeviceInitializer &)=delete
auto Init(uint64_t driver_features) -> Expected< uint64_t >
执行 virtio 设备初始化序列
~DeviceInitializer()=default
TransportImpl & transport_
底层传输层引用
auto operator=(const DeviceInitializer &) -> DeviceInitializer &=delete
DeviceInitializer()=delete
DeviceInitializer(DeviceInitializer &&)=delete
@ kDriver
表示客户操作系统知道如何驱动该设备
@ kDriverOk
表示驱动程序已准备好驱动设备(特性协商完成)
@ kDeviceNeedsReset
表示设备需要重置
@ kFeaturesOk
表示驱动程序已确认设备提供的所有功能
@ kAcknowledge
表示客户操作系统已找到设备并识别为有效的 virtio 设备
@ kFailed
表示在客户机中出现问题,已放弃该设备
@ kTransportNotInitialized
传输层未正确初始化
@ kQueueTooLarge
请求的队列大小超过设备支持的最大值
@ kFeatureNegotiationFailed
特性协商失败
@ kQueueNotAvailable
队列不可用(queue_num_max == 0)
std::expected< T, Error > Expected
std::expected 别名模板