summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>2008-07-18 10:02:14 +0000
committerqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>2008-07-18 10:02:14 +0000
commita475bfa2257644cef606811e2d2e50cb8e08405e (patch)
treec51735345a4cf1f716da2ff7aa987d68674afddb
parent49f977a048cc652eaca49a4183b6df2aebe3f497 (diff)
downloadedk2-platforms-a475bfa2257644cef606811e2d2e50cb8e08405e.tar.xz
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
-rw-r--r--MdeModulePkg/Library/GenericBdsLib/BdsBoot.c42
1 files 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) {