ArmPlatformPkg/Bds: Add Linux 'initrd' support to BDS

An 'initrd' file can be specified for a Linux kernel.



git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12169 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
oliviermartin
2011-08-18 13:21:14 +00:00
parent 326d1df919
commit 656416bc2e
11 changed files with 286 additions and 96 deletions

View File

@@ -41,7 +41,7 @@ BdsLoadOptionFileSystemCreateDevicePath (
EFI_STATUS
BdsLoadOptionFileSystemUpdateDevicePath (
IN BDS_LOAD_OPTION *BootOption,
IN EFI_DEVICE_PATH *OldDevicePath,
OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath,
OUT BDS_LOADER_TYPE *BootType,
OUT UINT32 *Attributes
@@ -67,7 +67,7 @@ BdsLoadOptionMemMapCreateDevicePath (
EFI_STATUS
BdsLoadOptionMemMapUpdateDevicePath (
IN BDS_LOAD_OPTION *BootOption,
IN EFI_DEVICE_PATH *OldDevicePath,
OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath,
OUT BDS_LOADER_TYPE *BootType,
OUT UINT32 *Attributes
@@ -93,7 +93,7 @@ BdsLoadOptionPxeCreateDevicePath (
EFI_STATUS
BdsLoadOptionPxeUpdateDevicePath (
IN BDS_LOAD_OPTION *BootOption,
IN EFI_DEVICE_PATH *OldDevicePath,
OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath,
OUT BDS_LOADER_TYPE *BootType,
OUT UINT32 *Attributes
@@ -119,7 +119,7 @@ BdsLoadOptionTftpCreateDevicePath (
EFI_STATUS
BdsLoadOptionTftpUpdateDevicePath (
IN BDS_LOAD_OPTION *BootOption,
IN EFI_DEVICE_PATH *OldDevicePath,
OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath,
OUT BDS_LOADER_TYPE *BootType,
OUT UINT32 *Attributes
@@ -180,7 +180,8 @@ BootDeviceListSupportedInit (
EFI_STATUS
BootDeviceListSupportedFree (
IN LIST_ENTRY *SupportedDeviceList
IN LIST_ENTRY *SupportedDeviceList,
IN BDS_SUPPORTED_DEVICE *Except
)
{
LIST_ENTRY *Entry;
@@ -190,7 +191,9 @@ BootDeviceListSupportedFree (
while (Entry != SupportedDeviceList) {
SupportedDevice = SUPPORTED_BOOT_DEVICE_FROM_LINK(Entry);
Entry = RemoveEntryList (Entry);
FreePool(SupportedDevice);
if (SupportedDevice != Except) {
FreePool(SupportedDevice);
}
}
return EFI_SUCCESS;
@@ -336,12 +339,16 @@ BdsLoadOptionFileSystemCreateDevicePath (
CHAR16 *BootFilePath;
UINTN BootFilePathSize;
Print(L"File path of the EFI Application or the kernel: ");
Status = GetHIInputAscii (AsciiBootFilePath,BOOT_DEVICE_FILEPATH_MAX);
if (EFI_ERROR(Status)) {
return EFI_ABORTED;
}
if (AsciiStrSize(AsciiBootFilePath) == 1) {
*DevicePathNode = NULL;
return EFI_NOT_FOUND;
}
// Convert Ascii into Unicode
BootFilePath = (CHAR16*)AllocatePool(AsciiStrSize(AsciiBootFilePath) * sizeof(CHAR16));
AsciiStrToUnicodeStr (AsciiBootFilePath, BootFilePath);
@@ -355,7 +362,10 @@ BdsLoadOptionFileSystemCreateDevicePath (
CopyMem (FilePathDevicePath->PathName, BootFilePath, BootFilePathSize);
FreePool (BootFilePath);
Status = BootDeviceGetType (FilePathDevicePath->PathName, BootType, Attributes);
if (BootType != NULL || Attributes != NULL) {
Status = BootDeviceGetType (FilePathDevicePath->PathName, BootType, Attributes);
}
if (EFI_ERROR(Status)) {
FreePool (FilePathDevicePath);
} else {
@@ -367,7 +377,7 @@ BdsLoadOptionFileSystemCreateDevicePath (
EFI_STATUS
BdsLoadOptionFileSystemUpdateDevicePath (
IN BDS_LOAD_OPTION *BootOption,
IN EFI_DEVICE_PATH *OldDevicePath,
OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath,
OUT BDS_LOADER_TYPE *BootType,
OUT UINT32 *Attributes
@@ -381,16 +391,21 @@ BdsLoadOptionFileSystemUpdateDevicePath (
FILEPATH_DEVICE_PATH* FilePathDevicePath;
EFI_DEVICE_PATH* DevicePath;
DevicePath = DuplicateDevicePath (BootOption->FilePathList);
EndingDevicePath = (FILEPATH_DEVICE_PATH*)GetLastDevicePathNode (DevicePath);
DevicePath = DuplicateDevicePath(OldDevicePath);
Print(L"File path of the EFI Application or the kernel: ");
EndingDevicePath = (FILEPATH_DEVICE_PATH*)GetLastDevicePathNode (DevicePath);
UnicodeStrToAsciiStr (EndingDevicePath->PathName,AsciiBootFilePath);
Status = EditHIInputAscii (AsciiBootFilePath,BOOT_DEVICE_FILEPATH_MAX);
if (EFI_ERROR(Status)) {
return Status;
}
if (AsciiStrSize(AsciiBootFilePath) == 1) {
*NewDevicePath = NULL;
return EFI_NOT_FOUND;
}
// Convert Ascii into Unicode
BootFilePath = (CHAR16*)AllocatePool(AsciiStrSize(AsciiBootFilePath) * sizeof(CHAR16));
AsciiStrToUnicodeStr (AsciiBootFilePath, BootFilePath);
@@ -409,7 +424,11 @@ BdsLoadOptionFileSystemUpdateDevicePath (
*NewDevicePath = AppendDevicePathNode (DevicePath, (CONST EFI_DEVICE_PATH_PROTOCOL *)FilePathDevicePath);
FreePool(DevicePath);
return BootDeviceGetType (FilePathDevicePath->PathName, BootType, Attributes);
if (BootType != NULL || Attributes != NULL) {
return BootDeviceGetType (FilePathDevicePath->PathName, BootType, Attributes);
}
return EFI_SUCCESS;
}
BOOLEAN
@@ -561,7 +580,7 @@ BdsLoadOptionMemMapCreateDevicePath (
EFI_STATUS
BdsLoadOptionMemMapUpdateDevicePath (
IN BDS_LOAD_OPTION *BootOption,
IN EFI_DEVICE_PATH *OldDevicePath,
OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath,
OUT BDS_LOADER_TYPE *BootType,
OUT UINT32 *Attributes
@@ -573,7 +592,7 @@ BdsLoadOptionMemMapUpdateDevicePath (
MEMMAP_DEVICE_PATH* EndingDevicePath;
EFI_DEVICE_PATH* DevicePath;
DevicePath = DuplicateDevicePath (BootOption->FilePathList);
DevicePath = DuplicateDevicePath (OldDevicePath);
EndingDevicePath = (MEMMAP_DEVICE_PATH*)GetLastDevicePathNode (DevicePath);
Print(L"Starting Address of the binary: ");
@@ -679,7 +698,7 @@ BdsLoadOptionPxeCreateDevicePath (
EFI_STATUS
BdsLoadOptionPxeUpdateDevicePath (
IN BDS_LOAD_OPTION *BootOption,
IN EFI_DEVICE_PATH *OldDevicePath,
OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath,
OUT BDS_LOADER_TYPE *BootType,
OUT UINT32 *Attributes
@@ -847,7 +866,7 @@ BdsLoadOptionTftpCreateDevicePath (
EFI_STATUS
BdsLoadOptionTftpUpdateDevicePath (
IN BDS_LOAD_OPTION *BootOption,
IN EFI_DEVICE_PATH *OldDevicePath,
OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath,
OUT BDS_LOADER_TYPE *BootType,
OUT UINT32 *Attributes