7 Copyright (c) 1999 - 2002 Intel Corporation. All rights reserved
8 This software and associated documentation (if any) is furnished
9 under a license and may only be used or copied in accordance
10 with the terms of the license. Except as permitted by such
11 license, no part of this software or documentation may be
12 reproduced, stored in a retrieval system, or transmitted in any
13 form or by any means without the express written consent of
22 Global EFI runtime & boot service interfaces
32 // EFI Specification Revision
35 #define EFI_SPECIFICATION_MAJOR_REVISION 1
36 #define EFI_SPECIFICATION_MINOR_REVISION 10
39 // Declare forward referenced data structures
42 INTERFACE_DECL(_EFI_SYSTEM_TABLE);
50 (EFIAPI *EFI_ALLOCATE_PAGES) (
51 IN EFI_ALLOCATE_TYPE Type,
52 IN EFI_MEMORY_TYPE MemoryType,
54 OUT EFI_PHYSICAL_ADDRESS *Memory
59 (EFIAPI *EFI_FREE_PAGES) (
60 IN EFI_PHYSICAL_ADDRESS Memory,
66 (EFIAPI *EFI_GET_MEMORY_MAP) (
67 IN OUT UINTN *MemoryMapSize,
68 IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap,
70 OUT UINTN *DescriptorSize,
71 OUT UINT32 *DescriptorVersion
74 #define NextMemoryDescriptor(Ptr,Size) ((EFI_MEMORY_DESCRIPTOR *) (((UINT8 *) Ptr) + Size))
79 (EFIAPI *EFI_ALLOCATE_POOL) (
80 IN EFI_MEMORY_TYPE PoolType,
87 (EFIAPI *EFI_FREE_POOL) (
93 (EFIAPI *EFI_SET_VIRTUAL_ADDRESS_MAP) (
94 IN UINTN MemoryMapSize,
95 IN UINTN DescriptorSize,
96 IN UINT32 DescriptorVersion,
97 IN EFI_MEMORY_DESCRIPTOR *VirtualMap
101 #define EFI_OPTIONAL_PTR 0x00000001
102 #define EFI_INTERNAL_FNC 0x00000002 // Pointer to internal runtime fnc
103 #define EFI_INTERNAL_PTR 0x00000004 // Pointer to internal runtime data
108 (EFIAPI *EFI_CONVERT_POINTER) (
109 IN UINTN DebugDisposition,
110 IN OUT VOID **Address
120 #define EVT_TIMER 0x80000000
121 #define EVT_RUNTIME 0x40000000
122 #define EVT_RUNTIME_CONTEXT 0x20000000
124 #define EVT_NOTIFY_WAIT 0x00000100
125 #define EVT_NOTIFY_SIGNAL 0x00000200
127 #define EVT_SIGNAL_EXIT_BOOT_SERVICES 0x00000201
128 #define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202
130 #define EVT_EFI_SIGNAL_MASK 0x000000FF
131 #define EVT_EFI_SIGNAL_MAX 2
135 (EFIAPI *EFI_EVENT_NOTIFY) (
142 (EFIAPI *EFI_CREATE_EVENT) (
144 IN EFI_TPL NotifyTpl,
145 IN EFI_EVENT_NOTIFY NotifyFunction,
146 IN VOID *NotifyContext,
159 (EFIAPI *EFI_SET_TIMER) (
161 IN EFI_TIMER_DELAY Type,
162 IN UINT64 TriggerTime
167 (EFIAPI *EFI_SIGNAL_EVENT) (
173 (EFIAPI *EFI_WAIT_FOR_EVENT) (
174 IN UINTN NumberOfEvents,
181 (EFIAPI *EFI_CLOSE_EVENT) (
187 (EFIAPI *EFI_CHECK_EVENT) (
192 // Task priority level
195 #define TPL_APPLICATION 4
196 #define TPL_CALLBACK 8
197 #define TPL_NOTIFY 16
198 #define TPL_HIGH_LEVEL 31
202 (EFIAPI *EFI_RAISE_TPL) (
208 (EFIAPI *EFI_RESTORE_TPL) (
214 // EFI platform varibles
217 #define EFI_GLOBAL_VARIABLE \
218 { 0x8BE4DF61, 0x93CA, 0x11d2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C} }
220 // Variable attributes
221 #define EFI_VARIABLE_NON_VOLATILE 0x00000001
222 #define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002
223 #define EFI_VARIABLE_RUNTIME_ACCESS 0x00000004
225 // Variable size limitation
226 #define EFI_MAXIMUM_VARIABLE_SIZE 1024
230 (EFIAPI *EFI_GET_VARIABLE) (
231 IN CHAR16 *VariableName,
232 IN EFI_GUID *VendorGuid,
233 OUT UINT32 *Attributes OPTIONAL,
234 IN OUT UINTN *DataSize,
240 (EFIAPI *EFI_GET_NEXT_VARIABLE_NAME) (
241 IN OUT UINTN *VariableNameSize,
242 IN OUT CHAR16 *VariableName,
243 IN OUT EFI_GUID *VendorGuid
249 (EFIAPI *EFI_SET_VARIABLE) (
250 IN const CHAR16 *VariableName,
251 IN EFI_GUID *VendorGuid,
252 IN UINT32 Attributes,
263 UINT32 Resolution; // 1e-6 parts per million
264 UINT32 Accuracy; // hertz
265 BOOLEAN SetsToZero; // Set clears sub-second time
266 } EFI_TIME_CAPABILITIES;
271 (EFIAPI *EFI_GET_TIME) (
273 OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
278 (EFIAPI *EFI_SET_TIME) (
284 (EFIAPI *EFI_GET_WAKEUP_TIME) (
285 OUT BOOLEAN *Enabled,
286 OUT BOOLEAN *Pending,
292 (EFIAPI *EFI_SET_WAKEUP_TIME) (
294 IN EFI_TIME *Time OPTIONAL
303 // PE32+ Subsystem type for EFI images
305 #if !defined(IMAGE_SUBSYSTEM_EFI_APPLICATION)
306 #define IMAGE_SUBSYSTEM_EFI_APPLICATION 10
307 #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11
308 #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12
311 // PE32+ Machine type for EFI images
313 #if !defined(EFI_IMAGE_MACHINE_IA32)
314 #define EFI_IMAGE_MACHINE_IA32 0x014c
317 #if !defined(EFI_IMAGE_MACHINE_EBC)
318 #define EFI_IMAGE_MACHINE_EBC 0x0EBC
321 // Image Entry prototype
325 (EFIAPI *EFI_IMAGE_ENTRY_POINT) (
326 IN EFI_HANDLE ImageHandle,
327 IN struct _EFI_SYSTEM_TABLE *SystemTable
332 (EFIAPI *EFI_IMAGE_LOAD) (
333 IN BOOLEAN BootPolicy,
334 IN EFI_HANDLE ParentImageHandle,
335 IN EFI_DEVICE_PATH *FilePath,
336 IN VOID *SourceBuffer OPTIONAL,
338 OUT EFI_HANDLE *ImageHandle
343 (EFIAPI *EFI_IMAGE_START) (
344 IN EFI_HANDLE ImageHandle,
345 OUT UINTN *ExitDataSize,
346 OUT CHAR16 **ExitData OPTIONAL
352 IN EFI_HANDLE ImageHandle,
353 IN EFI_STATUS ExitStatus,
354 IN UINTN ExitDataSize,
355 IN CHAR16 *ExitData OPTIONAL
360 (EFIAPI *EFI_IMAGE_UNLOAD) (
361 IN EFI_HANDLE ImageHandle
366 #define LOADED_IMAGE_PROTOCOL \
367 { 0x5B1B31A1, 0x9562, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} }
369 #define EFI_LOADED_IMAGE_INFORMATION_REVISION 0x1000
372 EFI_HANDLE ParentHandle;
373 struct _EFI_SYSTEM_TABLE *SystemTable;
375 // Source location of image
376 EFI_HANDLE DeviceHandle;
377 EFI_DEVICE_PATH *FilePath;
380 // Images load options
381 UINT32 LoadOptionsSize;
384 // Location of where image was loaded
387 EFI_MEMORY_TYPE ImageCodeType;
388 EFI_MEMORY_TYPE ImageDataType;
390 // If the driver image supports a dynamic unload request
391 EFI_IMAGE_UNLOAD Unload;
398 (EFIAPI *EFI_EXIT_BOOT_SERVICES) (
399 IN EFI_HANDLE ImageHandle,
410 (EFIAPI *EFI_STALL) (
411 IN UINTN Microseconds
416 (EFIAPI *EFI_SET_WATCHDOG_TIMER) (
418 IN UINT64 WatchdogCode,
420 IN CHAR16 *WatchdogData OPTIONAL
432 (EFIAPI *EFI_RESET_SYSTEM) (
433 IN EFI_RESET_TYPE ResetType,
434 IN EFI_STATUS ResetStatus,
436 IN CHAR16 *ResetData OPTIONAL
441 (EFIAPI *EFI_GET_NEXT_MONOTONIC_COUNT) (
447 (EFIAPI *EFI_GET_NEXT_HIGH_MONO_COUNT) (
448 OUT UINT32 *HighCount
452 // Protocol handler functions
457 } EFI_INTERFACE_TYPE;
461 (EFIAPI *EFI_INSTALL_PROTOCOL_INTERFACE) (
462 IN OUT EFI_HANDLE *Handle,
463 IN EFI_GUID *Protocol,
464 IN EFI_INTERFACE_TYPE InterfaceType,
470 (EFIAPI *EFI_REINSTALL_PROTOCOL_INTERFACE) (
471 IN EFI_HANDLE Handle,
472 IN EFI_GUID *Protocol,
473 IN VOID *OldInterface,
474 IN VOID *NewInterface
479 (EFIAPI *EFI_UNINSTALL_PROTOCOL_INTERFACE) (
480 IN EFI_HANDLE Handle,
481 IN EFI_GUID *Protocol,
487 (EFIAPI *EFI_HANDLE_PROTOCOL) (
488 IN EFI_HANDLE Handle,
489 IN EFI_GUID *Protocol,
495 (EFIAPI *EFI_REGISTER_PROTOCOL_NOTIFY) (
496 IN EFI_GUID *Protocol,
498 OUT VOID **Registration
505 } EFI_LOCATE_SEARCH_TYPE;
509 (EFIAPI *EFI_LOCATE_HANDLE) (
510 IN EFI_LOCATE_SEARCH_TYPE SearchType,
511 IN EFI_GUID *Protocol OPTIONAL,
512 IN VOID *SearchKey OPTIONAL,
513 IN OUT UINTN *BufferSize,
514 OUT EFI_HANDLE *Buffer
519 (EFIAPI *EFI_LOCATE_DEVICE_PATH) (
520 IN EFI_GUID *Protocol,
521 IN OUT EFI_DEVICE_PATH **DevicePath,
522 OUT EFI_HANDLE *Device
527 (EFIAPI *EFI_INSTALL_CONFIGURATION_TABLE) (
534 (EFIAPI *EFI_RESERVED_SERVICE) (
540 (EFIAPI *EFI_CONNECT_CONTROLLER) (
541 IN EFI_HANDLE ControllerHandle,
542 IN EFI_HANDLE *DriverImageHandle OPTIONAL,
543 IN EFI_DEVICE_PATH *RemainingDevicePath OPTIONAL,
549 (EFIAPI *EFI_DISCONNECT_CONTROLLER)(
550 IN EFI_HANDLE ControllerHandle,
551 IN EFI_HANDLE DriverImageHandle, OPTIONAL
552 IN EFI_HANDLE ChildHandle OPTIONAL
555 #define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL 0x00000001
556 #define EFI_OPEN_PROTOCOL_GET_PROTOCOL 0x00000002
557 #define EFI_OPEN_PROTOCOL_TEST_PROTOCOL 0x00000004
558 #define EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER 0x00000008
559 #define EFI_OPEN_PROTOCOL_BY_DRIVER 0x00000010
560 #define EFI_OPEN_PROTOCOL_EXCLUSIVE 0x00000020
564 (EFIAPI *EFI_OPEN_PROTOCOL) (
565 IN EFI_HANDLE Handle,
566 IN EFI_GUID *Protocol,
567 OUT VOID **Interface,
568 IN EFI_HANDLE ImageHandle,
569 IN EFI_HANDLE ControllerHandle, OPTIONAL
575 (EFIAPI *EFI_CLOSE_PROTOCOL) (
576 IN EFI_HANDLE Handle,
577 IN EFI_GUID *Protocol,
578 IN EFI_HANDLE ImageHandle,
579 IN EFI_HANDLE DeviceHandle
583 EFI_HANDLE AgentHandle;
584 EFI_HANDLE ControllerHandle;
587 } EFI_OPEN_PROTOCOL_INFORMATION_ENTRY;
591 (EFIAPI *EFI_OPEN_PROTOCOL_INFORMATION) (
592 IN EFI_HANDLE UserHandle,
593 IN EFI_GUID *Protocol,
594 IN EFI_OPEN_PROTOCOL_INFORMATION_ENTRY **EntryBuffer,
595 OUT UINTN *EntryCount
600 (EFIAPI *EFI_PROTOCOLS_PER_HANDLE) (
601 IN EFI_HANDLE UserHandle,
602 OUT EFI_GUID ***ProtocolBuffer,
603 OUT UINTN *ProtocolBufferCount
608 (EFIAPI *EFI_LOCATE_HANDLE_BUFFER) (
609 IN EFI_LOCATE_SEARCH_TYPE SearchType,
610 IN EFI_GUID *Protocol OPTIONAL,
611 IN VOID *SearchKey OPTIONAL,
612 IN OUT UINTN *NumberHandles,
613 OUT EFI_HANDLE **Buffer
618 (EFIAPI *EFI_LOCATE_PROTOCOL) (
620 VOID *Registration, OPTIONAL
626 (EFIAPI *EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
627 IN OUT EFI_HANDLE *Handle,
633 (EFIAPI *EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES) (
634 IN EFI_HANDLE Handle,
640 (EFIAPI *EFI_CALCULATE_CRC32) (
648 (EFIAPI *EFI_COPY_MEM) (
649 IN VOID *Destination,
656 (EFIAPI *EFI_SET_MEM) (
663 // Standard EFI table header
666 typedef struct _EFI_TABLE_HEARDER {
676 // EFI Runtime Serivces Table
679 #define EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552
680 #define EFI_RUNTIME_SERVICES_REVISION ((EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION))
683 EFI_TABLE_HEADER Hdr;
689 EFI_GET_TIME GetTime;
690 EFI_SET_TIME SetTime;
691 EFI_GET_WAKEUP_TIME GetWakeupTime;
692 EFI_SET_WAKEUP_TIME SetWakeupTime;
695 // Virtual memory services
698 EFI_SET_VIRTUAL_ADDRESS_MAP SetVirtualAddressMap;
699 EFI_CONVERT_POINTER ConvertPointer;
705 EFI_GET_VARIABLE GetVariable;
706 EFI_GET_NEXT_VARIABLE_NAME GetNextVariableName;
707 EFI_SET_VARIABLE SetVariable;
713 EFI_GET_NEXT_HIGH_MONO_COUNT GetNextHighMonotonicCount;
714 EFI_RESET_SYSTEM ResetSystem;
716 } EFI_RUNTIME_SERVICES;
720 // EFI Boot Services Table
723 #define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42
724 #define EFI_BOOT_SERVICES_REVISION ((EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION))
728 EFI_TABLE_HEADER Hdr;
731 // Task priority functions
734 EFI_RAISE_TPL RaiseTPL;
735 EFI_RESTORE_TPL RestoreTPL;
741 EFI_ALLOCATE_PAGES AllocatePages;
742 EFI_FREE_PAGES FreePages;
743 EFI_GET_MEMORY_MAP GetMemoryMap;
744 EFI_ALLOCATE_POOL AllocatePool;
745 EFI_FREE_POOL FreePool;
748 // Event & timer functions
751 EFI_CREATE_EVENT CreateEvent;
752 EFI_SET_TIMER SetTimer;
753 EFI_WAIT_FOR_EVENT WaitForEvent;
754 EFI_SIGNAL_EVENT SignalEvent;
755 EFI_CLOSE_EVENT CloseEvent;
756 EFI_CHECK_EVENT CheckEvent;
759 // Protocol handler functions
762 EFI_INSTALL_PROTOCOL_INTERFACE InstallProtocolInterface;
763 EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface;
764 EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface;
765 EFI_HANDLE_PROTOCOL HandleProtocol;
767 EFI_REGISTER_PROTOCOL_NOTIFY RegisterProtocolNotify;
768 EFI_LOCATE_HANDLE LocateHandle;
769 EFI_LOCATE_DEVICE_PATH LocateDevicePath;
770 EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable;
776 EFI_IMAGE_LOAD LoadImage;
777 EFI_IMAGE_START StartImage;
779 EFI_IMAGE_UNLOAD UnloadImage;
780 EFI_EXIT_BOOT_SERVICES ExitBootServices;
786 EFI_GET_NEXT_MONOTONIC_COUNT GetNextMonotonicCount;
788 EFI_SET_WATCHDOG_TIMER SetWatchdogTimer;
791 // DriverSupport Services
793 EFI_CONNECT_CONTROLLER ConnectController;
794 EFI_DISCONNECT_CONTROLLER DisconnectController;
797 // Open and Close Protocol Services
799 EFI_OPEN_PROTOCOL OpenProtocol;
800 EFI_CLOSE_PROTOCOL CloseProtocol;
801 EFI_OPEN_PROTOCOL_INFORMATION OpenProtocolInformation;
804 // Library Services to reduce size of drivers
806 EFI_PROTOCOLS_PER_HANDLE ProtocolsPerHandle;
807 EFI_LOCATE_HANDLE_BUFFER LocateHandleBuffer;
808 EFI_LOCATE_PROTOCOL LocateProtocol;
810 EFI_INSTALL_MULTIPLE_PROTOCOL_INTERFACES InstallMultipleProtocolInterfaces;
811 EFI_UNINSTALL_MULTIPLE_PROTOCOL_INTERFACES UninstallMultipleProtocolInterfaces;
816 EFI_CALCULATE_CRC32 CalculateCrc32;
819 // Memory Utility Services
821 EFI_COPY_MEM CopyMem;
828 // EFI Configuration Table and GUID definitions
831 #define MPS_TABLE_GUID \
832 { 0xeb9d2d2f, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
834 #define ACPI_TABLE_GUID \
835 { 0xeb9d2d30, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
837 #define ACPI_20_TABLE_GUID \
838 { 0x8868e871, 0xe4f1, 0x11d3, {0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} }
840 #define SMBIOS_TABLE_GUID \
841 { 0xeb9d2d31, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
843 #define SAL_SYSTEM_TABLE_GUID \
844 { 0xeb9d2d32, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
846 #define FDT_TABLE_GUID \
847 { 0xb1b621d5, 0xf19c, 0x41a5, {0x83, 0x0b, 0xd9, 0x15, 0x2c, 0x69, 0xaa, 0xe0} }
849 #define DXE_SERVICES_TABLE_GUID \
850 { 0x5ad34ba, 0x6f02, 0x4214, {0x95, 0x2e, 0x4d, 0xa0, 0x39, 0x8e, 0x2b, 0xb9} }
852 #define HOB_LIST_TABLE_GUID \
853 { 0x7739f24c, 0x93d7, 0x11d4, {0x9a, 0x3a, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} }
855 #define MEMORY_TYPE_INFORMATION_TABLE_GUID \
856 { 0x4c19049f, 0x4137, 0x4dd3, {0x9c, 0x10, 0x8b, 0x97, 0xa8, 0x3f, 0xfd, 0xfa} }
858 #define DEBUG_IMAGE_INFO_TABLE_GUID \
859 { 0x49152e77, 0x1ada, 0x4764, {0xb7, 0xa2, 0x7a, 0xfe, 0xfe, 0xd9, 0x5e, 0x8b} }
861 typedef struct _EFI_CONFIGURATION_TABLE {
864 } EFI_CONFIGURATION_TABLE;
874 #define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249
875 #define EFI_SYSTEM_TABLE_REVISION ((EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION))
876 #define EFI_1_10_SYSTEM_TABLE_REVISION ((1<<16) | 10)
877 #define EFI_1_02_SYSTEM_TABLE_REVISION ((1<<16) | 02)
879 typedef struct _EFI_SYSTEM_TABLE {
880 EFI_TABLE_HEADER Hdr;
882 CHAR16 *FirmwareVendor;
883 UINT32 FirmwareRevision;
885 EFI_HANDLE ConsoleInHandle;
886 SIMPLE_INPUT_INTERFACE *ConIn;
888 EFI_HANDLE ConsoleOutHandle;
889 SIMPLE_TEXT_OUTPUT_INTERFACE *ConOut;
891 EFI_HANDLE StandardErrorHandle;
892 SIMPLE_TEXT_OUTPUT_INTERFACE *StdErr;
894 EFI_RUNTIME_SERVICES *RuntimeServices;
895 EFI_BOOT_SERVICES *BootServices;
897 UINTN NumberOfTableEntries;
898 EFI_CONFIGURATION_TABLE *ConfigurationTable;