3 Copyright (c) 2013-2014, ARM Ltd. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "AndroidFastbootApp.h"
17 #include <Protocol/DevicePath.h>
19 #include <Library/BdsLib.h>
20 #include <Library/DevicePathLib.h>
22 #include <Guid/ArmGlobalVariableHob.h>
24 // Device Path representing an image in memory
27 MEMMAP_DEVICE_PATH Node1
;
28 EFI_DEVICE_PATH_PROTOCOL End
;
32 STATIC CONST MEMORY_DEVICE_PATH MemoryDevicePathTemplate
=
39 (UINT8
)(sizeof (MEMMAP_DEVICE_PATH
)),
40 (UINT8
)((sizeof (MEMMAP_DEVICE_PATH
)) >> 8),
43 0, // StartingAddress (set at runtime)
44 0 // EndingAddress (set at runtime)
48 END_ENTIRE_DEVICE_PATH_SUBTYPE
,
49 { sizeof (EFI_DEVICE_PATH_PROTOCOL
), 0 }
60 CHAR8 KernelArgs
[BOOTIMG_KERNEL_ARGS_SIZE
];
65 MEMORY_DEVICE_PATH KernelDevicePath
;
66 MEMORY_DEVICE_PATH
* RamdiskDevicePath
;
68 Status
= ParseAndroidBootImg (
76 if (EFI_ERROR (Status
)) {
80 KernelDevicePath
= MemoryDevicePathTemplate
;
82 // Have to cast to UINTN before casting to EFI_PHYSICAL_ADDRESS in order to
84 KernelDevicePath
.Node1
.StartingAddress
= (EFI_PHYSICAL_ADDRESS
)(UINTN
) Kernel
;
85 KernelDevicePath
.Node1
.EndingAddress
= (EFI_PHYSICAL_ADDRESS
)(UINTN
) Kernel
+ KernelSize
;
87 RamdiskDevicePath
= NULL
;
88 if (RamdiskSize
!= 0) {
89 RamdiskDevicePath
= (MEMORY_DEVICE_PATH
*)DuplicateDevicePath ((EFI_DEVICE_PATH_PROTOCOL
*) &MemoryDevicePathTemplate
);
91 RamdiskDevicePath
->Node1
.StartingAddress
= (EFI_PHYSICAL_ADDRESS
)(UINTN
) Ramdisk
;
92 RamdiskDevicePath
->Node1
.EndingAddress
= ((EFI_PHYSICAL_ADDRESS
)(UINTN
) Ramdisk
) + RamdiskSize
;
95 Status
= BdsBootLinuxFdt (
96 (EFI_DEVICE_PATH_PROTOCOL
*) &KernelDevicePath
,
97 (EFI_DEVICE_PATH_PROTOCOL
*) RamdiskDevicePath
,
100 if (EFI_ERROR (Status
)) {
101 DEBUG ((EFI_D_ERROR
, "Couldn't Boot Linux: %d\n", Status
));
102 return EFI_DEVICE_ERROR
;
105 if (RamdiskDevicePath
) {
106 FreePool (RamdiskDevicePath
);
109 // If we got here we do a confused face because BootLinuxFdt returned,
110 // reporting success.
111 DEBUG ((EFI_D_ERROR
, "WARNING: BdsBootLinuxFdt returned EFI_SUCCESS.\n"));