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