X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FLibrary%2FDxeReportStatusCodeLib%2FReportStatusCodeLib.c;fp=MdeModulePkg%2FLibrary%2FDxeReportStatusCodeLib%2FReportStatusCodeLib.c;h=70b40b9c8a37d5edc45eaa395df390b1f48c89e4;hb=c5e0de8794346f0e11ae63f1e7705e784dcd5f81;hp=f5789c1a71bedcbe4813140e19be85d1099b9c98;hpb=9be899c5cc644d710e3392dedb672bf67b84b9c1;p=mirror_edk2.git diff --git a/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c b/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c index f5789c1a71..70b40b9c8a 100644 --- a/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c +++ b/MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c @@ -25,6 +25,12 @@ #include #include +// +// Define the maximum extended data size that is supported when a status code is +// reported at TPL_HIGH_LEVEL. +// +#define MAX_EXTENDED_DATA_SIZE 0x200 + EFI_STATUS_CODE_PROTOCOL *mReportStatusCodeLibStatusCodeProtocol = NULL; /** @@ -484,6 +490,8 @@ ReportStatusCodeEx ( { EFI_STATUS Status; EFI_STATUS_CODE_DATA *StatusCodeData; + EFI_TPL Tpl; + UINT64 Buffer[MAX_EXTENDED_DATA_SIZE / sizeof (UINT64)]; ASSERT (!((ExtendedData == NULL) && (ExtendedDataSize != 0))); ASSERT (!((ExtendedData != NULL) && (ExtendedDataSize == 0))); @@ -493,12 +501,32 @@ ReportStatusCodeEx ( } // - // Allocate space for the Status Code Header and its buffer + // Retrieve the current TPL // + Tpl = gBS->RaiseTPL (TPL_HIGH_LEVEL); + gBS->RestoreTPL (Tpl); + StatusCodeData = NULL; - gBS->AllocatePool (EfiBootServicesData, sizeof (EFI_STATUS_CODE_DATA) + ExtendedDataSize, (VOID **)&StatusCodeData); + if (Tpl <= TPL_NOTIFY) { + // + // Allocate space for the Status Code Header and its buffer + // + gBS->AllocatePool (EfiBootServicesData, sizeof (EFI_STATUS_CODE_DATA) + ExtendedDataSize, (VOID **)&StatusCodeData); + } + if (StatusCodeData == NULL) { - return EFI_OUT_OF_RESOURCES; + // + // If a buffer could not be allocated, then see if the local variable Buffer can be used + // + if (ExtendedDataSize > (MAX_EXTENDED_DATA_SIZE - sizeof (EFI_STATUS_CODE_DATA))) { + // + // The local variable Buffer not large enough to hold the extended data associated + // with the status code being reported. + // + ASSERT (FALSE); + return EFI_OUT_OF_RESOURCES; + } + StatusCodeData = (EFI_STATUS_CODE_DATA *)Buffer; } // @@ -529,7 +557,9 @@ ReportStatusCodeEx ( // // Free the allocated buffer // - gBS->FreePool (StatusCodeData); + if (StatusCodeData != (EFI_STATUS_CODE_DATA *)Buffer) { + gBS->FreePool (StatusCodeData); + } return Status; }