Home | History | Annotate | Download | only in efi
      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)(&(((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 
    178