57template <
typename VirtualTranslator>
59 return context->template TranslateVirtual<X_LIST_ENTRY*>(ptr);
62template <
typename VirtualTranslator>
63u32 GuestListAddress(X_LIST_ENTRY* ptr, VirtualTranslator context) {
64 return context->HostToGuestVirtual(ptr);
72template <
typename VirtualTranslator>
74 if constexpr (std::is_unsigned_v<VirtualTranslator>) {
78 u32 orig_ptr = GuestListAddress(entry, context);
89template <
typename VirtualTranslator>
94template <
typename VirtualTranslator>
95void RemoveEntryList(X_LIST_ENTRY* entry, VirtualTranslator context) {
96 u32 front = entry->flink_ptr;
97 u32 back = entry->blink_ptr;
107template <
typename VirtualTranslator>
108void RemoveEntryList(u32 entry, VirtualTranslator context) {
117template <
typename VirtualTranslator>
120 RemoveEntryList(result, context);
130template <
typename VirtualTranslator>
132 u32 entry, VirtualTranslator context) {
146template <
typename VirtualTranslator>
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);
164template <
typename VirtualTranslator>
166 u32 entry, VirtualTranslator context) {
167 u32 old_list_head_flink = list_head->
flink_ptr;
168 host_entry->
flink_ptr = old_list_head_flink;
179template <
typename VirtualTranslator>
182 GuestListAddress(entry, context), context);
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);
196template <
typename TObject,
size_t EntryListOffset>
202 &
reinterpret_cast<char*
>(obj)[
static_cast<ptrdiff_t
>(EntryListOffset)]);
206 return reinterpret_cast<TObject*
>(
207 &
reinterpret_cast<char*
>(entry)[-
static_cast<ptrdiff_t
>(EntryListOffset)]);
213 template <
typename VirtualTranslator>
215 VirtualTranslator vt;
219 current_entry = vt->template TranslateVirtual<X_LIST_ENTRY*>(current_entry)->flink_ptr;
223 bool operator!=(u32 other_ptr)
const {
return current_entry != other_ptr; }
225 TObject& operator*() {
226 return *ListEntryObject(vt->template TranslateVirtual<X_LIST_ENTRY*>(current_entry));
233 template <
typename VirtualTranslator>
235 VirtualTranslator vt;
236 ThisType*
const list_head;
242 u32 end() {
return vt->HostToGuestVirtual(list_head); }
245 template <
typename VirtualTranslator>
253 template <
typename VirtualTranslator>
258 template <
typename VirtualTranslator>
259 void InsertHead(TObject* entry, VirtualTranslator translator) {
263 template <
typename VirtualTranslator>
264 void InsertTail(TObject* entry, VirtualTranslator translator) {
268 template <
typename VirtualTranslator>
269 bool empty(VirtualTranslator vt)
const {
270 return vt->template TranslateVirtual<X_LIST_ENTRY*>(
flink_ptr) ==
this;
274 template <
typename VirtualTranslator>
276 return ListEntryObject(vt->template TranslateVirtual<X_LIST_ENTRY*>(
flink_ptr));
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
be_u32 owner_pcr
Definition list.h:43
be_u32 flink_ptr
Definition list.h:25
be_u32 blink_ptr
Definition list.h:26
void Initialize(VirtualTranslator translator)
Definition list.h:254
TObject * HeadObject(VirtualTranslator vt)
Definition list.h:275
Integer types, byte order wrappers and size literals.