From abc9e3f475669d8e7615ed6dbc1e901cb21384a8 Mon Sep 17 00:00:00 2001 From: srs5694 Date: Tue, 3 Feb 2015 12:26:39 -0500 Subject: [PATCH] Moved legacy functions from refind/main.c to their own file. --- NEWS.txt | 6 + docs/refind/configfile.html | 4 +- refind.conf-sample | 1 + refind/Make.tiano | 2 +- refind/Makefile | 2 +- refind/config.c | 3 +- refind/config.h | 12 - refind/global.h | 30 ++ refind/lib.c | 2 +- refind/main.c | 608 ++---------------------------------- 10 files changed, 63 insertions(+), 607 deletions(-) diff --git a/NEWS.txt b/NEWS.txt index 661a53d..b6f164d 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -1,6 +1,12 @@ 0.8.6 (?/??/2016): ------------------ +- Code refactoring to clear out legacy-boot functions from the + ever-expanding refind/main.c file. + +- Added new "badges" option to the "hideui" token in refind.conf. This + option hides the device-type badges associated with the OS boot options. + - Reverted rEFIt commit r472, introduced in rEFInd 0.8.5 to support more BMP images because I've received bug reports that it's causing existing selection images to fail to load. diff --git a/docs/refind/configfile.html b/docs/refind/configfile.html index 0a54c4e..bbd5bd3 100644 --- a/docs/refind/configfile.html +++ b/docs/refind/configfile.html @@ -234,8 +234,8 @@ timeout 20 hideui - banner, label, singleuser, safemode, hwtest, arrows, hints, editor, or all - Removes the specified user interface features. banner removes the banner graphic or background image, label removes the text description of each tag and the countdown timer, singleuser removes the single-user option from the OS X sub-menu, safemode removes the option to boot to safe mode from the OS X sub-menu, hwtest removes the Macintosh hardware test option, arrows removes the arrows to the right or left of the OS tags when rEFInd finds too many OSes to display simultaneously, hints removes the brief description of what basic keypresses do, editor disables the options editor, and all removes all of these options. You can specify multiple parameters with this option. The default is to set none of these values. + banner, label, singleuser, safemode, hwtest, arrows, hints, editor, badges, or all + Removes the specified user interface features. banner removes the banner graphic or background image, label removes the text description of each tag and the countdown timer, singleuser removes the single-user option from the OS X sub-menu, safemode removes the option to boot to safe mode from the OS X sub-menu, hwtest removes the Macintosh hardware test option, arrows removes the arrows to the right or left of the OS tags when rEFInd finds too many OSes to display simultaneously, hints removes the brief description of what basic keypresses do, editor disables the options editor, badges removes the device-type badges from the OS tags, and all removes all of these features. You can specify multiple parameters with this option. The default is to set none of these values. icons_dir diff --git a/refind.conf-sample b/refind.conf-sample index 92b15cb..856a6d9 100644 --- a/refind.conf-sample +++ b/refind.conf-sample @@ -30,6 +30,7 @@ timeout 20 # arrows - scroll arrows on the OS selection tag line # hints - brief command summary in the menu # editor - the options editor (+, F2, or Insert on boot options menu) +# badges - device-type badges for boot options # all - all of the above # Default is none of these (all elements active) # diff --git a/refind/Make.tiano b/refind/Make.tiano index 6b1a890..f8f60ff 100644 --- a/refind/Make.tiano +++ b/refind/Make.tiano @@ -35,7 +35,7 @@ ALL_EFILIBS = $(EFILIB)/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevel # /usr/local/UDK2010/MyWorkSpace/Build/MdeModule/RELEASE_GCC46/X64/MdeModulePkg/Core/Dxe/DxeMain/OUTPUT/DxeMain/DxeMain.obj -SOURCE_NAMES = config driver_support icns lib main menu screen gpt crc32 AutoGen +SOURCE_NAMES = config driver_support icns lib main menu screen gpt crc32 legacy AutoGen OBJS = $(SOURCE_NAMES:=.obj) all: $(BUILDME) diff --git a/refind/Makefile b/refind/Makefile index b03dfef..402e33d 100644 --- a/refind/Makefile +++ b/refind/Makefile @@ -25,7 +25,7 @@ LOCAL_CPPFLAGS = -I$(SRCDIR) -I$(SRCDIR)/../include -I$(SRCDIR)/../libeg -I$(SR LOCAL_LDFLAGS = -L$(SRCDIR)/../libeg/ -L$(SRCDIR)/../mok/ -L$(SRCDIR)/../EfiLib/ LOCAL_LIBS = -leg -lmok -lEfiLib -OBJS = main.o config.o menu.o screen.o icns.o gpt.o crc32.o lib.o driver_support.o +OBJS = main.o config.o menu.o screen.o icns.o gpt.o crc32.o lib.o driver_support.o legacy.o #OBJS = main.o config.o menu.o screen.o icns.o lib.o mok.o driver_support.o variables.o sha256.o pecoff.o simple_file.o security_policy.o guid.o all: $(TARGET) diff --git a/refind/config.c b/refind/config.c index f534841..731adb7 100644 --- a/refind/config.c +++ b/refind/config.c @@ -64,7 +64,8 @@ #define GetTime ST->RuntimeServices->GetTime #define LAST_MINUTE 1439 /* Last minute of a day */ -static REFIT_MENU_ENTRY MenuEntryReturn = { L"Return to Main Menu", TAG_RETURN, 0, 0, 0, NULL, NULL, NULL }; +extern REFIT_MENU_ENTRY MenuEntryReturn; +//static REFIT_MENU_ENTRY MenuEntryReturn = { L"Return to Main Menu", TAG_RETURN, 0, 0, 0, NULL, NULL, NULL }; // // read a file into a buffer diff --git a/refind/config.h b/refind/config.h index 2e39f50..72c9fc0 100644 --- a/refind/config.h +++ b/refind/config.h @@ -68,18 +68,6 @@ typedef struct { CHAR16 *End16Ptr; } REFIT_FILE; -#define HIDEUI_FLAG_NONE (0x0000) -#define HIDEUI_FLAG_BANNER (0x0001) -#define HIDEUI_FLAG_LABEL (0x0002) -#define HIDEUI_FLAG_SINGLEUSER (0x0004) -#define HIDEUI_FLAG_HWTEST (0x0008) -#define HIDEUI_FLAG_ARROWS (0x0010) -#define HIDEUI_FLAG_HINTS (0x0020) -#define HIDEUI_FLAG_EDITOR (0x0040) -#define HIDEUI_FLAG_SAFEMODE (0x0080) -#define HIDEUI_FLAG_BADGES (0x0100) -#define HIDEUI_FLAG_ALL ((0xffff)) - #define CONFIG_FILE_NAME L"refind.conf" // Note: Below is combined with MOK_NAMES to make default #define DONT_SCAN_FILES L"shim.efi,shim-fedora.efi,shimx64.efi,PreLoader.efi,TextMode.efi,ebounce.efi,GraphicsConsole.efi,bootmgr.efi" diff --git a/refind/global.h b/refind/global.h index 5daf41b..584b108 100644 --- a/refind/global.h +++ b/refind/global.h @@ -88,6 +88,10 @@ #define GRAPHICS_FOR_GRUB 8 #define GRAPHICS_FOR_WINDOWS 16 +// Load types +#define TYPE_EFI 1 +#define TYPE_LEGACY 2 + // Type of legacy (BIOS) boot support detected #define LEGACY_TYPE_NONE 0 #define LEGACY_TYPE_MAC 1 @@ -149,6 +153,24 @@ // Files that may be Windows recovery files #define WINDOWS_RECOVERY_FILES L"EFI\\Microsoft\\Boot\\LrsBootmgr.efi,Recovery:\\EFI\\BOOT\\bootx64.efi,Recovery:\\EFI\\BOOT\\bootia32.efi" +// Definitions for the "hideui" option in refind.conf +#define HIDEUI_FLAG_NONE (0x0000) +#define HIDEUI_FLAG_BANNER (0x0001) +#define HIDEUI_FLAG_LABEL (0x0002) +#define HIDEUI_FLAG_SINGLEUSER (0x0004) +#define HIDEUI_FLAG_HWTEST (0x0008) +#define HIDEUI_FLAG_ARROWS (0x0010) +#define HIDEUI_FLAG_HINTS (0x0020) +#define HIDEUI_FLAG_EDITOR (0x0040) +#define HIDEUI_FLAG_SAFEMODE (0x0080) +#define HIDEUI_FLAG_BADGES (0x0100) +#define HIDEUI_FLAG_ALL ((0xffff)) + +// Default hint text for program-launch submenus +#define SUBSCREEN_HINT1 L"Use arrow keys to move cursor; Enter to boot;" +#define SUBSCREEN_HINT2 L"Insert or F2 to edit options; Esc to return to main menu" +#define SUBSCREEN_HINT2_NO_EDITOR L"Esc to return to main menu" + #define NULL_GUID_VALUE { 0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} }; #define REFIND_GUID_VALUE { 0x36D08FA7, 0xCF0B, 0x42F5, {0x8F, 0x14, 0x68, 0xDF, 0x73, 0xED, 0x37, 0x40} }; @@ -295,13 +317,21 @@ extern REFIT_CONFIG GlobalConfig; extern EFI_GUID gEfiLegacyBootProtocolGuid; extern EFI_GUID gEfiGlobalVariableGuid; +EFI_STATUS StartEFIImageList(IN EFI_DEVICE_PATH **DevicePaths, + IN CHAR16 *LoadOptions, IN UINTN LoaderType, + IN CHAR16 *ImageTitle, IN CHAR8 OSType, + OUT UINTN *ErrorInStep, + IN BOOLEAN Verbose, + IN BOOLEAN IsDriver); LOADER_ENTRY *InitializeLoaderEntry(IN LOADER_ENTRY *Entry); REFIT_MENU_SCREEN *InitializeSubScreen(IN LOADER_ENTRY *Entry); VOID GenerateSubScreen(LOADER_ENTRY *Entry, IN REFIT_VOLUME *Volume); +EG_IMAGE * GetDiskBadge(IN UINTN DiskType); LOADER_ENTRY * MakeGenericLoaderEntry(VOID); LOADER_ENTRY * AddLoaderEntry(IN CHAR16 *LoaderPath, IN CHAR16 *LoaderTitle, IN REFIT_VOLUME *Volume); VOID SetLoaderDefaults(LOADER_ENTRY *Entry, CHAR16 *LoaderPath, IN REFIT_VOLUME *Volume); LOADER_ENTRY * AddPreparedLoaderEntry(LOADER_ENTRY *Entry); +VOID StoreLoaderName(IN CHAR16 *Name); #endif diff --git a/refind/lib.c b/refind/lib.c index 50e7cc6..60229c4 100644 --- a/refind/lib.c +++ b/refind/lib.c @@ -654,7 +654,7 @@ static VOID ScanVolumeBootcode(REFIT_VOLUME *Volume, BOOLEAN *Bootable) } // NOTE: If you add an operating system with a name that starts with 'W' or 'L', you - // need to fix AddLegacyEntry in main.c. + // need to fix AddLegacyEntry in refind/legacy.c. #if REFIT_DEBUG > 0 Print(L" Result of bootcode detection: %s %s (%s)\n", diff --git a/refind/main.c b/refind/main.c index f78020b..c45aa26 100644 --- a/refind/main.c +++ b/refind/main.c @@ -45,16 +45,18 @@ #include "global.h" #include "config.h" #include "screen.h" +#include "legacy.h" #include "lib.h" #include "icns.h" #include "menu.h" #include "mok.h" #include "gpt.h" #include "security_policy.h" +#include "driver_support.h" #include "../include/Handle.h" #include "../include/refit_call_wrapper.h" -#include "driver_support.h" -#include "../include/syslinux_mbr.h" +#include "../EfiLib/BdsHelper.h" +#include "../EfiLib/legacy.h" #ifdef __MAKEWITH_GNUEFI #ifndef EFI_SECURITY_VIOLATION @@ -62,9 +64,6 @@ #endif #endif -#include "../EfiLib/BdsHelper.h" -#include "../EfiLib/legacy.h" - #ifndef EFI_OS_INDICATIONS_BOOT_TO_FW_UI #define EFI_OS_INDICATIONS_BOOT_TO_FW_UI 0x0000000000000001ULL #endif @@ -125,25 +124,16 @@ // a ".efi" extension to be found when scanning for boot loaders. #define LINUX_MATCH_PATTERNS L"vmlinuz*,bzImage*" -// Default hint text for program-launch submenus -#define SUBSCREEN_HINT1 L"Use arrow keys to move cursor; Enter to boot;" -#define SUBSCREEN_HINT2 L"Insert or F2 to edit options; Esc to return to main menu" -#define SUBSCREEN_HINT2_NO_EDITOR L"Esc to return to main menu" - -// Load types -#define TYPE_EFI 1 -#define TYPE_LEGACY 2 - static REFIT_MENU_ENTRY MenuEntryAbout = { L"About rEFInd", TAG_ABOUT, 1, 0, 'A', NULL, NULL, NULL }; static REFIT_MENU_ENTRY MenuEntryReset = { L"Reboot Computer", TAG_REBOOT, 1, 0, 'R', NULL, NULL, NULL }; static REFIT_MENU_ENTRY MenuEntryShutdown = { L"Shut Down Computer", TAG_SHUTDOWN, 1, 0, 'U', NULL, NULL, NULL }; -static REFIT_MENU_ENTRY MenuEntryReturn = { L"Return to Main Menu", TAG_RETURN, 1, 0, 0, NULL, NULL, NULL }; +REFIT_MENU_ENTRY MenuEntryReturn = { L"Return to Main Menu", TAG_RETURN, 1, 0, 0, NULL, NULL, NULL }; static REFIT_MENU_ENTRY MenuEntryExit = { L"Exit rEFInd", TAG_EXIT, 1, 0, 0, NULL, NULL, NULL }; static REFIT_MENU_ENTRY MenuEntryFirmware = { L"Reboot to Computer Setup Utility", TAG_FIRMWARE, 1, 0, 0, NULL, NULL, NULL }; -static REFIT_MENU_SCREEN MainMenu = { L"Main Menu", NULL, 0, NULL, 0, NULL, 0, L"Automatic boot", - L"Use arrow keys to move cursor; Enter to boot;", - L"Insert or F2 for more options; Esc to refresh" }; +REFIT_MENU_SCREEN MainMenu = { L"Main Menu", NULL, 0, NULL, 0, NULL, 0, L"Automatic boot", + L"Use arrow keys to move cursor; Enter to boot;", + L"Insert or F2 for more options; Esc to refresh" }; static REFIT_MENU_SCREEN AboutMenu = { L"About", NULL, 0, NULL, 0, NULL, 0, NULL, L"Press Enter to return to main menu", L"" }; REFIT_CONFIG GlobalConfig = { FALSE, TRUE, FALSE, FALSE, 0, 0, 0, DONT_CHANGE_TEXT_MODE, 20, 0, 0, GRAPHICS_FOR_OSX, LEGACY_TYPE_MAC, @@ -176,7 +166,7 @@ static VOID AboutrEFInd(VOID) if (AboutMenu.EntryCount == 0) { AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT); - AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.8.5.2"); + AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.8.5.3"); AddMenuInfoLine(&AboutMenu, L""); AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer"); AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012-2015 Roderick W. Smith"); @@ -270,12 +260,12 @@ static BOOLEAN IsValidLoader(EFI_FILE *RootDir, CHAR16 *FileName) { } // BOOLEAN IsValidLoader() // Launch an EFI binary. -static EFI_STATUS StartEFIImageList(IN EFI_DEVICE_PATH **DevicePaths, - IN CHAR16 *LoadOptions, IN UINTN LoaderType, - IN CHAR16 *ImageTitle, IN CHAR8 OSType, - OUT UINTN *ErrorInStep, - IN BOOLEAN Verbose, - IN BOOLEAN IsDriver) +EFI_STATUS StartEFIImageList(IN EFI_DEVICE_PATH **DevicePaths, + IN CHAR16 *LoadOptions, IN UINTN LoaderType, + IN CHAR16 *ImageTitle, IN CHAR8 OSType, + OUT UINTN *ErrorInStep, + IN BOOLEAN Verbose, + IN BOOLEAN IsDriver) { EFI_STATUS Status, ReturnStatus; EFI_HANDLE ChildImageHandle; @@ -380,7 +370,7 @@ bailout_unload: bailout: MyFreePool(FullLoadOptions); return ReturnStatus; -} /* static EFI_STATUS StartEFIImageList() */ +} /* EFI_STATUS StartEFIImageList() */ static EFI_STATUS StartEFIImage(IN EFI_DEVICE_PATH *DevicePath, IN CHAR16 *LoadOptions, IN UINTN LoaderType, @@ -423,7 +413,7 @@ static EFI_STATUS RebootIntoFirmware(VOID) { // Record the value of the loader's name/description in rEFInd's "PreviousBoot" EFI variable, // if it's different from what's already stored there. -static VOID StoreLoaderName(IN CHAR16 *Name) { +VOID StoreLoaderName(IN CHAR16 *Name) { EFI_STATUS Status; CHAR16 *OldName = NULL; UINTN Length; @@ -1545,302 +1535,8 @@ static VOID ScanOptical(VOID) { } // for } // static VOID ScanOptical() -// -// legacy boot functions -// - -static EFI_STATUS ActivateMbrPartition(IN EFI_BLOCK_IO *BlockIO, IN UINTN PartitionIndex) -{ - EFI_STATUS Status; - UINT8 SectorBuffer[512]; - MBR_PARTITION_INFO *MbrTable, *EMbrTable; - UINT32 ExtBase, ExtCurrent, NextExtCurrent; - UINTN LogicalPartitionIndex = 4; - UINTN i; - BOOLEAN HaveBootCode; - - // read MBR - Status = refit_call5_wrapper(BlockIO->ReadBlocks, BlockIO, BlockIO->Media->MediaId, 0, 512, SectorBuffer); - if (EFI_ERROR(Status)) - return Status; - if (*((UINT16 *)(SectorBuffer + 510)) != 0xaa55) - return EFI_NOT_FOUND; // safety measure #1 - - // add boot code if necessary - HaveBootCode = FALSE; - for (i = 0; i < MBR_BOOTCODE_SIZE; i++) { - if (SectorBuffer[i] != 0) { - HaveBootCode = TRUE; - break; - } - } - if (!HaveBootCode) { - // no boot code found in the MBR, add the syslinux MBR code - SetMem(SectorBuffer, MBR_BOOTCODE_SIZE, 0); - CopyMem(SectorBuffer, syslinux_mbr, SYSLINUX_MBR_SIZE); - } - - // set the partition active - MbrTable = (MBR_PARTITION_INFO *)(SectorBuffer + 446); - ExtBase = 0; - for (i = 0; i < 4; i++) { - if (MbrTable[i].Flags != 0x00 && MbrTable[i].Flags != 0x80) - return EFI_NOT_FOUND; // safety measure #2 - if (i == PartitionIndex) - MbrTable[i].Flags = 0x80; - else if (PartitionIndex >= 4 && IS_EXTENDED_PART_TYPE(MbrTable[i].Type)) { - MbrTable[i].Flags = 0x80; - ExtBase = MbrTable[i].StartLBA; - } else - MbrTable[i].Flags = 0x00; - } - - // write MBR - Status = refit_call5_wrapper(BlockIO->WriteBlocks, BlockIO, BlockIO->Media->MediaId, 0, 512, SectorBuffer); - if (EFI_ERROR(Status)) - return Status; - - if (PartitionIndex >= 4) { - // we have to activate a logical partition, so walk the EMBR chain - - // NOTE: ExtBase was set above while looking at the MBR table - for (ExtCurrent = ExtBase; ExtCurrent; ExtCurrent = NextExtCurrent) { - // read current EMBR - Status = refit_call5_wrapper(BlockIO->ReadBlocks, BlockIO, BlockIO->Media->MediaId, ExtCurrent, 512, SectorBuffer); - if (EFI_ERROR(Status)) - return Status; - if (*((UINT16 *)(SectorBuffer + 510)) != 0xaa55) - return EFI_NOT_FOUND; // safety measure #3 - - // scan EMBR, set appropriate partition active - EMbrTable = (MBR_PARTITION_INFO *)(SectorBuffer + 446); - NextExtCurrent = 0; - for (i = 0; i < 4; i++) { - if (EMbrTable[i].Flags != 0x00 && EMbrTable[i].Flags != 0x80) - return EFI_NOT_FOUND; // safety measure #4 - if (EMbrTable[i].StartLBA == 0 || EMbrTable[i].Size == 0) - break; - if (IS_EXTENDED_PART_TYPE(EMbrTable[i].Type)) { - // link to next EMBR - NextExtCurrent = ExtBase + EMbrTable[i].StartLBA; - EMbrTable[i].Flags = (PartitionIndex >= LogicalPartitionIndex) ? 0x80 : 0x00; - break; - } else { - // logical partition - EMbrTable[i].Flags = (PartitionIndex == LogicalPartitionIndex) ? 0x80 : 0x00; - LogicalPartitionIndex++; - } - } - - // write current EMBR - Status = refit_call5_wrapper(BlockIO->WriteBlocks, BlockIO, BlockIO->Media->MediaId, ExtCurrent, 512, SectorBuffer); - if (EFI_ERROR(Status)) - return Status; - - if (PartitionIndex < LogicalPartitionIndex) - break; // stop the loop, no need to touch further EMBRs - } - - } - - return EFI_SUCCESS; -} /* static EFI_STATUS ActivateMbrPartition() */ - -static EFI_GUID AppleVariableVendorID = { 0x7C436110, 0xAB2A, 0x4BBB, 0xA8, 0x80, 0xFE, 0x41, 0x99, 0x5C, 0x9F, 0x82 }; - -static EFI_STATUS WriteBootDiskHint(IN EFI_DEVICE_PATH *WholeDiskDevicePath) -{ - EFI_STATUS Status; - - Status = refit_call5_wrapper(RT->SetVariable, L"BootCampHD", &AppleVariableVendorID, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - GetDevicePathSize(WholeDiskDevicePath), WholeDiskDevicePath); - if (EFI_ERROR(Status)) - return Status; - - return EFI_SUCCESS; -} - -// early 2006 Core Duo / Core Solo models -static UINT8 LegacyLoaderDevicePath1Data[] = { - 0x01, 0x03, 0x18, 0x00, 0x0B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xF9, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x06, 0x14, 0x00, 0xEB, 0x85, 0x05, 0x2B, - 0xB8, 0xD8, 0xA9, 0x49, 0x8B, 0x8C, 0xE2, 0x1B, - 0x01, 0xAE, 0xF2, 0xB7, 0x7F, 0xFF, 0x04, 0x00, -}; -// mid-2006 Mac Pro (and probably other Core 2 models) -static UINT8 LegacyLoaderDevicePath2Data[] = { - 0x01, 0x03, 0x18, 0x00, 0x0B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xF7, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x06, 0x14, 0x00, 0xEB, 0x85, 0x05, 0x2B, - 0xB8, 0xD8, 0xA9, 0x49, 0x8B, 0x8C, 0xE2, 0x1B, - 0x01, 0xAE, 0xF2, 0xB7, 0x7F, 0xFF, 0x04, 0x00, -}; -// mid-2007 MBP ("Santa Rosa" based models) -static UINT8 LegacyLoaderDevicePath3Data[] = { - 0x01, 0x03, 0x18, 0x00, 0x0B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xE0, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x06, 0x14, 0x00, 0xEB, 0x85, 0x05, 0x2B, - 0xB8, 0xD8, 0xA9, 0x49, 0x8B, 0x8C, 0xE2, 0x1B, - 0x01, 0xAE, 0xF2, 0xB7, 0x7F, 0xFF, 0x04, 0x00, -}; -// early-2008 MBA -static UINT8 LegacyLoaderDevicePath4Data[] = { - 0x01, 0x03, 0x18, 0x00, 0x0B, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xFF, 0xF8, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x06, 0x14, 0x00, 0xEB, 0x85, 0x05, 0x2B, - 0xB8, 0xD8, 0xA9, 0x49, 0x8B, 0x8C, 0xE2, 0x1B, - 0x01, 0xAE, 0xF2, 0xB7, 0x7F, 0xFF, 0x04, 0x00, -}; -// late-2008 MB/MBP (NVidia chipset) -static UINT8 LegacyLoaderDevicePath5Data[] = { - 0x01, 0x03, 0x18, 0x00, 0x0B, 0x00, 0x00, 0x00, - 0x00, 0x40, 0xCB, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0xFF, 0xBF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x06, 0x14, 0x00, 0xEB, 0x85, 0x05, 0x2B, - 0xB8, 0xD8, 0xA9, 0x49, 0x8B, 0x8C, 0xE2, 0x1B, - 0x01, 0xAE, 0xF2, 0xB7, 0x7F, 0xFF, 0x04, 0x00, -}; - -static EFI_DEVICE_PATH *LegacyLoaderList[] = { - (EFI_DEVICE_PATH *)LegacyLoaderDevicePath1Data, - (EFI_DEVICE_PATH *)LegacyLoaderDevicePath2Data, - (EFI_DEVICE_PATH *)LegacyLoaderDevicePath3Data, - (EFI_DEVICE_PATH *)LegacyLoaderDevicePath4Data, - (EFI_DEVICE_PATH *)LegacyLoaderDevicePath5Data, - NULL -}; - -#define MAX_DISCOVERED_PATHS (16) - -static VOID StartLegacy(IN LEGACY_ENTRY *Entry, IN CHAR16 *SelectionName) -{ - EFI_STATUS Status; - EG_IMAGE *BootLogoImage; - UINTN ErrorInStep = 0; - EFI_DEVICE_PATH *DiscoveredPathList[MAX_DISCOVERED_PATHS]; - - BeginExternalScreen(TRUE, L"Booting Legacy OS (Mac mode)"); - - BootLogoImage = LoadOSIcon(Entry->Volume->OSIconName, L"legacy", TRUE); - if (BootLogoImage != NULL) - BltImageAlpha(BootLogoImage, - (UGAWidth - BootLogoImage->Width ) >> 1, - (UGAHeight - BootLogoImage->Height) >> 1, - &StdBackgroundPixel); - - if (Entry->Volume->IsMbrPartition) - ActivateMbrPartition(Entry->Volume->WholeDiskBlockIO, Entry->Volume->MbrPartitionIndex); - - if (Entry->Volume->DiskKind != DISK_KIND_OPTICAL && Entry->Volume->WholeDiskDevicePath != NULL) - WriteBootDiskHint(Entry->Volume->WholeDiskDevicePath); - - ExtractLegacyLoaderPaths(DiscoveredPathList, MAX_DISCOVERED_PATHS, LegacyLoaderList); - - StoreLoaderName(SelectionName); - Status = StartEFIImageList(DiscoveredPathList, Entry->LoadOptions, TYPE_LEGACY, L"legacy loader", 0, &ErrorInStep, TRUE, FALSE); - if (Status == EFI_NOT_FOUND) { - if (ErrorInStep == 1) { - Print(L"\nPlease make sure that you have the latest firmware update installed.\n"); - } else if (ErrorInStep == 3) { - Print(L"\nThe firmware refused to boot from the selected volume. Note that external\n" - L"hard drives are not well-supported by Apple's firmware for legacy OS booting.\n"); - } - } - FinishExternalScreen(); -} /* static VOID StartLegacy() */ - -// Start a device on a non-Mac using the EFI_LEGACY_BIOS_PROTOCOL -static VOID StartLegacyUEFI(LEGACY_ENTRY *Entry, CHAR16 *SelectionName) -{ - BeginExternalScreen(TRUE, L"Booting Legacy OS (UEFI mode)"); - StoreLoaderName(SelectionName); - - BdsLibConnectDevicePath (Entry->BdsOption->DevicePath); - BdsLibDoLegacyBoot(Entry->BdsOption); - - // If we get here, it means that there was a failure.... - Print(L"Failure booting legacy (BIOS) OS."); - PauseForKey(); - FinishExternalScreen(); -} // static VOID StartLegacyUEFI() - -static LEGACY_ENTRY * AddLegacyEntry(IN CHAR16 *LoaderTitle, IN REFIT_VOLUME *Volume) -{ - LEGACY_ENTRY *Entry, *SubEntry; - REFIT_MENU_SCREEN *SubScreen; - CHAR16 *VolDesc, *LegacyTitle; - CHAR16 ShortcutLetter = 0; - - if (LoaderTitle == NULL) { - if (Volume->OSName != NULL) { - LoaderTitle = Volume->OSName; - if (LoaderTitle[0] == 'W' || LoaderTitle[0] == 'L') - ShortcutLetter = LoaderTitle[0]; - } else - LoaderTitle = L"Legacy OS"; - } - if (Volume->VolName != NULL) - VolDesc = Volume->VolName; - else - VolDesc = (Volume->DiskKind == DISK_KIND_OPTICAL) ? L"CD" : L"HD"; - - LegacyTitle = AllocateZeroPool(256 * sizeof(CHAR16)); - if (LegacyTitle != NULL) - SPrint(LegacyTitle, 255, L"Boot %s from %s", LoaderTitle, VolDesc); - if (IsInSubstring(LegacyTitle, GlobalConfig.DontScanVolumes)) { - MyFreePool(LegacyTitle); - return NULL; - } // if - - // prepare the menu entry - Entry = AllocateZeroPool(sizeof(LEGACY_ENTRY)); - Entry->me.Title = LegacyTitle; - Entry->me.Tag = TAG_LEGACY; - Entry->me.Row = 0; - Entry->me.ShortcutLetter = ShortcutLetter; - Entry->me.Image = LoadOSIcon(Volume->OSIconName, L"legacy", FALSE); - Entry->me.BadgeImage = Volume->VolBadgeImage; - Entry->Volume = Volume; - Entry->LoadOptions = (Volume->DiskKind == DISK_KIND_OPTICAL) ? L"CD" : - ((Volume->DiskKind == DISK_KIND_EXTERNAL) ? L"USB" : L"HD"); - Entry->Enabled = TRUE; - - // create the submenu - SubScreen = AllocateZeroPool(sizeof(REFIT_MENU_SCREEN)); - SubScreen->Title = AllocateZeroPool(256 * sizeof(CHAR16)); - SPrint(SubScreen->Title, 255, L"Boot Options for %s on %s", LoaderTitle, VolDesc); - SubScreen->TitleImage = Entry->me.Image; - SubScreen->Hint1 = StrDuplicate(SUBSCREEN_HINT1); - if (GlobalConfig.HideUIFlags & HIDEUI_FLAG_EDITOR) { - SubScreen->Hint2 = StrDuplicate(SUBSCREEN_HINT2_NO_EDITOR); - } else { - SubScreen->Hint2 = StrDuplicate(SUBSCREEN_HINT2); - } // if/else - - // default entry - SubEntry = AllocateZeroPool(sizeof(LEGACY_ENTRY)); - SubEntry->me.Title = AllocateZeroPool(256 * sizeof(CHAR16)); - SPrint(SubEntry->me.Title, 255, L"Boot %s", LoaderTitle); - SubEntry->me.Tag = TAG_LEGACY; - SubEntry->Volume = Entry->Volume; - SubEntry->LoadOptions = Entry->LoadOptions; - AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); - - AddMenuEntry(SubScreen, &MenuEntryReturn); - Entry->me.SubScreen = SubScreen; - AddMenuEntry(&MainMenu, (REFIT_MENU_ENTRY *)Entry); - return Entry; -} /* static LEGACY_ENTRY * AddLegacyEntry() */ - - // default volume badge icon based on disk kind -static EG_IMAGE * GetDiskBadge(IN UINTN DiskType) { +EG_IMAGE * GetDiskBadge(IN UINTN DiskType) { EG_IMAGE * Badge = NULL; switch (DiskType) { @@ -1855,229 +1551,7 @@ static EG_IMAGE * GetDiskBadge(IN UINTN DiskType) { break; } // switch() return Badge; -} // static EG_IMAGE * GetDiskBadge() - -/** - Create a rEFInd boot option from a Legacy BIOS protocol option. -*/ -static LEGACY_ENTRY * AddLegacyEntryUEFI(BDS_COMMON_OPTION *BdsOption, IN UINT16 DiskType) -{ - LEGACY_ENTRY *Entry, *SubEntry; - REFIT_MENU_SCREEN *SubScreen; - CHAR16 ShortcutLetter = 0; - CHAR16 *LegacyDescription = StrDuplicate(BdsOption->Description); - - if (IsInSubstring(LegacyDescription, GlobalConfig.DontScanVolumes)) - return NULL; - - // Remove stray spaces, since many EFIs produce descriptions with lots of - // extra spaces, especially at the end; this throws off centering of the - // description on the screen.... - LimitStringLength(LegacyDescription, 100); - - // prepare the menu entry - Entry = AllocateZeroPool(sizeof(LEGACY_ENTRY)); - Entry->me.Title = AllocateZeroPool(256 * sizeof(CHAR16)); - SPrint(Entry->me.Title, 255, L"Boot legacy target %s", LegacyDescription); - Entry->me.Tag = TAG_LEGACY_UEFI; - Entry->me.Row = 0; - Entry->me.ShortcutLetter = ShortcutLetter; - Entry->me.Image = LoadOSIcon(L"legacy", L"legacy", TRUE); - Entry->LoadOptions = (DiskType == BBS_CDROM) ? L"CD" : - ((DiskType == BBS_USB) ? L"USB" : L"HD"); - Entry->me.BadgeImage = GetDiskBadge(DiskType); - Entry->BdsOption = BdsOption; - Entry->Enabled = TRUE; - - // create the submenu - SubScreen = AllocateZeroPool(sizeof(REFIT_MENU_SCREEN)); - SubScreen->Title = AllocateZeroPool(256 * sizeof(CHAR16)); - SPrint(SubScreen->Title, 255, L"No boot options for legacy target"); - SubScreen->TitleImage = Entry->me.Image; - SubScreen->Hint1 = StrDuplicate(SUBSCREEN_HINT1); - if (GlobalConfig.HideUIFlags & HIDEUI_FLAG_EDITOR) { - SubScreen->Hint2 = StrDuplicate(SUBSCREEN_HINT2_NO_EDITOR); - } else { - SubScreen->Hint2 = StrDuplicate(SUBSCREEN_HINT2); - } // if/else - - // default entry - SubEntry = AllocateZeroPool(sizeof(LEGACY_ENTRY)); - SubEntry->me.Title = AllocateZeroPool(256 * sizeof(CHAR16)); - SPrint(SubEntry->me.Title, 255, L"Boot %s", LegacyDescription); - SubEntry->me.Tag = TAG_LEGACY_UEFI; - Entry->BdsOption = BdsOption; - AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry); - - AddMenuEntry(SubScreen, &MenuEntryReturn); - Entry->me.SubScreen = SubScreen; - AddMenuEntry(&MainMenu, (REFIT_MENU_ENTRY *)Entry); - return Entry; -} /* static LEGACY_ENTRY * AddLegacyEntryUEFI() */ - -/** - Scan for legacy BIOS targets on machines that implement EFI_LEGACY_BIOS_PROTOCOL. - In testing, protocol has not been implemented on Macs but has been - implemented on several Dell PCs and an ASUS motherboard. - Restricts output to disks of the specified DiskType. -*/ -static VOID ScanLegacyUEFI(IN UINTN DiskType) -{ - EFI_STATUS Status; - EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; - UINT16 *BootOrder = NULL; - UINTN Index = 0; - CHAR16 BootOption[10]; - UINTN BootOrderSize = 0; - CHAR16 Buffer[20]; - BDS_COMMON_OPTION *BdsOption; - LIST_ENTRY TempList; - BBS_BBS_DEVICE_PATH *BbsDevicePath = NULL; - BOOLEAN SearchingForUsb = FALSE; - - InitializeListHead (&TempList); - ZeroMem (Buffer, sizeof (Buffer)); - - // If LegacyBios protocol is not implemented on this platform, then - //we do not support this type of legacy boot on this machine. - Status = refit_call3_wrapper(gBS->LocateProtocol, &gEfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios); - if (EFI_ERROR (Status)) - return; - - // EFI calls USB drives BBS_HARDDRIVE, but we want to distinguish them, - // so we set DiskType inappropriately elsewhere in the program and - // "translate" it here. - if (DiskType == BBS_USB) { - DiskType = BBS_HARDDISK; - SearchingForUsb = TRUE; - } // if - - // Grab the boot order - BootOrder = BdsLibGetVariableAndSize(L"BootOrder", &gEfiGlobalVariableGuid, &BootOrderSize); - if (BootOrder == NULL) { - BootOrderSize = 0; - } - - Index = 0; - while (Index < BootOrderSize / sizeof (UINT16)) - { - // Grab each boot option variable from the boot order, and convert - // the variable into a BDS boot option - UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", BootOrder[Index]); - BdsOption = BdsLibVariableToOption (&TempList, BootOption); - - if (BdsOption != NULL) { - BbsDevicePath = (BBS_BBS_DEVICE_PATH *)BdsOption->DevicePath; - // Only add the entry if it is of a requested type (e.g. USB, HD) - // Two checks necessary because some systems return EFI boot loaders - // with a DeviceType value that would inappropriately include them - // as legacy loaders.... - if ((BbsDevicePath->DeviceType == DiskType) && (BdsOption->DevicePath->Type == DEVICE_TYPE_BIOS)) { - // USB flash drives appear as hard disks with certain media flags set. - // Look for this, and if present, pass it on with the (technically - // incorrect, but internally useful) BBS_TYPE_USB flag set. - if (DiskType == BBS_HARDDISK) { - if (SearchingForUsb && (BbsDevicePath->StatusFlag & (BBS_MEDIA_PRESENT | BBS_MEDIA_MAYBE_PRESENT))) { - AddLegacyEntryUEFI(BdsOption, BBS_USB); - } else if (!SearchingForUsb && !(BbsDevicePath->StatusFlag & (BBS_MEDIA_PRESENT | BBS_MEDIA_MAYBE_PRESENT))) { - AddLegacyEntryUEFI(BdsOption, DiskType); - } - } else { - AddLegacyEntryUEFI(BdsOption, DiskType); - } // if/else - } // if - } // if (BdsOption != NULL) - Index++; - } // while -} /* static VOID ScanLegacyUEFI() */ - -static VOID ScanLegacyVolume(REFIT_VOLUME *Volume, UINTN VolumeIndex) { - UINTN VolumeIndex2; - BOOLEAN ShowVolume, HideIfOthersFound; - - ShowVolume = FALSE; - HideIfOthersFound = FALSE; - if (Volume->IsAppleLegacy) { - ShowVolume = TRUE; - HideIfOthersFound = TRUE; - } else if (Volume->HasBootCode) { - ShowVolume = TRUE; - if (Volume->BlockIO == Volume->WholeDiskBlockIO && - Volume->BlockIOOffset == 0 && - Volume->OSName == NULL) - // this is a whole disk (MBR) entry; hide if we have entries for partitions - HideIfOthersFound = TRUE; - } - if (HideIfOthersFound) { - // check for other bootable entries on the same disk - for (VolumeIndex2 = 0; VolumeIndex2 < VolumesCount; VolumeIndex2++) { - if (VolumeIndex2 != VolumeIndex && Volumes[VolumeIndex2]->HasBootCode && - Volumes[VolumeIndex2]->WholeDiskBlockIO == Volume->WholeDiskBlockIO) - ShowVolume = FALSE; - } - } - - if (ShowVolume) - AddLegacyEntry(NULL, Volume); -} // static VOID ScanLegacyVolume() - -// Scan attached optical discs for legacy (BIOS) boot code -// and add anything found to the list.... -static VOID ScanLegacyDisc(VOID) -{ - UINTN VolumeIndex; - REFIT_VOLUME *Volume; - - if (GlobalConfig.LegacyType == LEGACY_TYPE_MAC) { - for (VolumeIndex = 0; VolumeIndex < VolumesCount; VolumeIndex++) { - Volume = Volumes[VolumeIndex]; - if (Volume->DiskKind == DISK_KIND_OPTICAL) - ScanLegacyVolume(Volume, VolumeIndex); - } // for - } else if (GlobalConfig.LegacyType == LEGACY_TYPE_UEFI) { - ScanLegacyUEFI(BBS_CDROM); - } -} /* static VOID ScanLegacyDisc() */ - -// Scan internal hard disks for legacy (BIOS) boot code -// and add anything found to the list.... -static VOID ScanLegacyInternal(VOID) -{ - UINTN VolumeIndex; - REFIT_VOLUME *Volume; - - if (GlobalConfig.LegacyType == LEGACY_TYPE_MAC) { - for (VolumeIndex = 0; VolumeIndex < VolumesCount; VolumeIndex++) { - Volume = Volumes[VolumeIndex]; - if (Volume->DiskKind == DISK_KIND_INTERNAL) - ScanLegacyVolume(Volume, VolumeIndex); - } // for - } else if (GlobalConfig.LegacyType == LEGACY_TYPE_UEFI) { - // TODO: This actually picks up USB flash drives, too; try to find - // a way to differentiate the two.... - ScanLegacyUEFI(BBS_HARDDISK); - } -} /* static VOID ScanLegacyInternal() */ - -// Scan external disks for legacy (BIOS) boot code -// and add anything found to the list.... -static VOID ScanLegacyExternal(VOID) -{ - UINTN VolumeIndex; - REFIT_VOLUME *Volume; - - if (GlobalConfig.LegacyType == LEGACY_TYPE_MAC) { - for (VolumeIndex = 0; VolumeIndex < VolumesCount; VolumeIndex++) { - Volume = Volumes[VolumeIndex]; - if (Volume->DiskKind == DISK_KIND_EXTERNAL) - ScanLegacyVolume(Volume, VolumeIndex); - } // for - } else if (GlobalConfig.LegacyType == LEGACY_TYPE_UEFI) { - // TODO: This actually doesn't do anything useful; leaving in hopes of - // fixing it later.... - ScanLegacyUEFI(BBS_USB); - } -} /* static VOID ScanLegacyExternal() */ +} // EG_IMAGE * GetDiskBadge() // // pre-boot tool functions @@ -2256,50 +1730,6 @@ static VOID LoadDrivers(VOID) ConnectAllDriversToAllControllers(); } /* static VOID LoadDrivers() */ -// Determine what (if any) type of legacy (BIOS) boot support is available -static VOID FindLegacyBootType(VOID) { - EFI_STATUS Status; - EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; - - GlobalConfig.LegacyType = LEGACY_TYPE_NONE; - - // UEFI-style legacy BIOS support is available only with some EFI implementations.... - Status = refit_call3_wrapper(gBS->LocateProtocol, &gEfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios); - if (!EFI_ERROR (Status)) - GlobalConfig.LegacyType = LEGACY_TYPE_UEFI; - - // Macs have their own system. If the firmware vendor code contains the - // string "Apple", assume it's available. Note that this overrides the - // UEFI type, and might yield false positives if the vendor string - // contains "Apple" as part of something bigger, so this isn't 100% - // perfect. - if (StriSubCmp(L"Apple", ST->FirmwareVendor)) - GlobalConfig.LegacyType = LEGACY_TYPE_MAC; -} // static VOID FindLegacyBootType - -// Warn the user if legacy OS scans are enabled but the firmware can't support them.... -static VOID WarnIfLegacyProblems(VOID) { - BOOLEAN found = FALSE; - UINTN i = 0; - - if (GlobalConfig.LegacyType == LEGACY_TYPE_NONE) { - do { - if (GlobalConfig.ScanFor[i] == 'h' || GlobalConfig.ScanFor[i] == 'b' || GlobalConfig.ScanFor[i] == 'c' || - GlobalConfig.ScanFor[i] == 'H' || GlobalConfig.ScanFor[i] == 'B' || GlobalConfig.ScanFor[i] == 'C') - found = TRUE; - i++; - } while ((i < NUM_SCAN_OPTIONS) && (!found)); - - if (found) { - Print(L"NOTE: refind.conf's 'scanfor' line specifies scanning for one or more legacy\n"); - Print(L"(BIOS) boot options; however, this is not possible because your computer lacks\n"); - Print(L"the necessary Compatibility Support Module (CSM) support or that support is\n"); - Print(L"disabled in your firmware.\n"); - PauseForKey(); - } // if (found) - } // if no legacy support -} // static VOID WarnIfLegacyProblems() - // Locates boot loaders. NOTE: This assumes that GlobalConfig.LegacyType is set correctly. static VOID ScanForBootloaders(VOID) { UINTN i; -- 2.39.2