]> code.delx.au - refind/blobdiff - EfiLib/BdsHelper.c
Merge commit '2ede1b8a25d32e057bcb9d246a9fd855a09bfc7c'
[refind] / EfiLib / BdsHelper.c
index 80eb7f20b9fcc55f7b3fc1182b532fa2a844ab8b..a890f7d6f627bbdc78304649f1f5ae6b9d372e60 100644 (file)
@@ -3,9 +3,27 @@
  * 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 }};
 
 /**
     Internal helper function.
 
     @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 (&EfiLegacyBootProtocolGuid, 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;
-}
-
-/**
-    True if the DeviceType is supported by rEFInd, false otherwise.
-*/
-BOOLEAN IsBbsDeviceTypeSupported(UINT16 DeviceType)
-{
-    return ArrayContains(SupportedLegacyDevices, sizeof(SupportedLegacyDevices), DeviceType);
+   }
+
+   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 (MyStriCmp(Desc, Option->Description)) {
+            // 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();
 }
 
 /**
@@ -120,34 +126,14 @@ 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 = 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);
+}