]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Universal/Ebc/Dxe/EbcInt.c
1. Advance IP in case of Break(3) in breakpoint exception
[mirror_edk2.git] / EdkModulePkg / Universal / Ebc / Dxe / EbcInt.c
index 52f8d9fad787b5d68bde2633fe3bde230d5cd25f..b42ff170560992b05d32ce7b7981334ddf1baa08 100644 (file)
@@ -178,6 +178,10 @@ static EFI_PERIODIC_CALLBACK  mDebugPeriodicCallback
 static EFI_EXCEPTION_CALLBACK mDebugExceptionCallback[MAX_EBC_EXCEPTION + 1] = {NULL};\r
 static EFI_GUID               mEfiEbcVmTestProtocolGuid = EFI_EBC_VM_TEST_PROTOCOL_GUID;\r
 \r
+static VOID*      mStackBuffer[MAX_STACK_NUM];\r
+static EFI_HANDLE mStackBufferIndex[MAX_STACK_NUM];\r
+static UINTN      mStackNum = 0;\r
+\r
 //\r
 // Event for Periodic callback\r
 //\r
@@ -288,6 +292,12 @@ Returns:
       return Status;\r
     }\r
   }\r
+\r
+  Status = InitEBCStack();\r
+  if (EFI_ERROR(Status)) {\r
+    goto ErrorExit;\r
+  }\r
+\r
   //\r
   // Allocate memory for our debug protocol. Then fill in the blanks.\r
   //\r
@@ -335,6 +345,7 @@ Returns:
   return EFI_SUCCESS;\r
 \r
 ErrorExit:\r
+  FreeEBCStack();\r
   HandleBuffer  = NULL;\r
   Status = gBS->LocateHandleBuffer (\r
                   ByProtocol,\r
@@ -504,7 +515,7 @@ Routine Description:
 Arguments:\r
 \r
   This              - pointer to the caller's debug support protocol interface\r
-  PeriodicCallback  - pointer to the function to call periodically\r
+  ExceptionCallback - pointer to the function to the exception\r
 \r
 Returns:\r
 \r
@@ -867,6 +878,7 @@ Returns:
   // First go through our list of known image handles and see if we've already\r
   // created an image list element for this image handle.\r
   //\r
+  ReturnEBCStackByHandle(ImageHandle);\r
   PrevImageList = NULL;\r
   for (ImageList = mEbcImageList; ImageList != NULL; ImageList = ImageList->Next) {\r
     if (ImageList->ImageHandle == ImageHandle) {\r
@@ -1020,6 +1032,87 @@ EbcGetVersion (
   return EFI_SUCCESS;\r
 }\r
 \r
+EFI_STATUS\r
+GetEBCStack(\r
+  EFI_HANDLE Handle,\r
+  VOID       **StackBuffer,\r
+  UINTN      *BufferIndex\r
+  )\r
+{\r
+  UINTN   Index;\r
+  EFI_TPL OldTpl;\r
+  OldTpl = gBS->RaiseTPL(EFI_TPL_HIGH_LEVEL);\r
+  for (Index = 0; Index < mStackNum; Index ++) {\r
+    if (mStackBufferIndex[Index] == NULL) {\r
+      mStackBufferIndex[Index] = Handle;\r
+      break;\r
+    }\r
+  }\r
+  gBS->RestoreTPL(OldTpl);\r
+  if (Index == mStackNum) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  *BufferIndex = Index;\r
+  *StackBuffer = mStackBuffer[Index];\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+ReturnEBCStack(\r
+  UINTN Index\r
+  )\r
+{\r
+  mStackBufferIndex[Index] =NULL;\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+ReturnEBCStackByHandle(\r
+  EFI_HANDLE Handle\r
+  )\r
+{\r
+  UINTN Index;\r
+  for (Index = 0; Index < mStackNum; Index ++) {\r
+    if (mStackBufferIndex[Index] == Handle) {\r
+      break;\r
+    }\r
+  }\r
+  if (Index == mStackNum) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+  mStackBufferIndex[Index] = NULL;\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+InitEBCStack (\r
+  VOID\r
+  )\r
+{\r
+  for (mStackNum = 0; mStackNum < MAX_STACK_NUM; mStackNum ++) {\r
+    mStackBuffer[mStackNum] = AllocatePool(STACK_POOL_SIZE);\r
+    mStackBufferIndex[mStackNum] = NULL;\r
+    if (mStackBuffer[mStackNum] == NULL) {\r
+      break;\r
+    }\r
+  }\r
+  if (mStackNum == 0) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+FreeEBCStack(\r
+  VOID\r
+  )\r
+{\r
+  UINTN Index;\r
+  for (Index = 0; Index < mStackNum; Index ++) {\r
+    FreePool(mStackBuffer[Index]);\r
+  }\r
+  return EFI_SUCCESS;\r
+}\r
 STATIC\r
 EFI_STATUS\r
 InitEbcVmTestProtocol (\r