1/* $NetBSD: efilink.h,v 1.1.1.3 2021/09/30 18:50:09 jmcneill Exp $ */ 2 3#ifndef _EFI_LINK_H 4#define _EFI_LINK_H 5 6/*++ 7 8Copyright (c) 1998 Intel Corporation 9 10Module Name: 11 12 link.h (renamed efilink.h to avoid conflicts) 13 14Abstract: 15 16 EFI link list macro's 17 18 19 20Revision History 21 22--*/ 23 24#ifndef EFI_NT_EMUL 25 26// 27// List entry - doubly linked list 28// 29 30typedef struct _LIST_ENTRY { 31 struct _LIST_ENTRY *Flink; 32 struct _LIST_ENTRY *Blink; 33} LIST_ENTRY, EFI_LIST_ENTRY; 34 35#endif 36 37 38// 39// VOID 40// InitializeListHead( 41// LIST_ENTRY *ListHead 42// ); 43// 44 45#define InitializeListHead(ListHead) \ 46 (ListHead)->Flink = ListHead; \ 47 (ListHead)->Blink = ListHead; 48 49// 50// BOOLEAN 51// IsListEmpty( 52// PLIST_ENTRY ListHead 53// ); 54// 55 56#define IsListEmpty(ListHead) \ 57 ((ListHead)->Flink == (ListHead)) 58 59// 60// VOID 61// RemoveEntryList( 62// PLIST_ENTRY Entry 63// ); 64// 65 66#define _RemoveEntryList(Entry) { \ 67 LIST_ENTRY *_Blink, *_Flink; \ 68 _Flink = (Entry)->Flink; \ 69 _Blink = (Entry)->Blink; \ 70 _Blink->Flink = _Flink; \ 71 _Flink->Blink = _Blink; \ 72 } 73 74#if EFI_DEBUG 75 #define RemoveEntryList(Entry) \ 76 _RemoveEntryList(Entry); \ 77 (Entry)->Flink = (LIST_ENTRY *) BAD_POINTER; \ 78 (Entry)->Blink = (LIST_ENTRY *) BAD_POINTER; 79#else 80 #define RemoveEntryList(Entry) \ 81 _RemoveEntryList(Entry); 82#endif 83 84// 85// VOID 86// InsertTailList( 87// PLIST_ENTRY ListHead, 88// PLIST_ENTRY Entry 89// ); 90// 91 92#define InsertTailList(ListHead,Entry) {\ 93 LIST_ENTRY *_ListHead, *_Blink; \ 94 _ListHead = (ListHead); \ 95 _Blink = _ListHead->Blink; \ 96 (Entry)->Flink = _ListHead; \ 97 (Entry)->Blink = _Blink; \ 98 _Blink->Flink = (Entry); \ 99 _ListHead->Blink = (Entry); \ 100 } 101 102// 103// VOID 104// InsertHeadList( 105// PLIST_ENTRY ListHead, 106// PLIST_ENTRY Entry 107// ); 108// 109 110#define InsertHeadList(ListHead,Entry) {\ 111 LIST_ENTRY *_ListHead, *_Flink; \ 112 _ListHead = (ListHead); \ 113 _Flink = _ListHead->Flink; \ 114 (Entry)->Flink = _Flink; \ 115 (Entry)->Blink = _ListHead; \ 116 _Flink->Blink = (Entry); \ 117 _ListHead->Flink = (Entry); \ 118 } 119 120// VOID 121// SwapListEntries( 122// PLIST_ENTRY Entry1, 123// PLIST_ENTRY Entry2 124// ); 125// 126// Put Entry2 before Entry1 127// 128#define SwapListEntries(Entry1,Entry2) {\ 129 LIST_ENTRY *Entry1Flink, *Entry1Blink; \ 130 LIST_ENTRY *Entry2Flink, *Entry2Blink; \ 131 Entry2Flink = (Entry2)->Flink; \ 132 Entry2Blink = (Entry2)->Blink; \ 133 Entry1Flink = (Entry1)->Flink; \ 134 Entry1Blink = (Entry1)->Blink; \ 135 Entry2Blink->Flink = Entry2Flink; \ 136 Entry2Flink->Blink = Entry2Blink; \ 137 (Entry2)->Flink = Entry1; \ 138 (Entry2)->Blink = Entry1Blink; \ 139 Entry1Blink->Flink = (Entry2); \ 140 (Entry1)->Blink = (Entry2); \ 141 } 142 143// 144// EFI_FIELD_OFFSET - returns the byte offset to a field within a structure 145// 146 147#define EFI_FIELD_OFFSET(TYPE,Field) ((UINTN)(intptr_t)(&(((TYPE *) 0)->Field))) 148 149// 150// CONTAINING_RECORD - returns a pointer to the structure 151// from one of it's elements. 152// 153 154#define _CR(Record, TYPE, Field) \ 155 ((TYPE *) ( (CHAR8 *)(Record) - (CHAR8 *) &(((TYPE *) 0)->Field))) 156 157// 158// EDK2 uses BASE_CR for the above 159// 160#define BASE_CR _CR 161 162#if EFI_DEBUG 163 #define CR(Record, TYPE, Field, Sig) \ 164 _CR(Record, TYPE, Field)->Signature != Sig ? \ 165 (TYPE *) ASSERT_STRUCT(_CR(Record, TYPE, Field), Record) : \ 166 _CR(Record, TYPE, Field) 167#else 168 #define CR(Record, TYPE, Field, Signature) \ 169 _CR(Record, TYPE, Field) 170#endif 171 172 173// 174// A lock structure 175// 176 177typedef struct _FLOCK { 178 EFI_TPL Tpl; 179 EFI_TPL OwnerTpl; 180 UINTN Lock; 181} FLOCK; 182 183#endif 184 185