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