SimpleKernel 1.17.0
Loading...
Searching...
No Matches
transport.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include <utility>
8
9#include "expected.hpp"
10#include "virtio/defs.h"
11
12namespace virtio {
13
26template <typename T>
28 requires(T t, const T ct, uint32_t u32, uint64_t u64) {
29 // 设备有效性
30 { ct.IsValid() } -> std::same_as<bool>;
31
32 // 设备/供应商标识
33 { ct.GetDeviceId() } -> std::same_as<uint32_t>;
34 { ct.GetVendorId() } -> std::same_as<uint32_t>;
35
36 // 设备状态
37 { ct.GetStatus() } -> std::same_as<uint32_t>;
38 { t.SetStatus(u32) } -> std::same_as<void>;
39
40 // 特性协商(非 const:MMIO 需写选择器寄存器)
41 { t.GetDeviceFeatures() } -> std::same_as<uint64_t>;
42 { t.SetDriverFeatures(u64) } -> std::same_as<void>;
43
44 // 队列配置(非 const:MMIO 需写 QueueSel)
45 { t.GetQueueNumMax(u32) } -> std::same_as<uint32_t>;
46 { t.SetQueueNum(u32, u32) } -> std::same_as<void>;
47 { t.SetQueueDesc(u32, u64) } -> std::same_as<void>;
48 { t.SetQueueAvail(u32, u64) } -> std::same_as<void>;
49 { t.SetQueueUsed(u32, u64) } -> std::same_as<void>;
50 { t.GetQueueReady(u32) } -> std::same_as<bool>;
51 { t.SetQueueReady(u32, static_cast<bool>(true)) } -> std::same_as<void>;
52
53 // 队列通知
54 { t.NotifyQueue(u32) } -> std::same_as<void>;
55
56 // 中断处理
57 { ct.GetInterruptStatus() } -> std::same_as<uint32_t>;
58 { t.AckInterrupt(u32) } -> std::same_as<void>;
59
60 // 配置空间读取
61 { ct.ReadConfigU8(u32) } -> std::same_as<uint8_t>;
62 { ct.ReadConfigU16(u32) } -> std::same_as<uint16_t>;
63 { ct.ReadConfigU32(u32) } -> std::same_as<uint32_t>;
64 { ct.ReadConfigU64(u32) } -> std::same_as<uint64_t>;
65 { ct.GetConfigGeneration() } -> std::same_as<uint32_t>;
66 };
67
83class Transport {
84 public:
89 enum class DeviceStatus : uint32_t {
91 kReset = 0,
93 kAcknowledge = 1,
95 kDriver = 2,
97 kDriverOk = 4,
99 kFeaturesOk = 8,
103 kFailed = 128,
104 };
105
110 auto Reset(this auto&& self) -> void {
111 self.SetStatus(std::to_underlying(DeviceStatus::kReset));
112 }
113
120 [[nodiscard]] auto NeedsReset(this auto const& self) -> bool {
121 return (self.GetStatus() &
122 std::to_underlying(DeviceStatus::kDeviceNeedsReset)) != 0;
123 }
124
128 [[nodiscard]] auto IsActive(this auto const& self) -> bool {
129 return (self.GetStatus() & std::to_underlying(DeviceStatus::kDriverOk)) !=
130 0;
131 }
132
137 auto AcknowledgeInterrupt(this auto&& self) -> void {
138 auto status = self.GetInterruptStatus();
139 if (status != 0) {
140 self.AckInterrupt(status);
141 }
142 }
143
144 protected:
147 Transport() = default;
148 ~Transport() = default;
149 Transport(Transport&&) noexcept = default;
150 auto operator=(Transport&&) noexcept -> Transport& = default;
151 Transport(const Transport&) = delete;
152 auto operator=(const Transport&) -> Transport& = delete;
154};
155
156} // namespace virtio
Virtio 传输层基类(零虚表开销,C++23 Deducing this)
Definition transport.hpp:83
~Transport()=default
DeviceStatus
设备状态位定义
Definition transport.hpp:89
@ kDriver
表示客户操作系统知道如何驱动该设备
@ kDriverOk
表示驱动程序已准备好驱动设备(特性协商完成)
@ kDeviceNeedsReset
表示设备需要重置
@ kFeaturesOk
表示驱动程序已确认设备提供的所有功能
@ kAcknowledge
表示客户操作系统已找到设备并识别为有效的 virtio 设备
@ kFailed
表示在客户机中出现问题,已放弃该设备
@ kReset
重置状态,驱动程序将此写入以重置设备
auto AcknowledgeInterrupt(this auto &&self) -> void
确认并清除设备中断
auto Reset(this auto &&self) -> void
重置设备
Transport(Transport &&) noexcept=default
Transport()=default
auto NeedsReset(this auto const &self) -> bool
检查设备是否需要重置
auto IsActive(this auto const &self) -> bool
检查设备是否已激活(DRIVER_OK 已设置)
Virtio 传输层接口约束
Definition transport.hpp:27
Definition defs.h:9