]> code.delx.au - refind/blobdiff - EfiLib/BdsHelper.c
Suppress messages about delays for scanning boot loaders when
[refind] / EfiLib / BdsHelper.c
index 1f8c5aa69225c732081426a24a0a461e7d253209..563993a9171a9fb2ea990f223fc7e9bc7b785f5b 100644 (file)
@@ -6,6 +6,9 @@
 
 
 #include "BdsHelper.h"
+#include "legacy.h"
+#include "../refind/screen.h"
+#include "refit_call_wrapper.h"
 
 EFI_GUID gEfiLegacyBootProtocolGuid     = { 0xdb9a1e3d, 0x45cb, 0x4abb, { 0x85, 0x3b, 0xe5, 0x38, 0x7f, 0xdb, 0x2e, 0x2d }};
 
@@ -25,76 +28,72 @@ EFI_GUID gEfiLegacyBootProtocolGuid     = { 0xdb9a1e3d, 0x45cb, 0x4abb, { 0x85,
 
     @param DeviceType   The device type that we wish to enable
 **/
-VOID
-UpdateBbsTable (
-  IN UINT16     DeviceType
-  )
-{
-    UINT16  Idx;
-    EFI_LEGACY_BIOS_PROTOCOL  *LegacyBios;
-//    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 (&gEfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios);
-    if (EFI_ERROR (Status)) {
+VOID UpdateBbsTable (BDS_COMMON_OPTION *Option) {
+   UINT16  Idx;
+   EFI_LEGACY_BIOS_PROTOCOL  *LegacyBios;
+   EFI_STATUS                Status;
+   UINT16                       HddCount = 0;
+   HDD_INFO                     *HddInfo = NULL; 
+   UINT16                       BbsCount = 0; 
+   BBS_TABLE                 *LocalBbsTable = NULL;
+   BBS_BBS_DEVICE_PATH       *OptionBBS;
+   CHAR16                    Desc[100];
+
+   Status = refit_call3_wrapper(gBS->LocateProtocol, &gEfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios);
+   if (EFI_ERROR (Status) || (Option == NULL)) {
       return;
-    }
-
-    Status = LegacyBios->GetBbsInfo (LegacyBios, &HddCount, &HddInfo, &BbsCount, &LocalBbsTable);
-
-    //Print (L"\n");
-    //Print (L" NO  Prio bb/dd/ff cl/sc Type Stat segm:offs\n");
-    //Print (L"=============================================\n");
-
-    for (Idx = 0; Idx < BbsCount; Idx++) 
-    {
-     if(LocalBbsTable[Idx].DeviceType == 0){
-        continue;
-     }
-
-     // Set devices of a particular type to BootPriority of 0. I believe 0 is the highest priority
-     if(LocalBbsTable[Idx].DeviceType == DeviceType){
-        LocalBbsTable[Idx].BootPriority = 0;
-     }
-
-/*
-      Print (
-        L" %02x: %04x %02x/%02x/%02x %02x/%02x %04x %04x %04x:%04x\n",
-        (UINTN) Idx,
-        (UINTN) LocalBbsTable[Idx].BootPriority,
-        (UINTN) LocalBbsTable[Idx].Bus,
-        (UINTN) LocalBbsTable[Idx].Device,
-        (UINTN) LocalBbsTable[Idx].Function,
-        (UINTN) LocalBbsTable[Idx].Class,
-        (UINTN) LocalBbsTable[Idx].SubClass,
-        (UINTN) LocalBbsTable[Idx].DeviceType,
-        (UINTN) * (UINT16 *) &LocalBbsTable[Idx].StatusFlags,
-        (UINTN) LocalBbsTable[Idx].BootHandlerSegment,
-        (UINTN) LocalBbsTable[Idx].BootHandlerOffset,
-        (UINTN) ((LocalBbsTable[Idx].MfgStringSegment << 4) + LocalBbsTable[Idx].MfgStringOffset),
-        (UINTN) ((LocalBbsTable[Idx].DescStringSegment << 4) + LocalBbsTable[Idx].DescStringOffset)
-        );
-*/
-    }
-
-  //Print(L"\n");
-}
-
-// Internal helper function
-BOOLEAN ArrayContains(UINT16* Arr, UINT8 ArrLen, UINT8 Target)
-{
-    UINT8 i;
-    for(i = 0; i < ArrLen; i++)
-    {
-       if(Arr[i] == Target)
-          return TRUE;
-    }
-
-  return FALSE;
+   }
+
+   OptionBBS = (BBS_BBS_DEVICE_PATH *) Option->DevicePath;
+   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");
+//    Print (L"=============================================\n");
+
+   for (Idx = 0; Idx < BbsCount; Idx++) {
+      if(LocalBbsTable[Idx].DeviceType == 0) {
+         continue;
+      }
+
+      BdsBuildLegacyDevNameString (&LocalBbsTable[Idx], Idx, sizeof (Desc), Desc);
+
+      // 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) {
+            // This entry exactly matches what we're looking for; make it highest priority
+            LocalBbsTable[Idx].BootPriority = 0;
+         } else {
+            // This entry doesn't exactly match, but is the right disk type; make it a bit lower
+            // in priority. Done mainly as a fallback in case of string-matching weirdness.
+            LocalBbsTable[Idx].BootPriority = 1;
+         } // if/else
+      } 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",
+//            (UINTN) Idx,
+//            (UINTN) LocalBbsTable[Idx].BootPriority,
+//            (UINTN) LocalBbsTable[Idx].Bus,
+//            (UINTN) LocalBbsTable[Idx].Device,
+//            (UINTN) LocalBbsTable[Idx].Function,
+//            (UINTN) LocalBbsTable[Idx].Class,
+//            (UINTN) LocalBbsTable[Idx].SubClass,
+//            (UINTN) LocalBbsTable[Idx].DeviceType,
+//            (UINTN) * (UINT16 *) &LocalBbsTable[Idx].StatusFlags,
+//            (UINTN) LocalBbsTable[Idx].BootHandlerSegment,
+//            (UINTN) LocalBbsTable[Idx].BootHandlerOffset,
+//            (UINTN) ((LocalBbsTable[Idx].MfgStringSegment << 4) + LocalBbsTable[Idx].MfgStringOffset),
+//            (UINTN) ((LocalBbsTable[Idx].DescStringSegment << 4) + LocalBbsTable[Idx].DescStringOffset)
+//            );
+//          Print(L"%s\n", Desc);
+
+   } // for
+//    PauseForKey();
 }
 
 /**
@@ -114,32 +113,14 @@ BdsLibDoLegacyBoot (
 {
     EFI_STATUS                Status;
     EFI_LEGACY_BIOS_PROTOCOL  *LegacyBios;
-    BBS_BBS_DEVICE_PATH *OptionBBS;
 
-    Status = gBS->LocateProtocol (&gEfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios);
+    Status = refit_call3_wrapper(gBS->LocateProtocol, &gEfiLegacyBootProtocolGuid, NULL, (VOID **) &LegacyBios);
     if (EFI_ERROR (Status)) {
       return EFI_UNSUPPORTED;
     }
-    OptionBBS = (BBS_BBS_DEVICE_PATH *) Option->DevicePath;
-
-    //Print(L"\n\n");
-    //Print(L"Option->Name='%s'\n", Option->OptionName);
-    //Print(L"Option->Number='%d'\n", Option->OptionNumber);
-    //Print(L"Option->Description='%s'\n", Option->Description);
-    //Print(L"Option->LoadOptionsSize='%d'\n",Option->LoadOptionsSize);
-    //Print(L"Option->BootCurrent='%d'\n",Option->BootCurrent);
-    //Print(L"Option->DevicePath->Type= '%d'\n", Option->DevicePath->Type);
-    //Print(L"Option->DevicePath->SubType= '%d'\n", Option->DevicePath->SubType);
-    //Print(L"Option->DevicePath->Length[0]= '%d'\n", Option->DevicePath->Length[0]);
-    //Print(L"Option->DevicePath->Length[1]= '%d'\n", Option->DevicePath->Length[1]); 
-    //Print(L"OptionBBS->DeviceType='%d'\n",OptionBBS->DeviceType);
-    //Print(L"OptionBBS->StatusFlag='%d'\n",OptionBBS->StatusFlag);
-    //Print(L"OptionBBS->String[0]='%c'\n",OptionBBS->String[0]);
-    //Print(L"About to legacy boot!\n");
-    //PauseForKey();
-
-    UpdateBbsTable(OptionBBS->DeviceType); 
-
-    return LegacyBios->LegacyBoot (LegacyBios, (BBS_BBS_DEVICE_PATH *) Option->DevicePath, Option->LoadOptionsSize, Option->LoadOptions);
-}
 
+    UpdateBbsTable(Option);
+
+    return refit_call4_wrapper(LegacyBios->LegacyBoot, LegacyBios, (BBS_BBS_DEVICE_PATH *) Option->DevicePath,
+                                  Option->LoadOptionsSize, Option->LoadOptions);
+}