1 /** @file 2 Processor or Compiler specific defines and types for ARM. 3 4 Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR> 5 Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> 6 This program and the accompanying materials 7 are licensed and made available under the terms and conditions of the BSD License 8 which accompanies this distribution. The full text of the license may be found at 9 http://opensource.org/licenses/bsd-license.php 10 11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13 14 **/ 15 16 #ifndef __PROCESSOR_BIND_H__ 17 #define __PROCESSOR_BIND_H__ 18 19 /// 20 /// Define the processor type so other code can make processor based choices 21 /// 22 #define MDE_CPU_ARM 23 24 // 25 // Make sure we are using the correct packing rules per EFI specification 26 // 27 #ifndef __GNUC__ 28 #pragma pack() 29 #endif 30 31 #if _MSC_EXTENSIONS 32 // 33 // use Microsoft* C complier dependent integer width types 34 // 35 typedef unsigned __int64 UINT64; 36 typedef __int64 INT64; 37 typedef unsigned __int32 UINT32; 38 typedef __int32 INT32; 39 typedef unsigned short UINT16; 40 typedef unsigned short CHAR16; 41 typedef short INT16; 42 typedef unsigned char BOOLEAN; 43 typedef unsigned char UINT8; 44 typedef char CHAR8; 45 typedef signed char INT8; 46 #else 47 // 48 // Assume standard ARM alignment. 49 // 50 typedef unsigned long long UINT64; 51 typedef long long INT64; 52 typedef unsigned int UINT32; 53 typedef int INT32; 54 typedef unsigned short UINT16; 55 typedef unsigned short CHAR16; 56 typedef short INT16; 57 typedef unsigned char BOOLEAN; 58 typedef unsigned char UINT8; 59 typedef char CHAR8; 60 typedef signed char INT8; 61 62 #define UINT8_MAX 0xff 63 #endif 64 65 /// 66 /// Unsigned value of native width. (4 bytes on supported 32-bit processor instructions, 67 /// 8 bytes on supported 64-bit processor instructions) 68 /// 69 typedef UINT32 UINTN; 70 71 /// 72 /// Signed value of native width. (4 bytes on supported 32-bit processor instructions, 73 /// 8 bytes on supported 64-bit processor instructions) 74 /// 75 typedef INT32 INTN; 76 77 // 78 // Processor specific defines 79 // 80 81 /// 82 /// A value of native width with the highest bit set. 83 /// 84 #define MAX_BIT 0x80000000 85 86 /// 87 /// A value of native width with the two highest bits set. 88 /// 89 #define MAX_2_BITS 0xC0000000 90 91 /// 92 /// Maximum legal ARM address 93 /// 94 #define MAX_ADDRESS 0xFFFFFFFF 95 96 /// 97 /// The stack alignment required for ARM 98 /// 99 #define CPU_STACK_ALIGNMENT sizeof(UINT64) 100 101 // 102 // Modifier to ensure that all protocol member functions and EFI intrinsics 103 // use the correct C calling convention. All protocol member functions and 104 // EFI intrinsics are required to modify their member functions with EFIAPI. 105 // 106 #define EFIAPI 107 108 #if defined(__GNUC__) 109 /// 110 /// For GNU assembly code, .global or .globl can declare global symbols. 111 /// Define this macro to unify the usage. 112 /// 113 #define ASM_GLOBAL .globl 114 115 #if !defined(__APPLE__) 116 /// 117 /// ARM EABI defines that the linker should not manipulate call relocations 118 /// (do bl/blx conversion) unless the target symbol has function type. 119 /// CodeSourcery 2010.09 started requiring the .type to function properly 120 /// 121 #define INTERWORK_FUNC(func__) .type ASM_PFX(func__), %function 122 123 #define GCC_ASM_EXPORT(func__) \ 124 .global _CONCATENATE (__USER_LABEL_PREFIX__, func__) ;\ 125 .type ASM_PFX(func__), %function 126 127 #define GCC_ASM_IMPORT(func__) \ 128 .extern _CONCATENATE (__USER_LABEL_PREFIX__, func__) 129 130 #else 131 // 132 // .type not supported by Apple Xcode tools 133 // 134 #define INTERWORK_FUNC(func__) 135 136 #define GCC_ASM_EXPORT(func__) \ 137 .globl _CONCATENATE (__USER_LABEL_PREFIX__, func__) \ 138 139 #define GCC_ASM_IMPORT(name) 140 141 #endif 142 #endif 143 144 /** 145 Return the pointer to the first instruction of a function given a function pointer. 146 On ARM CPU architectures, these two pointer values are the same, 147 so the implementation of this macro is very simple. 148 149 @param FunctionPointer A pointer to a function. 150 151 @return The pointer to the first instruction of a function given a function pointer. 152 153 **/ 154 #define FUNCTION_ENTRY_POINT(FunctionPointer) (VOID *)(UINTN)(FunctionPointer) 155 156 #endif 157 158 159