1ca987d46SWarner Losh /*++ 2ca987d46SWarner Losh 3ca987d46SWarner Losh Copyright (c) 1999 - 2003 Intel Corporation. All rights reserved 4ca987d46SWarner Losh This software and associated documentation (if any) is furnished 5ca987d46SWarner Losh under a license and may only be used or copied in accordance 6ca987d46SWarner Losh with the terms of the license. Except as permitted by such 7ca987d46SWarner Losh license, no part of this software or documentation may be 8ca987d46SWarner Losh reproduced, stored in a retrieval system, or transmitted in any 9ca987d46SWarner Losh form or by any means without the express written consent of 10ca987d46SWarner Losh Intel Corporation. 11ca987d46SWarner Losh 12ca987d46SWarner Losh Module Name: 13ca987d46SWarner Losh 14ca987d46SWarner Losh efefind.h 15ca987d46SWarner Losh 16ca987d46SWarner Losh Abstract: 17ca987d46SWarner Losh 18ca987d46SWarner Losh EFI to compile bindings 19ca987d46SWarner Losh 20ca987d46SWarner Losh 21ca987d46SWarner Losh 22ca987d46SWarner Losh 23ca987d46SWarner Losh Revision History 24ca987d46SWarner Losh 25ca987d46SWarner Losh --*/ 26ca987d46SWarner Losh 27ca987d46SWarner Losh #pragma pack() 28ca987d46SWarner Losh 29ca987d46SWarner Losh //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 30ca987d46SWarner Losh // BugBug: Code to debug 31ca987d46SWarner Losh // 32ca987d46SWarner Losh #define BIT63 0x8000000000000000 33ca987d46SWarner Losh 34ca987d46SWarner Losh #define PLATFORM_IOBASE_ADDRESS (0xffffc000000 | BIT63) 35ca987d46SWarner Losh #define PORT_TO_MEMD(_Port) (PLATFORM_IOBASE_ADDRESS | ( ( ( (_Port) & 0xfffc) << 10 ) | ( (_Port) & 0x0fff) ) ) 36ca987d46SWarner Losh 37ca987d46SWarner Losh // 38ca987d46SWarner Losh // Macro's with casts make this much easier to use and read. 39ca987d46SWarner Losh // 40ca987d46SWarner Losh #define PORT_TO_MEM8D(_Port) (*(UINT8 *)(PORT_TO_MEMD(_Port))) 41ca987d46SWarner Losh #define POST_CODE(_Data) (PORT_TO_MEM8D(0x80) = (_Data)) 42ca987d46SWarner Losh // 43ca987d46SWarner Losh // BugBug: End Debug Code!!! 44ca987d46SWarner Losh //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 45ca987d46SWarner Losh 46ca987d46SWarner Losh #define EFIERR(a) (0x8000000000000000 | a) 47ca987d46SWarner Losh #define EFI_ERROR_MASK 0x8000000000000000 48ca987d46SWarner Losh #define EFIERR_OEM(a) (0xc000000000000000 | a) 49ca987d46SWarner Losh 50ca987d46SWarner Losh #define BAD_POINTER 0xFBFBFBFBFBFBFBFB 51ca987d46SWarner Losh #define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF 52ca987d46SWarner Losh 53ca987d46SWarner Losh #define BREAKPOINT() __break(0) 54ca987d46SWarner Losh 55ca987d46SWarner Losh // 56ca987d46SWarner Losh // Pointers must be aligned to these address to function 57ca987d46SWarner Losh // you will get an alignment fault if this value is less than 8 58ca987d46SWarner Losh // 59ca987d46SWarner Losh #define MIN_ALIGNMENT_SIZE 8 60ca987d46SWarner Losh 61ca987d46SWarner Losh #define ALIGN_VARIABLE(Value , Adjustment) \ 62ca987d46SWarner Losh (UINTN) Adjustment = 0; \ 63ca987d46SWarner Losh if((UINTN)Value % MIN_ALIGNMENT_SIZE) \ 64ca987d46SWarner Losh (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \ 65ca987d46SWarner Losh Value = (UINTN)Value + (UINTN)Adjustment 66ca987d46SWarner Losh 67ca987d46SWarner Losh // 68ca987d46SWarner Losh // Define macros to create data structure signatures. 69ca987d46SWarner Losh // 70ca987d46SWarner Losh 71ca987d46SWarner Losh #define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) 72ca987d46SWarner Losh #define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) 73ca987d46SWarner Losh #define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32)) 74ca987d46SWarner Losh 75ca987d46SWarner Losh // 76ca987d46SWarner Losh // EFIAPI - prototype calling convention for EFI function pointers 77ca987d46SWarner Losh // BOOTSERVICE - prototype for implementation of a boot service interface 78ca987d46SWarner Losh // RUNTIMESERVICE - prototype for implementation of a runtime service interface 79ca987d46SWarner Losh // RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service 80ca987d46SWarner Losh // RUNTIME_CODE - pragma macro for declaring runtime code 81ca987d46SWarner Losh // 82ca987d46SWarner Losh 83ca987d46SWarner Losh #ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options 84ca987d46SWarner Losh #ifdef _MSC_EXTENSIONS 85ca987d46SWarner Losh #define EFIAPI __cdecl // Force C calling convention for Microsoft C compiler 86ca987d46SWarner Losh #else 87ca987d46SWarner Losh #define EFIAPI // Substitute expresion to force C calling convention 88ca987d46SWarner Losh #endif 89ca987d46SWarner Losh #endif 90ca987d46SWarner Losh 91ca987d46SWarner Losh #define BOOTSERVICE 92ca987d46SWarner Losh #define RUNTIMESERVICE 93ca987d46SWarner Losh #define RUNTIMEFUNCTION 94ca987d46SWarner Losh 95ca987d46SWarner Losh #define RUNTIME_CODE(a) alloc_text("rtcode", a) 96ca987d46SWarner Losh #define BEGIN_RUNTIME_DATA() data_seg("rtdata") 97ca987d46SWarner Losh #define END_RUNTIME_DATA() data_seg() 98ca987d46SWarner Losh 99ca987d46SWarner Losh #define VOLATILE volatile 100ca987d46SWarner Losh 101ca987d46SWarner Losh // 102ca987d46SWarner Losh // BugBug: Need to find out if this is portable across compilers. 103ca987d46SWarner Losh // 104ca987d46SWarner Losh void __mfa (void); 105ca987d46SWarner Losh #define MEMORY_FENCE() __mfa() 106ca987d46SWarner Losh 107ca987d46SWarner Losh #ifdef EFI_NO_INTERFACE_DECL 108ca987d46SWarner Losh #define EFI_FORWARD_DECLARATION(x) 109ca987d46SWarner Losh #define EFI_INTERFACE_DECL(x) 110ca987d46SWarner Losh #else 111ca987d46SWarner Losh #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x 112ca987d46SWarner Losh #define EFI_INTERFACE_DECL(x) typedef struct x 113ca987d46SWarner Losh #endif 114ca987d46SWarner Losh 115ca987d46SWarner Losh // 116ca987d46SWarner Losh // When build similar to FW, then link everything together as 117ca987d46SWarner Losh // one big module. 118ca987d46SWarner Losh // 119ca987d46SWarner Losh 120ca987d46SWarner Losh #define EFI_DRIVER_ENTRY_POINT(InitFunction) 121ca987d46SWarner Losh 122ca987d46SWarner Losh #define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ 123ca987d46SWarner Losh (_if)->LoadInternal(type, name, entry) 124ca987d46SWarner Losh // entry(NULL, ST) 125ca987d46SWarner Losh 126ca987d46SWarner Losh #ifdef __FreeBSD__ 127ca987d46SWarner Losh #define INTERFACE_DECL(x) struct x 128ca987d46SWarner Losh #else 129ca987d46SWarner Losh // 130ca987d46SWarner Losh // Some compilers don't support the forward reference construct: 131ca987d46SWarner Losh // typedef struct XXXXX 132ca987d46SWarner Losh // 133ca987d46SWarner Losh // The following macro provide a workaround for such cases. 134ca987d46SWarner Losh // 135ca987d46SWarner Losh #ifdef NO_INTERFACE_DECL 136ca987d46SWarner Losh #define INTERFACE_DECL(x) 137ca987d46SWarner Losh #else 138ca987d46SWarner Losh #define INTERFACE_DECL(x) typedef struct x 139ca987d46SWarner Losh #endif 140ca987d46SWarner Losh #endif 141