summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg/Universal/EbcDxe/EbcInt.c
diff options
context:
space:
mode:
Diffstat (limited to 'MdeModulePkg/Universal/EbcDxe/EbcInt.c')
-rw-r--r--MdeModulePkg/Universal/EbcDxe/EbcInt.c527
1 files changed, 276 insertions, 251 deletions
diff --git a/MdeModulePkg/Universal/EbcDxe/EbcInt.c b/MdeModulePkg/Universal/EbcDxe/EbcInt.c
index a255b4acc3..d2254c2765 100644
--- a/MdeModulePkg/Universal/EbcDxe/EbcInt.c
+++ b/MdeModulePkg/Universal/EbcDxe/EbcInt.c
@@ -20,15 +20,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
//
typedef struct _EBC_THUNK_LIST EBC_THUNK_LIST;
struct _EBC_THUNK_LIST {
- VOID *ThunkBuffer;
- EBC_THUNK_LIST *Next;
+ VOID *ThunkBuffer;
+ EBC_THUNK_LIST *Next;
};
typedef struct _EBC_IMAGE_LIST EBC_IMAGE_LIST;
struct _EBC_IMAGE_LIST {
- EBC_IMAGE_LIST *Next;
- EFI_HANDLE ImageHandle;
- EBC_THUNK_LIST *ThunkList;
+ EBC_IMAGE_LIST *Next;
+ EFI_HANDLE ImageHandle;
+ EBC_THUNK_LIST *ThunkList;
};
/**
@@ -48,8 +48,8 @@ struct _EBC_IMAGE_LIST {
EFI_STATUS
EFIAPI
EbcUnloadImage (
- IN EFI_EBC_PROTOCOL *This,
- IN EFI_HANDLE ImageHandle
+ IN EFI_EBC_PROTOCOL *This,
+ IN EFI_HANDLE ImageHandle
);
/**
@@ -74,10 +74,10 @@ EbcUnloadImage (
EFI_STATUS
EFIAPI
EbcCreateThunk (
- IN EFI_EBC_PROTOCOL *This,
- IN EFI_HANDLE ImageHandle,
- IN VOID *EbcEntryPoint,
- OUT VOID **Thunk
+ IN EFI_EBC_PROTOCOL *This,
+ IN EFI_HANDLE ImageHandle,
+ IN VOID *EbcEntryPoint,
+ OUT VOID **Thunk
);
/**
@@ -94,8 +94,8 @@ EbcCreateThunk (
EFI_STATUS
EFIAPI
EbcGetVersion (
- IN EFI_EBC_PROTOCOL *This,
- IN OUT UINT64 *Version
+ IN EFI_EBC_PROTOCOL *This,
+ IN OUT UINT64 *Version
);
/**
@@ -126,8 +126,8 @@ InitializeEbcCallback (
VOID
EFIAPI
CommonEbcExceptionHandler (
- IN EFI_EXCEPTION_TYPE InterruptType,
- IN EFI_SYSTEM_CONTEXT SystemContext
+ IN EFI_EXCEPTION_TYPE InterruptType,
+ IN EFI_SYSTEM_CONTEXT SystemContext
);
/**
@@ -141,8 +141,8 @@ CommonEbcExceptionHandler (
VOID
EFIAPI
EbcPeriodicNotifyFunction (
- IN EFI_EVENT Event,
- IN VOID *Context
+ IN EFI_EVENT Event,
+ IN VOID *Context
);
/**
@@ -158,13 +158,14 @@ EbcPeriodicNotifyFunction (
EFI_STATUS
EFIAPI
EbcDebugPeriodic (
- IN VM_CONTEXT *VmPtr
+ IN VM_CONTEXT *VmPtr
);
//
// These two functions and the GUID are used to produce an EBC test protocol.
// This functionality is definitely not required for execution.
//
+
/**
Produces an EBC VM test protocol that can be used for regression tests.
@@ -176,7 +177,7 @@ EbcDebugPeriodic (
**/
EFI_STATUS
InitEbcVmTestProtocol (
- IN EFI_HANDLE *IHandle
+ IN EFI_HANDLE *IHandle
);
/**
@@ -204,8 +205,8 @@ EbcVmTestUnsupported (
EFI_STATUS
EFIAPI
EbcRegisterICacheFlush (
- IN EFI_EBC_PROTOCOL *This,
- IN EBC_ICACHE_FLUSH Flush
+ IN EFI_EBC_PROTOCOL *This,
+ IN EBC_ICACHE_FLUSH Flush
);
/**
@@ -222,8 +223,8 @@ EbcRegisterICacheFlush (
EFI_STATUS
EFIAPI
EbcDebugGetMaximumProcessorIndex (
- IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
- OUT UINTN *MaxProcessorIndex
+ IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
+ OUT UINTN *MaxProcessorIndex
);
/**
@@ -308,10 +309,10 @@ EbcDebugRegisterExceptionCallback (
EFI_STATUS
EFIAPI
EbcDebugInvalidateInstructionCache (
- IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
- IN UINTN ProcessorIndex,
- IN VOID *Start,
- IN UINT64 Length
+ IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
+ IN UINTN ProcessorIndex,
+ IN VOID *Start,
+ IN UINT64 Length
);
//
@@ -320,28 +321,28 @@ EbcDebugInvalidateInstructionCache (
// also be global since the execution of an EBC image does not provide
// a This pointer.
//
-EBC_IMAGE_LIST *mEbcImageList = NULL;
+EBC_IMAGE_LIST *mEbcImageList = NULL;
//
// Callback function to flush the icache after thunk creation
//
-EBC_ICACHE_FLUSH mEbcICacheFlush;
+EBC_ICACHE_FLUSH mEbcICacheFlush;
//
// These get set via calls by the debug agent
//
-EFI_PERIODIC_CALLBACK mDebugPeriodicCallback = NULL;
-EFI_EXCEPTION_CALLBACK mDebugExceptionCallback[MAX_EBC_EXCEPTION + 1] = {NULL};
+EFI_PERIODIC_CALLBACK mDebugPeriodicCallback = NULL;
+EFI_EXCEPTION_CALLBACK mDebugExceptionCallback[MAX_EBC_EXCEPTION + 1] = { NULL };
-VOID *mStackBuffer[MAX_STACK_NUM];
-EFI_HANDLE mStackBufferIndex[MAX_STACK_NUM];
-UINTN mStackNum = 0;
+VOID *mStackBuffer[MAX_STACK_NUM];
+EFI_HANDLE mStackBufferIndex[MAX_STACK_NUM];
+UINTN mStackNum = 0;
//
// Event for Periodic callback
//
-EFI_EVENT mEbcPeriodicEvent;
-VM_CONTEXT *mVmPtr = NULL;
+EFI_EVENT mEbcPeriodicEvent;
+VM_CONTEXT *mVmPtr = NULL;
/**
Check whether the emulator supports executing a certain PE/COFF image
@@ -359,15 +360,17 @@ VM_CONTEXT *mVmPtr = NULL;
BOOLEAN
EFIAPI
EbcIsImageSupported (
- IN EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL *This,
- IN UINT16 ImageType,
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL
+ IN EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL *This,
+ IN UINT16 ImageType,
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath OPTIONAL
)
{
- if (ImageType != EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION &&
- ImageType != EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER) {
+ if ((ImageType != EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION) &&
+ (ImageType != EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER))
+ {
return FALSE;
}
+
return TRUE;
}
@@ -396,36 +399,44 @@ EbcIsImageSupported (
EFI_STATUS
EFIAPI
EbcRegisterImage (
- IN EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL *This,
- IN EFI_PHYSICAL_ADDRESS ImageBase,
- IN UINT64 ImageSize,
- IN OUT EFI_IMAGE_ENTRY_POINT *EntryPoint
+ IN EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL *This,
+ IN EFI_PHYSICAL_ADDRESS ImageBase,
+ IN UINT64 ImageSize,
+ IN OUT EFI_IMAGE_ENTRY_POINT *EntryPoint
)
{
DEBUG_CODE_BEGIN ();
- PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
- EFI_STATUS Status;
+ PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;
+ EFI_STATUS Status;
- ZeroMem (&ImageContext, sizeof (ImageContext));
+ ZeroMem (&ImageContext, sizeof (ImageContext));
- ImageContext.Handle = (VOID *)(UINTN)ImageBase;
- ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory;
+ ImageContext.Handle = (VOID *)(UINTN)ImageBase;
+ ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory;
- Status = PeCoffLoaderGetImageInfo (&ImageContext);
- if (EFI_ERROR (Status)) {
- return Status;
- }
+ Status = PeCoffLoaderGetImageInfo (&ImageContext);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
- ASSERT (ImageContext.Machine == EFI_IMAGE_MACHINE_EBC);
- ASSERT (ImageContext.ImageType == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION ||
- ImageContext.ImageType == EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER);
+ ASSERT (ImageContext.Machine == EFI_IMAGE_MACHINE_EBC);
+ ASSERT (
+ ImageContext.ImageType == EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION ||
+ ImageContext.ImageType == EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER
+ );
DEBUG_CODE_END ();
- EbcRegisterICacheFlush (NULL,
- (EBC_ICACHE_FLUSH)InvalidateInstructionCacheRange);
-
- return EbcCreateThunk (NULL, (VOID *)(UINTN)ImageBase,
- (VOID *)(UINTN)*EntryPoint, (VOID **)EntryPoint);
+ EbcRegisterICacheFlush (
+ NULL,
+ (EBC_ICACHE_FLUSH)InvalidateInstructionCacheRange
+ );
+
+ return EbcCreateThunk (
+ NULL,
+ (VOID *)(UINTN)ImageBase,
+ (VOID *)(UINTN)*EntryPoint,
+ (VOID **)EntryPoint
+ );
}
/**
@@ -442,14 +453,14 @@ EbcRegisterImage (
EFI_STATUS
EFIAPI
EbcUnregisterImage (
- IN EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL *This,
- IN EFI_PHYSICAL_ADDRESS ImageBase
+ IN EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL *This,
+ IN EFI_PHYSICAL_ADDRESS ImageBase
)
{
return EbcUnloadImage (NULL, (VOID *)(UINTN)ImageBase);
}
-STATIC EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL mPeCoffEmuProtocol = {
+STATIC EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL mPeCoffEmuProtocol = {
EbcIsImageSupported,
EbcRegisterImage,
EbcUnregisterImage,
@@ -470,8 +481,8 @@ STATIC EDKII_PECOFF_IMAGE_EMULATOR_PROTOCOL mPeCoffEmuProtocol = {
EFI_STATUS
EFIAPI
InitializeEbcDriver (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_EBC_PROTOCOL *EbcProtocol;
@@ -495,24 +506,24 @@ InitializeEbcDriver (
return EFI_OUT_OF_RESOURCES;
}
- EbcProtocol->CreateThunk = EbcCreateThunk;
- EbcProtocol->UnloadImage = EbcUnloadImage;
- EbcProtocol->RegisterICacheFlush = EbcRegisterICacheFlush;
- EbcProtocol->GetVersion = EbcGetVersion;
- mEbcICacheFlush = NULL;
+ EbcProtocol->CreateThunk = EbcCreateThunk;
+ EbcProtocol->UnloadImage = EbcUnloadImage;
+ EbcProtocol->RegisterICacheFlush = EbcRegisterICacheFlush;
+ EbcProtocol->GetVersion = EbcGetVersion;
+ mEbcICacheFlush = NULL;
//
// Find any already-installed EBC protocols and uninstall them
//
- Installed = FALSE;
- HandleBuffer = NULL;
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiEbcProtocolGuid,
- NULL,
- &NumHandles,
- &HandleBuffer
- );
+ Installed = FALSE;
+ HandleBuffer = NULL;
+ Status = gBS->LocateHandleBuffer (
+ ByProtocol,
+ &gEfiEbcProtocolGuid,
+ NULL,
+ &NumHandles,
+ &HandleBuffer
+ );
if (Status == EFI_SUCCESS) {
//
// Loop through the handles
@@ -521,15 +532,16 @@ InitializeEbcDriver (
Status = gBS->HandleProtocol (
HandleBuffer[Index],
&gEfiEbcProtocolGuid,
- (VOID **) &OldEbcProtocol
+ (VOID **)&OldEbcProtocol
);
if (Status == EFI_SUCCESS) {
if (gBS->ReinstallProtocolInterface (
- HandleBuffer[Index],
- &gEfiEbcProtocolGuid,
- OldEbcProtocol,
- EbcProtocol
- ) == EFI_SUCCESS) {
+ HandleBuffer[Index],
+ &gEfiEbcProtocolGuid,
+ OldEbcProtocol,
+ EbcProtocol
+ ) == EFI_SUCCESS)
+ {
Installed = TRUE;
}
}
@@ -540,14 +552,17 @@ InitializeEbcDriver (
FreePool (HandleBuffer);
HandleBuffer = NULL;
}
+
//
// Add the protocol so someone can locate us if we haven't already.
//
if (!Installed) {
Status = gBS->InstallMultipleProtocolInterfaces (
&ImageHandle,
- &gEfiEbcProtocolGuid, EbcProtocol,
- &gEdkiiPeCoffImageEmulatorProtocolGuid, &mPeCoffEmuProtocol,
+ &gEfiEbcProtocolGuid,
+ EbcProtocol,
+ &gEdkiiPeCoffImageEmulatorProtocolGuid,
+ &mPeCoffEmuProtocol,
NULL
);
if (EFI_ERROR (Status)) {
@@ -556,8 +571,8 @@ InitializeEbcDriver (
}
}
- Status = InitEBCStack();
- if (EFI_ERROR(Status)) {
+ Status = InitEBCStack ();
+ if (EFI_ERROR (Status)) {
goto ErrorExit;
}
@@ -570,11 +585,11 @@ InitializeEbcDriver (
goto ErrorExit;
}
- EbcDebugProtocol->Isa = IsaEbc;
- EbcDebugProtocol->GetMaximumProcessorIndex = EbcDebugGetMaximumProcessorIndex;
- EbcDebugProtocol->RegisterPeriodicCallback = EbcDebugRegisterPeriodicCallback;
- EbcDebugProtocol->RegisterExceptionCallback = EbcDebugRegisterExceptionCallback;
- EbcDebugProtocol->InvalidateInstructionCache = EbcDebugInvalidateInstructionCache;
+ EbcDebugProtocol->Isa = IsaEbc;
+ EbcDebugProtocol->GetMaximumProcessorIndex = EbcDebugGetMaximumProcessorIndex;
+ EbcDebugProtocol->RegisterPeriodicCallback = EbcDebugRegisterPeriodicCallback;
+ EbcDebugProtocol->RegisterExceptionCallback = EbcDebugRegisterExceptionCallback;
+ EbcDebugProtocol->InvalidateInstructionCache = EbcDebugInvalidateInstructionCache;
//
// Add the protocol so the debug agent can find us
@@ -592,6 +607,7 @@ InitializeEbcDriver (
FreePool (EbcDebugProtocol);
goto ErrorExit;
}
+
//
// Install EbcDebugSupport Protocol Successfully
// Now we need to initialize the Ebc default Callback
@@ -602,7 +618,7 @@ InitializeEbcDriver (
// Produce a VM test interface protocol. Not required for execution.
//
DEBUG_CODE_BEGIN ();
- InitEbcVmTestProtocol (&ImageHandle);
+ InitEbcVmTestProtocol (&ImageHandle);
DEBUG_CODE_END ();
EbcDebuggerHookInit (ImageHandle, EbcDebugProtocol);
@@ -610,15 +626,15 @@ InitializeEbcDriver (
return EFI_SUCCESS;
ErrorExit:
- FreeEBCStack();
- HandleBuffer = NULL;
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- &gEfiEbcProtocolGuid,
- NULL,
- &NumHandles,
- &HandleBuffer
- );
+ FreeEBCStack ();
+ HandleBuffer = NULL;
+ Status = gBS->LocateHandleBuffer (
+ ByProtocol,
+ &gEfiEbcProtocolGuid,
+ NULL,
+ &NumHandles,
+ &HandleBuffer
+ );
if (Status == EFI_SUCCESS) {
//
// Loop through the handles
@@ -627,7 +643,7 @@ ErrorExit:
Status = gBS->HandleProtocol (
HandleBuffer[Index],
&gEfiEbcProtocolGuid,
- (VOID **) &OldEbcProtocol
+ (VOID **)&OldEbcProtocol
);
if (Status == EFI_SUCCESS) {
gBS->UninstallProtocolInterface (
@@ -649,7 +665,6 @@ ErrorExit:
return Status;
}
-
/**
This is the top-level routine plugged into the EBC protocol. Since thunks
are very processor-specific, from here we dispatch directly to the very
@@ -672,24 +687,23 @@ ErrorExit:
EFI_STATUS
EFIAPI
EbcCreateThunk (
- IN EFI_EBC_PROTOCOL *This,
- IN EFI_HANDLE ImageHandle,
- IN VOID *EbcEntryPoint,
- OUT VOID **Thunk
+ IN EFI_EBC_PROTOCOL *This,
+ IN EFI_HANDLE ImageHandle,
+ IN VOID *EbcEntryPoint,
+ OUT VOID **Thunk
)
{
EFI_STATUS Status;
Status = EbcCreateThunks (
- ImageHandle,
- EbcEntryPoint,
- Thunk,
- FLAG_THUNK_ENTRY_POINT
- );
+ ImageHandle,
+ EbcEntryPoint,
+ Thunk,
+ FLAG_THUNK_ENTRY_POINT
+ );
return Status;
}
-
/**
This EBC debugger protocol service is called by the debug agent
@@ -704,15 +718,14 @@ EbcCreateThunk (
EFI_STATUS
EFIAPI
EbcDebugGetMaximumProcessorIndex (
- IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
- OUT UINTN *MaxProcessorIndex
+ IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
+ OUT UINTN *MaxProcessorIndex
)
{
*MaxProcessorIndex = 0;
return EFI_SUCCESS;
}
-
/**
This protocol service is called by the debug agent to register a function
for us to call on a periodic basis.
@@ -745,6 +758,7 @@ EbcDebugRegisterPeriodicCallback (
if ((mDebugPeriodicCallback == NULL) && (PeriodicCallback == NULL)) {
return EFI_INVALID_PARAMETER;
}
+
if ((mDebugPeriodicCallback != NULL) && (PeriodicCallback != NULL)) {
return EFI_ALREADY_STARTED;
}
@@ -753,7 +767,6 @@ EbcDebugRegisterPeriodicCallback (
return EFI_SUCCESS;
}
-
/**
This protocol service is called by the debug agent to register a function
for us to call when we detect an exception.
@@ -791,17 +804,19 @@ EbcDebugRegisterExceptionCallback (
if ((ExceptionType < 0) || (ExceptionType > MAX_EBC_EXCEPTION)) {
return EFI_INVALID_PARAMETER;
}
+
if ((mDebugExceptionCallback[ExceptionType] == NULL) && (ExceptionCallback == NULL)) {
return EFI_INVALID_PARAMETER;
}
+
if ((mDebugExceptionCallback[ExceptionType] != NULL) && (ExceptionCallback != NULL)) {
return EFI_ALREADY_STARTED;
}
+
mDebugExceptionCallback[ExceptionType] = ExceptionCallback;
return EFI_SUCCESS;
}
-
/**
This EBC debugger protocol service is called by the debug agent. Required
for DebugSupport compliance but is only stubbed out for EBC.
@@ -821,16 +836,15 @@ EbcDebugRegisterExceptionCallback (
EFI_STATUS
EFIAPI
EbcDebugInvalidateInstructionCache (
- IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
- IN UINTN ProcessorIndex,
- IN VOID *Start,
- IN UINT64 Length
+ IN EFI_DEBUG_SUPPORT_PROTOCOL *This,
+ IN UINTN ProcessorIndex,
+ IN VOID *Start,
+ IN UINT64 Length
)
{
return EFI_SUCCESS;
}
-
/**
The VM interpreter calls this function when an exception is detected.
@@ -844,9 +858,9 @@ EbcDebugInvalidateInstructionCache (
**/
EFI_STATUS
EbcDebugSignalException (
- IN EFI_EXCEPTION_TYPE ExceptionType,
- IN EXCEPTION_FLAGS ExceptionFlags,
- IN VM_CONTEXT *VmPtr
+ IN EFI_EXCEPTION_TYPE ExceptionType,
+ IN EXCEPTION_FLAGS ExceptionFlags,
+ IN VM_CONTEXT *VmPtr
)
{
EFI_SYSTEM_CONTEXT_EBC EbcContext;
@@ -857,7 +871,7 @@ EbcDebugSignalException (
// Save the exception in the context passed in
//
VmPtr->ExceptionFlags |= ExceptionFlags;
- VmPtr->LastException = (UINTN) ExceptionType;
+ VmPtr->LastException = (UINTN)ExceptionType;
//
// If it's a fatal exception, then flag it in the VM context in case an
// attached debugger tries to return from it.
@@ -873,43 +887,41 @@ EbcDebugSignalException (
// status code via the status code API
//
if (mDebugExceptionCallback[ExceptionType] != NULL) {
-
//
// Initialize the context structure
//
- EbcContext.R0 = (UINT64) VmPtr->Gpr[0];
- EbcContext.R1 = (UINT64) VmPtr->Gpr[1];
- EbcContext.R2 = (UINT64) VmPtr->Gpr[2];
- EbcContext.R3 = (UINT64) VmPtr->Gpr[3];
- EbcContext.R4 = (UINT64) VmPtr->Gpr[4];
- EbcContext.R5 = (UINT64) VmPtr->Gpr[5];
- EbcContext.R6 = (UINT64) VmPtr->Gpr[6];
- EbcContext.R7 = (UINT64) VmPtr->Gpr[7];
- EbcContext.Ip = (UINT64)(UINTN)VmPtr->Ip;
- EbcContext.Flags = VmPtr->Flags;
- EbcContext.ControlFlags = 0;
- SystemContext.SystemContextEbc = &EbcContext;
-
- mDebugExceptionCallback[ExceptionType] (ExceptionType, SystemContext);
+ EbcContext.R0 = (UINT64)VmPtr->Gpr[0];
+ EbcContext.R1 = (UINT64)VmPtr->Gpr[1];
+ EbcContext.R2 = (UINT64)VmPtr->Gpr[2];
+ EbcContext.R3 = (UINT64)VmPtr->Gpr[3];
+ EbcContext.R4 = (UINT64)VmPtr->Gpr[4];
+ EbcContext.R5 = (UINT64)VmPtr->Gpr[5];
+ EbcContext.R6 = (UINT64)VmPtr->Gpr[6];
+ EbcContext.R7 = (UINT64)VmPtr->Gpr[7];
+ EbcContext.Ip = (UINT64)(UINTN)VmPtr->Ip;
+ EbcContext.Flags = VmPtr->Flags;
+ EbcContext.ControlFlags = 0;
+ SystemContext.SystemContextEbc = &EbcContext;
+
+ mDebugExceptionCallback[ExceptionType](ExceptionType, SystemContext);
//
// Restore the context structure and continue to execute
//
- VmPtr->Gpr[0] = EbcContext.R0;
- VmPtr->Gpr[1] = EbcContext.R1;
- VmPtr->Gpr[2] = EbcContext.R2;
- VmPtr->Gpr[3] = EbcContext.R3;
- VmPtr->Gpr[4] = EbcContext.R4;
- VmPtr->Gpr[5] = EbcContext.R5;
- VmPtr->Gpr[6] = EbcContext.R6;
- VmPtr->Gpr[7] = EbcContext.R7;
- VmPtr->Ip = (VMIP)(UINTN)EbcContext.Ip;
- VmPtr->Flags = EbcContext.Flags;
+ VmPtr->Gpr[0] = EbcContext.R0;
+ VmPtr->Gpr[1] = EbcContext.R1;
+ VmPtr->Gpr[2] = EbcContext.R2;
+ VmPtr->Gpr[3] = EbcContext.R3;
+ VmPtr->Gpr[4] = EbcContext.R4;
+ VmPtr->Gpr[5] = EbcContext.R5;
+ VmPtr->Gpr[6] = EbcContext.R6;
+ VmPtr->Gpr[7] = EbcContext.R7;
+ VmPtr->Ip = (VMIP)(UINTN)EbcContext.Ip;
+ VmPtr->Flags = EbcContext.Flags;
}
return EFI_SUCCESS;
}
-
/**
To install default Callback function for the VM interpreter.
@@ -926,8 +938,8 @@ InitializeEbcCallback (
IN EFI_DEBUG_SUPPORT_PROTOCOL *This
)
{
- INTN Index;
- EFI_STATUS Status;
+ INTN Index;
+ EFI_STATUS Status;
//
// For ExceptionCallback
@@ -951,7 +963,7 @@ InitializeEbcCallback (
&mVmPtr,
&mEbcPeriodicEvent
);
- if (EFI_ERROR(Status)) {
+ if (EFI_ERROR (Status)) {
return Status;
}
@@ -960,14 +972,13 @@ InitializeEbcCallback (
TimerPeriodic,
EBC_VM_PERIODIC_CALLBACK_RATE
);
- if (EFI_ERROR(Status)) {
+ if (EFI_ERROR (Status)) {
return Status;
}
return EFI_SUCCESS;
}
-
/**
The default Exception Callback for the VM interpreter.
In this function, we report status code, and print debug information
@@ -980,8 +991,8 @@ InitializeEbcCallback (
VOID
EFIAPI
CommonEbcExceptionHandler (
- IN EFI_EXCEPTION_TYPE InterruptType,
- IN EFI_SYSTEM_CONTEXT SystemContext
+ IN EFI_EXCEPTION_TYPE InterruptType,
+ IN EFI_SYSTEM_CONTEXT SystemContext
)
{
//
@@ -990,7 +1001,7 @@ CommonEbcExceptionHandler (
DEBUG ((
DEBUG_ERROR,
"EBC Interrupter Version - 0x%016lx\n",
- (UINT64) (((VM_MAJOR_VERSION & 0xFFFF) << 16) | ((VM_MINOR_VERSION & 0xFFFF)))
+ (UINT64)(((VM_MAJOR_VERSION & 0xFFFF) << 16) | ((VM_MINOR_VERSION & 0xFFFF)))
));
DEBUG ((
DEBUG_ERROR,
@@ -1042,10 +1053,9 @@ CommonEbcExceptionHandler (
//
CpuDeadLoop ();
- return ;
+ return;
}
-
/**
The periodic callback function for EBC VM interpreter, which is used
to support the EFI debug support protocol.
@@ -1057,11 +1067,11 @@ CommonEbcExceptionHandler (
VOID
EFIAPI
EbcPeriodicNotifyFunction (
- IN EFI_EVENT Event,
- IN VOID *Context
+ IN EFI_EVENT Event,
+ IN VOID *Context
)
{
- VM_CONTEXT *VmPtr;
+ VM_CONTEXT *VmPtr;
VmPtr = *(VM_CONTEXT **)Context;
@@ -1069,10 +1079,9 @@ EbcPeriodicNotifyFunction (
EbcDebugPeriodic (VmPtr);
}
- return ;
+ return;
}
-
/**
The VM interpreter calls this function on a periodic basis to support
the EFI debug support protocol.
@@ -1086,54 +1095,52 @@ EbcPeriodicNotifyFunction (
EFI_STATUS
EFIAPI
EbcDebugPeriodic (
- IN VM_CONTEXT *VmPtr
+ IN VM_CONTEXT *VmPtr
)
{
- EFI_SYSTEM_CONTEXT_EBC EbcContext;
- EFI_SYSTEM_CONTEXT SystemContext;
+ EFI_SYSTEM_CONTEXT_EBC EbcContext;
+ EFI_SYSTEM_CONTEXT SystemContext;
//
// If someone's registered for periodic callbacks, then call them.
//
if (mDebugPeriodicCallback != NULL) {
-
//
// Initialize the context structure
//
- EbcContext.R0 = (UINT64) VmPtr->Gpr[0];
- EbcContext.R1 = (UINT64) VmPtr->Gpr[1];
- EbcContext.R2 = (UINT64) VmPtr->Gpr[2];
- EbcContext.R3 = (UINT64) VmPtr->Gpr[3];
- EbcContext.R4 = (UINT64) VmPtr->Gpr[4];
- EbcContext.R5 = (UINT64) VmPtr->Gpr[5];
- EbcContext.R6 = (UINT64) VmPtr->Gpr[6];
- EbcContext.R7 = (UINT64) VmPtr->Gpr[7];
- EbcContext.Ip = (UINT64)(UINTN)VmPtr->Ip;
- EbcContext.Flags = VmPtr->Flags;
- EbcContext.ControlFlags = 0;
- SystemContext.SystemContextEbc = &EbcContext;
+ EbcContext.R0 = (UINT64)VmPtr->Gpr[0];
+ EbcContext.R1 = (UINT64)VmPtr->Gpr[1];
+ EbcContext.R2 = (UINT64)VmPtr->Gpr[2];
+ EbcContext.R3 = (UINT64)VmPtr->Gpr[3];
+ EbcContext.R4 = (UINT64)VmPtr->Gpr[4];
+ EbcContext.R5 = (UINT64)VmPtr->Gpr[5];
+ EbcContext.R6 = (UINT64)VmPtr->Gpr[6];
+ EbcContext.R7 = (UINT64)VmPtr->Gpr[7];
+ EbcContext.Ip = (UINT64)(UINTN)VmPtr->Ip;
+ EbcContext.Flags = VmPtr->Flags;
+ EbcContext.ControlFlags = 0;
+ SystemContext.SystemContextEbc = &EbcContext;
mDebugPeriodicCallback (SystemContext);
//
// Restore the context structure and continue to execute
//
- VmPtr->Gpr[0] = EbcContext.R0;
- VmPtr->Gpr[1] = EbcContext.R1;
- VmPtr->Gpr[2] = EbcContext.R2;
- VmPtr->Gpr[3] = EbcContext.R3;
- VmPtr->Gpr[4] = EbcContext.R4;
- VmPtr->Gpr[5] = EbcContext.R5;
- VmPtr->Gpr[6] = EbcContext.R6;
- VmPtr->Gpr[7] = EbcContext.R7;
- VmPtr->Ip = (VMIP)(UINTN)EbcContext.Ip;
- VmPtr->Flags = EbcContext.Flags;
+ VmPtr->Gpr[0] = EbcContext.R0;
+ VmPtr->Gpr[1] = EbcContext.R1;
+ VmPtr->Gpr[2] = EbcContext.R2;
+ VmPtr->Gpr[3] = EbcContext.R3;
+ VmPtr->Gpr[4] = EbcContext.R4;
+ VmPtr->Gpr[5] = EbcContext.R5;
+ VmPtr->Gpr[6] = EbcContext.R6;
+ VmPtr->Gpr[7] = EbcContext.R7;
+ VmPtr->Ip = (VMIP)(UINTN)EbcContext.Ip;
+ VmPtr->Flags = EbcContext.Flags;
}
return EFI_SUCCESS;
}
-
/**
This routine is called by the core when an image is being unloaded from
memory. Basically we now have the opportunity to do any necessary cleanup.
@@ -1151,24 +1158,26 @@ EbcDebugPeriodic (
EFI_STATUS
EFIAPI
EbcUnloadImage (
- IN EFI_EBC_PROTOCOL *This,
- IN EFI_HANDLE ImageHandle
+ IN EFI_EBC_PROTOCOL *This,
+ IN EFI_HANDLE ImageHandle
)
{
EBC_THUNK_LIST *ThunkList;
EBC_THUNK_LIST *NextThunkList;
EBC_IMAGE_LIST *ImageList;
EBC_IMAGE_LIST *PrevImageList;
+
//
// First go through our list of known image handles and see if we've already
// created an image list element for this image handle.
//
- ReturnEBCStackByHandle(ImageHandle);
+ ReturnEBCStackByHandle (ImageHandle);
PrevImageList = NULL;
for (ImageList = mEbcImageList; ImageList != NULL; ImageList = ImageList->Next) {
if (ImageList->ImageHandle == ImageHandle) {
break;
}
+
//
// Save the previous so we can connect the lists when we remove this one
//
@@ -1178,6 +1187,7 @@ EbcUnloadImage (
if (ImageList == NULL) {
return EFI_INVALID_PARAMETER;
}
+
//
// Free up all the thunk buffers and thunks list elements for this image
// handle.
@@ -1189,6 +1199,7 @@ EbcUnloadImage (
FreePool (ThunkList);
ThunkList = NextThunkList;
}
+
//
// Now remove this image list element from the chain
//
@@ -1200,6 +1211,7 @@ EbcUnloadImage (
} else {
PrevImageList->Next = ImageList->Next;
}
+
//
// Now free up the image list element
//
@@ -1210,7 +1222,6 @@ EbcUnloadImage (
return EFI_SUCCESS;
}
-
/**
Add a thunk to our list of thunks for a given image handle.
Also flush the instruction cache since we've written thunk code
@@ -1226,9 +1237,9 @@ EbcUnloadImage (
**/
EFI_STATUS
EbcAddImageThunk (
- IN EFI_HANDLE ImageHandle,
- IN VOID *ThunkBuffer,
- IN UINT32 ThunkSize
+ IN EFI_HANDLE ImageHandle,
+ IN VOID *ThunkBuffer,
+ IN UINT32 ThunkSize
)
{
EBC_THUNK_LIST *ThunkList;
@@ -1239,11 +1250,12 @@ EbcAddImageThunk (
// It so far so good, then flush the instruction cache
//
if (mEbcICacheFlush != NULL) {
- Status = mEbcICacheFlush ((EFI_PHYSICAL_ADDRESS) (UINTN) ThunkBuffer, ThunkSize);
+ Status = mEbcICacheFlush ((EFI_PHYSICAL_ADDRESS)(UINTN)ThunkBuffer, ThunkSize);
if (EFI_ERROR (Status)) {
return Status;
}
}
+
//
// Go through our list of known image handles and see if we've already
// created a image list element for this image handle.
@@ -1264,11 +1276,12 @@ EbcAddImageThunk (
return EFI_OUT_OF_RESOURCES;
}
- ImageList->ThunkList = NULL;
- ImageList->ImageHandle = ImageHandle;
- ImageList->Next = mEbcImageList;
- mEbcImageList = ImageList;
+ ImageList->ThunkList = NULL;
+ ImageList->ImageHandle = ImageHandle;
+ ImageList->Next = mEbcImageList;
+ mEbcImageList = ImageList;
}
+
//
// Ok, now create a new thunk element to add to the list
//
@@ -1277,12 +1290,13 @@ EbcAddImageThunk (
if (ThunkList == NULL) {
return EFI_OUT_OF_RESOURCES;
}
+
//
// Add it to the head of the list
//
- ThunkList->Next = ImageList->ThunkList;
- ThunkList->ThunkBuffer = ThunkBuffer;
- ImageList->ThunkList = ThunkList;
+ ThunkList->Next = ImageList->ThunkList;
+ ThunkList->ThunkBuffer = ThunkBuffer;
+ ImageList->ThunkList = ThunkList;
return EFI_SUCCESS;
}
@@ -1299,8 +1313,8 @@ EbcAddImageThunk (
EFI_STATUS
EFIAPI
EbcRegisterICacheFlush (
- IN EFI_EBC_PROTOCOL *This,
- IN EBC_ICACHE_FLUSH Flush
+ IN EFI_EBC_PROTOCOL *This,
+ IN EBC_ICACHE_FLUSH Flush
)
{
mEbcICacheFlush = Flush;
@@ -1321,8 +1335,8 @@ EbcRegisterICacheFlush (
EFI_STATUS
EFIAPI
EbcGetVersion (
- IN EFI_EBC_PROTOCOL *This,
- IN OUT UINT64 *Version
+ IN EFI_EBC_PROTOCOL *This,
+ IN OUT UINT64 *Version
)
{
if (Version == NULL) {
@@ -1347,25 +1361,28 @@ EbcGetVersion (
**/
EFI_STATUS
-GetEBCStack(
- IN EFI_HANDLE Handle,
- OUT VOID **StackBuffer,
- OUT UINTN *BufferIndex
+GetEBCStack (
+ IN EFI_HANDLE Handle,
+ OUT VOID **StackBuffer,
+ OUT UINTN *BufferIndex
)
{
- UINTN Index;
- EFI_TPL OldTpl;
- OldTpl = gBS->RaiseTPL(TPL_HIGH_LEVEL);
- for (Index = 0; Index < mStackNum; Index ++) {
+ UINTN Index;
+ EFI_TPL OldTpl;
+
+ OldTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);
+ for (Index = 0; Index < mStackNum; Index++) {
if (mStackBufferIndex[Index] == NULL) {
mStackBufferIndex[Index] = Handle;
break;
}
}
- gBS->RestoreTPL(OldTpl);
+
+ gBS->RestoreTPL (OldTpl);
if (Index == mStackNum) {
return EFI_OUT_OF_RESOURCES;
}
+
*BufferIndex = Index;
*StackBuffer = mStackBuffer[Index];
return EFI_SUCCESS;
@@ -1380,8 +1397,8 @@ GetEBCStack(
**/
EFI_STATUS
-ReturnEBCStack(
- IN UINTN Index
+ReturnEBCStack (
+ IN UINTN Index
)
{
mStackBufferIndex[Index] = NULL;
@@ -1397,19 +1414,22 @@ ReturnEBCStack(
**/
EFI_STATUS
-ReturnEBCStackByHandle(
- IN EFI_HANDLE Handle
+ReturnEBCStackByHandle (
+ IN EFI_HANDLE Handle
)
{
- UINTN Index;
- for (Index = 0; Index < mStackNum; Index ++) {
+ UINTN Index;
+
+ for (Index = 0; Index < mStackNum; Index++) {
if (mStackBufferIndex[Index] == Handle) {
break;
}
}
+
if (Index == mStackNum) {
return EFI_NOT_FOUND;
}
+
mStackBufferIndex[Index] = NULL;
return EFI_SUCCESS;
}
@@ -1426,20 +1446,21 @@ InitEBCStack (
VOID
)
{
- for (mStackNum = 0; mStackNum < MAX_STACK_NUM; mStackNum ++) {
- mStackBuffer[mStackNum] = AllocatePool(STACK_POOL_SIZE);
+ for (mStackNum = 0; mStackNum < MAX_STACK_NUM; mStackNum++) {
+ mStackBuffer[mStackNum] = AllocatePool (STACK_POOL_SIZE);
mStackBufferIndex[mStackNum] = NULL;
if (mStackBuffer[mStackNum] == NULL) {
break;
}
}
+
if (mStackNum == 0) {
return EFI_OUT_OF_RESOURCES;
}
+
return EFI_SUCCESS;
}
-
/**
Free all EBC stacks allocated before.
@@ -1447,14 +1468,16 @@ InitEBCStack (
**/
EFI_STATUS
-FreeEBCStack(
+FreeEBCStack (
VOID
)
{
- UINTN Index;
- for (Index = 0; Index < mStackNum; Index ++) {
- FreePool(mStackBuffer[Index]);
+ UINTN Index;
+
+ for (Index = 0; Index < mStackNum; Index++) {
+ FreePool (mStackBuffer[Index]);
}
+
return EFI_SUCCESS;
}
@@ -1469,12 +1492,12 @@ FreeEBCStack(
**/
EFI_STATUS
InitEbcVmTestProtocol (
- IN EFI_HANDLE *IHandle
+ IN EFI_HANDLE *IHandle
)
{
- EFI_HANDLE Handle;
- EFI_STATUS Status;
- EFI_EBC_VM_TEST_PROTOCOL *EbcVmTestProtocol;
+ EFI_HANDLE Handle;
+ EFI_STATUS Status;
+ EFI_EBC_VM_TEST_PROTOCOL *EbcVmTestProtocol;
//
// Allocate memory for the protocol, then fill in the fields
@@ -1483,25 +1506,26 @@ InitEbcVmTestProtocol (
if (EbcVmTestProtocol == NULL) {
return EFI_OUT_OF_RESOURCES;
}
- EbcVmTestProtocol->Execute = (EBC_VM_TEST_EXECUTE) EbcExecuteInstructions;
+
+ EbcVmTestProtocol->Execute = (EBC_VM_TEST_EXECUTE)EbcExecuteInstructions;
DEBUG_CODE_BEGIN ();
- EbcVmTestProtocol->Assemble = (EBC_VM_TEST_ASM) EbcVmTestUnsupported;
- EbcVmTestProtocol->Disassemble = (EBC_VM_TEST_DASM) EbcVmTestUnsupported;
+ EbcVmTestProtocol->Assemble = (EBC_VM_TEST_ASM)EbcVmTestUnsupported;
+ EbcVmTestProtocol->Disassemble = (EBC_VM_TEST_DASM)EbcVmTestUnsupported;
DEBUG_CODE_END ();
//
// Publish the protocol
//
- Handle = NULL;
- Status = gBS->InstallProtocolInterface (&Handle, &gEfiEbcVmTestProtocolGuid, EFI_NATIVE_INTERFACE, EbcVmTestProtocol);
+ Handle = NULL;
+ Status = gBS->InstallProtocolInterface (&Handle, &gEfiEbcVmTestProtocolGuid, EFI_NATIVE_INTERFACE, EbcVmTestProtocol);
if (EFI_ERROR (Status)) {
FreePool (EbcVmTestProtocol);
}
+
return Status;
}
-
/**
Returns the EFI_UNSUPPORTED Status.
@@ -1538,5 +1562,6 @@ EbcAllocatePoolForThunk (
if (EFI_ERROR (Status)) {
return NULL;
}
+
return Buffer;
}