ReXGlue SDK
Loading...
Searching...
No Matches
list.h
Go to the documentation of this file.
1
13
14#pragma once
15
16#include <type_traits>
17
18#include <rex/assert.h>
19#include <rex/kernel/heap.h>
20#include <rex/types.h>
21
22namespace rex::kernel {
23
25 be_u32 flink_ptr;
26 be_u32 blink_ptr;
27};
28REX_STATIC_ASSERT_SIZE(X_LIST_ENTRY, 8);
29
31 be_u32 next;
32};
33REX_STATIC_ASSERT_SIZE(X_SINGLE_LIST_ENTRY, 4);
34
40REX_STATIC_ASSERT_SIZE(X_SLIST_HEADER, 8);
41
43 be_u32 owner_pcr;
44};
45REX_STATIC_ASSERT_SIZE(X_KSPINLOCK, 4);
46
47} // namespace rex::kernel
48
49namespace rex::kernel {
50
57template <typename VirtualTranslator>
58X_LIST_ENTRY* HostListEntry(u32 ptr, VirtualTranslator context) {
59 return context->template TranslateVirtual<X_LIST_ENTRY*>(ptr);
60}
61
62template <typename VirtualTranslator>
63u32 GuestListAddress(X_LIST_ENTRY* ptr, VirtualTranslator context) {
64 return context->HostToGuestVirtual(ptr);
65}
66
72template <typename VirtualTranslator>
73void InitializeListHead(X_LIST_ENTRY* entry, VirtualTranslator context) {
74 if constexpr (std::is_unsigned_v<VirtualTranslator>) {
75 entry->blink_ptr = context;
76 entry->flink_ptr = context;
77 } else {
78 u32 orig_ptr = GuestListAddress(entry, context);
79 entry->blink_ptr = orig_ptr;
80 entry->flink_ptr = orig_ptr;
81 }
82}
83
89template <typename VirtualTranslator>
90bool IsListEmpty(X_LIST_ENTRY* entry, VirtualTranslator context) {
91 return HostListEntry(entry->flink_ptr, context) == entry;
92}
93
94template <typename VirtualTranslator>
95void RemoveEntryList(X_LIST_ENTRY* entry, VirtualTranslator context) {
96 u32 front = entry->flink_ptr;
97 u32 back = entry->blink_ptr;
98 HostListEntry(back, context)->flink_ptr = front;
99 HostListEntry(front, context)->blink_ptr = back;
100}
101
107template <typename VirtualTranslator>
108void RemoveEntryList(u32 entry, VirtualTranslator context) {
109 RemoveEntryList(HostListEntry(entry, context), context);
110}
111
117template <typename VirtualTranslator>
118u32 RemoveHeadList(X_LIST_ENTRY* entry, VirtualTranslator context) {
119 u32 result = entry->flink_ptr;
120 RemoveEntryList(result, context);
121 return result;
122}
123
130template <typename VirtualTranslator>
131void InsertTailList(X_LIST_ENTRY* list_head, u32 list_head_guest, X_LIST_ENTRY* host_entry,
132 u32 entry, VirtualTranslator context) {
133 u32 old_tail = list_head->blink_ptr;
134 host_entry->flink_ptr = list_head_guest;
135 host_entry->blink_ptr = old_tail;
136 HostListEntry(old_tail, context)->flink_ptr = entry;
137 list_head->blink_ptr = entry;
138}
139
146template <typename VirtualTranslator>
147void InsertTailList(u32 list_head, u32 entry, VirtualTranslator context) {
148 InsertTailList(HostListEntry(list_head, context), list_head, HostListEntry(entry, context), entry,
149 context);
150}
151
152template <typename VirtualTranslator>
153void InsertTailList(X_LIST_ENTRY* list_head, X_LIST_ENTRY* entry, VirtualTranslator context) {
154 InsertTailList(list_head, GuestListAddress(list_head, context), entry,
155 GuestListAddress(entry, context), context);
156}
157
164template <typename VirtualTranslator>
165void InsertHeadList(X_LIST_ENTRY* list_head, u32 list_head_guest, X_LIST_ENTRY* host_entry,
166 u32 entry, VirtualTranslator context) {
167 u32 old_list_head_flink = list_head->flink_ptr;
168 host_entry->flink_ptr = old_list_head_flink;
169 host_entry->blink_ptr = list_head_guest;
170 HostListEntry(old_list_head_flink, context)->blink_ptr = entry;
171 list_head->flink_ptr = entry;
172}
173
179template <typename VirtualTranslator>
180void InsertHeadList(u32 list_head, X_LIST_ENTRY* entry, VirtualTranslator context) {
181 InsertHeadList(HostListEntry(list_head, context), list_head, entry,
182 GuestListAddress(entry, context), context);
183}
184
185template <typename VirtualTranslator>
186void InsertHeadList(X_LIST_ENTRY* list_head, X_LIST_ENTRY* entry, VirtualTranslator context) {
187 InsertHeadList(list_head, GuestListAddress(list_head, context), entry,
188 GuestListAddress(entry, context), context);
189}
190
196template <typename TObject, size_t EntryListOffset>
197struct X_TYPED_LIST : public X_LIST_ENTRY {
199
200 static X_LIST_ENTRY* ObjectListEntry(TObject* obj) {
201 return reinterpret_cast<X_LIST_ENTRY*>(
202 &reinterpret_cast<char*>(obj)[static_cast<ptrdiff_t>(EntryListOffset)]);
203 }
204
205 static TObject* ListEntryObject(X_LIST_ENTRY* entry) {
206 return reinterpret_cast<TObject*>(
207 &reinterpret_cast<char*>(entry)[-static_cast<ptrdiff_t>(EntryListOffset)]);
208 }
209
213 template <typename VirtualTranslator>
215 VirtualTranslator vt;
216 u32 current_entry;
217
218 ForwardIterator& operator++() {
219 current_entry = vt->template TranslateVirtual<X_LIST_ENTRY*>(current_entry)->flink_ptr;
220 return *this;
221 }
222
223 bool operator!=(u32 other_ptr) const { return current_entry != other_ptr; }
224
225 TObject& operator*() {
226 return *ListEntryObject(vt->template TranslateVirtual<X_LIST_ENTRY*>(current_entry));
227 }
228 };
229
233 template <typename VirtualTranslator>
235 VirtualTranslator vt;
236 ThisType* const list_head;
237
239 return ForwardIterator<VirtualTranslator>{vt, list_head->flink_ptr};
240 }
241
242 u32 end() { return vt->HostToGuestVirtual(list_head); }
243 };
244
245 template <typename VirtualTranslator>
246 ForwardIteratorBegin<VirtualTranslator> IterateForward(VirtualTranslator vt) {
248 }
249
253 template <typename VirtualTranslator>
254 void Initialize(VirtualTranslator translator) {
255 InitializeListHead(this, translator);
256 }
257
258 template <typename VirtualTranslator>
259 void InsertHead(TObject* entry, VirtualTranslator translator) {
260 InsertHeadList(static_cast<X_LIST_ENTRY*>(this), ObjectListEntry(entry), translator);
261 }
262
263 template <typename VirtualTranslator>
264 void InsertTail(TObject* entry, VirtualTranslator translator) {
265 InsertTailList(this, ObjectListEntry(entry), translator);
266 }
267
268 template <typename VirtualTranslator>
269 bool empty(VirtualTranslator vt) const {
270 return vt->template TranslateVirtual<X_LIST_ENTRY*>(flink_ptr) == this;
271 }
272
274 template <typename VirtualTranslator>
275 TObject* HeadObject(VirtualTranslator vt) {
276 return ListEntryObject(vt->template TranslateVirtual<X_LIST_ENTRY*>(flink_ptr));
277 }
278};
279
280} // namespace rex::kernel
Definition export.h:24
bool IsListEmpty(X_LIST_ENTRY *entry, VirtualTranslator context)
Definition list.h:90
void InitializeListHead(X_LIST_ENTRY *entry, VirtualTranslator context)
Definition list.h:73
void InsertHeadList(X_LIST_ENTRY *list_head, u32 list_head_guest, X_LIST_ENTRY *host_entry, u32 entry, VirtualTranslator context)
Definition list.h:165
u32 RemoveHeadList(X_LIST_ENTRY *entry, VirtualTranslator context)
Definition list.h:118
X_LIST_ENTRY * HostListEntry(u32 ptr, VirtualTranslator context)
Definition list.h:58
void InsertTailList(X_LIST_ENTRY *list_head, u32 list_head_guest, X_LIST_ENTRY *host_entry, u32 entry, VirtualTranslator context)
Definition list.h:131
Definition list.h:42
be_u32 owner_pcr
Definition list.h:43
Definition list.h:24
be_u32 flink_ptr
Definition list.h:25
be_u32 blink_ptr
Definition list.h:26
Definition list.h:30
Definition list.h:35
be_u16 depth
Definition list.h:37
X_SINGLE_LIST_ENTRY next
Definition list.h:36
be_u16 sequence
Definition list.h:38
Definition list.h:197
void Initialize(VirtualTranslator translator)
Definition list.h:254
TObject * HeadObject(VirtualTranslator vt)
Definition list.h:275
Integer types, byte order wrappers and size literals.