xref: /DragonStub/inc/efilink.h (revision fa506bd242995911c0262e4c8fd38a9b6bf76344)
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, EFI_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 //
156 // EDK2 uses BASE_CR for the above
157 //
158 #define BASE_CR _CR
159 
160 #if EFI_DEBUG
161     #define CR(Record, TYPE, Field, Sig)     \
162         _CR(Record, TYPE, Field)->Signature != Sig ?        \
163             (TYPE *) ASSERT_STRUCT(_CR(Record, TYPE, Field), Record) : \
164             _CR(Record, TYPE, Field)
165 #else
166     #define CR(Record, TYPE, Field, Signature)   \
167         _CR(Record, TYPE, Field)
168 #endif
169 
170 
171 //
172 // A lock structure
173 //
174 
175 typedef struct _FLOCK {
176     EFI_TPL     Tpl;
177     EFI_TPL     OwnerTpl;
178     UINTN       Lock;
179 } FLOCK;
180 
181 #endif
182 
183