1*1370a723SSascha Wildner /** @file
2*1370a723SSascha Wildner   Defines data types and constants introduced in UEFI.
3*1370a723SSascha Wildner 
4*1370a723SSascha Wildner Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>
5*1370a723SSascha Wildner Portions copyright (c) 2011 - 2016, ARM Ltd. All rights reserved.<BR>
6*1370a723SSascha Wildner Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
7*1370a723SSascha Wildner Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.<BR>
8*1370a723SSascha Wildner 
9*1370a723SSascha Wildner SPDX-License-Identifier: BSD-2-Clause-Patent
10*1370a723SSascha Wildner 
11*1370a723SSascha Wildner **/
12*1370a723SSascha Wildner 
13*1370a723SSascha Wildner #ifndef __UEFI_BASETYPE_H__
14*1370a723SSascha Wildner #define __UEFI_BASETYPE_H__
15*1370a723SSascha Wildner 
16*1370a723SSascha Wildner #include <Base.h>
17*1370a723SSascha Wildner 
18*1370a723SSascha Wildner //
19*1370a723SSascha Wildner // Basic data type definitions introduced in UEFI.
20*1370a723SSascha Wildner //
21*1370a723SSascha Wildner 
22*1370a723SSascha Wildner ///
23*1370a723SSascha Wildner /// 128-bit buffer containing a unique identifier value.
24*1370a723SSascha Wildner ///
25*1370a723SSascha Wildner typedef GUID EFI_GUID;
26*1370a723SSascha Wildner ///
27*1370a723SSascha Wildner /// Function return status for EFI API.
28*1370a723SSascha Wildner ///
29*1370a723SSascha Wildner typedef RETURN_STATUS EFI_STATUS;
30*1370a723SSascha Wildner ///
31*1370a723SSascha Wildner /// A collection of related interfaces.
32*1370a723SSascha Wildner ///
33*1370a723SSascha Wildner typedef VOID *EFI_HANDLE;
34*1370a723SSascha Wildner ///
35*1370a723SSascha Wildner /// Handle to an event structure.
36*1370a723SSascha Wildner ///
37*1370a723SSascha Wildner typedef VOID *EFI_EVENT;
38*1370a723SSascha Wildner ///
39*1370a723SSascha Wildner /// Task priority level.
40*1370a723SSascha Wildner ///
41*1370a723SSascha Wildner typedef UINTN EFI_TPL;
42*1370a723SSascha Wildner ///
43*1370a723SSascha Wildner /// Logical block address.
44*1370a723SSascha Wildner ///
45*1370a723SSascha Wildner typedef UINT64 EFI_LBA;
46*1370a723SSascha Wildner 
47*1370a723SSascha Wildner ///
48*1370a723SSascha Wildner /// 64-bit physical memory address.
49*1370a723SSascha Wildner ///
50*1370a723SSascha Wildner typedef UINT64 EFI_PHYSICAL_ADDRESS;
51*1370a723SSascha Wildner 
52*1370a723SSascha Wildner ///
53*1370a723SSascha Wildner /// 64-bit virtual memory address.
54*1370a723SSascha Wildner ///
55*1370a723SSascha Wildner typedef UINT64 EFI_VIRTUAL_ADDRESS;
56*1370a723SSascha Wildner 
57*1370a723SSascha Wildner ///
58*1370a723SSascha Wildner /// EFI Time Abstraction:
59*1370a723SSascha Wildner ///  Year:       1900 - 9999
60*1370a723SSascha Wildner ///  Month:      1 - 12
61*1370a723SSascha Wildner ///  Day:        1 - 31
62*1370a723SSascha Wildner ///  Hour:       0 - 23
63*1370a723SSascha Wildner ///  Minute:     0 - 59
64*1370a723SSascha Wildner ///  Second:     0 - 59
65*1370a723SSascha Wildner ///  Nanosecond: 0 - 999,999,999
66*1370a723SSascha Wildner ///  TimeZone:   -1440 to 1440 or 2047
67*1370a723SSascha Wildner ///
68*1370a723SSascha Wildner typedef struct {
69*1370a723SSascha Wildner   UINT16    Year;
70*1370a723SSascha Wildner   UINT8     Month;
71*1370a723SSascha Wildner   UINT8     Day;
72*1370a723SSascha Wildner   UINT8     Hour;
73*1370a723SSascha Wildner   UINT8     Minute;
74*1370a723SSascha Wildner   UINT8     Second;
75*1370a723SSascha Wildner   UINT8     Pad1;
76*1370a723SSascha Wildner   UINT32    Nanosecond;
77*1370a723SSascha Wildner   INT16     TimeZone;
78*1370a723SSascha Wildner   UINT8     Daylight;
79*1370a723SSascha Wildner   UINT8     Pad2;
80*1370a723SSascha Wildner } EFI_TIME;
81*1370a723SSascha Wildner 
82*1370a723SSascha Wildner ///
83*1370a723SSascha Wildner /// 4-byte buffer. An IPv4 internet protocol address.
84*1370a723SSascha Wildner ///
85*1370a723SSascha Wildner typedef IPv4_ADDRESS EFI_IPv4_ADDRESS;
86*1370a723SSascha Wildner 
87*1370a723SSascha Wildner ///
88*1370a723SSascha Wildner /// 16-byte buffer. An IPv6 internet protocol address.
89*1370a723SSascha Wildner ///
90*1370a723SSascha Wildner typedef IPv6_ADDRESS EFI_IPv6_ADDRESS;
91*1370a723SSascha Wildner 
92*1370a723SSascha Wildner ///
93*1370a723SSascha Wildner /// 32-byte buffer containing a network Media Access Control address.
94*1370a723SSascha Wildner ///
95*1370a723SSascha Wildner typedef struct {
96*1370a723SSascha Wildner   UINT8    Addr[32];
97*1370a723SSascha Wildner } EFI_MAC_ADDRESS;
98*1370a723SSascha Wildner 
99*1370a723SSascha Wildner ///
100*1370a723SSascha Wildner /// 16-byte buffer aligned on a 4-byte boundary.
101*1370a723SSascha Wildner /// An IPv4 or IPv6 internet protocol address.
102*1370a723SSascha Wildner ///
103*1370a723SSascha Wildner typedef union {
104*1370a723SSascha Wildner   UINT32              Addr[4];
105*1370a723SSascha Wildner   EFI_IPv4_ADDRESS    v4;
106*1370a723SSascha Wildner   EFI_IPv6_ADDRESS    v6;
107*1370a723SSascha Wildner } EFI_IP_ADDRESS;
108*1370a723SSascha Wildner 
109*1370a723SSascha Wildner ///
110*1370a723SSascha Wildner /// Enumeration of EFI_STATUS.
111*1370a723SSascha Wildner ///@{
112*1370a723SSascha Wildner #define EFI_SUCCESS               RETURN_SUCCESS
113*1370a723SSascha Wildner #define EFI_LOAD_ERROR            RETURN_LOAD_ERROR
114*1370a723SSascha Wildner #define EFI_INVALID_PARAMETER     RETURN_INVALID_PARAMETER
115*1370a723SSascha Wildner #define EFI_UNSUPPORTED           RETURN_UNSUPPORTED
116*1370a723SSascha Wildner #define EFI_BAD_BUFFER_SIZE       RETURN_BAD_BUFFER_SIZE
117*1370a723SSascha Wildner #define EFI_BUFFER_TOO_SMALL      RETURN_BUFFER_TOO_SMALL
118*1370a723SSascha Wildner #define EFI_NOT_READY             RETURN_NOT_READY
119*1370a723SSascha Wildner #define EFI_DEVICE_ERROR          RETURN_DEVICE_ERROR
120*1370a723SSascha Wildner #define EFI_WRITE_PROTECTED       RETURN_WRITE_PROTECTED
121*1370a723SSascha Wildner #define EFI_OUT_OF_RESOURCES      RETURN_OUT_OF_RESOURCES
122*1370a723SSascha Wildner #define EFI_VOLUME_CORRUPTED      RETURN_VOLUME_CORRUPTED
123*1370a723SSascha Wildner #define EFI_VOLUME_FULL           RETURN_VOLUME_FULL
124*1370a723SSascha Wildner #define EFI_NO_MEDIA              RETURN_NO_MEDIA
125*1370a723SSascha Wildner #define EFI_MEDIA_CHANGED         RETURN_MEDIA_CHANGED
126*1370a723SSascha Wildner #define EFI_NOT_FOUND             RETURN_NOT_FOUND
127*1370a723SSascha Wildner #define EFI_ACCESS_DENIED         RETURN_ACCESS_DENIED
128*1370a723SSascha Wildner #define EFI_NO_RESPONSE           RETURN_NO_RESPONSE
129*1370a723SSascha Wildner #define EFI_NO_MAPPING            RETURN_NO_MAPPING
130*1370a723SSascha Wildner #define EFI_TIMEOUT               RETURN_TIMEOUT
131*1370a723SSascha Wildner #define EFI_NOT_STARTED           RETURN_NOT_STARTED
132*1370a723SSascha Wildner #define EFI_ALREADY_STARTED       RETURN_ALREADY_STARTED
133*1370a723SSascha Wildner #define EFI_ABORTED               RETURN_ABORTED
134*1370a723SSascha Wildner #define EFI_ICMP_ERROR            RETURN_ICMP_ERROR
135*1370a723SSascha Wildner #define EFI_TFTP_ERROR            RETURN_TFTP_ERROR
136*1370a723SSascha Wildner #define EFI_PROTOCOL_ERROR        RETURN_PROTOCOL_ERROR
137*1370a723SSascha Wildner #define EFI_INCOMPATIBLE_VERSION  RETURN_INCOMPATIBLE_VERSION
138*1370a723SSascha Wildner #define EFI_SECURITY_VIOLATION    RETURN_SECURITY_VIOLATION
139*1370a723SSascha Wildner #define EFI_CRC_ERROR             RETURN_CRC_ERROR
140*1370a723SSascha Wildner #define EFI_END_OF_MEDIA          RETURN_END_OF_MEDIA
141*1370a723SSascha Wildner #define EFI_END_OF_FILE           RETURN_END_OF_FILE
142*1370a723SSascha Wildner #define EFI_INVALID_LANGUAGE      RETURN_INVALID_LANGUAGE
143*1370a723SSascha Wildner #define EFI_COMPROMISED_DATA      RETURN_COMPROMISED_DATA
144*1370a723SSascha Wildner #define EFI_HTTP_ERROR            RETURN_HTTP_ERROR
145*1370a723SSascha Wildner 
146*1370a723SSascha Wildner #define EFI_WARN_UNKNOWN_GLYPH     RETURN_WARN_UNKNOWN_GLYPH
147*1370a723SSascha Wildner #define EFI_WARN_DELETE_FAILURE    RETURN_WARN_DELETE_FAILURE
148*1370a723SSascha Wildner #define EFI_WARN_WRITE_FAILURE     RETURN_WARN_WRITE_FAILURE
149*1370a723SSascha Wildner #define EFI_WARN_BUFFER_TOO_SMALL  RETURN_WARN_BUFFER_TOO_SMALL
150*1370a723SSascha Wildner #define EFI_WARN_STALE_DATA        RETURN_WARN_STALE_DATA
151*1370a723SSascha Wildner #define EFI_WARN_FILE_SYSTEM       RETURN_WARN_FILE_SYSTEM
152*1370a723SSascha Wildner ///@}
153*1370a723SSascha Wildner 
154*1370a723SSascha Wildner ///
155*1370a723SSascha Wildner /// Define macro to encode the status code.
156*1370a723SSascha Wildner ///
157*1370a723SSascha Wildner #define EFIERR(_a)  ENCODE_ERROR(_a)
158*1370a723SSascha Wildner 
159*1370a723SSascha Wildner #define EFI_ERROR(A)  RETURN_ERROR(A)
160*1370a723SSascha Wildner 
161*1370a723SSascha Wildner ///
162*1370a723SSascha Wildner /// ICMP error definitions
163*1370a723SSascha Wildner ///@{
164*1370a723SSascha Wildner #define EFI_NETWORK_UNREACHABLE   EFIERR(100)
165*1370a723SSascha Wildner #define EFI_HOST_UNREACHABLE      EFIERR(101)
166*1370a723SSascha Wildner #define EFI_PROTOCOL_UNREACHABLE  EFIERR(102)
167*1370a723SSascha Wildner #define EFI_PORT_UNREACHABLE      EFIERR(103)
168*1370a723SSascha Wildner ///@}
169*1370a723SSascha Wildner 
170*1370a723SSascha Wildner ///
171*1370a723SSascha Wildner /// Tcp connection status definitions
172*1370a723SSascha Wildner ///@{
173*1370a723SSascha Wildner #define EFI_CONNECTION_FIN      EFIERR(104)
174*1370a723SSascha Wildner #define EFI_CONNECTION_RESET    EFIERR(105)
175*1370a723SSascha Wildner #define EFI_CONNECTION_REFUSED  EFIERR(106)
176*1370a723SSascha Wildner ///@}
177*1370a723SSascha Wildner 
178*1370a723SSascha Wildner //
179*1370a723SSascha Wildner // The EFI memory allocation functions work in units of EFI_PAGEs that are
180*1370a723SSascha Wildner // 4KB. This should in no way be confused with the page size of the processor.
181*1370a723SSascha Wildner // An EFI_PAGE is just the quanta of memory in EFI.
182*1370a723SSascha Wildner //
183*1370a723SSascha Wildner #define EFI_PAGE_SIZE   SIZE_4KB
184*1370a723SSascha Wildner #define EFI_PAGE_MASK   0xFFF
185*1370a723SSascha Wildner #define EFI_PAGE_SHIFT  12
186*1370a723SSascha Wildner 
187*1370a723SSascha Wildner /**
188*1370a723SSascha Wildner   Macro that converts a size, in bytes, to a number of EFI_PAGESs.
189*1370a723SSascha Wildner 
190*1370a723SSascha Wildner   @param  Size      A size in bytes.  This parameter is assumed to be type UINTN.
191*1370a723SSascha Wildner                     Passing in a parameter that is larger than UINTN may produce
192*1370a723SSascha Wildner                     unexpected results.
193*1370a723SSascha Wildner 
194*1370a723SSascha Wildner   @return  The number of EFI_PAGESs associated with the number of bytes specified
195*1370a723SSascha Wildner            by Size.
196*1370a723SSascha Wildner 
197*1370a723SSascha Wildner **/
198*1370a723SSascha Wildner #define EFI_SIZE_TO_PAGES(Size)  (((Size) >> EFI_PAGE_SHIFT) + (((Size) & EFI_PAGE_MASK) ? 1 : 0))
199*1370a723SSascha Wildner 
200*1370a723SSascha Wildner /**
201*1370a723SSascha Wildner   Macro that converts a number of EFI_PAGEs to a size in bytes.
202*1370a723SSascha Wildner 
203*1370a723SSascha Wildner   @param  Pages     The number of EFI_PAGES.  This parameter is assumed to be
204*1370a723SSascha Wildner                     type UINTN.  Passing in a parameter that is larger than
205*1370a723SSascha Wildner                     UINTN may produce unexpected results.
206*1370a723SSascha Wildner 
207*1370a723SSascha Wildner   @return  The number of bytes associated with the number of EFI_PAGEs specified
208*1370a723SSascha Wildner            by Pages.
209*1370a723SSascha Wildner 
210*1370a723SSascha Wildner **/
211*1370a723SSascha Wildner #define EFI_PAGES_TO_SIZE(Pages)  ((Pages) << EFI_PAGE_SHIFT)
212*1370a723SSascha Wildner 
213*1370a723SSascha Wildner ///
214*1370a723SSascha Wildner /// PE32+ Machine type for IA32 UEFI images.
215*1370a723SSascha Wildner ///
216*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_IA32  0x014C
217*1370a723SSascha Wildner 
218*1370a723SSascha Wildner ///
219*1370a723SSascha Wildner /// PE32+ Machine type for IA64 UEFI images.
220*1370a723SSascha Wildner ///
221*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_IA64  0x0200
222*1370a723SSascha Wildner 
223*1370a723SSascha Wildner ///
224*1370a723SSascha Wildner /// PE32+ Machine type for EBC UEFI images.
225*1370a723SSascha Wildner ///
226*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_EBC  0x0EBC
227*1370a723SSascha Wildner 
228*1370a723SSascha Wildner ///
229*1370a723SSascha Wildner /// PE32+ Machine type for X64 UEFI images.
230*1370a723SSascha Wildner ///
231*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_X64  0x8664
232*1370a723SSascha Wildner 
233*1370a723SSascha Wildner ///
234*1370a723SSascha Wildner /// PE32+ Machine type for ARM mixed ARM and Thumb/Thumb2 images.
235*1370a723SSascha Wildner ///
236*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_ARMTHUMB_MIXED  0x01C2
237*1370a723SSascha Wildner 
238*1370a723SSascha Wildner ///
239*1370a723SSascha Wildner /// PE32+ Machine type for AARCH64 A64 images.
240*1370a723SSascha Wildner ///
241*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_AARCH64  0xAA64
242*1370a723SSascha Wildner 
243*1370a723SSascha Wildner ///
244*1370a723SSascha Wildner /// PE32+ Machine type for RISC-V 32/64/128
245*1370a723SSascha Wildner ///
246*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_RISCV32   0x5032
247*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_RISCV64   0x5064
248*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_RISCV128  0x5128
249*1370a723SSascha Wildner 
250*1370a723SSascha Wildner ///
251*1370a723SSascha Wildner /// PE32+ Machine type for LoongArch 32/64 images.
252*1370a723SSascha Wildner ///
253*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_LOONGARCH32  0x6232
254*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_LOONGARCH64  0x6264
255*1370a723SSascha Wildner 
256*1370a723SSascha Wildner #if !defined (EFI_IMAGE_MACHINE_TYPE_VALUE) && !defined (EFI_IMAGE_MACHINE_CROSS_TYPE_VALUE)
257*1370a723SSascha Wildner   #if   defined (MDE_CPU_IA32)
258*1370a723SSascha Wildner 
259*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \
260*1370a723SSascha Wildner   ((Machine) == EFI_IMAGE_MACHINE_IA32)
261*1370a723SSascha Wildner 
262*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine)  ((Machine) == EFI_IMAGE_MACHINE_X64)
263*1370a723SSascha Wildner 
264*1370a723SSascha Wildner   #elif defined (MDE_CPU_X64)
265*1370a723SSascha Wildner 
266*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \
267*1370a723SSascha Wildner   ((Machine) == EFI_IMAGE_MACHINE_X64)
268*1370a723SSascha Wildner 
269*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine)  ((Machine) == EFI_IMAGE_MACHINE_IA32)
270*1370a723SSascha Wildner 
271*1370a723SSascha Wildner   #elif defined (MDE_CPU_ARM)
272*1370a723SSascha Wildner 
273*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine)  ((Machine) == EFI_IMAGE_MACHINE_ARMTHUMB_MIXED)
274*1370a723SSascha Wildner 
275*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine)  (FALSE)
276*1370a723SSascha Wildner 
277*1370a723SSascha Wildner   #elif defined (MDE_CPU_AARCH64)
278*1370a723SSascha Wildner 
279*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \
280*1370a723SSascha Wildner   ((Machine) == EFI_IMAGE_MACHINE_AARCH64)
281*1370a723SSascha Wildner 
282*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine)  (FALSE)
283*1370a723SSascha Wildner 
284*1370a723SSascha Wildner   #elif defined (MDE_CPU_RISCV64)
285*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \
286*1370a723SSascha Wildner   ((Machine) == EFI_IMAGE_MACHINE_RISCV64)
287*1370a723SSascha Wildner 
288*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine)  (FALSE)
289*1370a723SSascha Wildner 
290*1370a723SSascha Wildner   #elif defined (MDE_CPU_LOONGARCH64)
291*1370a723SSascha Wildner 
292*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine) \
293*1370a723SSascha Wildner     ((Machine) == EFI_IMAGE_MACHINE_LOONGARCH64)
294*1370a723SSascha Wildner 
295*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine)  (FALSE)
296*1370a723SSascha Wildner 
297*1370a723SSascha Wildner   #elif defined (MDE_CPU_EBC)
298*1370a723SSascha Wildner 
299*1370a723SSascha Wildner ///
300*1370a723SSascha Wildner /// This is just to make sure you can cross compile with the EBC compiler.
301*1370a723SSascha Wildner /// It does not make sense to have a PE loader coded in EBC.
302*1370a723SSascha Wildner ///
303*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine)  ((Machine) == EFI_IMAGE_MACHINE_EBC)
304*1370a723SSascha Wildner 
305*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine)  (FALSE)
306*1370a723SSascha Wildner 
307*1370a723SSascha Wildner   #else
308*1370a723SSascha Wildner     #error Unknown Processor Type
309*1370a723SSascha Wildner   #endif
310*1370a723SSascha Wildner #else
311*1370a723SSascha Wildner   #if defined (EFI_IMAGE_MACHINE_TYPE_VALUE)
312*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine)  ((Machine) == EFI_IMAGE_MACHINE_TYPE_VALUE)
313*1370a723SSascha Wildner   #else
314*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_TYPE_SUPPORTED(Machine)  (FALSE)
315*1370a723SSascha Wildner   #endif
316*1370a723SSascha Wildner   #if defined (EFI_IMAGE_MACHINE_CROSS_TYPE_VALUE)
317*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine)  ((Machine) == EFI_IMAGE_MACHINE_CROSS_TYPE_VALUE)
318*1370a723SSascha Wildner   #else
319*1370a723SSascha Wildner #define EFI_IMAGE_MACHINE_CROSS_TYPE_SUPPORTED(Machine)  (FALSE)
320*1370a723SSascha Wildner   #endif
321*1370a723SSascha Wildner #endif
322*1370a723SSascha Wildner 
323*1370a723SSascha Wildner #endif
324