On 02/19/16 09:53, Ard Biesheuvel wrote:
> On 19 February 2016 at 09:45, Yao, Jiewen <jiewen....@intel.com> 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
Laszlo

> 
> 
>> -----Original Message-----
>> From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org]
>> Sent: Friday, February 19, 2016 4:03 AM
>> To: edk2-devel@lists.01.org; Tian, Feng; Zeng, Star; 
>> leif.lindh...@linaro.org; graeme.greg...@linaro.org; ler...@redhat.com; Fan, 
>> Jeff; Yao, Jiewen
>> Cc: mark.rutl...@arm.com; Gao, Liming; samer.el-haj-mahm...@hpe.com; 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 <ard.biesheu...@linaro.org>
>> ---
>>  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
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to