From a475bfa2257644cef606811e2d2e50cb8e08405e Mon Sep 17 00:00:00 2001 From: qhuang8 Date: Fri, 18 Jul 2008 10:02:14 +0000 Subject: [PATCH] 1. Add usb LUD support in BDS 2. Enhance the orignal enumeration logic to check whether a internal shell boot option is valid. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5522 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Library/GenericBdsLib/BdsBoot.c | 42 +++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/MdeModulePkg/Library/GenericBdsLib/BdsBoot.c b/MdeModulePkg/Library/GenericBdsLib/BdsBoot.c index faa371b7b7..14df23af35 100644 --- a/MdeModulePkg/Library/GenericBdsLib/BdsBoot.c +++ b/MdeModulePkg/Library/GenericBdsLib/BdsBoot.c @@ -182,6 +182,11 @@ BdsLibBootViaBootOption ( // InitializeListHead (&TempBootLists); BdsLibRegisterNewOption (&TempBootLists, DevicePath, L"EFI Internal Shell", L"BootOrder"); + // + // free the temporary device path created by BdsLibUpdateFvFileDevicePath() + // + gBS->FreePool (DevicePath); + DevicePath = Option->DevicePath; } // @@ -1515,11 +1520,21 @@ BdsGetBootTypeFromDevicePath ( break; case MESSAGING_DEVICE_PATH: // - // if the device path not only point to driver device, it is not a messaging device path. + // Get the last device path node // LastDeviceNode = NextDevicePathNode (TempDevicePath); + if (DevicePathSubType(LastDeviceNode) == MSG_DEVICE_LOGICAL_UNIT_DP) { + // + // if the next node type is Device Logical Unit, which specify the Logical Unit Number (LUN), + // skit it + // + LastDeviceNode = NextDevicePathNode (LastDeviceNode); + } + // + // if the device path not only point to driver device, it is not a messaging device path, + // if (!IsDevicePathEndType (LastDeviceNode)) { - break; + break; } if (DevicePathSubType(TempDevicePath) == MSG_ATAPI_DP) { @@ -1615,13 +1630,24 @@ BdsLibIsValidEFIBootOptDevicePath ( } // - // If the boot option point to a internal Shell, it is a valid EFI boot option, - // and assume it is ready to boot now + // Check if it's a valid boot option for internal Shell // if (EfiGetNameGuidFromFwVolDevicePathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) LastDeviceNode) != NULL) { - return TRUE; + // + // If the boot option point to Internal FV shell, make sure it is valid + // + TempDevicePath = DevPath; + Status = BdsLibUpdateFvFileDevicePath (&TempDevicePath, &gEfiShellFileGuid); + if (Status == EFI_ALREADY_STARTED) { + return TRUE; + } else { + if (Status == EFI_SUCCESS) { + gBS->FreePool (TempDevicePath); + } + return FALSE; + } } - + // // If the boot option point to a blockIO device, no matter whether or not it is a removeable device, it is a valid EFI boot option // @@ -1825,6 +1851,7 @@ BdsLibUpdateFvFileDevicePath ( // Second, if fail to find, try to enumerate all FV // if (!FindFvFile) { + FvHandleBuffer = NULL; gBS->LocateHandleBuffer ( ByProtocol, &gEfiFirmwareVolume2ProtocolGuid, @@ -1858,6 +1885,9 @@ BdsLibUpdateFvFileDevicePath ( FoundFvHandle = FvHandleBuffer[Index]; break; } + if (FvHandleBuffer !=NULL ) { + FreePool (FvHandleBuffer); + } } if (FindFvFile) {