176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _EFI_LINK_H
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _EFI_LINK_H
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*++
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCopyright (c) 1998  Intel Corporation
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanModule Name:
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    link.h (renamed efilink.h to avoid conflicts)
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanAbstract:
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    EFI link list macro's
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanRevision History
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman--*/
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef EFI_NT_EMUL
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// List entry - doubly linked list
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _LIST_ENTRY {
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    struct _LIST_ENTRY  *Flink;
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    struct _LIST_ENTRY  *Blink;
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} LIST_ENTRY;
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  VOID
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  InitializeListHead(
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      LIST_ENTRY *ListHead
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      );
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define InitializeListHead(ListHead) \
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    (ListHead)->Flink = ListHead;    \
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    (ListHead)->Blink = ListHead;
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  BOOLEAN
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  IsListEmpty(
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      PLIST_ENTRY ListHead
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      );
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define IsListEmpty(ListHead) \
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    ((ListHead)->Flink == (ListHead))
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  VOID
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  RemoveEntryList(
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      PLIST_ENTRY Entry
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      );
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _RemoveEntryList(Entry) {       \
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        LIST_ENTRY *_Blink, *_Flink;    \
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        _Flink = (Entry)->Flink;        \
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        _Blink = (Entry)->Blink;        \
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        _Blink->Flink = _Flink;         \
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        _Flink->Blink = _Blink;         \
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        }
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if EFI_DEBUG
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    #define RemoveEntryList(Entry)                      \
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        _RemoveEntryList(Entry);                        \
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        (Entry)->Flink = (LIST_ENTRY *) BAD_POINTER;    \
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        (Entry)->Blink = (LIST_ENTRY *) BAD_POINTER;
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    #define RemoveEntryList(Entry)      \
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        _RemoveEntryList(Entry);
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  VOID
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  InsertTailList(
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      PLIST_ENTRY ListHead,
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      PLIST_ENTRY Entry
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      );
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define InsertTailList(ListHead,Entry) {\
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    LIST_ENTRY *_ListHead, *_Blink;     \
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    _ListHead = (ListHead);             \
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    _Blink = _ListHead->Blink;          \
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    (Entry)->Flink = _ListHead;         \
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    (Entry)->Blink = _Blink;            \
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    _Blink->Flink = (Entry);            \
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    _ListHead->Blink = (Entry);         \
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  VOID
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  InsertHeadList(
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      PLIST_ENTRY ListHead,
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      PLIST_ENTRY Entry
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      );
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define InsertHeadList(ListHead,Entry) {\
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    LIST_ENTRY *_ListHead, *_Flink;     \
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    _ListHead = (ListHead);             \
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    _Flink = _ListHead->Flink;          \
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    (Entry)->Flink = _Flink;            \
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    (Entry)->Blink = _ListHead;         \
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    _Flink->Blink = (Entry);            \
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    _ListHead->Flink = (Entry);         \
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  VOID
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  SwapListEntries(
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      PLIST_ENTRY Entry1,
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      PLIST_ENTRY Entry2
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      );
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// Put Entry2 before Entry1
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SwapListEntries(Entry1,Entry2) {\
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    LIST_ENTRY *Entry1Flink, *Entry1Blink;     \
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    LIST_ENTRY *Entry2Flink, *Entry2Blink;     \
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Entry2Flink = (Entry2)->Flink;             \
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Entry2Blink = (Entry2)->Blink;             \
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Entry1Flink = (Entry1)->Flink;             \
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Entry1Blink = (Entry1)->Blink;             \
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Entry2Blink->Flink = Entry2Flink;       \
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Entry2Flink->Blink = Entry2Blink;        \
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    (Entry2)->Flink = Entry1;               \
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    (Entry2)->Blink = Entry1Blink;          \
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Entry1Blink->Flink = (Entry2);            \
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    (Entry1)->Blink = (Entry2);             \
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  EFI_FIELD_OFFSET - returns the byte offset to a field within a structure
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EFI_FIELD_OFFSET(TYPE,Field) ((UINTN)(&(((TYPE *) 0)->Field)))
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  CONTAINING_RECORD - returns a pointer to the structure
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//      from one of it's elements.
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _CR(Record, TYPE, Field)  \
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    ((TYPE *) ( (CHAR8 *)(Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if EFI_DEBUG
15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    #define CR(Record, TYPE, Field, Sig)     \
15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        _CR(Record, TYPE, Field)->Signature != Sig ?        \
15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            (TYPE *) ASSERT_STRUCT(_CR(Record, TYPE, Field), Record) : \
15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            _CR(Record, TYPE, Field)
16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else
16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    #define CR(Record, TYPE, Field, Signature)   \
16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        _CR(Record, TYPE, Field)
16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// A lock structure
16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _FLOCK {
17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    EFI_TPL     Tpl;
17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    EFI_TPL     OwnerTpl;
17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINTN       Lock;
17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} FLOCK;
17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
178