On 06/25/15 13:00, Ard Biesheuvel wrote:
> Currently, the ArmVirtPkg platforms built with the Intel BDS fail
> to signal the end-of-DXE event 'gEfiEndOfDxeEventGroupGuid' when
> entering the BDS phase, which results in some loss of functionality,
> i.e., variable reclaim in the VariableDxe drivers, and the splitting
> of the memory regions that is part of the recently added UEFI 2.5
> properties table feature.
> 
> As discussed on the edk2-devel mailing list here:
> 
> http://thread.gmane.org/gmane.comp.bios.tianocore.devel/16088/focus=16109
> 
> it is up to the platform BDS to signal that event, since there may be
> platform specific ordering constraints with respect to the signalling
> of the event that are difficult to honor at the generic level.
> 
> So add the SignalEvent () call to PlatformBdsInit () of ArmVirtPkg's
> PlatformBdsLib implementation for the Intel BDS.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org>
> ---
> v2:
> - use STATIC for empty callback function
> - use TPL_CALLBACK priority level
> - close EFI_END_OF_DXE_EVENT_GROUP_GUID event group after signalling it
> - indentation fixes
> 
>  ArmVirtPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c      | 36 
> ++++++++++++++++++++
>  ArmVirtPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf |  1 +
>  2 files changed, 37 insertions(+)
> 
> diff --git a/ArmVirtPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c 
> b/ArmVirtPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
> index 499cce5dcde6..13830cbe3665 100644
> --- a/ArmVirtPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
> +++ b/ArmVirtPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
> @@ -24,6 +24,7 @@
>  #include <Protocol/GraphicsOutput.h>
>  #include <Protocol/PciIo.h>
>  #include <Protocol/PciRootBridgeIo.h>
> +#include <Guid/EventGroup.h>
>  
>  #include "IntelBdsPlatform.h"
>  
> @@ -118,6 +119,23 @@ STATIC PLATFORM_USB_KEYBOARD mUsbKeyboard = {
>    }
>  };
>  
> +/**
> +  An empty function to pass error checking of CreateEventEx ().
> +
> +  @param  Event                 Event whose notification function is being 
> invoked.
> +  @param  Context               Pointer to the notification function's 
> context,
> +                                which is implementation-dependent.
> +
> +**/
> +STATIC
> +VOID
> +EFIAPI
> +EmptyCallbackFunction (
> +  IN EFI_EVENT                Event,
> +  IN VOID                     *Context
> +  )
> +{
> +}
>  
>  //
>  // BDS Platform Functions
> @@ -133,6 +151,24 @@ PlatformBdsInit (
>    VOID
>    )
>  {
> +  EFI_EVENT           EndOfDxeEvent;
> +  EFI_STATUS          Status;
> +
> +  //
> +  // Signal EndOfDxe PI Event
> +  //
> +  Status = gBS->CreateEventEx (
> +                  EVT_NOTIFY_SIGNAL,
> +                  TPL_CALLBACK,
> +                  EmptyCallbackFunction,
> +                  NULL,
> +                  &gEfiEndOfDxeEventGroupGuid,
> +                  &EndOfDxeEvent
> +                  );
> +  if (!EFI_ERROR (Status)) {
> +    gBS->SignalEvent (EndOfDxeEvent);
> +    gBS->CloseEvent (EndOfDxeEvent);
> +  }
>  }
>  
>  
> diff --git a/ArmVirtPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf 
> b/ArmVirtPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
> index d8f892642c2e..d9982167e81d 100644
> --- a/ArmVirtPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
> +++ b/ArmVirtPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
> @@ -65,6 +65,7 @@ [Guids]
>    gEfiFileInfoGuid
>    gEfiFileSystemInfoGuid
>    gEfiFileSystemVolumeLabelInfoIdGuid
> +  gEfiEndOfDxeEventGroupGuid
>  
>  [Protocols]
>    gEfiDevicePathProtocolGuid
> 

Looks good, but you're going to hate me nonetheless. Because, our
exchange has been too quick, and my thoughts about addressing the same
in OvmfPkg had not matured enough until I posted my v1 review.

Namely, both OvmfPkg and ArmPlatformPkg contain the following snippet at
the very end of their respective PlatformBdsPolicyBehavior() functions:

  BdsLibEnumerateAllBootOption (BootOptionList);

  SetBootOrderFromQemu (BootOptionList);
  //
  // The BootOrder variable may have changed, reload the in-memory list with
  // it.
  //
  BdsLibBuildOptionFromVar (BootOptionList, L"BootOrder");

  PlatformBdsEnterFrontPage (GetFrontPageTimeoutFromQemu(), TRUE);

The pair (BdsLibEnumerateAllBootOption(), SetBootOrderFromQemu())
massages UEFI non-volatile variables (boot options) quite heavily. The
first creates a bunch of new boot options, while the second prunes quite
a few of those. (This is necessary because a VM's hardware might change
dynamically before every single boot, so everything needs to be
enumerated, and then filtered / reordered according to the fw_cfg boot
order file, every time.)

Since one of your stated goals is "variable reclaim" before booting the
OS, I propose (for both ArmVirtPkg and my future OvmfPkg patch(es)) that
we signal the event right before the PlatformBdsEnterFrontPage() call --
ie. as the penultimate step of PlatformBdsPolicyBehavior() --, rather
than in PlatformBdsInit(). Then the reclaim would cover the variable
churn incurred by those two functions I named above.

What do you think?

Thanks
Laszlo

------------------------------------------------------------------------------
Monitor 25 network devices or servers for free with OpManager!
OpManager is web-based network management software that monitors 
network devices and physical & virtual servers, alerts via email & sms 
for fault. Monitor 25 devices for free with no restriction. Download now
http://ad.doubleclick.net/ddm/clk/292181274;119417398;o
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to