efibind.h revision 281526
1/* $FreeBSD: head/sys/boot/efi/include/arm64/efibind.h 281526 2015-04-14 13:55:01Z andrew $ */ 2/*++ 3 4Copyright (c) 1999 - 2003 Intel Corporation. All rights reserved 5This software and associated documentation (if any) is furnished 6under a license and may only be used or copied in accordance 7with the terms of the license. Except as permitted by such 8license, no part of this software or documentation may be 9reproduced, stored in a retrieval system, or transmitted in any 10form or by any means without the express written consent of 11Intel Corporation. 12 13Module Name: 14 15 efefind.h 16 17Abstract: 18 19 EFI to compile bindings 20 21 22 23 24Revision History 25 26--*/ 27 28#pragma pack() 29 30 31#ifdef __FreeBSD__ 32#include <sys/stdint.h> 33#else 34// 35// Basic int types of various widths 36// 37 38#if (__STDC_VERSION__ < 199901L ) 39 40 // No ANSI C 1999/2000 stdint.h integer width declarations 41 42 #if _MSC_EXTENSIONS 43 44 // Use Microsoft C compiler integer width declarations 45 46 typedef unsigned __int64 uint64_t; 47 typedef __int64 int64_t; 48 typedef unsigned __int32 uint32_t; 49 typedef __int32 int32_t; 50 typedef unsigned __int16 uint16_t; 51 typedef __int16 int16_t; 52 typedef unsigned __int8 uint8_t; 53 typedef __int8 int8_t; 54 #else 55 #ifdef UNIX_LP64 56 57 // Use LP64 programming model from C_FLAGS for integer width declarations 58 59 typedef unsigned long uint64_t; 60 typedef long int64_t; 61 typedef unsigned int uint32_t; 62 typedef int int32_t; 63 typedef unsigned short uint16_t; 64 typedef short int16_t; 65 typedef unsigned char uint8_t; 66 typedef char int8_t; 67 #else 68 69 // Assume P64 programming model from C_FLAGS for integer width declarations 70 71 typedef unsigned long long uint64_t; 72 typedef long long int64_t; 73 typedef unsigned int uint32_t; 74 typedef int int32_t; 75 typedef unsigned short uint16_t; 76 typedef short int16_t; 77 typedef unsigned char uint8_t; 78 typedef char int8_t; 79 #endif 80 #endif 81#endif 82#endif /* __FreeBSD__ */ 83 84// 85// Basic EFI types of various widths 86// 87 88 89typedef uint64_t UINT64; 90typedef int64_t INT64; 91typedef uint32_t UINT32; 92typedef int32_t INT32; 93typedef uint16_t UINT16; 94typedef int16_t INT16; 95typedef uint8_t UINT8; 96typedef int8_t INT8; 97 98 99#undef VOID 100#define VOID void 101 102 103typedef int64_t INTN; 104typedef uint64_t UINTN; 105 106//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 107// BugBug: Code to debug 108// 109#define BIT63 0x8000000000000000 110 111#define PLATFORM_IOBASE_ADDRESS (0xffffc000000 | BIT63) 112#define PORT_TO_MEMD(_Port) (PLATFORM_IOBASE_ADDRESS | ( ( ( (_Port) & 0xfffc) << 10 ) | ( (_Port) & 0x0fff) ) ) 113 114// 115// Macro's with casts make this much easier to use and read. 116// 117#define PORT_TO_MEM8D(_Port) (*(UINT8 *)(PORT_TO_MEMD(_Port))) 118#define POST_CODE(_Data) (PORT_TO_MEM8D(0x80) = (_Data)) 119// 120// BugBug: End Debug Code!!! 121//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 122 123#define EFIERR(a) (0x8000000000000000 | a) 124#define EFI_ERROR_MASK 0x8000000000000000 125#define EFIERR_OEM(a) (0xc000000000000000 | a) 126 127#define BAD_POINTER 0xFBFBFBFBFBFBFBFB 128#define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF 129 130#pragma intrinsic (__break) 131#define BREAKPOINT() __break(0) 132 133// 134// Pointers must be aligned to these address to function 135// you will get an alignment fault if this value is less than 8 136// 137#define MIN_ALIGNMENT_SIZE 8 138 139#define ALIGN_VARIABLE(Value , Adjustment) \ 140 (UINTN) Adjustment = 0; \ 141 if((UINTN)Value % MIN_ALIGNMENT_SIZE) \ 142 (UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \ 143 Value = (UINTN)Value + (UINTN)Adjustment 144 145// 146// Define macros to create data structure signatures. 147// 148 149#define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) 150#define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) 151#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)) 152 153// 154// EFIAPI - prototype calling convention for EFI function pointers 155// BOOTSERVICE - prototype for implementation of a boot service interface 156// RUNTIMESERVICE - prototype for implementation of a runtime service interface 157// RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service 158// RUNTIME_CODE - pragma macro for declaring runtime code 159// 160 161#ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options 162 #if _MSC_EXTENSIONS 163 #define EFIAPI __cdecl // Force C calling convention for Microsoft C compiler 164 #else 165 #define EFIAPI // Substitute expresion to force C calling convention 166 #endif 167#endif 168 169#define BOOTSERVICE 170#define RUNTIMESERVICE 171#define RUNTIMEFUNCTION 172 173#define RUNTIME_CODE(a) alloc_text("rtcode", a) 174#define BEGIN_RUNTIME_DATA() data_seg("rtdata") 175#define END_RUNTIME_DATA() data_seg() 176 177#define VOLATILE volatile 178 179// 180// BugBug: Need to find out if this is portable accross compliers. 181// 182void __mfa (void); 183#pragma intrinsic (__mfa) 184#define MEMORY_FENCE() __mfa() 185 186#ifdef EFI_NO_INTERFACE_DECL 187 #define EFI_FORWARD_DECLARATION(x) 188 #define EFI_INTERFACE_DECL(x) 189#else 190 #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x 191 #define EFI_INTERFACE_DECL(x) typedef struct x 192#endif 193 194// 195// When build similiar to FW, then link everything together as 196// one big module. 197// 198 199#define EFI_DRIVER_ENTRY_POINT(InitFunction) 200 201#define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ 202 (_if)->LoadInternal(type, name, entry) 203// entry(NULL, ST) 204 205#ifdef __FreeBSD__ 206#define INTERFACE_DECL(x) struct x 207#else 208// 209// Some compilers don't support the forward reference construct: 210// typedef struct XXXXX 211// 212// The following macro provide a workaround for such cases. 213// 214#ifdef NO_INTERFACE_DECL 215#define INTERFACE_DECL(x) 216#else 217#define INTERFACE_DECL(x) typedef struct x 218#endif 219#endif 220