1373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel/** @file 2373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 3373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel Copyright (c) 2013, ARM Ltd. All rights reserved.<BR> 4373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 5373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel This program and the accompanying materials 6373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel are licensed and made available under the terms and conditions of the BSD License 7373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel which accompanies this distribution. The full text of the license may be found at 8373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel http://opensource.org/licenses/bsd-license.php 9373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 10373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 13373fbc64167e080fbe334776877cfba116d62a2dHarry LiebelModule Name: 14373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 15373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel EfiBind.h 16373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 17373fbc64167e080fbe334776877cfba116d62a2dHarry LiebelAbstract: 18373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 19373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel Processor or Compiler specific defines and types for AArch64. 20373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel We are using the ANSI C 2000 _t type definitions for basic types. 21373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel This it technically a violation of the coding standard, but they 22373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel are used to make EfiTypes.h portable. Code other than EfiTypes.h 23373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel should never use any ANSI C 2000 _t integer types. 24373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 25373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel**/ 26373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 27373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 28373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#ifndef _EFI_BIND_H_ 29373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define _EFI_BIND_H_ 30373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 31373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 32373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_DRIVER_ENTRY_POINT(InitFunction) 33373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_APPLICATION_ENTRY_POINT EFI_DRIVER_ENTRY_POINT 34373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 35373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 36373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 37373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Make sure we are using the correct packing rules per EFI specification. 38373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 39373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#ifndef __GNUC__ 40373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#pragma pack() 41373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#endif 42373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 43373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 44373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 45373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Assume standard AArch64 alignment. 46373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// BugBug: Need to check portability of long long 47373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 48373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef unsigned long long uint64_t; 49373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef long long int64_t; 50373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef unsigned int uint32_t; 51373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef int int32_t; 52373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef unsigned short uint16_t; 53373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef short int16_t; 54373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef unsigned char uint8_t; 55373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef signed char int8_t; 56373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 57373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 58373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Native integer size in stdint.h 59373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 60373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef uint64_t uintn_t; 61373fbc64167e080fbe334776877cfba116d62a2dHarry Liebeltypedef int64_t intn_t; 62373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 63373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 64373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Processor specific defines 65373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 66373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_MAX_BIT 0x8000000000000000 67373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define MAX_2_BITS 0xC000000000000000 68373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 69373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 70373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Maximum legal AArch64 address 71373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 72373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_MAX_ADDRESS 0xFFFFFFFFFFFFFFFF 73373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 74373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 75373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Bad pointer value to use in check builds. 76373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// if you see this value you are using uninitialized or free'ed data 77373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 78373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_BAD_POINTER 0xAFAFAFAFAFAFAFAF 79373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_BAD_POINTER_AS_BYTE 0xAF 80373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 81373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_DEADLOOP() { volatile UINTN __iii; __iii = 1; while (__iii); } 82373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 83373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 84373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// For real hardware, just put in a halt loop. Don't do a while(1) because the 85373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// compiler will optimize away the rest of the function following, so that you run out in 86373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// the weeds if you skip over it with a debugger. 87373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 88373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define EFI_BREAKPOINT EFI_DEADLOOP() 89373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 90373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 91373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 92373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Memory Fence forces serialization, and is needed to support out of order 93373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// memory transactions. The Memory Fence is mainly used to make sure IO 94373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// transactions complete in a deterministic sequence, and to syncronize locks 95373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// an other MP code. Currently no memory fencing is required. 96373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 97373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define MEMORY_FENCE() 98373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 99373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 100373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Some compilers don't support the forward reference construct: 101373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// typedef struct XXXXX. The forward reference is required for 102373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// ANSI compatibility. 103373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 104373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// The following macro provide a workaround for such cases. 105373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 106373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 107373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 108373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#ifdef EFI_NO_INTERFACE_DECL 109373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel #define EFI_FORWARD_DECLARATION(x) 110373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#else 111373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel #define EFI_FORWARD_DECLARATION(x) typedef struct _##x x 112373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#endif 113373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 114373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 115373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 116373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// Some C compilers optimize the calling conventions to increase performance. 117373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// _EFIAPI is used to make all public APIs follow the standard C calling 118373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// convention. 119373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 120373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#define _EFIAPI 121373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 122373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 123373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 124373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 125373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// For symbol name in GNU assembly code, an extra "_" is necessary 126373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel// 127373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#if defined(__GNUC__) 128373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel /// 129373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel /// Private worker functions for ASM_PFX() 130373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel /// 131373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel #define _CONCATENATE(a, b) __CONCATENATE(a, b) 132373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel #define __CONCATENATE(a, b) a ## b 133373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 134373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel /// 135373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel /// The __USER_LABEL_PREFIX__ macro predefined by GNUC represents the prefix 136373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel /// on symbols in assembly language. 137373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel /// 138373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel #define ASM_PFX(name) _CONCATENATE (__USER_LABEL_PREFIX__, name) 139373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 140373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#endif 141373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 142373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel#endif 143373fbc64167e080fbe334776877cfba116d62a2dHarry Liebel 144