From 61ad8a41e778a5ba86616b68035f1eec1f753cbe Mon Sep 17 00:00:00 2001 From: qwang12 Date: Thu, 18 Sep 2008 08:42:11 +0000 Subject: [PATCH] Remove the GrowBuffer function. Just use the simple way to get the buffer size and then read the buffer. This change improve the readability and save 0x60 byte of data for release build according to MAP file generated for X64 arch. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5924 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Core/Dxe/Image/ImageFile.c | 140 ++++++++---------------- 1 file changed, 48 insertions(+), 92 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Image/ImageFile.c b/MdeModulePkg/Core/Dxe/Image/ImageFile.c index 4d09f452cc..9cb5c48456 100644 --- a/MdeModulePkg/Core/Dxe/Image/ImageFile.c +++ b/MdeModulePkg/Core/Dxe/Image/ImageFile.c @@ -18,6 +18,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. Search a handle to a device on a specified device path that supports a specified protocol, interface of that protocol on that handle is another output. + + @param Protocol The protocol to search for @param FilePath The specified device path @param Interface Interface of the protocol on the handle @@ -261,18 +263,28 @@ CoreOpenImageFile ( // figure out how big the file is. // FileInfo = NULL; - FileInfoSize = sizeof (EFI_FILE_INFO); - while (CoreGrowBuffer (&Status, (VOID **)&FileInfo, FileInfoSize)) { - // - // Automatically allocate buffer of the correct size and make the call - // - Status = FileHandle->GetInfo ( - FileHandle, - &gEfiFileInfoGuid, - &FileInfoSize, - FileInfo - ); + FileInfoSize = 0; + Status = FileHandle->GetInfo ( + FileHandle, + &gEfiFileInfoGuid, + &FileInfoSize, + FileInfo + ); + if (Status == EFI_BUFFER_TOO_SMALL) { + FileInfo = AllocatePool (FileInfoSize); + if (FileInfo != NULL) { + Status = FileHandle->GetInfo ( + FileHandle, + &gEfiFileInfoGuid, + &FileInfoSize, + FileInfo + ); + } else { + Status = EFI_OUT_OF_RESOURCES; + goto Done; + } } + if (!EFI_ERROR (Status)) { // // Allocate space for the file @@ -290,6 +302,7 @@ CoreOpenImageFile ( // Close the file since we are done // FileHandle->Close (FileHandle); + CoreFreePool (FileInfo); } else { Status = EFI_OUT_OF_RESOURCES; } @@ -316,23 +329,31 @@ CoreOpenImageFile ( // // Call LoadFile with the correct buffer size // - while (CoreGrowBuffer (&Status, (VOID **)&ImageFileHandle->Source, ImageFileHandle->SourceSize)) { - Status = LoadFile->LoadFile ( - LoadFile, - TempFilePath, - BootPolicy, - &ImageFileHandle->SourceSize, - ImageFileHandle->Source - ); - // - // If success or other error happens, stop loop - // - if (Status != EFI_BUFFER_TOO_SMALL) { - break; + ASSERT (ImageFileHandle->SourceSize == 0); + ASSERT (ImageFileHandle->Source == NULL); + Status = LoadFile->LoadFile ( + LoadFile, + TempFilePath, + BootPolicy, + &ImageFileHandle->SourceSize, + ImageFileHandle->Source + ); + if (Status == EFI_BUFFER_TOO_SMALL) { + ImageFileHandle->Source = AllocatePool (ImageFileHandle->SourceSize); + if (ImageFileHandle->Source == NULL) { + Status = EFI_OUT_OF_RESOURCES; + } else { + Status = LoadFile->LoadFile ( + LoadFile, + TempFilePath, + BootPolicy, + &ImageFileHandle->SourceSize, + ImageFileHandle->Source + ); } } - if (!EFI_ERROR (Status)) { + if (!EFI_ERROR (Status) || Status == EFI_ALREADY_STARTED) { ImageFileHandle->FreeBuffer = TRUE; goto Done; } @@ -341,15 +362,14 @@ CoreOpenImageFile ( // // Nothing else to try // - DEBUG ((DEBUG_LOAD | DEBUG_WARN, "CoreOpenImageFile: Device did not support a known load protocol\n")); + DEBUG ((DEBUG_LOAD|DEBUG_WARN, "CoreOpenImageFile: Device did not support a known load protocol\n")); Status = EFI_NOT_FOUND; Done: - // // If the file was not accessed, clean up // - if (EFI_ERROR (Status)) { + if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) { if (ImageFileHandle->FreeBuffer) { // // Free the source buffer if we allocated it @@ -407,67 +427,3 @@ CoreReadImageFile ( return EFI_SUCCESS; } -/** - Helper function called as part of the code needed - to allocate the proper sized buffer for various - EFI interfaces. - - @param Status Current status - @param Buffer Current allocated buffer, or NULL - @param BufferSize Current buffer size needed - - @retval TRUE if the buffer was reallocated and the caller - should try the API again. - @retval FALSE buffer could not be allocated and the caller - should not try the API again. - -**/ -BOOLEAN -CoreGrowBuffer ( - IN OUT EFI_STATUS *Status, - IN OUT VOID **Buffer, - IN UINTN BufferSize - ) -{ - BOOLEAN TryAgain; - - TryAgain = FALSE; - // - // If this is an initial request, buffer will be null with a new buffer size - // - if (*Buffer == NULL) { - *Status = EFI_BUFFER_TOO_SMALL; - } - - if (BufferSize == 0) { - return TRUE; - } - - // - // If the status code is "buffer too small", resize the buffer - // - if (*Status == EFI_BUFFER_TOO_SMALL) { - if (*Buffer != NULL) { - CoreFreePool (*Buffer); - } - - *Buffer = AllocatePool (BufferSize); - if (*Buffer != NULL) { - TryAgain = TRUE; - } else { - *Status = EFI_OUT_OF_RESOURCES; - } - } - - // - // If there's an error, free the buffer - // - if ((!TryAgain) && (EFI_ERROR (*Status)) && (*Buffer != NULL)) { - CoreFreePool (*Buffer); - *Buffer = NULL; - } - - return TryAgain; -} - - -- 2.39.2