12#include <Library/BaseLib.h>
13#include <Library/DevicePathLib.h>
14#include <Library/MemoryAllocationLib.h>
20#include <Library/UefiBootServicesTableLib.h>
48 if (Entry->Id != NULL) {
49 FreePool ((CHAR8 *)Entry->Id);
52 if (Entry->Name != NULL) {
53 FreePool ((CHAR8 *)Entry->Name);
56 if (Entry->Path != NULL) {
57 FreePool ((CHAR8 *)Entry->Path);
60 if (Entry->Arguments != NULL) {
61 FreePool ((CHAR8 *)Entry->Arguments);
64 if (Entry->Flavour != NULL) {
65 FreePool ((CHAR8 *)Entry->Flavour);
81 if ((Entries == NULL) || (*Entries == NULL)) {
85 for (Index = 0; Index < NumEntries; Index++) {
98 IN CONST EFI_HANDLE Device OPTIONAL,
100 OUT UINTN *NumEntries
104 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem;
105 EFI_FILE_PROTOCOL *RootDirectory;
106 UINT32 FileSystemPolicy;
107 CONST EFI_PARTITION_ENTRY *PartitionEntry;
109 ASSERT (PickerContext != NULL);
111 ASSERT (NumEntries != NULL);
120 if (Device == NULL) {
121 return EFI_NOT_FOUND;
127 Status =
gBS->HandleProtocol (
132 if (EFI_ERROR (Status)) {
133 DEBUG ((DEBUG_WARN,
"LNX: Missing filesystem - %r\n", Status));
140 Status = FileSystem->OpenVolume (
144 if (EFI_ERROR (Status)) {
145 DEBUG ((DEBUG_WARN,
"LNX: Invalid root volume - %r\n", Status));
160 Status = EFI_NOT_FOUND;
164 Status = EFI_NOT_FOUND;
168 DEBUG ((DEBUG_INFO,
"LNX: %a - requested not to scan\n",
gFileSystemType));
169 Status = EFI_NOT_FOUND;
174 DEBUG ((DEBUG_INFO,
"LNX: %a - requested not to scan\n",
gFileSystemType));
175 Status = EFI_NOT_FOUND;
180 DEBUG ((DEBUG_INFO,
"LNX: %a - requested not to scan\n",
gFileSystemType));
181 Status = EFI_NOT_FOUND;
186 DEBUG ((DEBUG_INFO,
"LNX: %a - requested not to scan\n",
gFileSystemType));
187 Status = EFI_NOT_FOUND;
200 DEBUG ((DEBUG_INFO,
"LNX: %a - requested not to scan\n",
gFileSystemType));
201 Status = EFI_NOT_FOUND;
205 if (EFI_ERROR (Status)) {
206 RootDirectory->Close (RootDirectory);
214 if (PartitionEntry == NULL) {
225 "LNX: TypeGUID: %g (%a) PARTUUID: %g\n",
226 (PartitionEntry == NULL) ? &gEfiPartTypeUnusedGuid : &PartitionEntry->PartitionTypeGUID,
245 if ( EFI_ERROR (Status)
258 RootDirectory->Close (RootDirectory);
275 IN EFI_HANDLE ImageHandle,
276 IN EFI_SYSTEM_TABLE *SystemTable
280 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
282 UINTN RemoveBootFlags;
284 Status =
gBS->HandleProtocol (
287 (VOID **)&LoadedImage
290 if (EFI_ERROR (Status)) {
298 if (!EFI_ERROR (Status)) {
307 if (Status != EFI_NOT_FOUND) {
317 if (EFI_ERROR (Status)) {
322 Status =
gBS->InstallMultipleProtocolInterfaces (
329 ASSERT_EFI_ERROR (Status);
330 if (EFI_ERROR (Status)) {
EFI_STATUS InternalAutodetectLinux(IN EFI_FILE_PROTOCOL *RootDirectory, OUT OC_PICKER_ENTRY **Entries, OUT UINTN *NumEntries)
EFI_STATUS InternalPreloadAutoOpts(IN OC_FLEX_ARRAY *Options)
#define LINUX_BOOT_SCAN_LINUX_ROOT
EFI_STATUS InternalScanLoaderEntries(IN EFI_FILE_PROTOCOL *RootDirectory, OUT OC_PICKER_ENTRY **Entries, OUT UINTN *NumEntries)
#define LINUX_BOOT_SCAN_XBOOTLDR
#define LINUX_BOOT_ADD_DEBUG_INFO
#define LINUX_BOOT_ADD_RW
#define LINUX_BOOT_SCAN_ESP
#define LINUX_BOOT_LOG_GRUB_VARS
#define LINUX_BOOT_ALLOW_AUTODETECT
#define LINUX_BOOT_SCAN_OTHER
#define LINUX_BOOT_SCAN_LINUX_DATA
#define LINUX_BOOT_LOG_VERBOSE
EFI_GUID gOcBootEntryProtocolGuid
#define OC_BOOT_ENTRY_PROTOCOL_REVISION
UINT32 OcGetFileSystemPolicyType(IN EFI_HANDLE Handle)
#define OC_SCAN_ALLOW_FS_HFS
#define OC_SCAN_ALLOW_FS_LINUX_DATA
EFI_STATUS OcParseLoadOptions(IN CONST EFI_LOADED_IMAGE_PROTOCOL *LoadedImage, OUT OC_FLEX_ARRAY **ParsedVars)
EFI_STATUS OcParsedVarsGetInt(IN CONST OC_FLEX_ARRAY *ParsedVars, IN CONST VOID *Name, OUT UINTN *Value, IN CONST OC_STRING_FORMAT StringFormat)
#define OC_SCAN_ALLOW_FS_LINUX_ROOT
#define OC_SCAN_ALLOW_FS_ESP
#define OC_SCAN_ALLOW_FS_APFS
#define OC_SCAN_ALLOW_FS_NTFS
#define OC_SCAN_ALLOW_FS_XBOOTLDR
CONST EFI_PARTITION_ENTRY * OcGetGptPartitionEntry(IN EFI_HANDLE FsHandle)
STATIC OC_FLEX_ARRAY * mParsedLoadOptions
OC_FLEX_ARRAY * gLoaderEntries
VOID InternalFreePickerEntry(IN OC_PICKER_ENTRY *Entry)
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
STATIC OC_BOOT_ENTRY_PROTOCOL mLinuxBootEntryProtocol
STATIC EFI_STATUS EFIAPI OcGetLinuxBootEntries(IN OUT OC_PICKER_CONTEXT *PickerContext, IN CONST EFI_HANDLE Device OPTIONAL, OUT OC_PICKER_ENTRY **Entries, OUT UINTN *NumEntries)
OC_PICKER_CONTEXT * gPickerContext
STATIC VOID EFIAPI OcFreeLinuxBootEntries(IN OC_PICKER_ENTRY **Entries, IN UINTN NumEntries)
GUID *EFIAPI CopyGuid(OUT GUID *DestinationGuid, IN CONST GUID *SourceGuid)
EFI_GUID gEfiSimpleFileSystemProtocolGuid
EFI_GUID gEfiLoadedImageProtocolGuid