I can't find a fault with your argument, but something tells me it
might be good to get some input from Mike or Andrew (or others on the
list) in the form of a history lesson to know why the two modes might
have been supported.

I've always seen it done this way, but likely this has been due to a
lot of "copy the old version and modify."

-Jordan

On 2015-10-14 15:26:40, Laszlo Ersek wrote:
> Currently the EFI_FW_VOL_INSTANCE and ESAL_FWB_GLOBAL structures declare
> the following entries as arrays, with two entries each:
> 
> - EFI_FW_VOL_INSTANCE.FvBase[2]
> - ESAL_FWB_GLOBAL.FvInstance[2]
> 
> In every case, the entry at subscript zero is meant as "physical address",
> while the entry at subscript one is meant as "virtual address" -- a
> pointer to the same object. The virtual address entry is originally
> initialized to the physical address, and then it is converted to the
> virtual mapping in FvbVirtualddressChangeEvent().
> 
> Functions that (a) read the listed fields and (b) run both before and
> after the virtual address change event -- since this is a runtime DXE
> driver -- derive the correct array subscript by calling the
> EfiGoneVirtual() function from UefiRuntimeLib.
> 
> The problem with the above infrastructure is that it's entirely
> superfluous.
> 
> EfiGoneVirtual() "knows" whether EFI has gone virtual only because the
> UefiRuntimeLib constructor registers the exact same kind of virtual
> address change callback, and the callback flips a static variabe to TRUE,
> and EfiGoneVirtual() queries that static variable.
> 
> In effect this means for QemuFlashFvbServicesRuntimeDxe: "when there is a
> virtual address change, convert the entries with subscript one from
> physical to virtual, and from then on use the entries with subscript one".
> 
> This would only make sense if QemuFlashFvbServicesRuntimeDxe ever needed
> the original (physical) addresses (ie. the entries with subscript zero)
> after the virtual address change, but that is not the case.
> 
> Replace the arrays with single elements. The subscript zero elements
> simply disappear, and the single elements take the role of the prior
> subscript one elements.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Laszlo Ersek <[email protected]>
> ---
>  OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.h | 22 ++----
>  OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c | 77 
> ++++++--------------
>  2 files changed, 30 insertions(+), 69 deletions(-)
> 
> diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.h 
> b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.h
> index 7e4ff1e..5e8c2c7 100644
> --- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.h
> +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.h
> @@ -23,21 +23,15 @@
>  #ifndef _FW_BLOCK_SERVICE_H
>  #define _FW_BLOCK_SERVICE_H
>  
> -//
> -// BugBug: Add documentation here for data structure!!!!
> -//
> -#define FVB_PHYSICAL  0
> -#define FVB_VIRTUAL   1
> -
>  typedef struct {
> -  UINTN                       FvBase[2];
> +  UINTN                       FvBase;
>    UINTN                       NumOfBlocks;
>    EFI_FIRMWARE_VOLUME_HEADER  VolumeHeader;
>  } EFI_FW_VOL_INSTANCE;
>  
>  typedef struct {
>    UINT32              NumFv;
> -  EFI_FW_VOL_INSTANCE *FvInstance[2];
> +  EFI_FW_VOL_INSTANCE *FvInstance;
>  } ESAL_FWB_GLOBAL;
>  
>  //
> @@ -78,24 +72,21 @@ EFI_STATUS
>  FvbSetVolumeAttributes (
>    IN UINTN                                Instance,
>    IN OUT EFI_FVB_ATTRIBUTES_2             *Attributes,
> -  IN ESAL_FWB_GLOBAL                      *Global,
> -  IN BOOLEAN                              Virtual
> +  IN ESAL_FWB_GLOBAL                      *Global
>    );
>  
>  EFI_STATUS
>  FvbGetVolumeAttributes (
>    IN UINTN                                Instance,
>    OUT EFI_FVB_ATTRIBUTES_2                *Attributes,
> -  IN ESAL_FWB_GLOBAL                      *Global,
> -  IN BOOLEAN                              Virtual
> +  IN ESAL_FWB_GLOBAL                      *Global
>    );
>  
>  EFI_STATUS
>  FvbGetPhysicalAddress (
>    IN UINTN                                Instance,
>    OUT EFI_PHYSICAL_ADDRESS                *Address,
> -  IN ESAL_FWB_GLOBAL                      *Global,
> -  IN BOOLEAN                              Virtual
> +  IN ESAL_FWB_GLOBAL                      *Global
>    );
>  
>  EFI_STATUS
> @@ -120,8 +111,7 @@ FvbGetLbaAddress (
>    OUT UINTN                               *LbaAddress,
>    OUT UINTN                               *LbaLength,
>    OUT UINTN                               *NumOfBlocks,
> -  IN  ESAL_FWB_GLOBAL                     *Global,
> -  IN  BOOLEAN                             Virtual
> +  IN  ESAL_FWB_GLOBAL                     *Global
>    );
>  
>  //
> diff --git a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c 
> b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c
> index 95ae8cc..3eccb1f 100644
> --- a/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c
> +++ b/OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FwBlockService.c
> @@ -132,11 +132,6 @@ FvbVirtualddressChangeEvent (
>      Call the passed in Child Notify event and convert the mFvbModuleGlobal
>      date items to there virtual address.
>  
> -    mFvbModuleGlobal->FvInstance[FVB_PHYSICAL]  - Physical copy of instance
> -                                                  data
> -    mFvbModuleGlobal->FvInstance[FVB_VIRTUAL]   - Virtual pointer to common
> -                                                  instance data.
> -
>    Arguments:
>  
>      (Standard EFI notify event - EFI_EVENT_NOTIFY)
> @@ -150,16 +145,15 @@ FvbVirtualddressChangeEvent (
>    EFI_FW_VOL_INSTANCE *FwhInstance;
>    UINTN               Index;
>  
> -  EfiConvertPointer (0x0,
> -    (VOID **) &mFvbModuleGlobal->FvInstance[FVB_VIRTUAL]);
> +  FwhInstance = mFvbModuleGlobal->FvInstance;
> +  EfiConvertPointer (0x0, (VOID **) &mFvbModuleGlobal->FvInstance);
>  
>    //
>    // Convert the base address of all the instances
>    //
>    Index       = 0;
> -  FwhInstance = mFvbModuleGlobal->FvInstance[FVB_PHYSICAL];
>    while (Index < mFvbModuleGlobal->NumFv) {
> -    EfiConvertPointer (0x0, (VOID **) &FwhInstance->FvBase[FVB_VIRTUAL]);
> +    EfiConvertPointer (0x0, (VOID **) &FwhInstance->FvBase);
>      FwhInstance = (EFI_FW_VOL_INSTANCE *)
>        (
>          (UINTN) ((UINT8 *) FwhInstance) +
> @@ -177,8 +171,7 @@ EFI_STATUS
>  GetFvbInstance (
>    IN  UINTN                               Instance,
>    IN  ESAL_FWB_GLOBAL                     *Global,
> -  OUT EFI_FW_VOL_INSTANCE                 **FwhInstance,
> -  IN BOOLEAN                              Virtual
> +  OUT EFI_FW_VOL_INSTANCE                 **FwhInstance
>    )
>  /*++
>  
> @@ -191,7 +184,6 @@ GetFvbInstance (
>      Global                - Pointer to ESAL_FWB_GLOBAL that contains all
>                              instance data
>      FwhInstance           - The EFI_FW_VOL_INSTANCE fimrware instance 
> structure
> -    Virtual               - Whether CPU is in virtual or physical mode
>  
>    Returns:
>      EFI_SUCCESS           - Successfully returns
> @@ -208,7 +200,7 @@ GetFvbInstance (
>    //
>    // Find the right instance of the FVB private data
>    //
> -  FwhRecord = Global->FvInstance[Virtual];
> +  FwhRecord = Global->FvInstance;
>    while (Instance > 0) {
>      FwhRecord = (EFI_FW_VOL_INSTANCE *)
>        (
> @@ -227,8 +219,7 @@ EFI_STATUS
>  FvbGetPhysicalAddress (
>    IN UINTN                                Instance,
>    OUT EFI_PHYSICAL_ADDRESS                *Address,
> -  IN ESAL_FWB_GLOBAL                      *Global,
> -  IN BOOLEAN                              Virtual
> +  IN ESAL_FWB_GLOBAL                      *Global
>    )
>  /*++
>  
> @@ -243,7 +234,6 @@ FvbGetPhysicalAddress (
>                              address of the firmware volume.
>      Global                - Pointer to ESAL_FWB_GLOBAL that contains all
>                              instance data
> -    Virtual               - Whether CPU is in virtual or physical mode
>  
>    Returns:
>      EFI_SUCCESS           - Successfully returns
> @@ -257,9 +247,9 @@ FvbGetPhysicalAddress (
>    //
>    // Find the right instance of the FVB private data
>    //
> -  Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);
> +  Status = GetFvbInstance (Instance, Global, &FwhInstance);
>    ASSERT_EFI_ERROR (Status);
> -  *Address = FwhInstance->FvBase[Virtual];
> +  *Address = FwhInstance->FvBase;
>  
>    return EFI_SUCCESS;
>  }
> @@ -268,8 +258,7 @@ EFI_STATUS
>  FvbGetVolumeAttributes (
>    IN UINTN                                Instance,
>    OUT EFI_FVB_ATTRIBUTES_2                *Attributes,
> -  IN ESAL_FWB_GLOBAL                      *Global,
> -  IN BOOLEAN                              Virtual
> +  IN ESAL_FWB_GLOBAL                      *Global
>    )
>  /*++
>  
> @@ -283,7 +272,6 @@ FvbGetVolumeAttributes (
>      Attributes            - Output buffer which contains attributes
>      Global                - Pointer to ESAL_FWB_GLOBAL that contains all
>                              instance data
> -    Virtual               - Whether CPU is in virtual or physical mode
>  
>    Returns:
>      EFI_SUCCESS           - Successfully returns
> @@ -297,7 +285,7 @@ FvbGetVolumeAttributes (
>    //
>    // Find the right instance of the FVB private data
>    //
> -  Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);
> +  Status = GetFvbInstance (Instance, Global, &FwhInstance);
>    ASSERT_EFI_ERROR (Status);
>    *Attributes = FwhInstance->VolumeHeader.Attributes;
>  
> @@ -311,8 +299,7 @@ FvbGetLbaAddress (
>    OUT UINTN                               *LbaAddress,
>    OUT UINTN                               *LbaLength,
>    OUT UINTN                               *NumOfBlocks,
> -  IN  ESAL_FWB_GLOBAL                     *Global,
> -  IN  BOOLEAN                             Virtual
> +  IN  ESAL_FWB_GLOBAL                     *Global
>    )
>  /*++
>  
> @@ -331,7 +318,6 @@ FvbGetLbaAddress (
>                              BlockSize
>      Global                - Pointer to ESAL_FWB_GLOBAL that contains all
>                              instance data
> -    Virtual               - Whether CPU is in virtual or physical mode
>  
>    Returns:
>      EFI_SUCCESS           - Successfully returns
> @@ -351,7 +337,7 @@ FvbGetLbaAddress (
>    //
>    // Find the right instance of the FVB private data
>    //
> -  Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);
> +  Status = GetFvbInstance (Instance, Global, &FwhInstance);
>    ASSERT_EFI_ERROR (Status);
>  
>    StartLba  = 0;
> @@ -377,7 +363,7 @@ FvbGetLbaAddress (
>      if (Lba >= StartLba && Lba < NextLba) {
>        Offset = Offset + (UINTN) MultU64x32 ((Lba - StartLba), BlockLength);
>        if (LbaAddress != NULL) {
> -        *LbaAddress = FwhInstance->FvBase[Virtual] + Offset;
> +        *LbaAddress = FwhInstance->FvBase + Offset;
>        }
>  
>        if (LbaLength != NULL) {
> @@ -401,8 +387,7 @@ EFI_STATUS
>  FvbSetVolumeAttributes (
>    IN UINTN                                  Instance,
>    IN OUT EFI_FVB_ATTRIBUTES_2               *Attributes,
> -  IN ESAL_FWB_GLOBAL                        *Global,
> -  IN BOOLEAN                                Virtual
> +  IN ESAL_FWB_GLOBAL                        *Global
>    )
>  /*++
>  
> @@ -419,7 +404,6 @@ FvbSetVolumeAttributes (
>                              of the firmware volume
>      Global                - Pointer to ESAL_FWB_GLOBAL that contains all
>                              instance data
> -    Virtual               - Whether CPU is in virtual or physical mode
>  
>    Returns:
>      EFI_SUCCESS           - Successfully returns
> @@ -442,7 +426,7 @@ FvbSetVolumeAttributes (
>    //
>    // Find the right instance of the FVB private data
>    //
> -  Status = GetFvbInstance (Instance, Global, &FwhInstance, Virtual);
> +  Status = GetFvbInstance (Instance, Global, &FwhInstance);
>    ASSERT_EFI_ERROR (Status);
>  
>    AttribPtr     =
> @@ -562,7 +546,7 @@ FvbProtocolGetPhysicalAddress (
>    FvbDevice = FVB_DEVICE_FROM_THIS (This);
>  
>    return FvbGetPhysicalAddress (FvbDevice->Instance, Address,
> -           mFvbModuleGlobal, EfiGoneVirtual ());
> +           mFvbModuleGlobal);
>  }
>  
>  EFI_STATUS
> @@ -604,8 +588,7 @@ FvbProtocolGetBlockSize (
>            NULL,
>            BlockSize,
>            NumOfBlocks,
> -          mFvbModuleGlobal,
> -          EfiGoneVirtual ()
> +          mFvbModuleGlobal
>            );
>  }
>  
> @@ -634,7 +617,7 @@ FvbProtocolGetAttributes (
>    FvbDevice = FVB_DEVICE_FROM_THIS (This);
>  
>    return FvbGetVolumeAttributes (FvbDevice->Instance, Attributes,
> -           mFvbModuleGlobal, EfiGoneVirtual ());
> +           mFvbModuleGlobal);
>  }
>  
>  EFI_STATUS
> @@ -662,7 +645,7 @@ FvbProtocolSetAttributes (
>    FvbDevice = FVB_DEVICE_FROM_THIS (This);
>  
>    return FvbSetVolumeAttributes (FvbDevice->Instance, Attributes,
> -           mFvbModuleGlobal, EfiGoneVirtual ());
> +           mFvbModuleGlobal);
>  }
>  
>  EFI_STATUS
> @@ -708,7 +691,7 @@ FvbProtocolEraseBlocks (
>    FvbDevice = FVB_DEVICE_FROM_THIS (This);
>  
>    Status    = GetFvbInstance (FvbDevice->Instance, mFvbModuleGlobal,
> -                &FwhInstance, EfiGoneVirtual ());
> +                &FwhInstance);
>    ASSERT_EFI_ERROR (Status);
>  
>    NumOfBlocks = FwhInstance->NumOfBlocks;
> @@ -1088,21 +1071,10 @@ FvbInitialize (
>                  FwVolHeader->HeaderLength -
>                  sizeof (EFI_FIRMWARE_VOLUME_HEADER)
>                  );
> +  mFvbModuleGlobal->FvInstance = AllocateRuntimePool (BufferSize);
> +  ASSERT (mFvbModuleGlobal->FvInstance != NULL);
>  
> -  //
> -  // Only need to allocate once. There is only one copy of physical memory 
> for
> -  // the private data of each FV instance. But in virtual mode or in physical
> -  // mode, the address of the the physical memory may be different.
> -  //
> -  mFvbModuleGlobal->FvInstance[FVB_PHYSICAL] = AllocateRuntimePool (
> -                                                 BufferSize);
> -  ASSERT (mFvbModuleGlobal->FvInstance[FVB_PHYSICAL] != NULL);
> -
> -  //
> -  // Make a virtual copy of the FvInstance pointer.
> -  //
> -  FwhInstance = mFvbModuleGlobal->FvInstance[FVB_PHYSICAL];
> -  mFvbModuleGlobal->FvInstance[FVB_VIRTUAL] = FwhInstance;
> +  FwhInstance = mFvbModuleGlobal->FvInstance;
>  
>    mFvbModuleGlobal->NumFv                   = 0;
>    MaxLbaSize = 0;
> @@ -1111,8 +1083,7 @@ FvbInitialize (
>      (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN)
>        PcdGet32 (PcdOvmfFlashNvStorageVariableBase);
>  
> -  FwhInstance->FvBase[FVB_PHYSICAL] = (UINTN) BaseAddress;
> -  FwhInstance->FvBase[FVB_VIRTUAL]  = (UINTN) BaseAddress;
> +  FwhInstance->FvBase = (UINTN) BaseAddress;
>  
>    CopyMem ((UINTN *) &(FwhInstance->VolumeHeader), (UINTN *) FwVolHeader,
>      FwVolHeader->HeaderLength);
> -- 
> 1.8.3.1
> 
> 
> _______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to