Home | History | Annotate | Line # | Download | only in inc
      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