text: #ifndef _EFI_API_H
  #define _EFI_API_H
  
  /*++
  
  Copyright (c) 1998  Intel Corporation
  
  Module Name:
  
      efiapi.h
  
  Abstract:
  
      Global EFI runtime & boot service interfaces
  
  
  
  
  Revision History
  
  --*/
  
  /* 
   *  EFI Specification Revision
   */
  
  #define EFI_SPECIFICATION_MAJOR_REVISION 0
  #define EFI_SPECIFICATION_MINOR_REVISION 99
  
  /* 
   *  Declare forward referenced data structures
   */
  
  INTERFACE_DECL(_EFI_SYSTEM_TABLE);
  
  /* 
   *  EFI Memory
   */
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_ALLOCATE_PAGES) (
      IN EFI_ALLOCATE_TYPE            Type,
      IN EFI_MEMORY_TYPE              MemoryType,
      IN UINTN                        NoPages,
      OUT EFI_PHYSICAL_ADDRESS        *Memory
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_FREE_PAGES) (
      IN EFI_PHYSICAL_ADDRESS         Memory,
      IN UINTN                        NoPages
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_GET_MEMORY_MAP) (
      IN OUT UINTN                    *MemoryMapSize,
      IN OUT EFI_MEMORY_DESCRIPTOR    *MemoryMap,
      OUT UINTN                       *MapKey,
      OUT UINTN                       *DescriptorSize,
      OUT UINT32                      *DescriptorVersion
      );
  
  #define NextMemoryDescriptor(Ptr,Size)  ((EFI_MEMORY_DESCRIPTOR *) (((UINT8 *) Ptr) + Size))
  
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_ALLOCATE_POOL) (
      IN EFI_MEMORY_TYPE              PoolType,
      IN UINTN                        Size,
      OUT VOID                        **Buffer
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_FREE_POOL) (
      IN VOID                         *Buffer
      );
  
  typedef 
  EFI_STATUS
  (EFIAPI *EFI_SET_VIRTUAL_ADDRESS_MAP) (
      IN UINTN                        MemoryMapSize,
      IN UINTN                        DescriptorSize,
      IN UINT32                       DescriptorVersion,
      IN EFI_MEMORY_DESCRIPTOR        *VirtualMap
      );
  
  
  #define EFI_OPTIONAL_PTR            0x00000001
  #define EFI_INTERNAL_FNC            0x00000002      /*  Pointer to internal runtime fnc */
  #define EFI_INTERNAL_PTR            0x00000004      /*  Pointer to internal runtime data */
  
  
  typedef 
  EFI_STATUS
  (EFIAPI *EFI_CONVERT_POINTER) (
      IN UINTN                        DebugDisposition,
      IN OUT VOID                     **Address
      );
  
  
  /* 
   *  EFI Events
   */
  
  
  
  #define EVT_TIMER                           0x80000000
  #define EVT_RUNTIME                         0x40000000
  #define EVT_RUNTIME_CONTEXT                 0x20000000
  
  #define EVT_NOTIFY_WAIT                     0x00000100
  #define EVT_NOTIFY_SIGNAL                   0x00000200
  
  #define EVT_SIGNAL_EXIT_BOOT_SERVICES       0x00000201
  #define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE   0x60000202
  
  #define EVT_EFI_SIGNAL_MASK                 0x000000FF
  #define EVT_EFI_SIGNAL_MAX                  2
  
  typedef
  VOID
  (EFIAPI *EFI_EVENT_NOTIFY) (
      IN EFI_EVENT                Event,
      IN VOID                     *Context
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_CREATE_EVENT) (
      IN UINT32                       Type,
      IN EFI_TPL                      NotifyTpl,
      IN EFI_EVENT_NOTIFY             NotifyFunction,
      IN VOID                         *NotifyContext,
      OUT EFI_EVENT                   *Event
      );
  
  typedef enum {
      TimerCancel,
      TimerPeriodic,
      TimerRelative,
      TimerTypeMax
  } EFI_TIMER_DELAY;
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_SET_TIMER) (
      IN EFI_EVENT                Event,
      IN EFI_TIMER_DELAY          Type,
      IN UINT64                   TriggerTime
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_SIGNAL_EVENT) (
      IN EFI_EVENT                Event
      );
  
  typedef 
  EFI_STATUS
  (EFIAPI *EFI_WAIT_FOR_EVENT) (
      IN UINTN                    NumberOfEvents,
      IN EFI_EVENT                *Event,
      OUT UINTN                   *Index
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_CLOSE_EVENT) (
      IN EFI_EVENT                Event
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_CHECK_EVENT) (
      IN EFI_EVENT                Event
      );
  
  /* 
   *  Task priority level
   */
  
  #define TPL_APPLICATION    4
  #define TPL_CALLBACK       8
  #define TPL_NOTIFY        16 
  #define TPL_HIGH_LEVEL    31 
  
  typedef
  EFI_TPL
  (EFIAPI *EFI_RAISE_TPL) (
      IN EFI_TPL      NewTpl
      );
  
  typedef
  VOID
  (EFIAPI *EFI_RESTORE_TPL) (
      IN EFI_TPL      OldTpl
      );
  
  
  /* 
   *  EFI platform varibles
   */
  
  #define EFI_GLOBAL_VARIABLE     \
      { 0x8BE4DF61, 0x93CA, 0x11d2, 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C }
  
  /*  Variable attributes */
  #define EFI_VARIABLE_NON_VOLATILE           0x00000001
  #define EFI_VARIABLE_BOOTSERVICE_ACCESS     0x00000002
  #define EFI_VARIABLE_RUNTIME_ACCESS         0x00000004
  
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_GET_VARIABLE) (
      IN CHAR16                       *VariableName,
      IN EFI_GUID                     *VendorGuid,
      OUT UINT32                      *Attributes OPTIONAL,
      IN OUT UINTN                    *DataSize,
      OUT VOID                        *Data
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_GET_NEXT_VARIABLE_NAME) (
      IN OUT UINTN                    *VariableNameSize,
      IN OUT CHAR16                   *VariableName,
      IN OUT EFI_GUID                 *VendorGuid
      );
  
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_SET_VARIABLE) (
      IN CHAR16                       *VariableName,
      IN EFI_GUID                     *VendorGuid,
      IN UINT32                       Attributes,
      IN UINTN                        DataSize,
      IN VOID                         *Data
      );
  
  
  /* 
   *  EFI Time
   */
  
  typedef struct {
          UINT32                      Resolution;     /*  1e-6 parts per million */
          UINT32                      Accuracy;       /*  hertz */
          BOOLEAN                     SetsToZero;     /*  Set clears sub-second time */
  } EFI_TIME_CAPABILITIES;
  
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_GET_TIME) (
      OUT EFI_TIME                    *Time,
      OUT EFI_TIME_CAPABILITIES       *Capabilities OPTIONAL
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_SET_TIME) (
      IN EFI_TIME                     *Time
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_GET_WAKEUP_TIME) (
      OUT BOOLEAN                     *Enabled,
      OUT BOOLEAN                     *Pending,
      OUT EFI_TIME                    *Time
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_SET_WAKEUP_TIME) (
      IN BOOLEAN                      Enable,
      IN EFI_TIME                     *Time OPTIONAL
      );
  
  
  /* 
   *  Image functions
   */
  
  
  /*  PE32+ Subsystem type for EFI images */
  
  #if !defined(IMAGE_SUBSYSTEM_EFI_APPLICATION)
  #define IMAGE_SUBSYSTEM_EFI_APPLICATION             10
  #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER     11
  #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER          12
  #endif
  
  /*  PE32+ Machine type for EFI images */
  
  #if !defined(EFI_IMAGE_MACHINE_IA32)
  #define EFI_IMAGE_MACHINE_IA32      0x014c
  #endif
  
  #if !defined(EFI_IMAGE_MACHINE_IA64)
  #define EFI_IMAGE_MACHINE_IA64      0x0200
  #endif
  
  /*  Image Entry prototype */
  
  typedef 
  EFI_STATUS
  (EFIAPI *EFI_IMAGE_ENTRY_POINT) (
      IN EFI_HANDLE                   ImageHandle,
      IN struct _EFI_SYSTEM_TABLE     *SystemTable
      );
  
  typedef 
  EFI_STATUS
  (EFIAPI *EFI_IMAGE_LOAD) (
      IN BOOLEAN                      BootPolicy,
      IN EFI_HANDLE                   ParentImageHandle,
      IN EFI_DEVICE_PATH              *FilePath,
      IN VOID                         *SourceBuffer   OPTIONAL,
      IN UINTN                        SourceSize,
      OUT EFI_HANDLE                  *ImageHandle
      );
  
  typedef 
  EFI_STATUS
  (EFIAPI *EFI_IMAGE_START) (
      IN EFI_HANDLE                   ImageHandle,
      OUT UINTN                       *ExitDataSize,
      OUT CHAR16                      **ExitData  OPTIONAL
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_EXIT) (
      IN EFI_HANDLE                   ImageHandle,
      IN EFI_STATUS                   ExitStatus,
      IN UINTN                        ExitDataSize,
      IN CHAR16                       *ExitData OPTIONAL
      );
  
  typedef 
  EFI_STATUS
  (EFIAPI *EFI_IMAGE_UNLOAD) (
      IN EFI_HANDLE                   ImageHandle
      );
  
  
  /*  Image handle */
  #define LOADED_IMAGE_PROTOCOL      \
      { 0x5B1B31A1, 0x9562, 0x11d2, 0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B }
  
  #define EFI_IMAGE_INFORMATION_REVISION      0x1000
  typedef struct {
      UINT32                          Revision;
      EFI_HANDLE                      ParentHandle;
      struct _EFI_SYSTEM_TABLE        *SystemTable;
  
      /*  Source location of image */
      EFI_HANDLE                      DeviceHandle;
      EFI_DEVICE_PATH                 *FilePath;
      VOID                            *Reserved;
  
      /*  Images load options */
      UINT32                          LoadOptionsSize;
      VOID                            *LoadOptions;
  
      /*  Location of where image was loaded */
      VOID                            *ImageBase;
      UINT64                          ImageSize;
      EFI_MEMORY_TYPE                 ImageCodeType;
      EFI_MEMORY_TYPE                 ImageDataType;
  
      /*  If the driver image supports a dynamic unload request */
      EFI_IMAGE_UNLOAD                Unload;
  
  } EFI_LOADED_IMAGE;
  
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_EXIT_BOOT_SERVICES) (
      IN EFI_HANDLE                   ImageHandle,
      IN UINTN                        MapKey
      );
  
  /* 
   *  Misc
   */
  
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_STALL) (
      IN UINTN                    Microseconds
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_SET_WATCHDOG_TIMER) (
      IN UINTN                    Timeout,
      IN UINT64                   WatchdogCode,
      IN UINTN                    DataSize,
      IN CHAR16                   *WatchdogData OPTIONAL
      );
  
  
  typedef enum {
      EfiResetCold,
      EfiResetWarm
  } EFI_RESET_TYPE;
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_RESET_SYSTEM) (
      IN EFI_RESET_TYPE           ResetType,
      IN EFI_STATUS               ResetStatus,
      IN UINTN                    DataSize,
      IN CHAR16                   *ResetData OPTIONAL
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_GET_NEXT_MONOTONIC_COUNT) (
      OUT UINT64                  *Count
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_GET_NEXT_HIGH_MONO_COUNT) (
      OUT UINT32                  *HighCount
      );
  
  /* 
   *  Protocol handler functions
   */
  
  typedef enum {
      EFI_NATIVE_INTERFACE,
      EFI_PCODE_INTERFACE
  } EFI_INTERFACE_TYPE;
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_INSTALL_PROTOCOL_INTERFACE) (
      IN OUT EFI_HANDLE           *Handle,
      IN EFI_GUID                 *Protocol,
      IN EFI_INTERFACE_TYPE       InterfaceType,
      IN VOID                     *Interface
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_REINSTALL_PROTOCOL_INTERFACE) (
      IN EFI_HANDLE               Handle,
      IN EFI_GUID                 *Protocol,
      IN VOID                     *OldInterface,
      IN VOID                     *NewInterface
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_UNINSTALL_PROTOCOL_INTERFACE) (
      IN EFI_HANDLE               Handle,
      IN EFI_GUID                 *Protocol,
      IN VOID                     *Interface
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_HANDLE_PROTOCOL) (
      IN EFI_HANDLE               Handle,
      IN EFI_GUID                 *Protocol,
      OUT VOID                    **Interface
      );
  
  typedef
  EFI_STATUS 
  (EFIAPI *EFI_REGISTER_PROTOCOL_NOTIFY) (
      IN EFI_GUID                 *Protocol,
      IN EFI_EVENT                Event,
      OUT VOID                    **Registration
      );
  
  typedef enum {
      AllHandles,
      ByRegisterNotify,
      ByProtocol
  } EFI_LOCATE_SEARCH_TYPE;
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_LOCATE_HANDLE) (
      IN EFI_LOCATE_SEARCH_TYPE   SearchType,
      IN EFI_GUID                 *Protocol OPTIONAL,
      IN VOID                     *SearchKey OPTIONAL,
      IN OUT UINTN                *BufferSize,
      OUT EFI_HANDLE              *Buffer
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_LOCATE_DEVICE_PATH) (
      IN EFI_GUID                 *Protocol,
      IN OUT EFI_DEVICE_PATH      **DevicePath,
      OUT EFI_HANDLE              *Device
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_INSTALL_CONFIGURATION_TABLE) (
      IN EFI_GUID                 *Guid,
      IN VOID                     *Table
      );
  
  typedef
  EFI_STATUS
  (EFIAPI *EFI_RESERVED_SERVICE) (
      );
  
  /* 
   *  Standard EFI table header
   */
  
  typedef struct _EFI_TABLE_HEARDER {
      UINT64                      Signature;
      UINT32                      Revision;
      UINT32                      HeaderSize;
      UINT32                      CRC32;
      UINT32                      Reserved;
  } EFI_TABLE_HEADER;
  
  
  /* 
   *  EFI Runtime Serivces Table
   */
  
  #define EFI_RUNTIME_SERVICES_SIGNATURE  0x56524553544e5552
  #define EFI_RUNTIME_SERVICES_REVISION   (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
  
  typedef struct  {
      EFI_TABLE_HEADER                Hdr;
  
      /* 
       *  Time services
       */
  
      EFI_GET_TIME                    GetTime;
      EFI_SET_TIME                    SetTime;
      EFI_GET_WAKEUP_TIME             GetWakeupTime;
      EFI_SET_WAKEUP_TIME             SetWakeupTime;
  
      /* 
       *  Virtual memory services
       */
  
      EFI_SET_VIRTUAL_ADDRESS_MAP     SetVirtualAddressMap;
      EFI_CONVERT_POINTER             ConvertPointer;
  
      /* 
       *  Variable serviers
       */
  
      EFI_GET_VARIABLE                GetVariable;
      EFI_GET_NEXT_VARIABLE_NAME      GetNextVariableName;
      EFI_SET_VARIABLE                SetVariable;
  
      /* 
       *  Misc
       */
  
      EFI_GET_NEXT_HIGH_MONO_COUNT    GetNextHighMonotonicCount;
      EFI_RESET_SYSTEM                ResetSystem;
  
  } EFI_RUNTIME_SERVICES;
  
  
  /* 
   *  EFI Boot Services Table
   */
  
  #define EFI_BOOT_SERVICES_SIGNATURE     0x56524553544f4f42
  #define EFI_BOOT_SERVICES_REVISION      (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
  
  typedef struct _EFI_BOOT_SERVICES {
  
      EFI_TABLE_HEADER                Hdr;
  
      /* 
       *  Task priority functions
       */
  
      EFI_RAISE_TPL                   RaiseTPL;
      EFI_RESTORE_TPL                 RestoreTPL;
  
      /* 
       *  Memory functions
       */
  
      EFI_ALLOCATE_PAGES              AllocatePages;
      EFI_FREE_PAGES                  FreePages;
      EFI_GET_MEMORY_MAP              GetMemoryMap;
      EFI_ALLOCATE_POOL               AllocatePool;
      EFI_FREE_POOL                   FreePool;
  
      /* 
       *  Event & timer functions
       */
  
      EFI_CREATE_EVENT                CreateEvent;
      EFI_SET_TIMER                   SetTimer;
      EFI_WAIT_FOR_EVENT              WaitForEvent;
      EFI_SIGNAL_EVENT                SignalEvent;
      EFI_CLOSE_EVENT                 CloseEvent;
      EFI_CHECK_EVENT                 CheckEvent;
  
      /* 
       *  Protocol handler functions
       */
  
      EFI_INSTALL_PROTOCOL_INTERFACE  InstallProtocolInterface;
      EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface;
      EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface;
      EFI_HANDLE_PROTOCOL             HandleProtocol;
      EFI_HANDLE_PROTOCOL             PCHandleProtocol;
      EFI_REGISTER_PROTOCOL_NOTIFY    RegisterProtocolNotify;
      EFI_LOCATE_HANDLE               LocateHandle;
      EFI_LOCATE_DEVICE_PATH          LocateDevicePath;
      EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable;
  
      /* 
       *  Image functions
       */
  
      EFI_IMAGE_LOAD                  LoadImage;
      EFI_IMAGE_START                 StartImage;
      EFI_EXIT                        Exit;
      EFI_IMAGE_UNLOAD                UnloadImage;
      EFI_EXIT_BOOT_SERVICES          ExitBootServices;
  
      /* 
       *  Misc functions
       */
  
      EFI_GET_NEXT_MONOTONIC_COUNT    GetNextMonotonicCount;
      EFI_STALL                       Stall;
      EFI_SET_WATCHDOG_TIMER          SetWatchdogTimer;
  
  } EFI_BOOT_SERVICES;
  
  
  /* 
   *  EFI Configuration Table and GUID definitions
   */
  
  #define MPS_TABLE_GUID    \
      { 0xeb9d2d2f, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d }
  
  #define ACPI_TABLE_GUID  \
      { 0x8868e871, 0xe4f1, 0x11d3, 0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 }
  
  #define SMBIOS_TABLE_GUID    \
      { 0xeb9d2d31, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d }
  
  #define SAL_SYSTEM_TABLE_GUID    \
      { 0xeb9d2d32, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d }
  
  
  typedef struct _EFI_CONFIGURATION_TABLE {
      EFI_GUID                VendorGuid;
      VOID                    *VendorTable;
  } EFI_CONFIGURATION_TABLE;
  
  
  /* 
   *  EFI System Table
   */
  
  
  
  
  #define EFI_SYSTEM_TABLE_SIGNATURE      0x5453595320494249
  #define EFI_SYSTEM_TABLE_REVISION      (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION)
  
  typedef struct _EFI_SYSTEM_TABLE {
      EFI_TABLE_HEADER                Hdr;
  
      CHAR16                          *FirmwareVendor;
      UINT32                          FirmwareRevision;
  
      EFI_HANDLE                      ConsoleInHandle;
      SIMPLE_INPUT_INTERFACE          *ConIn;
  
      EFI_HANDLE                      ConsoleOutHandle;
      SIMPLE_TEXT_OUTPUT_INTERFACE    *ConOut;
  
      EFI_HANDLE                      StandardErrorHandle;
      SIMPLE_TEXT_OUTPUT_INTERFACE    *StdErr;
  
      EFI_RUNTIME_SERVICES            *RuntimeServices;
      EFI_BOOT_SERVICES               *BootServices;
  
      UINTN                           NumberOfTableEntries;
      EFI_CONFIGURATION_TABLE         *ConfigurationTable;
  
  } EFI_SYSTEM_TABLE;
  
  #endif
  