Home | History | Annotate | Line # | Download | only in ia32
      1  1.5  jmcneill /*	$NetBSD: efibind.h,v 1.5 2021/09/30 19:02:47 jmcneill Exp $	*/
      2  1.1  jakllsch 
      3  1.1  jakllsch /*++
      4  1.1  jakllsch 
      5  1.1  jakllsch Copyright (c) 1998  Intel Corporation
      6  1.1  jakllsch 
      7  1.1  jakllsch Module Name:
      8  1.1  jakllsch 
      9  1.1  jakllsch     efefind.h
     10  1.1  jakllsch 
     11  1.1  jakllsch Abstract:
     12  1.1  jakllsch 
     13  1.1  jakllsch     EFI to compile bindings
     14  1.1  jakllsch 
     15  1.1  jakllsch 
     16  1.1  jakllsch 
     17  1.1  jakllsch 
     18  1.1  jakllsch Revision History
     19  1.1  jakllsch 
     20  1.1  jakllsch --*/
     21  1.1  jakllsch 
     22  1.1  jakllsch #ifndef __GNUC__
     23  1.1  jakllsch #pragma pack()
     24  1.1  jakllsch #endif
     25  1.1  jakllsch 
     26  1.1  jakllsch //
     27  1.1  jakllsch // Basic int types of various widths
     28  1.1  jakllsch //
     29  1.1  jakllsch 
     30  1.5  jmcneill #if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L ) && !defined(__cplusplus)
     31  1.1  jakllsch 
     32  1.1  jakllsch     // No ANSI C 1999/2000 stdint.h integer width declarations
     33  1.1  jakllsch 
     34  1.1  jakllsch     #if defined(_MSC_EXTENSIONS)
     35  1.1  jakllsch 
     36  1.1  jakllsch         // Use Microsoft C compiler integer width declarations
     37  1.1  jakllsch 
     38  1.1  jakllsch         typedef unsigned __int64    uint64_t;
     39  1.1  jakllsch         typedef __int64             int64_t;
     40  1.1  jakllsch         typedef unsigned __int32    uint32_t;
     41  1.1  jakllsch         typedef __int32             int32_t;
     42  1.1  jakllsch         typedef unsigned short      uint16_t;
     43  1.1  jakllsch         typedef short               int16_t;
     44  1.1  jakllsch         typedef unsigned char       uint8_t;
     45  1.1  jakllsch         typedef char                int8_t;
     46  1.1  jakllsch     #elif defined(__GNUC__)
     47  1.1  jakllsch         typedef int __attribute__((__mode__(__DI__)))           int64_t;
     48  1.1  jakllsch         typedef unsigned int __attribute__((__mode__(__DI__)))  uint64_t;
     49  1.1  jakllsch         typedef unsigned int        uint32_t;
     50  1.1  jakllsch         typedef int                 int32_t;
     51  1.1  jakllsch         typedef unsigned short      uint16_t;
     52  1.1  jakllsch         typedef short               int16_t;
     53  1.1  jakllsch         typedef unsigned char       uint8_t;
     54  1.1  jakllsch         typedef signed char         int8_t;
     55  1.1  jakllsch     #elif defined(UNIX_LP64)
     56  1.1  jakllsch 
     57  1.1  jakllsch         /*  Use LP64 programming model from C_FLAGS for integer width declarations */
     58  1.1  jakllsch 
     59  1.1  jakllsch        typedef unsigned long       uint64_t;
     60  1.1  jakllsch        typedef long                int64_t;
     61  1.1  jakllsch        typedef unsigned int        uint32_t;
     62  1.1  jakllsch        typedef int                 int32_t;
     63  1.1  jakllsch        typedef unsigned short      uint16_t;
     64  1.1  jakllsch        typedef short               int16_t;
     65  1.1  jakllsch        typedef unsigned char       uint8_t;
     66  1.1  jakllsch        typedef char                int8_t;
     67  1.1  jakllsch     #else
     68  1.1  jakllsch 
     69  1.1  jakllsch        /*  Assume P64 programming model from C_FLAGS for integer width declarations */
     70  1.1  jakllsch 
     71  1.1  jakllsch        typedef unsigned long long  uint64_t __attribute__((aligned (8)));
     72  1.1  jakllsch        typedef long long           int64_t __attribute__((aligned (8)));
     73  1.1  jakllsch        typedef unsigned int        uint32_t;
     74  1.1  jakllsch        typedef int                 int32_t;
     75  1.1  jakllsch        typedef unsigned short      uint16_t;
     76  1.1  jakllsch        typedef short               int16_t;
     77  1.1  jakllsch        typedef unsigned char       uint8_t;
     78  1.1  jakllsch        typedef char                int8_t;
     79  1.1  jakllsch     #endif
     80  1.5  jmcneill     typedef uint32_t            uintptr_t;
     81  1.5  jmcneill     typedef int32_t             intptr_t;
     82  1.2  jakllsch #elif defined(__NetBSD__)
     83  1.2  jakllsch     #include <sys/stdint.h>
     84  1.1  jakllsch #elif defined(__GNUC__)
     85  1.1  jakllsch     #include <stdint.h>
     86  1.1  jakllsch #endif
     87  1.1  jakllsch 
     88  1.1  jakllsch //
     89  1.1  jakllsch // Basic EFI types of various widths
     90  1.1  jakllsch //
     91  1.1  jakllsch 
     92  1.1  jakllsch #ifndef __WCHAR_TYPE__
     93  1.1  jakllsch # define __WCHAR_TYPE__ short
     94  1.1  jakllsch #endif
     95  1.1  jakllsch 
     96  1.4       tnn #ifndef __ACTYPES_H__
     97  1.1  jakllsch typedef uint64_t   UINT64;
     98  1.1  jakllsch typedef int64_t    INT64;
     99  1.1  jakllsch 
    100  1.1  jakllsch #ifndef _BASETSD_H_
    101  1.1  jakllsch     typedef uint32_t   UINT32;
    102  1.1  jakllsch     typedef int32_t    INT32;
    103  1.1  jakllsch #endif
    104  1.1  jakllsch 
    105  1.1  jakllsch typedef uint16_t   UINT16;
    106  1.1  jakllsch typedef int16_t    INT16;
    107  1.1  jakllsch typedef uint8_t    UINT8;
    108  1.1  jakllsch typedef int8_t     INT8;
    109  1.4       tnn #endif /* __ACTYPES_H__ */
    110  1.1  jakllsch typedef __WCHAR_TYPE__ WCHAR;
    111  1.1  jakllsch 
    112  1.1  jakllsch #undef VOID
    113  1.1  jakllsch #define VOID    void
    114  1.1  jakllsch 
    115  1.1  jakllsch 
    116  1.1  jakllsch typedef int32_t    INTN;
    117  1.1  jakllsch typedef uint32_t   UINTN;
    118  1.1  jakllsch 
    119  1.1  jakllsch #ifdef EFI_NT_EMULATOR
    120  1.1  jakllsch     #define POST_CODE(_Data)
    121  1.1  jakllsch #else
    122  1.1  jakllsch     #ifdef EFI_DEBUG
    123  1.1  jakllsch #define POST_CODE(_Data)    __asm mov eax,(_Data) __asm out 0x80,al
    124  1.1  jakllsch     #else
    125  1.1  jakllsch         #define POST_CODE(_Data)
    126  1.1  jakllsch     #endif
    127  1.1  jakllsch #endif
    128  1.1  jakllsch 
    129  1.1  jakllsch #define EFIERR(a)           (0x80000000 | a)
    130  1.1  jakllsch #define EFI_ERROR_MASK      0x80000000
    131  1.1  jakllsch #define EFIERR_OEM(a)       (0xc0000000 | a)
    132  1.1  jakllsch 
    133  1.1  jakllsch 
    134  1.1  jakllsch #define BAD_POINTER         0xFBFBFBFB
    135  1.1  jakllsch #define MAX_ADDRESS         0xFFFFFFFF
    136  1.1  jakllsch 
    137  1.1  jakllsch #ifdef EFI_NT_EMULATOR
    138  1.1  jakllsch     #define BREAKPOINT()        __asm { int 3 }
    139  1.1  jakllsch #else
    140  1.1  jakllsch     #define BREAKPOINT()        while (TRUE);    // Make it hang on Bios[Dbg]32
    141  1.1  jakllsch #endif
    142  1.1  jakllsch 
    143  1.1  jakllsch //
    144  1.1  jakllsch // Pointers must be aligned to these address to function
    145  1.1  jakllsch //
    146  1.1  jakllsch 
    147  1.1  jakllsch #define MIN_ALIGNMENT_SIZE  4
    148  1.1  jakllsch 
    149  1.1  jakllsch #define ALIGN_VARIABLE(Value ,Adjustment) \
    150  1.1  jakllsch             (UINTN)Adjustment = 0; \
    151  1.1  jakllsch             if((UINTN)Value % MIN_ALIGNMENT_SIZE) \
    152  1.1  jakllsch                 (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \
    153  1.1  jakllsch             Value = (UINTN)Value + (UINTN)Adjustment
    154  1.1  jakllsch 
    155  1.1  jakllsch 
    156  1.1  jakllsch //
    157  1.1  jakllsch // Define macros to build data structure signatures from characters.
    158  1.1  jakllsch //
    159  1.1  jakllsch 
    160  1.1  jakllsch #define EFI_SIGNATURE_16(A,B)             ((A) | (B<<8))
    161  1.1  jakllsch #define EFI_SIGNATURE_32(A,B,C,D)         (EFI_SIGNATURE_16(A,B)     | (EFI_SIGNATURE_16(C,D)     << 16))
    162  1.1  jakllsch #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))
    163  1.1  jakllsch //
    164  1.1  jakllsch // To export & import functions in the EFI emulator environment
    165  1.1  jakllsch //
    166  1.1  jakllsch 
    167  1.1  jakllsch #ifdef EFI_NT_EMULATOR
    168  1.1  jakllsch     #define EXPORTAPI           __declspec( dllexport )
    169  1.1  jakllsch #else
    170  1.1  jakllsch     #define EXPORTAPI
    171  1.1  jakllsch #endif
    172  1.1  jakllsch 
    173  1.1  jakllsch 
    174  1.1  jakllsch //
    175  1.1  jakllsch // EFIAPI - prototype calling convention for EFI function pointers
    176  1.1  jakllsch // BOOTSERVICE - prototype for implementation of a boot service interface
    177  1.1  jakllsch // RUNTIMESERVICE - prototype for implementation of a runtime service interface
    178  1.1  jakllsch // RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service
    179  1.1  jakllsch // RUNTIME_CODE - pragma macro for declaring runtime code
    180  1.1  jakllsch //
    181  1.1  jakllsch 
    182  1.1  jakllsch #ifndef EFIAPI                  // Forces EFI calling conventions reguardless of compiler options
    183  1.1  jakllsch     #ifdef _MSC_EXTENSIONS
    184  1.1  jakllsch         #define EFIAPI __cdecl  // Force C calling convention for Microsoft C compiler
    185  1.1  jakllsch     #else
    186  1.1  jakllsch         #define EFIAPI          // Substitute expresion to force C calling convention
    187  1.1  jakllsch     #endif
    188  1.1  jakllsch #endif
    189  1.1  jakllsch 
    190  1.1  jakllsch #define BOOTSERVICE
    191  1.1  jakllsch //#define RUNTIMESERVICE(proto,a)    alloc_text("rtcode",a); proto a
    192  1.1  jakllsch //#define RUNTIMEFUNCTION(proto,a)   alloc_text("rtcode",a); proto a
    193  1.1  jakllsch #define RUNTIMESERVICE
    194  1.1  jakllsch #define RUNTIMEFUNCTION
    195  1.1  jakllsch 
    196  1.1  jakllsch 
    197  1.1  jakllsch #define RUNTIME_CODE(a)         alloc_text("rtcode", a)
    198  1.1  jakllsch #define BEGIN_RUNTIME_DATA()    data_seg("rtdata")
    199  1.1  jakllsch #define END_RUNTIME_DATA()      data_seg("")
    200  1.1  jakllsch 
    201  1.1  jakllsch #define VOLATILE    volatile
    202  1.1  jakllsch 
    203  1.1  jakllsch #define MEMORY_FENCE()
    204  1.1  jakllsch 
    205  1.1  jakllsch #ifdef EFI_NT_EMULATOR
    206  1.1  jakllsch 
    207  1.1  jakllsch //
    208  1.1  jakllsch // To help ensure proper coding of integrated drivers, they are
    209  1.1  jakllsch // compiled as DLLs.  In NT they require a dll init entry pointer.
    210  1.1  jakllsch // The macro puts a stub entry point into the DLL so it will load.
    211  1.1  jakllsch //
    212  1.1  jakllsch 
    213  1.1  jakllsch #define EFI_DRIVER_ENTRY_POINT(InitFunction)    \
    214  1.1  jakllsch     UINTN                                       \
    215  1.1  jakllsch     __stdcall                                   \
    216  1.1  jakllsch     _DllMainCRTStartup (                        \
    217  1.1  jakllsch         UINTN    Inst,                          \
    218  1.1  jakllsch         UINTN    reason_for_call,               \
    219  1.1  jakllsch         VOID    *rserved                        \
    220  1.1  jakllsch         )                                       \
    221  1.1  jakllsch     {                                           \
    222  1.1  jakllsch         return 1;                               \
    223  1.1  jakllsch     }                                           \
    224  1.1  jakllsch                                                 \
    225  1.1  jakllsch     int                                         \
    226  1.1  jakllsch     EXPORTAPI                                   \
    227  1.1  jakllsch     __cdecl                                     \
    228  1.1  jakllsch     InitializeDriver (                          \
    229  1.1  jakllsch         void *ImageHandle,                      \
    230  1.1  jakllsch         void *SystemTable                       \
    231  1.1  jakllsch         )                                       \
    232  1.1  jakllsch     {                                           \
    233  1.1  jakllsch         return InitFunction(ImageHandle, SystemTable);       \
    234  1.1  jakllsch     }
    235  1.1  jakllsch 
    236  1.1  jakllsch 
    237  1.1  jakllsch     #define LOAD_INTERNAL_DRIVER(_if, type, name, entry)      \
    238  1.1  jakllsch         (_if)->LoadInternal(type, name, NULL)
    239  1.1  jakllsch 
    240  1.1  jakllsch #else // EFI_NT_EMULATOR
    241  1.1  jakllsch 
    242  1.1  jakllsch //
    243  1.1  jakllsch // When build similiar to FW, then link everything together as
    244  1.3  jmcneill // one big module. For the MSVC toolchain, we simply tell the
    245  1.3  jmcneill // linker what our driver init function is using /ENTRY.
    246  1.1  jakllsch //
    247  1.3  jmcneill #if defined(_MSC_EXTENSIONS)
    248  1.3  jmcneill     #define EFI_DRIVER_ENTRY_POINT(InitFunction) \
    249  1.3  jmcneill         __pragma(comment(linker, "/ENTRY:" # InitFunction))
    250  1.3  jmcneill #else
    251  1.1  jakllsch     #define EFI_DRIVER_ENTRY_POINT(InitFunction)    \
    252  1.1  jakllsch         UINTN                                       \
    253  1.1  jakllsch         InitializeDriver (                          \
    254  1.1  jakllsch             VOID    *ImageHandle,                   \
    255  1.1  jakllsch             VOID    *SystemTable                    \
    256  1.1  jakllsch             )                                       \
    257  1.1  jakllsch         {                                           \
    258  1.1  jakllsch             return InitFunction(ImageHandle,        \
    259  1.1  jakllsch                     SystemTable);                   \
    260  1.1  jakllsch         }                                           \
    261  1.1  jakllsch                                                     \
    262  1.1  jakllsch         EFI_STATUS efi_main(                        \
    263  1.1  jakllsch             EFI_HANDLE image,                       \
    264  1.1  jakllsch             EFI_SYSTEM_TABLE *systab                \
    265  1.1  jakllsch             ) __attribute__((weak,                  \
    266  1.1  jakllsch                     alias ("InitializeDriver")));
    267  1.3  jmcneill #endif
    268  1.1  jakllsch 
    269  1.1  jakllsch     #define LOAD_INTERNAL_DRIVER(_if, type, name, entry)    \
    270  1.1  jakllsch             (_if)->LoadInternal(type, name, entry)
    271  1.1  jakllsch 
    272  1.1  jakllsch #endif // EFI_FW_NT
    273  1.1  jakllsch 
    274  1.1  jakllsch //
    275  1.1  jakllsch // Some compilers don't support the forward reference construct:
    276  1.1  jakllsch //  typedef struct XXXXX
    277  1.1  jakllsch //
    278  1.1  jakllsch // The following macro provide a workaround for such cases.
    279  1.1  jakllsch //
    280  1.1  jakllsch #ifdef NO_INTERFACE_DECL
    281  1.1  jakllsch #define INTERFACE_DECL(x)
    282  1.1  jakllsch #else
    283  1.3  jmcneill #if defined(__GNUC__) || defined(_MSC_EXTENSIONS)
    284  1.1  jakllsch #define INTERFACE_DECL(x) struct x
    285  1.1  jakllsch #else
    286  1.1  jakllsch #define INTERFACE_DECL(x) typedef struct x
    287  1.1  jakllsch #endif
    288  1.1  jakllsch #endif
    289  1.1  jakllsch 
    290  1.1  jakllsch /* No efi call wrapper for IA32 architecture */
    291  1.1  jakllsch #define uefi_call_wrapper(func, va_num, ...)	func(__VA_ARGS__)
    292  1.1  jakllsch #define EFI_FUNCTION
    293  1.1  jakllsch 
    294  1.1  jakllsch #ifdef _MSC_EXTENSIONS
    295  1.1  jakllsch #pragma warning ( disable : 4731 )  // Suppress warnings about modification of EBP
    296  1.1  jakllsch #endif
    297  1.1  jakllsch 
    298