{\r
EFI_STATUS Status;\r
EFI_STATUS_CODE_DATA *StatusCodeData;\r
+ EFI_TPL Tpl;\r
+ UINT64 Buffer[EFI_STATUS_CODE_DATA_MAX_SIZE / sizeof (UINT64)];\r
\r
ASSERT (!((ExtendedData == NULL) && (ExtendedDataSize != 0)));\r
ASSERT (!((ExtendedData != NULL) && (ExtendedDataSize == 0)));\r
}\r
\r
//\r
- // Allocate space for the Status Code Header and its buffer\r
+ // Retrieve the current TPL\r
//\r
+ Tpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);\r
+ gBS->RestoreTPL (Tpl);\r
+ \r
StatusCodeData = NULL;\r
- gBS->AllocatePool (EfiBootServicesData, sizeof (EFI_STATUS_CODE_DATA) + ExtendedDataSize, (VOID **)&StatusCodeData);\r
+ if (Tpl <= TPL_NOTIFY) {\r
+ //\r
+ // Allocate space for the Status Code Header and its buffer\r
+ //\r
+ gBS->AllocatePool (EfiBootServicesData, sizeof (EFI_STATUS_CODE_DATA) + ExtendedDataSize, (VOID **)&StatusCodeData);\r
+ }\r
+\r
if (StatusCodeData == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
+ //\r
+ // If a buffer could not be allocated, then see if the local variable Buffer can be used\r
+ //\r
+ if (ExtendedDataSize > (EFI_STATUS_CODE_DATA_MAX_SIZE - sizeof (EFI_STATUS_CODE_DATA))) {\r
+ //\r
+ // The local variable Buffer not large enough to hold the extended data associated\r
+ // with the status code being reported.\r
+ //\r
+ ASSERT (FALSE);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ StatusCodeData = (EFI_STATUS_CODE_DATA *)Buffer;\r
}\r
\r
//\r
//\r
// Free the allocated buffer\r
//\r
- gBS->FreePool (StatusCodeData);\r
+ if (StatusCodeData != (EFI_STATUS_CODE_DATA *)Buffer) {\r
+ gBS->FreePool (StatusCodeData);\r
+ }\r
\r
return Status;\r
}\r