| /** @file | |
| * | |
| * Copyright (c) 2011-2015, ARM Limited. All rights reserved. | |
| * | |
| * This program and the accompanying materials | |
| * are licensed and made available under the terms and conditions of the BSD License | |
| * which accompanies this distribution. The full text of the license may be found at | |
| * http://opensource.org/licenses/bsd-license.php | |
| * | |
| * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| * | |
| **/ | |
| #ifndef __LINUX_LOADER_H__ | |
| #define __LINUX_LOADER_H__ | |
| #include <Library/BdsLib.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/HiiLib.h> | |
| #include <Library/MemoryAllocationLib.h> | |
| #include <Library/PerformanceLib.h> | |
| #include <Library/PrintLib.h> | |
| #include <Library/ShellLib.h> | |
| #include <Library/UefiBootServicesTableLib.h> | |
| #include <Library/UefiLib.h> | |
| #include <Protocol/EfiShellParameters.h> | |
| #include <Protocol/EfiShell.h> | |
| #include <libfdt.h> | |
| // | |
| // Definitions | |
| // | |
| #define MAX_MSG_LEN 80 | |
| #define LINUX_UIMAGE_SIGNATURE 0x56190527 | |
| #define LINUX_KERNEL_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxKernelMaxOffset)) | |
| #define LINUX_ATAG_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxAtagMaxOffset)) | |
| #define LINUX_FDT_MAX_OFFSET (SystemMemoryBase + PcdGet32(PcdArmLinuxFdtMaxOffset)) | |
| #define ARM_FDT_MACHINE_TYPE 0xFFFFFFFF | |
| // Additional size that could be used for FDT entries added by the UEFI OS Loader | |
| // Estimation based on: EDID (300bytes) + bootargs (200bytes) + initrd region (20bytes) | |
| // + system memory region (20bytes) + mp_core entries (200 bytes) | |
| #define FDT_ADDITIONAL_ENTRIES_SIZE 0x300 | |
| // | |
| // Global variables | |
| // | |
| extern CONST EFI_GUID mLinuxLoaderHiiGuid; | |
| extern EFI_HANDLE mLinuxLoaderHiiHandle; | |
| // | |
| // Local Types | |
| // | |
| typedef struct _SYSTEM_MEMORY_RESOURCE { | |
| LIST_ENTRY Link; // This attribute must be the first entry of this structure (to avoid pointer computation) | |
| EFI_PHYSICAL_ADDRESS PhysicalStart; | |
| UINT64 ResourceLength; | |
| } SYSTEM_MEMORY_RESOURCE; | |
| typedef VOID (*LINUX_KERNEL)(UINT32 Zero, UINT32 Arch, UINTN ParametersBase); | |
| // | |
| // Functions | |
| // | |
| EFI_STATUS | |
| PrintHii ( | |
| IN CONST CHAR8 *Language OPTIONAL, | |
| IN CONST EFI_STRING_ID HiiFormatStringId, | |
| ... | |
| ); | |
| VOID | |
| PrintHelp ( | |
| IN CONST CHAR8 *Language OPTIONAL | |
| ); | |
| EFI_STATUS | |
| ProcessShellParameters ( | |
| OUT CHAR16 **KernelPath, | |
| OUT CHAR16 **FdtPath, | |
| OUT CHAR16 **InitrdPath, | |
| OUT CHAR16 **LinuxCommandLine, | |
| OUT UINTN *AtagMachineType | |
| ); | |
| EFI_STATUS | |
| ProcessAppCommandLine ( | |
| OUT CHAR16 **KernelTextDevicePath, | |
| OUT CHAR16 **FdtTextDevicePath, | |
| OUT CHAR16 **InitrdTextDevicePath, | |
| OUT CHAR16 **LinuxCommandLine, | |
| OUT UINTN *AtagMachineType | |
| ); | |
| VOID | |
| PrintPerformance ( | |
| VOID | |
| ); | |
| EFI_STATUS | |
| GetSystemMemoryResources ( | |
| IN LIST_ENTRY *ResourceList | |
| ); | |
| EFI_STATUS | |
| PrepareFdt ( | |
| IN EFI_PHYSICAL_ADDRESS SystemMemoryBase, | |
| IN CONST CHAR8* CommandLineArguments, | |
| IN EFI_PHYSICAL_ADDRESS InitrdImage, | |
| IN UINTN InitrdImageSize, | |
| IN OUT EFI_PHYSICAL_ADDRESS *FdtBlobBase, | |
| IN OUT UINTN *FdtBlobSize | |
| ); | |
| /** | |
| Start a Linux kernel from a Device Path | |
| @param SystemMemoryBase Base of the system memory | |
| @param LinuxKernel Device Path to the Linux Kernel | |
| @param Parameters Linux kernel arguments | |
| @param Fdt Device Path to the Flat Device Tree | |
| @param MachineType ARM machine type value | |
| @retval EFI_SUCCESS All drivers have been connected | |
| @retval EFI_NOT_FOUND The Linux kernel Device Path has not been found | |
| @retval EFI_OUT_OF_RESOURCES There is not enough resource memory to store the matching results. | |
| @retval RETURN_UNSUPPORTED ATAG is not support by this architecture | |
| **/ | |
| EFI_STATUS | |
| BootLinuxAtag ( | |
| IN EFI_PHYSICAL_ADDRESS SystemMemoryBase, | |
| IN EFI_DEVICE_PATH_PROTOCOL* LinuxKernelDevicePath, | |
| IN EFI_DEVICE_PATH_PROTOCOL* InitrdDevicePath, | |
| IN CONST CHAR8* CommandLineArguments, | |
| IN UINTN MachineType | |
| ); | |
| /** | |
| Start a Linux kernel from a Device Path | |
| @param[in] LinuxKernelDevicePath Device Path to the Linux Kernel | |
| @param[in] InitrdDevicePath Device Path to the Initrd | |
| @param[in] Arguments Linux kernel arguments | |
| @retval EFI_SUCCESS All drivers have been connected | |
| @retval EFI_NOT_FOUND The Linux kernel Device Path has not been found | |
| @retval EFI_OUT_OF_RESOURCES There is not enough resource memory to store the matching results. | |
| **/ | |
| EFI_STATUS | |
| BootLinuxFdt ( | |
| IN EFI_PHYSICAL_ADDRESS SystemMemoryBase, | |
| IN EFI_DEVICE_PATH_PROTOCOL* LinuxKernelDevicePath, | |
| IN EFI_DEVICE_PATH_PROTOCOL* InitrdDevicePath, | |
| IN EFI_DEVICE_PATH_PROTOCOL* FdtDevicePath, | |
| IN CONST CHAR8* Arguments | |
| ); | |
| #endif /* __LINUX_LOADER_H__ */ |