SimpleKernel
1.17.0
Loading...
Searching...
No Matches
virtqueue_base.hpp
Go to the documentation of this file.
1
5
#pragma once
6
7
#include <
cpu_io.h
>
8
9
#include <cstdint>
10
11
#include "
expected.hpp
"
12
#include "
virtio/virt_queue/misc.hpp
"
13
14
namespace
virtio
{
15
42
class
VirtqueueBase
{
43
public
:
58
[[nodiscard]]
auto
SubmitChainWithBarrier
(
59
this
auto
&& self,
const
IoVec
* readable,
size_t
readable_count,
60
const
IoVec
* writable,
size_t
writable_count) ->
Expected<uint16_t>
{
61
// 写屏障:确保调用方填充的数据对设备可见
62
cpu_io::Wmb
();
63
auto
result =
64
self.SubmitChain(readable, readable_count, writable, writable_count);
65
if
(result.has_value()) {
66
cpu_io::Mb
();
67
}
68
return
result;
69
}
70
84
template
<
typename
Callback>
85
auto
ProcessUsedWithCallback
(
this
auto
&& self, Callback&& callback)
86
-> uint32_t {
87
// 读屏障:确保读取到设备最新的 Used Ring 写入
88
cpu_io::Rmb
();
89
90
uint32_t processed = 0;
91
while
(self.HasUsed()) {
92
auto
result = self.PopUsed();
93
if
(!result.has_value()) {
94
break
;
95
}
96
97
auto
elem = *result;
98
auto
head =
static_cast<
uint16_t
>
(elem.id);
99
callback(head, elem.len);
100
(void)self.FreeChain(head);
101
++processed;
102
}
103
return
processed;
104
}
105
106
protected
:
109
VirtqueueBase
() =
default
;
110
~VirtqueueBase
() =
default
;
111
VirtqueueBase
(
VirtqueueBase
&&) noexcept = default;
112
auto operator=(
VirtqueueBase
&&) noexcept ->
VirtqueueBase
& = default;
113
VirtqueueBase
(const
VirtqueueBase
&) = delete;
114
auto operator=(const
VirtqueueBase
&) ->
VirtqueueBase
& = delete;
116
};
117
118
}
// namespace virtio
virtio::VirtqueueBase
Virtqueue 基类(C++23 Deducing this 编译期多态)
Definition
virtqueue_base.hpp:42
virtio::VirtqueueBase::VirtqueueBase
VirtqueueBase(VirtqueueBase &&) noexcept=default
virtio::VirtqueueBase::VirtqueueBase
VirtqueueBase()=default
virtio::VirtqueueBase::~VirtqueueBase
~VirtqueueBase()=default
virtio::VirtqueueBase::SubmitChainWithBarrier
auto SubmitChainWithBarrier(this auto &&self, const IoVec *readable, size_t readable_count, const IoVec *writable, size_t writable_count) -> Expected< uint16_t >
提交 Scatter-Gather 链并通知设备
Definition
virtqueue_base.hpp:58
virtio::VirtqueueBase::ProcessUsedWithCallback
auto ProcessUsedWithCallback(this auto &&self, Callback &&callback) -> uint32_t
处理已完成的缓冲区并释放描述符链
Definition
virtqueue_base.hpp:85
cpu_io.h
expected.hpp
Expected
std::expected< T, Error > Expected
std::expected 别名模板
Definition
expected.hpp:365
misc.hpp
cpu_io::Wmb
void Wmb()
Definition
cpu_io.h:58
cpu_io::Mb
void Mb()
Definition
cpu_io.h:56
cpu_io::Rmb
void Rmb()
Definition
cpu_io.h:57
virtio
Definition
defs.h:9
virtio::IoVec
Scatter-Gather IO 物理内存向量
Definition
misc.hpp:43
src
device
virtio
virt_queue
virtqueue_base.hpp
Generated by
1.9.8