TianoCore EDK2 master
|
#include <Uefi.h>
#include <Protocol/DebugSupport.h>
#include <Protocol/Ebc.h>
#include <Protocol/EbcVmTest.h>
#include <Protocol/EbcSimpleDebugger.h>
#include <Protocol/PeCoffImageEmulator.h>
#include <Library/BaseLib.h>
#include <Library/CacheMaintenanceLib.h>
#include <Library/DebugLib.h>
#include <Library/PeCoffLib.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/BaseMemoryLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/MemoryAllocationLib.h>
Go to the source code of this file.
Data Structures | |
struct | EFI_EBC_THUNK_DATA |
Macros | |
#define | FLAG_THUNK_ENTRY_POINT 0x01 |
#define | FLAG_THUNK_PROTOCOL 0x00 |
#define | VM_STACK_KEY_VALUE 0xDEADBEEF |
#define | EFI_TIMER_UNIT_1MS (1000 * 10) |
#define | EBC_VM_PERIODIC_CALLBACK_RATE (1000 * EFI_TIMER_UNIT_1MS) |
#define | STACK_POOL_SIZE (1024 * 1020) |
#define | MAX_STACK_NUM 4 |
#define | EBC_PROTOCOL_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('e', 'b', 'c', 'p') |
#define | EBC_PROTOCOL_PRIVATE_DATA_FROM_THIS(a) CR(a, EBC_PROTOCOL_PRIVATE_DATA, EbcProtocol, EBC_PROTOCOL_PRIVATE_DATA_SIGNATURE) |
Functions | |
EFI_STATUS | EbcCreateThunks (IN EFI_HANDLE ImageHandle, IN VOID *EbcEntryPoint, OUT VOID **Thunk, IN UINT32 Flags) |
EFI_STATUS | EbcAddImageThunk (IN EFI_HANDLE ImageHandle, IN VOID *ThunkBuffer, IN UINT32 ThunkSize) |
UINTN EFIAPI | EbcLLGetEbcEntryPoint (VOID) |
INT64 EFIAPI | EbcLLCALLEXNative (IN UINTN CallAddr, IN UINTN EbcSp, IN VOID *FramePtr) |
VOID | EbcLLCALLEX (IN VM_CONTEXT *VmPtr, IN UINTN FuncAddr, IN UINTN NewStackPointer, IN VOID *FramePtr, IN UINT8 Size) |
EFI_STATUS | GetEBCStack (IN EFI_HANDLE Handle, OUT VOID **StackBuffer, OUT UINTN *BufferIndex) |
EFI_STATUS | ReturnEBCStack (IN UINTN Index) |
EFI_STATUS | InitEBCStack (VOID) |
EFI_STATUS | FreeEBCStack (VOID) |
EFI_STATUS | ReturnEBCStackByHandle (IN EFI_HANDLE Handle) |
VOID *EFIAPI | EbcAllocatePoolForThunk (IN UINTN AllocationSize) |
Variables | |
VM_CONTEXT * | mVmPtr |
Main routines for the EBC interpreter. Includes the initialization and main interpreter routines.
Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
Definition in file EbcInt.h.
#define EBC_PROTOCOL_PRIVATE_DATA_FROM_THIS | ( | a | ) | CR(a, EBC_PROTOCOL_PRIVATE_DATA, EbcProtocol, EBC_PROTOCOL_PRIVATE_DATA_SIGNATURE) |
#define EBC_PROTOCOL_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('e', 'b', 'c', 'p') |
#define EBC_VM_PERIODIC_CALLBACK_RATE (1000 * EFI_TIMER_UNIT_1MS) |
EFI_STATUS EbcAddImageThunk | ( | IN EFI_HANDLE | ImageHandle, |
IN VOID * | ThunkBuffer, | ||
IN UINT32 | ThunkSize | ||
) |
Add a thunk to our list of thunks for a given image handle. Also flush the instruction cache since we've written thunk code to memory that will be executed eventually.
ImageHandle | The image handle to which the thunk is tied. |
ThunkBuffer | The buffer that has been created/allocated. |
ThunkSize | The size of the thunk memory allocated. |
EFI_OUT_OF_RESOURCES | Memory allocation failed. |
EFI_SUCCESS | The function completed successfully. |
EFI_STATUS EbcCreateThunks | ( | IN EFI_HANDLE | ImageHandle, |
IN VOID * | EbcEntryPoint, | ||
OUT VOID ** | Thunk, | ||
IN UINT32 | Flags | ||
) |
Create thunks for an EBC image entry point, or an EBC protocol service.
ImageHandle | Image handle for the EBC image. If not null, then we're creating a thunk for an image entry point. |
EbcEntryPoint | Address of the EBC code that the thunk is to call |
Thunk | Returned thunk we create here |
Flags | Flags indicating options for creating the thunk |
EFI_SUCCESS | The thunk was created successfully. |
EFI_INVALID_PARAMETER | The parameter of EbcEntryPoint is not 16-bit aligned. |
EFI_OUT_OF_RESOURCES | There is not enough memory to created the EBC Thunk. |
EFI_BUFFER_TOO_SMALL | EBC_THUNK_SIZE is not larger enough. |
Definition at line 362 of file EbcSupport.c.
VOID EbcLLCALLEX | ( | IN VM_CONTEXT * | VmPtr, |
IN UINTN | FuncAddr, | ||
IN UINTN | NewStackPointer, | ||
IN VOID * | FramePtr, | ||
IN UINT8 | Size | ||
) |
This function is called to execute an EBC CALLEX instruction. The function check the callee's content to see whether it is common native code or a thunk to another piece of EBC code. If the callee is common native code, use EbcLLCAllEXASM to manipulate, otherwise, set the VM->IP to target EBC code directly to avoid another VM be startup which cost time and stack space.
VmPtr | Pointer to a VM context. |
FuncAddr | Callee's address |
NewStackPointer | New stack pointer after the call |
FramePtr | New frame pointer after the call |
Size | The size of call instruction |
Definition at line 436 of file EbcSupport.c.
This function is called to execute an EBC CALLEX instruction. This instruction requires that we thunk out to external native code. For x64, we switch stacks, copy the arguments to the stack and jump to the specified function. On return, we restore the stack pointer to its original location. Destroys no working registers.
CallAddr | The function address. |
EbcSp | The new EBC stack pointer. |
FramePtr | The frame pointer. |
UINTN EFIAPI EbcLLGetEbcEntryPoint | ( | VOID | ) |
The VM thunk code stuffs an EBC entry point into a processor register. Since we can't use inline assembly to get it from the interpreter C code, stuff it into the return value register and return.
EFI_STATUS FreeEBCStack | ( | VOID | ) |
EFI_STATUS GetEBCStack | ( | IN EFI_HANDLE | Handle, |
OUT VOID ** | StackBuffer, | ||
OUT UINTN * | BufferIndex | ||
) |
Returns the stack index and buffer assosicated with the Handle parameter.
Handle | The EFI handle as the index to the EBC stack. |
StackBuffer | A pointer to hold the returned stack buffer. |
BufferIndex | A pointer to hold the returned stack index. |
EFI_OUT_OF_RESOURCES | The Handle parameter does not correspond to any existing EBC stack. |
EFI_SUCCESS | The stack index and buffer were found and returned to the caller. |
EFI_STATUS InitEBCStack | ( | VOID | ) |
EFI_STATUS ReturnEBCStack | ( | IN UINTN | Index | ) |
EFI_STATUS ReturnEBCStackByHandle | ( | IN EFI_HANDLE | Handle | ) |
|
extern |