]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Application/LinuxLoader/LinuxFdtLoader.c
Update for NetworkPkg.
[mirror_edk2.git] / ArmPkg / Application / LinuxLoader / LinuxFdtLoader.c
CommitLineData
75e4db2d 1/** @file\r
2*\r
3* Copyright (c) 2011, ARM Limited. All rights reserved.\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 "LinuxInternal.h"\r
16\r
17#include <Library/PrintLib.h>\r
18#include <Library/UefiApplicationEntryPoint.h>\r
19\r
20/**\r
21 The user Entry Point for Application. The user code starts with this function\r
22 as the real entry point for the application.\r
23\r
24 @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
25 @param[in] SystemTable A pointer to the EFI System Table.\r
26\r
27 @retval EFI_SUCCESS The entry point is executed successfully.\r
28 @retval other Some error occurs when executing this entry point.\r
29\r
30**/\r
31EFI_STATUS\r
32EFIAPI\r
33UefiMain (\r
34 IN EFI_HANDLE ImageHandle,\r
35 IN EFI_SYSTEM_TABLE *SystemTable\r
36 )\r
37{\r
38 EFI_STATUS Status;\r
39 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
40 LINUX_LOADER_OPTIONAL_DATA* LinuxOptionalData;\r
41 EFI_DEVICE_PATH* DevicePathKernel;\r
42 EFI_DEVICE_PATH* DevicePathFdt;\r
43 EFI_DEVICE_PATH* InitrdDevicePath;\r
44 CHAR16* OptionalDataInitrd;\r
45 CHAR8* OptionalDataArguments;\r
46 CHAR16* Initrd;\r
47\r
48 Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **)&LoadedImage);\r
49 ASSERT_EFI_ERROR (Status);\r
50\r
51 if (LoadedImage->LoadOptionsSize == 0) {\r
52 Status = LinuxLoaderConfig (LoadedImage);\r
53 } else {\r
54 // Ensure the signature is correct\r
55 LinuxOptionalData = (LINUX_LOADER_OPTIONAL_DATA*)LoadedImage->LoadOptions;\r
56 if (LinuxOptionalData->Signature != LINUX_LOADER_SIGNATURE) {\r
57 return EFI_UNSUPPORTED;\r
58 }\r
59\r
793275a8 60 // Generate the File Path Node for the Linux Kernel & Device Tree blob\r
75e4db2d 61 DevicePathKernel = FileDevicePath (LoadedImage->DeviceHandle, LINUX_KERNEL_NAME);\r
62 DevicePathFdt = FileDevicePath (LoadedImage->DeviceHandle, FDT_NAME);\r
63\r
64 if (LinuxOptionalData->CmdLineLength > 0) {\r
65 OptionalDataArguments = (CHAR8*)LinuxOptionalData + sizeof(LINUX_LOADER_OPTIONAL_DATA);\r
66 } else {\r
67 OptionalDataArguments = NULL;\r
68 }\r
69\r
70 if (LinuxOptionalData->InitrdPathListLength > 0) {\r
71 if (OptionalDataArguments != NULL) {\r
72 OptionalDataInitrd = (CHAR16*)(OptionalDataArguments + LinuxOptionalData->CmdLineLength);\r
73 } else {\r
74 OptionalDataInitrd = (CHAR16*)LinuxOptionalData + sizeof(LINUX_LOADER_OPTIONAL_DATA);\r
75 }\r
76\r
77 // If pointer not aligned\r
78 if ((UINTN)OptionalDataInitrd & 0x1) {\r
79 Initrd = (CHAR16*)AllocateCopyPool (LinuxOptionalData->InitrdPathListLength, OptionalDataInitrd);\r
80 } else {\r
81 Initrd = OptionalDataInitrd;\r
82 }\r
83\r
84 InitrdDevicePath = FileDevicePath (LoadedImage->DeviceHandle, Initrd);\r
85 } else {\r
86 OptionalDataInitrd = NULL;\r
87 InitrdDevicePath = NULL;\r
88 Initrd = NULL;\r
89 }\r
90\r
91 // Load and Start the Linux Kernel (we should never return)\r
92 Status = BdsBootLinuxFdt (DevicePathKernel, InitrdDevicePath, OptionalDataArguments, DevicePathFdt);\r
93\r
94 if ((UINTN)OptionalDataInitrd & 0x1) {\r
95 FreePool (Initrd);\r
96 }\r
97\r
98 FreePool (DevicePathKernel);\r
99 if (InitrdDevicePath) {\r
100 FreePool (InitrdDevicePath);\r
101 }\r
102 }\r
103\r
104 return Status;\r
105}\r