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