]> code.delx.au - refind/blobdiff - EfiLib/legacy.c
Fixed uninitialized-pointer bug that manifested as a crash with
[refind] / EfiLib / legacy.c
index 3aae71d7610d6e9943900422b9ee65b09ebda52c..3e5edee4746903c1dae588ded1d3e22f19ca1e10 100644 (file)
  *
  */
 
+#ifdef __MAKEWITH_GNUEFI
+#include "efi.h"
+#include "efilib.h"
+#include "gnuefi-helper.h"
+#define EFI_DEVICE_PATH_PROTOCOL EFI_DEVICE_PATH
+#define EfiReallocatePool ReallocatePool
+#define EfiLibLocateProtocol LibLocateProtocol
+#else
 #include "../include/tiano_includes.h"
+#endif
 #include "legacy.h"
+#include "GenericBdsLib.h"
+#include "../refind/global.h"
+#include "../include/refit_call_wrapper.h"
 
 BOOT_OPTION_BBS_MAPPING  *mBootOptionBbsMapping     = NULL;
 UINTN                    mBootOptionBbsMappingCount = 0;
 
 extern EFI_DEVICE_PATH EndDevicePath[];
+extern EFI_GUID gEfiLegacyBiosProtocolGuid;
+EFI_GUID gEfiLegacyDevOrderVariableGuid     = { 0xa56074db, 0x65fe, 0x45f7, {0xbd, 0x21, 0x2d, 0x2b, 0xdd, 0x8e, 0x96, 0x52 }};
 
 /**
 
@@ -242,7 +256,7 @@ BdsFindLegacyBootOptionByDevTypeAndName (
   )
 {
   UINTN     Index;
-  CHAR16    BootOption[9];
+  CHAR16    BootOption[10];
   UINTN     BootOptionSize;
   UINT8     *BootOptionVar;
   BBS_TABLE *BbsEntry;
@@ -266,7 +280,7 @@ BdsFindLegacyBootOptionByDevTypeAndName (
                       &BootOptionSize
                       );
     if (NULL == BootOptionVar) {
-      continue;
+       continue;
     }
 
     //
@@ -446,7 +460,7 @@ BdsCreateLegacyBootOption (
   Ptr += sizeof (BBS_TABLE);
   *((UINT16 *) Ptr) = (UINT16) Index;
 
-  Status = gRT->SetVariable (
+  Status = refit_call5_wrapper(gRT->SetVariable,
                   BootString,
                   &gEfiGlobalVariableGuid,
                   VAR_FLAG,
@@ -644,7 +658,7 @@ EfiLibGetVariable (
 
   @param VarName           A Null-terminated Unicode string that is
                            the name of the vendor's variable.
-                         
+
   @param VarGuid           A unique identifier for the vendor.
 
   @retval  EFI_SUCCESS           The variable was found and removed
@@ -669,7 +683,7 @@ EfiLibDeleteVariable (
     //
     // Delete variable from Storage
     //
-    Status = gRT->SetVariable (VarName, VarGuid, VAR_FLAG, 0, NULL);
+    Status = refit_call5_wrapper(gRT->SetVariable, VarName, VarGuid, VAR_FLAG, 0, NULL);
     ASSERT (!EFI_ERROR (Status));
     FreePool (VarBuf);
   }
@@ -687,7 +701,6 @@ EfiLibDeleteVariable (
   @return Other value          LegacyBoot options are not added.
 **/
 EFI_STATUS
-EFIAPI
 BdsAddNonExistingLegacyBootOptions (
   VOID
   )
@@ -724,7 +737,7 @@ BdsAddNonExistingLegacyBootOptions (
     mBootOptionBbsMappingCount = 0;
   }
 
