Patches 7 & 8 Reviewed-by: Jordan Justen <jordan.l.jus...@intel.com>

On 2015-07-24 16:00:14, Laszlo Ersek wrote:
> PlatformPei calls GetSystemMemorySizeBelow4gb() in three locations:
> 
> - PublishPeiMemory(): on normal boot, the permanent PEI RAM is installed
>   so that it ends with the RAM below 4GB,
> 
> - QemuInitializeRam(): on normal boot, memory resource descriptor HOBs are
>   created for the RAM below 4GB; plus MTRR attributes are set
>   (independently of S3 vs. normal boot)
> 
> - MemMapInitialization(): an MMIO resource descriptor HOB is created for
>   PCI resource allocation, on normal boot, starting at max(RAM below 4GB,
>   2GB).
> 
> The first two of these is adjusted for the configured TSEG size, if
> PcdSmmSmramRequire is set:
> 
> - In PublishPeiMemory(), the permanent PEI RAM is kept under TSEG.
> 
> - In QemuInitializeRam(), we must keep the DXE out of TSEG.
> 
>   One idea would be to simply trim the [1MB .. LowerMemorySize] memory
>   resource descriptor HOB, leaving a hole for TSEG in the memory space
>   map.
> 
>   The SMM IPL will however want to massage the caching attributes of the
>   SMRAM range that it loads the SMM core into, with
>   gDS->SetMemorySpaceAttributes(), and that won't work on a hole. So,
>   instead of trimming this range, split the TSEG area off, and report it
>   as a cacheable reserved memory resource.
> 
>   Finally, since reserved memory can be allocated too, pre-allocate TSEG
>   in InitializeRamRegions(), after QemuInitializeRam() returns. (Note that
>   this step alone does not suffice without the resource descriptor HOB
>   trickery: if we omit that, then the DXE IPL PEIM fails to load and start
>   the DXE core.)
> 
> - In MemMapInitialization(), the start of the PCI MMIO range is not
>   affected.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Laszlo Ersek <ler...@redhat.com>
> ---
>  OvmfPkg/PlatformPei/PlatformPei.inf |  1 +
>  OvmfPkg/PlatformPei/MemDetect.c     | 34 +++++++++++++++++++-
>  OvmfPkg/OvmfPkg.dec                 |  7 ++++
>  3 files changed, 41 insertions(+), 1 deletion(-)
> 
> diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf 
> b/OvmfPkg/PlatformPei/PlatformPei.inf
> index b9b0b20..0bf4c38 100644
> --- a/OvmfPkg/PlatformPei/PlatformPei.inf
> +++ b/OvmfPkg/PlatformPei/PlatformPei.inf
> @@ -76,6 +76,7 @@ [Pcd]
>    gUefiOvmfPkgTokenSpaceGuid.PcdGuidedExtractHandlerTableSize
>    gUefiOvmfPkgTokenSpaceGuid.PcdOvmfHostBridgePciDevId
>    gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDecomprScratchEnd
> +  gUefiOvmfPkgTokenSpaceGuid.PcdQ35TsegMbytes
>    gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdS3AcpiReservedMemorySize
>    gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress
>    gEfiMdeModulePkgTokenSpaceGuid.PcdVariableStoreSize
> diff --git a/OvmfPkg/PlatformPei/MemDetect.c b/OvmfPkg/PlatformPei/MemDetect.c
> index 649b484..cb3f3dd 100644
> --- a/OvmfPkg/PlatformPei/MemDetect.c
> +++ b/OvmfPkg/PlatformPei/MemDetect.c
> @@ -214,6 +214,12 @@ PublishPeiMemory (
>      MemorySize = PcdGet32 (PcdS3AcpiReservedMemorySize);
>    } else {
>      LowerMemorySize = GetSystemMemorySizeBelow4gb ();
> +    if (FeaturePcdGet (PcdSmmSmramRequire)) {
> +      //
> +      // TSEG is chipped from the end of low RAM
> +      //
> +      LowerMemorySize -= FixedPcdGet8 (PcdQ35TsegMbytes) * SIZE_1MB;
> +    }
>  
>      PeiMemoryCap = GetPeiMemoryCap ();
>      DEBUG ((EFI_D_INFO, "%a: mPhysMemAddressWidth=%d PeiMemoryCap=%u KB\n",
> @@ -277,7 +283,18 @@ QemuInitializeRam (
>      // Create memory HOBs
>      //
>      AddMemoryRangeHob (0, BASE_512KB + BASE_128KB);
> -    AddMemoryRangeHob (BASE_1MB, LowerMemorySize);
> +
> +    if (FeaturePcdGet (PcdSmmSmramRequire)) {
> +      UINT32 TsegSize;
> +
> +      TsegSize = FixedPcdGet8 (PcdQ35TsegMbytes) * SIZE_1MB;
> +      AddMemoryRangeHob (BASE_1MB, LowerMemorySize - TsegSize);
> +      AddReservedMemoryBaseSizeHob (LowerMemorySize - TsegSize, TsegSize,
> +        TRUE);
> +    } else {
> +      AddMemoryRangeHob (BASE_1MB, LowerMemorySize);
> +    }
> +
>      if (UpperMemorySize != 0) {
>        AddUntestedMemoryBaseSizeHob (BASE_4GB, UpperMemorySize);
>      }
> @@ -409,5 +426,20 @@ InitializeRamRegions (
>        (UINT64)(UINTN) PcdGet32 (PcdOvmfLockBoxStorageSize),
>        mS3Supported ? EfiACPIMemoryNVS : EfiBootServicesData
>        );
> +
> +    if (FeaturePcdGet (PcdSmmSmramRequire)) {
> +      UINT32 TsegSize;
> +
> +      //
> +      // Make sure the TSEG area that we reported as a reserved memory 
> resource
> +      // cannot be used for reserved memory allocations.
> +      //
> +      TsegSize = FixedPcdGet8 (PcdQ35TsegMbytes) * SIZE_1MB;
> +      BuildMemoryAllocationHob (
> +        GetSystemMemorySizeBelow4gb() - TsegSize,
> +        TsegSize,
> +        EfiReservedMemoryType
> +        );
> +    }
>    }
>  }
> diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec
> index f9422f0..6d6d6c4 100644
> --- a/OvmfPkg/OvmfPkg.dec
> +++ b/OvmfPkg/OvmfPkg.dec
> @@ -93,6 +93,13 @@ [PcdsFixedAtBuild]
>    gUefiOvmfPkgTokenSpaceGuid.PcdVirtioScsiMaxTargetLimit|31|UINT16|6
>    gUefiOvmfPkgTokenSpaceGuid.PcdVirtioScsiMaxLunLimit|7|UINT32|7
>  
> +  ## The following setting controls how many megabytes we configure as TSEG 
> on
> +  #  Q35, for SMRAM purposes. Permitted values are: 1, 2, 8. Other values 
> cause
> +  #  undefined behavior.
> +  #
> +  #  This PCD is only consulted if PcdSmmSmramRequire is TRUE (see below).
> +  gUefiOvmfPkgTokenSpaceGuid.PcdQ35TsegMbytes|1|UINT8|0x20
> +
>  [PcdsFixedAtBuild]
>    gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogBase|0x0|UINT32|0x8
>    gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogSize|0x0|UINT32|0x9
> -- 
> 1.8.3.1
> 
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to