Provides auxiliary support routines for the VM. That is, routines\r
that are not particularly related to VM execution of EBC instructions.\r
\r
-Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
http://opensource.org/licenses/bsd-license.php\r
// image handles, with each having a linked list of thunks allocated\r
// to that image handle.\r
//\r
-typedef struct _EBC_THUNK_LIST {\r
- VOID *ThunkBuffer;\r
- struct _EBC_THUNK_LIST *Next;\r
-} EBC_THUNK_LIST;\r
-\r
-typedef struct _EBC_IMAGE_LIST {\r
- struct _EBC_IMAGE_LIST *Next;\r
- EFI_HANDLE ImageHandle;\r
- EBC_THUNK_LIST *ThunkList;\r
-} EBC_IMAGE_LIST;\r
+typedef struct _EBC_THUNK_LIST EBC_THUNK_LIST;\r
+struct _EBC_THUNK_LIST {\r
+ VOID *ThunkBuffer;\r
+ EBC_THUNK_LIST *Next;\r
+};\r
+\r
+typedef struct _EBC_IMAGE_LIST EBC_IMAGE_LIST;\r
+struct _EBC_IMAGE_LIST {\r
+ EBC_IMAGE_LIST *Next;\r
+ EFI_HANDLE ImageHandle;\r
+ EBC_THUNK_LIST *ThunkList;\r
+};\r
\r
/**\r
This routine is called by the core when an image is being unloaded from\r
@param This A pointer to the EFI_EBC_PROTOCOL instance.\r
@param Version Pointer to where to store the returned version\r
of the interpreter.\r
- \r
+\r
@retval EFI_SUCCESS The function completed successfully.\r
@retval EFI_INVALID_PARAMETER Version pointer is NULL.\r
\r
\r
/**\r
Returns the EFI_UNSUPPORTED Status.\r
- \r
+\r
@return EFI_UNSUPPORTED This function always return EFI_UNSUPPORTED status.\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
EbcVmTestUnsupported (\r
VOID\r
);\r
\r
/**\r
Registers a callback function that the EBC interpreter calls to flush the\r
- processor instruction cache following creation of thunks. \r
+ processor instruction cache following creation of thunks.\r
\r
@param This A pointer to the EFI_EBC_PROTOCOL instance.\r
@param Flush Pointer to a function of type EBC_ICACH_FLUSH.\r
- \r
+\r
@retval EFI_SUCCESS The function completed successfully.\r
\r
**/\r
@param Start StartSpecifies the physical base of the memory\r
range to be invalidated.\r
@param Length Specifies the minimum number of bytes in the\r
- processor's instruction cache to invalidate. \r
+ processor's instruction cache to invalidate.\r
\r
@retval EFI_SUCCESS The function completed successfully.\r
\r
// also be global since the execution of an EBC image does not provide\r
// a This pointer.\r
//\r
-STATIC EBC_IMAGE_LIST *mEbcImageList = NULL;\r
+EBC_IMAGE_LIST *mEbcImageList = NULL;\r
\r
//\r
// Callback function to flush the icache after thunk creation\r
//\r
-STATIC EBC_ICACHE_FLUSH mEbcICacheFlush;\r
+EBC_ICACHE_FLUSH mEbcICacheFlush;\r
\r
//\r
// These get set via calls by the debug agent\r
//\r
-STATIC EFI_PERIODIC_CALLBACK mDebugPeriodicCallback = NULL;\r
-STATIC EFI_EXCEPTION_CALLBACK mDebugExceptionCallback[MAX_EBC_EXCEPTION + 1] = {NULL};\r
-STATIC EFI_GUID mEfiEbcVmTestProtocolGuid = EFI_EBC_VM_TEST_PROTOCOL_GUID;\r
+EFI_PERIODIC_CALLBACK mDebugPeriodicCallback = NULL;\r
+EFI_EXCEPTION_CALLBACK mDebugExceptionCallback[MAX_EBC_EXCEPTION + 1] = {NULL};\r
\r
-STATIC VOID* mStackBuffer[MAX_STACK_NUM];\r
-STATIC EFI_HANDLE mStackBufferIndex[MAX_STACK_NUM];\r
-STATIC UINTN mStackNum = 0;\r
+VOID *mStackBuffer[MAX_STACK_NUM];\r
+EFI_HANDLE mStackBufferIndex[MAX_STACK_NUM];\r
+UINTN mStackNum = 0;\r
\r
//\r
// Event for Periodic callback\r
//\r
-STATIC EFI_EVENT mEbcPeriodicEvent;\r
-VM_CONTEXT *mVmPtr = NULL;\r
+EFI_EVENT mEbcPeriodicEvent;\r
+VM_CONTEXT *mVmPtr = NULL;\r
\r
\r
/**\r
@param Start StartSpecifies the physical base of the memory\r
range to be invalidated.\r
@param Length Specifies the minimum number of bytes in the\r
- processor's instruction cache to invalidate. \r
+ processor's instruction cache to invalidate.\r
\r
@retval EFI_SUCCESS The function completed successfully.\r
\r
The VM interpreter calls this function when an exception is detected.\r
\r
@param ExceptionType Specifies the processor exception detected.\r
- @param ExceptionFlags Specifies the exception context. \r
+ @param ExceptionFlags Specifies the exception context.\r
@param VmPtr Pointer to a VM context for passing info to the\r
EFI debugger.\r
\r
// Save the exception in the context passed in\r
//\r
VmPtr->ExceptionFlags |= ExceptionFlags;\r
- VmPtr->LastException = ExceptionType;\r
+ VmPtr->LastException = (UINTN) ExceptionType;\r
//\r
// If it's a fatal exception, then flag it in the VM context in case an\r
// attached debugger tries to return from it.\r
//\r
// Initialize the context structure\r
//\r
- EbcContext.R0 = VmPtr->R[0];\r
- EbcContext.R1 = VmPtr->R[1];\r
- EbcContext.R2 = VmPtr->R[2];\r
- EbcContext.R3 = VmPtr->R[3];\r
- EbcContext.R4 = VmPtr->R[4];\r
- EbcContext.R5 = VmPtr->R[5];\r
- EbcContext.R6 = VmPtr->R[6];\r
- EbcContext.R7 = VmPtr->R[7];\r
+ EbcContext.R0 = (UINT64) VmPtr->Gpr[0];\r
+ EbcContext.R1 = (UINT64) VmPtr->Gpr[1];\r
+ EbcContext.R2 = (UINT64) VmPtr->Gpr[2];\r
+ EbcContext.R3 = (UINT64) VmPtr->Gpr[3];\r
+ EbcContext.R4 = (UINT64) VmPtr->Gpr[4];\r
+ EbcContext.R5 = (UINT64) VmPtr->Gpr[5];\r
+ EbcContext.R6 = (UINT64) VmPtr->Gpr[6];\r
+ EbcContext.R7 = (UINT64) VmPtr->Gpr[7];\r
EbcContext.Ip = (UINT64)(UINTN)VmPtr->Ip;\r
EbcContext.Flags = VmPtr->Flags;\r
EbcContext.ControlFlags = 0;\r
//\r
// Restore the context structure and continue to execute\r
//\r
- VmPtr->R[0] = EbcContext.R0;\r
- VmPtr->R[1] = EbcContext.R1;\r
- VmPtr->R[2] = EbcContext.R2;\r
- VmPtr->R[3] = EbcContext.R3;\r
- VmPtr->R[4] = EbcContext.R4;\r
- VmPtr->R[5] = EbcContext.R5;\r
- VmPtr->R[6] = EbcContext.R6;\r
- VmPtr->R[7] = EbcContext.R7;\r
+ VmPtr->Gpr[0] = EbcContext.R0;\r
+ VmPtr->Gpr[1] = EbcContext.R1;\r
+ VmPtr->Gpr[2] = EbcContext.R2;\r
+ VmPtr->Gpr[3] = EbcContext.R3;\r
+ VmPtr->Gpr[4] = EbcContext.R4;\r
+ VmPtr->Gpr[5] = EbcContext.R5;\r
+ VmPtr->Gpr[6] = EbcContext.R6;\r
+ VmPtr->Gpr[7] = EbcContext.R7;\r
VmPtr->Ip = (VMIP)(UINTN)EbcContext.Ip;\r
VmPtr->Flags = EbcContext.Flags;\r
}\r
IN EFI_SYSTEM_CONTEXT SystemContext\r
)\r
{\r
+ //\r
+ // We print debug information to let user know what happen.\r
+ //\r
+ DEBUG ((\r
+ EFI_D_ERROR,\r
+ "EBC Interrupter Version - 0x%016lx\n",\r
+ (UINT64) (((VM_MAJOR_VERSION & 0xFFFF) << 16) | ((VM_MINOR_VERSION & 0xFFFF)))\r
+ ));\r
+ DEBUG ((\r
+ EFI_D_ERROR,\r
+ "Exception Type - 0x%016lx\n",\r
+ (UINT64)(UINTN)InterruptType\r
+ ));\r
+ DEBUG ((\r
+ EFI_D_ERROR,\r
+ " R0 - 0x%016lx, R1 - 0x%016lx\n",\r
+ SystemContext.SystemContextEbc->R0,\r
+ SystemContext.SystemContextEbc->R1\r
+ ));\r
+ DEBUG ((\r
+ EFI_D_ERROR,\r
+ " R2 - 0x%016lx, R3 - 0x%016lx\n",\r
+ SystemContext.SystemContextEbc->R2,\r
+ SystemContext.SystemContextEbc->R3\r
+ ));\r
+ DEBUG ((\r
+ EFI_D_ERROR,\r
+ " R4 - 0x%016lx, R5 - 0x%016lx\n",\r
+ SystemContext.SystemContextEbc->R4,\r
+ SystemContext.SystemContextEbc->R5\r
+ ));\r
+ DEBUG ((\r
+ EFI_D_ERROR,\r
+ " R6 - 0x%016lx, R7 - 0x%016lx\n",\r
+ SystemContext.SystemContextEbc->R6,\r
+ SystemContext.SystemContextEbc->R7\r
+ ));\r
+ DEBUG ((\r
+ EFI_D_ERROR,\r
+ " Flags - 0x%016lx\n",\r
+ SystemContext.SystemContextEbc->Flags\r
+ ));\r
+ DEBUG ((\r
+ EFI_D_ERROR,\r
+ " ControlFlags - 0x%016lx\n",\r
+ SystemContext.SystemContextEbc->ControlFlags\r
+ ));\r
+ DEBUG ((\r
+ EFI_D_ERROR,\r
+ " Ip - 0x%016lx\n\n",\r
+ SystemContext.SystemContextEbc->Ip\r
+ ));\r
+\r
//\r
// We deadloop here to make it easy to debug this issue.\r
//\r
- ASSERT (FALSE);\r
+ CpuDeadLoop ();\r
\r
return ;\r
}\r
//\r
// Initialize the context structure\r
//\r
- EbcContext.R0 = VmPtr->R[0];\r
- EbcContext.R1 = VmPtr->R[1];\r
- EbcContext.R2 = VmPtr->R[2];\r
- EbcContext.R3 = VmPtr->R[3];\r
- EbcContext.R4 = VmPtr->R[4];\r
- EbcContext.R5 = VmPtr->R[5];\r
- EbcContext.R6 = VmPtr->R[6];\r
- EbcContext.R7 = VmPtr->R[7];\r
+ EbcContext.R0 = (UINT64) VmPtr->Gpr[0];\r
+ EbcContext.R1 = (UINT64) VmPtr->Gpr[1];\r
+ EbcContext.R2 = (UINT64) VmPtr->Gpr[2];\r
+ EbcContext.R3 = (UINT64) VmPtr->Gpr[3];\r
+ EbcContext.R4 = (UINT64) VmPtr->Gpr[4];\r
+ EbcContext.R5 = (UINT64) VmPtr->Gpr[5];\r
+ EbcContext.R6 = (UINT64) VmPtr->Gpr[6];\r
+ EbcContext.R7 = (UINT64) VmPtr->Gpr[7];\r
EbcContext.Ip = (UINT64)(UINTN)VmPtr->Ip;\r
EbcContext.Flags = VmPtr->Flags;\r
EbcContext.ControlFlags = 0;\r
//\r
// Restore the context structure and continue to execute\r
//\r
- VmPtr->R[0] = EbcContext.R0;\r
- VmPtr->R[1] = EbcContext.R1;\r
- VmPtr->R[2] = EbcContext.R2;\r
- VmPtr->R[3] = EbcContext.R3;\r
- VmPtr->R[4] = EbcContext.R4;\r
- VmPtr->R[5] = EbcContext.R5;\r
- VmPtr->R[6] = EbcContext.R6;\r
- VmPtr->R[7] = EbcContext.R7;\r
+ VmPtr->Gpr[0] = EbcContext.R0;\r
+ VmPtr->Gpr[1] = EbcContext.R1;\r
+ VmPtr->Gpr[2] = EbcContext.R2;\r
+ VmPtr->Gpr[3] = EbcContext.R3;\r
+ VmPtr->Gpr[4] = EbcContext.R4;\r
+ VmPtr->Gpr[5] = EbcContext.R5;\r
+ VmPtr->Gpr[6] = EbcContext.R6;\r
+ VmPtr->Gpr[7] = EbcContext.R7;\r
VmPtr->Ip = (VMIP)(UINTN)EbcContext.Ip;\r
VmPtr->Flags = EbcContext.Flags;\r
}\r
\r
/**\r
Registers a callback function that the EBC interpreter calls to flush the\r
- processor instruction cache following creation of thunks. \r
+ processor instruction cache following creation of thunks.\r
\r
@param This A pointer to the EFI_EBC_PROTOCOL instance.\r
@param Flush Pointer to a function of type EBC_ICACH_FLUSH.\r
- \r
+\r
@retval EFI_SUCCESS The function completed successfully.\r
\r
**/\r
@param This A pointer to the EFI_EBC_PROTOCOL instance.\r
@param Version Pointer to where to store the returned version\r
of the interpreter.\r
- \r
+\r
@retval EFI_SUCCESS The function completed successfully.\r
@retval EFI_INVALID_PARAMETER Version pointer is NULL.\r
\r
/**\r
Returns the stack index and buffer assosicated with the Handle parameter.\r
\r
- @param Handle The EFI handle as the index to the EBC stack. \r
+ @param Handle The EFI handle as the index to the EBC stack.\r
@param StackBuffer A pointer to hold the returned stack buffer.\r
@param BufferIndex A pointer to hold the returned stack index.\r
- \r
+\r
@retval EFI_OUT_OF_RESOURCES The Handle parameter does not correspond to any\r
existing EBC stack.\r
@retval EFI_SUCCESS The stack index and buffer were found and\r
}\r
\r
/**\r
- Returns from the EBC stack by stack Index. \r
- \r
+ Returns from the EBC stack by stack Index.\r
+\r
@param Index Specifies which EBC stack to return from.\r
- \r
+\r
@retval EFI_SUCCESS The function completed successfully.\r
\r
**/\r
}\r
\r
/**\r
- Returns from the EBC stack associated with the Handle parameter. \r
- \r
+ Returns from the EBC stack associated with the Handle parameter.\r
+\r
@param Handle Specifies the EFI handle to find the EBC stack with.\r
- \r
+\r
@retval EFI_SUCCESS The function completed successfully.\r
\r
**/\r
/**\r
Allocates memory to hold all the EBC stacks.\r
\r
- @retval EFI_SUCCESS The EBC stacks were allocated successfully. \r
+ @retval EFI_SUCCESS The EBC stacks were allocated successfully.\r
@retval EFI_OUT_OF_RESOURCES Not enough memory available for EBC stacks.\r
\r
**/\r
// Publish the protocol\r
//\r
Handle = NULL;\r
- Status = gBS->InstallProtocolInterface (&Handle, &mEfiEbcVmTestProtocolGuid, EFI_NATIVE_INTERFACE, EbcVmTestProtocol);\r
+ Status = gBS->InstallProtocolInterface (&Handle, &gEfiEbcVmTestProtocolGuid, EFI_NATIVE_INTERFACE, EbcVmTestProtocol);\r
if (EFI_ERROR (Status)) {\r
FreePool (EbcVmTestProtocol);\r
}\r
\r
/**\r
Returns the EFI_UNSUPPORTED Status.\r
- \r
+\r
@return EFI_UNSUPPORTED This function always return EFI_UNSUPPORTED status.\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
EbcVmTestUnsupported (\r
VOID\r
)\r