]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EmbeddedPkg/Application/AndroidFastboot/Arm/BootAndroidBootImg.c
EmbeddedPkg/AndroidFastboot: drop dependency on the LinuxLoader
[mirror_edk2.git] / EmbeddedPkg / Application / AndroidFastboot / Arm / BootAndroidBootImg.c
index 6f4b66beebc14c468e90a1b785ce459a0cb15dfc..46a7ceb3a41c2ebd54a159f1d0ccf7988b1dfe60 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
 /** @file\r
 \r
-  Copyright (c) 2013-2014, ARM Ltd. All rights reserved.<BR>\r
+  Copyright (c) 2013-2015, ARM Ltd. All rights reserved.<BR>\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
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -18,8 +18,8 @@
 \r
 #include <Library/BdsLib.h>\r
 #include <Library/DevicePathLib.h>\r
 \r
 #include <Library/BdsLib.h>\r
 #include <Library/DevicePathLib.h>\r
-\r
-#include <Guid/ArmGlobalVariableHob.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiLib.h>\r
 \r
 // Device Path representing an image in memory\r
 #pragma pack(1)\r
 \r
 // Device Path representing an image in memory\r
 #pragma pack(1)\r
@@ -46,8 +46,7 @@ STATIC CONST MEMORY_DEVICE_PATH MemoryDevicePathTemplate =
   {\r
     END_DEVICE_PATH_TYPE,\r
     END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
   {\r
     END_DEVICE_PATH_TYPE,\r
     END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
-    sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
-    0\r
+    { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 }\r
   } // End\r
 };\r
 \r
   } // End\r
 };\r
 \r
@@ -57,7 +56,6 @@ BootAndroidBootImg (
   IN VOID    *Buffer\r
   )\r
 {\r
   IN VOID    *Buffer\r
   )\r
 {\r
-  EFI_DEVICE_PATH_PROTOCOL           *FdtDevicePath;\r
   EFI_STATUS                          Status;\r
   CHAR8                               KernelArgs[BOOTIMG_KERNEL_ARGS_SIZE];\r
   VOID                               *Kernel;\r
   EFI_STATUS                          Status;\r
   CHAR8                               KernelArgs[BOOTIMG_KERNEL_ARGS_SIZE];\r
   VOID                               *Kernel;\r
@@ -65,7 +63,7 @@ BootAndroidBootImg (
   VOID                               *Ramdisk;\r
   UINTN                               RamdiskSize;\r
   MEMORY_DEVICE_PATH                  KernelDevicePath;\r
   VOID                               *Ramdisk;\r
   UINTN                               RamdiskSize;\r
   MEMORY_DEVICE_PATH                  KernelDevicePath;\r
-  MEMORY_DEVICE_PATH*                 RamdiskDevicePath;\r
+  CHAR16                              *LoadOptions, *NewLoadOptions;\r
 \r
   Status = ParseAndroidBootImg (\r
             Buffer,\r
 \r
   Status = ParseAndroidBootImg (\r
             Buffer,\r
@@ -86,40 +84,38 @@ BootAndroidBootImg (
   KernelDevicePath.Node1.StartingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Kernel;\r
   KernelDevicePath.Node1.EndingAddress   = (EFI_PHYSICAL_ADDRESS)(UINTN) Kernel + KernelSize;\r
 \r
   KernelDevicePath.Node1.StartingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Kernel;\r
   KernelDevicePath.Node1.EndingAddress   = (EFI_PHYSICAL_ADDRESS)(UINTN) Kernel + KernelSize;\r
 \r
-  RamdiskDevicePath = NULL;\r
-  if (RamdiskSize != 0) {\r
-    RamdiskDevicePath = (MEMORY_DEVICE_PATH*)DuplicateDevicePath ((EFI_DEVICE_PATH_PROTOCOL*) &MemoryDevicePathTemplate);\r
-\r
-    RamdiskDevicePath->Node1.StartingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Ramdisk;\r
-    RamdiskDevicePath->Node1.EndingAddress   = ((EFI_PHYSICAL_ADDRESS)(UINTN) Ramdisk) + RamdiskSize;\r
+  // Initialize Linux command line\r
+  LoadOptions = CatSPrint (NULL, L"%a", KernelArgs);\r
+  if (LoadOptions == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
   }\r
 \r
-  // Get the default FDT device path\r
-  Status = GetEnvironmentVariable ((CHAR16 *)L"Fdt", &gArmGlobalVariableGuid,\r
-             NULL, 0, (VOID **)&FdtDevicePath);\r
-  if (Status == EFI_NOT_FOUND) {\r
-    DEBUG ((EFI_D_ERROR, "Error: Please update FDT path in boot manager\n"));\r
-    return EFI_DEVICE_ERROR;\r
+  if (RamdiskSize != 0) {\r
+    NewLoadOptions = CatSPrint (LoadOptions, L" initrd=0x%x,0x%x",\r
+                       (UINTN)Ramdisk, RamdiskSize);\r
+    FreePool (LoadOptions);\r
+    if (NewLoadOptions == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    LoadOptions = NewLoadOptions;\r
   }\r
   }\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  Status = BdsBootLinuxFdt (\r
-              (EFI_DEVICE_PATH_PROTOCOL *) &KernelDevicePath,\r
-              (EFI_DEVICE_PATH_PROTOCOL *) RamdiskDevicePath,\r
-              KernelArgs,\r
-              FdtDevicePath\r
-              );\r
+\r
+  Status = BdsStartEfiApplication (gImageHandle,\r
+             (EFI_DEVICE_PATH_PROTOCOL *) &KernelDevicePath,\r
+             StrSize (LoadOptions),\r
+             LoadOptions);\r
   if (EFI_ERROR (Status)) {\r
     DEBUG ((EFI_D_ERROR, "Couldn't Boot Linux: %d\n", Status));\r
   if (EFI_ERROR (Status)) {\r
     DEBUG ((EFI_D_ERROR, "Couldn't Boot Linux: %d\n", Status));\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-\r
-  if (RamdiskDevicePath) {\r
-    FreePool (RamdiskDevicePath);\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto FreeLoadOptions;\r
   }\r
 \r
   // If we got here we do a confused face because BootLinuxFdt returned,\r
   // reporting success.\r
   DEBUG ((EFI_D_ERROR, "WARNING: BdsBootLinuxFdt returned EFI_SUCCESS.\n"));\r
   return EFI_SUCCESS;\r
   }\r
 \r
   // If we got here we do a confused face because BootLinuxFdt returned,\r
   // reporting success.\r
   DEBUG ((EFI_D_ERROR, "WARNING: BdsBootLinuxFdt returned EFI_SUCCESS.\n"));\r
   return EFI_SUCCESS;\r
+\r
+FreeLoadOptions:\r
+  FreePool (LoadOptions);\r
+  return Status;\r
 }\r
 }\r