3 Copyright (c) 2013-2015, 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>
21 #include <Library/UefiBootServicesTableLib.h>
22 #include <Library/UefiLib.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 CHAR16
*LoadOptions
, *NewLoadOptions
;
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 // Initialize Linux command line
88 LoadOptions
= CatSPrint (NULL
, L
"%a", KernelArgs
);
89 if (LoadOptions
== NULL
) {
90 return EFI_OUT_OF_RESOURCES
;
93 if (RamdiskSize
!= 0) {
94 NewLoadOptions
= CatSPrint (LoadOptions
, L
" initrd=0x%x,0x%x",
95 (UINTN
)Ramdisk
, RamdiskSize
);
96 FreePool (LoadOptions
);
97 if (NewLoadOptions
== NULL
) {
98 return EFI_OUT_OF_RESOURCES
;
100 LoadOptions
= NewLoadOptions
;
103 Status
= BdsStartEfiApplication (gImageHandle
,
104 (EFI_DEVICE_PATH_PROTOCOL
*) &KernelDevicePath
,
105 StrSize (LoadOptions
),
107 if (EFI_ERROR (Status
)) {
108 DEBUG ((EFI_D_ERROR
, "Couldn't Boot Linux: %d\n", Status
));
109 Status
= EFI_DEVICE_ERROR
;
110 goto FreeLoadOptions
;
113 // If we got here we do a confused face because BootLinuxFdt returned,
114 // reporting success.
115 DEBUG ((EFI_D_ERROR
, "WARNING: BdsBootLinuxFdt returned EFI_SUCCESS.\n"));
119 FreePool (LoadOptions
);