/** @file\r
*\r
-* Copyright (c) 2011, ARM Limited. All rights reserved.\r
+* Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
*\r
* This program and the accompanying materials\r
* are licensed and made available under the terms and conditions of the BSD License\r
*\r
**/\r
\r
+#include <Guid/ArmGlobalVariableHob.h>\r
#include "BdsInternal.h"\r
\r
extern EFI_HANDLE mImageHandle;\r
UINTN CmdLineSize;\r
UINTN InitrdSize;\r
EFI_DEVICE_PATH* Initrd;\r
+ UINT16 LoadOptionIndexSize;\r
\r
if (IS_ARM_BDS_BOOTENTRY (BootOption)) {\r
Status = EFI_UNSUPPORTED;\r
\r
// Get the FDT device path\r
FdtDevicePathSize = GetDevicePathSize (DefaultFdtDevicePath);\r
- Status = GetEnvironmentVariable ((CHAR16 *)L"FDT", DefaultFdtDevicePath, &FdtDevicePathSize, (VOID **)&FdtDevicePath);\r
+ Status = GetEnvironmentVariable ((CHAR16 *)L"Fdt", &gArmGlobalVariableGuid,\r
+ DefaultFdtDevicePath, &FdtDevicePathSize, (VOID **)&FdtDevicePath);\r
ASSERT_EFI_ERROR(Status);\r
\r
Status = BdsBootLinuxFdt (BootOption->FilePathList,\r
Initrd, // Initrd\r
(CHAR8*)(LinuxArguments + 1),\r
FdtDevicePath);\r
+\r
+ FreePool (FdtDevicePath);\r
}\r
} else {\r
+ // Set BootCurrent variable\r
+ LoadOptionIndexSize = sizeof(UINT16);\r
+ gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid,\r
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+ LoadOptionIndexSize, &(BootOption->LoadOptionIndex));\r
+\r
Status = BdsStartEfiApplication (mImageHandle, BootOption->FilePathList, BootOption->OptionalDataSize, BootOption->OptionalData);\r
+\r
+ // Clear BootCurrent variable\r
+ LoadOptionIndexSize = sizeof(UINT16);\r
+ gRT->SetVariable (L"BootCurrent", &gEfiGlobalVariableGuid,\r
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+ 0, NULL);\r
}\r
\r
return Status;\r
InitializeListHead (BootOptionList);\r
\r
// Get the Boot Option Order from the environment variable\r
- Status = GetEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder);\r
+ Status = GetGlobalEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder);\r
if (EFI_ERROR(Status)) {\r
return Status;\r
}\r
}\r
}\r
\r
+ FreePool (BootOrder);\r
+\r
return EFI_SUCCESS;\r
}\r
\r
);\r
\r
// Add the new Boot Index to the list\r
- Status = GetEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder);\r
+ Status = GetGlobalEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder);\r
if (!EFI_ERROR(Status)) {\r
BootOrder = ReallocatePool (BootOrderSize, BootOrderSize + sizeof(UINT16), BootOrder);\r
// Add the new index at the end\r
BootOrder\r
);\r
\r
+ // We only free it if the UEFI Variable 'BootOrder' was already existing\r
+ if (BootOrderSize > sizeof(UINT16)) {\r
+ FreePool (BootOrder);\r
+ }\r
+\r
*BdsLoadOption = BootOption;\r
return Status;\r
}\r
EFI_STATUS Status;\r
\r
// Remove the entry from the BootOrder environment variable\r
- Status = GetEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder);\r
+ Status = GetGlobalEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder);\r
if (!EFI_ERROR(Status)) {\r
BootOrderCount = BootOrderSize / sizeof(UINT16);\r
\r
if (BootOrder[Index] == BootOption->LoadOptionIndex) {\r
// If it the last entry we do not need to rearrange the BootOrder list\r
if (Index + 1 != BootOrderCount) {\r
- CopyMem (&BootOrder[Index],&BootOrder[Index+1], BootOrderCount - (Index + 1));\r
+ CopyMem (\r
+ &BootOrder[Index],\r
+ &BootOrder[Index + 1],\r
+ (BootOrderCount - (Index + 1)) * sizeof(UINT16)\r
+ );\r
}\r
break;\r
}\r
);\r
}\r
\r
+ FreePool (BootOrder);\r
+\r
return EFI_SUCCESS;\r
}\r