/** @file Emulator Thunk to abstract OS services from pure EFI code Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.
Copyright (c) 2023, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef __EMU_THUNK_PROTOCOL_H__ #define __EMU_THUNK_PROTOCOL_H__ #define EMU_THUNK_PROTOCOL_GUID \ { 0x5CF32E0B, 0x8EDF, 0x2E44, { 0x9C, 0xDA, 0x93, 0x20, 0x5E, 0x99, 0xEC, 0x1C } } // neded for things like EFI_TIME_CAPABILITIES #include #include #include #include typedef struct { VENDOR_DEVICE_PATH VendorDevicePath; UINT32 Instance; } EMU_VENDOR_DEVICE_PATH_NODE; typedef struct { EMU_VENDOR_DEVICE_PATH_NODE Vendor; EFI_DEVICE_PATH_PROTOCOL EndDevicePath; } EMU_THUNK_DEVICE_PATH; typedef struct _EMU_THUNK_PROTOCOL EMU_THUNK_PROTOCOL; typedef UINTN (EFIAPI *EMU_WRITE_STD_ERROR)( IN UINT8 *Buffer, IN UINTN NumberOfBytes ); typedef EFI_STATUS (EFIAPI *EMU_CONFIG_STD_IN)( VOID ); typedef UINTN (EFIAPI *EMU_WRITE_STD_OUT)( IN UINT8 *Buffer, IN UINTN NumberOfBytes ); typedef UINTN (EFIAPI *EMU_READ_STD_IN)( OUT UINT8 *Buffer, IN UINTN NumberOfBytes ); typedef BOOLEAN (EFIAPI *EMU_POLL_STD_IN)( VOID ); typedef VOID * (EFIAPI *EMU_OS_MALLOC)( IN UINTN Size ); typedef VOID * (EFIAPI *EMU_OS_VMALLOC)( IN UINTN Size ); typedef BOOLEAN (EFIAPI *EMU_OS_FREE)( IN VOID *Ptr ); typedef EFI_STATUS (EFIAPI *EMU_PE_COFF_GET_ENTRY_POINT)( IN VOID *Pe32Data, IN OUT VOID **EntryPoint ); typedef VOID (EFIAPI *EMU_PE_COFF_RELOCATE_EXTRA_ACTION)( IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext ); typedef VOID (EFIAPI *EMU_PE_COFF_UNLOAD_EXTRA_ACTION)( IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext ); typedef VOID (EFIAPI *EMU_ENABLE_INERRUPTS)( VOID ); typedef VOID (EFIAPI *EMU_DISABLE_INERRUPTS)( VOID ); typedef UINT64 (EFIAPI *EMU_QUERY_PERFORMANCE_FREQENCY)( VOID ); typedef UINT64 (EFIAPI *EMU_QUERY_PERFORMANCE_COUNTER)( VOID ); typedef VOID (EFIAPI *EMU_SLEEP)( IN UINT64 Nanoseconds ); typedef VOID (EFIAPI *EMU_CPU_SLEEP)( VOID ); typedef VOID (EFIAPI *EMU_EXIT)( IN UINTN Status ); typedef VOID (EFIAPI *EMU_GET_TIME)( OUT EFI_TIME *Time, OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL ); typedef EFI_STATUS (EFIAPI *EMU_SET_TIME)( IN EFI_TIME *Time ); typedef VOID (EFIAPI EMU_SET_TIMER_CALLBACK)( IN UINT64 DeltaMs ); typedef VOID (EFIAPI *EMU_SET_TIMER)( IN UINT64 PeriodMs, IN EMU_SET_TIMER_CALLBACK CallBack ); /** Enumerates the current set of protocol instances that abstract OS services from EFI. A given protocol can have multiple instances. Usually a protocol is configured via a single PCD string. The data associated for each instance is seperated via a ! in the string. EMU_IO_THUNK_PROTOCOL_CLOSE.ConfigString will contain the information in the PCD string up to the next !. Thus each instance has a unique ConfigString. @param EmuBusDriver TRUE means only return protocol instances that need to be produced by the EmuBusDriver. FALSE means return all possible protocols @param Instance On input the protocol to search for, or NULL to start a search of all the supported protocol instances. @param NextProtocol On output it represents the next value to be passed into Protocol. @param Interface A pointer to the EMU_IO_THUNK_PROTOCOL_CLOSE interface. @retval EFI_SUCCESS The function completed successfully. @retval EFI_NOT_FOUND The next protocol instance was not found. @retval EFI_INVALID_PARAMETER Instance is NULL. **/ typedef EFI_STATUS (EFIAPI *EMU_GET_NEXT_PROTOCOL)( IN BOOLEAN EmuBusDriver, OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL ); struct _EMU_THUNK_PROTOCOL { // Used for early debug printing EMU_WRITE_STD_ERROR WriteStdErr; EMU_CONFIG_STD_IN ConfigStdIn; EMU_WRITE_STD_OUT WriteStdOut; EMU_READ_STD_IN ReadStdIn; EMU_POLL_STD_IN PollStdIn; // // Map OS malloc/free so we can use OS based guard malloc // EMU_OS_MALLOC Malloc; EMU_OS_VMALLOC Valloc; EMU_OS_FREE Free; /// /// PE/COFF loader hooks to get symbols loaded /// EMU_PE_COFF_GET_ENTRY_POINT PeCoffGetEntryPoint; EMU_PE_COFF_RELOCATE_EXTRA_ACTION PeCoffRelocateImageExtraAction; EMU_PE_COFF_UNLOAD_EXTRA_ACTION PeCoffUnloadImageExtraAction; /// /// DXE Architecture Protocol Services /// EMU_ENABLE_INERRUPTS EnableInterrupt; EMU_DISABLE_INERRUPTS DisableInterrupt; EMU_QUERY_PERFORMANCE_FREQENCY QueryPerformanceFrequency; EMU_QUERY_PERFORMANCE_COUNTER QueryPerformanceCounter; EMU_SLEEP Sleep; EMU_CPU_SLEEP CpuSleep; EMU_EXIT Exit; EMU_GET_TIME GetTime; EMU_SET_TIME SetTime; EMU_SET_TIMER SetTimer; /// /// Generic System Services /// EMU_GET_NEXT_PROTOCOL GetNextProtocol; }; extern EFI_GUID gEmuThunkProtocolGuid; #endif