efibind.h revision 1.3
11.3Sjmcneill/* $NetBSD: efibind.h,v 1.3 2018/08/16 18:22:05 jmcneill Exp $ */ 21.1Sjakllsch 31.1Sjakllsch/*++ 41.1Sjakllsch 51.1SjakllschCopyright (c) 1998 Intel Corporation 61.1Sjakllsch 71.1SjakllschModule Name: 81.1Sjakllsch 91.1Sjakllsch efefind.h 101.1Sjakllsch 111.1SjakllschAbstract: 121.1Sjakllsch 131.1Sjakllsch EFI to compile bindings 141.1Sjakllsch 151.1Sjakllsch 161.1Sjakllsch 171.1Sjakllsch 181.1SjakllschRevision History 191.1Sjakllsch 201.1Sjakllsch--*/ 211.1Sjakllsch 221.1Sjakllsch#pragma pack() 231.1Sjakllsch 241.1Sjakllsch 251.1Sjakllsch// 261.1Sjakllsch// Basic int types of various widths 271.1Sjakllsch// 281.1Sjakllsch 291.1Sjakllsch#if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L ) 301.1Sjakllsch 311.1Sjakllsch // No ANSI C 1999/2000 stdint.h integer width declarations 321.1Sjakllsch 331.1Sjakllsch #ifdef _MSC_EXTENSIONS 341.1Sjakllsch // Use Microsoft C compiler integer width declarations 351.1Sjakllsch 361.1Sjakllsch typedef unsigned __int64 uint64_t; 371.1Sjakllsch typedef __int64 int64_t; 381.1Sjakllsch typedef unsigned __int32 uint32_t; 391.1Sjakllsch typedef __int32 int32_t; 401.1Sjakllsch typedef unsigned __int16 uint16_t; 411.1Sjakllsch typedef __int16 int16_t; 421.1Sjakllsch typedef unsigned __int8 uint8_t; 431.1Sjakllsch typedef __int8 int8_t; 441.1Sjakllsch #elif defined(UNIX_LP64) 451.1Sjakllsch // Use LP64 programming model from C_FLAGS for integer width declarations 461.1Sjakllsch 471.1Sjakllsch typedef unsigned long uint64_t; 481.1Sjakllsch typedef long int64_t; 491.1Sjakllsch typedef unsigned int uint32_t; 501.1Sjakllsch typedef int int32_t; 511.1Sjakllsch typedef unsigned short uint16_t; 521.1Sjakllsch typedef short int16_t; 531.1Sjakllsch typedef unsigned char uint8_t; 541.1Sjakllsch typedef char int8_t; 551.1Sjakllsch #else 561.1Sjakllsch // Assume P64 programming model from C_FLAGS for integer width declarations 571.1Sjakllsch 581.1Sjakllsch typedef unsigned long long uint64_t; 591.1Sjakllsch typedef long long int64_t; 601.1Sjakllsch typedef unsigned int uint32_t; 611.1Sjakllsch typedef int int32_t; 621.1Sjakllsch typedef unsigned short uint16_t; 631.1Sjakllsch typedef short int16_t; 641.1Sjakllsch typedef unsigned char uint8_t; 651.1Sjakllsch typedef char int8_t; 661.1Sjakllsch #endif 671.2Sjakllsch#elif defined(__NetBSD__) 681.2Sjakllsch #include <sys/stdint.h> 691.1Sjakllsch#elif defined(__GNUC__) 701.1Sjakllsch #include <stdint.h> 711.1Sjakllsch#endif 721.1Sjakllsch 731.1Sjakllsch// 741.1Sjakllsch// Basic EFI types of various widths 751.1Sjakllsch// 761.1Sjakllsch#ifndef __WCHAR_TYPE__ 771.1Sjakllsch# define __WCHAR_TYPE__ short 781.1Sjakllsch#endif 791.1Sjakllsch 801.1Sjakllsch 811.1Sjakllschtypedef uint64_t UINT64; 821.1Sjakllschtypedef int64_t INT64; 831.1Sjakllschtypedef uint32_t UINT32; 841.1Sjakllschtypedef int32_t INT32; 851.1Sjakllschtypedef uint16_t UINT16; 861.1Sjakllschtypedef int16_t INT16; 871.1Sjakllschtypedef uint8_t UINT8; 881.1Sjakllschtypedef int8_t INT8; 891.1Sjakllschtypedef __WCHAR_TYPE__ WCHAR; 901.1Sjakllsch 911.1Sjakllsch 921.1Sjakllsch#undef VOID 931.1Sjakllsch#define VOID void 941.1Sjakllsch 951.1Sjakllsch 961.1Sjakllschtypedef int64_t INTN; 971.1Sjakllschtypedef uint64_t UINTN; 981.1Sjakllsch 991.1Sjakllsch//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1001.1Sjakllsch// BugBug: Code to debug 1011.1Sjakllsch// 1021.1Sjakllsch#define BIT63 0x8000000000000000 1031.1Sjakllsch 1041.1Sjakllsch#define PLATFORM_IOBASE_ADDRESS (0xffffc000000 | BIT63) 1051.1Sjakllsch#define PORT_TO_MEMD(_Port) (PLATFORM_IOBASE_ADDRESS | ( ( ( (_Port) & 0xfffc) << 10 ) | ( (_Port) & 0x0fff) ) ) 1061.1Sjakllsch 1071.1Sjakllsch// 1081.1Sjakllsch// Macro's with casts make this much easier to use and read. 1091.1Sjakllsch// 1101.1Sjakllsch#define PORT_TO_MEM8D(_Port) (*(UINT8 *)(PORT_TO_MEMD(_Port))) 1111.1Sjakllsch#define POST_CODE(_Data) (PORT_TO_MEM8D(0x80) = (_Data)) 1121.1Sjakllsch// 1131.1Sjakllsch// BugBug: End Debug Code!!! 1141.1Sjakllsch//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1151.1Sjakllsch 1161.1Sjakllsch#define EFIERR(a) (0x8000000000000000 | a) 1171.1Sjakllsch#define EFI_ERROR_MASK 0x8000000000000000 1181.1Sjakllsch#define EFIERR_OEM(a) (0xc000000000000000 | a) 1191.1Sjakllsch 1201.1Sjakllsch#define BAD_POINTER 0xFBFBFBFBFBFBFBFB 1211.1Sjakllsch#define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF 1221.1Sjakllsch 1231.1Sjakllsch#define BREAKPOINT() while (TRUE) 1241.1Sjakllsch 1251.1Sjakllsch// 1261.1Sjakllsch// Pointers must be aligned to these address to function 1271.1Sjakllsch// you will get an alignment fault if this value is less than 8 1281.1Sjakllsch// 1291.1Sjakllsch#define MIN_ALIGNMENT_SIZE 8 1301.1Sjakllsch 1311.1Sjakllsch#define ALIGN_VARIABLE(Value , Adjustment) \ 1321.1Sjakllsch (UINTN) Adjustment = 0; \ 1331.1Sjakllsch if((UINTN)Value % MIN_ALIGNMENT_SIZE) \ 1341.1Sjakllsch (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \ 1351.1Sjakllsch Value = (UINTN)Value + (UINTN)Adjustment 1361.1Sjakllsch 1371.1Sjakllsch// 1381.1Sjakllsch// Define macros to create data structure signatures. 1391.1Sjakllsch// 1401.1Sjakllsch 1411.1Sjakllsch#define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) 1421.1Sjakllsch#define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) 1431.1Sjakllsch#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)) 1441.1Sjakllsch// 1451.1Sjakllsch// To export & import functions in the EFI emulator environment 1461.1Sjakllsch// 1471.1Sjakllsch 1481.1Sjakllsch #define EXPORTAPI 1491.1Sjakllsch 1501.1Sjakllsch// 1511.1Sjakllsch// EFIAPI - prototype calling convention for EFI function pointers 1521.1Sjakllsch// BOOTSERVICE - prototype for implementation of a boot service interface 1531.1Sjakllsch// RUNTIMESERVICE - prototype for implementation of a runtime service interface 1541.1Sjakllsch// RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service 1551.1Sjakllsch// RUNTIME_CODE - pragma macro for declaring runtime code 1561.1Sjakllsch// 1571.1Sjakllsch 1581.1Sjakllsch#ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options 1591.1Sjakllsch #ifdef _MSC_EXTENSIONS 1601.1Sjakllsch #define EFIAPI __cdecl // Force C calling convention for Microsoft C compiler 1611.1Sjakllsch #else 1621.1Sjakllsch #define EFIAPI // Substitute expresion to force C calling convention 1631.1Sjakllsch #endif 1641.1Sjakllsch#endif 1651.1Sjakllsch 1661.1Sjakllsch#define BOOTSERVICE 1671.1Sjakllsch#define RUNTIMESERVICE 1681.1Sjakllsch#define RUNTIMEFUNCTION 1691.1Sjakllsch 1701.1Sjakllsch#define RUNTIME_CODE(a) alloc_text("rtcode", a) 1711.1Sjakllsch#define BEGIN_RUNTIME_DATA() data_seg("rtdata") 1721.1Sjakllsch#define END_RUNTIME_DATA() data_seg("") 1731.1Sjakllsch 1741.1Sjakllsch#define VOLATILE volatile 1751.1Sjakllsch 1761.1Sjakllsch// 1771.1Sjakllsch// BugBug: Need to find out if this is portable accross compliers. 1781.1Sjakllsch// 1791.1Sjakllsch#ifdef __GNUC__ 1801.1Sjakllsch#define MEMORY_FENCE() __asm__ __volatile__ ("mf.a" ::: "memory") 1811.1Sjakllsch#else 1821.1Sjakllschvoid __mf (void); 1831.1Sjakllsch#pragma intrinsic (__mf) 1841.1Sjakllsch#define MEMORY_FENCE() __mf() 1851.1Sjakllsch#endif 1861.3Sjmcneill 1871.1Sjakllsch// 1881.1Sjakllsch// When build similiar to FW, then link everything together as 1891.3Sjmcneill// one big module. For the MSVC toolchain, we simply tell the 1901.3Sjmcneill// linker what our driver init function is using /ENTRY. 1911.1Sjakllsch// 1921.3Sjmcneill#if defined(_MSC_EXTENSIONS) 1931.3Sjmcneill #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ 1941.3Sjmcneill __pragma(comment(linker, "/ENTRY:" # InitFunction)) 1951.3Sjmcneill#else 1961.3Sjmcneill #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ 1971.3Sjmcneill UINTN \ 1981.3Sjmcneill InitializeDriver ( \ 1991.3Sjmcneill VOID *ImageHandle, \ 2001.3Sjmcneill VOID *SystemTable \ 2011.3Sjmcneill ) \ 2021.3Sjmcneill { \ 2031.3Sjmcneill return InitFunction(ImageHandle, \ 2041.3Sjmcneill SystemTable); \ 2051.3Sjmcneill } \ 2061.3Sjmcneill \ 2071.3Sjmcneill EFI_STATUS efi_main( \ 2081.3Sjmcneill EFI_HANDLE image, \ 2091.3Sjmcneill EFI_SYSTEM_TABLE *systab \ 2101.3Sjmcneill ) __attribute__((weak, \ 2111.3Sjmcneill alias ("InitializeDriver"))); 2121.3Sjmcneill#endif 2131.1Sjakllsch 2141.1Sjakllsch#define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ 2151.1Sjakllsch (_if)->LoadInternal(type, name, entry) 2161.1Sjakllsch 2171.1Sjakllsch// 2181.1Sjakllsch// Some compilers don't support the forward reference construct: 2191.1Sjakllsch// typedef struct XXXXX 2201.1Sjakllsch// 2211.1Sjakllsch// The following macro provide a workaround for such cases. 2221.1Sjakllsch// 2231.1Sjakllsch#ifdef NO_INTERFACE_DECL 2241.1Sjakllsch#define INTERFACE_DECL(x) 2251.1Sjakllsch#else 2261.3Sjmcneill#if defined(__GNUC__) || defined(_MSC_EXTENSIONS) 2271.1Sjakllsch#define INTERFACE_DECL(x) struct x 2281.1Sjakllsch#else 2291.1Sjakllsch#define INTERFACE_DECL(x) typedef struct x 2301.1Sjakllsch#endif 2311.1Sjakllsch#endif 2321.1Sjakllsch 2331.1Sjakllsch/* No efi call wrapper for IA32 architecture */ 2341.1Sjakllsch#define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__) 2351.1Sjakllsch#define EFI_FUNCTION 236