On Fri, Sep 6, 2013 at 2:40 PM, Laszlo Ersek <ler...@redhat.com> wrote:
> In preparation for the next patch, collect active UEFI boot options in
> advance into a new array. Rebase the current inner loop (the matching
> loop) to this array.
>
> Contributed-under: TianoCore Contribution Agreement 1.0
>
> Signed-off-by: Laszlo Ersek <ler...@redhat.com>
> ---
>  OvmfPkg/Library/PlatformBdsLib/QemuBootOrder.c |  115 
> ++++++++++++++++++++----
>  1 files changed, 97 insertions(+), 18 deletions(-)
>
> diff --git a/OvmfPkg/Library/PlatformBdsLib/QemuBootOrder.c 
> b/OvmfPkg/Library/PlatformBdsLib/QemuBootOrder.c
> index e9580b9..7139cc2 100644
> --- a/OvmfPkg/Library/PlatformBdsLib/QemuBootOrder.c
> +++ b/OvmfPkg/Library/PlatformBdsLib/QemuBootOrder.c
> @@ -238,6 +238,15 @@ typedef struct {
>
>
>  /**
> +  Array element tracking an enumerated boot option that has the
> +  LOAD_OPTION_ACTIVE attribute.
> +**/
> +typedef struct {
> +  CONST BDS_COMMON_OPTION *BootOption; // reference only, no ownership
> +} ACTIVE_OPTION;
> +
> +
> +/**
>
>    Append BootOptionId to BootOrder, reallocating the latter if needed.
>
> @@ -283,6 +292,75 @@ BootOrderAppend (
>
>
>  /**
> +
> +  Create an array of ACTIVE_OPTION elements for a boot option list.
> +
> +  @param[in]  BootOptionList  A boot option list, created with
> +                              BdsLibEnumerateAllBootOption().
> +
> +  @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.
> +
> +  @retval RETURN_OUT_OF_RESOURCES  Memory allocation failed.
> +
> +**/
> +STATIC
> +RETURN_STATUS
> +CollectActiveOptions (
> +  IN   CONST LIST_ENTRY *BootOptionList,
> +  OUT  ACTIVE_OPTION    **ActiveOption,
> +  OUT  UINTN            *Count
> +  )
> +{
> +  UINTN ScanMode;
> +

GCC 4.7 for IA32 wants to issue a warning unless I set *ActiveOption
to NULL here. Do you see the same?

> +  //
> +  // Scan the list twice:
> +  // - count active entries,
> +  // - 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)) {
> +        if (ScanMode == 1) {
> +          (*ActiveOption)[*Count].BootOption = Current;
> +        }
> +        ++*Count;
> +      }
> +      Link = Link->ForwardLink;
> +    }
> +
> +    if (ScanMode == 0) {
> +      if (*Count == 0) {
> +        return RETURN_NOT_FOUND;
> +      }
> +      *ActiveOption = AllocatePool (*Count * sizeof **ActiveOption);
> +      if (*ActiveOption == NULL) {
> +        return RETURN_OUT_OF_RESOURCES;
> +      }
> +    }
> +  }
> +  return RETURN_SUCCESS;
> +}
> +
> +
> +/**
>    OpenFirmware device path node
>  **/
>  typedef struct {
> @@ -967,6 +1045,8 @@ SetBootOrderFromQemu (
>    CONST CHAR8                      *FwCfgPtr;
>
>    BOOT_ORDER                       BootOrder;
> +  ACTIVE_OPTION                    *ActiveOption;
> +  UINTN                            ActiveCount;
>
>    UINTN                            TranslatedSize;
>    CHAR16                           Translated[TRANSLATION_OUTPUT_SIZE];
> @@ -1007,6 +1087,11 @@ SetBootOrderFromQemu (
>      goto ErrorFreeFwCfg;
>    }
>
> +  Status = CollectActiveOptions (BootOptionList, &ActiveOption, 
> &ActiveCount);
> +  if (RETURN_ERROR (Status)) {
> +    goto ErrorFreeBootOrder;
> +  }
> +
>    //
>    // translate each OpenFirmware path
>    //
> @@ -1016,38 +1101,29 @@ SetBootOrderFromQemu (
>           Status == RETURN_UNSUPPORTED ||
>           Status == RETURN_BUFFER_TOO_SMALL) {
>      if (Status == RETURN_SUCCESS) {
> -      CONST LIST_ENTRY *Link;
> +      UINTN Idx;
>
>        //
> -      // match translated OpenFirmware path against all enumerated boot 
> options
> +      // match translated OpenFirmware path against all active boot options
>        //
> -      for (Link = BootOptionList->ForwardLink; Link != BootOptionList;
> -           Link = Link->ForwardLink) {
> -        CONST BDS_COMMON_OPTION *BootOption;
> -
> -        BootOption = CR (
> -                       Link,
> -                       BDS_COMMON_OPTION,
> -                       Link,
> -                       BDS_LOAD_OPTION_SIGNATURE
> -                       );
> -        if (IS_LOAD_OPTION_TYPE (BootOption->Attribute, LOAD_OPTION_ACTIVE) 
> &&
> -            Match (
> +      for (Idx = 0; Idx < ActiveCount; ++Idx) {
> +        if (Match (
>                Translated,
>                TranslatedSize, // contains length, not size, in CHAR16's here
> -              BootOption->DevicePath
> +              ActiveOption[Idx].BootOption->DevicePath
>                )
>              ) {
>            //
>            // match found, store ID and continue with next OpenFirmware path
>            //
> -          Status = BootOrderAppend (&BootOrder, BootOption->BootCurrent);
> +          Status = BootOrderAppend (&BootOrder,
> +                     ActiveOption[Idx].BootOption->BootCurrent);
>            if (Status != RETURN_SUCCESS) {
> -            goto ErrorFreeBootOrder;
> +            goto ErrorFreeActiveOption;
>            }
>            break;
>          }
> -      } // scanned all enumerated boot options
> +      } // scanned all active boot options
>      }   // translation successful
>
>      TranslatedSize = sizeof (Translated) / sizeof (Translated[0]);
> @@ -1077,6 +1153,9 @@ SetBootOrderFromQemu (
>        ));
>    }
>
> +ErrorFreeActiveOption:
> +  FreePool (ActiveOption);
> +
>  ErrorFreeBootOrder:
>    FreePool (BootOrder.Data);
>
> --
> 1.7.1
>
>
>
> ------------------------------------------------------------------------------
> Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
> Discover the easy way to master current and previous Microsoft technologies
> and advance your career. Get an incredible 1,500+ hours of step-by-step
> tutorial videos with LearnDevNow. Subscribe today and save!
> http://pubads.g.doubleclick.net/gampad/clk?id=58041391&iu=/4140/ostg.clktrk
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. Consolidate legacy IT systems to a single system of record for IT
2. Standardize and globalize service processes across IT
3. Implement zero-touch automation to replace manual, redundant tasks
http://pubads.g.doubleclick.net/gampad/clk?id=51271111&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to