efibind.h revision 1.2
1/* $NetBSD: efibind.h,v 1.2 2021/09/30 19:09:10 jmcneill Exp $ */ 2 3/* 4 * Copright (C) 2014 - 2015 Linaro Ltd. 5 * Author: Ard Biesheuvel <ard.biesheuvel@linaro.org> 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice and this list of conditions, without modification. 12 * 2. The name of the author may not be used to endorse or promote products 13 * derived from this software without specific prior written permission. 14 * 15 * Alternatively, this software may be distributed under the terms of the 16 * GNU General Public License as published by the Free Software Foundation; 17 * either version 2 of the License, or (at your option) any later version. 18 */ 19 20#if defined(__NetBSD__) 21#include <sys/stdint.h> 22#else 23#include <stdint.h> 24#endif 25 26// 27// Basic EFI types of various widths 28// 29 30 31 32typedef uint64_t UINT64; 33typedef int64_t INT64; 34typedef uint32_t UINT32; 35typedef int32_t INT32; 36typedef uint16_t UINT16; 37typedef int16_t INT16; 38typedef uint8_t UINT8; 39typedef int8_t INT8; 40#ifndef __WCHAR_TYPE__ 41#define __WCHAR_TYPE__ short 42#endif 43typedef __WCHAR_TYPE__ WCHAR; 44#ifndef BOOLEAN 45typedef uint8_t BOOLEAN; 46#endif 47#undef VOID 48#define VOID void 49typedef int64_t INTN; 50typedef uint64_t UINTN; 51 52#define EFI_ERROR_MASK 0x8000000000000000 53#define EFIERR(a) (EFI_ERROR_MASK | a) 54#define EFIERR_OEM(a) (0xc000000000000000 | a) 55 56#define BAD_POINTER 0xFBFBFBFBFBFBFBFB 57#define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF 58 59#define BREAKPOINT() while(1); 60 61// 62// Pointers must be aligned to these address to function 63// 64#define MIN_ALIGNMENT_SIZE 8 65 66#define ALIGN_VARIABLE(Value, Adjustment) \ 67 (UINTN)Adjustment = 0; \ 68 if((UINTN)Value % MIN_ALIGNMENT_SIZE) \ 69 (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \ 70 Value = (UINTN)Value + (UINTN)Adjustment 71 72// 73// Define macros to build data structure signatures from characters. 74// 75#define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) 76#define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) 77#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)) 78 79// 80// EFIAPI - prototype calling convention for EFI function pointers 81// BOOTSERVICE - prototype for implementation of a boot service interface 82// RUNTIMESERVICE - prototype for implementation of a runtime service interface 83// RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service 84// RUNTIME_CODE - pragma macro for declaring runtime code 85// 86#ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options 87#define EFIAPI // Substitute expresion to force C calling convention 88#endif 89#define BOOTSERVICE 90#define RUNTIMESERVICE 91#define RUNTIMEFUNCTION 92#define RUNTIME_CODE(a) alloc_text("rtcode", a) 93#define BEGIN_RUNTIME_DATA() data_seg("rtdata") 94#define END_RUNTIME_DATA() data_seg("") 95 96#define VOLATILE volatile 97#define MEMORY_FENCE __sync_synchronize 98 99// 100// When build similiar to FW, then link everything together as 101// one big module. For the MSVC toolchain, we simply tell the 102// linker what our driver init function is using /ENTRY. 103// 104#if defined(_MSC_EXTENSIONS) 105#define EFI_DRIVER_ENTRY_POINT(InitFunction) \ 106 __pragma(comment(linker, "/ENTRY:" # InitFunction)) 107#else 108#define EFI_DRIVER_ENTRY_POINT(InitFunction) \ 109 UINTN \ 110 InitializeDriver ( \ 111 VOID *ImageHandle, \ 112 VOID *SystemTable \ 113 ) \ 114 { \ 115 return InitFunction(ImageHandle, \ 116 SystemTable); \ 117 } \ 118 \ 119 EFI_STATUS efi_main( \ 120 EFI_HANDLE image, \ 121 EFI_SYSTEM_TABLE *systab \ 122 ) __attribute__((weak, \ 123 alias ("InitializeDriver"))); 124#endif 125 126#define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ 127 (_if)->LoadInternal(type, name, entry) 128 129// 130// Some compilers don't support the forward reference construct: 131// typedef struct XXXXX 132// 133// The following macro provide a workaround for such cases. 134#define INTERFACE_DECL(x) struct x 135 136#define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__) 137#define EFI_FUNCTION 138