EmuThunk.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. /** @file
  2. Emulator Thunk to abstract OS services from pure EFI code
  3. Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #ifndef __EMU_THUNK_PROTOCOL_H__
  7. #define __EMU_THUNK_PROTOCOL_H__
  8. #define EMU_THUNK_PROTOCOL_GUID \
  9. { 0x5CF32E0B, 0x8EDF, 0x2E44, { 0x9C, 0xDA, 0x93, 0x20, 0x5E, 0x99, 0xEC, 0x1C } }
  10. // neded for things like EFI_TIME_CAPABILITIES
  11. #include <Uefi.h>
  12. #include <Library/PeCoffExtraActionLib.h>
  13. #include <Protocol/EmuIoThunk.h>
  14. #include <Protocol/DevicePath.h>
  15. typedef struct {
  16. VENDOR_DEVICE_PATH VendorDevicePath;
  17. UINT32 Instance;
  18. } EMU_VENDOR_DEVICE_PATH_NODE;
  19. typedef struct {
  20. EMU_VENDOR_DEVICE_PATH_NODE Vendor;
  21. EFI_DEVICE_PATH_PROTOCOL EndDevicePath;
  22. } EMU_THUNK_DEVICE_PATH;
  23. typedef struct _EMU_THUNK_PROTOCOL EMU_THUNK_PROTOCOL;
  24. typedef
  25. UINTN
  26. (EFIAPI *EMU_WRITE_STD_ERROR)(
  27. IN UINT8 *Buffer,
  28. IN UINTN NumberOfBytes
  29. );
  30. typedef
  31. EFI_STATUS
  32. (EFIAPI *EMU_CONFIG_STD_IN)(
  33. VOID
  34. );
  35. typedef
  36. UINTN
  37. (EFIAPI *EMU_WRITE_STD_OUT)(
  38. IN UINT8 *Buffer,
  39. IN UINTN NumberOfBytes
  40. );
  41. typedef
  42. UINTN
  43. (EFIAPI *EMU_READ_STD_IN)(
  44. OUT UINT8 *Buffer,
  45. IN UINTN NumberOfBytes
  46. );
  47. typedef
  48. BOOLEAN
  49. (EFIAPI *EMU_POLL_STD_IN)(
  50. VOID
  51. );
  52. typedef
  53. VOID *
  54. (EFIAPI *EMU_OS_MALLOC)(
  55. IN UINTN Size
  56. );
  57. typedef
  58. VOID *
  59. (EFIAPI *EMU_OS_VMALLOC)(
  60. IN UINTN Size
  61. );
  62. typedef
  63. BOOLEAN
  64. (EFIAPI *EMU_OS_FREE)(
  65. IN VOID *Ptr
  66. );
  67. typedef
  68. EFI_STATUS
  69. (EFIAPI *EMU_PE_COFF_GET_ENTRY_POINT)(
  70. IN VOID *Pe32Data,
  71. IN OUT VOID **EntryPoint
  72. );
  73. typedef
  74. VOID
  75. (EFIAPI *EMU_PE_COFF_RELOCATE_EXTRA_ACTION)(
  76. IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
  77. );
  78. typedef
  79. VOID
  80. (EFIAPI *EMU_PE_COFF_UNLOAD_EXTRA_ACTION)(
  81. IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
  82. );
  83. typedef
  84. VOID
  85. (EFIAPI *EMU_ENABLE_INERRUPTS)(
  86. VOID
  87. );
  88. typedef
  89. VOID
  90. (EFIAPI *EMU_DISABLE_INERRUPTS)(
  91. VOID
  92. );
  93. typedef
  94. UINT64
  95. (EFIAPI *EMU_QUERY_PERFORMANCE_FREQENCY)(
  96. VOID
  97. );
  98. typedef
  99. UINT64
  100. (EFIAPI *EMU_QUERY_PERFORMANCE_COUNTER)(
  101. VOID
  102. );
  103. typedef
  104. VOID
  105. (EFIAPI *EMU_SLEEP)(
  106. IN UINT64 Nanoseconds
  107. );
  108. typedef
  109. VOID
  110. (EFIAPI *EMU_CPU_SLEEP)(
  111. VOID
  112. );
  113. typedef
  114. VOID
  115. (EFIAPI *EMU_EXIT)(
  116. IN UINTN Status
  117. );
  118. typedef
  119. VOID
  120. (EFIAPI *EMU_GET_TIME)(
  121. OUT EFI_TIME *Time,
  122. OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
  123. );
  124. typedef
  125. VOID
  126. (EFIAPI *EMU_SET_TIME)(
  127. IN EFI_TIME *Time
  128. );
  129. typedef
  130. VOID
  131. (EFIAPI EMU_SET_TIMER_CALLBACK)(
  132. IN UINT64 DeltaMs
  133. );
  134. typedef
  135. VOID
  136. (EFIAPI *EMU_SET_TIMER)(
  137. IN UINT64 PeriodMs,
  138. IN EMU_SET_TIMER_CALLBACK CallBack
  139. );
  140. /**
  141. Enumerates the current set of protocol instances that abstract OS services from EFI.
  142. A given protocol can have multiple instances. Usually a protocol is configured via a
  143. single PCD string. The data associated for each instance is seperated via a ! in the string.
  144. EMU_IO_THUNK_PROTOCOL_CLOSE.ConfigString will contain the information in the PCD string up to the next !.
  145. Thus each instance has a unique ConfigString.
  146. @param EmuBusDriver TRUE means only return protocol instances that need to be produced
  147. by the EmuBusDriver. FALSE means return all possible protocols
  148. @param Instance On input the protocol to search for, or NULL to start a search
  149. of all the supported protocol instances.
  150. @param NextProtocol On output it represents the next value to be passed into Protocol.
  151. @param Interface A pointer to the EMU_IO_THUNK_PROTOCOL_CLOSE interface.
  152. @retval EFI_SUCCESS The function completed successfully.
  153. @retval EFI_NOT_FOUND The next protocol instance was not found.
  154. @retval EFI_INVALID_PARAMETER Instance is NULL.
  155. **/
  156. typedef
  157. EFI_STATUS
  158. (EFIAPI *EMU_GET_NEXT_PROTOCOL)(
  159. IN BOOLEAN EmuBusDriver,
  160. OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
  161. );
  162. struct _EMU_THUNK_PROTOCOL {
  163. // Used for early debug printing
  164. EMU_WRITE_STD_ERROR WriteStdErr;
  165. EMU_CONFIG_STD_IN ConfigStdIn;
  166. EMU_WRITE_STD_OUT WriteStdOut;
  167. EMU_READ_STD_IN ReadStdIn;
  168. EMU_POLL_STD_IN PollStdIn;
  169. //
  170. // Map OS malloc/free so we can use OS based guard malloc
  171. //
  172. EMU_OS_MALLOC Malloc;
  173. EMU_OS_VMALLOC Valloc;
  174. EMU_OS_FREE Free;
  175. ///
  176. /// PE/COFF loader hooks to get symbols loaded
  177. ///
  178. EMU_PE_COFF_GET_ENTRY_POINT PeCoffGetEntryPoint;
  179. EMU_PE_COFF_RELOCATE_EXTRA_ACTION PeCoffRelocateImageExtraAction;
  180. EMU_PE_COFF_UNLOAD_EXTRA_ACTION PeCoffUnloadImageExtraAction;
  181. ///
  182. /// DXE Architecture Protocol Services
  183. ///
  184. EMU_ENABLE_INERRUPTS EnableInterrupt;
  185. EMU_DISABLE_INERRUPTS DisableInterrupt;
  186. EMU_QUERY_PERFORMANCE_FREQENCY QueryPerformanceFrequency;
  187. EMU_QUERY_PERFORMANCE_COUNTER QueryPerformanceCounter;
  188. EMU_SLEEP Sleep;
  189. EMU_CPU_SLEEP CpuSleep;
  190. EMU_EXIT Exit;
  191. EMU_GET_TIME GetTime;
  192. EMU_SET_TIME SetTime;
  193. EMU_SET_TIMER SetTimer;
  194. ///
  195. /// Generic System Services
  196. ///
  197. EMU_GET_NEXT_PROTOCOL GetNextProtocol;
  198. };
  199. extern EFI_GUID gEmuThunkProtocolGuid;
  200. #endif