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
8Copyright (c) 1998  Intel Corporation
9
10Module Name:
11
12    efiapi.h
13
14Abstract:
15
16    Global EFI runtime & boot service interfaces
17
18
19
20
21Revision 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
36INTERFACE_DECL(_EFI_SYSTEM_TABLE);
37
38//
39// EFI Memory
40//
41
42typedef
43EFI_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
51typedef
52EFI_STATUS
53(EFIAPI *EFI_FREE_PAGES) (
54    IN EFI_PHYSICAL_ADDRESS         Memory,
55    IN UINTN                        NoPages
56    );
57
58typedef
59EFI_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
71typedef
72EFI_STATUS
73(EFIAPI *EFI_ALLOCATE_POOL) (
74    IN EFI_MEMORY_TYPE              PoolType,
75    IN UINTN                        Size,
76    OUT VOID                        **Buffer
77    );
78
79typedef
80EFI_STATUS
81(EFIAPI *EFI_FREE_POOL) (
82    IN VOID                         *Buffer
83    );
84
85typedef
86EFI_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
100typedef
101EFI_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
136typedef
137VOID
138(EFIAPI *EFI_EVENT_NOTIFY) (
139    IN EFI_EVENT                Event,
140    IN VOID                     *Context
141    );
142
143typedef
144EFI_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
153typedef enum {
154    TimerCancel,
155    TimerPeriodic,
156    TimerRelative,
157    TimerTypeMax
158} EFI_TIMER_DELAY;
159
160typedef
161EFI_STATUS
162(EFIAPI *EFI_SET_TIMER) (
163    IN EFI_EVENT                Event,
164    IN EFI_TIMER_DELAY          Type,
165    IN UINT64                   TriggerTime
166    );
167
168typedef
169EFI_STATUS
170(EFIAPI *EFI_SIGNAL_EVENT) (
171    IN EFI_EVENT                Event
172    );
173
174typedef
175EFI_STATUS
176(EFIAPI *EFI_WAIT_FOR_EVENT) (
177    IN UINTN                    NumberOfEvents,
178    IN EFI_EVENT                *Event,
179    OUT UINTN                   *Index
180    );
181
182typedef
183EFI_STATUS
184(EFIAPI *EFI_CLOSE_EVENT) (
185    IN EFI_EVENT                Event
186    );
187
188typedef
189EFI_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
206typedef
207EFI_TPL
208(EFIAPI *EFI_RAISE_TPL) (
209    IN EFI_TPL      NewTpl
210    );
211
212typedef
213VOID
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
238typedef
239EFI_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
248typedef
249EFI_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
257typedef
258EFI_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
272typedef 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
279typedef
280EFI_STATUS
281(EFIAPI *EFI_GET_TIME) (
282    OUT EFI_TIME                    *Time,
283    OUT EFI_TIME_CAPABILITIES       *Capabilities OPTIONAL
284    );
285
286typedef
287EFI_STATUS
288(EFIAPI *EFI_SET_TIME) (
289    IN EFI_TIME                     *Time
290    );
291
292typedef
293EFI_STATUS
294(EFIAPI *EFI_GET_WAKEUP_TIME) (
295    OUT BOOLEAN                     *Enabled,
296    OUT BOOLEAN                     *Pending,
297    OUT EFI_TIME                    *Time
298    );
299
300typedef
301EFI_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
361typedef
362EFI_STATUS
363(EFIAPI *EFI_IMAGE_ENTRY_POINT) (
364    IN EFI_HANDLE                   ImageHandle,
365    IN struct _EFI_SYSTEM_TABLE     *SystemTable
366    );
367
368typedef
369EFI_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
379typedef
380EFI_STATUS
381(EFIAPI *EFI_IMAGE_START) (
382    IN EFI_HANDLE                   ImageHandle,
383    OUT UINTN                       *ExitDataSize,
384    OUT CHAR16                      **ExitData  OPTIONAL
385    );
386
387typedef
388EFI_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
402typedef 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
428typedef
429EFI_STATUS
430(EFIAPI *EFI_EXIT_BOOT_SERVICES) (
431    IN EFI_HANDLE                   ImageHandle,
432    IN UINTN                        MapKey
433    );
434
435//
436// Misc
437//
438
439
440typedef
441EFI_STATUS
442(EFIAPI *EFI_STALL) (
443    IN UINTN                    Microseconds
444    );
445
446typedef
447EFI_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
455typedef
456EFI_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
464typedef
465EFI_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
479typedef
480EFI_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
490typedef
491EFI_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
499typedef struct {
500    EFI_HANDLE                  AgentHandle;
501    EFI_HANDLE                  ControllerHandle;
502    UINT32                      Attributes;
503    UINT32                      OpenCount;
504} EFI_OPEN_PROTOCOL_INFORMATION_ENTRY;
505
506typedef
507EFI_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
515typedef
516EFI_STATUS
517(EFIAPI *EFI_PROTOCOLS_PER_HANDLE) (
518    IN EFI_HANDLE               Handle,
519    OUT EFI_GUID                ***ProtocolBuffer,
520    OUT UINTN                   *ProtocolBufferCount
521    );
522
523typedef enum {
524    AllHandles,
525    ByRegisterNotify,
526    ByProtocol
527} EFI_LOCATE_SEARCH_TYPE;
528
529typedef
530EFI_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
539typedef
540EFI_STATUS
541(EFIAPI *EFI_LOCATE_PROTOCOL) (
542    IN EFI_GUID                 *Protocol,
543    IN VOID                     *Registration OPTIONAL,
544    OUT VOID                    **Interface
545    );
546
547typedef
548EFI_STATUS
549(EFIAPI *EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
550    IN OUT EFI_HANDLE           *Handle,
551    ...
552    );
553
554typedef
555EFI_STATUS
556(EFIAPI *EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
557    IN OUT EFI_HANDLE           Handle,
558    ...
559    );
560
561typedef
562EFI_STATUS
563(EFIAPI *EFI_CALCULATE_CRC32) (
564    IN VOID                     *Data,
565    IN UINTN                    DataSize,
566    OUT UINT32                  *Crc32
567    );
568
569typedef
570VOID
571(EFIAPI *EFI_COPY_MEM) (
572    IN VOID                     *Destination,
573    IN VOID                     *Source,
574    IN UINTN                    Length
575    );
576
577typedef
578VOID
579(EFIAPI *EFI_SET_MEM) (
580    IN VOID                     *Buffer,
581    IN UINTN                    Size,
582    IN UINT8                    Value
583    );
584
585
586typedef
587EFI_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
597typedef enum {
598    EfiResetCold,
599    EfiResetWarm,
600    EfiResetShutdown
601} EFI_RESET_TYPE;
602
603typedef
604EFI_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
612typedef
613EFI_STATUS
614(EFIAPI *EFI_GET_NEXT_MONOTONIC_COUNT) (
615    OUT UINT64                  *Count
616    );
617
618typedef
619EFI_STATUS
620(EFIAPI *EFI_GET_NEXT_HIGH_MONO_COUNT) (
621    OUT UINT32                  *HighCount
622    );
623
624typedef struct {
625    UINT64                      Length;
626    union {
627        EFI_PHYSICAL_ADDRESS    DataBlock;
628       EFI_PHYSICAL_ADDRESS    ContinuationPointer;
629    } Union;
630} EFI_CAPSULE_BLOCK_DESCRIPTOR;
631
632typedef 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
643typedef
644EFI_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
651typedef
652EFI_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
660typedef
661EFI_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
673typedef enum {
674    EFI_NATIVE_INTERFACE,
675    EFI_PCODE_INTERFACE
676} EFI_INTERFACE_TYPE;
677
678typedef
679EFI_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
687typedef
688EFI_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
696typedef
697EFI_STATUS
698(EFIAPI *EFI_UNINSTALL_PROTOCOL_INTERFACE) (
699    IN EFI_HANDLE               Handle,
700    IN EFI_GUID                 *Protocol,
701    IN VOID                     *Interface
702    );
703
704typedef
705EFI_STATUS
706(EFIAPI *EFI_HANDLE_PROTOCOL) (
707    IN EFI_HANDLE               Handle,
708    IN EFI_GUID                 *Protocol,
709    OUT VOID                    **Interface
710    );
711
712typedef
713EFI_STATUS
714(EFIAPI *EFI_REGISTER_PROTOCOL_NOTIFY) (
715    IN EFI_GUID                 *Protocol,
716    IN EFI_EVENT                Event,
717    OUT VOID                    **Registration
718    );
719
720typedef
721EFI_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
730typedef
731EFI_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
738typedef
739EFI_STATUS
740(EFIAPI *EFI_INSTALL_CONFIGURATION_TABLE) (
741    IN EFI_GUID                 *Guid,
742    IN VOID                     *Table
743    );
744
745typedef
746EFI_STATUS
747(EFIAPI *EFI_RESERVED_SERVICE) (
748    );
749
750//
751// Standard EFI table header
752//
753
754typedef 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
770typedef 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
817typedef 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
947typedef 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
963typedef 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