SimpleKernel 1.17.0
Loading...
Searching...
No Matches
virtio::Transport Class Reference

Virtio 传输层基类(零虚表开销,C++23 Deducing this) More...

#include <transport.hpp>

Inheritance diagram for virtio::Transport:
Inheritance graph
Collaboration diagram for virtio::Transport:
Collaboration graph

Public Types

enum class  DeviceStatus : uint32_t {
  kReset = 0 , kAcknowledge = 1 , kDriver = 2 , kDriverOk = 4 ,
  kFeaturesOk = 8 , kDeviceNeedsReset = 64 , kFailed = 128
}
 设备状态位定义 More...
 

Public Member Functions

auto Reset (this auto &&self) -> void
 重置设备
 
auto NeedsReset (this auto const &self) -> bool
 检查设备是否需要重置
 
auto IsActive (this auto const &self) -> bool
 检查设备是否已激活(DRIVER_OK 已设置)
 
auto AcknowledgeInterrupt (this auto &&self) -> void
 确认并清除设备中断
 

Protected Member Functions

构造/析构函数(仅允许派生类使用)
 Transport ()=default
 
 ~Transport ()=default
 
 Transport (Transport &&) noexcept=default
 
auto operator= (Transport &&) noexcept -> Transport &=default
 
 Transport (const Transport &)=delete
 
auto operator= (const Transport &) -> Transport &=delete
 

Detailed Description

Virtio 传输层基类(零虚表开销,C++23 Deducing this)

利用 C++23 Deducing this(显式对象参数,P0847)实现编译期多态, 消除虚表指针开销和 CRTP static_cast 样板代码,实现零开销抽象。 子类(MmioTransport、PciTransport)继承此基类并提供具体的寄存器访问实现。

基类仅提供通用逻辑方法(Reset、NeedsReset、IsActive、AcknowledgeInterrupt), 通过 Deducing this 在编译期静态分发到子类的具体实现。

子类应满足 TransportConcept 约束。

See also
TransportConcept
virtio-v1.2#4 Virtio Transport Options

Definition at line 83 of file transport.hpp.

Member Enumeration Documentation

◆ DeviceStatus

enum class virtio::Transport::DeviceStatus : uint32_t
strong

设备状态位定义

See also
virtio-v1.2#2.1 Device Status Field
Enumerator
kReset 

重置状态,驱动程序将此写入以重置设备

kAcknowledge 

表示客户操作系统已找到设备并识别为有效的 virtio 设备

kDriver 

表示客户操作系统知道如何驱动该设备

kDriverOk 

表示驱动程序已准备好驱动设备(特性协商完成)

kFeaturesOk 

表示驱动程序已确认设备提供的所有功能

kDeviceNeedsReset 

表示设备需要重置

kFailed 

表示在客户机中出现问题,已放弃该设备

Definition at line 89 of file transport.hpp.

89 : uint32_t {
91 kReset = 0,
93 kAcknowledge = 1,
95 kDriver = 2,
97 kDriverOk = 4,
99 kFeaturesOk = 8,
103 kFailed = 128,
104 };
@ kDriver
表示客户操作系统知道如何驱动该设备
@ kDriverOk
表示驱动程序已准备好驱动设备(特性协商完成)
@ kDeviceNeedsReset
表示设备需要重置
@ kFeaturesOk
表示驱动程序已确认设备提供的所有功能
@ kAcknowledge
表示客户操作系统已找到设备并识别为有效的 virtio 设备
@ kFailed
表示在客户机中出现问题,已放弃该设备
@ kReset
重置状态,驱动程序将此写入以重置设备

Constructor & Destructor Documentation

◆ Transport() [1/3]

virtio::Transport::Transport ( )
protecteddefault

◆ ~Transport()

virtio::Transport::~Transport ( )
protecteddefault

◆ Transport() [2/3]

virtio::Transport::Transport ( Transport &&  )
protecteddefaultnoexcept

◆ Transport() [3/3]

virtio::Transport::Transport ( const Transport )
protecteddelete

Member Function Documentation

◆ AcknowledgeInterrupt()

auto virtio::Transport::AcknowledgeInterrupt ( this auto &&  self) -> void
inline

确认并清除设备中断

See also
virtio-v1.2#2.3 Notifications

Definition at line 137 of file transport.hpp.

137 {
138 auto status = self.GetInterruptStatus();
139 if (status != 0) {
140 self.AckInterrupt(status);
141 }
142 }

◆ IsActive()

auto virtio::Transport::IsActive ( this auto const &  self) -> bool
inline

检查设备是否已激活(DRIVER_OK 已设置)

Definition at line 128 of file transport.hpp.

128 {
129 return (self.GetStatus() & std::to_underlying(DeviceStatus::kDriverOk)) !=
130 0;
131 }

◆ NeedsReset()

auto virtio::Transport::NeedsReset ( this auto const &  self) -> bool
inline

检查设备是否需要重置

Returns
true 表示设备需要重置
See also
virtio-v1.2#2.1 Device Status Field

Definition at line 120 of file transport.hpp.

120 {
121 return (self.GetStatus() &
122 std::to_underlying(DeviceStatus::kDeviceNeedsReset)) != 0;
123 }

◆ operator=() [1/2]

auto virtio::Transport::operator= ( const Transport ) -> Transport &=delete
protecteddelete

◆ operator=() [2/2]

auto virtio::Transport::operator= ( Transport &&  ) -> Transport &=default
protecteddefaultnoexcept

◆ Reset()

auto virtio::Transport::Reset ( this auto &&  self) -> void
inline

重置设备

See also
virtio-v1.2#2.1 Device Status Field

Definition at line 110 of file transport.hpp.

110 {
111 self.SetStatus(std::to_underlying(DeviceStatus::kReset));
112 }
Here is the caller graph for this function:

The documentation for this class was generated from the following file: