efilink.h revision 1.1.1.3 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