Subversion Repositories HelenOS

Rev

Rev 2726 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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.