From 118f257faaeeebd8c0b56821d70fcfe8f36289a6 Mon Sep 17 00:00:00 2001 From: srs5694 Date: Mon, 1 Oct 2012 20:18:16 -0400 Subject: [PATCH 1/1] Reconfigured new UEFI BIOS-boot support to use the Mac-style "scanfor" option names. --- CREDITS.txt | 3 ++ EfiLib/BdsHelper.c | 20 +++------- EfiLib/BdsHelper.h | 9 ----- NEWS.txt | 11 ++++++ refind.conf-sample | 7 +--- refind/global.h | 36 ++++++++++++----- refind/main.c | 98 +++++++++++++++++++++++++++++----------------- 7 files changed, 109 insertions(+), 75 deletions(-) diff --git a/CREDITS.txt b/CREDITS.txt index ad33e51..415a337 100644 --- a/CREDITS.txt +++ b/CREDITS.txt @@ -39,3 +39,6 @@ I've incorporated into the current version. Specifically: * Dave Vasilevsky (dave@vasilevsky.ca) contributed the disk-ejection code. + +* John Bressler (jrb1327@gmail.com) contributed the code to boot BIOS-based + OSes on UEFI-based PCs. diff --git a/EfiLib/BdsHelper.c b/EfiLib/BdsHelper.c index 80eb7f2..1f8c5aa 100644 --- a/EfiLib/BdsHelper.c +++ b/EfiLib/BdsHelper.c @@ -7,6 +7,8 @@ #include "BdsHelper.h" +EFI_GUID gEfiLegacyBootProtocolGuid = { 0xdb9a1e3d, 0x45cb, 0x4abb, { 0x85, 0x3b, 0xe5, 0x38, 0x7f, 0xdb, 0x2e, 0x2d }}; + /** Internal helper function. @@ -30,18 +32,18 @@ UpdateBbsTable ( { UINT16 Idx; EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; - EFI_GUID EfiLegacyBootProtocolGuid = { 0xdb9a1e3d, 0x45cb, 0x4abb, { 0x85, 0x3b, 0xe5, 0x38, 0x7f, 0xdb, 0x2e, 0x2d }}; +// EFI_GUID EfiLegacyBootProtocolGuid = { 0xdb9a1e3d, 0x45cb, 0x4abb, { 0x85, 0x3b, 0xe5, 0x38, 0x7f, 0xdb, 0x2e, 0x2d }}; EFI_STATUS Status; UINT16 HddCount = 0; HDD_INFO *HddInfo = NULL; UINT16 BbsCount = 0; BBS_TABLE *LocalBbsTable = NULL; - Status = gBS->LocateProtocol (&EfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios); + Status = gBS->LocateProtocol (&gEfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios); if (EFI_ERROR (Status)) { return; } - + Status = LegacyBios->GetBbsInfo (LegacyBios, &HddCount, &HddInfo, &BbsCount, &LocalBbsTable); //Print (L"\n"); @@ -95,14 +97,6 @@ BOOLEAN ArrayContains(UINT16* Arr, UINT8 ArrLen, UINT8 Target) return FALSE; } -/** - True if the DeviceType is supported by rEFInd, false otherwise. -*/ -BOOLEAN IsBbsDeviceTypeSupported(UINT16 DeviceType) -{ - return ArrayContains(SupportedLegacyDevices, sizeof(SupportedLegacyDevices), DeviceType); -} - /** Boot the legacy system with the boot option @@ -120,11 +114,9 @@ BdsLibDoLegacyBoot ( { EFI_STATUS Status; EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; - EFI_GUID EfiLegacyBootProtocolGuid = { 0xdb9a1e3d, 0x45cb, 0x4abb, { 0x85, 0x3b, 0xe5, 0x38, 0x7f, 0xdb, 0x2e, 0x2d }}; - EFI_GUID EfiGlobalVariableGuid = { 0x8BE4DF61, 0x93CA, 0x11D2, { 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C }}; BBS_BBS_DEVICE_PATH *OptionBBS; - Status = gBS->LocateProtocol (&EfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios); + Status = gBS->LocateProtocol (&gEfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios); if (EFI_ERROR (Status)) { return EFI_UNSUPPORTED; } diff --git a/EfiLib/BdsHelper.h b/EfiLib/BdsHelper.h index 6739b85..3b3c03b 100644 --- a/EfiLib/BdsHelper.h +++ b/EfiLib/BdsHelper.h @@ -9,15 +9,6 @@ #ifndef _BDS_HELPER_H_ #define _BDS_HELPER_H_ -//TODO: may want to make this configurable via config file -static UINT16 SupportedLegacyDevices[] = {BBS_HARDDISK, BBS_CDROM, BBS_USB}; - - -/** - True if the DeviceType is supported by rEFInd, false otherwise. -*/ -BOOLEAN IsBbsDeviceTypeSupported(UINT16 DeviceType); - /** Boot the legacy system with the boot option diff --git a/NEWS.txt b/NEWS.txt index 036f1cd..2dc3741 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -1,3 +1,14 @@ +0.4.6 (10/??/2012): +------------------- + +- Changed default "scanfor" option from internal-external-optical to + internal-external-optical-manual. This will have no effect with the + standard refind.conf file, which has no manual stanzas defined; but some + users seem to overlook this setting, and think that adding manual stanzas + is enough to activate them. This will make it so. + +- Added new legacy (BIOS) boot support for UEFI-based PCs. + 0.4.5 (8/12/2012): ------------------ diff --git a/refind.conf-sample b/refind.conf-sample index 09d2910..7a5b9e7 100644 --- a/refind.conf-sample +++ b/refind.conf-sample @@ -118,13 +118,10 @@ timeout 20 # hdbios - BIOS disk-based boot loaders # biosexternal - BIOS external boot loaders (USB, eSATA, etc.) # cd - BIOS optical-disc boot loaders -# legacypc - BIOS target alternative search that may work on non-Mac -# machines. Use in place of the other BIOS options. # manual - use stanzas later in this configuration file -# Default is internal,external,optical +# Default is internal,external,optical,manual # -#scanfor internal,external,optical -scanfor internal,external,legacypc +#scanfor internal,external,optical,manual # When scanning volumes for EFI boot loaders, rEFInd always looks for # Mac OS X's and Microsoft Windows' boot loaders in their normal locations, diff --git a/refind/global.h b/refind/global.h index a42f619..f501bb7 100644 --- a/refind/global.h +++ b/refind/global.h @@ -81,6 +81,28 @@ #define GRAPHICS_FOR_GRUB 8 #define GRAPHICS_FOR_WINDOWS 16 +// Type of legacy (BIOS) boot support detected +#define LEGACY_TYPE_NONE 0 +#define LEGACY_TYPE_MAC 1 +#define LEGACY_TYPE_UEFI 2 + +#ifndef __MAKEWITH_TIANO +// +// define BBS Device Types +// +#define BBS_FLOPPY 0x01 +#define BBS_HARDDISK 0x02 +#define BBS_CDROM 0x03 +#define BBS_PCMCIA 0x04 +#define BBS_USB 0x05 +#define BBS_EMBED_NETWORK 0x06 +#define BBS_BEV_DEVICE 0x80 +#define BBS_UNKNOWN 0xff +#endif + +//TODO: may want to make this configurable via config file +//static UINT16 SupportedLegacyDevices[] = {BBS_HARDDISK, BBS_CDROM, BBS_USB}; + // // global definitions // @@ -167,16 +189,6 @@ typedef struct { BOOLEAN Enabled; } LEGACY_ENTRY; -/* -#ifdef __MAKEWITH_TIANO -typedef struct { - REFIT_MENU_ENTRY me; - BDS_COMMON_OPTION *BdsOption; - BOOLEAN Enabled; -} LEGACY_ENTRY_NON_MAC; -#endif // __MAKEWITH_TIANO -*/ - typedef struct { BOOLEAN TextOnly; BOOLEAN ScanAllLinux; @@ -186,6 +198,7 @@ typedef struct { UINTN HideUIFlags; UINTN MaxTags; // max. number of OS entries to show simultaneously in graphics mode UINTN GraphicsFor; + UINTN LegacyType; CHAR16 *BannerFileName; CHAR16 *SelectionSmallFileName; CHAR16 *SelectionBigFileName; @@ -212,6 +225,9 @@ extern UINTN VolumesCount; extern REFIT_CONFIG GlobalConfig; +extern EFI_GUID gEfiLegacyBootProtocolGuid; +extern EFI_GUID gEfiGlobalVariableGuid; + LOADER_ENTRY *InitializeLoaderEntry(IN LOADER_ENTRY *Entry); REFIT_MENU_SCREEN *InitializeSubScreen(IN LOADER_ENTRY *Entry); VOID GenerateSubScreen(LOADER_ENTRY *Entry, IN REFIT_VOLUME *Volume); diff --git a/refind/main.c b/refind/main.c index a228096..0e604c8 100644 --- a/refind/main.c +++ b/refind/main.c @@ -93,7 +93,8 @@ static REFIT_MENU_ENTRY MenuEntryExit = { L"Exit rEFInd", TAG_EXIT, 1, 0, 0, static REFIT_MENU_SCREEN MainMenu = { L"Main Menu", NULL, 0, NULL, 0, NULL, 0, L"Automatic boot" }; static REFIT_MENU_SCREEN AboutMenu = { L"About", NULL, 0, NULL, 0, NULL, 0, NULL }; -REFIT_CONFIG GlobalConfig = { FALSE, FALSE, 0, 0, 20, 0, 0, GRAPHICS_FOR_OSX, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, +REFIT_CONFIG GlobalConfig = { FALSE, FALSE, 0, 0, 20, 0, 0, GRAPHICS_FOR_OSX, LEGACY_TYPE_MAC, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, {TAG_SHELL, TAG_ABOUT, TAG_SHUTDOWN, TAG_REBOOT, 0, 0, 0, 0, 0 }}; // Structure used to hold boot loader filenames and time stamps in @@ -114,7 +115,7 @@ static VOID AboutrEFInd(VOID) if (AboutMenu.EntryCount == 0) { AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT); - AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.4.5.2"); + AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.4.5.3"); AddMenuInfoLine(&AboutMenu, L""); AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer"); AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012 Roderick W. Smith"); @@ -1274,14 +1275,12 @@ static LEGACY_ENTRY * AddLegacyEntryNonMac(BDS_COMMON_OPTION *BdsOption, IN UINT /** 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. + implemented on several Dell PCs and an ASUS motherboard. */ -static VOID ScanLegacyNonMac() +static VOID ScanLegacyNonMac(IN UINTN DiskType) { EFI_STATUS Status; EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; - EFI_GUID EfiLegacyBootProtocolGuid = { 0xdb9a1e3d, 0x45cb, 0x4abb, { 0x85, 0x3b, 0xe5, 0x38, 0x7f, 0xdb, 0x2e, 0x2d }}; - EFI_GUID EfiGlobalVariableGuid = { 0x8BE4DF61, 0x93CA, 0x11D2, { 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C }}; UINT16 *BootOrder = NULL; UINTN Index = 0; UINT16 BootOption[10]; @@ -1296,12 +1295,12 @@ static VOID ScanLegacyNonMac() // If LegacyBios protocol is not implemented on this platform, then //we do not support this type of legacy boot on this machine. - Status = gBS->LocateProtocol (&EfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios); + Status = gBS->LocateProtocol (&gEfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios); if (EFI_ERROR (Status)) return; // Grab the boot order - BootOrder = BdsLibGetVariableAndSize (L"BootOrder", &EfiGlobalVariableGuid, &BootOrderSize); + BootOrder = BdsLibGetVariableAndSize (L"BootOrder", &gEfiGlobalVariableGuid, &BootOrderSize); if (BootOrder == NULL) { BootOrderSize = 0; } @@ -1314,21 +1313,22 @@ static VOID ScanLegacyNonMac() UnicodeSPrint (BootOption, sizeof (BootOption), L"Boot%04x", BootOrder[Index]); BdsOption = BdsLibVariableToOption (&TempList, BootOption); - //Print(L"Option description = '%s'\n", BdsOption->Description); - BbsDevicePath = (BBS_BBS_DEVICE_PATH *)BdsOption->DevicePath; + if(BdsOption != NULL) { + //Print(L"Option description = '%s'\n", BdsOption->Description); + BbsDevicePath = (BBS_BBS_DEVICE_PATH *)BdsOption->DevicePath; - // Only add the entry if it is of a supported type (e.g. USB, HD) - // See BdsHelper.c for currently supported types - if(IsBbsDeviceTypeSupported(BbsDevicePath->DeviceType)) - { - // TODO: Find/build REFIT_VOLUME structure for volume and pass instead of NULL - AddLegacyEntryNonMac(BdsOption, BbsDevicePath->DeviceType); + // Only add the entry if it is of a supported type (e.g. USB, HD) + // See BdsHelper.c for currently supported types + if (BbsDevicePath->DeviceType == DiskType) { +// if(IsBbsDeviceTypeSupported(BbsDevicePath->DeviceType)) { + AddLegacyEntryNonMac(BdsOption, BbsDevicePath->DeviceType); + } } Index++; } } /* static VOID ScanLegacyNonMac() */ #else -static VOID ScanLegacyNonMac(){} +static VOID ScanLegacyNonMac(IN UINTN DiskType){} #endif // __MAKEWITH_TIANO static VOID ScanLegacyVolume(REFIT_VOLUME *Volume, UINTN VolumeIndex) { @@ -1368,11 +1368,15 @@ static VOID ScanLegacyDisc(VOID) UINTN VolumeIndex; REFIT_VOLUME *Volume; - for (VolumeIndex = 0; VolumeIndex < VolumesCount; VolumeIndex++) { - Volume = Volumes[VolumeIndex]; - if (Volume->DiskKind == DISK_KIND_OPTICAL) - ScanLegacyVolume(Volume, VolumeIndex); - } // for + 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) { + ScanLegacyNonMac(BBS_CDROM); + } } /* static VOID ScanLegacyDisc() */ // Scan internal hard disks for legacy (BIOS) boot code @@ -1382,11 +1386,15 @@ static VOID ScanLegacyInternal(VOID) UINTN VolumeIndex; REFIT_VOLUME *Volume; - for (VolumeIndex = 0; VolumeIndex < VolumesCount; VolumeIndex++) { - Volume = Volumes[VolumeIndex]; - if (Volume->DiskKind == DISK_KIND_INTERNAL) - ScanLegacyVolume(Volume, VolumeIndex); - } // for + 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) { + ScanLegacyNonMac(BBS_HARDDISK); + } } /* static VOID ScanLegacyInternal() */ // Scan external disks for legacy (BIOS) boot code @@ -1396,11 +1404,15 @@ static VOID ScanLegacyExternal(VOID) UINTN VolumeIndex; REFIT_VOLUME *Volume; - for (VolumeIndex = 0; VolumeIndex < VolumesCount; VolumeIndex++) { - Volume = Volumes[VolumeIndex]; - if (Volume->DiskKind == DISK_KIND_EXTERNAL) - ScanLegacyVolume(Volume, VolumeIndex); - } // for + 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) { + ScanLegacyNonMac(BBS_USB); + } } /* static VOID ScanLegacyExternal() */ // @@ -1581,10 +1593,22 @@ static VOID LoadDrivers(VOID) static VOID ScanForBootloaders(VOID) { - UINTN i; + UINTN i; +#ifdef __MAKEWITH_TIANO + EFI_STATUS Status; + EFI_LEGACY_BIOS_PROTOCOL *LegacyBios; +#endif ScanVolumes(); +#ifdef __MAKEWITH_TIANO + // Check for UEFI-style legacy BIOS support. If present, set the appropriate + // GlobalConfig flag for it. + Status = gBS->LocateProtocol (&gEfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios); + if (!EFI_ERROR (Status)) + GlobalConfig.LegacyType = LEGACY_TYPE_UEFI; +#endif + // scan for loaders and tools, add them to the menu for (i = 0; i < NUM_SCAN_OPTIONS; i++) { switch(GlobalConfig.ScanFor[i]) { @@ -1609,9 +1633,9 @@ static VOID ScanForBootloaders(VOID) { case 'o': case 'O': ScanOptical(); break; - case 'l': case 'L': - ScanLegacyNonMac(); - break; +// case 'l': case 'L': +// ScanLegacyNonMac(); +// break; } // switch() } // for @@ -1730,7 +1754,7 @@ efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable) return Status; // read configuration - CopyMem(GlobalConfig.ScanFor, "ieo ", NUM_SCAN_OPTIONS); + CopyMem(GlobalConfig.ScanFor, "ieom ", NUM_SCAN_OPTIONS); ReadConfig(); MainMenu.TimeoutSeconds = GlobalConfig.Timeout; -- 2.39.2