]> git.proxmox.com Git - mirror_edk2.git/blame - EmbeddedPkg/Application/AndroidFastboot/Arm/BootAndroidBootImg.c
ARM Packages: Fixed missing braces (the warning was disabled by GCC)
[mirror_edk2.git] / EmbeddedPkg / Application / AndroidFastboot / Arm / BootAndroidBootImg.c
CommitLineData
f6755908
OM
1/** @file\r
2\r
3 Copyright (c) 2013-2014, ARM Ltd. All rights reserved.<BR>\r
4\r
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "AndroidFastbootApp.h"\r
16\r
17#include <Protocol/DevicePath.h>\r
18\r
19#include <Library/BdsLib.h>\r
20#include <Library/DevicePathLib.h>\r
21\r
22#include <Guid/ArmGlobalVariableHob.h>\r
23\r
24// Device Path representing an image in memory\r
25#pragma pack(1)\r
26typedef struct {\r
27 MEMMAP_DEVICE_PATH Node1;\r
28 EFI_DEVICE_PATH_PROTOCOL End;\r
29} MEMORY_DEVICE_PATH;\r
30#pragma pack()\r
31\r
32STATIC CONST MEMORY_DEVICE_PATH MemoryDevicePathTemplate =\r
33{\r
34 {\r
35 {\r
36 HARDWARE_DEVICE_PATH,\r
37 HW_MEMMAP_DP,\r
38 {\r
39 (UINT8)(sizeof (MEMMAP_DEVICE_PATH)),\r
40 (UINT8)((sizeof (MEMMAP_DEVICE_PATH)) >> 8),\r
41 },\r
42 }, // Header\r
43 0, // StartingAddress (set at runtime)\r
44 0 // EndingAddress (set at runtime)\r
45 }, // Node1\r
46 {\r
47 END_DEVICE_PATH_TYPE,\r
48 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
b0fdce95 49 { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 }\r
f6755908
OM
50 } // End\r
51};\r
52\r
53EFI_STATUS\r
54BootAndroidBootImg (\r
55 IN UINTN BufferSize,\r
56 IN VOID *Buffer\r
57 )\r
58{\r
59 EFI_DEVICE_PATH_PROTOCOL *FdtDevicePath;\r
60 EFI_STATUS Status;\r
61 CHAR8 KernelArgs[BOOTIMG_KERNEL_ARGS_SIZE];\r
62 VOID *Kernel;\r
63 UINTN KernelSize;\r
64 VOID *Ramdisk;\r
65 UINTN RamdiskSize;\r
66 MEMORY_DEVICE_PATH KernelDevicePath;\r
67 MEMORY_DEVICE_PATH* RamdiskDevicePath;\r
68\r
69 Status = ParseAndroidBootImg (\r
70 Buffer,\r
71 &Kernel,\r
72 &KernelSize,\r
73 &Ramdisk,\r
74 &RamdiskSize,\r
75 KernelArgs\r
76 );\r
77 if (EFI_ERROR (Status)) {\r
78 return Status;\r
79 }\r
80\r
81 KernelDevicePath = MemoryDevicePathTemplate;\r
82\r
83 // Have to cast to UINTN before casting to EFI_PHYSICAL_ADDRESS in order to\r
84 // appease GCC.\r
85 KernelDevicePath.Node1.StartingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Kernel;\r
86 KernelDevicePath.Node1.EndingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Kernel + KernelSize;\r
87\r
88 RamdiskDevicePath = NULL;\r
89 if (RamdiskSize != 0) {\r
90 RamdiskDevicePath = (MEMORY_DEVICE_PATH*)DuplicateDevicePath ((EFI_DEVICE_PATH_PROTOCOL*) &MemoryDevicePathTemplate);\r
91\r
92 RamdiskDevicePath->Node1.StartingAddress = (EFI_PHYSICAL_ADDRESS)(UINTN) Ramdisk;\r
93 RamdiskDevicePath->Node1.EndingAddress = ((EFI_PHYSICAL_ADDRESS)(UINTN) Ramdisk) + RamdiskSize;\r
94 }\r
95\r
96 // Get the default FDT device path\r
97 Status = GetEnvironmentVariable ((CHAR16 *)L"Fdt", &gArmGlobalVariableGuid,\r
98 NULL, 0, (VOID **)&FdtDevicePath);\r
99 if (Status == EFI_NOT_FOUND) {\r
100 DEBUG ((EFI_D_ERROR, "Error: Please update FDT path in boot manager\n"));\r
101 return EFI_DEVICE_ERROR;\r
102 }\r
103 ASSERT_EFI_ERROR (Status);\r
104\r
105 Status = BdsBootLinuxFdt (\r
106 (EFI_DEVICE_PATH_PROTOCOL *) &KernelDevicePath,\r
107 (EFI_DEVICE_PATH_PROTOCOL *) RamdiskDevicePath,\r
108 KernelArgs,\r
109 FdtDevicePath\r
110 );\r
111 if (EFI_ERROR (Status)) {\r
112 DEBUG ((EFI_D_ERROR, "Couldn't Boot Linux: %d\n", Status));\r
113 return EFI_DEVICE_ERROR;\r
114 }\r
115\r
116 if (RamdiskDevicePath) {\r
117 FreePool (RamdiskDevicePath);\r
118 }\r
119\r
79480c8d
OM
120 FreePool (FdtDevicePath);\r
121\r
f6755908
OM
122 // If we got here we do a confused face because BootLinuxFdt returned,\r
123 // reporting success.\r
124 DEBUG ((EFI_D_ERROR, "WARNING: BdsBootLinuxFdt returned EFI_SUCCESS.\n"));\r
125 return EFI_SUCCESS;\r
126}\r