]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPkg/BdsLib: Move some functions used to create/update BDS Boot Entry from ArmPlatf...
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 9 Sep 2011 10:54:33 +0000 (10:54 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 9 Sep 2011 10:54:33 +0000 (10:54 +0000)
These functions can be reused by any EFI application to add/update a BDS Boot Entry.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12314 6f19259b-4bc3-4df7-8a09-765794883524

ArmPkg/Include/Library/BdsLib.h
ArmPkg/Library/BdsLib/BdsHelper.c
ArmPkg/Library/BdsLib/BdsInternal.h
ArmPkg/Library/BdsLib/BdsLib.inf
ArmPlatformPkg/Bds/BdsHelper.c
ArmPlatformPkg/Bds/BootOption.c

index bbbdae895bb936aa4823a4be40cd651ea5d9f5eb..e9337d68cb28f1c3b620c148ec51acc0e4303fbb 100644 (file)
@@ -66,6 +66,36 @@ BdsConnectAllDrivers (
   VOID\r
   );\r
 \r
+EFI_STATUS\r
+GetEnvironmentVariable (\r
+  IN     CONST CHAR16*   VariableName,\r
+  IN     VOID*           DefaultValue,\r
+  IN OUT UINTN*          Size,\r
+  OUT    VOID**          Value\r
+  );\r
+\r
+EFI_STATUS\r
+BootOptionFromLoadOptionIndex (\r
+  IN  UINT16            LoadOptionIndex,\r
+  OUT BDS_LOAD_OPTION** BdsLoadOption\r
+  );\r
+\r
+EFI_STATUS\r
+BootOptionFromLoadOptionVariable (\r
+  IN  CHAR16*           BootVariableName,\r
+  OUT BDS_LOAD_OPTION** BdsLoadOption\r
+  );\r
+\r
+EFI_STATUS\r
+BootOptionToLoadOptionVariable (\r
+  IN BDS_LOAD_OPTION*   BdsLoadOption\r
+  );\r
+\r
+UINT16\r
+BootOptionAllocateBootIndex (\r
+  VOID\r
+  );\r
+\r
 /**\r
   Start a Linux kernel from a Device Path\r
 \r
@@ -123,4 +153,12 @@ BdsLoadApplication (
   IN VOID*                       LoadOptions\r
   );\r
 \r
+EFI_STATUS\r
+BdsLoadImage (\r
+  IN     EFI_DEVICE_PATH       *DevicePath,\r
+  IN     EFI_ALLOCATE_TYPE     Type,\r
+  IN OUT EFI_PHYSICAL_ADDRESS* Image,\r
+  OUT    UINTN                 *FileSize\r
+  );\r
+\r
 #endif\r
index a006e90db40053c3d7c18a9ebde2589bf3a1abde..d971a76b7177b10db6d25edf29bf2f83158d1b0c 100644 (file)
@@ -289,3 +289,56 @@ PrintPerformance (
   CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"Total Time = %ld ms\n\n", DivU64x64Remainder (MultU64x32 (TimeStamp, 1000), TicksPerSecond, NULL));
   SerialPortWrite ((UINT8 *) Buffer, CharCount);
 }
+
+EFI_STATUS
+GetEnvironmentVariable (
+  IN     CONST CHAR16*   VariableName,
+  IN     VOID*           DefaultValue,
+  IN OUT UINTN*          Size,
+  OUT    VOID**          Value
+  )
+{
+  EFI_STATUS  Status;
+  UINTN       VariableSize;
+
+  // Try to get the variable size.
+  *Value = NULL;
+  VariableSize = 0;
+  Status = gRT->GetVariable ((CHAR16 *) VariableName, &gEfiGlobalVariableGuid, NULL, &VariableSize, *Value);
+  if (Status == EFI_NOT_FOUND) {
+    if ((DefaultValue != NULL) && (Size != NULL) && (*Size != 0)) {
+      // If the environment variable does not exist yet then set it with the default value
+      Status = gRT->SetVariable (
+                    (CHAR16*)VariableName,
+                    &gEfiGlobalVariableGuid,
+                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
+                    *Size,
+                    DefaultValue
+                    );
+      *Value = DefaultValue;
+    } else {
+      return EFI_NOT_FOUND;
+    }
+  } else if (Status == EFI_BUFFER_TOO_SMALL) {
+    // Get the environment variable value
+    *Value = AllocatePool (VariableSize);
+    if (*Value == NULL) {
+      return EFI_OUT_OF_RESOURCES;
+    }
+
+    Status = gRT->GetVariable ((CHAR16 *)VariableName, &gEfiGlobalVariableGuid, NULL, &VariableSize, *Value);
+    if (EFI_ERROR (Status)) {
+      FreePool(*Value);
+      return EFI_INVALID_PARAMETER;
+    }
+
+    if (Size) {
+      *Size = VariableSize;
+    }
+  } else {
+    *Value = DefaultValue;
+    return Status;
+  }
+
+  return EFI_SUCCESS;
+}
index af690495768922b68b50c6c1d29491a6d1af51a9..d450e8e6b2563bc2669b587eea3e6bb283628c75 100644 (file)
 #include <Library/DebugLib.h>
 #include <Library/BdsLib.h>
 #include <Library/PerformanceLib.h>
+#include <Library/PrintLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
 
+#include <Guid/GlobalVariable.h>
 #include <Guid/FileInfo.h>
 
 #include <Protocol/DevicePath.h>
 
 
 typedef BOOLEAN (*BDS_FILE_LOADER_SUPPORT) (
-    IN EFI_DEVICE_PATH            *DevicePath,
-    IN EFI_HANDLE                 Handle,
-    IN EFI_DEVICE_PATH            *RemainingDevicePath
-    );
+  IN EFI_DEVICE_PATH            *DevicePath,
+  IN EFI_HANDLE                 Handle,
+  IN EFI_DEVICE_PATH            *RemainingDevicePath
+  );
 
 typedef EFI_STATUS (*BDS_FILE_LOADER_LOAD_IMAGE) (
-    IN     EFI_DEVICE_PATH        *DevicePath,
-    IN     EFI_HANDLE             Handle,
-    IN     EFI_DEVICE_PATH        *RemainingDevicePath,
-    IN     EFI_ALLOCATE_TYPE      Type,
-    IN OUT EFI_PHYSICAL_ADDRESS*  Image,
-    OUT    UINTN                  *ImageSize
-    );
+  IN     EFI_DEVICE_PATH        *DevicePath,
+  IN     EFI_HANDLE             Handle,
+  IN     EFI_DEVICE_PATH        *RemainingDevicePath,
+  IN     EFI_ALLOCATE_TYPE      Type,
+  IN OUT EFI_PHYSICAL_ADDRESS*  Image,
+  OUT    UINTN                  *ImageSize
+  );
 
 typedef struct {
   BDS_FILE_LOADER_SUPPORT     Support;
@@ -78,6 +81,7 @@ VOID
 PrintPerformance (
   VOID
   );
+
 EFI_STATUS
 BdsLoadImage (
   IN     EFI_DEVICE_PATH       *DevicePath,
index b9b20060c51c17dad2f4dfc75deada1a5d036c7c..595e943fb77e9b8e294d2429c28335a1825d5f20 100644 (file)
@@ -24,6 +24,7 @@
   BdsLinuxLoader.c
   BdsAppLoader.c
   BdsHelper.c
+  BdsLoadOption.c
 
 [Packages]
   MdePkg/MdePkg.dec
@@ -52,6 +53,7 @@
   gEfiPxeBaseCodeProtocolGuid
   gEfiDiskIoProtocolGuid
   gEfiUsbIoProtocolGuid
+  gEfiLoadedImageProtocolGuid
     
 [FeaturePcd]  
 
index 91b42341e60f258da2ac56cab6b20f6b20cdb736..7bbe8b89bd49e1f5fafe6500ba72d6e0add8a518 100644 (file)
 
 #include "BdsInternal.h"
 
-EFI_STATUS
-GetEnvironmentVariable (
-  IN     CONST CHAR16*   VariableName,
-  IN     VOID*           DefaultValue,
-  IN OUT UINTN*          Size,
-  OUT    VOID**          Value
-  )
-{
-  EFI_STATUS  Status;
-  UINTN       VariableSize;
-
-  // Try to get the variable size.
-  *Value = NULL;
-  VariableSize = 0;
-  Status = gRT->GetVariable ((CHAR16 *) VariableName, &gEfiGlobalVariableGuid, NULL, &VariableSize, *Value);
-  if (Status == EFI_NOT_FOUND) {
-    if ((DefaultValue != NULL) && (Size != NULL) && (*Size != 0)) {
-      // If the environment variable does not exist yet then set it with the default value
-      Status = gRT->SetVariable (
-                    (CHAR16*)VariableName,
-                    &gEfiGlobalVariableGuid,
-                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
-                    *Size,
-                    DefaultValue
-                    );
-      *Value = DefaultValue;
-    } else {
-      return EFI_NOT_FOUND;
-    }
-  } else if (Status == EFI_BUFFER_TOO_SMALL) {
-    // Get the environment variable value
-    *Value = AllocatePool (VariableSize);
-    if (*Value == NULL) {
-      return EFI_OUT_OF_RESOURCES;
-    }
-
-    Status = gRT->GetVariable ((CHAR16 *)VariableName, &gEfiGlobalVariableGuid, NULL, &VariableSize, *Value);
-    if (EFI_ERROR (Status)) {
-      FreePool(*Value);
-      return EFI_INVALID_PARAMETER;
-    }
-
-    if (Size) {
-      *Size = VariableSize;
-    }
-  } else {
-    *Value = DefaultValue;
-    return Status;
-  }
-
-  return EFI_SUCCESS;
-}
-
 EFI_STATUS
 EditHIInputStr (
   IN OUT CHAR16  *CmdLine,
@@ -321,17 +268,12 @@ BdsStartBootOption (
   )
 {
   EFI_STATUS          Status;
-  EFI_LOAD_OPTION     EfiLoadOption;
-  UINTN               EfiLoadOptionSize;
   BDS_LOAD_OPTION     *BdsLoadOption;
 
-  Status = GetEnvironmentVariable (BootOption, NULL, &EfiLoadOptionSize, (VOID**)&EfiLoadOption);
+  Status = BootOptionFromLoadOptionVariable (BootOption, &BdsLoadOption);
   if (!EFI_ERROR(Status)) {
-    Status = BootOptionParseLoadOption (EfiLoadOption, EfiLoadOptionSize, &BdsLoadOption);
-    if (!EFI_ERROR(Status)) {
-      Status = BootOptionStart (BdsLoadOption);
-      FreePool (BdsLoadOption);
-    }
+    Status = BootOptionStart (BdsLoadOption);
+    FreePool (BdsLoadOption);
 
     if (!EFI_ERROR(Status)) {
       Status = EFI_SUCCESS;
index 9354e01d26e5b789a3b2deaca79ea109642bc2ba..86f2ac2dcad1c9c2c7d82287275302176ec4240e 100644 (file)
@@ -91,73 +91,6 @@ BootOptionStart (
   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
-  } else {\r
-    LoadOption->OptionalData = (BDS_LOADER_OPTIONAL_DATA *)((UINT8*)LoadOption->FilePathList + FilePathListLength);\r
-  }\r
-\r
-  *BdsLoadOption = LoadOption;\r
-  return EFI_SUCCESS;\r
-}\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
-\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
-  }\r
-\r
-  return Status;\r
-}\r
-\r
 EFI_STATUS\r
 BootOptionList (\r
   IN OUT LIST_ENTRY *BootOptionList\r
@@ -179,7 +112,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
@@ -190,38 +123,6 @@ BootOptionList (
   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
-\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
-}\r
-\r
 STATIC\r
 EFI_STATUS\r
 BootOptionSetFields (\r