]> code.delx.au - refind/blobdiff - EfiLib/BdsHelper.c
Properly initialise variable to fix detection of non-Arch kernel versions
[refind] / EfiLib / BdsHelper.c
index 40f44831549173f6cd2624aaf9283f64a87347fa..a890f7d6f627bbdc78304649f1f5ae6b9d372e60 100644 (file)
@@ -3,11 +3,25 @@
  * Functions to call legacy BIOS API.
  *
  */
+/**
+
+Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
+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.
+
+**/
 
 #include "BdsHelper.h"
 #include "legacy.h"
+#include "mystrings.h"
 #include "../refind/screen.h"
+#include "../refind/lib.h"
+#include "../include/refit_call_wrapper.h"
 
 EFI_GUID gEfiLegacyBootProtocolGuid     = { 0xdb9a1e3d, 0x45cb, 0x4abb, { 0x85, 0x3b, 0xe5, 0x38, 0x7f, 0xdb, 0x2e, 0x2d }};
 
@@ -38,13 +52,13 @@ VOID UpdateBbsTable (BDS_COMMON_OPTION *Option) {
    BBS_BBS_DEVICE_PATH       *OptionBBS;
    CHAR16                    Desc[100];
 
-   Status = gBS->LocateProtocol (&gEfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios);
+   Status = refit_call3_wrapper(gBS->LocateProtocol, &gEfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios);
    if (EFI_ERROR (Status) || (Option == NULL)) {
       return;
    }
 
    OptionBBS = (BBS_BBS_DEVICE_PATH *) Option->DevicePath;
-   Status = LegacyBios->GetBbsInfo (LegacyBios, &HddCount, &HddInfo, &BbsCount, &LocalBbsTable);
+   Status = refit_call5_wrapper(LegacyBios->GetBbsInfo, LegacyBios, &HddCount, &HddInfo, &BbsCount, &LocalBbsTable);
 
 //    Print (L"\n");
 //    Print (L" NO  Prio bb/dd/ff cl/sc Type Stat segm:offs\n");
@@ -59,7 +73,7 @@ VOID UpdateBbsTable (BDS_COMMON_OPTION *Option) {
 
       // Set devices of a particular type to BootPriority of 0 or 1. 0 is the highest priority.
       if (LocalBbsTable[Idx].DeviceType == OptionBBS->DeviceType) {
-         if (StriCmp(Desc, Option->Description) == 0) {
+         if (MyStriCmp(Desc, Option->Description)) {
             // This entry exactly matches what we're looking for; make it highest priority
             LocalBbsTable[Idx].BootPriority = 0;
          } else {
@@ -67,7 +81,11 @@ VOID UpdateBbsTable (BDS_COMMON_OPTION *Option) {
             // in priority. Done mainly as a fallback in case of string-matching weirdness.
             LocalBbsTable[Idx].BootPriority = 1;
          } // if/else
-      } // if
+      } else if (LocalBbsTable[Idx].BootPriority <= 1) {
+         // Something's got a high enough boot priority to interfere with booting
+         // our chosen entry, so bump it down a bit....
+         LocalBbsTable[Idx].BootPriority = 2;
+      } // if/else if
 
 //          Print (
 //            L" %02x: %04x %02x/%02x/%02x %02x/%02x %04x %04x %04x:%04x\n",
@@ -88,6 +106,7 @@ VOID UpdateBbsTable (BDS_COMMON_OPTION *Option) {
 //          Print(L"%s\n", Desc);
 
    } // for
+//    PauseForKey();
 }
 
 /**
@@ -108,13 +127,13 @@ BdsLibDoLegacyBoot (
     EFI_STATUS                Status;
     EFI_LEGACY_BIOS_PROTOCOL  *LegacyBios;
 
-    Status = gBS->LocateProtocol (&gEfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios);
+    Status = refit_call3_wrapper(gBS->LocateProtocol, &gEfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios);
     if (EFI_ERROR (Status)) {
       return EFI_UNSUPPORTED;
     }
 
     UpdateBbsTable(Option);
 
-    return LegacyBios->LegacyBoot(LegacyBios, (BBS_BBS_DEVICE_PATH *) Option->DevicePath,
+    return refit_call4_wrapper(LegacyBios->LegacyBoot, LegacyBios, (BBS_BBS_DEVICE_PATH *) Option->DevicePath,
                                   Option->LoadOptionsSize, Option->LoadOptions);
 }