ArmPlatformPkg/Bds: Use unaligned read to access OptionalData in EFI_LOAD_OPTION

EFI_LOAD_OPTION is a packed structure. Accessing to the non aligned double word
requires to use ReadUnaligned32() function.



git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11916 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
oliviermartin 2011-06-28 11:55:11 +00:00
parent aa95e2f79c
commit c60ea9a873
2 changed files with 23 additions and 21 deletions

View File

@ -436,7 +436,7 @@ BootMenuMain (
Print(L"\t- %s\n",DevicePathTxt); Print(L"\t- %s\n",DevicePathTxt);
if (BootOption->OptionalData != NULL) { if (BootOption->OptionalData != NULL) {
Print(L"\t- LoaderType: %d\n",BootOption->OptionalData->LoaderType); Print(L"\t- LoaderType: %d\n", ReadUnaligned32 (&BootOption->OptionalData->LoaderType));
if (BootOption->OptionalData->Arguments != NULL) { if (BootOption->OptionalData->Arguments != NULL) {
Print(L"\t- Arguments: %a\n",BootOption->OptionalData->Arguments); Print(L"\t- Arguments: %a\n",BootOption->OptionalData->Arguments);
} }

View File

@ -21,20 +21,22 @@ BootOptionStart (
IN BDS_LOAD_OPTION *BootOption IN BDS_LOAD_OPTION *BootOption
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_DEVICE_PATH* FdtDevicePath; EFI_DEVICE_PATH* FdtDevicePath;
EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL *EfiDevicePathFromTextProtocol; EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL* EfiDevicePathFromTextProtocol;
UINT32 LoaderType;
Status = EFI_UNSUPPORTED; Status = EFI_UNSUPPORTED;
LoaderType = ReadUnaligned32 (&BootOption->OptionalData->LoaderType);
if (BootOption->OptionalData->LoaderType == BDS_LOADER_EFI_APPLICATION) { if (LoaderType == BDS_LOADER_EFI_APPLICATION) {
// Need to connect every drivers to ensure no dependencies are missing for the application // Need to connect every drivers to ensure no dependencies are missing for the application
BdsConnectAllDrivers(); BdsConnectAllDrivers();
Status = BdsStartEfiApplication (mImageHandle, BootOption->FilePathList); Status = BdsStartEfiApplication (mImageHandle, BootOption->FilePathList);
} else if (BootOption->OptionalData->LoaderType == BDS_LOADER_KERNEL_LINUX_ATAG) { } else if (LoaderType == BDS_LOADER_KERNEL_LINUX_ATAG) {
Status = BdsBootLinux (BootOption->FilePathList, BootOption->OptionalData->Arguments, NULL); Status = BdsBootLinux (BootOption->FilePathList, BootOption->OptionalData->Arguments, NULL);
} else if (BootOption->OptionalData->LoaderType == BDS_LOADER_KERNEL_LINUX_FDT) { } else if (LoaderType == BDS_LOADER_KERNEL_LINUX_FDT) {
// Convert the FDT path into a Device Path // Convert the FDT path into a Device Path
Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, (VOID **)&EfiDevicePathFromTextProtocol); Status = gBS->LocateProtocol (&gEfiDevicePathFromTextProtocolGuid, NULL, (VOID **)&EfiDevicePathFromTextProtocol);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR(Status);
@ -178,12 +180,12 @@ BootOptionAllocateBootIndex (
STATIC STATIC
EFI_STATUS EFI_STATUS
BootOptionSetFields ( BootOptionSetFields (
IN BDS_LOAD_OPTION *BootOption, IN BDS_LOAD_OPTION* BootOption,
IN UINT32 Attributes, IN UINT32 Attributes,
IN CHAR16* BootDescription, IN CHAR16* BootDescription,
IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, IN EFI_DEVICE_PATH_PROTOCOL* DevicePath,
IN BDS_LOADER_TYPE BootType, IN BDS_LOADER_TYPE BootType,
IN CHAR8* BootArguments IN CHAR8* BootArguments
) )
{ {
EFI_LOAD_OPTION EfiLoadOption; EFI_LOAD_OPTION EfiLoadOption;
@ -273,17 +275,17 @@ BootOptionSetFields (
EFI_STATUS EFI_STATUS
BootOptionCreate ( BootOptionCreate (
IN UINT32 Attributes, IN UINT32 Attributes,
IN CHAR16* BootDescription, IN CHAR16* BootDescription,
IN EFI_DEVICE_PATH_PROTOCOL* DevicePath, IN EFI_DEVICE_PATH_PROTOCOL* DevicePath,
IN BDS_LOADER_TYPE BootType, IN BDS_LOADER_TYPE BootType,
IN CHAR8* BootArguments, IN CHAR8* BootArguments,
OUT BDS_LOAD_OPTION **BdsLoadOption OUT BDS_LOAD_OPTION **BdsLoadOption
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
BDS_LOAD_OPTION *BootOption; BDS_LOAD_OPTION *BootOption;
CHAR16 BootVariableName[9]; CHAR16 BootVariableName[9];
UINT16 *BootOrder; UINT16 *BootOrder;
UINTN BootOrderSize; UINTN BootOrderSize;