xref: /netbsd-src/sys/external/bsd/gnu-efi/dist/inc/efiapi.h (revision 35ff39e48f27cc4d27af726cb651cda505a965b4)
1 /*	$NetBSD: efiapi.h,v 1.4 2021/09/30 19:02:47 jmcneill Exp $	*/
2 
3 #ifndef _EFI_API_H
4 #define _EFI_API_H
5 
6 /*++
7 
8 Copyright (c) 1998  Intel Corporation
9 
10 Module Name:
11 
12     efiapi.h
13 
14 Abstract:
15 
16     Global EFI runtime & boot service interfaces
17 
18 
19 
20 
21 Revision History
22 
23 --*/
24 
25 //
26 // EFI Specification Revision
27 //
28 
29 #define EFI_SPECIFICATION_MAJOR_REVISION 1
30 #define EFI_SPECIFICATION_MINOR_REVISION 02
31 
32 //
33 // Declare forward referenced data structures
34 //
35 
36 INTERFACE_DECL(_EFI_SYSTEM_TABLE);
37 
38 //
39 // EFI Memory
40 //
41 
42 typedef
43 EFI_STATUS
44 (EFIAPI *EFI_ALLOCATE_PAGES) (
45     IN EFI_ALLOCATE_TYPE            Type,
46     IN EFI_MEMORY_TYPE              MemoryType,
47     IN UINTN                        NoPages,
48     OUT EFI_PHYSICAL_ADDRESS        *Memory
49     );
50 
51 typedef
52 EFI_STATUS
53 (EFIAPI *EFI_FREE_PAGES) (
54     IN EFI_PHYSICAL_ADDRESS         Memory,
55     IN UINTN                        NoPages
56     );
57 
58 typedef
59 EFI_STATUS
60 (EFIAPI *EFI_GET_MEMORY_MAP) (
61     IN OUT UINTN                    *MemoryMapSize,
62     IN OUT EFI_MEMORY_DESCRIPTOR    *MemoryMap,
63     OUT UINTN                       *MapKey,
64     OUT UINTN                       *DescriptorSize,
65     OUT UINT32                      *DescriptorVersion
66     );
67 
68 #define NextMemoryDescriptor(Ptr,Size)  ((EFI_MEMORY_DESCRIPTOR *) (((UINT8 *) Ptr) + Size))
69 
70 
71 typedef
72 EFI_STATUS
73 (EFIAPI *EFI_ALLOCATE_POOL) (
74     IN EFI_MEMORY_TYPE              PoolType,
75     IN UINTN                        Size,
76     OUT VOID                        **Buffer
77     );
78 
79 typedef
80 EFI_STATUS
81 (EFIAPI *EFI_FREE_POOL) (
82     IN VOID                         *Buffer
83     );
84 
85 typedef
86 EFI_STATUS
87 (EFIAPI *EFI_SET_VIRTUAL_ADDRESS_MAP) (
88     IN UINTN                        MemoryMapSize,
89     IN UINTN                        DescriptorSize,
90     IN UINT32                       DescriptorVersion,
91     IN EFI_MEMORY_DESCRIPTOR        *VirtualMap
92     );
93 
94 
95 #define EFI_OPTIONAL_PTR            0x00000001
96 #define EFI_INTERNAL_FNC            0x00000002      // Pointer to internal runtime fnc
97 #define EFI_INTERNAL_PTR            0x00000004      // Pointer to internal runtime data
98 
99 
100 typedef
101 EFI_STATUS
102 (EFIAPI *EFI_CONVERT_POINTER) (
103     IN UINTN                        DebugDisposition,
104     IN OUT VOID                     **Address
105     );
106 
107 
108 //
109 // EFI Events
110 //
111 
112 #define EVT_TIMER                           0x80000000
113 #define EVT_RUNTIME                         0x40000000
114 #define EVT_RUNTIME_CONTEXT                 0x20000000
115 
116 #define EVT_NOTIFY_WAIT                     0x00000100
117 #define EVT_NOTIFY_SIGNAL                   0x00000200
118 
119 #define EVT_SIGNAL_EXIT_BOOT_SERVICES       0x00000201
120 #define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE   0x60000202
121 
122 #define EVT_EFI_SIGNAL_MASK                 0x000000FF
123 #define EVT_EFI_SIGNAL_MAX                  4
124 
125 #define EFI_EVENT_TIMER                         EVT_TIMER
126 #define EFI_EVENT_RUNTIME                       EVT_RUNTIME
127 #define EFI_EVENT_RUNTIME_CONTEXT               EVT_RUNTIME_CONTEXT
128 #define EFI_EVENT_NOTIFY_WAIT                   EVT_NOTIFY_WAIT
129 #define EFI_EVENT_NOTIFY_SIGNAL                 EVT_NOTIFY_SIGNAL
130 #define EFI_EVENT_SIGNAL_EXIT_BOOT_SERVICES     EVT_SIGNAL_EXIT_BOOT_SERVICES
131 #define EFI_EVENT_SIGNAL_VIRTUAL_ADDRESS_CHANGE EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE
132 #define EFI_EVENT_EFI_SIGNAL_MASK               EVT_EFI_SIGNAL_MASK
133 #define EFI_EVENT_EFI_SIGNAL_MAX                EVT_EFI_SIGNAL_MAX
134 
135 
136 typedef
137 VOID
138 (EFIAPI *EFI_EVENT_NOTIFY) (
139     IN EFI_EVENT                Event,
140     IN VOID                     *Context
141     );
142 
143 typedef
144 EFI_STATUS
145 (EFIAPI *EFI_CREATE_EVENT) (
146     IN UINT32                       Type,
147     IN EFI_TPL                      NotifyTpl,
148     IN EFI_EVENT_NOTIFY             NotifyFunction,
149     IN VOID                         *NotifyContext,
150     OUT EFI_EVENT                   *Event
151     );
152 
153 typedef enum {
154     TimerCancel,
155     TimerPeriodic,
156     TimerRelative,
157     TimerTypeMax
158 } EFI_TIMER_DELAY;
159 
160 typedef
161 EFI_STATUS
162 (EFIAPI *EFI_SET_TIMER) (
163     IN EFI_EVENT                Event,
164     IN EFI_TIMER_DELAY          Type,
165     IN UINT64                   TriggerTime
166     );
167 
168 typedef
169 EFI_STATUS
170 (EFIAPI *EFI_SIGNAL_EVENT) (
171     IN EFI_EVENT                Event
172     );
173 
174 typedef
175 EFI_STATUS
176 (EFIAPI *EFI_WAIT_FOR_EVENT) (
177     IN UINTN                    NumberOfEvents,
178     IN EFI_EVENT                *Event,
179     OUT UINTN                   *Index
180     );
181 
182 typedef
183 EFI_STATUS
184 (EFIAPI *EFI_CLOSE_EVENT) (
185     IN EFI_EVENT                Event
186     );
187 
188 typedef
189 EFI_STATUS
190 (EFIAPI *EFI_CHECK_EVENT) (
191     IN EFI_EVENT                Event
192     );
193 
194 //
195 // Task priority level
196 //
197 
198 #define TPL_APPLICATION       4
199 #define TPL_CALLBACK          8
200 #define TPL_NOTIFY           16
201 #define TPL_HIGH_LEVEL       31
202 #define EFI_TPL_APPLICATION  TPL_APPLICATION
203 #define EFI_TPL_CALLBACK     TPL_CALLBACK
204 #define EFI_TPL_NOTIFY       TPL_NOTIFY
205 #define EFI_TPL_HIGH_LEVEL   TPL_HIGH_LEVEL
206 typedef
207 EFI_TPL
208 (EFIAPI *EFI_RAISE_TPL) (
209     IN EFI_TPL      NewTpl
210     );
211 
212 typedef
213 VOID
214 (EFIAPI *EFI_RESTORE_TPL) (
215     IN EFI_TPL      OldTpl
216     );
217 
218 
219 //
220 // EFI platform varibles
221 //
222 
223 #define EFI_GLOBAL_VARIABLE     \
224     { 0x8BE4DF61, 0x93CA, 0x11d2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C} }
225 
226 // Variable attributes
227 #define EFI_VARIABLE_NON_VOLATILE                          0x00000001
228 #define EFI_VARIABLE_BOOTSERVICE_ACCESS                    0x00000002
229 #define EFI_VARIABLE_RUNTIME_ACCESS                        0x00000004
230 #define EFI_VARIABLE_HARDWARE_ERROR_RECORD                 0x00000008
231 #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS            0x00000010
232 #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x00000020
233 #define EFI_VARIABLE_APPEND_WRITE                          0x00000040
234 
235 // Variable size limitation
236 #define EFI_MAXIMUM_VARIABLE_SIZE           1024
237 
238 typedef
239 EFI_STATUS
240 (EFIAPI *EFI_GET_VARIABLE) (
241     IN CHAR16                       *VariableName,
242     IN EFI_GUID                     *VendorGuid,
243     OUT UINT32                      *Attributes OPTIONAL,
244     IN OUT UINTN                    *DataSize,
245     OUT VOID                        *Data
246     );
247 
248 typedef
249 EFI_STATUS
250 (EFIAPI *EFI_GET_NEXT_VARIABLE_NAME) (
251     IN OUT UINTN                    *VariableNameSize,
252     IN OUT CHAR16                   *VariableName,
253     IN OUT EFI_GUID                 *VendorGuid
254     );
255 
256 
257 typedef
258 EFI_STATUS
259 (EFIAPI *EFI_SET_VARIABLE) (
260     IN CHAR16                       *VariableName,
261     IN EFI_GUID                     *VendorGuid,
262     IN UINT32                       Attributes,
263     IN UINTN                        DataSize,
264     IN VOID                         *Data
265     );
266 
267 
268 //
269 // EFI Time
270 //
271 
272 typedef struct {
273         UINT32                      Resolution;     // 1e-6 parts per million
274         UINT32                      Accuracy;       // hertz
275         BOOLEAN                     SetsToZero;     // Set clears sub-second time
276 } EFI_TIME_CAPABILITIES;
277 
278 
279 typedef
280 EFI_STATUS
281 (EFIAPI *EFI_GET_TIME) (
282     OUT EFI_TIME                    *Time,
283     OUT EFI_TIME_CAPABILITIES       *Capabilities OPTIONAL
284     );
285 
286 typedef
287 EFI_STATUS
288 (EFIAPI *EFI_SET_TIME) (
289     IN EFI_TIME                     *Time
290     );
291 
292 typedef
293 EFI_STATUS
294 (EFIAPI *EFI_GET_WAKEUP_TIME) (
295     OUT BOOLEAN                     *Enabled,
296     OUT BOOLEAN                     *Pending,
297     OUT EFI_TIME                    *Time
298     );
299 
300 typedef
301 EFI_STATUS
302 (EFIAPI *EFI_SET_WAKEUP_TIME) (
303     IN BOOLEAN                      Enable,
304     IN EFI_TIME                     *Time OPTIONAL
305     );
306 
307 
308 //
309 // Image functions
310 //
311 
312 
313 // PE32+ Subsystem type for EFI images
314 
315 #if !defined(IMAGE_SUBSYSTEM_EFI_APPLICATION)
316 #define IMAGE_SUBSYSTEM_EFI_APPLICATION             10
317 #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER     11
318 #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER          12
319 #endif
320 
321 // PE32+ Machine type for EFI images
322 
323 #if !defined(EFI_IMAGE_MACHINE_IA32)
324 #define EFI_IMAGE_MACHINE_IA32      0x014c
325 #endif
326 
327 #if !defined(EFI_IMAGE_MACHINE_IA64)
328 #define EFI_IMAGE_MACHINE_IA64      0x0200
329 #endif
330 
331 #if !defined(EFI_IMAGE_MACHINE_EBC)
332 #define EFI_IMAGE_MACHINE_EBC      0x0EBC
333 #endif
334 
335 #if !defined(EFI_IMAGE_MACHINE_X64)
336 #define EFI_IMAGE_MACHINE_X64       0x8664
337 #endif
338 
339 #if !defined(EFI_IMAGE_MACHINE_ARMTHUMB_MIXED)
340 #define EFI_IMAGE_MACHINE_ARMTHUMB_MIXED 0x01C2
341 #endif
342 
343 #if !defined(EFI_IMAGE_MACHINE_AARCH64)
344 #define EFI_IMAGE_MACHINE_AARCH64   0xAA64
345 #endif
346 
347 #if !defined(EFI_IMAGE_MACHINE_RISCV32)
348 #define EFI_IMAGE_MACHINE_RISCV32   0x5032
349 #endif
350 
351 #if !defined(EFI_IMAGE_MACHINE_RISCV64)
352 #define EFI_IMAGE_MACHINE_RISCV64   0x5064
353 #endif
354 
355 #if !defined(EFI_IMAGE_MACHINE_RISCV128)
356 #define EFI_IMAGE_MACHINE_RISCV128  0x5128
357 #endif
358 
359 // Image Entry prototype
360 
361 typedef
362 EFI_STATUS
363 (EFIAPI *EFI_IMAGE_ENTRY_POINT) (
364     IN EFI_HANDLE                   ImageHandle,
365     IN struct _EFI_SYSTEM_TABLE     *SystemTable
366     );
367 
368 typedef
369 EFI_STATUS
370 (EFIAPI *EFI_IMAGE_LOAD) (
371     IN BOOLEAN                      BootPolicy,
372     IN EFI_HANDLE                   ParentImageHandle,
373     IN EFI_DEVICE_PATH              *FilePath,
374     IN VOID                         *SourceBuffer   OPTIONAL,
375     IN UINTN                        SourceSize,
376     OUT EFI_HANDLE                  *ImageHandle
377     );
378 
379 typedef
380 EFI_STATUS
381 (EFIAPI *EFI_IMAGE_START) (
382     IN EFI_HANDLE                   ImageHandle,
383     OUT UINTN                       *ExitDataSize,
384     OUT CHAR16                      **ExitData  OPTIONAL
385     );
386 
387 typedef
388 EFI_STATUS
389 (EFIAPI *EFI_EXIT) (
390     IN EFI_HANDLE                   ImageHandle,
391     IN EFI_STATUS                   ExitStatus,
392     IN UINTN                        ExitDataSize,
393     IN CHAR16                       *ExitData OPTIONAL
394     );
395 
396 
397 // Image handle
398 /*#define LOADED_IMAGE_PROTOCOL      \
399     { 0x5B1B31A1, 0x9562, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} }
400 
401 #define EFI_IMAGE_INFORMATION_REVISION      0x1000
402 typedef struct {
403     UINT32                          Revision;
404     EFI_HANDLE                      ParentHandle;
405     struct _EFI_SYSTEM_TABLE        *SystemTable;
406 
407     // Source location of image
408     EFI_HANDLE                      DeviceHandle;
409     EFI_DEVICE_PATH                 *FilePath;
410     VOID                            *Reserved;
411 
412     // Images load options
413     UINT32                          LoadOptionsSize;
414     VOID                            *LoadOptions;
415 
416     // Location of where image was loaded
417     VOID                            *ImageBase;
418     UINT64                          ImageSize;
419     EFI_MEMORY_TYPE                 ImageCodeType;
420     EFI_MEMORY_TYPE                 ImageDataType;
421 
422     // If the driver image supports a dynamic unload request
423     EFI_IMAGE_UNLOAD                Unload;
424 
425 } EFI_LOADED_IMAGE;*/
426 
427 
428 typedef
429 EFI_STATUS
430 (EFIAPI *EFI_EXIT_BOOT_SERVICES) (
431     IN EFI_HANDLE                   ImageHandle,
432     IN UINTN                        MapKey
433     );
434 
435 //
436 // Misc
437 //
438 
439 
440 typedef
441 EFI_STATUS
442 (EFIAPI *EFI_STALL) (
443     IN UINTN                    Microseconds
444     );
445 
446 typedef
447 EFI_STATUS
448 (EFIAPI *EFI_SET_WATCHDOG_TIMER) (
449     IN UINTN                    Timeout,
450     IN UINT64                   WatchdogCode,
451     IN UINTN                    DataSize,
452     IN CHAR16                   *WatchdogData OPTIONAL
453     );
454 
455 typedef
456 EFI_STATUS
457 (EFIAPI *EFI_CONNECT_CONTROLLER) (
458     IN EFI_HANDLE               ControllerHandle,
459     IN EFI_HANDLE               *DriverImageHandle OPTIONAL,
460     IN EFI_DEVICE_PATH          *RemainingDevicePath OPTIONAL,
461     IN BOOLEAN                  Recursive
462     );
463 
464 typedef
465 EFI_STATUS
466 (EFIAPI *EFI_DISCONNECT_CONTROLLER) (
467     IN EFI_HANDLE               ControllerHandle,
468     IN EFI_HANDLE               DriverImageHandle OPTIONAL,
469     IN EFI_HANDLE               ChildHandle OPTIONAL
470     );
471 
472 #define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL  0x00000001
473 #define EFI_OPEN_PROTOCOL_GET_PROTOCOL        0x00000002
474 #define EFI_OPEN_PROTOCOL_TEST_PROTOCOL       0x00000004
475 #define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
476 #define EFI_OPEN_PROTOCOL_BY_DRIVER           0x00000010
477 #define EFI_OPEN_PROTOCOL_EXCLUSIVE           0x00000020
478 
479 typedef
480 EFI_STATUS
481 (EFIAPI *EFI_OPEN_PROTOCOL) (
482     IN EFI_HANDLE               Handle,
483     IN EFI_GUID                 *Protocol,
484     OUT VOID                    **Interface OPTIONAL,
485     IN EFI_HANDLE               AgentHandle,
486     IN EFI_HANDLE               ControllerHandle,
487     IN UINT32                   Attributes
488     );
489 
490 typedef
491 EFI_STATUS
492 (EFIAPI *EFI_CLOSE_PROTOCOL) (
493     IN EFI_HANDLE               Handle,
494     IN EFI_GUID                 *Protocol,
495     IN EFI_HANDLE               AgentHandle,
496     IN EFI_HANDLE               ControllerHandle
497     );
498 
499 typedef struct {
500     EFI_HANDLE                  AgentHandle;
501     EFI_HANDLE                  ControllerHandle;
502     UINT32                      Attributes;
503     UINT32                      OpenCount;
504 } EFI_OPEN_PROTOCOL_INFORMATION_ENTRY;
505 
506 typedef
507 EFI_STATUS
508 (EFIAPI *EFI_OPEN_PROTOCOL_INFORMATION) (
509     IN EFI_HANDLE               Handle,
510     IN EFI_GUID                 *Protocol,
511     OUT EFI_OPEN_PROTOCOL_INFORMATION_ENTRY **EntryBuffer,
512     OUT UINTN                   *EntryCount
513     );
514 
515 typedef
516 EFI_STATUS
517 (EFIAPI *EFI_PROTOCOLS_PER_HANDLE) (
518     IN EFI_HANDLE               Handle,
519     OUT EFI_GUID                ***ProtocolBuffer,
520     OUT UINTN                   *ProtocolBufferCount
521     );
522 
523 typedef enum {
524     AllHandles,
525     ByRegisterNotify,
526     ByProtocol
527 } EFI_LOCATE_SEARCH_TYPE;
528 
529 typedef
530 EFI_STATUS
531 (EFIAPI *EFI_LOCATE_HANDLE_BUFFER) (
532     IN EFI_LOCATE_SEARCH_TYPE   SearchType,
533     IN EFI_GUID                 *Protocol OPTIONAL,
534     IN VOID                     *SearchKey OPTIONAL,
535     IN OUT UINTN                *NoHandles,
536     OUT EFI_HANDLE              **Buffer
537     );
538 
539 typedef
540 EFI_STATUS
541 (EFIAPI *EFI_LOCATE_PROTOCOL) (
542     IN EFI_GUID                 *Protocol,
543     IN VOID                     *Registration OPTIONAL,
544     OUT VOID                    **Interface
545     );
546 
547 typedef
548 EFI_STATUS
549 (EFIAPI *EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
550     IN OUT EFI_HANDLE           *Handle,
551     ...
552     );
553 
554 typedef
555 EFI_STATUS
556 (EFIAPI *EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
557     IN OUT EFI_HANDLE           Handle,
558     ...
559     );
560 
561 typedef
562 EFI_STATUS
563 (EFIAPI *EFI_CALCULATE_CRC32) (
564     IN VOID                     *Data,
565     IN UINTN                    DataSize,
566     OUT UINT32                  *Crc32
567     );
568 
569 typedef
570 VOID
571 (EFIAPI *EFI_COPY_MEM) (
572     IN VOID                     *Destination,
573     IN VOID                     *Source,
574     IN UINTN                    Length
575     );
576 
577 typedef
578 VOID
579 (EFIAPI *EFI_SET_MEM) (
580     IN VOID                     *Buffer,
581     IN UINTN                    Size,
582     IN UINT8                    Value
583     );
584 
585 
586 typedef
587 EFI_STATUS
588 (EFIAPI *EFI_CREATE_EVENT_EX) (
589     IN UINT32                   Type,
590     IN EFI_TPL                  NotifyTpl,
591     IN EFI_EVENT_NOTIFY         NotifyFunction OPTIONAL,
592     IN const VOID               *NotifyContext OPTIONAL,
593     IN const EFI_GUID           *EventGroup OPTIONAL,
594     OUT EFI_EVENT               *Event
595     );
596 
597 typedef enum {
598     EfiResetCold,
599     EfiResetWarm,
600     EfiResetShutdown
601 } EFI_RESET_TYPE;
602 
603 typedef
604 EFI_STATUS
605 (EFIAPI *EFI_RESET_SYSTEM) (
606     IN EFI_RESET_TYPE           ResetType,
607     IN EFI_STATUS               ResetStatus,
608     IN UINTN                    DataSize,
609     IN CHAR16                   *ResetData OPTIONAL
610     );
611 
612 typedef
613 EFI_STATUS
614 (EFIAPI *EFI_GET_NEXT_MONOTONIC_COUNT) (
615     OUT UINT64                  *Count
616     );
617 
618 typedef
619 EFI_STATUS
620 (EFIAPI *EFI_GET_NEXT_HIGH_MONO_COUNT) (
621     OUT UINT32                  *HighCount
622     );
623 
624 typedef struct {
625     UINT64                      Length;
626     union {
627         EFI_PHYSICAL_ADDRESS    DataBlock;
628        EFI_PHYSICAL_ADDRESS    ContinuationPointer;
629     } Union;
630 } EFI_CAPSULE_BLOCK_DESCRIPTOR;
631 
632 typedef struct {
633     EFI_GUID                    CapsuleGuid;
634     UINT32                      HeaderSize;
635     UINT32                      Flags;
636     UINT32                      CapsuleImageSize;
637 } EFI_CAPSULE_HEADER;
638 
639 #define CAPSULE_FLAGS_PERSIST_ACROSS_RESET    0x00010000
640 #define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE   0x00020000
641 #define CAPSULE_FLAGS_INITIATE_RESET          0x00040000
642 
643 typedef
644 EFI_STATUS
645 (EFIAPI *EFI_UPDATE_CAPSULE) (
646     IN EFI_CAPSULE_HEADER       **CapsuleHeaderArray,
647     IN UINTN                    CapsuleCount,
648     IN EFI_PHYSICAL_ADDRESS     ScatterGatherList OPTIONAL
649     );
650 
651 typedef
652 EFI_STATUS
653 (EFIAPI *EFI_QUERY_CAPSULE_CAPABILITIES) (
654     IN  EFI_CAPSULE_HEADER       **CapsuleHeaderArray,
655     IN  UINTN                    CapsuleCount,
656     OUT UINT64                   *MaximumCapsuleSize,
657     OUT EFI_RESET_TYPE           *ResetType
658     );
659 
660 typedef
661 EFI_STATUS
662 (EFIAPI *EFI_QUERY_VARIABLE_INFO) (
663     IN  UINT32                  Attributes,
664     OUT UINT64                  *MaximumVariableStorageSize,
665     OUT UINT64                  *RemainingVariableStorageSize,
666     OUT UINT64                  *MaximumVariableSize
667     );
668 
669 //
670 // Protocol handler functions
671 //
672 
673 typedef enum {
674     EFI_NATIVE_INTERFACE,
675     EFI_PCODE_INTERFACE
676 } EFI_INTERFACE_TYPE;
677 
678 typedef
679 EFI_STATUS
680 (EFIAPI *EFI_INSTALL_PROTOCOL_INTERFACE) (
681     IN OUT EFI_HANDLE           *Handle,
682     IN EFI_GUID                 *Protocol,
683     IN EFI_INTERFACE_TYPE       InterfaceType,
684     IN VOID                     *Interface
685     );
686 
687 typedef
688 EFI_STATUS
689 (EFIAPI *EFI_REINSTALL_PROTOCOL_INTERFACE) (
690     IN EFI_HANDLE               Handle,
691     IN EFI_GUID                 *Protocol,
692     IN VOID                     *OldInterface,
693     IN VOID                     *NewInterface
694     );
695 
696 typedef
697 EFI_STATUS
698 (EFIAPI *EFI_UNINSTALL_PROTOCOL_INTERFACE) (
699     IN EFI_HANDLE               Handle,
700     IN EFI_GUID                 *Protocol,
701     IN VOID                     *Interface
702     );
703 
704 typedef
705 EFI_STATUS
706 (EFIAPI *EFI_HANDLE_PROTOCOL) (
707     IN EFI_HANDLE               Handle,
708     IN EFI_GUID                 *Protocol,
709     OUT VOID                    **Interface
710     );
711 
712 typedef
713 EFI_STATUS
714 (EFIAPI *EFI_REGISTER_PROTOCOL_NOTIFY) (
715     IN EFI_GUID                 *Protocol,
716     IN EFI_EVENT                Event,
717     OUT VOID                    **Registration
718     );
719 
720 typedef
721 EFI_STATUS
722 (EFIAPI *EFI_LOCATE_HANDLE) (
723     IN EFI_LOCATE_SEARCH_TYPE   SearchType,
724     IN EFI_GUID                 *Protocol OPTIONAL,
725     IN VOID                     *SearchKey OPTIONAL,
726     IN OUT UINTN                *BufferSize,
727     OUT EFI_HANDLE              *Buffer
728     );
729 
730 typedef
731 EFI_STATUS
732 (EFIAPI *EFI_LOCATE_DEVICE_PATH) (
733     IN EFI_GUID                 *Protocol,
734     IN OUT EFI_DEVICE_PATH      **DevicePath,
735     OUT EFI_HANDLE              *Device
736     );
737 
738 typedef
739 EFI_STATUS
740 (EFIAPI *EFI_INSTALL_CONFIGURATION_TABLE) (
741     IN EFI_GUID                 *Guid,
742     IN VOID                     *Table
743     );
744 
745 typedef
746 EFI_STATUS
747 (EFIAPI *EFI_RESERVED_SERVICE) (
748     );
749 
750 //
751 // Standard EFI table header
752 //
753 
754 typedef struct _EFI_TABLE_HEADER {
755     UINT64                      Signature;
756     UINT32                      Revision;
757     UINT32                      HeaderSize;
758     UINT32                      CRC32;
759     UINT32                      Reserved;
760 } EFI_TABLE_HEADER;
761 
762 
763 //
764 // EFI Runtime Serivces Table
765 //
766 
767 #define EFI_RUNTIME_SERVICES_SIGNATURE  0x56524553544e5552
768 #define EFI_RUNTIME_SERVICES_REVISION   (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
769 
770 typedef struct  {
771     EFI_TABLE_HEADER                Hdr;
772 
773     //
774     // Time services
775     //
776 
777     EFI_GET_TIME                    GetTime;
778     EFI_SET_TIME                    SetTime;
779     EFI_GET_WAKEUP_TIME             GetWakeupTime;
780     EFI_SET_WAKEUP_TIME             SetWakeupTime;
781 
782     //
783     // Virtual memory services
784     //
785 
786     EFI_SET_VIRTUAL_ADDRESS_MAP     SetVirtualAddressMap;
787     EFI_CONVERT_POINTER             ConvertPointer;
788 
789     //
790     // Variable serviers
791     //
792 
793     EFI_GET_VARIABLE                GetVariable;
794     EFI_GET_NEXT_VARIABLE_NAME      GetNextVariableName;
795     EFI_SET_VARIABLE                SetVariable;
796 
797     //
798     // Misc
799     //
800 
801     EFI_GET_NEXT_HIGH_MONO_COUNT    GetNextHighMonotonicCount;
802     EFI_RESET_SYSTEM                ResetSystem;
803 
804     EFI_UPDATE_CAPSULE              UpdateCapsule;
805     EFI_QUERY_CAPSULE_CAPABILITIES  QueryCapsuleCapabilities;
806     EFI_QUERY_VARIABLE_INFO         QueryVariableInfo;
807 } EFI_RUNTIME_SERVICES;
808 
809 
810 //
811 // EFI Boot Services Table
812 //
813 
814 #define EFI_BOOT_SERVICES_SIGNATURE     0x56524553544f4f42
815 #define EFI_BOOT_SERVICES_REVISION      (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
816 
817 typedef struct _EFI_BOOT_SERVICES {
818 
819     EFI_TABLE_HEADER                Hdr;
820 
821     //
822     // Task priority functions
823     //
824 
825     EFI_RAISE_TPL                   RaiseTPL;
826     EFI_RESTORE_TPL                 RestoreTPL;
827 
828     //
829     // Memory functions
830     //
831 
832     EFI_ALLOCATE_PAGES              AllocatePages;
833     EFI_FREE_PAGES                  FreePages;
834     EFI_GET_MEMORY_MAP              GetMemoryMap;
835     EFI_ALLOCATE_POOL               AllocatePool;
836     EFI_FREE_POOL                   FreePool;
837 
838     //
839     // Event & timer functions
840     //
841 
842     EFI_CREATE_EVENT                CreateEvent;
843     EFI_SET_TIMER                   SetTimer;
844     EFI_WAIT_FOR_EVENT              WaitForEvent;
845     EFI_SIGNAL_EVENT                SignalEvent;
846     EFI_CLOSE_EVENT                 CloseEvent;
847     EFI_CHECK_EVENT                 CheckEvent;
848 
849     //
850     // Protocol handler functions
851     //
852 
853     EFI_INSTALL_PROTOCOL_INTERFACE  InstallProtocolInterface;
854     EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface;
855     EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface;
856     EFI_HANDLE_PROTOCOL             HandleProtocol;
857     EFI_HANDLE_PROTOCOL             PCHandleProtocol;
858     EFI_REGISTER_PROTOCOL_NOTIFY    RegisterProtocolNotify;
859     EFI_LOCATE_HANDLE               LocateHandle;
860     EFI_LOCATE_DEVICE_PATH          LocateDevicePath;
861     EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable;
862 
863     //
864     // Image functions
865     //
866 
867     EFI_IMAGE_LOAD                  LoadImage;
868     EFI_IMAGE_START                 StartImage;
869     EFI_EXIT                        Exit;
870     EFI_IMAGE_UNLOAD                UnloadImage;
871     EFI_EXIT_BOOT_SERVICES          ExitBootServices;
872 
873     //
874     // Misc functions
875     //
876 
877     EFI_GET_NEXT_MONOTONIC_COUNT    GetNextMonotonicCount;
878     EFI_STALL                       Stall;
879     EFI_SET_WATCHDOG_TIMER          SetWatchdogTimer;
880 
881     //
882     // DriverSupport Services
883     //
884 
885     EFI_CONNECT_CONTROLLER          ConnectController;
886     EFI_DISCONNECT_CONTROLLER       DisconnectController;
887 
888     //
889     // Open and Close Protocol Services
890     //
891     EFI_OPEN_PROTOCOL               OpenProtocol;
892     EFI_CLOSE_PROTOCOL              CloseProtocol;
893     EFI_OPEN_PROTOCOL_INFORMATION   OpenProtocolInformation;
894 
895     //
896     // Library Services
897     //
898     EFI_PROTOCOLS_PER_HANDLE        ProtocolsPerHandle;
899     EFI_LOCATE_HANDLE_BUFFER        LocateHandleBuffer;
900     EFI_LOCATE_PROTOCOL             LocateProtocol;
901     EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces;
902     EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces;
903 
904     //
905     // 32-bit CRC Services
906     //
907     EFI_CALCULATE_CRC32             CalculateCrc32;
908 
909     //
910     // Misc Services
911     //
912     EFI_COPY_MEM                    CopyMem;
913     EFI_SET_MEM                     SetMem;
914     EFI_CREATE_EVENT_EX             CreateEventEx;
915 } EFI_BOOT_SERVICES;
916 
917 
918 //
919 // EFI Configuration Table and GUID definitions
920 //
921 
922 #define MPS_TABLE_GUID    \
923     { 0xeb9d2d2f, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
924 
925 #define ACPI_TABLE_GUID    \
926     { 0xeb9d2d30, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
927 
928 #define ACPI_20_TABLE_GUID  \
929     { 0x8868e871, 0xe4f1, 0x11d3, {0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} }
930 
931 #define SMBIOS_TABLE_GUID    \
932     { 0xeb9d2d31, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
933 
934 #define SMBIOS3_TABLE_GUID    \
935     { 0xf2fd1544, 0x9794, 0x4a2c, {0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94} }
936 
937 #define SAL_SYSTEM_TABLE_GUID    \
938     { 0xeb9d2d32, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
939 
940 /* DIG64 Headless Console & Debug Port Table. */
941 #define	HCDP_TABLE_GUID    \
942     { 0xf951938d, 0x620b, 0x42ef, {0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98} }
943 
944 #define EFI_DTB_TABLE_GUID \
945     { 0xb1b621d5, 0xf19c, 0x41a5, {0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0} }
946 
947 typedef struct _EFI_CONFIGURATION_TABLE {
948     EFI_GUID                VendorGuid;
949     VOID                    *VendorTable;
950 } EFI_CONFIGURATION_TABLE;
951 
952 
953 //
954 // EFI System Table
955 //
956 
957 
958 
959 
960 #define EFI_SYSTEM_TABLE_SIGNATURE      0x5453595320494249
961 #define EFI_SYSTEM_TABLE_REVISION      (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
962 
963 typedef struct _EFI_SYSTEM_TABLE {
964     EFI_TABLE_HEADER                Hdr;
965 
966     CHAR16                          *FirmwareVendor;
967     UINT32                          FirmwareRevision;
968 
969     EFI_HANDLE                      ConsoleInHandle;
970     SIMPLE_INPUT_INTERFACE          *ConIn;
971 
972     EFI_HANDLE                      ConsoleOutHandle;
973     SIMPLE_TEXT_OUTPUT_INTERFACE    *ConOut;
974 
975     EFI_HANDLE                      StandardErrorHandle;
976     SIMPLE_TEXT_OUTPUT_INTERFACE    *StdErr;
977 
978     EFI_RUNTIME_SERVICES            *RuntimeServices;
979     EFI_BOOT_SERVICES               *BootServices;
980 
981     UINTN                           NumberOfTableEntries;
982     EFI_CONFIGURATION_TABLE         *ConfigurationTable;
983 
984 } EFI_SYSTEM_TABLE;
985 
986 #endif
987 
988