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