I wanted to mention an opportunity for a micro-optimization:

On 05/03/16 11:16, Laszlo Ersek wrote:
> On 05/03/16 07:35, Ruiyu Ni wrote:
>> NOTE: SetBootOrderFromQemu() interface is not changed.
>> But when the old IntelFrameworkModulePkg/BDS is no longer used in
>> OVMF and ArmVirtPkg, additional patch will be submitted to change
>> this interface to remove parameter BootOptionList.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Ruiyu Ni <ruiyu...@intel.com>
>> Cc: Jordan Justen <jordan.l.jus...@intel.com>
>> Cc: Laszlo Ersek <ler...@redhat.com>
>> ---
>>  .../Library/QemuNewBootOrderLib/QemuBootOrderLib.c | 160 
>> ++++++++++++++-------
>>  .../QemuNewBootOrderLib/QemuBootOrderLib.inf       |   4 +-
>>  2 files changed, 113 insertions(+), 51 deletions(-)
> 
> This looks fine and works fine as well.
> 
> Reviewed-by: Laszlo Ersek <ler...@redhat.com>
> Tested-by: Laszlo Ersek <ler...@redhat.com>
> 
> Thanks Ray!
> Laszlo
> 
>> diff --git a/OvmfPkg/Library/QemuNewBootOrderLib/QemuBootOrderLib.c 
>> b/OvmfPkg/Library/QemuNewBootOrderLib/QemuBootOrderLib.c
>> index 15065b7..cea3219 100644
>> --- a/OvmfPkg/Library/QemuNewBootOrderLib/QemuBootOrderLib.c
>> +++ b/OvmfPkg/Library/QemuNewBootOrderLib/QemuBootOrderLib.c
>> @@ -2,7 +2,7 @@
>>    Rewrite the BootOrder NvVar based on QEMU's "bootorder" fw_cfg file.
>>  
>>    Copyright (C) 2012 - 2014, Red Hat, Inc.
>> -  Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>
>> +  Copyright (c) 2013 - 2016, 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
>> @@ -16,7 +16,7 @@
>>  #include <Library/QemuFwCfgLib.h>
>>  #include <Library/DebugLib.h>
>>  #include <Library/MemoryAllocationLib.h>
>> -#include <Library/GenericBdsLib.h>
>> +#include <Library/UefiBootManagerLib.h>
>>  #include <Library/UefiBootServicesTableLib.h>
>>  #include <Library/UefiRuntimeServicesTableLib.h>
>>  #include <Library/BaseLib.h>
>> @@ -253,8 +253,10 @@ typedef struct {
>>    LOAD_OPTION_ACTIVE attribute.
>>  **/
>>  typedef struct {
>> -  CONST BDS_COMMON_OPTION *BootOption; // reference only, no ownership
>> -  BOOLEAN                 Appended;    // has been added to a BOOT_ORDER?
>> +  CONST EFI_BOOT_MANAGER_LOAD_OPTION *BootOption; // reference only, no
>> +                                                  //   ownership
>> +  BOOLEAN                            Appended;    // has been added to a
>> +                                                  //   BOOT_ORDER?
>>  } ACTIVE_OPTION;
>>  
>>  
>> @@ -300,7 +302,7 @@ BootOrderAppend (
>>    }
>>  
>>    BootOrder->Data[BootOrder->Produced++] =
>> -                                         
>> ActiveOption->BootOption->BootCurrent;
>> +                               (UINT16) 
>> ActiveOption->BootOption->OptionNumber;
>>    ActiveOption->Appended = TRUE;
>>    return RETURN_SUCCESS;
>>  }
>> @@ -308,22 +310,25 @@ BootOrderAppend (
>>  
>>  /**
>>  
>> -  Create an array of ACTIVE_OPTION elements for a boot option list.
>> +  Create an array of ACTIVE_OPTION elements for a boot option array.
>>  
>> -  @param[in]  BootOptionList  A boot option list, created with
>> -                              BdsLibEnumerateAllBootOption().
>> +  @param[in]  BootOptions      A boot option array, created with
>> +                               EfiBootManagerRefreshAllBootOption () and
>> +                               EfiBootManagerGetLoadOptions ().
>>  
>> -  @param[out] ActiveOption    Pointer to the first element in the new array.
>> -                              The caller is responsible for freeing the 
>> array
>> -                              with FreePool() after use.
>> +  @param[in]  BootOptionCount  The number of elements in BootOptions.
>>  
>> -  @param[out] Count           Number of elements in the new array.
>> +  @param[out] ActiveOption     Pointer to the first element in the new 
>> array.
>> +                               The caller is responsible for freeing the 
>> array
>> +                               with FreePool() after use.
>> +
>> +  @param[out] Count            Number of elements in the new array.
>>  
>>  
>>    @retval RETURN_SUCCESS           The ActiveOption array has been created.
>>  
>>    @retval RETURN_NOT_FOUND         No active entry has been found in
>> -                                   BootOptionList.
>> +                                   BootOptions.
>>  
>>    @retval RETURN_OUT_OF_RESOURCES  Memory allocation failed.
>>  
>> @@ -331,11 +336,13 @@ BootOrderAppend (
>>  STATIC
>>  RETURN_STATUS
>>  CollectActiveOptions (
>> -  IN   CONST LIST_ENTRY *BootOptionList,
>> -  OUT  ACTIVE_OPTION    **ActiveOption,
>> -  OUT  UINTN            *Count
>> +  IN   CONST EFI_BOOT_MANAGER_LOAD_OPTION *BootOptions,
>> +  IN   UINTN                              BootOptionCount,
>> +  OUT  ACTIVE_OPTION                      **ActiveOption,
>> +  OUT  UINTN                              *Count
>>    )
>>  {
>> +  UINTN Index;
>>    UINTN ScanMode;
>>  
>>    *ActiveOption = NULL;
>> @@ -346,22 +353,15 @@ CollectActiveOptions (
>>    // - store links to active entries.
>>    //
>>    for (ScanMode = 0; ScanMode < 2; ++ScanMode) {
>> -    CONST LIST_ENTRY *Link;
>> -
>> -    Link = BootOptionList->ForwardLink;
>>      *Count = 0;
>> -    while (Link != BootOptionList) {
>> -      CONST BDS_COMMON_OPTION *Current;
>> -
>> -      Current = CR (Link, BDS_COMMON_OPTION, Link, 
>> BDS_LOAD_OPTION_SIGNATURE);
>> -      if (IS_LOAD_OPTION_TYPE (Current->Attribute, LOAD_OPTION_ACTIVE)) {
>> +    for (Index = 0; Index < BootOptionCount; Index++) {
>> +      if ((BootOptions[Index].Attributes & LOAD_OPTION_ACTIVE) != 0) {
>>          if (ScanMode == 1) {
>> -          (*ActiveOption)[*Count].BootOption = Current;
>> +          (*ActiveOption)[*Count].BootOption = &BootOptions[Index];
>>            (*ActiveOption)[*Count].Appended   = FALSE;
>>          }
>>          ++*Count;
>>        }
>> -      Link = Link->ForwardLink;
>>      }
>>  
>>      if (ScanMode == 0) {
>> @@ -1437,11 +1437,17 @@ BOOLEAN
>>  Match (
>>    IN  CONST CHAR16                           *Translated,
>>    IN  UINTN                                  TranslatedLength,
>> -  IN  CONST EFI_DEVICE_PATH_PROTOCOL         *DevicePath
>> +  IN  EFI_DEVICE_PATH_PROTOCOL               *DevicePath
>>    )
>>  {
>> -  CHAR16  *Converted;
>> -  BOOLEAN Result;
>> +  CHAR16                   *Converted;
>> +  BOOLEAN                  Result;
>> +  VOID                     *FileBuffer;
>> +  UINTN                    FileSize;
>> +  EFI_DEVICE_PATH_PROTOCOL *AbsDevicePath;
>> +  CHAR16                   *AbsConverted;
>> +  BOOLEAN                  Shortform;
>> +  EFI_DEVICE_PATH_PROTOCOL *Node;
>>  
>>    Converted = ConvertDevicePathToText (
>>                  DevicePath,
>> @@ -1452,24 +1458,56 @@ Match (
>>      return FALSE;
>>    }
>>  
>> +  Result = FALSE;
>> +  Shortform = FALSE;
>>    //
>> -  // Attempt to expand any relative UEFI device path starting with HD() to 
>> an
>> -  // absolute device path first. The logic imitates 
>> BdsLibBootViaBootOption().
>> -  // We don't have to free the absolute device path,
>> -  // BdsExpandPartitionPartialDevicePathToFull() has internal caching.
>> +  // Expand the short-form device path to full device path
>>    //
>> -  Result = FALSE;
>> -  if (DevicePathType (DevicePath) == MEDIA_DEVICE_PATH &&
>> -      DevicePathSubType (DevicePath) == MEDIA_HARDDRIVE_DP) {
>> -    EFI_DEVICE_PATH_PROTOCOL *AbsDevicePath;
>> -    CHAR16                   *AbsConverted;
>> -
>> -    AbsDevicePath = BdsExpandPartitionPartialDevicePathToFull (
>> -                      (HARDDRIVE_DEVICE_PATH *) DevicePath);
>> -    if (AbsDevicePath == NULL) {
>> +  if ((DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) &&
>> +      (DevicePathSubType (DevicePath) == MEDIA_HARDDRIVE_DP)) {
>> +    //
>> +    // Harddrive shortform device path
>> +    //
>> +    Shortform = TRUE;
>> +  } else if ((DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) &&
>> +             (DevicePathSubType (DevicePath) == MEDIA_FILEPATH_DP)) {
>> +    //
>> +    // File-path shortform device path
>> +    //
>> +    Shortform = TRUE;
>> +  } else if ((DevicePathType (DevicePath) == MESSAGING_DEVICE_PATH) &&
>> +             (DevicePathSubType (DevicePath) == MSG_URI_DP)) {
>> +    //
>> +    // URI shortform device path
>> +    //
>> +    Shortform = TRUE;
>> +  } else {
>> +    for ( Node = DevicePath
>> +        ; !IsDevicePathEnd (Node)
>> +        ; Node = NextDevicePathNode (Node)
>> +        ) {
>> +      if ((DevicePathType (Node) == MESSAGING_DEVICE_PATH) &&
>> +          ((DevicePathSubType (Node) == MSG_USB_CLASS_DP) ||
>> +           (DevicePathSubType (Node) == MSG_USB_WWID_DP))) {
>> +        Shortform = TRUE;

You could add a "break" statement here.

With our without that addition, my R-b and T-b stand, of course.

Thanks
Laszlo

>> +      }
>> +    }
>> +  }
>> +
>> +  //
>> +  // Attempt to expand any relative UEFI device path to
>> +  // an absolute device path first.
>> +  //
>> +  if (Shortform) {
>> +    FileBuffer = EfiBootManagerGetLoadOptionBuffer (
>> +                   DevicePath, &AbsDevicePath, &FileSize
>> +                   );
>> +    if (FileBuffer == NULL) {
>>        goto Exit;
>>      }
>> +    FreePool (FileBuffer);
>>      AbsConverted = ConvertDevicePathToText (AbsDevicePath, FALSE, FALSE);
>> +    FreePool (AbsDevicePath);
>>      if (AbsConverted == NULL) {
>>        goto Exit;
>>      }
>> @@ -1538,11 +1576,11 @@ BootOrderComplete (
>>    Idx = 0;
>>    while (!RETURN_ERROR (Status) && Idx < ActiveCount) {
>>      if (!ActiveOption[Idx].Appended) {
>> -      CONST BDS_COMMON_OPTION        *Current;
>> -      CONST EFI_DEVICE_PATH_PROTOCOL *FirstNode;
>> +      CONST EFI_BOOT_MANAGER_LOAD_OPTION *Current;
>> +      CONST EFI_DEVICE_PATH_PROTOCOL     *FirstNode;
>>  
>>        Current = ActiveOption[Idx].BootOption;
>> -      FirstNode = Current->DevicePath;
>> +      FirstNode = Current->FilePath;
>>        if (FirstNode != NULL) {
>>          CHAR16        *Converted;
>>          STATIC CHAR16 ConvFallBack[] = L"<unable to convert>";
>> @@ -1635,7 +1673,7 @@ PruneBootVariables (
>>        CHAR16 VariableName[9];
>>  
>>        UnicodeSPrintAsciiFormat (VariableName, sizeof VariableName, 
>> "Boot%04x",
>> -        ActiveOption[Idx].BootOption->BootCurrent);
>> +        ActiveOption[Idx].BootOption->OptionNumber);
>>  
>>        //
>>        // "The space consumed by the deleted variable may not be available 
>> until
>> @@ -1699,6 +1737,17 @@ SetBootOrderFromQemu (
>>  
>>    UINTN                            TranslatedSize;
>>    CHAR16                           Translated[TRANSLATION_OUTPUT_SIZE];
>> +  EFI_BOOT_MANAGER_LOAD_OPTION     *BootOptions;
>> +  UINTN                            BootOptionCount;
>> +
>> +  //
>> +  // The QemuBootOrderLib is linked by OvmfPkg and ArmVirtPkg.
>> +  // OvmfPkg was changed to use the new BDS @ MdeModulePkg, so boot options
>> +  // are no longer stored in linked list.
>> +  // But we don't change the QemuBootOrderLib class interface because
>> +  // ArmVirtPkg are still using old BDS @ IntelFrameworkModulePkg.
>> +  //
>> +  ASSERT (BootOptionList == NULL);
>>  
>>    Status = QemuFwCfgFindFile ("bootorder", &FwCfgItem, &FwCfgSize);
>>    if (Status != RETURN_SUCCESS) {
>> @@ -1736,11 +1785,21 @@ SetBootOrderFromQemu (
>>      goto ErrorFreeFwCfg;
>>    }
>>  
>> -  Status = CollectActiveOptions (BootOptionList, &ActiveOption, 
>> &ActiveCount);
>> -  if (RETURN_ERROR (Status)) {
>> +  BootOptions = EfiBootManagerGetLoadOptions (
>> +                  &BootOptionCount, LoadOptionTypeBoot
>> +                  );
>> +  if (BootOptions == NULL) {
>> +    Status = RETURN_NOT_FOUND;
>>      goto ErrorFreeBootOrder;
>>    }
>>  
>> +  Status = CollectActiveOptions (
>> +             BootOptions, BootOptionCount, &ActiveOption, &ActiveCount
>> +             );
>> +  if (RETURN_ERROR (Status)) {
>> +    goto ErrorFreeBootOptions;
>> +  }
>> +
>>    if (FeaturePcdGet (PcdQemuBootOrderPciTranslation)) {
>>      Status = CreateExtraRootBusMap (&ExtraPciRoots);
>>      if (EFI_ERROR (Status)) {
>> @@ -1770,7 +1829,7 @@ SetBootOrderFromQemu (
>>          if (Match (
>>                Translated,
>>                TranslatedSize, // contains length, not size, in CHAR16's here
>> -              ActiveOption[Idx].BootOption->DevicePath
>> +              ActiveOption[Idx].BootOption->FilePath
>>                )
>>              ) {
>>            //
>> @@ -1831,6 +1890,9 @@ ErrorFreeExtraPciRoots:
>>  ErrorFreeActiveOption:
>>    FreePool (ActiveOption);
>>  
>> +ErrorFreeBootOptions:
>> +  EfiBootManagerFreeLoadOptions (BootOptions, BootOptionCount);
>> +
>>  ErrorFreeBootOrder:
>>    FreePool (BootOrder.Data);
>>  
>> diff --git a/OvmfPkg/Library/QemuNewBootOrderLib/QemuBootOrderLib.inf 
>> b/OvmfPkg/Library/QemuNewBootOrderLib/QemuBootOrderLib.inf
>> index 9374a61..40a315b 100644
>> --- a/OvmfPkg/Library/QemuNewBootOrderLib/QemuBootOrderLib.inf
>> +++ b/OvmfPkg/Library/QemuNewBootOrderLib/QemuBootOrderLib.inf
>> @@ -36,14 +36,14 @@ [Sources]
>>  
>>  [Packages]
>>    MdePkg/MdePkg.dec
>> -  IntelFrameworkModulePkg/IntelFrameworkModulePkg.dec
>> +  MdeModulePkg/MdeModulePkg.dec
>>    OvmfPkg/OvmfPkg.dec
>>  
>>  [LibraryClasses]
>>    QemuFwCfgLib
>>    DebugLib
>>    MemoryAllocationLib
>> -  GenericBdsLib
>> +  UefiBootManagerLib
>>    UefiBootServicesTableLib
>>    UefiRuntimeServicesTableLib
>>    BaseLib
>>
> 

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to