On 9/25/19 3:27 AM, Laszlo Ersek wrote:
> On 09/19/19 21:52, Lendacky, Thomas wrote:
>> From: Tom Lendacky <thomas.lenda...@amd.com>
>>
>> Protect the memory used by an SEV-ES guest when S3 is supported. This
>> includes the page table used to break down the 2MB page that contains
>> the GHCB so that it can be marked un-encrypted, as well as the GHCB
>> area.
>>
>> Regarding the lifecycle of the GHCB-related memory areas:
>>   PcdOvmfSecGhcbPageTableBase
>>   PcdOvmfSecGhcbBase
>>
>> (a) when and how it is initialized after first boot of the VM
>>
>>   If SEV-ES is enabled, the GHCB-related areas are initialized during
>>   the SEC phase [OvmfPkg/ResetVector/Ia32/PageTables64.asm].
>>
>> (b) how it is protected from memory allocations during DXE
>>
>>   If S3 and SEV-ES are enabled, then InitializeRamRegions()
>>   [OvmfPkg/PlatformPei/MemDetect.c] protects the range with an AcpiNVS
>>   memory allocation HOB, in PEI.
> 
> (1) Please keep (and update, as needed) the paragraph about the "S3
> disabled" case. The matching part of the whitepaper says, in (1b),
> 
> """
> If S3 was disabled, then this range is not protected. DXE's own page
> tables are first built while still in PEI (see HandOffToDxeCore()
> [MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c]). Those tables are
> located in permanent PEI memory. After CR3 is switched over to them
> (which occurs before jumping to the DXE core entry point), we don't have
> to preserve the initial tables.
> """
> 
> I guess we don't have to be as verbose as this. But, in case we're going
> to build a new GHCB for the DXE phase, and therefore we can simply
> forget about the early GHCB structures (with S3 disabled), we should
> mention that briefly.
> 

Ok, will do.  Not sure how I missed including the second paragraph under
"b".

>>
>> (c) how it is protected from the OS
>>
>>   If S3 is enabled, then (1b) reserves it from the OS too.
> 
> (2) s/1b/b/

Yup, I'll fix it here and in the other locations identified.

Thanks,
Tom

> 
>>
>>   If S3 is disabled, then the range needs no protection.
> 
> Right, so this seems to be consistent with what I'm requesting under (1).
> 
>>
>> (d) how it is accessed on the S3 resume path
>>
>>   It is rewritten same as in (1a), which is fine because (1b) reserved it.
> 
> (3) s/1a/a/; s/1b/b/
> 
> (Also, the original refers to (1c) rather than (1b), and that's not a
> typo; but this variant looks just as fine.)
> 
>>
>> (e) how it is accessed on the warm reset path
>>
>>   It is rewritten same as in (1a).
> 
> (4) s/1a/a/
> 
>>
>> Cc: Jordan Justen <jordan.l.jus...@intel.com>
>> Cc: Laszlo Ersek <ler...@redhat.com>
>> Cc: Ard Biesheuvel <ard.biesheu...@linaro.org>
>> Cc: Anthony Perard <anthony.per...@citrix.com>
>> Cc: Julien Grall <julien.gr...@arm.com>
>> Signed-off-by: Tom Lendacky <thomas.lenda...@amd.com>
>> ---
>>  OvmfPkg/PlatformPei/PlatformPei.inf |  4 ++++
>>  OvmfPkg/PlatformPei/MemDetect.c     | 23 +++++++++++++++++++++++
>>  2 files changed, 27 insertions(+)
>>
>> diff --git a/OvmfPkg/PlatformPei/PlatformPei.inf 
>> b/OvmfPkg/PlatformPei/PlatformPei.inf
>> index 2736347a2e03..a9e424a6012a 100644
>> --- a/OvmfPkg/PlatformPei/PlatformPei.inf
>> +++ b/OvmfPkg/PlatformPei/PlatformPei.inf
>> @@ -84,6 +84,10 @@ [Pcd]
>>    gUefiOvmfPkgTokenSpaceGuid.PcdPciMmio64Size
>>    gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDecompressionScratchEnd
>>    gUefiOvmfPkgTokenSpaceGuid.PcdQ35TsegMbytes
>> +  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbPageTableBase
>> +  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbPageTableSize
>> +  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbBase
>> +  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecGhcbSize
>>    gEfiMdePkgTokenSpaceGuid.PcdGuidedExtractHandlerTableAddress
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
> 
> (5) Can you please keep these additions close to
> PcdOvmfSecPageTablesBase / PcdOvmfSecPageTablesSize?
> 
>> diff --git a/OvmfPkg/PlatformPei/MemDetect.c 
>> b/OvmfPkg/PlatformPei/MemDetect.c
>> index d451989f31c9..cd2e3abb7c9b 100644
>> --- a/OvmfPkg/PlatformPei/MemDetect.c
>> +++ b/OvmfPkg/PlatformPei/MemDetect.c
>> @@ -32,6 +32,7 @@ Module Name:
>>  #include <Library/ResourcePublicationLib.h>
>>  #include <Library/MtrrLib.h>
>>  #include <Library/QemuFwCfgLib.h>
>> +#include <Library/MemEncryptSevLib.h>
>>  
>>  #include "Platform.h"
>>  #include "Cmos.h"
>> @@ -805,6 +806,28 @@ InitializeRamRegions (
>>        (UINT64)(UINTN) PcdGet32 (PcdOvmfSecPageTablesSize),
>>        EfiACPIMemoryNVS
>>        );
>> +
>> +    if (MemEncryptSevEsIsEnabled ()) {
>> +      //
>> +      // If SEV-ES is active, reserve the GHCB-related memory area. This
>> +      // includes the extra page table used to break down the 2MB page
>> +      // mapping into 4KB page entries where the GHCB resides and the
>> +      // GHCB area itself.
>> +      //
>> +      // Since this memory range will be used by the Reset Vector on S3
>> +      // resume, it must be reserved as ACPI NVS.
>> +      //
>> +      BuildMemoryAllocationHob (
>> +        (EFI_PHYSICAL_ADDRESS)(UINTN) PcdGet32 
>> (PcdOvmfSecGhcbPageTableBase),
>> +        (UINT64)(UINTN) PcdGet32 (PcdOvmfSecGhcbPageTableSize),
>> +        EfiACPIMemoryNVS
>> +        );
>> +      BuildMemoryAllocationHob (
>> +        (EFI_PHYSICAL_ADDRESS)(UINTN) PcdGet32 (PcdOvmfSecGhcbBase),
>> +        (UINT64)(UINTN) PcdGet32 (PcdOvmfSecGhcbSize),
>> +        EfiACPIMemoryNVS
>> +        );
>> +    }
>>  #endif
>>    }
>>  
>>
> 
> With the requested updates:
> 
> Reviewed-by: Laszlo Ersek <ler...@redhat.com>
> 
> Thanks!
> Laszlo
> 

-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#48043): https://edk2.groups.io/g/devel/message/48043
Mute This Topic: https://groups.io/mt/34203542/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to