On Tue, Sep 01, 2015 at 04:26:07PM +0200, Ard Biesheuvel wrote:
> Like the ArmVirtPkg platforms up until SVN r17713, the ArmPlatformPkg
> 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 ArmPlatformPkg's
> PlatformBdsLib implementation for the Intel BDS.
Naïve, and perhaps silly question/comment:
ArmVirtPkg, and this patch, both call this from PlatformBdsInit(),
whereas OvmfPkg does it from PlatformBdsPolicyBehavior().
The difference is the following segment in
IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c
which gets executed before signalling EndOfDxeEvent in OvmfPkg, but
not for Arm*:
---
//
// Set up the device list based on EFI 1.1 variables
// process Driver#### and Load the driver's in the
// driver option list
//
BdsLibBuildOptionFromVar (&DriverOptionList, L"DriverOrder");
if (!IsListEmpty (&DriverOptionList)) {
BdsLibLoadDrivers (&DriverOptionList);
}
//
// Check if we have the boot next option
//
mBootNext = BdsLibGetVariableAndSize (
L"BootNext",
&gEfiGlobalVariableGuid,
&BootNextSize
);
---
and the code at the start of Ovmf's PlatformBdsPolicyBehavior():
---
VisitAllInstancesOfProtocol (&gEfiPciRootBridgeIoProtocolGuid,
ConnectRootBridge, NULL);
//
// We can't signal End-of-Dxe earlier than this. Namely, End-of-Dxe triggers
// the preparation of S3 system information. That logic has a hard dependency
// on the presence of the FACS ACPI table. Since our ACPI tables are only
// installed after PCI enumeration completes, we must not trigger the S3 save
// earlier, hence we can't signal End-of-Dxe earlier.
//
---
Does the above not apply for any ArmPlatformPkg platforms (or others
importing ArmPlatformPkg's PlatformIntelBdsLib)?
If so, is this also not applicable to virtio-pci in ArmVirtPkg?
/
Leif
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Ard Biesheuvel <[email protected]>
> ---
> ArmPlatformPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c | 36
> ++++++++++++++++++++
> ArmPlatformPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.h | 1 +
> ArmPlatformPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf | 1 +
> 3 files changed, 38 insertions(+)
>
> diff --git a/ArmPlatformPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
> b/ArmPlatformPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
> index 98d5b277a636..e27e6d66df91 100644
> --- a/ArmPlatformPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
> +++ b/ArmPlatformPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.c
> @@ -31,6 +31,24 @@ PlatformIntelBdsConstructor (
> return EFI_SUCCESS;
> }
>
> +/**
> + 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
> //
> @@ -45,6 +63,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);
> + }
> }
>
> STATIC
> diff --git a/ArmPlatformPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.h
> b/ArmPlatformPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.h
> index 7122d58be7d7..da428288fb9f 100644
> --- a/ArmPlatformPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.h
> +++ b/ArmPlatformPkg/Library/PlatformIntelBdsLib/IntelBdsPlatform.h
> @@ -30,5 +30,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> #include <Library/PlatformBdsLib.h>
>
> #include <Guid/GlobalVariable.h>
> +#include <Guid/EventGroup.h>
>
> #endif // _INTEL_BDS_PLATFORM_H
> diff --git
> a/ArmPlatformPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
> b/ArmPlatformPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
> index a18c5ea71f70..39df113288d2 100644
> --- a/ArmPlatformPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
> +++ b/ArmPlatformPkg/Library/PlatformIntelBdsLib/PlatformIntelBdsLib.inf
> @@ -53,6 +53,7 @@ [LibraryClasses]
>
> [Guids]
> gArmGlobalVariableGuid
> + gEfiEndOfDxeEventGroupGuid
>
> [Pcd]
> gArmPlatformTokenSpaceGuid.PcdDefaultConInPaths
> --
> 1.9.1
>
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel