Home | History | Annotate | Download | only in Protocol
      1 /** @file
      2   Emulator Thunk to abstract OS services from pure EFI code
      3 
      4   Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
      5 
      6   This program and the accompanying materials
      7   are licensed and made available under the terms and conditions of the BSD License
      8   which accompanies this distribution.  The full text of the license may be found at
      9   http://opensource.org/licenses/bsd-license.php
     10 
     11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #ifndef __EMU_THUNK_PROTOCOL_H__
     17 #define __EMU_THUNK_PROTOCOL_H__
     18 
     19 #define EMU_THUNK_PROTOCOL_GUID  \
     20  { 0x5CF32E0B, 0x8EDF, 0x2E44, { 0x9C, 0xDA, 0x93, 0x20, 0x5E, 0x99, 0xEC, 0x1C } }
     21 
     22 // neded for things like EFI_TIME_CAPABILITIES
     23 #include <Uefi.h>
     24 
     25 #include <Library/PeCoffExtraActionLib.h>
     26 
     27 #include <Protocol/EmuIoThunk.h>
     28 #include <Protocol/DevicePath.h>
     29 
     30 
     31 typedef struct {
     32   VENDOR_DEVICE_PATH  VendorDevicePath;
     33   UINT32              Instance;
     34 } EMU_VENDOR_DEVICE_PATH_NODE;
     35 
     36 typedef struct {
     37   EMU_VENDOR_DEVICE_PATH_NODE Vendor;
     38   EFI_DEVICE_PATH_PROTOCOL    EndDevicePath;
     39 } EMU_THUNK_DEVICE_PATH;
     40 
     41 
     42 
     43 typedef struct _EMU_THUNK_PROTOCOL  EMU_THUNK_PROTOCOL;
     44 
     45 
     46 
     47 typedef
     48 UINTN
     49 (EFIAPI *EMU_WRITE_STD_ERROR) (
     50   IN UINT8     *Buffer,
     51   IN UINTN     NumberOfBytes
     52   );
     53 
     54 typedef
     55 EFI_STATUS
     56 (EFIAPI *EMU_CONFIG_STD_IN) (
     57   VOID
     58   );
     59 
     60 typedef
     61 UINTN
     62 (EFIAPI *EMU_WRITE_STD_OUT) (
     63   IN UINT8     *Buffer,
     64   IN UINTN     NumberOfBytes
     65   );
     66 
     67 typedef
     68 UINTN
     69 (EFIAPI *EMU_READ_STD_IN) (
     70   OUT UINT8     *Buffer,
     71   IN  UINTN     NumberOfBytes
     72   );
     73 
     74 typedef
     75 BOOLEAN
     76 (EFIAPI *EMU_POLL_STD_IN) (
     77   VOID
     78   );
     79 
     80 
     81 typedef
     82 VOID *
     83 (EFIAPI *EMU_OS_MALLOC) (
     84   IN  UINTN Size
     85   );
     86 
     87 typedef
     88 VOID *
     89 (EFIAPI *EMU_OS_VMALLOC) (
     90   IN  UINTN Size
     91   );
     92 
     93 typedef
     94 BOOLEAN
     95 (EFIAPI *EMU_OS_FREE) (
     96   IN  VOID *Ptr
     97   );
     98 
     99 
    100 typedef
    101 EFI_STATUS
    102 (EFIAPI *EMU_PE_COFF_GET_ENTRY_POINT) (
    103   IN     VOID  *Pe32Data,
    104   IN OUT VOID  **EntryPoint
    105   );
    106 
    107 typedef
    108 VOID
    109 (EFIAPI *EMU_PE_COFF_RELOCATE_EXTRA_ACTION) (
    110   IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
    111   );
    112 
    113 typedef
    114 VOID
    115 (EFIAPI *EMU_PE_COFF_UNLOAD_EXTRA_ACTION) (
    116   IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
    117   );
    118 
    119 typedef
    120 VOID
    121 (EFIAPI *EMU_ENABLE_INERRUPTS) (
    122   VOID
    123   );
    124 
    125 typedef
    126 VOID
    127 (EFIAPI *EMU_DISABLE_INERRUPTS) (
    128   VOID
    129   );
    130 
    131 typedef
    132 UINT64
    133 (EFIAPI *EMU_QUERY_PERFORMANCE_FREQENCY) (
    134   VOID
    135   );
    136 
    137 typedef
    138 UINT64
    139 (EFIAPI *EMU_QUERY_PERFORMANCE_COUNTER) (
    140   VOID
    141   );
    142 
    143 typedef
    144 VOID
    145 (EFIAPI *EMU_SLEEP) (
    146   IN  UINT64    Milliseconds
    147   );
    148 
    149 typedef
    150 VOID
    151 (EFIAPI *EMU_CPU_SLEEP) (
    152   VOID
    153   );
    154 
    155 typedef
    156 VOID
    157 (EFIAPI *EMU_EXIT) (
    158   IN  UINTN    Status
    159   );
    160 
    161 typedef
    162 VOID
    163 (EFIAPI *EMU_GET_TIME) (
    164   OUT  EFI_TIME               *Time,
    165   OUT EFI_TIME_CAPABILITIES   *Capabilities OPTIONAL
    166   );
    167 
    168 typedef
    169 VOID
    170 (EFIAPI *EMU_SET_TIME) (
    171   IN   EFI_TIME               *Time
    172   );
    173 
    174 
    175 typedef
    176 VOID
    177 (EFIAPI EMU_SET_TIMER_CALLBACK) (
    178   IN  UINT64  DeltaMs
    179   );
    180 
    181 typedef
    182 VOID
    183 (EFIAPI *EMU_SET_TIMER) (
    184   IN  UINT64                  PeriodMs,
    185   IN  EMU_SET_TIMER_CALLBACK  CallBack
    186   );
    187 
    188 
    189 
    190 /**
    191   Enumerates the current set of protocol instances that abstract OS services from EFI.
    192 
    193   A given protocol can have multiple instances. Usually a protocol is configured via a
    194   single PCD string. The data associated for each instance is seperated via a ! in the string.
    195   EMU_IO_THUNK_PROTOCOL_CLOSE.ConfigString will contain the information in the PCD string up to the next !.
    196   Thus each instance has a unique ConfigString.
    197 
    198   @param  EmuBusDriver          TRUE means only return protocol instances that need to be produced
    199                                 by the EmuBusDriver. FALSE means return all possible protocols
    200   @param  Instance              On input the protocol to search for, or NULL to start a search
    201                                 of all the supported protocol instances.
    202   @param  NextProtocol          On output it represents the next value to be passed into Protocol.
    203   @param  Interface             A pointer to the EMU_IO_THUNK_PROTOCOL_CLOSE interface.
    204 
    205   @retval EFI_SUCCESS           The function completed successfully.
    206   @retval EFI_NOT_FOUND         The next protocol instance was not found.
    207   @retval EFI_INVALID_PARAMETER Instance is NULL.
    208 
    209 **/
    210 typedef
    211 EFI_STATUS
    212 (EFIAPI *EMU_GET_NEXT_PROTOCOL) (
    213   IN  BOOLEAN                 EmuBusDriver,
    214   OUT EMU_IO_THUNK_PROTOCOL   **Instance  OPTIONAL
    215   );
    216 
    217 
    218 struct _EMU_THUNK_PROTOCOL {
    219   // Used for early debug printing
    220   EMU_WRITE_STD_ERROR               WriteStdErr;
    221   EMU_CONFIG_STD_IN                 ConfigStdIn;
    222   EMU_WRITE_STD_OUT                 WriteStdOut;
    223   EMU_READ_STD_IN                   ReadStdIn;
    224   EMU_POLL_STD_IN                   PollStdIn;
    225 
    226   //
    227   // Map OS malloc/free so we can use OS based guard malloc
    228   //
    229   EMU_OS_MALLOC                     Malloc;
    230   EMU_OS_VMALLOC                    Valloc;
    231   EMU_OS_FREE                       Free;
    232 
    233 
    234   ///
    235   /// PE/COFF loader hooks to get symbols loaded
    236   ///
    237   EMU_PE_COFF_GET_ENTRY_POINT       PeCoffGetEntryPoint;
    238   EMU_PE_COFF_RELOCATE_EXTRA_ACTION PeCoffRelocateImageExtraAction;
    239   EMU_PE_COFF_UNLOAD_EXTRA_ACTION   PeCoffUnloadImageExtraAction;
    240 
    241   ///
    242   /// DXE Architecture Protocol Services
    243   ///
    244   EMU_ENABLE_INERRUPTS              EnableInterrupt;
    245   EMU_DISABLE_INERRUPTS             DisableInterrupt;
    246   EMU_QUERY_PERFORMANCE_FREQENCY    QueryPerformanceFrequency;
    247   EMU_QUERY_PERFORMANCE_COUNTER     QueryPerformanceCounter;
    248 
    249   EMU_SLEEP                         Sleep;
    250   EMU_CPU_SLEEP                     CpuSleep;
    251   EMU_EXIT                          Exit;
    252   EMU_GET_TIME                      GetTime;
    253   EMU_SET_TIME                      SetTime;
    254   EMU_SET_TIMER                     SetTimer;
    255 
    256   ///
    257   /// Generic System Services
    258   ///
    259   EMU_GET_NEXT_PROTOCOL             GetNextProtocol;
    260 };
    261 
    262 extern EFI_GUID gEmuThunkProtocolGuid;
    263 
    264 #endif
    265