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