1#ifndef _EFI_LINK_H
2#define _EFI_LINK_H
3
4/*++
5
6Copyright (c) 1998  Intel Corporation
7
8Module Name:
9
10    link.h (renamed efilink.h to avoid conflicts)
11
12Abstract:
13
14    EFI link list macro's
15
16
17
18Revision History
19
20--*/
21
22#ifndef EFI_NT_EMUL
23
24//
25// List entry - doubly linked list
26//
27
28typedef 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)(&(((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
170typedef struct _FLOCK {
171    EFI_TPL     Tpl;
172    EFI_TPL     OwnerTpl;
173    UINTN       Lock;
174} FLOCK;
175
176#endif
177
178