]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPlatformPkg/Bds/BootOption.c
ArmPlatformPkg/Bds: Add support for 'BootCurrent'
[mirror_edk2.git] / ArmPlatformPkg / Bds / BootOption.c
index 9354e01d26e5b789a3b2deaca79ea109642bc2ba..289d36a50badb9f44726380a96b53953a9961993 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 *\r
-*  Copyright (c) 2011, ARM Limited. All rights reserved.\r
+*  Copyright (c) 2011-2012, 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
@@ -32,6 +32,7 @@ BootOptionStart (
   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
@@ -54,10 +55,9 @@ BootOptionStart (
         Initrd = NULL;\r
       }\r
 \r
-      Status = BdsBootLinux (BootOption->FilePathList,\r
+      Status = BdsBootLinuxAtag (BootOption->FilePathList,\r
                                  Initrd, // Initrd\r
-                                 (CHAR8*)(LinuxArguments + 1), // CmdLine\r
-                                 NULL);\r
+                                 (CHAR8*)(LinuxArguments + 1)); // CmdLine\r
     } else if (LoaderType == BDS_LOADER_KERNEL_LINUX_FDT) {\r
       LinuxArguments = &(OptionalData->Arguments.LinuxArguments);\r
       CmdLineSize = ReadUnaligned16 ((CONST UINT16*)&LinuxArguments->CmdLineSize);\r
@@ -76,83 +76,30 @@ BootOptionStart (
 \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", DefaultFdtDevicePath, &FdtDevicePathSize, (VOID **)&FdtDevicePath);\r
       ASSERT_EFI_ERROR(Status);\r
 \r
-      Status = BdsBootLinux (BootOption->FilePathList,\r
+      Status = BdsBootLinuxFdt (BootOption->FilePathList,\r
                                 Initrd, // Initrd\r
                                 (CHAR8*)(LinuxArguments + 1),\r
                                 FdtDevicePath);\r
-    }\r
-  } else {\r
-    Status = BdsStartEfiApplication (mImageHandle, BootOption->FilePathList, BootOption->OptionalDataSize, BootOption->OptionalData);\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-BootOptionParseLoadOption (\r
-  IN  EFI_LOAD_OPTION EfiLoadOption,\r
-  IN  UINTN           EfiLoadOptionSize,\r
-  OUT BDS_LOAD_OPTION **BdsLoadOption\r
-  )\r
-{\r
-  BDS_LOAD_OPTION *LoadOption;\r
-  UINTN           FilePathListLength;\r
-  UINTN           DescriptionLength;\r
-\r
-  if (EfiLoadOption == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
 \r
-  if (EfiLoadOptionSize < sizeof(UINT32) + sizeof(UINT16) + sizeof(CHAR16) + sizeof(EFI_DEVICE_PATH_PROTOCOL)) {\r
-    return EFI_BAD_BUFFER_SIZE;\r
-  }\r
-\r
-  LoadOption = (BDS_LOAD_OPTION*)AllocatePool(sizeof(BDS_LOAD_OPTION));\r
-  if (LoadOption == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  LoadOption->LoadOption = EfiLoadOption;\r
-  LoadOption->LoadOptionSize = EfiLoadOptionSize;\r
-\r
-  LoadOption->Attributes    = *(UINT32*)EfiLoadOption;\r
-  FilePathListLength        = *(UINT16*)(EfiLoadOption + sizeof(UINT32));\r
-  LoadOption->Description   = (CHAR16*)(EfiLoadOption + sizeof(UINT32) + sizeof(UINT16));\r
-  DescriptionLength         = StrSize (LoadOption->Description);\r
-  LoadOption->FilePathList  = (EFI_DEVICE_PATH_PROTOCOL*)(EfiLoadOption + sizeof(UINT32) + sizeof(UINT16) + DescriptionLength);\r
-\r
-  if ((UINTN)((UINT8*)LoadOption->FilePathList + FilePathListLength - EfiLoadOption) == EfiLoadOptionSize) {\r
-    LoadOption->OptionalData = NULL;\r
+      FreePool (FdtDevicePath);\r
+    }\r
   } else {\r
-    LoadOption->OptionalData = (BDS_LOADER_OPTIONAL_DATA *)((UINT8*)LoadOption->FilePathList + FilePathListLength);\r
-  }\r
-\r
-  *BdsLoadOption = LoadOption;\r
-  return EFI_SUCCESS;\r
-}\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
-EFI_STATUS\r
-BootOptionFromLoadOptionVariable (\r
-  IN  UINT16            LoadOptionIndex,\r
-  OUT BDS_LOAD_OPTION **BdsLoadOption\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  CHAR16      BootVariableName[9];\r
-  EFI_LOAD_OPTION     EfiLoadOption;\r
-  UINTN               EfiLoadOptionSize;\r
-\r
-  UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", LoadOptionIndex);\r
+    Status = BdsStartEfiApplication (mImageHandle, BootOption->FilePathList, BootOption->OptionalDataSize, BootOption->OptionalData);\r
 \r
-  Status = GetEnvironmentVariable (BootVariableName, NULL, &EfiLoadOptionSize, (VOID**)&EfiLoadOption);\r
-  if (!EFI_ERROR(Status)) {\r
-    Status = BootOptionParseLoadOption (EfiLoadOption,EfiLoadOptionSize,BdsLoadOption);\r
-    if (!EFI_ERROR(Status)) {\r
-      (*BdsLoadOption)->LoadOptionIndex = LoadOptionIndex;\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
@@ -179,7 +126,7 @@ BootOptionList (
   }\r
 \r
   for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {\r
-    Status = BootOptionFromLoadOptionVariable (BootOrder[Index],&BdsLoadOption);\r
+    Status = BootOptionFromLoadOptionIndex (BootOrder[Index], &BdsLoadOption);\r
     if (!EFI_ERROR(Status)) {\r
       BdsLoadOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool(sizeof(BDS_LOAD_OPTION_ENTRY));\r
       BdsLoadOptionEntry->BdsLoadOption = BdsLoadOption;\r
@@ -187,39 +134,9 @@ BootOptionList (
     }\r
   }\r
 \r
-  return EFI_SUCCESS;\r
-}\r
-\r
-UINT16\r
-BootOptionAllocateBootIndex (\r
-  VOID\r
-  )\r
-{\r
-  EFI_STATUS        Status;\r
-  UINTN             Index;\r
-  UINT32            BootIndex;\r
-  UINT16            *BootOrder;\r
-  UINTN             BootOrderSize;\r
-  BOOLEAN           Found;\r
+  FreePool (BootOrder);\r
 \r
-  // Get the Boot Option Order from the environment variable\r
-  Status = GetEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder);\r
-  if (!EFI_ERROR(Status)) {\r
-    for (BootIndex = 0; BootIndex <= 0xFFFF; BootIndex++) {\r
-      Found = FALSE;\r
-      for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {\r
-        if (BootOrder[Index] == BootIndex) {\r
-          Found = TRUE;\r
-          break;\r
-        }\r
-      }\r
-      if (!Found) {\r
-        return BootIndex;\r
-      }\r
-    }\r
-  }\r
-  // Return the first index\r
-  return 0;\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 STATIC\r
@@ -390,6 +307,11 @@ BootOptionCreate (
       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
@@ -461,5 +383,7 @@ BootOptionDelete (
         );\r
   }\r
 \r
+  FreePool (BootOrder);\r
+\r
   return EFI_SUCCESS;\r
 }\r