]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Universal/Ebc/Dxe/EbcInt.c
I fixed following bugs.
[mirror_edk2.git] / EdkModulePkg / Universal / Ebc / Dxe / EbcInt.c
index 7b15a1a84b4679e347da795c874106dc551f82c4..2a5d48a431f5875ea364201184c074943245167a 100644 (file)
@@ -154,8 +154,8 @@ static EBC_ICACHE_FLUSH       mEbcICacheFlush;
 //\r
 // These get set via calls by the debug agent\r
 //\r
-static EFI_PERIODIC_CALLBACK  mDebugPeriodicCallback    = NULL;\r
-static EFI_EXCEPTION_CALLBACK mDebugExceptionCallback   = NULL;\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
 \r
 EFI_STATUS\r
@@ -405,6 +405,13 @@ Returns:
 \r
 --*/\r
 {\r
+  if ((mDebugPeriodicCallback == NULL) && (PeriodicCallback == NULL)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  if ((mDebugPeriodicCallback != NULL) && (PeriodicCallback != NULL)) {\r
+    return EFI_ALREADY_STARTED;\r
+  }\r
+       \r
   mDebugPeriodicCallback = PeriodicCallback;\r
   return EFI_SUCCESS;\r
 }\r
@@ -437,7 +444,16 @@ Returns:
 \r
 --*/\r
 {\r
-  mDebugExceptionCallback = ExceptionCallback;\r
+  if ((ExceptionType < 0) || (ExceptionType > MAX_EBC_EXCEPTION)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  if ((mDebugExceptionCallback[ExceptionType] == NULL) && (ExceptionCallback == NULL)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  if ((mDebugExceptionCallback[ExceptionType] != NULL) && (ExceptionCallback != NULL)) {\r
+    return EFI_ALREADY_STARTED;\r
+  }\r
+  mDebugExceptionCallback[ExceptionType] = ExceptionCallback;\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -519,13 +535,15 @@ Returns:
   EbcContext.R7                   = VmPtr->R[7];\r
   EbcContext.Ip                   = (UINT64) (UINTN) VmPtr->Ip;\r
   EbcContext.Flags                = VmPtr->Flags;\r
+  EbcContext.ControlFlags         = 0;\r
   SystemContext.SystemContextEbc  = &EbcContext;\r
   //\r
   // If someone's registered for exception callbacks, then call them.\r
   // Otherwise report the status code via the status code API\r
   //\r
-  if (mDebugExceptionCallback != NULL) {\r
-    mDebugExceptionCallback (ExceptionType, SystemContext);\r
+  if ((ExceptionType >= 0) && (ExceptionType <= MAX_EBC_EXCEPTION) &&\r
+      (mDebugExceptionCallback[ExceptionType] != NULL)) {\r
+    mDebugExceptionCallback[ExceptionType] (ExceptionType, SystemContext);\r
   }\r
   //\r
   // Determine if we should report the exception. We report all of them by default,\r
@@ -536,50 +554,50 @@ Returns:
   Report = TRUE;\r
   switch (ExceptionType) {\r
   case EXCEPT_EBC_UNDEFINED:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_UNDEFINED;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_UNDEFINED;\r
     break;\r
 \r
   case EXCEPT_EBC_DIVIDE_ERROR:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_DIVIDE_ERROR;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_DIVIDE_ERROR;\r
     break;\r
 \r
   case EXCEPT_EBC_DEBUG:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_DEBUG;\r
-    Report          = (BOOLEAN) ((mDebugExceptionCallback == NULL) ? TRUE : FALSE);\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_DEBUG;\r
+    Report          = (BOOLEAN) ((mDebugExceptionCallback[ExceptionType] == NULL) ? TRUE : FALSE);\r
     break;\r
 \r
   case EXCEPT_EBC_BREAKPOINT:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_BREAKPOINT;\r
-    Report          = (BOOLEAN) ((mDebugExceptionCallback == NULL) ? TRUE : FALSE);\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_BREAKPOINT;\r
+    Report          = (BOOLEAN) ((mDebugExceptionCallback[ExceptionType] == NULL) ? TRUE : FALSE);\r
     break;\r
 \r
   case EXCEPT_EBC_INVALID_OPCODE:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_INVALID_OPCODE;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_INVALID_OPCODE;\r
     break;\r
 \r
   case EXCEPT_EBC_STACK_FAULT:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_STACK_FAULT;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_STACK_FAULT;\r
     break;\r
 \r
   case EXCEPT_EBC_ALIGNMENT_CHECK:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_ALIGNMENT_CHECK;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_ALIGNMENT_CHECK;\r
     break;\r
 \r
   case EXCEPT_EBC_INSTRUCTION_ENCODING:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_INSTRUCTION_ENCODING;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_INSTRUCTION_ENCODING;\r
     break;\r
 \r
   case EXCEPT_EBC_BAD_BREAK:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_BAD_BREAK;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_BAD_BREAK;\r
     break;\r
 \r
   case EXCEPT_EBC_STEP:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_EBC_STEP;\r
-    Report          = (BOOLEAN) ((mDebugExceptionCallback == NULL) ? TRUE : FALSE);\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_EBC_STEP;\r
+    Report          = (BOOLEAN) ((mDebugExceptionCallback[ExceptionType] == NULL) ? TRUE : FALSE);\r
     break;\r
 \r
   default:\r
-    StatusCodeValue = EFI_SOFTWARE_DXE_BS_DRIVER | EFI_SW_EC_NON_SPECIFIC;\r
+    StatusCodeValue = EFI_SOFTWARE_EBC_EXCEPTION | EFI_SW_EC_NON_SPECIFIC;\r
     break;\r
   }\r
   //\r