On 19 February 2016 at 10:56, Laszlo Ersek <[email protected]> wrote:
> On 02/19/16 09:53, Ard Biesheuvel wrote:
>> On 19 February 2016 at 09:45, Yao, Jiewen <[email protected]> wrote:
>>> I can explain the reason on allocating <4G. It is because this data will be 
>>> used in PEI phase in S3 resume.
>>>
>>> On most X86 platform, PEI phase is 32bit, and DXE phase is 32bit or 64bit. 
>>> So we have to limit the allocation <4G.
>>>
>>
>> OK, got it.
>>
>>> Using ACPI version PCD looks strange here. Maybe another PCD, like 
>>> PcdDxeIplSwitchToLongMode?
>>>
>>
>> But that does not tell us if we are running a 32-bit PEI, right? It
>> only tells us if a 32-bit PEI should load a 32-bit DXE core on a
>> 64-bit capable machine.
>
> 32->32 and 64->64 builds have PcdDxeIplSwitchToLongMode set to FALSE.
>
> Only 32->64 builds have PcdDxeIplSwitchToLongMode set to TRUE.
>
> (This is what we have in the three DSC files of OVMF.)
>
> So, in order to see in DXE if your PEI is 32-bit, you can do:
>
>   BOOLEAN PeiIs32Bit;
>
>   PeiIs32Bit = FALSE;
>   if (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>     //
>     // this implies a 32->64 switch
>     //
>     PeiIs32Bit = TRUE;
>   } else {
>     //
>     // otherwise, PEI and DXE have the same bitness,
>     // so derive it from DXE's bitness
>     //
> #if defined (MDE_CPU_IA32) || defined (MDE_CPU_ARM)
>     PeiIs32Bit = TRUE;
> #endif
>   }
>
> Alternatively:
>
>   PeiIs32Bit = FeaturePcdGet (PcdDxeIplSwitchToLongMode) ||
>                sizeof (UINTN) == sizeof (UINT32);
>
> I'll admit I'm not really sure about EBC. The above mostly treats EBC as
> nonexistent. :)
>

Thanks for clarifying.

So the only case where we have to take care to allocate below 4 GB is
the 32->64 case, since in all other cases, the memory allocated in DXE
will always be addressable in PEI.

So I will take Jiewen's suggestion, and only limit the memory
allocation if PcdDxeIplSwitchToLongMode is TRUE. But I will still need
the MDE_CPU_X64 ifdef, since PcdDxeIplSwitchToLongMode is only defined
for IA32 and X64, and since it defaults to TRUE, defining it for other
archs would mean we have to change the default value as well.

Alternatively, I could propose this:

[PcdsFeatureFlag.IA32, PcdsFeatureFlag.X64]
  
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|TRUE|BOOLEAN|0x0001003b

[PcdsFeatureFlag.ARM, PcdsFeatureFlag.AARCH64, PcdsFeatureFlag.IPF]
 
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|FALSE|BOOLEAN|0x0001003b

and only test the PCD, but I don't think that is an improvement.

-- 
Ard.





>>
>>> -----Original Message-----
>>> From: Ard Biesheuvel [mailto:[email protected]]
>>> Sent: Friday, February 19, 2016 4:03 AM
>>> To: [email protected]; Tian, Feng; Zeng, Star; 
>>> [email protected]; [email protected]; [email protected]; 
>>> Fan, Jeff; Yao, Jiewen
>>> Cc: [email protected]; Gao, Liming; [email protected]; Ard 
>>> Biesheuvel
>>> Subject: [PATCH v2 2/3] IntelFrameworkModulePkg: BdsDxe: only allocate 
>>> below 4 GB on ACPI 1.0
>>>
>>> It is not entirely clear from the code why, but the reserved region for 
>>> storing performance data is allocated below 4 GB, and the variable to hold 
>>> the address of the allocation is called 'AcpiLowMemoryBase'
>>> (which is the only mention of ACPI in the entire file).
>>>
>>> Let's make this allocation dependent on PcdAcpiExposedTableVersions as 
>>> well, since systems that can deal with ACPI table in high memory are also 
>>> just as likely to be able to deal with performance data in high memory. 
>>> This prevents memory fragmentation on systems that don't care about the 4 
>>> GB limit.
>>>
>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>> Signed-off-by: Ard Biesheuvel <[email protected]>
>>> ---
>>>  IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf |  1 +  
>>> IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c | 11 ++++++++++-
>>>  2 files changed, 11 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf 
>>> b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
>>> index 6afb8a09df9c..38172780fb49 100644
>>> --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
>>> +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsDxe.inf
>>> @@ -215,6 +215,7 @@ [Pcd]
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoHorizontalResolution         
>>>    ## CONSUMES
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetupVideoVerticalResolution           
>>>    ## CONSUMES
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdErrorCodeSetVariable                   
>>>    ## CONSUMES
>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions               
>>>    ## CONSUMES
>>>
>>>  [Depex]
>>>    TRUE
>>> diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c 
>>> b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c
>>> index ae7ad2153c51..bf5bd6524a90 100644
>>> --- a/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c
>>> +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/BdsEntry.c
>>> @@ -22,6 +22,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER 
>>> EXPRESS OR IMPLIED.
>>>  #include "Hotkey.h"
>>>  #include "HwErrRecSupport.h"
>>>
>>> +#include <Protocol/AcpiSystemDescriptionTable.h>
>>> +
>>>  ///
>>>  /// BDS arch protocol instance initial value.
>>>  ///
>>> @@ -474,14 +476,21 @@ BdsAllocateMemoryForPerformanceData (
>>>    EFI_STATUS                    Status;
>>>    EFI_PHYSICAL_ADDRESS          AcpiLowMemoryBase;
>>>    EDKII_VARIABLE_LOCK_PROTOCOL  *VariableLock;
>>> +  EFI_ALLOCATE_TYPE             AcpiTableAllocType;
>>>
>>>    AcpiLowMemoryBase = 0x0FFFFFFFFULL;
>>>
>>> +  if ((PcdGet32 (PcdAcpiExposedTableVersions) & 
>>> EFI_ACPI_TABLE_VERSION_1_0B) != 0) {
>>> +    AcpiTableAllocType = AllocateMaxAddress;  } else {
>>> +    AcpiTableAllocType = AllocateAnyPages;  }
>>> +
>>>    //
>>>    // Allocate a block of memory that will contain performance data to OS.
>>>    //
>>>    Status = gBS->AllocatePages (
>>> -                  AllocateMaxAddress,
>>> +                  AcpiTableAllocType,
>>>                    EfiReservedMemoryType,
>>>                    EFI_SIZE_TO_PAGES (PERF_DATA_MAX_LENGTH),
>>>                    &AcpiLowMemoryBase
>>> --
>>> 2.5.0
>>>
>
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to