Merging upstream version 6.03~pre1+dfsg.
[syslinux-debian/hramrach.git] / efi32 / include / efi / efilink.h
blobb2ff4fa2f8773888061ef3f447655fd7e8652ce8
1 #ifndef _EFI_LINK_H
2 #define _EFI_LINK_H
4 /*++
6 Copyright (c) 1998 Intel Corporation
8 Module Name:
10 link.h (renamed efilink.h to avoid conflicts)
12 Abstract:
14 EFI link list macro's
18 Revision History
20 --*/
22 #ifndef EFI_NT_EMUL
25 // List entry - doubly linked list
28 typedef struct _LIST_ENTRY {
29 struct _LIST_ENTRY *Flink;
30 struct _LIST_ENTRY *Blink;
31 } LIST_ENTRY;
33 #endif
37 // VOID
38 // InitializeListHead(
39 // LIST_ENTRY *ListHead
40 // );
43 #define InitializeListHead(ListHead) \
44 (ListHead)->Flink = ListHead; \
45 (ListHead)->Blink = ListHead;
48 // BOOLEAN
49 // IsListEmpty(
50 // PLIST_ENTRY ListHead
51 // );
54 #define IsListEmpty(ListHead) \
55 ((ListHead)->Flink == (ListHead))
58 // VOID
59 // RemoveEntryList(
60 // PLIST_ENTRY Entry
61 // );
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; \
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
83 // VOID
84 // InsertTailList(
85 // PLIST_ENTRY ListHead,
86 // PLIST_ENTRY Entry
87 // );
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); \
101 // VOID
102 // InsertHeadList(
103 // PLIST_ENTRY ListHead,
104 // PLIST_ENTRY Entry
105 // );
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); \
118 // VOID
119 // SwapListEntries(
120 // PLIST_ENTRY Entry1,
121 // PLIST_ENTRY Entry2
122 // );
124 // Put Entry2 before Entry1
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); \
142 // EFI_FIELD_OFFSET - returns the byte offset to a field within a structure
145 #define EFI_FIELD_OFFSET(TYPE,Field) ((UINTN)(&(((TYPE *) 0)->Field)))
148 // CONTAINING_RECORD - returns a pointer to the structure
149 // from one of it's elements.
152 #define _CR(Record, TYPE, Field) \
153 ((TYPE *) ( (CHAR8 *)(Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
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
167 // A lock structure
170 typedef struct _FLOCK {
171 EFI_TPL Tpl;
172 EFI_TPL OwnerTpl;
173 UINTN Lock;
174 } FLOCK;
176 #endif