Home | History | Annotate | Line # | Download | only in inc
      1 /*	$NetBSD: efilink.h,v 1.1.1.3 2021/09/30 18:50:09 jmcneill Exp $	*/
      2 
      3 #ifndef _EFI_LINK_H
      4 #define _EFI_LINK_H
      5 
      6 /*++
      7 
      8 Copyright (c) 1998  Intel Corporation
      9 
     10 Module Name:
     11 
     12     link.h (renamed efilink.h to avoid conflicts)
     13 
     14 Abstract:
     15 
     16     EFI link list macro's
     17 
     18 
     19 
     20 Revision History
     21 
     22 --*/
     23 
     24 #ifndef EFI_NT_EMUL
     25 
     26 //
     27 // List entry - doubly linked list
     28 //
     29 
     30 typedef struct _LIST_ENTRY {
     31     struct _LIST_ENTRY  *Flink;
     32     struct _LIST_ENTRY  *Blink;
     33 } LIST_ENTRY, EFI_LIST_ENTRY;
     34 
     35 #endif
     36 
     37 
     38 //
     39 //  VOID
     40 //  InitializeListHead(
     41 //      LIST_ENTRY *ListHead
     42 //      );
     43 //
     44 
     45 #define InitializeListHead(ListHead) \
     46     (ListHead)->Flink = ListHead;    \
     47     (ListHead)->Blink = ListHead;
     48 
     49 //
     50 //  BOOLEAN
     51 //  IsListEmpty(
     52 //      PLIST_ENTRY ListHead
     53 //      );
     54 //
     55 
     56 #define IsListEmpty(ListHead) \
     57     ((ListHead)->Flink == (ListHead))
     58 
     59 //
     60 //  VOID
     61 //  RemoveEntryList(
     62 //      PLIST_ENTRY Entry
     63 //      );
     64 //
     65 
     66 #define _RemoveEntryList(Entry) {       \
     67         LIST_ENTRY *_Blink, *_Flink;    \
     68         _Flink = (Entry)->Flink;        \
     69         _Blink = (Entry)->Blink;        \
     70         _Blink->Flink = _Flink;         \
     71         _Flink->Blink = _Blink;         \
     72         }
     73 
     74 #if EFI_DEBUG
     75     #define RemoveEntryList(Entry)                      \
     76         _RemoveEntryList(Entry);                        \
     77         (Entry)->Flink = (LIST_ENTRY *) BAD_POINTER;    \
     78         (Entry)->Blink = (LIST_ENTRY *) BAD_POINTER;
     79 #else
     80     #define RemoveEntryList(Entry)      \
     81         _RemoveEntryList(Entry);
     82 #endif
     83 
     84 //
     85 //  VOID
     86 //  InsertTailList(
     87 //      PLIST_ENTRY ListHead,
     88 //      PLIST_ENTRY Entry
     89 //      );
     90 //
     91 
     92 #define InsertTailList(ListHead,Entry) {\
     93     LIST_ENTRY *_ListHead, *_Blink;     \
     94     _ListHead = (ListHead);             \
     95     _Blink = _ListHead->Blink;          \
     96     (Entry)->Flink = _ListHead;         \
     97     (Entry)->Blink = _Blink;            \
     98     _Blink->Flink = (Entry);            \
     99     _ListHead->Blink = (Entry);         \
    100     }
    101 
    102 //
    103 //  VOID
    104 //  InsertHeadList(
    105 //      PLIST_ENTRY ListHead,
    106 //      PLIST_ENTRY Entry
    107 //      );
    108 //
    109 
    110 #define InsertHeadList(ListHead,Entry) {\
    111     LIST_ENTRY *_ListHead, *_Flink;     \
    112     _ListHead = (ListHead);             \
    113     _Flink = _ListHead->Flink;          \
    114     (Entry)->Flink = _Flink;            \
    115     (Entry)->Blink = _ListHead;         \
    116     _Flink->Blink = (Entry);            \
    117     _ListHead->Flink = (Entry);         \
    118     }
    119 
    120 //  VOID
    121 //  SwapListEntries(
    122 //      PLIST_ENTRY Entry1,
    123 //      PLIST_ENTRY Entry2
    124 //      );
    125 //
    126 // Put Entry2 before Entry1
    127 //
    128 #define SwapListEntries(Entry1,Entry2) {\
    129     LIST_ENTRY *Entry1Flink, *Entry1Blink;     \
    130     LIST_ENTRY *Entry2Flink, *Entry2Blink;     \
    131     Entry2Flink = (Entry2)->Flink;             \
    132     Entry2Blink = (Entry2)->Blink;             \
    133     Entry1Flink = (Entry1)->Flink;             \
    134     Entry1Blink = (Entry1)->Blink;             \
    135     Entry2Blink->Flink = Entry2Flink;       \
    136     Entry2Flink->Blink = Entry2Blink;        \
    137     (Entry2)->Flink = Entry1;               \
    138     (Entry2)->Blink = Entry1Blink;          \
    139     Entry1Blink->Flink = (Entry2);            \
    140     (Entry1)->Blink = (Entry2);             \
    141     }
    142 
    143 //
    144 //  EFI_FIELD_OFFSET - returns the byte offset to a field within a structure
    145 //
    146 
    147 #define EFI_FIELD_OFFSET(TYPE,Field) ((UINTN)(intptr_t)(&(((TYPE *) 0)->Field)))
    148 
    149 //
    150 //  CONTAINING_RECORD - returns a pointer to the structure
    151 //      from one of it's elements.
    152 //
    153 
    154 #define _CR(Record, TYPE, Field)  \
    155     ((TYPE *) ( (CHAR8 *)(Record) - (CHAR8 *) &(((TYPE *) 0)->Field)))
    156 
    157 //
    158 // EDK2 uses BASE_CR for the above
    159 //
    160 #define BASE_CR _CR
    161 
    162 #if EFI_DEBUG
    163     #define CR(Record, TYPE, Field, Sig)     \
    164         _CR(Record, TYPE, Field)->Signature != Sig ?        \
    165             (TYPE *) ASSERT_STRUCT(_CR(Record, TYPE, Field), Record) : \
    166             _CR(Record, TYPE, Field)
    167 #else
    168     #define CR(Record, TYPE, Field, Signature)   \
    169         _CR(Record, TYPE, Field)
    170 #endif
    171 
    172 
    173 //
    174 // A lock structure
    175 //
    176 
    177 typedef struct _FLOCK {
    178     EFI_TPL     Tpl;
    179     EFI_TPL     OwnerTpl;
    180     UINTN       Lock;
    181 } FLOCK;
    182 
    183 #endif
    184 
    185