]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/EbcDxe/EbcInt.c
MdeModulePkg/EbcDxe: rebase to ARRAY_SIZE()
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / EbcInt.c
index e6c463e672d64abbe2beec62837d56750d128ff0..549e0dd8dc1c9c1395ef253f56d18a393d7abb37 100644 (file)
@@ -3,8 +3,8 @@
   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
@@ -23,16 +23,18 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 // 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
@@ -89,7 +91,7 @@ EbcCreateThunk (
   @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
@@ -184,22 +186,23 @@ InitEbcVmTestProtocol (
 \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
@@ -302,7 +305,7 @@ EbcDebugRegisterExceptionCallback (
   @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
@@ -322,29 +325,28 @@ EbcDebugInvalidateInstructionCache (
 // 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
@@ -701,7 +703,7 @@ EbcDebugRegisterExceptionCallback (
   @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
@@ -723,7 +725,7 @@ EbcDebugInvalidateInstructionCache (
   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
@@ -745,7 +747,7 @@ EbcDebugSignalException (
   // 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
@@ -765,14 +767,14 @@ EbcDebugSignalException (
     //\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
@@ -782,14 +784,14 @@ EbcDebugSignalException (
     //\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
@@ -872,10 +874,63 @@ CommonEbcExceptionHandler (
   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
@@ -935,14 +990,14 @@ EbcDebugPeriodic (
     //\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
@@ -953,14 +1008,14 @@ EbcDebugPeriodic (
     //\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
@@ -1120,11 +1175,11 @@ EbcAddImageThunk (
 \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
@@ -1145,7 +1200,7 @@ EbcRegisterICacheFlush (
   @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
@@ -1168,10 +1223,10 @@ EbcGetVersion (
 /**\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
@@ -1204,10 +1259,10 @@ GetEBCStack(
 }\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
@@ -1221,10 +1276,10 @@ ReturnEBCStack(
 }\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
@@ -1249,7 +1304,7 @@ ReturnEBCStackByHandle(
 /**\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
@@ -1326,7 +1381,7 @@ InitEbcVmTestProtocol (
   // 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
@@ -1336,11 +1391,12 @@ InitEbcVmTestProtocol (
 \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