1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#ifndef _EFI_H
17#define _EFI_H
18
19#include <linux/linkage.h>
20#include <linux/string.h>
21#include <linux/types.h>
22
23
24#define efi_intn_t ssize_t
25
26#define efi_uintn_t size_t
27
28
29
30
31
32
33
34
35
36#ifdef __x86_64__
37#define EFIAPI __attribute__((ms_abi))
38#define efi_va_list __builtin_ms_va_list
39#define efi_va_start __builtin_ms_va_start
40#define efi_va_copy __builtin_ms_va_copy
41#define efi_va_arg __builtin_va_arg
42#define efi_va_end __builtin_ms_va_end
43#else
44#define EFIAPI asmlinkage
45#define efi_va_list va_list
46#define efi_va_start va_start
47#define efi_va_copy va_copy
48#define efi_va_arg va_arg
49#define efi_va_end va_end
50#endif
51
52#define EFI32_LOADER_SIGNATURE "EL32"
53#define EFI64_LOADER_SIGNATURE "EL64"
54
55struct efi_device_path;
56
57
58
59
60
61
62
63
64
65
66typedef struct {
67 u8 b[16];
68} efi_guid_t __attribute__((aligned(4)));
69
70#define EFI_BITS_PER_LONG (sizeof(long) * 8)
71
72
73#define EFI_ERROR_MASK (1UL << (EFI_BITS_PER_LONG - 1))
74
75#define EFI_SUCCESS 0
76#define EFI_LOAD_ERROR (EFI_ERROR_MASK | 1)
77#define EFI_INVALID_PARAMETER (EFI_ERROR_MASK | 2)
78#define EFI_UNSUPPORTED (EFI_ERROR_MASK | 3)
79#define EFI_BAD_BUFFER_SIZE (EFI_ERROR_MASK | 4)
80#define EFI_BUFFER_TOO_SMALL (EFI_ERROR_MASK | 5)
81#define EFI_NOT_READY (EFI_ERROR_MASK | 6)
82#define EFI_DEVICE_ERROR (EFI_ERROR_MASK | 7)
83#define EFI_WRITE_PROTECTED (EFI_ERROR_MASK | 8)
84#define EFI_OUT_OF_RESOURCES (EFI_ERROR_MASK | 9)
85#define EFI_VOLUME_CORRUPTED (EFI_ERROR_MASK | 10)
86#define EFI_VOLUME_FULL (EFI_ERROR_MASK | 11)
87#define EFI_NO_MEDIA (EFI_ERROR_MASK | 12)
88#define EFI_MEDIA_CHANGED (EFI_ERROR_MASK | 13)
89#define EFI_NOT_FOUND (EFI_ERROR_MASK | 14)
90#define EFI_ACCESS_DENIED (EFI_ERROR_MASK | 15)
91#define EFI_NO_RESPONSE (EFI_ERROR_MASK | 16)
92#define EFI_NO_MAPPING (EFI_ERROR_MASK | 17)
93#define EFI_TIMEOUT (EFI_ERROR_MASK | 18)
94#define EFI_NOT_STARTED (EFI_ERROR_MASK | 19)
95#define EFI_ALREADY_STARTED (EFI_ERROR_MASK | 20)
96#define EFI_ABORTED (EFI_ERROR_MASK | 21)
97#define EFI_ICMP_ERROR (EFI_ERROR_MASK | 22)
98#define EFI_TFTP_ERROR (EFI_ERROR_MASK | 23)
99#define EFI_PROTOCOL_ERROR (EFI_ERROR_MASK | 24)
100#define EFI_INCOMPATIBLE_VERSION (EFI_ERROR_MASK | 25)
101#define EFI_SECURITY_VIOLATION (EFI_ERROR_MASK | 26)
102#define EFI_CRC_ERROR (EFI_ERROR_MASK | 27)
103#define EFI_END_OF_MEDIA (EFI_ERROR_MASK | 28)
104#define EFI_END_OF_FILE (EFI_ERROR_MASK | 31)
105#define EFI_INVALID_LANGUAGE (EFI_ERROR_MASK | 32)
106#define EFI_COMPROMISED_DATA (EFI_ERROR_MASK | 33)
107#define EFI_IP_ADDRESS_CONFLICT (EFI_ERROR_MASK | 34)
108#define EFI_HTTP_ERROR (EFI_ERROR_MASK | 35)
109
110#define EFI_WARN_UNKNOWN_GLYPH 1
111#define EFI_WARN_DELETE_FAILURE 2
112#define EFI_WARN_WRITE_FAILURE 3
113#define EFI_WARN_BUFFER_TOO_SMALL 4
114#define EFI_WARN_STALE_DATA 5
115#define EFI_WARN_FILE_SYSTEM 6
116#define EFI_WARN_RESET_REQUIRED 7
117
118typedef unsigned long efi_status_t;
119typedef u64 efi_physical_addr_t;
120typedef u64 efi_virtual_addr_t;
121typedef struct efi_object *efi_handle_t;
122
123#define EFI_GUID(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7) \
124 {{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, \
125 ((a) >> 24) & 0xff, \
126 (b) & 0xff, ((b) >> 8) & 0xff, \
127 (c) & 0xff, ((c) >> 8) & 0xff, \
128 (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) } }
129
130
131struct efi_table_hdr {
132 u64 signature;
133 u32 revision;
134 u32 headersize;
135 u32 crc32;
136 u32 reserved;
137};
138
139
140
141
142
143enum efi_allocate_type {
144
145
146
147
148 EFI_ALLOCATE_ANY_PAGES,
149
150
151
152
153
154 EFI_ALLOCATE_MAX_ADDRESS,
155
156
157
158
159 EFI_ALLOCATE_ADDRESS,
160
161
162
163
164 EFI_MAX_ALLOCATE_TYPE,
165};
166
167
168enum efi_memory_type {
169 EFI_RESERVED_MEMORY_TYPE,
170
171
172
173
174 EFI_LOADER_CODE,
175
176
177
178
179
180 EFI_LOADER_DATA,
181
182 EFI_BOOT_SERVICES_CODE,
183
184
185
186
187
188 EFI_BOOT_SERVICES_DATA,
189
190 EFI_RUNTIME_SERVICES_CODE,
191
192
193
194
195
196 EFI_RUNTIME_SERVICES_DATA,
197
198 EFI_CONVENTIONAL_MEMORY,
199
200 EFI_UNUSABLE_MEMORY,
201
202 EFI_ACPI_RECLAIM_MEMORY,
203
204 EFI_ACPI_MEMORY_NVS,
205
206
207
208
209
210 EFI_MMAP_IO,
211
212
213
214
215 EFI_MMAP_IO_PORT,
216
217
218
219
220 EFI_PAL_CODE,
221
222
223
224 EFI_PERSISTENT_MEMORY_TYPE,
225
226
227
228 EFI_UNACCEPTED_MEMORY_TYPE,
229
230 EFI_MAX_MEMORY_TYPE,
231};
232
233
234#define EFI_MEMORY_UC ((u64)0x0000000000000001ULL)
235#define EFI_MEMORY_WC ((u64)0x0000000000000002ULL)
236#define EFI_MEMORY_WT ((u64)0x0000000000000004ULL)
237#define EFI_MEMORY_WB ((u64)0x0000000000000008ULL)
238#define EFI_MEMORY_UCE ((u64)0x0000000000000010ULL)
239#define EFI_MEMORY_WP ((u64)0x0000000000001000ULL)
240#define EFI_MEMORY_RP ((u64)0x0000000000002000ULL)
241#define EFI_MEMORY_XP ((u64)0x0000000000004000ULL)
242#define EFI_MEMORY_NV ((u64)0x0000000000008000ULL)
243#define EFI_MEMORY_MORE_RELIABLE \
244 ((u64)0x0000000000010000ULL)
245#define EFI_MEMORY_RO ((u64)0x0000000000020000ULL)
246#define EFI_MEMORY_SP ((u64)0x0000000000040000ULL)
247#define EFI_MEMORY_CPU_CRYPTO ((u64)0x0000000000080000ULL)
248#define EFI_MEMORY_RUNTIME ((u64)0x8000000000000000ULL)
249#define EFI_MEM_DESC_VERSION 1
250
251#define EFI_PAGE_SHIFT 12
252#define EFI_PAGE_SIZE (1ULL << EFI_PAGE_SHIFT)
253#define EFI_PAGE_MASK (EFI_PAGE_SIZE - 1)
254
255struct efi_mem_desc {
256 u32 type;
257 u32 reserved;
258 efi_physical_addr_t physical_start;
259 efi_virtual_addr_t virtual_start;
260 u64 num_pages;
261 u64 attribute;
262};
263
264#define EFI_MEMORY_DESCRIPTOR_VERSION 1
265
266
267#define EFI_TIME_ADJUST_DAYLIGHT 0x1
268#define EFI_TIME_IN_DAYLIGHT 0x2
269#define EFI_UNSPECIFIED_TIMEZONE 0x07ff
270
271struct efi_time {
272 u16 year;
273 u8 month;
274 u8 day;
275 u8 hour;
276 u8 minute;
277 u8 second;
278 u8 pad1;
279 u32 nanosecond;
280 s16 timezone;
281 u8 daylight;
282 u8 pad2;
283};
284
285struct efi_time_cap {
286 u32 resolution;
287 u32 accuracy;
288 u8 sets_to_zero;
289};
290
291enum efi_locate_search_type {
292 ALL_HANDLES,
293 BY_REGISTER_NOTIFY,
294 BY_PROTOCOL
295};
296
297struct efi_open_protocol_info_entry {
298 efi_handle_t agent_handle;
299 efi_handle_t controller_handle;
300 u32 attributes;
301 u32 open_count;
302};
303
304enum efi_entry_t {
305 EFIET_END,
306 EFIET_MEMORY_MAP,
307 EFIET_GOP_MODE,
308 EFIET_SYS_TABLE,
309
310
311 EFIET_MEMORY_COUNT,
312};
313
314#define EFI_TABLE_VERSION 1
315
316
317
318
319
320
321
322
323
324struct efi_info_hdr {
325 u32 version;
326 u32 hdr_size;
327 u32 total_size;
328 u32 spare[5];
329};
330
331
332
333
334
335
336
337
338
339
340
341struct efi_entry_hdr {
342 u32 type;
343 u32 size;
344 u64 addr;
345 u32 link;
346 u32 spare1;
347 u64 spare2;
348};
349
350
351
352
353
354
355
356
357
358struct efi_entry_memmap {
359 u32 version;
360 u32 desc_size;
361 u64 spare;
362 struct efi_mem_desc desc[];
363};
364
365
366
367
368
369
370
371
372
373struct efi_entry_gopmode {
374 efi_physical_addr_t fb_base;
375
376
377
378
379
380
381
382 u64 fb_size;
383 u64 info_size;
384
385
386
387
388
389 struct {
390 u32 version;
391 u32 width;
392 u32 height;
393 u32 pixel_format;
394 u32 pixel_bitmask[4];
395 u32 pixels_per_scanline;
396 } info[];
397};
398
399
400
401
402
403
404struct efi_entry_systable {
405 efi_physical_addr_t sys_table;
406};
407
408static inline struct efi_mem_desc *efi_get_next_mem_desc(
409 struct efi_mem_desc *desc, int desc_size)
410{
411 return (struct efi_mem_desc *)((ulong)desc + desc_size);
412}
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439struct efi_priv {
440 efi_handle_t parent_image;
441 struct efi_system_table *sys_table;
442 struct efi_boot_services *boot;
443 struct efi_runtime_services *run;
444 efi_uintn_t memmap_key;
445 struct efi_mem_desc *memmap_desc;
446 efi_uintn_t memmap_alloc;
447 efi_uintn_t memmap_size;
448 efi_uintn_t memmap_desc_size;
449 u32 memmap_version;
450
451
452 bool use_pool_for_malloc;
453 unsigned long ram_base;
454 unsigned int image_data_type;
455
456
457 struct efi_info_hdr *info;
458 unsigned int info_size;
459 void *next_hdr;
460};
461
462
463
464
465
466
467
468
469struct efi_media_plat {
470 efi_handle_t handle;
471 struct efi_block_io *blkio;
472 struct efi_device_path *device_path;
473};
474
475
476extern char image_base[];
477
478
479extern char _binary_u_boot_bin_start[], _binary_u_boot_bin_end[];
480
481
482
483
484#define EFI_VARIABLE_NON_VOLATILE 0x0000000000000001
485#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002
486#define EFI_VARIABLE_RUNTIME_ACCESS 0x0000000000000004
487#define EFI_VARIABLE_HARDWARE_ERROR_RECORD 0x0000000000000008
488#define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x0000000000000010
489#define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x0000000000000020
490#define EFI_VARIABLE_APPEND_WRITE 0x0000000000000040
491
492#define EFI_VARIABLE_MASK (EFI_VARIABLE_NON_VOLATILE | \
493 EFI_VARIABLE_BOOTSERVICE_ACCESS | \
494 EFI_VARIABLE_RUNTIME_ACCESS | \
495 EFI_VARIABLE_HARDWARE_ERROR_RECORD | \
496 EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | \
497 EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS | \
498 EFI_VARIABLE_APPEND_WRITE)
499
500
501
502
503
504
505
506
507
508
509struct efi_priv *efi_get_priv(void);
510
511
512
513
514
515
516
517
518
519void efi_set_priv(struct efi_priv *priv);
520
521
522
523
524
525
526struct efi_system_table *efi_get_sys_table(void);
527
528
529
530
531
532
533struct efi_boot_services *efi_get_boot(void);
534
535
536
537
538
539
540
541
542unsigned long efi_get_ram_base(void);
543
544
545
546
547
548
549
550
551
552
553int efi_init(struct efi_priv *priv, const char *banner, efi_handle_t image,
554 struct efi_system_table *sys_table);
555
556
557
558
559
560
561
562
563
564void *efi_malloc(struct efi_priv *priv, int size, efi_status_t *retp);
565
566
567
568
569
570
571
572void efi_free(struct efi_priv *priv, void *ptr);
573
574
575
576
577
578
579
580void efi_puts(struct efi_priv *priv, const char *str);
581
582
583
584
585
586
587
588void efi_putc(struct efi_priv *priv, const char ch);
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603int efi_info_get(enum efi_entry_t type, void **datap, int *sizep);
604
605
606
607
608
609
610
611
612
613
614int efi_store_memory_map(struct efi_priv *priv);
615
616
617
618
619
620
621
622
623int efi_call_exit_boot_services(void);
624
625
626
627
628
629
630
631
632
633
634
635
636
637int efi_get_mmap(struct efi_mem_desc **descp, int *sizep, uint *keyp,
638 int *desc_sizep, uint *versionp);
639
640#endif
641