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
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
return EFI_SUCCESS;\r
\r
ErrorExit:\r
+ FreeEBCStack();\r
HandleBuffer = NULL;\r
Status = gBS->LocateHandleBuffer (\r
ByProtocol,\r
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
// 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
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