]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPlatformPkg/Bds: Decoupled OptionalData for the EFI application boot entry from...
authorOlivier Martin <olivier.martin@arm.com>
Fri, 11 Apr 2014 10:56:02 +0000 (10:56 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 11 Apr 2014 10:56:02 +0000 (10:56 +0000)
OptionalData for EFI Application does not contain any more specific information about the ArmPlatformPkg/Bds.
OptionalData now only contains the data pass to the EFI application.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Olivier Martin <olivier.martin@arm.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15451 6f19259b-4bc3-4df7-8a09-765794883524

ArmPlatformPkg/Bds/Bds.c
ArmPlatformPkg/Bds/BdsInternal.h
ArmPlatformPkg/Bds/BootMenu.c
ArmPlatformPkg/Bds/BootOption.c

index 76dd5465a2cc9cb142f188b6e27c73305ac66c34..2888843058afc4f06765eb82eaa45c615ba9dfcb 100644 (file)
@@ -220,6 +220,8 @@ DefineDefaultBootEntries (
   EFI_STATUS                          Status;\r
   EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL* EfiDevicePathFromTextProtocol;\r
   EFI_DEVICE_PATH*                    BootDevicePath;\r
+  UINT8*                              OptionalData;\r
+  UINTN                               OptionalDataSize;\r
   ARM_BDS_LOADER_ARGUMENTS*           BootArguments;\r
   ARM_BDS_LOADER_TYPE                 BootType;\r
   EFI_DEVICE_PATH*                    InitrdPath;\r
@@ -306,7 +308,8 @@ DefineDefaultBootEntries (
         InitrdPath = EfiDevicePathFromTextProtocol->ConvertTextToDevicePath ((CHAR16*)PcdGetPtr(PcdDefaultBootInitrdPath));\r
         InitrdSize = GetDevicePathSize (InitrdPath);\r
 \r
-        BootArguments = (ARM_BDS_LOADER_ARGUMENTS*)AllocatePool (sizeof(ARM_BDS_LOADER_ARGUMENTS) + CmdLineAsciiSize + InitrdSize);\r
+        OptionalDataSize = sizeof(ARM_BDS_LOADER_ARGUMENTS) + CmdLineAsciiSize + InitrdSize;\r
+        BootArguments = (ARM_BDS_LOADER_ARGUMENTS*)AllocatePool (OptionalDataSize);\r
         if (BootArguments == NULL) {\r
           return EFI_OUT_OF_RESOURCES;\r
         }\r
@@ -315,15 +318,19 @@ DefineDefaultBootEntries (
 \r
         CopyMem ((VOID*)(BootArguments + 1), AsciiDefaultBootArgument, CmdLineAsciiSize);\r
         CopyMem ((VOID*)((UINTN)(BootArguments + 1) + CmdLineAsciiSize), InitrdPath, InitrdSize);\r
+\r
+        OptionalData = (UINT8*)BootArguments;\r
       } else {\r
-        BootArguments = NULL;\r
+        OptionalData = NULL;\r
+        OptionalDataSize = 0;\r
       }\r
 \r
       BootOptionCreate (LOAD_OPTION_ACTIVE | LOAD_OPTION_CATEGORY_BOOT,\r
         (CHAR16*)PcdGetPtr(PcdDefaultBootDescription),\r
         BootDevicePath,\r
         BootType,\r
-        BootArguments,\r
+        OptionalData,\r
+        OptionalDataSize,\r
         &BdsLoadOption\r
         );\r
       FreePool (BdsLoadOption);\r
index d2c1655114e2c2d258e1a2ae261c701a302bdfae..085a5a49ef0f1481824cf949385d49650e021ec0 100644 (file)
@@ -219,7 +219,8 @@ BootOptionCreate (
   IN  CHAR16*                   BootDescription,\r
   IN  EFI_DEVICE_PATH_PROTOCOL* DevicePath,\r
   IN  ARM_BDS_LOADER_TYPE       BootType,\r
-  IN  ARM_BDS_LOADER_ARGUMENTS* BootArguments,\r
+  IN  UINT8*                    OptionalData,\r
+  IN  UINTN                     OptionalDataSize,\r
   OUT BDS_LOAD_OPTION**         BdsLoadOption\r
   );\r
 \r
@@ -230,7 +231,8 @@ BootOptionUpdate (
   IN  CHAR16*                   BootDescription,\r
   IN  EFI_DEVICE_PATH_PROTOCOL* DevicePath,\r
   IN  ARM_BDS_LOADER_TYPE       BootType,\r
-  IN  ARM_BDS_LOADER_ARGUMENTS* BootArguments\r
+  IN UINT8*                     OptionalData,\r
+  IN UINTN                      OptionalDataSize\r
   );\r
 \r
 EFI_STATUS\r
index 1b101d45c1f7972038b55649cb1b85270363b76a..b04ebd35a2ed8ffc388caebb6fc26e1fd1ec92ac 100644 (file)
@@ -131,6 +131,8 @@ BootMenuAddBootOption (
   UINTN                     CmdLineSize;\r
   BOOLEAN                   InitrdSupport;\r
   UINTN                     InitrdSize;\r
+  UINT8*                    OptionalData;\r
+  UINTN                     OptionalDataSize;\r
 \r
   Attributes                = 0;\r
   SupportedBootDevice = NULL;\r
@@ -195,14 +197,18 @@ BootMenuAddBootOption (
     CmdLineSize = AsciiStrSize (CmdLine);\r
     InitrdSize = GetDevicePathSize (InitrdPath);\r
 \r
-    BootArguments = (ARM_BDS_LOADER_ARGUMENTS*)AllocatePool (sizeof(ARM_BDS_LOADER_ARGUMENTS) + CmdLineSize + InitrdSize);\r
+    OptionalDataSize = sizeof(ARM_BDS_LOADER_ARGUMENTS) + CmdLineSize + InitrdSize;\r
+    BootArguments = (ARM_BDS_LOADER_ARGUMENTS*)AllocatePool (OptionalDataSize);\r
 \r
     BootArguments->LinuxArguments.CmdLineSize = CmdLineSize;\r
     BootArguments->LinuxArguments.InitrdSize = InitrdSize;\r
     CopyMem ((VOID*)(&BootArguments->LinuxArguments + 1), CmdLine, CmdLineSize);\r
     CopyMem ((VOID*)((UINTN)(&BootArguments->LinuxArguments + 1) + CmdLineSize), InitrdPath, InitrdSize);\r
+\r
+    OptionalData = (UINT8*)BootArguments;\r
   } else {\r
-    BootArguments = NULL;\r
+    OptionalData = NULL;\r
+    OptionalDataSize = 0;\r
   }\r
 \r
   Print(L"Description for this new Entry: ");\r
@@ -214,7 +220,7 @@ BootMenuAddBootOption (
 \r
   // Create new entry\r
   BdsLoadOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool (sizeof(BDS_LOAD_OPTION_ENTRY));\r
-  Status = BootOptionCreate (Attributes, BootDescription, DevicePath, BootType, BootArguments, &BdsLoadOptionEntry->BdsLoadOption);\r
+  Status = BootOptionCreate (Attributes, BootDescription, DevicePath, BootType, OptionalData, OptionalDataSize, &BdsLoadOptionEntry->BdsLoadOption);\r
   if (!EFI_ERROR(Status)) {\r
     InsertTailList (BootOptionsList, &BdsLoadOptionEntry->Link);\r
   }\r
@@ -367,13 +373,15 @@ BootMenuUpdateBootOption (
   EFI_DEVICE_PATH               *DevicePath;\r
   EFI_DEVICE_PATH               *TempInitrdPath;\r
   ARM_BDS_LOADER_TYPE           BootType;\r
-  ARM_BDS_LOADER_OPTIONAL_DATA* OptionalData;\r
+  ARM_BDS_LOADER_OPTIONAL_DATA* LoaderOptionalData;\r
   ARM_BDS_LINUX_ARGUMENTS*      LinuxArguments;\r
   EFI_DEVICE_PATH               *InitrdPathNodes;\r
   EFI_DEVICE_PATH               *InitrdPath;\r
   UINTN                         InitrdSize;\r
   UINTN                         CmdLineSize;\r
   BOOLEAN                       InitrdSupport;\r
+  UINT8*                        OptionalData;\r
+  UINTN                         OptionalDataSize;\r
 \r
   Status = BootMenuSelectBootOption (BootOptionsList, UPDATE_BOOT_ENTRY, TRUE, &BootOptionEntry);\r
   if (EFI_ERROR(Status)) {\r
@@ -394,11 +402,11 @@ BootMenuUpdateBootOption (
     goto EXIT;\r
   }\r
 \r
-  OptionalData = BootOption->OptionalData;\r
-  BootType = (ARM_BDS_LOADER_TYPE)ReadUnaligned32 ((UINT32 *)(&OptionalData->Header.LoaderType));\r
+  LoaderOptionalData = BootOption->OptionalData;\r
+  BootType = (ARM_BDS_LOADER_TYPE)ReadUnaligned32 ((UINT32 *)(&LoaderOptionalData->Header.LoaderType));\r
 \r
   if ((BootType == BDS_LOADER_KERNEL_LINUX_ATAG) || (BootType == BDS_LOADER_KERNEL_LINUX_FDT)) {\r
-    LinuxArguments = &OptionalData->Arguments.LinuxArguments;\r
+    LinuxArguments = &LoaderOptionalData->Arguments.LinuxArguments;\r
 \r
     CmdLineSize = ReadUnaligned16 ((CONST UINT16*)&LinuxArguments->CmdLineSize);\r
 \r
@@ -467,13 +475,17 @@ BootMenuUpdateBootOption (
 \r
     CmdLineSize = AsciiStrSize (CmdLine);\r
 \r
-    BootArguments = (ARM_BDS_LOADER_ARGUMENTS*)AllocatePool(sizeof(ARM_BDS_LOADER_ARGUMENTS) + CmdLineSize + InitrdSize);\r
+    OptionalDataSize = sizeof(ARM_BDS_LOADER_ARGUMENTS) + CmdLineSize + InitrdSize;\r
+    BootArguments = (ARM_BDS_LOADER_ARGUMENTS*)AllocatePool (OptionalDataSize);\r
     BootArguments->LinuxArguments.CmdLineSize = CmdLineSize;\r
     BootArguments->LinuxArguments.InitrdSize = InitrdSize;\r
     CopyMem (&BootArguments->LinuxArguments + 1, CmdLine, CmdLineSize);\r
     CopyMem ((VOID*)((UINTN)(&BootArguments->LinuxArguments + 1) + CmdLineSize), InitrdPath, InitrdSize);\r
+\r
+    OptionalData = (UINT8*)BootArguments;\r
   } else {\r
-    BootArguments = NULL;\r
+    OptionalData     = NULL;\r
+    OptionalDataSize = 0;\r
   }\r
 \r
   Print(L"Description for this new Entry: ");\r
@@ -485,7 +497,7 @@ BootMenuUpdateBootOption (
   }\r
 \r
   // Update the entry\r
-  Status = BootOptionUpdate (BootOption, BootOption->Attributes, BootDescription, DevicePath, BootType, BootArguments);\r
+  Status = BootOptionUpdate (BootOption, BootOption->Attributes, BootDescription, DevicePath, BootType, OptionalData, OptionalDataSize);\r
 \r
 FREE_DEVICE_PATH:\r
   FreePool (DevicePath);\r
index 8993cb14a21a512ba0a66a4392c44c0c2a056d2c..6f84ed9b6331c76884b826891de5d6cd61df9979 100644 (file)
@@ -150,36 +150,37 @@ BootOptionSetFields (
   IN CHAR16*                    BootDescription,\r
   IN EFI_DEVICE_PATH_PROTOCOL*  DevicePath,\r
   IN ARM_BDS_LOADER_TYPE        BootType,\r
-  IN ARM_BDS_LOADER_ARGUMENTS*  BootArguments\r
+  IN UINT8*                     OptionalData,\r
+  IN UINTN                      OptionalDataSize\r
   )\r
 {\r
   EFI_LOAD_OPTION               EfiLoadOption;\r
   UINTN                         EfiLoadOptionSize;\r
   UINTN                         BootDescriptionSize;\r
-  UINTN                         BootOptionalDataSize;\r
   UINT16                        FilePathListLength;\r
   UINT8*                        EfiLoadOptionPtr;\r
   UINT8*                        InitrdPathListPtr;\r
-  UINTN                         OptionalDataSize;\r
   ARM_BDS_LINUX_ARGUMENTS*      DestLinuxArguments;\r
   ARM_BDS_LINUX_ARGUMENTS*      SrcLinuxArguments;\r
+  ARM_BDS_LOADER_ARGUMENTS*     BootArguments;\r
 \r
   // If we are overwriting an existent Boot Option then we have to free previously allocated memory\r
   if (BootOption->LoadOption) {\r
-    FreePool(BootOption->LoadOption);\r
+    FreePool (BootOption->LoadOption);\r
   }\r
 \r
   BootDescriptionSize = StrSize (BootDescription);\r
-  BootOptionalDataSize = sizeof(ARM_BDS_LOADER_OPTIONAL_DATA_HEADER);\r
+\r
+  // Fixup the size in case of entry specific to ArmPlatformPkg/Bds\r
   if ((BootType == BDS_LOADER_KERNEL_LINUX_ATAG) || (BootType == BDS_LOADER_KERNEL_LINUX_FDT)) {\r
-    BootOptionalDataSize += sizeof(ARM_BDS_LINUX_ARGUMENTS) + BootArguments->LinuxArguments.CmdLineSize + BootArguments->LinuxArguments.InitrdSize;\r
+    OptionalDataSize += sizeof(ARM_BDS_LOADER_OPTIONAL_DATA_HEADER);\r
   }\r
 \r
   // Compute the size of the FilePath list\r
   FilePathListLength = GetUnalignedDevicePathSize (DevicePath);\r
 \r
   // Allocate the memory for the EFI Load Option\r
-  EfiLoadOptionSize = sizeof(UINT32) + sizeof(UINT16) + BootDescriptionSize + FilePathListLength + BootOptionalDataSize;\r
+  EfiLoadOptionSize = sizeof(UINT32) + sizeof(UINT16) + BootDescriptionSize + FilePathListLength + OptionalDataSize;\r
   EfiLoadOption = (EFI_LOAD_OPTION)AllocatePool(EfiLoadOptionSize);\r
   EfiLoadOptionPtr = EfiLoadOption;\r
 \r
@@ -209,28 +210,29 @@ BootOptionSetFields (
 \r
   // Optional Data fields, Do unaligned writes\r
   BootOption->OptionalData = EfiLoadOptionPtr;\r
-  WriteUnaligned32 ((UINT32 *)EfiLoadOptionPtr, ARM_BDS_OPTIONAL_DATA_SIGNATURE);\r
-  WriteUnaligned32 ((UINT32 *)(EfiLoadOptionPtr + 4), BootType);\r
-\r
-  OptionalDataSize = sizeof(ARM_BDS_LOADER_OPTIONAL_DATA_HEADER);\r
 \r
   if ((BootType == BDS_LOADER_KERNEL_LINUX_ATAG) || (BootType == BDS_LOADER_KERNEL_LINUX_FDT)) {\r
+    // Write the header\r
+    WriteUnaligned32 ((UINT32 *)EfiLoadOptionPtr, ARM_BDS_OPTIONAL_DATA_SIGNATURE);\r
+    WriteUnaligned32 ((UINT32 *)(EfiLoadOptionPtr + 4), BootType);\r
+\r
+    BootArguments = (ARM_BDS_LOADER_ARGUMENTS*)OptionalData;\r
     SrcLinuxArguments = &(BootArguments->LinuxArguments);\r
     DestLinuxArguments = &((ARM_BDS_LOADER_OPTIONAL_DATA*)EfiLoadOptionPtr)->Arguments.LinuxArguments;\r
 \r
     WriteUnaligned16 ((UINT16 *)&(DestLinuxArguments->CmdLineSize), SrcLinuxArguments->CmdLineSize);\r
     WriteUnaligned16 ((UINT16 *)&(DestLinuxArguments->InitrdSize), SrcLinuxArguments->InitrdSize);\r
-    OptionalDataSize += sizeof (ARM_BDS_LINUX_ARGUMENTS);\r
 \r
     if (SrcLinuxArguments->CmdLineSize > 0) {\r
       CopyMem ((VOID*)(DestLinuxArguments + 1), (VOID*)(SrcLinuxArguments + 1), SrcLinuxArguments->CmdLineSize);\r
-      OptionalDataSize += SrcLinuxArguments->CmdLineSize;\r
     }\r
 \r
     if (SrcLinuxArguments->InitrdSize > 0) {\r
       InitrdPathListPtr = (UINT8*)((UINTN)(DestLinuxArguments + 1) + SrcLinuxArguments->CmdLineSize);\r
       CopyMem (InitrdPathListPtr, (VOID*)((UINTN)(SrcLinuxArguments + 1) + SrcLinuxArguments->CmdLineSize), SrcLinuxArguments->InitrdSize);\r
     }\r
+  } else {\r
+    CopyMem (BootOption->OptionalData, OptionalData, OptionalDataSize);\r
   }\r
   BootOption->OptionalDataSize = OptionalDataSize;\r
 \r
@@ -253,7 +255,8 @@ BootOptionCreate (
   IN  CHAR16*                   BootDescription,\r
   IN  EFI_DEVICE_PATH_PROTOCOL* DevicePath,\r
   IN  ARM_BDS_LOADER_TYPE       BootType,\r
-  IN  ARM_BDS_LOADER_ARGUMENTS* BootArguments,\r
+  IN  UINT8*                    OptionalData,\r
+  IN  UINTN                     OptionalDataSize,\r
   OUT BDS_LOAD_OPTION**         BdsLoadOption\r
   )\r
 {\r
@@ -272,7 +275,7 @@ BootOptionCreate (
   BootOptionEntry->BdsLoadOption = (BDS_LOAD_OPTION*)AllocateZeroPool (sizeof(BDS_LOAD_OPTION));\r
 \r
   BootOption = BootOptionEntry->BdsLoadOption;\r
-  BootOptionSetFields (BootOption, Attributes, BootDescription, DevicePath, BootType, BootArguments);\r
+  BootOptionSetFields (BootOption, Attributes, BootDescription, DevicePath, BootType, OptionalData, OptionalDataSize);\r
 \r
   //\r
   // Set the related environment variables\r
@@ -326,14 +329,15 @@ BootOptionUpdate (
   IN  CHAR16*                   BootDescription,\r
   IN  EFI_DEVICE_PATH_PROTOCOL* DevicePath,\r
   IN  ARM_BDS_LOADER_TYPE       BootType,\r
-  IN  ARM_BDS_LOADER_ARGUMENTS* BootArguments\r
+  IN UINT8*                     OptionalData,\r
+  IN UINTN                      OptionalDataSize\r
   )\r
 {\r
   EFI_STATUS      Status;\r
   CHAR16          BootVariableName[9];\r
 \r
   // Update the BDS Load Option structure\r
-  BootOptionSetFields (BdsLoadOption, Attributes, BootDescription, DevicePath, BootType, BootArguments);\r
+  BootOptionSetFields (BdsLoadOption, Attributes, BootDescription, DevicePath, BootType, OptionalData, OptionalDataSize);\r
 \r
   // Update the related environment variables\r
   UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", BdsLoadOption->LoadOptionIndex);\r