Stefan Reinauer | cc5b344 | 2013-01-15 17:02:58 -0800 | [diff] [blame] | 1 | /*++ |
| 2 | |
| 3 | Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR> |
| 4 | This program and the accompanying materials |
| 5 | are licensed and made available under the terms and conditions of the BSD License |
| 6 | which accompanies this distribution. The full text of the license may be found at |
| 7 | http://opensource.org/licenses/bsd-license.php |
| 8 | |
| 9 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, |
| 10 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. |
| 11 | |
| 12 | Module Name: |
| 13 | |
| 14 | EfiTypes.h |
| 15 | |
| 16 | Abstract: |
| 17 | |
| 18 | EFI defined types. Use these types when ever possible! |
| 19 | |
| 20 | --*/ |
| 21 | |
| 22 | #ifndef _EFI_TYPES_H_ |
| 23 | #define _EFI_TYPES_H_ |
| 24 | |
| 25 | // |
| 26 | // EFI Data Types based on ANSI C integer types in EfiBind.h |
| 27 | // |
| 28 | typedef uint8_t BOOLEAN; |
| 29 | typedef intn_t INTN; |
| 30 | typedef uintn_t UINTN; |
| 31 | typedef int8_t INT8; |
| 32 | typedef uint8_t UINT8; |
| 33 | typedef int16_t INT16; |
| 34 | typedef uint16_t UINT16; |
| 35 | typedef int32_t INT32; |
| 36 | typedef uint32_t UINT32; |
| 37 | typedef int64_t INT64; |
| 38 | typedef uint64_t UINT64; |
| 39 | typedef char CHAR8; |
| 40 | typedef uint16_t CHAR16; |
| 41 | typedef UINT64 EFI_LBA; |
| 42 | |
| 43 | // |
| 44 | // Modifiers for EFI Data Types used to self document code. |
| 45 | // Please see EFI coding convention for proper usage. |
| 46 | // |
| 47 | #ifndef IN |
| 48 | // |
| 49 | // Some other envirnments use this construct, so #ifndef to prevent |
| 50 | // mulitple definition. |
| 51 | // |
| 52 | #define IN |
| 53 | #define OUT |
| 54 | #define OPTIONAL |
| 55 | #endif |
| 56 | |
| 57 | #ifndef UNALIGNED |
| 58 | #define UNALIGNED |
| 59 | #endif |
| 60 | |
| 61 | // |
| 62 | // Modifiers for EFI Runtime and Boot Services |
| 63 | // |
| 64 | #define EFI_RUNTIMESERVICE |
| 65 | #define EFI_BOOTSERVICE |
| 66 | |
| 67 | // |
| 68 | // Boot Service add in EFI 1.1 |
| 69 | // |
| 70 | #define EFI_BOOTSERVICE11 |
| 71 | |
| 72 | // |
| 73 | // Modifiers to absract standard types to aid in debug of problems |
| 74 | // |
| 75 | #define CONST const |
| 76 | #define STATIC static |
| 77 | #define VOID void |
| 78 | #define VOLATILE volatile |
| 79 | |
| 80 | // |
| 81 | // Modifier to ensure that all protocol member functions and EFI intrinsics |
| 82 | // use the correct C calling convention. All protocol member functions and |
| 83 | // EFI intrinsics are required to modify thier member functions with EFIAPI. |
| 84 | // |
| 85 | #ifndef EFIAPI |
| 86 | #define EFIAPI _EFIAPI |
| 87 | #endif |
| 88 | |
| 89 | // |
| 90 | // EFI Constants. They may exist in other build structures, so #ifndef them. |
| 91 | // |
| 92 | #ifndef TRUE |
| 93 | #define TRUE ((BOOLEAN) (1 == 1)) |
| 94 | #endif |
| 95 | |
| 96 | #ifndef FALSE |
| 97 | #define FALSE ((BOOLEAN) (0 == 1)) |
| 98 | #endif |
| 99 | |
| 100 | #ifndef NULL |
| 101 | #define NULL ((VOID *) 0) |
| 102 | #endif |
| 103 | // |
| 104 | // EFI Data Types derived from other EFI data types. |
| 105 | // |
| 106 | typedef UINTN EFI_STATUS; |
| 107 | |
| 108 | typedef VOID *EFI_HANDLE; |
| 109 | #define NULL_HANDLE ((VOID *) 0) |
| 110 | |
| 111 | typedef VOID *EFI_EVENT; |
| 112 | typedef UINTN EFI_TPL; |
| 113 | |
| 114 | typedef struct { |
| 115 | UINT32 Data1; |
| 116 | UINT16 Data2; |
| 117 | UINT16 Data3; |
| 118 | UINT8 Data4[8]; |
| 119 | } EFI_GUID; |
| 120 | |
| 121 | typedef union { |
| 122 | EFI_GUID Guid; |
| 123 | UINT8 Raw[16]; |
| 124 | } EFI_GUID_UNION; |
| 125 | |
| 126 | // |
| 127 | // EFI Time Abstraction: |
| 128 | // Year: 2000 - 20XX |
| 129 | // Month: 1 - 12 |
| 130 | // Day: 1 - 31 |
| 131 | // Hour: 0 - 23 |
| 132 | // Minute: 0 - 59 |
| 133 | // Second: 0 - 59 |
| 134 | // Nanosecond: 0 - 999,999,999 |
| 135 | // TimeZone: -1440 to 1440 or 2047 |
| 136 | // |
| 137 | typedef struct { |
| 138 | UINT16 Year; |
| 139 | UINT8 Month; |
| 140 | UINT8 Day; |
| 141 | UINT8 Hour; |
| 142 | UINT8 Minute; |
| 143 | UINT8 Second; |
| 144 | UINT8 Pad1; |
| 145 | UINT32 Nanosecond; |
| 146 | INT16 TimeZone; |
| 147 | UINT8 Daylight; |
| 148 | UINT8 Pad2; |
| 149 | } EFI_TIME; |
| 150 | |
| 151 | // |
| 152 | // Bit definitions for EFI_TIME.Daylight |
| 153 | // |
| 154 | #define EFI_TIME_ADJUST_DAYLIGHT 0x01 |
| 155 | #define EFI_TIME_IN_DAYLIGHT 0x02 |
| 156 | |
| 157 | // |
| 158 | // Value definition for EFI_TIME.TimeZone |
| 159 | // |
| 160 | #define EFI_UNSPECIFIED_TIMEZONE 0x07FF |
| 161 | |
| 162 | // |
| 163 | // Networking |
| 164 | // |
| 165 | typedef struct { |
| 166 | UINT8 Addr[4]; |
| 167 | } EFI_IPv4_ADDRESS; |
| 168 | |
| 169 | typedef struct { |
| 170 | UINT8 Addr[16]; |
| 171 | } EFI_IPv6_ADDRESS; |
| 172 | |
| 173 | typedef struct { |
| 174 | UINT8 Addr[32]; |
| 175 | } EFI_MAC_ADDRESS; |
| 176 | |
| 177 | typedef union { |
| 178 | UINT32 Addr[4]; |
| 179 | EFI_IPv4_ADDRESS v4; |
| 180 | EFI_IPv6_ADDRESS v6; |
| 181 | } EFI_IP_ADDRESS; |
| 182 | |
| 183 | typedef enum { |
| 184 | EfiReservedMemoryType, |
| 185 | EfiLoaderCode, |
| 186 | EfiLoaderData, |
| 187 | EfiBootServicesCode, |
| 188 | EfiBootServicesData, |
| 189 | EfiRuntimeServicesCode, |
| 190 | EfiRuntimeServicesData, |
| 191 | EfiConventionalMemory, |
| 192 | EfiUnusableMemory, |
| 193 | EfiACPIReclaimMemory, |
| 194 | EfiACPIMemoryNVS, |
| 195 | EfiMemoryMappedIO, |
| 196 | EfiMemoryMappedIOPortSpace, |
| 197 | EfiPalCode, |
| 198 | EfiMaxMemoryType |
| 199 | } EFI_MEMORY_TYPE; |
| 200 | |
| 201 | typedef enum { |
| 202 | AllocateAnyPages, |
| 203 | AllocateMaxAddress, |
| 204 | AllocateAddress, |
| 205 | MaxAllocateType |
| 206 | } EFI_ALLOCATE_TYPE; |
| 207 | |
| 208 | typedef struct { |
| 209 | UINT64 Signature; |
| 210 | UINT32 Revision; |
| 211 | UINT32 HeaderSize; |
| 212 | UINT32 CRC32; |
| 213 | UINT32 Reserved; |
| 214 | } EFI_TABLE_HEADER; |
| 215 | |
| 216 | // |
| 217 | // possible caching types for the memory range |
| 218 | // |
| 219 | #define EFI_MEMORY_UC 0x0000000000000001 |
| 220 | #define EFI_MEMORY_WC 0x0000000000000002 |
| 221 | #define EFI_MEMORY_WT 0x0000000000000004 |
| 222 | #define EFI_MEMORY_WB 0x0000000000000008 |
| 223 | #define EFI_MEMORY_UCE 0x0000000000000010 |
| 224 | |
| 225 | // |
| 226 | // physical memory protection on range |
| 227 | // |
| 228 | #define EFI_MEMORY_WP 0x0000000000001000 |
| 229 | #define EFI_MEMORY_RP 0x0000000000002000 |
| 230 | #define EFI_MEMORY_XP 0x0000000000004000 |
| 231 | |
| 232 | // |
| 233 | // range requires a runtime mapping |
| 234 | // |
| 235 | #define EFI_MEMORY_RUNTIME 0x8000000000000000ULL |
| 236 | |
| 237 | typedef UINT64 EFI_PHYSICAL_ADDRESS; |
| 238 | typedef UINT64 EFI_VIRTUAL_ADDRESS; |
| 239 | |
| 240 | #define EFI_MEMORY_DESCRIPTOR_VERSION 1 |
| 241 | typedef struct { |
| 242 | UINT32 Type; |
| 243 | UINT32 Pad; |
| 244 | EFI_PHYSICAL_ADDRESS PhysicalStart; |
| 245 | EFI_VIRTUAL_ADDRESS VirtualStart; |
| 246 | UINT64 NumberOfPages; |
| 247 | UINT64 Attribute; |
| 248 | } EFI_MEMORY_DESCRIPTOR; |
| 249 | |
| 250 | // |
| 251 | // The EFI memory allocation functions work in units of EFI_PAGEs that are |
| 252 | // 4K. This should in no way be confused with the page size of the processor. |
| 253 | // An EFI_PAGE is just the quanta of memory in EFI. |
| 254 | // |
| 255 | #define EFI_PAGE_SIZE 4096 |
| 256 | #define EFI_PAGE_MASK 0xFFF |
| 257 | #define EFI_PAGE_SHIFT 12 |
| 258 | |
| 259 | #define EFI_SIZE_TO_PAGES(a) (((a) >> EFI_PAGE_SHIFT) + (((a) & EFI_PAGE_MASK) ? 1 : 0)) |
| 260 | |
| 261 | #define EFI_PAGES_TO_SIZE(a) ( (a) << EFI_PAGE_SHIFT) |
| 262 | |
| 263 | // |
| 264 | // ALIGN_POINTER - aligns a pointer to the lowest boundry |
| 265 | // |
| 266 | #define ALIGN_POINTER(p, s) ((VOID *) (p + ((s - ((UINTN) p)) & (s - 1)))) |
| 267 | |
| 268 | // |
| 269 | // ALIGN_VARIABLE - aligns a variable up to the next natural boundry for int size of a processor |
| 270 | // |
| 271 | #define ALIGN_VARIABLE(Value, Adjustment) \ |
| 272 | (UINTN) Adjustment = 0; \ |
| 273 | if ((UINTN) Value % sizeof (UINTN)) { \ |
| 274 | (UINTN) Adjustment = sizeof (UINTN) - ((UINTN) Value % sizeof (UINTN)); \ |
| 275 | } \ |
| 276 | Value = (UINTN) Value + (UINTN) Adjustment |
| 277 | |
| 278 | // |
| 279 | // EFI_FIELD_OFFSET - returns the byte offset to a field within a structure |
| 280 | // |
| 281 | #define EFI_FIELD_OFFSET(TYPE,Field) ((UINTN)(&(((TYPE *) 0)->Field))) |
| 282 | |
| 283 | // |
| 284 | // CONTAINING_RECORD - returns a pointer to the structure |
| 285 | // from one of it's elements. |
| 286 | // |
| 287 | #define _CR(Record, TYPE, Field) ((TYPE *) ((CHAR8 *) (Record) - (CHAR8 *) &(((TYPE *) 0)->Field))) |
| 288 | |
| 289 | // |
| 290 | // Define macros to build data structure signatures from characters. |
| 291 | // |
| 292 | #define EFI_SIGNATURE_16(A, B) ((A) | (B << 8)) |
| 293 | #define EFI_SIGNATURE_32(A, B, C, D) (EFI_SIGNATURE_16 (A, B) | (EFI_SIGNATURE_16 (C, D) << 16)) |
| 294 | #define EFI_SIGNATURE_64(A, B, C, D, E, F, G, H) \ |
| 295 | (EFI_SIGNATURE_32 (A, B, C, D) | ((UINT64) (EFI_SIGNATURE_32 (E, F, G, H)) << 32)) |
| 296 | |
| 297 | #endif |