From 6bab33c7b677dea7a67df512ef1a058daeebef57 Mon Sep 17 00:00:00 2001 From: oliviermartin Date: Wed, 15 Jun 2011 19:56:50 +0000 Subject: ArmPlatformPkg/Bds: Fix various bugs in the new BDS The errors were: - uncaught returned error - used of uninitialized variables ArmPlatformPkg/Bds: Implement the update of MemMap Boot Device git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11830 6f19259b-4bc3-4df7-8a09-765794883524 --- ArmPlatformPkg/Bds/BootOption.c | 15 ++++++++----- ArmPlatformPkg/Bds/BootOptionSupport.c | 39 ++++++++++++++++++++++++++++++---- 2 files changed, 45 insertions(+), 9 deletions(-) (limited to 'ArmPlatformPkg') diff --git a/ArmPlatformPkg/Bds/BootOption.c b/ArmPlatformPkg/Bds/BootOption.c index a8ba23fe73..d3c7445fae 100644 --- a/ArmPlatformPkg/Bds/BootOption.c +++ b/ArmPlatformPkg/Bds/BootOption.c @@ -258,8 +258,13 @@ BootOptionSetFields ( CopyMem (&((BDS_LOADER_OPTIONAL_DATA*)EfiLoadOptionPtr)->Arguments, BootArguments, AsciiStrSize(BootArguments)); BootOption->OptionalData = (BDS_LOADER_OPTIONAL_DATA *)EfiLoadOptionPtr; + // If this function is called at the creation of the Boot Device entry (not at the update) the + // BootOption->LoadOptionSize must be zero then we get a new BootIndex for this entry + if (BootOption->LoadOptionSize == 0) { + BootOption->LoadOptionIndex = BootOptionAllocateBootIndex(); + } + // Fill the EFI Load option fields - BootOption->LoadOptionIndex = BootOptionAllocateBootIndex(); BootOption->LoadOption = EfiLoadOption; BootOption->LoadOptionSize = EfiLoadOptionSize; @@ -341,20 +346,20 @@ BootOptionUpdate ( ) { EFI_STATUS Status; - BDS_LOAD_OPTION *BootOption; CHAR16 BootVariableName[9]; // Update the BDS Load Option structure BootOptionSetFields (BdsLoadOption, Attributes, BootDescription, DevicePath, BootType, BootArguments); // Update the related environment variables - UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BootOption->LoadOptionIndex); + UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BdsLoadOption->LoadOptionIndex); + Status = gRT->SetVariable ( BootVariableName, &gEfiGlobalVariableGuid, EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - BootOption->LoadOptionSize, - BootOption->LoadOption + BdsLoadOption->LoadOptionSize, + BdsLoadOption->LoadOption ); return Status; diff --git a/ArmPlatformPkg/Bds/BootOptionSupport.c b/ArmPlatformPkg/Bds/BootOptionSupport.c index 7de2df4825..a4396b5109 100644 --- a/ArmPlatformPkg/Bds/BootOptionSupport.c +++ b/ArmPlatformPkg/Bds/BootOptionSupport.c @@ -386,7 +386,7 @@ BdsLoadOptionFileSystemUpdateDevicePath ( Print(L"File path of the EFI Application or the kernel: "); UnicodeStrToAsciiStr (EndingDevicePath->PathName,AsciiBootFilePath); - Status = EditHIInputAscii(AsciiBootFilePath,BOOT_DEVICE_FILEPATH_MAX); + Status = EditHIInputAscii (AsciiBootFilePath,BOOT_DEVICE_FILEPATH_MAX); if (EFI_ERROR(Status)) { return Status; } @@ -567,9 +567,40 @@ BdsLoadOptionMemMapUpdateDevicePath ( OUT UINT32 *Attributes ) { - ASSERT(0); - //TODO: Implement me - return EFI_SUCCESS; + EFI_STATUS Status; + CHAR8 AsciiStartingAddress[BOOT_DEVICE_ADDRESS_MAX]; + CHAR8 AsciiEndingAddress[BOOT_DEVICE_ADDRESS_MAX]; + MEMMAP_DEVICE_PATH* EndingDevicePath; + EFI_DEVICE_PATH* DevicePath; + + DevicePath = DuplicateDevicePath (BootOption->FilePathList); + EndingDevicePath = (MEMMAP_DEVICE_PATH*)GetLastDevicePathNode (DevicePath); + + Print(L"Starting Address of the binary: "); + AsciiSPrint (AsciiStartingAddress,BOOT_DEVICE_ADDRESS_MAX,"0x%X",(UINTN)EndingDevicePath->StartingAddress); + Status = EditHIInputAscii (AsciiStartingAddress,BOOT_DEVICE_ADDRESS_MAX); + if (EFI_ERROR(Status)) { + return EFI_ABORTED; + } + + Print(L"Ending Address of the binary: "); + AsciiSPrint (AsciiEndingAddress,BOOT_DEVICE_ADDRESS_MAX,"0x%X",(UINTN)EndingDevicePath->EndingAddress); + Status = EditHIInputAscii (AsciiEndingAddress,BOOT_DEVICE_ADDRESS_MAX); + if (EFI_ERROR(Status)) { + return EFI_ABORTED; + } + + EndingDevicePath->StartingAddress = AsciiStrHexToUint64 (AsciiStartingAddress); + EndingDevicePath->EndingAddress = AsciiStrHexToUint64 (AsciiEndingAddress); + + Status = BootDeviceGetType (NULL, BootType, Attributes); + if (EFI_ERROR(Status)) { + FreePool(DevicePath); + } else { + *NewDevicePath = DevicePath; + } + + return Status; } BOOLEAN -- cgit v1.2.3