xref: /netbsd-src/sys/external/bsd/gnu-efi/dist/inc/efiapi.h (revision 82d56013d7b633d116a93943de88e08335357a7c)
1 /*	$NetBSD: efiapi.h,v 1.3 2018/08/16 18:22:05 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 // Image Entry prototype
348 
349 typedef
350 EFI_STATUS
351 (EFIAPI *EFI_IMAGE_ENTRY_POINT) (
352     IN EFI_HANDLE                   ImageHandle,
353     IN struct _EFI_SYSTEM_TABLE     *SystemTable
354     );
355 
356 typedef
357 EFI_STATUS
358 (EFIAPI *EFI_IMAGE_LOAD) (
359     IN BOOLEAN                      BootPolicy,
360     IN EFI_HANDLE                   ParentImageHandle,
361     IN EFI_DEVICE_PATH              *FilePath,
362     IN VOID                         *SourceBuffer   OPTIONAL,
363     IN UINTN                        SourceSize,
364     OUT EFI_HANDLE                  *ImageHandle
365     );
366 
367 typedef
368 EFI_STATUS
369 (EFIAPI *EFI_IMAGE_START) (
370     IN EFI_HANDLE                   ImageHandle,
371     OUT UINTN                       *ExitDataSize,
372     OUT CHAR16                      **ExitData  OPTIONAL
373     );
374 
375 typedef
376 EFI_STATUS
377 (EFIAPI *EFI_EXIT) (
378     IN EFI_HANDLE                   ImageHandle,
379     IN EFI_STATUS                   ExitStatus,
380     IN UINTN                        ExitDataSize,
381     IN CHAR16                       *ExitData OPTIONAL
382     );
383 
384 
385 // Image handle
386 /*#define LOADED_IMAGE_PROTOCOL      \
387     { 0x5B1B31A1, 0x9562, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} }
388 
389 #define EFI_IMAGE_INFORMATION_REVISION      0x1000
390 typedef struct {
391     UINT32                          Revision;
392     EFI_HANDLE                      ParentHandle;
393     struct _EFI_SYSTEM_TABLE        *SystemTable;
394 
395     // Source location of image
396     EFI_HANDLE                      DeviceHandle;
397     EFI_DEVICE_PATH                 *FilePath;
398     VOID                            *Reserved;
399 
400     // Images load options
401     UINT32                          LoadOptionsSize;
402     VOID                            *LoadOptions;
403 
404     // Location of where image was loaded
405     VOID                            *ImageBase;
406     UINT64                          ImageSize;
407     EFI_MEMORY_TYPE                 ImageCodeType;
408     EFI_MEMORY_TYPE                 ImageDataType;
409 
410     // If the driver image supports a dynamic unload request
411     EFI_IMAGE_UNLOAD                Unload;
412 
413 } EFI_LOADED_IMAGE;*/
414 
415 
416 typedef
417 EFI_STATUS
418 (EFIAPI *EFI_EXIT_BOOT_SERVICES) (
419     IN EFI_HANDLE                   ImageHandle,
420     IN UINTN                        MapKey
421     );
422 
423 //
424 // Misc
425 //
426 
427 
428 typedef
429 EFI_STATUS
430 (EFIAPI *EFI_STALL) (
431     IN UINTN                    Microseconds
432     );
433 
434 typedef
435 EFI_STATUS
436 (EFIAPI *EFI_SET_WATCHDOG_TIMER) (
437     IN UINTN                    Timeout,
438     IN UINT64                   WatchdogCode,
439     IN UINTN                    DataSize,
440     IN CHAR16                   *WatchdogData OPTIONAL
441     );
442 
443 typedef
444 EFI_STATUS
445 (EFIAPI *EFI_CONNECT_CONTROLLER) (
446     IN EFI_HANDLE               ControllerHandle,
447     IN EFI_HANDLE               *DriverImageHandle OPTIONAL,
448     IN EFI_DEVICE_PATH          *RemainingDevicePath OPTIONAL,
449     IN BOOLEAN                  Recursive
450     );
451 
452 typedef
453 EFI_STATUS
454 (EFIAPI *EFI_DISCONNECT_CONTROLLER) (
455     IN EFI_HANDLE               ControllerHandle,
456     IN EFI_HANDLE               DriverImageHandle OPTIONAL,
457     IN EFI_HANDLE               ChildHandle OPTIONAL
458     );
459 
460 #define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL  0x00000001
461 #define EFI_OPEN_PROTOCOL_GET_PROTOCOL        0x00000002
462 #define EFI_OPEN_PROTOCOL_TEST_PROTOCOL       0x00000004
463 #define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
464 #define EFI_OPEN_PROTOCOL_BY_DRIVER           0x00000010
465 #define EFI_OPEN_PROTOCOL_EXCLUSIVE           0x00000020
466 
467 typedef
468 EFI_STATUS
469 (EFIAPI *EFI_OPEN_PROTOCOL) (
470     IN EFI_HANDLE               Handle,
471     IN EFI_GUID                 *Protocol,
472     OUT VOID                    **Interface OPTIONAL,
473     IN EFI_HANDLE               AgentHandle,
474     IN EFI_HANDLE               ControllerHandle,
475     IN UINT32                   Attributes
476     );
477 
478 typedef
479 EFI_STATUS
480 (EFIAPI *EFI_CLOSE_PROTOCOL) (
481     IN EFI_HANDLE               Handle,
482     IN EFI_GUID                 *Protocol,
483     IN EFI_HANDLE               AgentHandle,
484     IN EFI_HANDLE               ControllerHandle
485     );
486 
487 typedef struct {
488     EFI_HANDLE                  AgentHandle;
489     EFI_HANDLE                  ControllerHandle;
490     UINT32                      Attributes;
491     UINT32                      OpenCount;
492 } EFI_OPEN_PROTOCOL_INFORMATION_ENTRY;
493 
494 typedef
495 EFI_STATUS
496 (EFIAPI *EFI_OPEN_PROTOCOL_INFORMATION) (
497     IN EFI_HANDLE               Handle,
498     IN EFI_GUID                 *Protocol,
499     OUT EFI_OPEN_PROTOCOL_INFORMATION_ENTRY **EntryBuffer,
500     OUT UINTN                   *EntryCount
501     );
502 
503 typedef
504 EFI_STATUS
505 (EFIAPI *EFI_PROTOCOLS_PER_HANDLE) (
506     IN EFI_HANDLE               Handle,
507     OUT EFI_GUID                ***ProtocolBuffer,
508     OUT UINTN                   *ProtocolBufferCount
509     );
510 
511 typedef enum {
512     AllHandles,
513     ByRegisterNotify,
514     ByProtocol
515 } EFI_LOCATE_SEARCH_TYPE;
516 
517 typedef
518 EFI_STATUS
519 (EFIAPI *EFI_LOCATE_HANDLE_BUFFER) (
520     IN EFI_LOCATE_SEARCH_TYPE   SearchType,
521     IN EFI_GUID                 *Protocol OPTIONAL,
522     IN VOID                     *SearchKey OPTIONAL,
523     IN OUT UINTN                *NoHandles,
524     OUT EFI_HANDLE              **Buffer
525     );
526 
527 typedef
528 EFI_STATUS
529 (EFIAPI *EFI_LOCATE_PROTOCOL) (
530     IN EFI_GUID                 *Protocol,
531     IN VOID                     *Registration OPTIONAL,
532     OUT VOID                    **Interface
533     );
534 
535 typedef
536 EFI_STATUS
537 (EFIAPI *EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
538     IN OUT EFI_HANDLE           *Handle,
539     ...
540     );
541 
542 typedef
543 EFI_STATUS
544 (EFIAPI *EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
545     IN OUT EFI_HANDLE           Handle,
546     ...
547     );
548 
549 typedef
550 EFI_STATUS
551 (EFIAPI *EFI_CALCULATE_CRC32) (
552     IN VOID                     *Data,
553     IN UINTN                    DataSize,
554     OUT UINT32                  *Crc32
555     );
556 
557 typedef
558 VOID
559 (EFIAPI *EFI_COPY_MEM) (
560     IN VOID                     *Destination,
561     IN VOID                     *Source,
562     IN UINTN                    Length
563     );
564 
565 typedef
566 VOID
567 (EFIAPI *EFI_SET_MEM) (
568     IN VOID                     *Buffer,
569     IN UINTN                    Size,
570     IN UINT8                    Value
571     );
572 
573 
574 typedef
575 EFI_STATUS
576 (EFIAPI *EFI_CREATE_EVENT_EX) (
577     IN UINT32                   Type,
578     IN EFI_TPL                  NotifyTpl,
579     IN EFI_EVENT_NOTIFY         NotifyFunction OPTIONAL,
580     IN const VOID               *NotifyContext OPTIONAL,
581     IN const EFI_GUID           EventGroup OPTIONAL,
582     OUT EFI_EVENT               *Event
583     );
584 
585 typedef enum {
586     EfiResetCold,
587     EfiResetWarm,
588     EfiResetShutdown
589 } EFI_RESET_TYPE;
590 
591 typedef
592 EFI_STATUS
593 (EFIAPI *EFI_RESET_SYSTEM) (
594     IN EFI_RESET_TYPE           ResetType,
595     IN EFI_STATUS               ResetStatus,
596     IN UINTN                    DataSize,
597     IN CHAR16                   *ResetData OPTIONAL
598     );
599 
600 typedef
601 EFI_STATUS
602 (EFIAPI *EFI_GET_NEXT_MONOTONIC_COUNT) (
603     OUT UINT64                  *Count
604     );
605 
606 typedef
607 EFI_STATUS
608 (EFIAPI *EFI_GET_NEXT_HIGH_MONO_COUNT) (
609     OUT UINT32                  *HighCount
610     );
611 
612 typedef struct {
613     UINT64                      Length;
614     union {
615         EFI_PHYSICAL_ADDRESS    DataBlock;
616        EFI_PHYSICAL_ADDRESS    ContinuationPointer;
617     } Union;
618 } EFI_CAPSULE_BLOCK_DESCRIPTOR;
619 
620 typedef struct {
621     EFI_GUID                    CapsuleGuid;
622     UINT32                      HeaderSize;
623     UINT32                      Flags;
624     UINT32                      CapsuleImageSize;
625 } EFI_CAPSULE_HEADER;
626 
627 #define CAPSULE_FLAGS_PERSIST_ACROSS_RESET    0x00010000
628 #define CAPSULE_FLAGS_POPULATE_SYSTEM_TABLE   0x00020000
629 #define CAPSULE_FLAGS_INITIATE_RESET          0x00040000
630 
631 typedef
632 EFI_STATUS
633 (EFIAPI *EFI_UPDATE_CAPSULE) (
634     IN EFI_CAPSULE_HEADER       **CapsuleHeaderArray,
635     IN UINTN                    CapsuleCount,
636     IN EFI_PHYSICAL_ADDRESS     ScatterGatherList OPTIONAL
637     );
638 
639 typedef
640 EFI_STATUS
641 (EFIAPI *EFI_QUERY_CAPSULE_CAPABILITIES) (
642     IN  EFI_CAPSULE_HEADER       **CapsuleHeaderArray,
643     IN  UINTN                    CapsuleCount,
644     OUT UINT64                   *MaximumCapsuleSize,
645     OUT EFI_RESET_TYPE           *ResetType
646     );
647 
648 typedef
649 EFI_STATUS
650 (EFIAPI *EFI_QUERY_VARIABLE_INFO) (
651     IN  UINT32                  Attributes,
652     OUT UINT64                  *MaximumVariableStorageSize,
653     OUT UINT64                  *RemainingVariableStorageSize,
654     OUT UINT64                  *MaximumVariableSize
655     );
656 
657 //
658 // Protocol handler functions
659 //
660 
661 typedef enum {
662     EFI_NATIVE_INTERFACE,
663     EFI_PCODE_INTERFACE
664 } EFI_INTERFACE_TYPE;
665 
666 typedef
667 EFI_STATUS
668 (EFIAPI *EFI_INSTALL_PROTOCOL_INTERFACE) (
669     IN OUT EFI_HANDLE           *Handle,
670     IN EFI_GUID                 *Protocol,
671     IN EFI_INTERFACE_TYPE       InterfaceType,
672     IN VOID                     *Interface
673     );
674 
675 typedef
676 EFI_STATUS
677 (EFIAPI *EFI_REINSTALL_PROTOCOL_INTERFACE) (
678     IN EFI_HANDLE               Handle,
679     IN EFI_GUID                 *Protocol,
680     IN VOID                     *OldInterface,
681     IN VOID                     *NewInterface
682     );
683 
684 typedef
685 EFI_STATUS
686 (EFIAPI *EFI_UNINSTALL_PROTOCOL_INTERFACE) (
687     IN EFI_HANDLE               Handle,
688     IN EFI_GUID                 *Protocol,
689     IN VOID                     *Interface
690     );
691 
692 typedef
693 EFI_STATUS
694 (EFIAPI *EFI_HANDLE_PROTOCOL) (
695     IN EFI_HANDLE               Handle,
696     IN EFI_GUID                 *Protocol,
697     OUT VOID                    **Interface
698     );
699 
700 typedef
701 EFI_STATUS
702 (EFIAPI *EFI_REGISTER_PROTOCOL_NOTIFY) (
703     IN EFI_GUID                 *Protocol,
704     IN EFI_EVENT                Event,
705     OUT VOID                    **Registration
706     );
707 
708 typedef
709 EFI_STATUS
710 (EFIAPI *EFI_LOCATE_HANDLE) (
711     IN EFI_LOCATE_SEARCH_TYPE   SearchType,
712     IN EFI_GUID                 *Protocol OPTIONAL,
713     IN VOID                     *SearchKey OPTIONAL,
714     IN OUT UINTN                *BufferSize,
715     OUT EFI_HANDLE              *Buffer
716     );
717 
718 typedef
719 EFI_STATUS
720 (EFIAPI *EFI_LOCATE_DEVICE_PATH) (
721     IN EFI_GUID                 *Protocol,
722     IN OUT EFI_DEVICE_PATH      **DevicePath,
723     OUT EFI_HANDLE              *Device
724     );
725 
726 typedef
727 EFI_STATUS
728 (EFIAPI *EFI_INSTALL_CONFIGURATION_TABLE) (
729     IN EFI_GUID                 *Guid,
730     IN VOID                     *Table
731     );
732 
733 typedef
734 EFI_STATUS
735 (EFIAPI *EFI_RESERVED_SERVICE) (
736     );
737 
738 //
739 // Standard EFI table header
740 //
741 
742 typedef struct _EFI_TABLE_HEADER {
743     UINT64                      Signature;
744     UINT32                      Revision;
745     UINT32                      HeaderSize;
746     UINT32                      CRC32;
747     UINT32                      Reserved;
748 } EFI_TABLE_HEADER;
749 
750 
751 //
752 // EFI Runtime Serivces Table
753 //
754 
755 #define EFI_RUNTIME_SERVICES_SIGNATURE  0x56524553544e5552
756 #define EFI_RUNTIME_SERVICES_REVISION   (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
757 
758 typedef struct  {
759     EFI_TABLE_HEADER                Hdr;
760 
761     //
762     // Time services
763     //
764 
765     EFI_GET_TIME                    GetTime;
766     EFI_SET_TIME                    SetTime;
767     EFI_GET_WAKEUP_TIME             GetWakeupTime;
768     EFI_SET_WAKEUP_TIME             SetWakeupTime;
769 
770     //
771     // Virtual memory services
772     //
773 
774     EFI_SET_VIRTUAL_ADDRESS_MAP     SetVirtualAddressMap;
775     EFI_CONVERT_POINTER             ConvertPointer;
776 
777     //
778     // Variable serviers
779     //
780 
781     EFI_GET_VARIABLE                GetVariable;
782     EFI_GET_NEXT_VARIABLE_NAME      GetNextVariableName;
783     EFI_SET_VARIABLE                SetVariable;
784 
785     //
786     // Misc
787     //
788 
789     EFI_GET_NEXT_HIGH_MONO_COUNT    GetNextHighMonotonicCount;
790     EFI_RESET_SYSTEM                ResetSystem;
791 
792     EFI_UPDATE_CAPSULE              UpdateCapsule;
793     EFI_QUERY_CAPSULE_CAPABILITIES  QueryCapsuleCapabilities;
794     EFI_QUERY_VARIABLE_INFO         QueryVariableInfo;
795 } EFI_RUNTIME_SERVICES;
796 
797 
798 //
799 // EFI Boot Services Table
800 //
801 
802 #define EFI_BOOT_SERVICES_SIGNATURE     0x56524553544f4f42
803 #define EFI_BOOT_SERVICES_REVISION      (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
804 
805 typedef struct _EFI_BOOT_SERVICES {
806 
807     EFI_TABLE_HEADER                Hdr;
808 
809     //
810     // Task priority functions
811     //
812 
813     EFI_RAISE_TPL                   RaiseTPL;
814     EFI_RESTORE_TPL                 RestoreTPL;
815 
816     //
817     // Memory functions
818     //
819 
820     EFI_ALLOCATE_PAGES              AllocatePages;
821     EFI_FREE_PAGES                  FreePages;
822     EFI_GET_MEMORY_MAP              GetMemoryMap;
823     EFI_ALLOCATE_POOL               AllocatePool;
824     EFI_FREE_POOL                   FreePool;
825 
826     //
827     // Event & timer functions
828     //
829 
830     EFI_CREATE_EVENT                CreateEvent;
831     EFI_SET_TIMER                   SetTimer;
832     EFI_WAIT_FOR_EVENT              WaitForEvent;
833     EFI_SIGNAL_EVENT                SignalEvent;
834     EFI_CLOSE_EVENT                 CloseEvent;
835     EFI_CHECK_EVENT                 CheckEvent;
836 
837     //
838     // Protocol handler functions
839     //
840 
841     EFI_INSTALL_PROTOCOL_INTERFACE  InstallProtocolInterface;
842     EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface;
843     EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface;
844     EFI_HANDLE_PROTOCOL             HandleProtocol;
845     EFI_HANDLE_PROTOCOL             PCHandleProtocol;
846     EFI_REGISTER_PROTOCOL_NOTIFY    RegisterProtocolNotify;
847     EFI_LOCATE_HANDLE               LocateHandle;
848     EFI_LOCATE_DEVICE_PATH          LocateDevicePath;
849     EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable;
850 
851     //
852     // Image functions
853     //
854 
855     EFI_IMAGE_LOAD                  LoadImage;
856     EFI_IMAGE_START                 StartImage;
857     EFI_EXIT                        Exit;
858     EFI_IMAGE_UNLOAD                UnloadImage;
859     EFI_EXIT_BOOT_SERVICES          ExitBootServices;
860 
861     //
862     // Misc functions
863     //
864 
865     EFI_GET_NEXT_MONOTONIC_COUNT    GetNextMonotonicCount;
866     EFI_STALL                       Stall;
867     EFI_SET_WATCHDOG_TIMER          SetWatchdogTimer;
868 
869     //
870     // DriverSupport Services
871     //
872 
873     EFI_CONNECT_CONTROLLER          ConnectController;
874     EFI_DISCONNECT_CONTROLLER       DisconnectController;
875 
876     //
877     // Open and Close Protocol Services
878     //
879     EFI_OPEN_PROTOCOL               OpenProtocol;
880     EFI_CLOSE_PROTOCOL              CloseProtocol;
881     EFI_OPEN_PROTOCOL_INFORMATION   OpenProtocolInformation;
882 
883     //
884     // Library Services
885     //
886     EFI_PROTOCOLS_PER_HANDLE        ProtocolsPerHandle;
887     EFI_LOCATE_HANDLE_BUFFER        LocateHandleBuffer;
888     EFI_LOCATE_PROTOCOL             LocateProtocol;
889     EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces;
890     EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces;
891 
892     //
893     // 32-bit CRC Services
894     //
895     EFI_CALCULATE_CRC32             CalculateCrc32;
896 
897     //
898     // Misc Services
899     //
900     EFI_COPY_MEM                    CopyMem;
901     EFI_SET_MEM                     SetMem;
902     EFI_CREATE_EVENT_EX             CreateEventEx;
903 } EFI_BOOT_SERVICES;
904 
905 
906 //
907 // EFI Configuration Table and GUID definitions
908 //
909 
910 #define MPS_TABLE_GUID    \
911     { 0xeb9d2d2f, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
912 
913 #define ACPI_TABLE_GUID    \
914     { 0xeb9d2d30, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
915 
916 #define ACPI_20_TABLE_GUID  \
917     { 0x8868e871, 0xe4f1, 0x11d3, {0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} }
918 
919 #define SMBIOS_TABLE_GUID    \
920     { 0xeb9d2d31, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
921 
922 #define SMBIOS3_TABLE_GUID    \
923     { 0xf2fd1544, 0x9794, 0x4a2c, {0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94} }
924 
925 #define SAL_SYSTEM_TABLE_GUID    \
926     { 0xeb9d2d32, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
927 
928 /* DIG64 Headless Console & Debug Port Table. */
929 #define	HCDP_TABLE_GUID    \
930     { 0xf951938d, 0x620b, 0x42ef, {0x82, 0x79, 0xa8, 0x4b, 0x79, 0x61, 0x78, 0x98} }
931 
932 typedef struct _EFI_CONFIGURATION_TABLE {
933     EFI_GUID                VendorGuid;
934     VOID                    *VendorTable;
935 } EFI_CONFIGURATION_TABLE;
936 
937 
938 //
939 // EFI System Table
940 //
941 
942 
943 
944 
945 #define EFI_SYSTEM_TABLE_SIGNATURE      0x5453595320494249
946 #define EFI_SYSTEM_TABLE_REVISION      (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
947 
948 typedef struct _EFI_SYSTEM_TABLE {
949     EFI_TABLE_HEADER                Hdr;
950 
951     CHAR16                          *FirmwareVendor;
952     UINT32                          FirmwareRevision;
953 
954     EFI_HANDLE                      ConsoleInHandle;
955     SIMPLE_INPUT_INTERFACE          *ConIn;
956 
957     EFI_HANDLE                      ConsoleOutHandle;
958     SIMPLE_TEXT_OUTPUT_INTERFACE    *ConOut;
959 
960     EFI_HANDLE                      StandardErrorHandle;
961     SIMPLE_TEXT_OUTPUT_INTERFACE    *StdErr;
962 
963     EFI_RUNTIME_SERVICES            *RuntimeServices;
964     EFI_BOOT_SERVICES               *BootServices;
965 
966     UINTN                           NumberOfTableEntries;
967     EFI_CONFIGURATION_TABLE         *ConfigurationTable;
968 
969 } EFI_SYSTEM_TABLE;
970 
971 #endif
972 
973