-  LegacyBios->GetBbsInfo (
+  refit_call5_wrapper(LegacyBios->GetBbsInfo,
                 LegacyBios,
                 &HddCount,
                 &LocalHddInfo,
@@ -781,10 +794,10 @@ BdsAddNonExistingLegacyBootOptions (
     //
     // Save the BbsIndex
     //
-    mBootOptionBbsMapping = ReallocatePool (
+    mBootOptionBbsMapping = EfiReallocatePool (
+                              mBootOptionBbsMapping,
                               mBootOptionBbsMappingCount * sizeof (BOOT_OPTION_BBS_MAPPING),
-                              (mBootOptionBbsMappingCount + 1) * sizeof (BOOT_OPTION_BBS_MAPPING),
-                              mBootOptionBbsMapping
+                              (mBootOptionBbsMappingCount + 1) * sizeof (BOOT_OPTION_BBS_MAPPING)
                               );
     ASSERT (mBootOptionBbsMapping != NULL);
     mBootOptionBbsMapping[mBootOptionBbsMappingCount].BootOptionNumber = OptionNumber;
@@ -802,7 +815,7 @@ BdsAddNonExistingLegacyBootOptions (
     );
 
   if (BootOrderSize > 0) {
-    Status = gRT->SetVariable (
+    Status = refit_call5_wrapper(gRT->SetVariable,
                     L"BootOrder",
                     &gEfiGlobalVariableGuid,
                     VAR_FLAG,
@@ -833,7 +846,6 @@ BdsAddNonExistingLegacyBootOptions (
   @retval  EFI_NOT_FOUND         The Boot Option Variable was not found
 **/
 EFI_STATUS
-EFIAPI
 BdsDeleteBootOption (
   IN UINTN                       OptionNumber,
   IN OUT UINT16                  *BootOrder,
@@ -883,7 +895,6 @@ BdsDeleteBootOption (
   @retval EFI_NOT_FOUND           Fail to retrive variable of boot order.
 **/
 EFI_STATUS
-EFIAPI
 BdsDeleteAllInvalidLegacyBootOptions (
   VOID
   )
@@ -919,7 +930,7 @@ BdsDeleteAllInvalidLegacyBootOptions (
     return Status;
   }
 
-  LegacyBios->GetBbsInfo (
+  refit_call5_wrapper(LegacyBios->GetBbsInfo,
                 LegacyBios,
                 &HddCount,
                 &LocalHddInfo,
@@ -946,7 +957,7 @@ BdsDeleteAllInvalidLegacyBootOptions (
                       );
     if (NULL == BootOptionVar) {
       BootOptionSize = 0;
-      Status = gRT->GetVariable (
+      Status = refit_call5_wrapper(gRT->GetVariable,
                       BootOption,
                       &gEfiGlobalVariableGuid,
                       NULL,
@@ -968,10 +979,10 @@ BdsDeleteAllInvalidLegacyBootOptions (
         return EFI_OUT_OF_RESOURCES;
       }
     }
-  
+
     //
     // Skip Non-Legacy boot option
-    // 
+    //
     if (!BdsIsLegacyBootOption (BootOptionVar, &BbsEntry, &BbsIndex)) {
       if (BootOptionVar!= NULL) {
         FreePool (BootOptionVar);
@@ -1022,7 +1033,7 @@ BdsDeleteAllInvalidLegacyBootOptions (
   // Adjust the number of boot options.
   //
   if (BootOrderSize != 0) {
-    Status = gRT->SetVariable (
+    Status = refit_call5_wrapper(gRT->SetVariable,
                     L"BootOrder",
                     &gEfiGlobalVariableGuid,
                     VAR_FLAG,
@@ -1041,323 +1052,38 @@ BdsDeleteAllInvalidLegacyBootOptions (
 }
 
 /**
-  Add the legacy boot devices from BBS table into 
-  the legacy device boot order.
-
-  @retval EFI_SUCCESS           The boot devices are added successfully.
-  @retval EFI_NOT_FOUND         The legacy boot devices are not found.
-  @retval EFI_OUT_OF_RESOURCES  Memmory or storage is not enough.
-  @retval EFI_DEVICE_ERROR      Fail to add the legacy device boot order into EFI variable
-                                because of hardware error.
+  Fill the device order buffer.
+
+  @param BbsTable        The BBS table.
+  @param BbsType         The BBS Type.
+  @param BbsCount        The BBS Count.
+  @param Buf             device order buffer.
+
+  @return The device order buffer.
+
 **/
-// EFI_STATUS
-// EFIAPI
-// BdsUpdateLegacyDevOrder (
-//   VOID
-//   )
-// {
-//   LEGACY_DEV_ORDER_ENTRY      *DevOrder;
-//   LEGACY_DEV_ORDER_ENTRY      *NewDevOrder;
-//   LEGACY_DEV_ORDER_ENTRY      *Ptr;
-//   LEGACY_DEV_ORDER_ENTRY      *NewPtr;
-//   UINTN                       DevOrderSize;
-//   EFI_LEGACY_BIOS_PROTOCOL    *LegacyBios;
-//   EFI_STATUS                  Status;
-//   UINT16                      HddCount;
-//   UINT16                      BbsCount;
-//   HDD_INFO                    *LocalHddInfo;
-//   BBS_TABLE                   *LocalBbsTable;
-//   UINTN                       Index;
-//   UINTN                       Index2;
-//   UINTN                       *Idx;
-//   UINTN                       FDCount;
-//   UINTN                       HDCount;
-//   UINTN                       CDCount;
-//   UINTN                       NETCount;
-//   UINTN                       BEVCount;
-//   UINTN                       TotalSize;
-//   UINTN                       HeaderSize;
-//   UINT16                      *NewFDPtr;
-//   UINT16                      *NewHDPtr;
-//   UINT16                      *NewCDPtr;
-//   UINT16                      *NewNETPtr;
-//   UINT16                      *NewBEVPtr;
-//   UINT16                      *NewDevPtr;
-//   UINTN                       FDIndex;
-//   UINTN                       HDIndex;
-//   UINTN                       CDIndex;
-//   UINTN                       NETIndex;
-//   UINTN                       BEVIndex;
-// 
-//   Idx           = NULL;
-//   FDCount       = 0;
-//   HDCount       = 0;
-//   CDCount       = 0;
-//   NETCount      = 0;
-//   BEVCount      = 0;
-//   TotalSize     = 0;
-//   HeaderSize    = sizeof (BBS_TYPE) + sizeof (UINT16);
-//   FDIndex       = 0;
-//   HDIndex       = 0;
-//   CDIndex       = 0;
-//   NETIndex      = 0;
-//   BEVIndex      = 0;
-//   NewDevPtr     = NULL;
-// 
-//   Status        = EfiLibLocateProtocol (&gEfiLegacyBiosProtocolGuid, (VOID **) &LegacyBios);
-//   if (EFI_ERROR (Status)) {
-//     return Status;
-//   }
-// 
-//   Status = LegacyBios->GetBbsInfo (
-//                          LegacyBios,
-//                          &HddCount,
-//                          &LocalHddInfo,
-//                          &BbsCount,
-//                          &LocalBbsTable
-//                          );
-//   if (EFI_ERROR (Status)) {
-//     return Status;
-//   }
-// 
-//   DevOrder = BdsLibGetVariableAndSize (
-//                VAR_LEGACY_DEV_ORDER,
-//                &gEfiLegacyDevOrderVariableGuid,
-//                &DevOrderSize
-//                );
-//   if (NULL == DevOrder) {
-//     return BdsCreateDevOrder (LocalBbsTable, BbsCount);
-//   }
-//   //
-//   // First we figure out how many boot devices with same device type respectively
-//   //
-//   for (Index = 0; Index < BbsCount; Index++) {
-//     if ((LocalBbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) ||
-//         (LocalBbsTable[Index].BootPriority == BBS_DO_NOT_BOOT_FROM)
-//         ) {
-//       continue;
-//     }
-// 
-//     switch (LocalBbsTable[Index].DeviceType) {
-//     case BBS_FLOPPY:
-//       FDCount++;
-//       break;
-// 
-//     case BBS_HARDDISK:
-//       HDCount++;
-//       break;
-// 
-//     case BBS_CDROM:
-//       CDCount++;
-//       break;
-// 
-//     case BBS_EMBED_NETWORK:
-//       NETCount++;
-//       break;
-// 
-//     case BBS_BEV_DEVICE:
-//       BEVCount++;
-//       break;
-// 
-//     default:
-//       break;
-//     }
-//   }
-// 
-//   TotalSize += (HeaderSize + FDCount * sizeof (UINT16));
-//   TotalSize += (HeaderSize + HDCount * sizeof (UINT16));
-//   TotalSize += (HeaderSize + CDCount * sizeof (UINT16));
-//   TotalSize += (HeaderSize + NETCount * sizeof (UINT16));
-//   TotalSize += (HeaderSize + BEVCount * sizeof (UINT16));
-// 
-//   NewDevOrder = AllocateZeroPool (TotalSize);
-//   if (NULL == NewDevOrder) {
-//     return EFI_OUT_OF_RESOURCES;
-//   }
-// 
-// 
-// 
-//   //
-//   // copy FD
-//   //
-//   Ptr             = DevOrder;
-//   NewPtr          = NewDevOrder;
-//   NewPtr->BbsType = Ptr->BbsType;
-//   NewPtr->Length  = (UINT16) (sizeof (UINT16) + FDCount * sizeof (UINT16));
-//   for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
-//     if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY ||
-//         LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM ||
-//         LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_FLOPPY
-//         ) {
-//       continue;
-//     }
-// 
-//     NewPtr->Data[FDIndex] = Ptr->Data[Index];
-//     FDIndex++;
-//   }
-//   NewFDPtr = NewPtr->Data;
-// 
-//   //
-//   // copy HD
-//   //
-//   Ptr             = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
-//   NewPtr          = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
-//   NewPtr->BbsType = Ptr->BbsType;
-//   NewPtr->Length  = (UINT16) (sizeof (UINT16) + HDCount * sizeof (UINT16));
-//   for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
-//     if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY ||
-//         LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM ||
-//         LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY ||
-//         LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_HARDDISK
-//         ) {
-//       continue;
-//     }
-// 
-//     NewPtr->Data[HDIndex] = Ptr->Data[Index];
-//     HDIndex++;
-//   }
-//   NewHDPtr = NewPtr->Data;
-// 
-//   //
-//   // copy CD
-//   //
-//   Ptr    = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
-//   NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
-//   NewPtr->BbsType = Ptr->BbsType;
-//   NewPtr->Length  = (UINT16) (sizeof (UINT16) + CDCount * sizeof (UINT16));
-//   for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
-//     if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY ||
-//         LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM ||
-//         LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY ||
-//         LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_CDROM
-//         ) {
-//       continue;
-//     }
-// 
-//     NewPtr->Data[CDIndex] = Ptr->Data[Index];
-//     CDIndex++;
-//   }
-//   NewCDPtr = NewPtr->Data;
-// 
-//   //
-//   // copy NET
-//   //
-//   Ptr    = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
-//   NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
-//   NewPtr->BbsType = Ptr->BbsType;
-//   NewPtr->Length  = (UINT16) (sizeof (UINT16) + NETCount * sizeof (UINT16));
-//   for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
-//     if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY ||
-//         LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM ||
-//         LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY ||
-//         LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_EMBED_NETWORK
-//         ) {
-//       continue;
-//     }
-// 
-//     NewPtr->Data[NETIndex] = Ptr->Data[Index];
-//     NETIndex++;
-//   }
-//   NewNETPtr = NewPtr->Data;
-//   
-//   //
-//   // copy BEV
-//   //
-//   Ptr    = (LEGACY_DEV_ORDER_ENTRY *) (&Ptr->Data[Ptr->Length / sizeof (UINT16) - 1]);
-//   NewPtr = (LEGACY_DEV_ORDER_ENTRY *) (&NewPtr->Data[NewPtr->Length / sizeof (UINT16) -1]);
-//   NewPtr->BbsType = Ptr->BbsType;
-//   NewPtr->Length  = (UINT16) (sizeof (UINT16) + BEVCount * sizeof (UINT16));
-//   for (Index = 0; Index < Ptr->Length / sizeof (UINT16) - 1; Index++) {
-//     if (LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_IGNORE_ENTRY ||
-//         LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_DO_NOT_BOOT_FROM ||
-//         LocalBbsTable[Ptr->Data[Index] & 0xFF].BootPriority == BBS_LOWEST_PRIORITY ||
-//         LocalBbsTable[Ptr->Data[Index] & 0xFF].DeviceType != BBS_BEV_DEVICE
-//         ) {
-//       continue;
-//     }
-// 
-//     NewPtr->Data[BEVIndex] = Ptr->Data[Index];
-//     BEVIndex++;
-//   }
-//   NewBEVPtr = NewPtr->Data;
-// 
-//   for (Index = 0; Index < BbsCount; Index++) {
-//     if ((LocalBbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) ||
-//         (LocalBbsTable[Index].BootPriority == BBS_DO_NOT_BOOT_FROM)
-//         ) {
-//       continue;
-//     }
-// 
-//     switch (LocalBbsTable[Index].DeviceType) {
-//     case BBS_FLOPPY:
-//       Idx       = &FDIndex;
-//       NewDevPtr = NewFDPtr;
-//       break;
-// 
-//     case BBS_HARDDISK:
-//       Idx       = &HDIndex;
-//       NewDevPtr = NewHDPtr;
-//       break;
-// 
-//     case BBS_CDROM:
-//       Idx       = &CDIndex;
-//       NewDevPtr = NewCDPtr;
-//       break;
-// 
-//     case BBS_EMBED_NETWORK:
-//       Idx       = &NETIndex;
-//       NewDevPtr = NewNETPtr;
-//       break;
-// 
-//     case BBS_BEV_DEVICE:
-//       Idx       = &BEVIndex;
-//       NewDevPtr = NewBEVPtr;
-//       break;
-// 
-//     default:
-//       Idx = NULL;
-//       break;
-//     }
-//     //
-//     // at this point we have copied those valid indexes to new buffer
-//     // and we should check if there is any new appeared boot device
-//     //
-//     if (Idx != NULL) {
-//       for (Index2 = 0; Index2 < *Idx; Index2++) {
-//         if ((NewDevPtr[Index2] & 0xFF) == (UINT16) Index) {
-//           break;
-//         }
-//       }
-// 
-//       if (Index2 == *Idx) {
-//         //
-//         // Index2 == *Idx means we didn't find Index
-//         // so Index is a new appeared device's index in BBS table
-//         // insert it before disabled indexes.
-//         //
-//         for (Index2 = 0; Index2 < *Idx; Index2++) {
-//           if ((NewDevPtr[Index2] & 0xFF00) == 0xFF00) {
-//             break;
-//           }
-//         }
-//         CopyMem (&NewDevPtr[Index2 + 1], &NewDevPtr[Index2], (*Idx - Index2) * sizeof (UINT16));
-//         NewDevPtr[Index2] = (UINT16) (Index & 0xFF);
-//         (*Idx)++;
-//       }
-//     }
-//   }
-// 
-//   FreePool (DevOrder);
-// 
-//   Status = gRT->SetVariable (
-//                   VAR_LEGACY_DEV_ORDER,
-//                   &gEfiLegacyDevOrderVariableGuid,
-//                   VAR_FLAG,
-//                   TotalSize,
-//                   NewDevOrder
-//                   );
-//   FreePool (NewDevOrder);
-// 
-//   return Status;
-// }
+UINT16 *
+BdsFillDevOrderBuf (
+  IN BBS_TABLE                    *BbsTable,
+  IN BBS_TYPE                     BbsType,
+  IN UINTN                        BbsCount,
+  OUT UINT16                      *Buf
+  )
+{
+  UINTN Index;
 
+  for (Index = 0; Index < BbsCount; Index++) {
+    if (BbsTable[Index].BootPriority == BBS_IGNORE_ENTRY) {
+      continue;
+    }
+
+    if (BbsTable[Index].DeviceType != BbsType) {
+      continue;
+    }
+
+    *Buf = (UINT16) (Index & 0xFF);
+    Buf++;
+  }
+
+  return Buf;
+}