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