ArmPkg/BdsLib: Move the Generic BDS_LOAD_OPTION structure from Armplatform/Pkg to ArmPkg/Bds

This structure is defined by the UEFI specification and has a better location in BdsLib.


ArmPlatformPkg/Bds: Encapsulate the BDS_LOAD_OPTION into a list entry structure




git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12312 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
oliviermartin 2011-09-09 10:52:31 +00:00
parent 2ccfb71ebe
commit a6e97d28aa
4 changed files with 102 additions and 69 deletions

View File

@ -15,6 +15,25 @@
#ifndef __BDS_ENTRY_H__
#define __BDS_ENTRY_H__
typedef UINT8* EFI_LOAD_OPTION;
/**
This is defined by the UEFI specs, don't change it
**/
typedef struct {
UINT16 LoadOptionIndex;
EFI_LOAD_OPTION LoadOption;
UINTN LoadOptionSize;
UINT32 Attributes;
UINT16 FilePathListLength;
CHAR16 *Description;
EFI_DEVICE_PATH_PROTOCOL *FilePathList;
VOID* OptionalData;
UINTN OptionalDataSize;
} BDS_LOAD_OPTION;
/**
Connect a Device Path and return the handle of the driver that support this DevicePath

View File

@ -71,6 +71,11 @@ typedef struct {
ARM_BDS_LOADER_ARGUMENTS Arguments;
} ARM_BDS_LOADER_OPTIONAL_DATA;
typedef struct {
LIST_ENTRY Link;
BDS_LOAD_OPTION* BdsLoadOption;
} BDS_LOAD_OPTION_ENTRY;
typedef enum {
BDS_DEVICE_FILESYSTEM = 0,
BDS_DEVICE_MEMMAP,
@ -88,23 +93,6 @@ typedef struct {
#define SUPPORTED_BOOT_DEVICE_FROM_LINK(a) BASE_CR(a, BDS_SUPPORTED_DEVICE, Link)
typedef UINT8* EFI_LOAD_OPTION;
/* This is defined by the UEFI specs, don't change it */
typedef struct {
LIST_ENTRY Link;
UINT16 LoadOptionIndex;
EFI_LOAD_OPTION LoadOption;
UINTN LoadOptionSize;
UINT32 Attributes;
UINT16 FilePathListLength;
CHAR16 *Description;
EFI_DEVICE_PATH_PROTOCOL *FilePathList;
BDS_LOADER_OPTIONAL_DATA *OptionalData;
} BDS_LOAD_OPTION;
typedef struct _BDS_LOAD_OPTION_SUPPORT {
BDS_SUPPORTED_DEVICE_TYPE Type;
EFI_STATUS (*ListDevices)(IN OUT LIST_ENTRY* BdsLoadOptionList);
@ -113,7 +101,8 @@ typedef struct _BDS_LOAD_OPTION_SUPPORT {
EFI_STATUS (*UpdateDevicePathNode)(IN EFI_DEVICE_PATH *OldDevicePath, OUT EFI_DEVICE_PATH_PROTOCOL** NewDevicePath, OUT ARM_BDS_LOADER_TYPE *BootType, OUT UINT32 *Attributes);
} BDS_LOAD_OPTION_SUPPORT;
#define LOAD_OPTION_FROM_LINK(a) BASE_CR(a, BDS_LOAD_OPTION, Link)
#define LOAD_OPTION_ENTRY_FROM_LINK(a) BASE_CR(a, BDS_LOAD_OPTION_ENTRY, Link)
#define LOAD_OPTION_FROM_LINK(a) ((BDS_LOAD_OPTION_ENTRY*)BASE_CR(a, BDS_LOAD_OPTION_ENTRY, Link))->BdsLoadOption
EFI_STATUS
GetEnvironmentVariable (

View File

@ -120,7 +120,7 @@ BootMenuAddBootOption (
CHAR8 CmdLine[BOOT_DEVICE_OPTION_MAX];
UINT32 Attributes;
ARM_BDS_LOADER_TYPE BootType;
BDS_LOAD_OPTION *BdsLoadOption;
BDS_LOAD_OPTION_ENTRY *BdsLoadOptionEntry;
EFI_DEVICE_PATH *DevicePath;
EFI_DEVICE_PATH_PROTOCOL *DevicePathNode;
EFI_DEVICE_PATH_PROTOCOL *InitrdPathNode;
@ -192,9 +192,10 @@ BootMenuAddBootOption (
}
// Create new entry
Status = BootOptionCreate (Attributes, BootDescription, DevicePath, BootType, &BootArguments, &BdsLoadOption);
BdsLoadOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool (sizeof(BDS_LOAD_OPTION_ENTRY));
Status = BootOptionCreate (Attributes, BootDescription, DevicePath, BootType, BootArguments, &BdsLoadOptionEntry->BdsLoadOption);
if (!EFI_ERROR(Status)) {
InsertTailList (BootOptionsList,&BdsLoadOption->Link);
InsertTailList (BootOptionsList, &BdsLoadOptionEntry->Link);
}
FREE_DEVICE_PATH:
@ -212,36 +213,43 @@ EXIT:
STATIC
EFI_STATUS
BootMenuSelectBootOption (
IN LIST_ENTRY *BootOptionsList,
IN CONST CHAR16* InputStatement,
OUT BDS_LOAD_OPTION **BdsLoadOption
IN LIST_ENTRY* BootOptionsList,
IN CONST CHAR16* InputStatement,
IN BOOLEAN OnlyArmBdsBootEntry,
OUT BDS_LOAD_OPTION_ENTRY** BdsLoadOptionEntry
)
{
EFI_STATUS Status;
LIST_ENTRY* Entry;
BDS_LOAD_OPTION *BootOption;
UINTN BootOptionSelected;
UINTN BootOptionCount;
UINTN Index;
EFI_STATUS Status;
LIST_ENTRY* Entry;
BDS_LOAD_OPTION* BdsLoadOption;
UINTN BootOptionSelected;
UINTN BootOptionCount;
UINTN Index;
// Display the list of supported boot devices
BootOptionCount = 1;
for (Entry = GetFirstNode (BootOptionsList);
!IsNull (BootOptionsList,Entry);
Entry = GetNextNode (BootOptionsList,Entry)
Entry = GetNextNode (BootOptionsList, Entry)
)
{
BootOption = LOAD_OPTION_FROM_LINK(Entry);
Print(L"[%d] %s\n",BootOptionCount,BootOption->Description);
BdsLoadOption = LOAD_OPTION_FROM_LINK(Entry);
if (OnlyArmBdsBootEntry && !IS_ARM_BDS_BOOTENTRY (BdsLoadOption)) {
continue;
}
Print (L"[%d] %s\n", BootOptionCount, BdsLoadOption->Description);
DEBUG_CODE_BEGIN();
CHAR16* DevicePathTxt;
EFI_DEVICE_PATH_TO_TEXT_PROTOCOL* DevicePathToTextProtocol;
ARM_BDS_LOADER_TYPE LoaderType;
ARM_BDS_LOADER_OPTIONAL_DATA* OptionalData;
Status = gBS->LocateProtocol(&gEfiDevicePathToTextProtocolGuid, NULL, (VOID **)&DevicePathToTextProtocol);
ASSERT_EFI_ERROR(Status);
DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText(BootOption->FilePathList,TRUE,TRUE);
DevicePathTxt = DevicePathToTextProtocol->ConvertDevicePathToText(BdsLoadOption->FilePathList,TRUE,TRUE);
Print(L"\t- %s\n",DevicePathTxt);
OptionalData = BdsLoadOption->OptionalData;
@ -256,6 +264,11 @@ BootMenuSelectBootOption (
BootOptionCount++;
}
if (BootOptionCount == 0) {
Print (L"No supported Boot Entry.\n");
return EFI_NOT_FOUND;
}
// Get the index of the boot device to delete
BootOptionSelected = 0;
while (BootOptionSelected == 0) {
@ -277,7 +290,7 @@ BootMenuSelectBootOption (
)
{
if (Index == BootOptionSelected) {
*BdsLoadOption = LOAD_OPTION_FROM_LINK(Entry);
*BdsLoadOptionEntry = LOAD_OPTION_ENTRY_FROM_LINK(Entry);
break;
}
Index++;
@ -291,16 +304,22 @@ BootMenuRemoveBootOption (
IN LIST_ENTRY *BootOptionsList
)
{
EFI_STATUS Status;
BDS_LOAD_OPTION *BootOption;
EFI_STATUS Status;
BDS_LOAD_OPTION_ENTRY* BootOptionEntry;
Status = BootMenuSelectBootOption (BootOptionsList,L"Delete entry: ",&BootOption);
Status = BootMenuSelectBootOption (BootOptionsList, L"Delete entry: ", FALSE, &BootOptionEntry);
if (EFI_ERROR(Status)) {
return Status;
}
// If the Boot Option was attached to a list remove it
if (!IsListEmpty (&BootOptionEntry->Link)) {
// Remove the entry from the list
RemoveEntryList (&BootOptionEntry->Link);
}
// Delete the BDS Load option structures
BootOptionDelete (BootOption);
BootOptionDelete (BootOptionEntry->BdsLoadOption);
return EFI_SUCCESS;
}
@ -311,6 +330,7 @@ BootMenuUpdateBootOption (
)
{
EFI_STATUS Status;
BDS_LOAD_OPTION_ENTRY *BootOptionEntry;
BDS_LOAD_OPTION *BootOption;
BDS_LOAD_OPTION_SUPPORT* DeviceSupport;
ARM_BDS_LOADER_ARGUMENTS* BootArguments;
@ -324,10 +344,11 @@ BootMenuUpdateBootOption (
UINTN InitrdSize;
UINTN CmdLineSize;
Status = BootMenuSelectBootOption (BootOptionsList,L"Update entry: ",&BootOption);
Status = BootMenuSelectBootOption (BootOptionsList, L"Update entry: ", TRUE, &BootOptionEntry);
if (EFI_ERROR(Status)) {
return Status;
}
BootOption = BootOptionEntry->BdsLoadOption;
// Get the device support for this Boot Option
Status = BootDeviceGetDeviceSupport (BootOption,&DeviceSupport);
@ -494,10 +515,10 @@ BootMenuMain (
BootOption = NULL;
BootMainEntryCount = sizeof(BootMainEntries) / sizeof(struct BOOT_MAIN_ENTRY);
// Get Boot#### list
BootOptionList (&BootOptionsList);
while (TRUE) {
// Get Boot#### list
BootOptionList (&BootOptionsList);
OptionCount = 1;
// Display the Boot options

View File

@ -22,7 +22,6 @@ BootOptionStart (
)
{
EFI_STATUS Status;
EFI_DEVICE_PATH* FdtDevicePath;
EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL* EfiDevicePathFromTextProtocol;
UINT32 LoaderType;
ARM_BDS_LOADER_OPTIONAL_DATA* OptionalData;
@ -34,6 +33,7 @@ BootOptionStart (
UINTN InitrdSize;
EFI_DEVICE_PATH* Initrd;
if (IS_ARM_BDS_BOOTENTRY (BootOption)) {
Status = EFI_UNSUPPORTED;
OptionalData = BootOption->OptionalData;
LoaderType = ReadUnaligned32 ((CONST UINT32*)&OptionalData->Header.LoaderType);
@ -83,6 +83,10 @@ BootOptionStart (
Initrd, // Initrd
(CHAR8*)(LinuxArguments + 1),
FdtDevicePath);
}
} else {
Status = BdsStartEfiApplication (mImageHandle, BootOption->FilePathList);
}
return Status;
}
@ -159,11 +163,12 @@ BootOptionList (
IN OUT LIST_ENTRY *BootOptionList
)
{
EFI_STATUS Status;
UINTN Index;
UINT16 *BootOrder;
UINTN BootOrderSize;
BDS_LOAD_OPTION *BdsLoadOption;
EFI_STATUS Status;
UINTN Index;
UINT16* BootOrder;
UINTN BootOrderSize;
BDS_LOAD_OPTION* BdsLoadOption;
BDS_LOAD_OPTION_ENTRY* BdsLoadOptionEntry;
InitializeListHead (BootOptionList);
@ -176,7 +181,9 @@ BootOptionList (
for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {
Status = BootOptionFromLoadOptionVariable (BootOrder[Index],&BdsLoadOption);
if (!EFI_ERROR(Status)) {
InsertTailList (BootOptionList,&BdsLoadOption->Link);
BdsLoadOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool(sizeof(BDS_LOAD_OPTION_ENTRY));
BdsLoadOptionEntry->BdsLoadOption = BdsLoadOption;
InsertTailList (BootOptionList,&BdsLoadOptionEntry->Link);
}
}
@ -327,21 +334,24 @@ BootOptionCreate (
IN EFI_DEVICE_PATH_PROTOCOL* DevicePath,
IN ARM_BDS_LOADER_TYPE BootType,
IN ARM_BDS_LOADER_ARGUMENTS* BootArguments,
OUT BDS_LOAD_OPTION **BdsLoadOption
OUT BDS_LOAD_OPTION** BdsLoadOption
)
{
EFI_STATUS Status;
BDS_LOAD_OPTION *BootOption;
CHAR16 BootVariableName[9];
UINT16 *BootOrder;
UINTN BootOrderSize;
EFI_STATUS Status;
BDS_LOAD_OPTION_ENTRY* BootOptionEntry;
BDS_LOAD_OPTION* BootOption;
CHAR16 BootVariableName[9];
UINT16* BootOrder;
UINTN BootOrderSize;
//
// Allocate and fill the memory for the BDS Load Option structure
//
BootOption = (BDS_LOAD_OPTION*)AllocateZeroPool(sizeof(BDS_LOAD_OPTION));
BootOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool (sizeof (BDS_LOAD_OPTION_ENTRY));
InitializeListHead (&BootOptionEntry->Link);
BootOptionEntry->BdsLoadOption = (BDS_LOAD_OPTION*)AllocateZeroPool (sizeof(BDS_LOAD_OPTION));
InitializeListHead (&BootOption->Link);
BootOption = BootOptionEntry->BdsLoadOption;
BootOptionSetFields (BootOption, Attributes, BootDescription, DevicePath, BootType, BootArguments);
//
@ -419,17 +429,11 @@ BootOptionDelete (
IN BDS_LOAD_OPTION *BootOption
)
{
UINTN Index;
UINTN BootOrderSize;
UINT16* BootOrder;
UINTN BootOrderCount;
EFI_STATUS Status;
// If the Boot Optiono was attached to a list remove it
if (!IsListEmpty (&BootOption->Link)) {
// Remove the entry from the list
RemoveEntryList (&BootOption->Link);
}
UINTN Index;
UINTN BootOrderSize;
UINT16* BootOrder;
UINTN BootOrderCount;
EFI_STATUS Status;
// Remove the entry from the BootOrder environment variable
Status = GetEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder);