]> code.delx.au - refind/commitdiff
Fixed bug in Linux initial RAM disk discovery on some systems.
authorsrs5694 <srs5694@users.sourceforge.net>
Thu, 12 Apr 2012 16:43:12 +0000 (12:43 -0400)
committersrs5694 <srs5694@users.sourceforge.net>
Thu, 12 Apr 2012 16:43:12 +0000 (12:43 -0400)
NEWS.txt
libeg/image.c
refind.conf-sample
refind/main.c

index 9b1307e89d6b307897ed8e7157f9aebe6db611b2..56cfa9883740678d2828902577d6907436078245 100644 (file)
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -1,3 +1,10 @@
+0.2.6 (?/??/2012):
+------------------
+
+- Fixed bug in 0.2.5 that caused failure of Linux initial RAM disk
+  mapping on some (but not all) systems. Affected computers include at
+  least some Intel motherboards, maybe others.
+
 0.2.5 (4/9/2012):
 -----------------
 
index 13bb758d857173f6b63aafcd1df87819c261a926..27671951548389ca0a40a0801b29a1a4818cc6fd 100644 (file)
@@ -196,7 +196,7 @@ EFI_STATUS egSaveFile(IN EFI_FILE* BaseDir OPTIONAL, IN CHAR16 *FileName,
 static CHAR16 * egFindExtension(IN CHAR16 *FileName)
 {
     UINTN i;
-    
+
     for (i = StrLen(FileName); i >= 0; i--) {
         if (FileName[i] == '.')
             return FileName + i + 1;
index 573844a1c386cc570107c98b0785a57038f6c43b..1c0d57ba9aac2017fd08e1a4be7a81257e7b5fa2 100644 (file)
@@ -78,13 +78,12 @@ scanfor internal,external,optical
 #max_tags 0
 
 # Set the default menu selection.  The available arguments match the
-# keyboard accelerators available within rEFInd.  You may select the default
-# loader using a one-character abbreviation for the OS name ("M" = Mac OS X,
-# "L" = Linux, "W" = Windows).  You may also specify a digit between 1 and
-# 9, in which case the Nth loader in the menu will be the default.  You can
-# also select a rEFInd tool entry ("S" = EFI Shell, "P" = Partitioning Tool,
-# "U" = shutdown).  This is intended as a quick fix to change the default
-# boot choice until full configurability arrives.
+# keyboard accelerators available within rEFInd.  You may select the
+# default loader using:
+#  - A digit between 1 and 9, in which case the Nth loader in the menu
+#    will be the default. 
+#  - Any substring that corresponds to a portion of the loader's title
+#    (usually the OS's name or boot loader's path).
 #
 #default_selection 1
 
index 6959a059eedb2e6e979790925cd07e09cdc55f04..8c82fa98ff993dde350c1ba93506f1a3f2e17692 100644 (file)
@@ -83,7 +83,7 @@ static VOID AboutrEFInd(VOID)
 {
     if (AboutMenu.EntryCount == 0) {
         AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
-        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.2.5");
+        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.2.5.1");
         AddMenuInfoLine(&AboutMenu, L"");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012 Roderick W. Smith");
@@ -194,7 +194,7 @@ static EFI_STATUS StartEFIImage(IN EFI_DEVICE_PATH *DevicePath,
                                 OUT UINTN *ErrorInStep)
 {
     EFI_DEVICE_PATH *DevicePaths[2];
-    
+
     DevicePaths[0] = DevicePath;
     DevicePaths[1] = NULL;
     return StartEFIImageList(DevicePaths, LoadOptions, LoadOptionsPrefix, ImageTitle, ErrorInStep);
@@ -234,8 +234,17 @@ static CHAR16 * FindInitrd(IN CHAR16 *LoaderPath, IN REFIT_VOLUME *Volume) {
    KernelVersion = FindNumbers(FileName);
    Path = FindPath(LoaderPath);
 
-   MergeStrings(&Path, L"\\", 0); // Add trailing backslash; necessary for root directory
+   // Add trailing backslash for root directory; necessary on some systems, but must
+   // NOT be added to all directories, since on other systems, a trailing backslash on
+   // anything but the root directory causes them to flake out!
+   if (StrLen(Path) == 0) {
+      MergeStrings(&Path, L"\\", 0);
+   } // if
    DirIterOpen(Volume->RootDir, Path, &DirIter);
+   // Now add a trailing backslash if it was NOT added earlier, for consistency in
+   // building the InitrdName later....
+   if ((StrLen(Path) > 0) && (Path[StrLen(Path) - 1] != L'\\'))
+      MergeStrings(&Path, L"\\", 0);
    while ((DirIterNext(&DirIter, 2, L"init*", &DirEntry)) && (InitrdName == NULL)) {
       InitrdVersion = FindNumbers(DirEntry->FileName);
       if (KernelVersion != NULL) {
@@ -341,7 +350,7 @@ VOID GenerateSubScreen(LOADER_ENTRY *Entry, IN REFIT_VOLUME *Volume) {
       Entry->Title = NULL;
    }
    SubScreen = InitializeSubScreen(Entry);
-   
+
    // loader-specific submenu entries
    if (Entry->OSType == 'M') {          // entries for Mac OS X
 #if defined(EFIX64)
@@ -368,7 +377,7 @@ VOID GenerateSubScreen(LOADER_ENTRY *Entry, IN REFIT_VOLUME *Volume) {
             SubEntry->LoadOptions     = L"-v";
             AddMenuEntry(SubScreen, (REFIT_MENU_ENTRY *)SubEntry);
          } // if
-      
+
 #if defined(EFIX64)
          SubEntry = InitializeLoaderEntry(Entry);
          if (SubEntry != NULL) {
@@ -468,7 +477,7 @@ VOID GenerateSubScreen(LOADER_ENTRY *Entry, IN REFIT_VOLUME *Volume) {
 
       AddMenuInfoLine(SubScreen, L"NOTE: This is an example. Entries");
       AddMenuInfoLine(SubScreen, L"marked with (*) may not work.");
-        
+
    } else if (Entry->OSType == 'X') {   // entries for xom.efi
         // by default, skip the built-in selection and boot from hard disk only
         Entry->LoadOptions = L"-s -h";
@@ -828,7 +837,7 @@ static EFI_STATUS ActivateMbrPartition(IN EFI_BLOCK_IO *BlockIO, IN UINTN Partit
             if (PartitionIndex < LogicalPartitionIndex)
                 break;  // stop the loop, no need to touch further EMBRs
         }
-        
+
     }
 
     return EFI_SUCCESS;
@@ -1091,13 +1100,13 @@ static VOID ScanDriverDir(IN CHAR16 *Path)
     REFIT_DIR_ITER          DirIter;
     EFI_FILE_INFO           *DirEntry;
     CHAR16                  FileName[256];
-    
+
     // look through contents of the directory
     DirIterOpen(SelfRootDir, Path, &DirIter);
     while (DirIterNext(&DirIter, 2, L"*.EFI", &DirEntry)) {
         if (DirEntry->FileName[0] == '.')
             continue;   // skip this
-        
+
         SPrint(FileName, 255, L"%s\\%s", Path, DirEntry->FileName);
         Status = StartEFIImage(FileDevicePath(SelfLoadedImage->DeviceHandle, FileName),
                                L"", DirEntry->FileName, DirEntry->FileName, NULL);
@@ -1108,7 +1117,7 @@ static VOID ScanDriverDir(IN CHAR16 *Path)
         CheckError(Status, FileName);
     }
 }
-EFI_STATUS
+/* EFI_STATUS
 LibScanHandleDatabase (
      EFI_HANDLE  DriverBindingHandle, OPTIONAL
      UINT32      *DriverBindingHandleIndex, OPTIONAL
@@ -1129,7 +1138,7 @@ LibScanHandleDatabase (
 #define EFI_HANDLE_TYPE_DEVICE_HANDLE               0x080
 #define EFI_HANDLE_TYPE_PARENT_HANDLE               0x100
 #define EFI_HANDLE_TYPE_CONTROLLER_HANDLE           0x200
-#define EFI_HANDLE_TYPE_CHILD_HANDLE                0x400
+#define EFI_HANDLE_TYPE_CHILD_HANDLE                0x400 */
 
 static EFI_STATUS ConnectAllDriversToAllControllers(VOID)
 {
@@ -1143,7 +1152,7 @@ static EFI_STATUS ConnectAllDriversToAllControllers(VOID)
     UINTN       HandleIndex;
     BOOLEAN     Parent;
     BOOLEAN     Device;
-    
+
     Status = LibLocateHandle(AllHandles,
                              NULL,
                              NULL,
@@ -1151,7 +1160,7 @@ static EFI_STATUS ConnectAllDriversToAllControllers(VOID)
                              &AllHandleBuffer);
     if (EFI_ERROR(Status))
         return Status;
-    
+
     for (Index = 0; Index < AllHandleCount; Index++) {
         //
         // Scan the handle database
@@ -1165,20 +1174,20 @@ static EFI_STATUS ConnectAllDriversToAllControllers(VOID)
                                        &HandleType);
         if (EFI_ERROR (Status))
             goto Done;
-        
+
         Device = TRUE;
         if (HandleType[Index] & EFI_HANDLE_TYPE_DRIVER_BINDING_HANDLE)
             Device = FALSE;
         if (HandleType[Index] & EFI_HANDLE_TYPE_IMAGE_HANDLE)
             Device = FALSE;
-        
+
         if (Device) {
             Parent = FALSE;
             for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {
                 if (HandleType[HandleIndex] & EFI_HANDLE_TYPE_PARENT_HANDLE)
                     Parent = TRUE;
             }
-            
+
             if (!Parent) {
                 if (HandleType[Index] & EFI_HANDLE_TYPE_DEVICE_HANDLE) {
                     Status = refit_call4_wrapper(BS->ConnectController,
@@ -1189,11 +1198,11 @@ static EFI_STATUS ConnectAllDriversToAllControllers(VOID)
                 }
             }
         }
-        
+
         FreePool (HandleBuffer);
         FreePool (HandleType);
     }
-    
+
 Done:
     FreePool (AllHandleBuffer);
     return Status;
@@ -1262,7 +1271,7 @@ static VOID ScanForBootloaders(VOID) {
    // assign shortcut keys
    for (i = 0; i < MainMenu.EntryCount && MainMenu.Entries[i]->Row == 0 && i < 9; i++)
       MainMenu.Entries[i]->ShortcutDigit = (CHAR16)('1' + i);
-   
+
    // wait for user ACK when there were errors
    FinishTextScreen(FALSE);
 } // static VOID ScanForBootloaders()
@@ -1351,7 +1360,7 @@ efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
 
     while (MainLoopRunning) {
         MenuExit = RunMainMenu(&MainMenu, GlobalConfig.DefaultSelection, &ChosenEntry);
-        
+
         // We don't allow exiting the main menu with the Escape key.
         if (MenuExit == MENU_EXIT_ESCAPE) {
            // Commented-out below: Was part of an attempt to get rEFInd to
@@ -1362,7 +1371,7 @@ efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
 //             SetupScreen();
             continue;
         }
-        
+
         switch (ChosenEntry->Tag) {
 
             case TAG_REBOOT:    // Reboot
@@ -1370,25 +1379,25 @@ efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
                 refit_call4_wrapper(RT->ResetSystem, EfiResetCold, EFI_SUCCESS, 0, NULL);
                 MainLoopRunning = FALSE;   // just in case we get this far
                 break;
-                
+
             case TAG_SHUTDOWN: // Shut Down
                 TerminateScreen();
                 refit_call4_wrapper(RT->ResetSystem, EfiResetShutdown, EFI_SUCCESS, 0, NULL);
                 MainLoopRunning = FALSE;   // just in case we get this far
                 break;
-                
+
             case TAG_ABOUT:    // About rEFInd
                 AboutrEFInd();
                 break;
-                
+
             case TAG_LOADER:   // Boot OS via .EFI loader
                 StartLoader((LOADER_ENTRY *)ChosenEntry);
                 break;
-                
+
             case TAG_LEGACY:   // Boot legacy OS
                 StartLegacy((LEGACY_ENTRY *)ChosenEntry);
                 break;
-                
+
             case TAG_TOOL:     // Start a EFI tool
                 StartTool((LOADER_ENTRY *)ChosenEntry);
                 break;
@@ -1397,7 +1406,7 @@ efi_main (IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
                 BeginTextScreen(L" ");
                 return EFI_SUCCESS;
                 break;
-                
+
         }
     }