1#ifndef _EFI_LINK_H 2#define _EFI_LINK_H 3 4/*++ 5 6Copyright (c) 1998 Intel Corporation 7 8Module Name: 9 10 link.h (renamed efilink.h to avoid conflicts) 11 12Abstract: 13 14 EFI link list macro's 15 16 17 18Revision History 19 20--*/ 21 22#ifndef EFI_NT_EMUL 23 24// 25// List entry - doubly linked list 26// 27 28typedef 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)(&(((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#if EFI_DEBUG 156 #define CR(Record, TYPE, Field, Sig) \ 157 _CR(Record, TYPE, Field)->Signature != Sig ? \ 158 (TYPE *) ASSERT_STRUCT(_CR(Record, TYPE, Field), Record) : \ 159 _CR(Record, TYPE, Field) 160#else 161 #define CR(Record, TYPE, Field, Signature) \ 162 _CR(Record, TYPE, Field) 163#endif 164 165 166// 167// A lock structure 168// 169 170typedef struct _FLOCK { 171 EFI_TPL Tpl; 172 EFI_TPL OwnerTpl; 173 UINTN Lock; 174} FLOCK; 175 176#endif 177 178