]> git.proxmox.com Git - efi-boot-shim.git/blob - gnu-efi/inc/efilink.h
New upstream version 15.3
[efi-boot-shim.git] / gnu-efi / inc / efilink.h
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 #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
170 typedef struct _FLOCK {
171 EFI_TPL Tpl;
172 EFI_TPL OwnerTpl;
173 UINTN Lock;
174 } FLOCK;
175
176 #endif
177