[edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

Leo Duran posted 1 patch 7 years, 8 months ago
Failed in applying to current master (apply log)
MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--------
MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
3 files changed, 22 insertions(+), 9 deletions(-)
[edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Leo Duran 7 years, 8 months ago
From: Brijesh Singh <brijesh.singh@amd.com>

This dynamic PCD holds the address mask for page table entries when memory
encryption is enabled on AMD processors supporting the Secure Encrypted
Virtualization (SEV) feature.

Cc: Feng Tian <feng.tian@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Leo Duran <leo.duran@amd.com>
---
 MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
 MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--------
 MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
 3 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
index 2bc41be..d62bd9b 100644
--- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
+++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
@@ -6,6 +6,8 @@
 #  needed to run the DXE Foundation.
 #
 #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
+#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
+#
 #  This program and the accompanying materials
 #  are licensed and made available under the terms and conditions of the BSD License
 #  which accompanies this distribution.  The full text of the license may be found at
@@ -111,7 +113,8 @@ [FeaturePcd]
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ## CONSUMES
 
 [Pcd.IA32,Pcd.X64]
-  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ## SOMETIMES_CONSUMES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ## SOMETIMES_CONSUMES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask    ## CONSUMES
 
 [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
   gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ## SOMETIMES_CONSUMES
diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
index 790f6ab..2c52389 100644
--- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
+++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
@@ -16,6 +16,8 @@
     3) IA-32 Intel(R) Architecture Software Developer's Manual Volume 3:System Programmer's Guide, Intel
 
 Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
+
 This program and the accompanying materials
 are licensed and made available under the terms and conditions of the BSD License
 which accompanies this distribution.  The full text of the license may be found at
@@ -71,14 +73,14 @@ Split2MPageTo4K (
   //
   // Fill in 2M page entry.
   //
-  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P | IA32_PG_RW;
+  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
 
   PhysicalAddress4K = PhysicalAddress;
   for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512; IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K += SIZE_4KB) {
     //
     // Fill in the Page Table entries
     //
-    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
+    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
     PageTableEntry->Bits.ReadWrite = 1;
     PageTableEntry->Bits.Present = 1;
     if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase + StackSize)) {
@@ -116,7 +118,7 @@ Split1GPageTo2M (
   //
   // Fill in 1G page entry.
   //
-  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P | IA32_PG_RW;
+  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
 
   PhysicalAddress2M = PhysicalAddress;
   for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512; IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M += SIZE_2MB) {
@@ -129,7 +131,7 @@ Split1GPageTo2M (
       //
       // Fill in the Page Directory entries
       //
-      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
+      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
       PageDirectoryEntry->Bits.ReadWrite = 1;
       PageDirectoryEntry->Bits.Present = 1;
       PageDirectoryEntry->Bits.MustBe1 = 1;
@@ -248,7 +250,7 @@ CreateIdentityMappingPageTables (
     //
     // Make a PML4 Entry
     //
-    PageMapLevel4Entry->Uint64 = (UINT64)(UINTN)PageDirectoryPointerEntry;
+    PageMapLevel4Entry->Uint64 = (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
     PageMapLevel4Entry->Bits.ReadWrite = 1;
     PageMapLevel4Entry->Bits.Present = 1;
 
@@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
           //
           // Fill in the Page Directory entries
           //
-          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
+          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
           PageDirectory1GEntry->Bits.ReadWrite = 1;
           PageDirectory1GEntry->Bits.Present = 1;
           PageDirectory1GEntry->Bits.MustBe1 = 1;
@@ -280,7 +282,7 @@ CreateIdentityMappingPageTables (
         //
         // Fill in a Page Directory Pointer Entries
         //
-        PageDirectoryPointerEntry->Uint64 = (UINT64)(UINTN)PageDirectoryEntry;
+        PageDirectoryPointerEntry->Uint64 = (UINT64)(UINTN)PageDirectoryEntry | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
         PageDirectoryPointerEntry->Bits.ReadWrite = 1;
         PageDirectoryPointerEntry->Bits.Present = 1;
 
@@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
             //
             // Fill in the Page Directory entries
             //
-            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
+            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
             PageDirectoryEntry->Bits.ReadWrite = 1;
             PageDirectoryEntry->Bits.Present = 1;
             PageDirectoryEntry->Bits.MustBe1 = 1;
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index 273cd7e..207384f 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -6,6 +6,8 @@
 # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
 # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
 # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
+# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
+#
 # This program and the accompanying materials are licensed and made available under
 # the terms and conditions of the BSD License that accompanies this distribution.
 # The full text of the license may be found at
@@ -1738,5 +1740,11 @@ [PcdsDynamic, PcdsDynamicEx]
   # @Prompt If there is any test key used by the platform.
   gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x00030003
 
+  ## This dynamic PCD holds the address mask for page table entries when memory encryption is
+  #  enabled on AMD processors supporting the Secure Encrypted Virtualization (SEV) feature.
+  #  This mask should be applied when creating 1:1 virtual to physical mapping tables.
+  #
+  gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask|0x0|UINT64|0x00030004
+
 [UserExtensions.TianoCore."ExtraFiles"]
   MdeModulePkgExtra.uni
-- 
1.9.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Zeng, Star 7 years, 8 months ago
Does Create4GPageTablesIa32Pae() also need to be updated?

Thanks,
Star
-----Original Message-----
From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Leo Duran
Sent: Wednesday, February 8, 2017 3:54 AM
To: edk2-devel@ml01.01.org
Cc: Laszlo Ersek <lersek@redhat.com>; Tian, Feng <feng.tian@intel.com>; Brijesh Singh <brijesh.singh@amd.com>; Zeng, Star <star.zeng@intel.com>; Leo Duran <leo.duran@amd.com>
Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

From: Brijesh Singh <brijesh.singh@amd.com>

This dynamic PCD holds the address mask for page table entries when memory encryption is enabled on AMD processors supporting the Secure Encrypted Virtualization (SEV) feature.

Cc: Feng Tian <feng.tian@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Leo Duran <leo.duran@amd.com>
---
 MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
 MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--------
 MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
 3 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
index 2bc41be..d62bd9b 100644
--- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
+++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
@@ -6,6 +6,8 @@
 #  needed to run the DXE Foundation.
 #
 #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
+#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
 #  This program and the accompanying materials  #  are licensed and made available under the terms and conditions of the BSD License  #  which accompanies this distribution.  The full text of the license may be found at @@ -111,7 +113,8 @@ [FeaturePcd]
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ## CONSUMES
 
 [Pcd.IA32,Pcd.X64]
-  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ## SOMETIMES_CONSUMES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ## SOMETIMES_CONSUMES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask    ## CONSUMES
 
 [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
   gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ## SOMETIMES_CONSUMES
diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
index 790f6ab..2c52389 100644
--- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
+++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
@@ -16,6 +16,8 @@
     3) IA-32 Intel(R) Architecture Software Developer's Manual Volume 3:System Programmer's Guide, Intel
 
 Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
+
 This program and the accompanying materials  are licensed and made available under the terms and conditions of the BSD License  which accompanies this distribution.  The full text of the license may be found at @@ -71,14 +73,14 @@ Split2MPageTo4K (
   //
   // Fill in 2M page entry.
   //
-  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P | IA32_PG_RW;
+  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64 
+ (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
 
   PhysicalAddress4K = PhysicalAddress;
   for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512; IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K += SIZE_4KB) {
     //
     // Fill in the Page Table entries
     //
-    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
+    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64 
+ (PcdPteMemoryEncryptionAddressOrMask);
     PageTableEntry->Bits.ReadWrite = 1;
     PageTableEntry->Bits.Present = 1;
     if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase + StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
   //
   // Fill in 1G page entry.
   //
-  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P | IA32_PG_RW;
+  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64 
+ (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
 
   PhysicalAddress2M = PhysicalAddress;
   for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512; IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
       //
       // Fill in the Page Directory entries
       //
-      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
+      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M | 
+ PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
       PageDirectoryEntry->Bits.ReadWrite = 1;
       PageDirectoryEntry->Bits.Present = 1;
       PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@ CreateIdentityMappingPageTables (
     //
     // Make a PML4 Entry
     //
-    PageMapLevel4Entry->Uint64 = (UINT64)(UINTN)PageDirectoryPointerEntry;
+    PageMapLevel4Entry->Uint64 = 
+ (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64 
+ (PcdPteMemoryEncryptionAddressOrMask);
     PageMapLevel4Entry->Bits.ReadWrite = 1;
     PageMapLevel4Entry->Bits.Present = 1;
 
@@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
           //
           // Fill in the Page Directory entries
           //
-          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
+          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64 
+ (PcdPteMemoryEncryptionAddressOrMask);
           PageDirectory1GEntry->Bits.ReadWrite = 1;
           PageDirectory1GEntry->Bits.Present = 1;
           PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 @@ CreateIdentityMappingPageTables (
         //
         // Fill in a Page Directory Pointer Entries
         //
-        PageDirectoryPointerEntry->Uint64 = (UINT64)(UINTN)PageDirectoryEntry;
+        PageDirectoryPointerEntry->Uint64 = 
+ (UINT64)(UINTN)PageDirectoryEntry | PcdGet64 
+ (PcdPteMemoryEncryptionAddressOrMask);
         PageDirectoryPointerEntry->Bits.ReadWrite = 1;
         PageDirectoryPointerEntry->Bits.Present = 1;
 
@@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
             //
             // Fill in the Page Directory entries
             //
-            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
+            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64 
+ (PcdPteMemoryEncryptionAddressOrMask);
             PageDirectoryEntry->Bits.ReadWrite = 1;
             PageDirectoryEntry->Bits.Present = 1;
             PageDirectoryEntry->Bits.MustBe1 = 1; diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -6,6 +6,8 @@
 # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>  # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>  # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
+# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
 # This program and the accompanying materials are licensed and made available under  # the terms and conditions of the BSD License that accompanies this distribution.
 # The full text of the license may be found at @@ -1738,5 +1740,11 @@ [PcdsDynamic, PcdsDynamicEx]
   # @Prompt If there is any test key used by the platform.
   gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x00030003
 
+  ## This dynamic PCD holds the address mask for page table entries 
+ when memory encryption is  #  enabled on AMD processors supporting the Secure Encrypted Virtualization (SEV) feature.
+  #  This mask should be applied when creating 1:1 virtual to physical mapping tables.
+  #
+  
+ gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask|0x0
+ |UINT64|0x00030004
+
 [UserExtensions.TianoCore."ExtraFiles"]
   MdeModulePkgExtra.uni
--
1.9.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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Duran, Leo 7 years, 8 months ago
Pease see reply below.
Leo

> -----Original Message-----
> From: Zeng, Star [mailto:star.zeng@intel.com]
> Sent: Tuesday, February 07, 2017 8:27 PM
> To: Duran, Leo <leo.duran@amd.com>; edk2-devel@ml01.01.org
> Cc: Laszlo Ersek <lersek@redhat.com>; Tian, Feng <feng.tian@intel.com>;
> Singh, Brijesh <brijesh.singh@amd.com>; Zeng, Star <star.zeng@intel.com>;
> Yao, Jiewen <jiewen.yao@intel.com>
> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
> 
> Does Create4GPageTablesIa32Pae() also need to be updated?
> 
> Thanks,
> Star
[Duran, Leo] 
Hi Star,
No, I do not think Create4GPageTablesIa32Pae() is in the execution path.

The SEV feature requires 64-bit LongMode, so the PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time,
in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Leo Duran
> Sent: Wednesday, February 8, 2017 3:54 AM
> To: edk2-devel@ml01.01.org
> Cc: Laszlo Ersek <lersek@redhat.com>; Tian, Feng <feng.tian@intel.com>;
> Brijesh Singh <brijesh.singh@amd.com>; Zeng, Star <star.zeng@intel.com>;
> Leo Duran <leo.duran@amd.com>
> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
> 
> From: Brijesh Singh <brijesh.singh@amd.com>
> 
> This dynamic PCD holds the address mask for page table entries when
> memory encryption is enabled on AMD processors supporting the Secure
> Encrypted Virtualization (SEV) feature.
> 
> Cc: Feng Tian <feng.tian@intel.com>
> Cc: Star Zeng <star.zeng@intel.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Leo Duran <leo.duran@amd.com>
> ---
>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
> ------
>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>  3 files changed, 22 insertions(+), 9 deletions(-)
> 
> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> index 2bc41be..d62bd9b 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> @@ -6,6 +6,8 @@
>  #  needed to run the DXE Foundation.
>  #
>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>  #  This program and the accompanying materials  #  are licensed and made
> available under the terms and conditions of the BSD License  #  which
> accompanies this distribution.  The full text of the license may be found at
> @@ -111,7 +113,8 @@ [FeaturePcd]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
> CONSUMES
> 
>  [Pcd.IA32,Pcd.X64]
> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
> SOMETIMES_CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
> SOMETIMES_CONSUMES
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask    ## CONSUMES
> 
>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
> SOMETIMES_CONSUMES
> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> index 790f6ab..2c52389 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> @@ -16,6 +16,8 @@
>      3) IA-32 Intel(R) Architecture Software Developer's Manual Volume
> 3:System Programmer's Guide, Intel
> 
>  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> +
>  This program and the accompanying materials  are licensed and made
> available under the terms and conditions of the BSD License  which
> accompanies this distribution.  The full text of the license may be found at
> @@ -71,14 +73,14 @@ Split2MPageTo4K (
>    //
>    // Fill in 2M page entry.
>    //
> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
> IA32_PG_RW;
> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
> 
>    PhysicalAddress4K = PhysicalAddress;
>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
> SIZE_4KB) {
>      //
>      // Fill in the Page Table entries
>      //
> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>      PageTableEntry->Bits.ReadWrite = 1;
>      PageTableEntry->Bits.Present = 1;
>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase +
> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>    //
>    // Fill in 1G page entry.
>    //
> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
> IA32_PG_RW;
> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
> 
>    PhysicalAddress2M = PhysicalAddress;
>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512;
> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M
> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>        //
>        // Fill in the Page Directory entries
>        //
> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>        PageDirectoryEntry->Bits.ReadWrite = 1;
>        PageDirectoryEntry->Bits.Present = 1;
>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
> CreateIdentityMappingPageTables (
>      //
>      // Make a PML4 Entry
>      //
> -    PageMapLevel4Entry->Uint64 =
> (UINT64)(UINTN)PageDirectoryPointerEntry;
> +    PageMapLevel4Entry->Uint64 =
> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>      PageMapLevel4Entry->Bits.Present = 1;
> 
> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>            //
>            // Fill in the Page Directory entries
>            //
> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>            PageDirectory1GEntry->Bits.Present = 1;
>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 @@
> CreateIdentityMappingPageTables (
>          //
>          // Fill in a Page Directory Pointer Entries
>          //
> -        PageDirectoryPointerEntry->Uint64 =
> (UINT64)(UINTN)PageDirectoryEntry;
> +        PageDirectoryPointerEntry->Uint64 =
> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>          PageDirectoryPointerEntry->Bits.Present = 1;
> 
> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>              //
>              // Fill in the Page Directory entries
>              //
> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>              PageDirectoryEntry->Bits.ReadWrite = 1;
>              PageDirectoryEntry->Bits.Present = 1;
>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
> a/MdeModulePkg/MdeModulePkg.dec
> b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -6,6 +6,8 @@
>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>  #
> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>  # (C) Copyright 2016
> Hewlett Packard Enterprise Development LP<BR>
> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>  # This program and the accompanying materials are licensed and made
> available under  # the terms and conditions of the BSD License that
> accompanies this distribution.
>  # The full text of the license may be found at @@ -1738,5 +1740,11 @@
> [PcdsDynamic, PcdsDynamicEx]
>    # @Prompt If there is any test key used by the platform.
> 
> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
> 0030003
> 
> +  ## This dynamic PCD holds the address mask for page table entries
> + when memory encryption is  #  enabled on AMD processors supporting the
> Secure Encrypted Virtualization (SEV) feature.
> +  #  This mask should be applied when creating 1:1 virtual to physical
> mapping tables.
> +  #
> +
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask|0x0
> + |UINT64|0x00030004
> +
>  [UserExtensions.TianoCore."ExtraFiles"]
>    MdeModulePkgExtra.uni
> --
> 1.9.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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Yao, Jiewen 7 years, 8 months ago
HI Leo
Thanks to clarify that.

If that is the case, do you think it will be better to limit this PCD to X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]

Thank you
Yao Jiewen

From: Duran, Leo [mailto:leo.duran@amd.com]
Sent: Wednesday, February 8, 2017 9:00 AM
To: Zeng, Star <star.zeng@intel.com>; edk2-devel@ml01.01.org
Cc: Laszlo Ersek <lersek@redhat.com>; Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Yao, Jiewen <jiewen.yao@intel.com>
Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

Pease see reply below.
Leo

> -----Original Message-----
> From: Zeng, Star [mailto:star.zeng@intel.com]
> Sent: Tuesday, February 07, 2017 8:27 PM
> To: Duran, Leo <leo.duran@amd.com<mailto:leo.duran@amd.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>;
> Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>;
> Yao, Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com>>
> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
> Does Create4GPageTablesIa32Pae() also need to be updated?
>
> Thanks,
> Star
[Duran, Leo]
Hi Star,
No, I do not think Create4GPageTablesIa32Pae() is in the execution path.

The SEV feature requires 64-bit LongMode, so the PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time,
in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Leo Duran
> Sent: Wednesday, February 8, 2017 3:54 AM
> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>;
> Brijesh Singh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>;
> Leo Duran <leo.duran@amd.com<mailto:leo.duran@amd.com>>
> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
> From: Brijesh Singh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>
>
> This dynamic PCD holds the address mask for page table entries when
> memory encryption is enabled on AMD processors supporting the Secure
> Encrypted Virtualization (SEV) feature.
>
> Cc: Feng Tian <feng.tian@intel.com<mailto:feng.tian@intel.com>>
> Cc: Star Zeng <star.zeng@intel.com<mailto:star.zeng@intel.com>>
> Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Leo Duran <leo.duran@amd.com<mailto:leo.duran@amd.com>>
> ---
>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
> ------
>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>  3 files changed, 22 insertions(+), 9 deletions(-)
>
> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> index 2bc41be..d62bd9b 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> @@ -6,6 +6,8 @@
>  #  needed to run the DXE Foundation.
>  #
>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>  #  This program and the accompanying materials  #  are licensed and made
> available under the terms and conditions of the BSD License  #  which
> accompanies this distribution.  The full text of the license may be found at
> @@ -111,7 +113,8 @@ [FeaturePcd]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
> CONSUMES
>
>  [Pcd.IA32,Pcd.X64]
> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
> SOMETIMES_CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
> SOMETIMES_CONSUMES
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask    ## CONSUMES
>
>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
> SOMETIMES_CONSUMES
> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> index 790f6ab..2c52389 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> @@ -16,6 +16,8 @@
>      3) IA-32 Intel(R) Architecture Software Developer's Manual Volume
> 3:System Programmer's Guide, Intel
>
>  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> +
>  This program and the accompanying materials  are licensed and made
> available under the terms and conditions of the BSD License  which
> accompanies this distribution.  The full text of the license may be found at
> @@ -71,14 +73,14 @@ Split2MPageTo4K (
>    //
>    // Fill in 2M page entry.
>    //
> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
> IA32_PG_RW;
> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>
>    PhysicalAddress4K = PhysicalAddress;
>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
> SIZE_4KB) {
>      //
>      // Fill in the Page Table entries
>      //
> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>      PageTableEntry->Bits.ReadWrite = 1;
>      PageTableEntry->Bits.Present = 1;
>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase +
> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>    //
>    // Fill in 1G page entry.
>    //
> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
> IA32_PG_RW;
> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>
>    PhysicalAddress2M = PhysicalAddress;
>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512;
> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M
> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>        //
>        // Fill in the Page Directory entries
>        //
> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>        PageDirectoryEntry->Bits.ReadWrite = 1;
>        PageDirectoryEntry->Bits.Present = 1;
>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
> CreateIdentityMappingPageTables (
>      //
>      // Make a PML4 Entry
>      //
> -    PageMapLevel4Entry->Uint64 =
> (UINT64)(UINTN)PageDirectoryPointerEntry;
> +    PageMapLevel4Entry->Uint64 =
> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>      PageMapLevel4Entry->Bits.Present = 1;
>
> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>            //
>            // Fill in the Page Directory entries
>            //
> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>            PageDirectory1GEntry->Bits.Present = 1;
>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 @@
> CreateIdentityMappingPageTables (
>          //
>          // Fill in a Page Directory Pointer Entries
>          //
> -        PageDirectoryPointerEntry->Uint64 =
> (UINT64)(UINTN)PageDirectoryEntry;
> +        PageDirectoryPointerEntry->Uint64 =
> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>          PageDirectoryPointerEntry->Bits.Present = 1;
>
> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>              //
>              // Fill in the Page Directory entries
>              //
> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>              PageDirectoryEntry->Bits.ReadWrite = 1;
>              PageDirectoryEntry->Bits.Present = 1;
>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
> a/MdeModulePkg/MdeModulePkg.dec
> b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -6,6 +6,8 @@
>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>  #
> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>  # (C) Copyright 2016
> Hewlett Packard Enterprise Development LP<BR>
> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>  # This program and the accompanying materials are licensed and made
> available under  # the terms and conditions of the BSD License that
> accompanies this distribution.
>  # The full text of the license may be found at @@ -1738,5 +1740,11 @@
> [PcdsDynamic, PcdsDynamicEx]
>    # @Prompt If there is any test key used by the platform.
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
> 0030003
>
> +  ## This dynamic PCD holds the address mask for page table entries
> + when memory encryption is  #  enabled on AMD processors supporting the
> Secure Encrypted Virtualization (SEV) feature.
> +  #  This mask should be applied when creating 1:1 virtual to physical
> mapping tables.
> +  #
> +
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask|0x0
> + |UINT64|0x00030004
> +
>  [UserExtensions.TianoCore."ExtraFiles"]
>    MdeModulePkgExtra.uni
> --
> 1.9.1
>
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org<mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Laszlo Ersek 7 years, 8 months ago
On 02/08/17 18:05, Yao, Jiewen wrote:
> HI Leo
> 
> Thanks to clarify that.
> 
>  
> 
> If that is the case, do you think it will be better to limit this PCD to
> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]

Not sure if this is the best place to raise the following observation,
but it should do:

please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE if
PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
- both PEI and DXE are 32-bit, and
- both PEI and DXE are 64-bit.

This doesn't necessarily invalidate anything said thus fair in the
thread, but the following statement from Leo:

    The SEV feature requires 64-bit LongMode, so the
    PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time

does not follow. The PCD is FALSE in OvmfPkgX64.dsc.

Thanks,
Laszlo

> 
>  
> 
> Thank you
> 
> Yao Jiewen
> 
>  
> 
> *From:*Duran, Leo [mailto:leo.duran@amd.com]
> *Sent:* Wednesday, February 8, 2017 9:00 AM
> *To:* Zeng, Star <star.zeng@intel.com>; edk2-devel@ml01.01.org
> *Cc:* Laszlo Ersek <lersek@redhat.com>; Tian, Feng
> <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Yao,
> Jiewen <jiewen.yao@intel.com>
> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
> 
>  
> 
> Pease see reply below.
> Leo
> 
>> -----Original Message-----
>> From: Zeng, Star [mailto:star.zeng@intel.com]
>> Sent: Tuesday, February 07, 2017 8:27 PM
>> To: Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com>>; edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org>
>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com>>;
>> Singh, Brijesh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com>>;
>> Yao, Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com>>
>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>> 
>> Does Create4GPageTablesIa32Pae() also need to be updated?
>> 
>> Thanks,
>> Star
> [Duran, Leo] 
> Hi Star,
> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
> 
> The SEV feature requires 64-bit LongMode, so the PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time,
> in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
> 
>> -----Original Message-----
>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
>> Leo Duran
>> Sent: Wednesday, February 8, 2017 3:54 AM
>> To: edk2-devel@ml01.01.org <mailto:edk2-devel@ml01.01.org>
>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com>>;
>> Brijesh Singh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com>>;
>> Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com>>
>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>> 
>> From: Brijesh Singh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com>>
>> 
>> This dynamic PCD holds the address mask for page table entries when
>> memory encryption is enabled on AMD processors supporting the Secure
>> Encrypted Virtualization (SEV) feature.
>> 
>> Cc: Feng Tian <feng.tian@intel.com <mailto:feng.tian@intel.com>>
>> Cc: Star Zeng <star.zeng@intel.com <mailto:star.zeng@intel.com>>
>> Cc: Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com>>
>> ---
>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
>> ------
>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>  3 files changed, 22 insertions(+), 9 deletions(-)
>> 
>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> index 2bc41be..d62bd9b 100644
>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> @@ -6,6 +6,8 @@
>>  #  needed to run the DXE Foundation.
>>  #
>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>  #  This program and the accompanying materials  #  are licensed and made
>> available under the terms and conditions of the BSD License  #  which
>> accompanies this distribution.  The full text of the license may be found at
>> @@ -111,7 +113,8 @@ [FeaturePcd]
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
>> CONSUMES
>> 
>>  [Pcd.IA32,Pcd.X64]
>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>> SOMETIMES_CONSUMES
>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>> SOMETIMES_CONSUMES
>> +
>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>> ask    ## CONSUMES
>> 
>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>> SOMETIMES_CONSUMES
>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> index 790f6ab..2c52389 100644
>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> @@ -16,6 +16,8 @@
>>      3) IA-32 Intel(R) Architecture Software Developer's Manual Volume
>> 3:System Programmer's Guide, Intel
>> 
>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>> +
>>  This program and the accompanying materials  are licensed and made
>> available under the terms and conditions of the BSD License  which
>> accompanies this distribution.  The full text of the license may be found at
>> @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>    //
>>    // Fill in 2M page entry.
>>    //
>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
>> IA32_PG_RW;
>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>> 
>>    PhysicalAddress4K = PhysicalAddress;
>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>> SIZE_4KB) {
>>      //
>>      // Fill in the Page Table entries
>>      //
>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>      PageTableEntry->Bits.ReadWrite = 1;
>>      PageTableEntry->Bits.Present = 1;
>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase +
>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>    //
>>    // Fill in 1G page entry.
>>    //
>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
>> IA32_PG_RW;
>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>> 
>>    PhysicalAddress2M = PhysicalAddress;
>>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512;
>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M
>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>        //
>>        // Fill in the Page Directory entries
>>        //
>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>        PageDirectoryEntry->Bits.Present = 1;
>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
>> CreateIdentityMappingPageTables (
>>      //
>>      // Make a PML4 Entry
>>      //
>> -    PageMapLevel4Entry->Uint64 =
>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>> +    PageMapLevel4Entry->Uint64 =
>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>      PageMapLevel4Entry->Bits.Present = 1;
>> 
>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>            //
>>            // Fill in the Page Directory entries
>>            //
>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>            PageDirectory1GEntry->Bits.Present = 1;
>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 @@
>> CreateIdentityMappingPageTables (
>>          //
>>          // Fill in a Page Directory Pointer Entries
>>          //
>> -        PageDirectoryPointerEntry->Uint64 =
>> (UINT64)(UINTN)PageDirectoryEntry;
>> +        PageDirectoryPointerEntry->Uint64 =
>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>          PageDirectoryPointerEntry->Bits.Present = 1;
>> 
>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>              //
>>              // Fill in the Page Directory entries
>>              //
>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>              PageDirectoryEntry->Bits.Present = 1;
>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
>> a/MdeModulePkg/MdeModulePkg.dec
>> b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
>> --- a/MdeModulePkg/MdeModulePkg.dec
>> +++ b/MdeModulePkg/MdeModulePkg.dec
>> @@ -6,6 +6,8 @@
>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>  #
>> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>  # (C) Copyright 2016
>> Hewlett Packard Enterprise Development LP<BR>
>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>  # This program and the accompanying materials are licensed and made
>> available under  # the terms and conditions of the BSD License that
>> accompanies this distribution.
>>  # The full text of the license may be found at @@ -1738,5 +1740,11 @@
>> [PcdsDynamic, PcdsDynamicEx]
>>    # @Prompt If there is any test key used by the platform.
>> 
>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>> 0030003
>> 
>> +  ## This dynamic PCD holds the address mask for page table entries
>> + when memory encryption is  #  enabled on AMD processors supporting the
>> Secure Encrypted Virtualization (SEV) feature.
>> +  #  This mask should be applied when creating 1:1 virtual to physical
>> mapping tables.
>> +  #
>> +
>> +
>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>> ask|0x0
>> + |UINT64|0x00030004
>> +
>>  [UserExtensions.TianoCore."ExtraFiles"]
>>    MdeModulePkgExtra.uni
>> --
>> 1.9.1
>> 
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.01.org <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Yao, Jiewen 7 years, 8 months ago
Good reminder. I take back my word.

In this case, we need consume PcdPteMemoryEncryptionAddressOrMask  in IA32 mode to build X64 paging.

We need

From: Laszlo Ersek [mailto:lersek@redhat.com]
Sent: Wednesday, February 8, 2017 9:11 AM
To: Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; edk2-devel@ml01.01.org
Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

On 02/08/17 18:05, Yao, Jiewen wrote:
> HI Leo
>
> Thanks to clarify that.
>
>
>
> If that is the case, do you think it will be better to limit this PCD to
> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]

Not sure if this is the best place to raise the following observation,
but it should do:

please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE if
PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
- both PEI and DXE are 32-bit, and
- both PEI and DXE are 64-bit.

This doesn't necessarily invalidate anything said thus fair in the
thread, but the following statement from Leo:

    The SEV feature requires 64-bit LongMode, so the
    PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time

does not follow. The PCD is FALSE in OvmfPkgX64.dsc.

Thanks,
Laszlo

>
>
>
> Thank you
>
> Yao Jiewen
>
>
>
> *From:*Duran, Leo [mailto:leo.duran@amd.com]
> *Sent:* Wednesday, February 8, 2017 9:00 AM
> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Tian, Feng
> <feng.tian@intel.com<mailto:feng.tian@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Yao,
> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com>>
> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
>
>
> Pease see reply below.
> Leo
>
>> -----Original Message-----
>> From: Zeng, Star [mailto:star.zeng@intel.com]
>> Sent: Tuesday, February 07, 2017 8:27 PM
>> To: Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> <mailto:edk2-devel@ml01.01.org>
>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com>>;
>> Singh, Brijesh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>;
>> Yao, Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com>>>
>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>>
>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>
>> Thanks,
>> Star
> [Duran, Leo]
> Hi Star,
> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>
> The SEV feature requires 64-bit LongMode, so the PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time,
> in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
>
>> -----Original Message-----
>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
>> Leo Duran
>> Sent: Wednesday, February 8, 2017 3:54 AM
>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org> <mailto:edk2-devel@ml01.01.org>
>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com>>;
>> Brijesh Singh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>;
>> Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>
>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>>
>> From: Brijesh Singh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com>>>
>>
>> This dynamic PCD holds the address mask for page table entries when
>> memory encryption is enabled on AMD processors supporting the Secure
>> Encrypted Virtualization (SEV) feature.
>>
>> Cc: Feng Tian <feng.tian@intel.com <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com>>>
>> Cc: Star Zeng <star.zeng@intel.com <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com>>>
>> Cc: Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com<mailto:lersek@redhat.com %3cmailto:lersek@redhat.com>>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>
>> ---
>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
>> ------
>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>
>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> index 2bc41be..d62bd9b 100644
>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> @@ -6,6 +6,8 @@
>>  #  needed to run the DXE Foundation.
>>  #
>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>  #  This program and the accompanying materials  #  are licensed and made
>> available under the terms and conditions of the BSD License  #  which
>> accompanies this distribution.  The full text of the license may be found at
>> @@ -111,7 +113,8 @@ [FeaturePcd]
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
>> CONSUMES
>>
>>  [Pcd.IA32,Pcd.X64]
>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>> SOMETIMES_CONSUMES
>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>> SOMETIMES_CONSUMES
>> +
>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>> ask    ## CONSUMES
>>
>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>> SOMETIMES_CONSUMES
>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> index 790f6ab..2c52389 100644
>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> @@ -16,6 +16,8 @@
>>      3) IA-32 Intel(R) Architecture Software Developer's Manual Volume
>> 3:System Programmer's Guide, Intel
>>
>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>> +
>>  This program and the accompanying materials  are licensed and made
>> available under the terms and conditions of the BSD License  which
>> accompanies this distribution.  The full text of the license may be found at
>> @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>    //
>>    // Fill in 2M page entry.
>>    //
>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
>> IA32_PG_RW;
>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>
>>    PhysicalAddress4K = PhysicalAddress;
>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>> SIZE_4KB) {
>>      //
>>      // Fill in the Page Table entries
>>      //
>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>      PageTableEntry->Bits.ReadWrite = 1;
>>      PageTableEntry->Bits.Present = 1;
>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase +
>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>    //
>>    // Fill in 1G page entry.
>>    //
>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
>> IA32_PG_RW;
>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>
>>    PhysicalAddress2M = PhysicalAddress;
>>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512;
>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M
>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>        //
>>        // Fill in the Page Directory entries
>>        //
>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>        PageDirectoryEntry->Bits.Present = 1;
>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
>> CreateIdentityMappingPageTables (
>>      //
>>      // Make a PML4 Entry
>>      //
>> -    PageMapLevel4Entry->Uint64 =
>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>> +    PageMapLevel4Entry->Uint64 =
>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>      PageMapLevel4Entry->Bits.Present = 1;
>>
>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>            //
>>            // Fill in the Page Directory entries
>>            //
>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>            PageDirectory1GEntry->Bits.Present = 1;
>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 @@
>> CreateIdentityMappingPageTables (
>>          //
>>          // Fill in a Page Directory Pointer Entries
>>          //
>> -        PageDirectoryPointerEntry->Uint64 =
>> (UINT64)(UINTN)PageDirectoryEntry;
>> +        PageDirectoryPointerEntry->Uint64 =
>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>
>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>              //
>>              // Fill in the Page Directory entries
>>              //
>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>              PageDirectoryEntry->Bits.Present = 1;
>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
>> a/MdeModulePkg/MdeModulePkg.dec
>> b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
>> --- a/MdeModulePkg/MdeModulePkg.dec
>> +++ b/MdeModulePkg/MdeModulePkg.dec
>> @@ -6,6 +6,8 @@
>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>  #
>> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>  # (C) Copyright 2016
>> Hewlett Packard Enterprise Development LP<BR>
>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>  # This program and the accompanying materials are licensed and made
>> available under  # the terms and conditions of the BSD License that
>> accompanies this distribution.
>>  # The full text of the license may be found at @@ -1738,5 +1740,11 @@
>> [PcdsDynamic, PcdsDynamicEx]
>>    # @Prompt If there is any test key used by the platform.
>>
>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>> 0030003
>>
>> +  ## This dynamic PCD holds the address mask for page table entries
>> + when memory encryption is  #  enabled on AMD processors supporting the
>> Secure Encrypted Virtualization (SEV) feature.
>> +  #  This mask should be applied when creating 1:1 virtual to physical
>> mapping tables.
>> +  #
>> +
>> +
>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>> ask|0x0
>> + |UINT64|0x00030004
>> +
>>  [UserExtensions.TianoCore."ExtraFiles"]
>>    MdeModulePkgExtra.uni
>> --
>> 1.9.1
>>
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org> <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Yao, Jiewen 7 years, 8 months ago
I believe PcdDxeIplSwitchtoLongMode  == DXE is Long mode.

See DEC description:
  #  It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore
  #  is built in firmware.<BR><BR>

And the code MdeModulePkg\Universal\Acpi\S3SaveStateDxe\AcpiS3ContextSave.c:

BOOLEAN
IsLongModeWakingVectorSupport (
  IN EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs
  )
{
  if ((Facs == NULL) ||
      (Facs->Signature != EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ) {
    //
    // Something wrong with FACS.
    //
    return FALSE;
  }
  if ((Facs->Version == EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION) &&
      ((Facs->Flags & EFI_ACPI_4_0_64BIT_WAKE_SUPPORTED_F) != 0)) {
    //
    // BIOS supports 64bit waking vector.
    //
    if (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
      return TRUE;
    }
  }
  return FALSE;
}


Thank you
Yao Jiewen

From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Yao, Jiewen
Sent: Wednesday, February 8, 2017 9:18 AM
To: Laszlo Ersek <lersek@redhat.com>; Duran, Leo <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; edk2-devel@ml01.01.org
Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

Good reminder. I take back my word.

In this case, we need consume PcdPteMemoryEncryptionAddressOrMask  in IA32 mode to build X64 paging.

We need

From: Laszlo Ersek [mailto:lersek@redhat.com]
Sent: Wednesday, February 8, 2017 9:11 AM
To: Yao, Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com>>; Duran, Leo <leo.duran@amd.com<mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
Cc: Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

On 02/08/17 18:05, Yao, Jiewen wrote:
> HI Leo
>
> Thanks to clarify that.
>
>
>
> If that is the case, do you think it will be better to limit this PCD to
> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]

Not sure if this is the best place to raise the following observation,
but it should do:

please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE if
PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
- both PEI and DXE are 32-bit, and
- both PEI and DXE are 64-bit.

This doesn't necessarily invalidate anything said thus fair in the
thread, but the following statement from Leo:

    The SEV feature requires 64-bit LongMode, so the
    PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time

does not follow. The PCD is FALSE in OvmfPkgX64.dsc.

Thanks,
Laszlo

>
>
>
> Thank you
>
> Yao Jiewen
>
>
>
> *From:*Duran, Leo [mailto:leo.duran@amd.com]
> *Sent:* Wednesday, February 8, 2017 9:00 AM
> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com<mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com<mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Tian, Feng
> <feng.tian@intel.com<mailto:feng.tian@intel.com<mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>; Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Yao,
> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com>>>
> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
>
>
> Pease see reply below.
> Leo
>
>> -----Original Message-----
>> From: Zeng, Star [mailto:star.zeng@intel.com]
>> Sent: Tuesday, February 07, 2017 8:27 PM
>> To: Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
> <mailto:edk2-devel@ml01.01.org>
>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b<mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com%0b<mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>> <mailto:feng.tian@intel.com>>;
>> Singh, Brijesh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b<mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com%0b<mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>> <mailto:star.zeng@intel.com>>;
>> Yao, Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com>>>>
>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>>
>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>
>> Thanks,
>> Star
> [Duran, Leo]
> Hi Star,
> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>
> The SEV feature requires 64-bit LongMode, so the PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time,
> in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
>
>> -----Original Message-----
>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
>> Leo Duran
>> Sent: Wednesday, February 8, 2017 3:54 AM
>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>> <mailto:edk2-devel@ml01.01.org>
>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b<mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com%0b<mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>> <mailto:feng.tian@intel.com>>;
>> Brijesh Singh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b<mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com%0b<mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>> <mailto:star.zeng@intel.com>>;
>> Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>>
>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>>
>> From: Brijesh Singh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com>>>>
>>
>> This dynamic PCD holds the address mask for page table entries when
>> memory encryption is enabled on AMD processors supporting the Secure
>> Encrypted Virtualization (SEV) feature.
>>
>> Cc: Feng Tian <feng.tian@intel.com <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com<mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com>>>>
>> Cc: Star Zeng <star.zeng@intel.com <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com<mailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com>>>>
>> Cc: Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com<mailto:lersek@redhat.com %3cmailto:lersek@redhat.com<mailto:lersek@redhat.com %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com %3cmailto:lersek@redhat.com>>>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>>
>> ---
>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
>> ------
>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>
>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> index 2bc41be..d62bd9b 100644
>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> @@ -6,6 +6,8 @@
>>  #  needed to run the DXE Foundation.
>>  #
>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>  #  This program and the accompanying materials  #  are licensed and made
>> available under the terms and conditions of the BSD License  #  which
>> accompanies this distribution.  The full text of the license may be found at
>> @@ -111,7 +113,8 @@ [FeaturePcd]
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
>> CONSUMES
>>
>>  [Pcd.IA32,Pcd.X64]
>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>> SOMETIMES_CONSUMES
>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>> SOMETIMES_CONSUMES
>> +
>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>> ask    ## CONSUMES
>>
>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>> SOMETIMES_CONSUMES
>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> index 790f6ab..2c52389 100644
>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> @@ -16,6 +16,8 @@
>>      3) IA-32 Intel(R) Architecture Software Developer's Manual Volume
>> 3:System Programmer's Guide, Intel
>>
>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>> +
>>  This program and the accompanying materials  are licensed and made
>> available under the terms and conditions of the BSD License  which
>> accompanies this distribution.  The full text of the license may be found at
>> @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>    //
>>    // Fill in 2M page entry.
>>    //
>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
>> IA32_PG_RW;
>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>
>>    PhysicalAddress4K = PhysicalAddress;
>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>> SIZE_4KB) {
>>      //
>>      // Fill in the Page Table entries
>>      //
>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>      PageTableEntry->Bits.ReadWrite = 1;
>>      PageTableEntry->Bits.Present = 1;
>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase +
>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>    //
>>    // Fill in 1G page entry.
>>    //
>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
>> IA32_PG_RW;
>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>
>>    PhysicalAddress2M = PhysicalAddress;
>>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512;
>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M
>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>        //
>>        // Fill in the Page Directory entries
>>        //
>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>        PageDirectoryEntry->Bits.Present = 1;
>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
>> CreateIdentityMappingPageTables (
>>      //
>>      // Make a PML4 Entry
>>      //
>> -    PageMapLevel4Entry->Uint64 =
>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>> +    PageMapLevel4Entry->Uint64 =
>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>      PageMapLevel4Entry->Bits.Present = 1;
>>
>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>            //
>>            // Fill in the Page Directory entries
>>            //
>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>            PageDirectory1GEntry->Bits.Present = 1;
>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 @@
>> CreateIdentityMappingPageTables (
>>          //
>>          // Fill in a Page Directory Pointer Entries
>>          //
>> -        PageDirectoryPointerEntry->Uint64 =
>> (UINT64)(UINTN)PageDirectoryEntry;
>> +        PageDirectoryPointerEntry->Uint64 =
>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>
>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>              //
>>              // Fill in the Page Directory entries
>>              //
>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>              PageDirectoryEntry->Bits.Present = 1;
>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
>> a/MdeModulePkg/MdeModulePkg.dec
>> b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
>> --- a/MdeModulePkg/MdeModulePkg.dec
>> +++ b/MdeModulePkg/MdeModulePkg.dec
>> @@ -6,6 +6,8 @@
>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>  #
>> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>  # (C) Copyright 2016
>> Hewlett Packard Enterprise Development LP<BR>
>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>  # This program and the accompanying materials are licensed and made
>> available under  # the terms and conditions of the BSD License that
>> accompanies this distribution.
>>  # The full text of the license may be found at @@ -1738,5 +1740,11 @@
>> [PcdsDynamic, PcdsDynamicEx]
>>    # @Prompt If there is any test key used by the platform.
>>
>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>> 0030003
>>
>> +  ## This dynamic PCD holds the address mask for page table entries
>> + when memory encryption is  #  enabled on AMD processors supporting the
>> Secure Encrypted Virtualization (SEV) feature.
>> +  #  This mask should be applied when creating 1:1 virtual to physical
>> mapping tables.
>> +  #
>> +
>> +
>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>> ask|0x0
>> + |UINT64|0x00030004
>> +
>>  [UserExtensions.TianoCore."ExtraFiles"]
>>    MdeModulePkgExtra.uni
>> --
>> 1.9.1
>>
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>> <mailto:edk2-devel@lists.01.org>
>> https://lists.01.org/mailman/listinfo/edk2-devel
>
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org<mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Laszlo Ersek 7 years, 8 months ago
On 02/08/17 18:27, Yao, Jiewen wrote:
> I believe PcdDxeIplSwitchtoLongMode  == DXE is Long mode.
> 
>  
> 
> See DEC description:
> 
>   #  It is assumed that 64-bit DxeCore is built in firmware if it is
> true; otherwise 32-bit DxeCore
> 
>   #  is built in firmware.<BR><BR>

Unfortunately, I have no historical context or background for this PCD;
all I can say is that the X64 OVMF platform does not set the PCD.

It enters long mode, and sets up page tables for the first 4GB of RAM,
in SEC. Then SEC decompresses the flash contents to RAM, which covers
both PEIFV and DXEFV. PEI runs from RAM.

This is possible because on QEMU/KVM, there's no need to initialize RAM,
thus only SEC runs from flash, in-place.

Perhaps Jordan can provide more insight.

If Brijesh and Leo would like to run the X64 OVMF platform as a SEV
guest too, then this should be considered, in my opinion.

One more comment below:

> 
>  
> 
> And the code MdeModulePkg\Universal\Acpi\S3SaveStateDxe\AcpiS3ContextSave.c:
> 
>  
> 
> BOOLEAN
> 
> IsLongModeWakingVectorSupport (
> 
>   IN EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*Facs
> 
>   )
> 
> {
> 
>   if((Facs == NULL) ||
> 
>       (Facs->Signature !=
> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ) {
> 
>     //
> 
>     // Something wrong with FACS.
> 
>     //
> 
>     returnFALSE;
> 
>   }
> 
>   if((Facs->Version ==
> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION) &&
> 
>       ((Facs->Flags & EFI_ACPI_4_0_64BIT_WAKE_SUPPORTED_F) != 0)) {
> 
>     //
> 
>     // BIOS supports 64bit waking vector.
> 
>     //
> 
>     if(FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
> 
>       returnTRUE;
> 
>     }
> 
>   }
> 
>   returnFALSE;
> 
> }

In practice, it's okay if the OVMF X64 platform is recognized as "not
supporting a 64-bit waking vector for S3 resume". All the 64-bit guest
OSes that I've tested with OVMF X64 (Linux, and the Windows 7 / 8 / 10
families, both client and server) use a real mode (16-bit) waking
vector, in practice.

... Actually, upon reviewing the above code more carefully, we don't
even reach the FeaturePcdGet() call: the FACS that QEMU generates (and
OVMF downloads and installs) corresponds to ACPI 1.0, that is,
EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION.

Thanks
Laszlo


> 
>  
> 
>  
> 
> Thank you
> 
> Yao Jiewen
> 
>  
> 
> *From:*edk2-devel [mailto:edk2-devel-bounces@lists.01.org] *On Behalf Of
> *Yao, Jiewen
> *Sent:* Wednesday, February 8, 2017 9:18 AM
> *To:* Laszlo Ersek <lersek@redhat.com>; Duran, Leo <leo.duran@amd.com>;
> Zeng, Star <star.zeng@intel.com>; edk2-devel@ml01.01.org
> *Cc:* Tian, Feng <feng.tian@intel.com>; Singh, Brijesh
> <brijesh.singh@amd.com>
> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
> 
>  
> 
> Good reminder. I take back my word.
> 
> In this case, we need consume PcdPteMemoryEncryptionAddressOrMask  in IA32 mode to build X64 paging.
> 
> We need
> 
> From: Laszlo Ersek [mailto:lersek@redhat.com]
> Sent: Wednesday, February 8, 2017 9:11 AM
> To: Yao, Jiewen <jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com>>; Duran, Leo <leo.duran@amd.com
> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org>
> Cc: Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com>>
> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
> 
> On 02/08/17 18:05, Yao, Jiewen wrote:
>> HI Leo
>>
>> Thanks to clarify that.
>>
>>
>>
>> If that is the case, do you think it will be better to limit this PCD to
>> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
> 
> Not sure if this is the best place to raise the following observation,
> but it should do:
> 
> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE if
> PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
> - both PEI and DXE are 32-bit, and
> - both PEI and DXE are 64-bit.
> 
> This doesn't necessarily invalidate anything said thus fair in the
> thread, but the following statement from Leo:
> 
>     The SEV feature requires 64-bit LongMode, so the
>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
> 
> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
> 
> Thanks,
> Laszlo
> 
>>
>>
>>
>> Thank you
>>
>> Yao Jiewen
>>
>>
>>
>> *From:*Duran, Leo [mailto:leo.duran@amd.com]
>> *Sent:* Wednesday, February 8, 2017 9:00 AM
>> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com
> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Tian, Feng
>> <feng.tian@intel.com<mailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>; Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Yao,
>> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com>>>
>> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>>
>>
>>
>> Pease see reply below.
>> Leo
>>
>>> -----Original Message-----
>>> From: Zeng, Star [mailto:star.zeng@intel.com]
>>> Sent: Tuesday, February 07, 2017 8:27 PM
>>> To: Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>> <mailto:edk2-devel@ml01.01.org>
>>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b
> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com%0b
> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>> <mailto:feng.tian@intel.com>>;
>>> Singh, Brijesh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b
> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com%0b
> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>> <mailto:star.zeng@intel.com>>;
>>> Yao, Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com>>>>
>>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>>
>>> Thanks,
>>> Star
>> [Duran, Leo]
>> Hi Star,
>> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>>
>> The SEV feature requires 64-bit LongMode, so the PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time,
>> in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
>>
>>> -----Original Message-----
>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
>>> Leo Duran
>>> Sent: Wednesday, February 8, 2017 3:54 AM
>>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>> <mailto:edk2-devel@ml01.01.org>
>>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b
> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com%0b
> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>> <mailto:feng.tian@intel.com>>;
>>> Brijesh Singh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b
> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com%0b
> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>> <mailto:star.zeng@intel.com>>;
>>> Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>>
>>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>> From: Brijesh Singh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com>>>>
>>>
>>> This dynamic PCD holds the address mask for page table entries when
>>> memory encryption is enabled on AMD processors supporting the Secure
>>> Encrypted Virtualization (SEV) feature.
>>>
>>> Cc: Feng Tian <feng.tian@intel.com <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com>>>>
>>> Cc: Star Zeng <star.zeng@intel.com <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com>>>>
>>> Cc: Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com<mailto:lersek@redhat.com %3cmailto:lersek@redhat.com
> <mailto:lersek@redhat.com %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com %3cmailto:lersek@redhat.com>>>>
>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>> Signed-off-by: Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>>
>>> ---
>>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
>>> ------
>>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>>
>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>> index 2bc41be..d62bd9b 100644
>>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>> @@ -6,6 +6,8 @@
>>>  #  needed to run the DXE Foundation.
>>>  #
>>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>  #  This program and the accompanying materials  #  are licensed and made
>>> available under the terms and conditions of the BSD License  #  which
>>> accompanies this distribution.  The full text of the license may be found at
>>> @@ -111,7 +113,8 @@ [FeaturePcd]
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
>>> CONSUMES
>>>
>>>  [Pcd.IA32,Pcd.X64]
>>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>>> SOMETIMES_CONSUMES
>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>>> SOMETIMES_CONSUMES
>>> +
>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>> ask    ## CONSUMES
>>>
>>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>>> SOMETIMES_CONSUMES
>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>> index 790f6ab..2c52389 100644
>>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>> @@ -16,6 +16,8 @@
>>>      3) IA-32 Intel(R) Architecture Software Developer's Manual Volume
>>> 3:System Programmer's Guide, Intel
>>>
>>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>> +
>>>  This program and the accompanying materials  are licensed and made
>>> available under the terms and conditions of the BSD License  which
>>> accompanies this distribution.  The full text of the license may be found at
>>> @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>>    //
>>>    // Fill in 2M page entry.
>>>    //
>>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
>>> IA32_PG_RW;
>>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>
>>>    PhysicalAddress4K = PhysicalAddress;
>>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>>> SIZE_4KB) {
>>>      //
>>>      // Fill in the Page Table entries
>>>      //
>>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>      PageTableEntry->Bits.ReadWrite = 1;
>>>      PageTableEntry->Bits.Present = 1;
>>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase +
>>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>>    //
>>>    // Fill in 1G page entry.
>>>    //
>>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
>>> IA32_PG_RW;
>>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>
>>>    PhysicalAddress2M = PhysicalAddress;
>>>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512;
>>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M
>>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>>        //
>>>        // Fill in the Page Directory entries
>>>        //
>>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>>        PageDirectoryEntry->Bits.Present = 1;
>>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
>>> CreateIdentityMappingPageTables (
>>>      //
>>>      // Make a PML4 Entry
>>>      //
>>> -    PageMapLevel4Entry->Uint64 =
>>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>>> +    PageMapLevel4Entry->Uint64 =
>>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>>      PageMapLevel4Entry->Bits.Present = 1;
>>>
>>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>>            //
>>>            // Fill in the Page Directory entries
>>>            //
>>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64
>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>>            PageDirectory1GEntry->Bits.Present = 1;
>>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 @@
>>> CreateIdentityMappingPageTables (
>>>          //
>>>          // Fill in a Page Directory Pointer Entries
>>>          //
>>> -        PageDirectoryPointerEntry->Uint64 =
>>> (UINT64)(UINTN)PageDirectoryEntry;
>>> +        PageDirectoryPointerEntry->Uint64 =
>>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>>
>>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>>              //
>>>              // Fill in the Page Directory entries
>>>              //
>>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64
>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>>              PageDirectoryEntry->Bits.Present = 1;
>>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
>>> a/MdeModulePkg/MdeModulePkg.dec
>>> b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>> @@ -6,6 +6,8 @@
>>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>  #
>>> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>  # (C) Copyright 2016
>>> Hewlett Packard Enterprise Development LP<BR>
>>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>  # This program and the accompanying materials are licensed and made
>>> available under  # the terms and conditions of the BSD License that
>>> accompanies this distribution.
>>>  # The full text of the license may be found at @@ -1738,5 +1740,11 @@
>>> [PcdsDynamic, PcdsDynamicEx]
>>>    # @Prompt If there is any test key used by the platform.
>>>
>>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>>> 0030003
>>>
>>> +  ## This dynamic PCD holds the address mask for page table entries
>>> + when memory encryption is  #  enabled on AMD processors supporting the
>>> Secure Encrypted Virtualization (SEV) feature.
>>> +  #  This mask should be applied when creating 1:1 virtual to physical
>>> mapping tables.
>>> +  #
>>> +
>>> +
>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>> ask|0x0
>>> + |UINT64|0x00030004
>>> +
>>>  [UserExtensions.TianoCore."ExtraFiles"]
>>>    MdeModulePkgExtra.uni
>>> --
>>> 1.9.1
>>>
>>> _______________________________________________
>>> edk2-devel mailing list
>>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org
> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>> <mailto:edk2-devel@lists.01.org>
>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Yao, Jiewen 7 years, 8 months ago
Got it.

If the means of PcdDxeIplSwitchtoLongMode  is unclear, we may add more description to make it clear.

If we believe "PcdDxeIplSwitchtoLongMode  == DXE is Long mode" as final conclusion, can we treat that as a bug and fix OVMF X64?

Thank you
Yao Jiewen


From: Laszlo Ersek [mailto:lersek@redhat.com]
Sent: Wednesday, February 8, 2017 9:52 AM
To: Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; edk2-devel@ml01.01.org
Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

On 02/08/17 18:27, Yao, Jiewen wrote:
> I believe PcdDxeIplSwitchtoLongMode  == DXE is Long mode.
>
>
>
> See DEC description:
>
>   #  It is assumed that 64-bit DxeCore is built in firmware if it is
> true; otherwise 32-bit DxeCore
>
>   #  is built in firmware.<BR><BR>

Unfortunately, I have no historical context or background for this PCD;
all I can say is that the X64 OVMF platform does not set the PCD.

It enters long mode, and sets up page tables for the first 4GB of RAM,
in SEC. Then SEC decompresses the flash contents to RAM, which covers
both PEIFV and DXEFV. PEI runs from RAM.

This is possible because on QEMU/KVM, there's no need to initialize RAM,
thus only SEC runs from flash, in-place.

Perhaps Jordan can provide more insight.

If Brijesh and Leo would like to run the X64 OVMF platform as a SEV
guest too, then this should be considered, in my opinion.

One more comment below:

>
>
>
> And the code MdeModulePkg\Universal\Acpi\S3SaveStateDxe\AcpiS3ContextSave.c:
>
>
>
> BOOLEAN
>
> IsLongModeWakingVectorSupport (
>
>   IN EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*Facs
>
>   )
>
> {
>
>   if((Facs == NULL) ||
>
>       (Facs->Signature !=
> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ) {
>
>     //
>
>     // Something wrong with FACS.
>
>     //
>
>     returnFALSE;
>
>   }
>
>   if((Facs->Version ==
> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION) &&
>
>       ((Facs->Flags & EFI_ACPI_4_0_64BIT_WAKE_SUPPORTED_F) != 0)) {
>
>     //
>
>     // BIOS supports 64bit waking vector.
>
>     //
>
>     if(FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>
>       returnTRUE;
>
>     }
>
>   }
>
>   returnFALSE;
>
> }

In practice, it's okay if the OVMF X64 platform is recognized as "not
supporting a 64-bit waking vector for S3 resume". All the 64-bit guest
OSes that I've tested with OVMF X64 (Linux, and the Windows 7 / 8 / 10
families, both client and server) use a real mode (16-bit) waking
vector, in practice.

... Actually, upon reviewing the above code more carefully, we don't
even reach the FeaturePcdGet() call: the FACS that QEMU generates (and
OVMF downloads and installs) corresponds to ACPI 1.0, that is,
EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION.

Thanks
Laszlo


>
>
>
>
>
> Thank you
>
> Yao Jiewen
>
>
>
> *From:*edk2-devel [mailto:edk2-devel-bounces@lists.01.org] *On Behalf Of
> *Yao, Jiewen
> *Sent:* Wednesday, February 8, 2017 9:18 AM
> *To:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Duran, Leo <leo.duran@amd.com<mailto:leo.duran@amd.com>>;
> Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> *Cc:* Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>; Singh, Brijesh
> <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>
> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
>
>
> Good reminder. I take back my word.
>
> In this case, we need consume PcdPteMemoryEncryptionAddressOrMask  in IA32 mode to build X64 paging.
>
> We need
>
> From: Laszlo Ersek [mailto:lersek@redhat.com]
> Sent: Wednesday, February 8, 2017 9:11 AM
> To: Yao, Jiewen <jiewen.yao@intel.com
<mailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com>>; Duran, Leo <leo.duran@amd.com
<mailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> <mailto:edk2-devel@ml01.01.org>
> Cc: Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com>>
> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
>
> On 02/08/17 18:05, Yao, Jiewen wrote:
>> HI Leo
>>
>> Thanks to clarify that.
>>
>>
>>
>> If that is the case, do you think it will be better to limit this PCD to
>> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
>
> Not sure if this is the best place to raise the following observation,
> but it should do:
>
> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE if
> PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
> - both PEI and DXE are 32-bit, and
> - both PEI and DXE are 64-bit.
>
> This doesn't necessarily invalidate anything said thus fair in the
> thread, but the following statement from Leo:
>
>     The SEV feature requires 64-bit LongMode, so the
>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
>
> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
>
> Thanks,
> Laszlo
>
>>
>>
>>
>> Thank you
>>
>> Yao Jiewen
>>
>>
>>
>> *From:*Duran, Leo [mailto:leo.duran@amd.com]
>> *Sent:* Wednesday, February 8, 2017 9:00 AM
>> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com
<mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com
<mailto:lersek@redhat.com%3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Tian, Feng
>> <feng.tian@intel.com<mailto:feng.tian@intel.com
<mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>; Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Yao,
>> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
<mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com>>>
>> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>>
>>
>>
>> Pease see reply below.
>> Leo
>>
>>> -----Original Message-----
>>> From: Zeng, Star [mailto:star.zeng@intel.com]
>>> Sent: Tuesday, February 07, 2017 8:27 PM
>>> To: Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com
<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>> <mailto:edk2-devel@ml01.01.org>
>>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b
<mailto:lersek@redhat.com%0b%0b>> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b
<mailto:feng.tian@intel.com%0b%0b>> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>> <mailto:feng.tian@intel.com>>;
>>> Singh, Brijesh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b
<mailto:brijesh.singh@amd.com%0b%0b>> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b
<mailto:star.zeng@intel.com%0b%0b>> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>> <mailto:star.zeng@intel.com>>;
>>> Yao, Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com
<mailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com>>>>
>>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>>
>>> Thanks,
>>> Star
>> [Duran, Leo]
>> Hi Star,
>> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>>
>> The SEV feature requires 64-bit LongMode, so the PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time,
>> in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
>>
>>> -----Original Message-----
>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
>>> Leo Duran
>>> Sent: Wednesday, February 8, 2017 3:54 AM
>>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>> <mailto:edk2-devel@ml01.01.org>
>>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b
<mailto:lersek@redhat.com%0b%0b>> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b
<mailto:feng.tian@intel.com%0b%0b>> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>> <mailto:feng.tian@intel.com>>;
>>> Brijesh Singh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b
<mailto:brijesh.singh@amd.com%0b%0b>> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b
<mailto:star.zeng@intel.com%0b%0b>> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>> <mailto:star.zeng@intel.com>>;
>>> Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com
<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>>
>>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>> From: Brijesh Singh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com>>>>
>>>
>>> This dynamic PCD holds the address mask for page table entries when
>>> memory encryption is enabled on AMD processors supporting the Secure
>>> Encrypted Virtualization (SEV) feature.
>>>
>>> Cc: Feng Tian <feng.tian@intel.com <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com
<mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com>>>>
>>> Cc: Star Zeng <star.zeng@intel.com <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com
<mailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com>>>>
>>> Cc: Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com<mailto:lersek@redhat.com %3cmailto:lersek@redhat.com
<mailto:lersek@redhat.com %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com %3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com %3cmailto:lersek@redhat.com>>>>
>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>> Signed-off-by: Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com
<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>>
>>> ---
>>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
>>> ------
>>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>>
>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>> index 2bc41be..d62bd9b 100644
>>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>> @@ -6,6 +6,8 @@
>>>  #  needed to run the DXE Foundation.
>>>  #
>>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>  #  This program and the accompanying materials  #  are licensed and made
>>> available under the terms and conditions of the BSD License  #  which
>>> accompanies this distribution.  The full text of the license may be found at
>>> @@ -111,7 +113,8 @@ [FeaturePcd]
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
>>> CONSUMES
>>>
>>>  [Pcd.IA32,Pcd.X64]
>>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>>> SOMETIMES_CONSUMES
>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>>> SOMETIMES_CONSUMES
>>> +
>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>> ask    ## CONSUMES
>>>
>>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>>> SOMETIMES_CONSUMES
>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>> index 790f6ab..2c52389 100644
>>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>> @@ -16,6 +16,8 @@
>>>      3) IA-32 Intel(R) Architecture Software Developer's Manual Volume
>>> 3:System Programmer's Guide, Intel
>>>
>>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>> +
>>>  This program and the accompanying materials  are licensed and made
>>> available under the terms and conditions of the BSD License  which
>>> accompanies this distribution.  The full text of the license may be found at
>>> @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>>    //
>>>    // Fill in 2M page entry.
>>>    //
>>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
>>> IA32_PG_RW;
>>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>
>>>    PhysicalAddress4K = PhysicalAddress;
>>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>>> SIZE_4KB) {
>>>      //
>>>      // Fill in the Page Table entries
>>>      //
>>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>      PageTableEntry->Bits.ReadWrite = 1;
>>>      PageTableEntry->Bits.Present = 1;
>>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase +
>>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>>    //
>>>    // Fill in 1G page entry.
>>>    //
>>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
>>> IA32_PG_RW;
>>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>
>>>    PhysicalAddress2M = PhysicalAddress;
>>>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512;
>>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M
>>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>>        //
>>>        // Fill in the Page Directory entries
>>>        //
>>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>>        PageDirectoryEntry->Bits.Present = 1;
>>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
>>> CreateIdentityMappingPageTables (
>>>      //
>>>      // Make a PML4 Entry
>>>      //
>>> -    PageMapLevel4Entry->Uint64 =
>>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>>> +    PageMapLevel4Entry->Uint64 =
>>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>>      PageMapLevel4Entry->Bits.Present = 1;
>>>
>>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>>            //
>>>            // Fill in the Page Directory entries
>>>            //
>>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64
>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>>            PageDirectory1GEntry->Bits.Present = 1;
>>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 @@
>>> CreateIdentityMappingPageTables (
>>>          //
>>>          // Fill in a Page Directory Pointer Entries
>>>          //
>>> -        PageDirectoryPointerEntry->Uint64 =
>>> (UINT64)(UINTN)PageDirectoryEntry;
>>> +        PageDirectoryPointerEntry->Uint64 =
>>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>>
>>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>>              //
>>>              // Fill in the Page Directory entries
>>>              //
>>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64
>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>>              PageDirectoryEntry->Bits.Present = 1;
>>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
>>> a/MdeModulePkg/MdeModulePkg.dec
>>> b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>> @@ -6,6 +6,8 @@
>>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>  #
>>> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>  # (C) Copyright 2016
>>> Hewlett Packard Enterprise Development LP<BR>
>>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>  # This program and the accompanying materials are licensed and made
>>> available under  # the terms and conditions of the BSD License that
>>> accompanies this distribution.
>>>  # The full text of the license may be found at @@ -1738,5 +1740,11 @@
>>> [PcdsDynamic, PcdsDynamicEx]
>>>    # @Prompt If there is any test key used by the platform.
>>>
>>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>>> 0030003
>>>
>>> +  ## This dynamic PCD holds the address mask for page table entries
>>> + when memory encryption is  #  enabled on AMD processors supporting the
>>> Secure Encrypted Virtualization (SEV) feature.
>>> +  #  This mask should be applied when creating 1:1 virtual to physical
>>> mapping tables.
>>> +  #
>>> +
>>> +
>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>> ask|0x0
>>> + |UINT64|0x00030004
>>> +
>>>  [UserExtensions.TianoCore."ExtraFiles"]
>>>    MdeModulePkgExtra.uni
>>> --
>>> 1.9.1
>>>
>>> _______________________________________________
>>> edk2-devel mailing list
>>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>
> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>> <mailto:edk2-devel@lists.01.org>
>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org> <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Laszlo Ersek 7 years, 8 months ago
On 02/08/17 19:20, Yao, Jiewen wrote:
> Got it.
> 
>  
> 
> If the means of PcdDxeIplSwitchtoLongMode  is unclear, we may add more
> description to make it clear.
> 
>  
> 
> If we believe “PcdDxeIplSwitchtoLongMode  == DXE is Long mode” as final
> conclusion, can we treat that as a bug and fix OVMF X64?

I don't know how to "fix" that. What is there to fix?

Flipping the PCD to TRUE in OVMF X64 would break OVMF X64, and likely OVMF Ia32X64 too. For two reasons:


(1) Toggling the PCD would alter the behavior of the DXE IPL PEIM and/or the DXE Core, and that behavior has never ever been tested with OVMF X64.

The PcdDxeIplSwitchToLongMode=FALSE setting in the X64 DSC dates back to:

  commit 8fa729a8b1401f01c6fd8ddbcab45e4a4904fa9a
  Author: lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
  Date:   Mon Mar 15 01:40:59 2010 +0000

      Merge the same type PCD section.

      git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10243 6f19259b-4bc3-4df7-8a09-765794883524

and before that, to:

  commit 49ba9447c92d6fca214476381107a180d08e59d1
  Author: jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
  Date:   Wed May 27 21:10:18 2009 +0000

      Add initial version of Open Virtual Machine Firmware (OVMF) platform.

      git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8398 6f19259b-4bc3-4df7-8a09-765794883524

In other words, OVMF X64 has always worked like this, since its inception.


(2) PEI code under OvmfPkg itself uses this PCD to identify a 32-bit DXE phase.

    //
    // If DXE is 32-bit, then we're done; PciBusDxe will degrade 64-bit MMIO
    // resources to 32-bit anyway. See DegradeResource() in
    // "PciResourceSupport.c".
    //
  #ifdef MDE_CPU_IA32
    if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
      return FirstNonAddress;
    }
  #endif

and

    //
    // If DXE is 32-bit, then just return the traditional 64 MB cap.
    //
  #ifdef MDE_CPU_IA32
    if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
      return SIZE_64MB;
    }
  #endif

Thanks
Laszlo

> 
>  
> 
> Thank you
> 
> Yao Jiewen
> 
>  
> 
>  
> 
> *From:*Laszlo Ersek [mailto:lersek@redhat.com]
> *Sent:* Wednesday, February 8, 2017 9:52 AM
> *To:* Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo
> <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>;
> edk2-devel@ml01.01.org
> *Cc:* Tian, Feng <feng.tian@intel.com>; Singh, Brijesh
> <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
> 
>  
> 
> On 02/08/17 18:27, Yao, Jiewen wrote:
>> I believe PcdDxeIplSwitchtoLongMode  == DXE is Long mode.
>> 
>>  
>> 
>> See DEC description:
>> 
>>   #  It is assumed that 64-bit DxeCore is built in firmware if it is
>> true; otherwise 32-bit DxeCore
>> 
>>   #  is built in firmware.<BR><BR>
> 
> Unfortunately, I have no historical context or background for this PCD;
> all I can say is that the X64 OVMF platform does not set the PCD.
> 
> It enters long mode, and sets up page tables for the first 4GB of RAM,
> in SEC. Then SEC decompresses the flash contents to RAM, which covers
> both PEIFV and DXEFV. PEI runs from RAM.
> 
> This is possible because on QEMU/KVM, there's no need to initialize RAM,
> thus only SEC runs from flash, in-place.
> 
> Perhaps Jordan can provide more insight.
> 
> If Brijesh and Leo would like to run the X64 OVMF platform as a SEV
> guest too, then this should be considered, in my opinion.
> 
> One more comment below:
> 
>> 
>>  
>> 
>> And the code MdeModulePkg\Universal\Acpi\S3SaveStateDxe\AcpiS3ContextSave.c:
>> 
>>  
>> 
>> BOOLEAN
>> 
>> IsLongModeWakingVectorSupport (
>> 
>>   IN EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*Facs
>> 
>>   )
>> 
>> {
>> 
>>   if((Facs == NULL) ||
>> 
>>       (Facs->Signature !=
>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ) {
>> 
>>     //
>> 
>>     // Something wrong with FACS.
>> 
>>     //
>> 
>>     returnFALSE;
>> 
>>   }
>> 
>>   if((Facs->Version ==
>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION) &&
>> 
>>       ((Facs->Flags & EFI_ACPI_4_0_64BIT_WAKE_SUPPORTED_F) != 0)) {
>> 
>>     //
>> 
>>     // BIOS supports 64bit waking vector.
>> 
>>     //
>> 
>>     if(FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>> 
>>       returnTRUE;
>> 
>>     }
>> 
>>   }
>> 
>>   returnFALSE;
>> 
>> }
> 
> In practice, it's okay if the OVMF X64 platform is recognized as "not
> supporting a 64-bit waking vector for S3 resume". All the 64-bit guest
> OSes that I've tested with OVMF X64 (Linux, and the Windows 7 / 8 / 10
> families, both client and server) use a real mode (16-bit) waking
> vector, in practice.
> 
> ... Actually, upon reviewing the above code more carefully, we don't
> even reach the FeaturePcdGet() call: the FACS that QEMU generates (and
> OVMF downloads and installs) corresponds to ACPI 1.0, that is,
> EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION.
> 
> Thanks
> Laszlo
> 
> 
>> 
>>  
>> 
>>  
>> 
>> Thank you
>> 
>> Yao Jiewen
>> 
>>  
>> 
>> *From:*edk2-devel [mailto:edk2-devel-bounces@lists.01.org] *On Behalf Of
>> *Yao, Jiewen
>> *Sent:* Wednesday, February 8, 2017 9:18 AM
>> *To:* Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com>>; Duran, Leo <leo.duran@amd.com
> <mailto:leo.duran@amd.com>>;
>> Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org>
>> *Cc:* Tian, Feng <feng.tian@intel.com <mailto:feng.tian@intel.com>>; Singh, Brijesh
>> <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com>>
>> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>> 
>>  
>> 
>> Good reminder. I take back my word.
>> 
>> In this case, we need consume PcdPteMemoryEncryptionAddressOrMask  in IA32 mode to build X64 paging.
>> 
>> We need
>> 
>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>> Sent: Wednesday, February 8, 2017 9:11 AM
>> To: Yao, Jiewen <jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com>>; Duran, Leo <leo.duran@amd.com
> <mailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org>
>> Cc: Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com>>
>> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
>> 
>> On 02/08/17 18:05, Yao, Jiewen wrote:
>>> HI Leo
>>>
>>> Thanks to clarify that.
>>>
>>>
>>>
>>> If that is the case, do you think it will be better to limit this PCD to
>>> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
>> 
>> Not sure if this is the best place to raise the following observation,
>> but it should do:
>> 
>> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE if
>> PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
>> - both PEI and DXE are 32-bit, and
>> - both PEI and DXE are 64-bit.
>> 
>> This doesn't necessarily invalidate anything said thus fair in the
>> thread, but the following statement from Leo:
>> 
>>     The SEV feature requires 64-bit LongMode, so the
>>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
>> 
>> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
>> 
>> Thanks,
>> Laszlo
>> 
>>>
>>>
>>>
>>> Thank you
>>>
>>> Yao Jiewen
>>>
>>>
>>>
>>> *From:*Duran, Leo [mailto:leo.duran@amd.com]
>>> *Sent:* Wednesday, February 8, 2017 9:00 AM
>>> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com
> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Tian, Feng
>>> <feng.tian@intel.com<mailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>; Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Yao,
>>> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com>>>
>>> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>>
>>>
>>> Pease see reply below.
>>> Leo
>>>
>>>> -----Original Message-----
>>>> From: Zeng, Star [mailto:star.zeng@intel.com]
>>>> Sent: Tuesday, February 07, 2017 8:27 PM
>>>> To: Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>> <mailto:edk2-devel@ml01.01.org>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b
> <mailto:lersek@redhat.com%0b%0b>> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b
> <mailto:feng.tian@intel.com%0b%0b>> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>> <mailto:feng.tian@intel.com>>;
>>>> Singh, Brijesh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b
> <mailto:brijesh.singh@amd.com%0b%0b>> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b
> <mailto:star.zeng@intel.com%0b%0b>> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>> <mailto:star.zeng@intel.com>>;
>>>> Yao, Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com>>>>
>>>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>>>
>>>> Thanks,
>>>> Star
>>> [Duran, Leo]
>>> Hi Star,
>>> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>>>
>>> The SEV feature requires 64-bit LongMode, so the PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time,
>>> in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
>>>
>>>> -----Original Message-----
>>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
>>>> Leo Duran
>>>> Sent: Wednesday, February 8, 2017 3:54 AM
>>>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>> <mailto:edk2-devel@ml01.01.org>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b
> <mailto:lersek@redhat.com%0b%0b>> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b
> <mailto:feng.tian@intel.com%0b%0b>> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>> <mailto:feng.tian@intel.com>>;
>>>> Brijesh Singh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b
> <mailto:brijesh.singh@amd.com%0b%0b>> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b
> <mailto:star.zeng@intel.com%0b%0b>> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>> <mailto:star.zeng@intel.com>>;
>>>> Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>>
>>>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>> From: Brijesh Singh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com>>>>
>>>>
>>>> This dynamic PCD holds the address mask for page table entries when
>>>> memory encryption is enabled on AMD processors supporting the Secure
>>>> Encrypted Virtualization (SEV) feature.
>>>>
>>>> Cc: Feng Tian <feng.tian@intel.com <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com>>>>
>>>> Cc: Star Zeng <star.zeng@intel.com <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com>>>>
>>>> Cc: Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com<mailto:lersek@redhat.com %3cmailto:lersek@redhat.com
> <mailto:lersek@redhat.com %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com %3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com %3cmailto:lersek@redhat.com>>>>
>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>> Signed-off-by: Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>>
>>>> ---
>>>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
>>>> ------
>>>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>>>
>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> index 2bc41be..d62bd9b 100644
>>>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> @@ -6,6 +6,8 @@
>>>>  #  needed to run the DXE Foundation.
>>>>  #
>>>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>>>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>>  #  This program and the accompanying materials  #  are licensed and made
>>>> available under the terms and conditions of the BSD License  #  which
>>>> accompanies this distribution.  The full text of the license may be found at
>>>> @@ -111,7 +113,8 @@ [FeaturePcd]
>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
>>>> CONSUMES
>>>>
>>>>  [Pcd.IA32,Pcd.X64]
>>>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>>>> SOMETIMES_CONSUMES
>>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>>>> SOMETIMES_CONSUMES
>>>> +
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>> ask    ## CONSUMES
>>>>
>>>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>>>> SOMETIMES_CONSUMES
>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> index 790f6ab..2c52389 100644
>>>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> @@ -16,6 +16,8 @@
>>>>      3) IA-32 Intel(R) Architecture Software Developer's Manual Volume
>>>> 3:System Programmer's Guide, Intel
>>>>
>>>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>>>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>>> +
>>>>  This program and the accompanying materials  are licensed and made
>>>> available under the terms and conditions of the BSD License  which
>>>> accompanies this distribution.  The full text of the license may be found at
>>>> @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>>>    //
>>>>    // Fill in 2M page entry.
>>>>    //
>>>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
>>>> IA32_PG_RW;
>>>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>
>>>>    PhysicalAddress4K = PhysicalAddress;
>>>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>>>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>>>> SIZE_4KB) {
>>>>      //
>>>>      // Fill in the Page Table entries
>>>>      //
>>>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>>>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>      PageTableEntry->Bits.ReadWrite = 1;
>>>>      PageTableEntry->Bits.Present = 1;
>>>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase +
>>>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>>>    //
>>>>    // Fill in 1G page entry.
>>>>    //
>>>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
>>>> IA32_PG_RW;
>>>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>
>>>>    PhysicalAddress2M = PhysicalAddress;
>>>>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512;
>>>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M
>>>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>>>        //
>>>>        // Fill in the Page Directory entries
>>>>        //
>>>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>>>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>        PageDirectoryEntry->Bits.Present = 1;
>>>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
>>>> CreateIdentityMappingPageTables (
>>>>      //
>>>>      // Make a PML4 Entry
>>>>      //
>>>> -    PageMapLevel4Entry->Uint64 =
>>>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>>>> +    PageMapLevel4Entry->Uint64 =
>>>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>>>      PageMapLevel4Entry->Bits.Present = 1;
>>>>
>>>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>>>            //
>>>>            // Fill in the Page Directory entries
>>>>            //
>>>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>>>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>>>            PageDirectory1GEntry->Bits.Present = 1;
>>>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 @@
>>>> CreateIdentityMappingPageTables (
>>>>          //
>>>>          // Fill in a Page Directory Pointer Entries
>>>>          //
>>>> -        PageDirectoryPointerEntry->Uint64 =
>>>> (UINT64)(UINTN)PageDirectoryEntry;
>>>> +        PageDirectoryPointerEntry->Uint64 =
>>>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>>>
>>>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>>>              //
>>>>              // Fill in the Page Directory entries
>>>>              //
>>>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>>>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>              PageDirectoryEntry->Bits.Present = 1;
>>>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
>>>> a/MdeModulePkg/MdeModulePkg.dec
>>>> b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
>>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>>> @@ -6,6 +6,8 @@
>>>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>  #
>>>> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>  # (C) Copyright 2016
>>>> Hewlett Packard Enterprise Development LP<BR>
>>>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>>  # This program and the accompanying materials are licensed and made
>>>> available under  # the terms and conditions of the BSD License that
>>>> accompanies this distribution.
>>>>  # The full text of the license may be found at @@ -1738,5 +1740,11 @@
>>>> [PcdsDynamic, PcdsDynamicEx]
>>>>    # @Prompt If there is any test key used by the platform.
>>>>
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>>>> 0030003
>>>>
>>>> +  ## This dynamic PCD holds the address mask for page table entries
>>>> + when memory encryption is  #  enabled on AMD processors supporting the
>>>> Secure Encrypted Virtualization (SEV) feature.
>>>> +  #  This mask should be applied when creating 1:1 virtual to physical
>>>> mapping tables.
>>>> +  #
>>>> +
>>>> +
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>> ask|0x0
>>>> + |UINT64|0x00030004
>>>> +
>>>>  [UserExtensions.TianoCore."ExtraFiles"]
>>>>    MdeModulePkgExtra.uni
>>>> --
>>>> 1.9.1
>>>>
>>>> _______________________________________________
>>>> edk2-devel mailing list
>>>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org
> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>
>> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>> <mailto:edk2-devel@lists.01.org>
>>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>>
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.01.org
> <mailto:edk2-devel@lists.01.org> <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Zeng, Star 7 years, 8 months ago
In fact, X64 DxeIplPeim does not refer PcdDxeIplSwitchToLongMode at all.

DxeIpl.inf:
[FeaturePcd.IA32]
  gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode      ## CONSUMES

As I remember, I did a draft patch below before for the discussion about how to determine DXE is 32BITs or 64BITs in title "[edk2] [PATCH v3 2/4] IntelFrameworkModulePkg: BdsDxe: only allocate below 4 GB if needed", I can't find the archive link any more.

---
 MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c | 5 +++++
 MdeModulePkg/MdeModulePkg.dec                  | 4 +++-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
index 6488880..348e084 100644
--- a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
+++ b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
@@ -43,6 +43,11 @@ HandOffToDxeCore (
   EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;
 
   //
+  // It should be FALSE for both PEI and DXE are 64-bit.
+  //
+  ASSERT (PcdGetBool (PcdDxeIplSwitchToLongMode) == FALSE);
+
+  //
   // Get Vector Hand-off Info PPI and build Guided HOB
   //
   Status = PeiServicesLocatePpi (
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index af7bcab..4a73f7b 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -712,8 +712,10 @@
   ## Indicates if DxeIpl should switch to long mode to enter DXE phase.
   #  It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore
   #  is built in firmware.<BR><BR>
+  #  And it should be FALSE for both PEI and DXE are 64-bit.
   #   TRUE  - DxeIpl will load a 64-bit DxeCore and switch to long mode to hand over to DxeCore.<BR>
-  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore.<BR>
+  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore,<BR>
+  #           or both PEI and DXE are 64-bit.<BR>
   # @Prompt DxeIpl switch to long mode.
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|TRUE|BOOLEAN|0x0001003b
 
--


Thanks,
Star
-----Original Message-----
From: Laszlo Ersek [mailto:lersek@redhat.com] 
Sent: Thursday, February 9, 2017 3:48 AM
To: Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; edk2-devel@ml01.01.org
Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

On 02/08/17 19:20, Yao, Jiewen wrote:
> Got it.
> 
>  
> 
> If the means of PcdDxeIplSwitchtoLongMode  is unclear, we may add more 
> description to make it clear.
> 
>  
> 
> If we believe "PcdDxeIplSwitchtoLongMode  == DXE is Long mode" as 
> final conclusion, can we treat that as a bug and fix OVMF X64?

I don't know how to "fix" that. What is there to fix?

Flipping the PCD to TRUE in OVMF X64 would break OVMF X64, and likely OVMF Ia32X64 too. For two reasons:


(1) Toggling the PCD would alter the behavior of the DXE IPL PEIM and/or the DXE Core, and that behavior has never ever been tested with OVMF X64.

The PcdDxeIplSwitchToLongMode=FALSE setting in the X64 DSC dates back to:

  commit 8fa729a8b1401f01c6fd8ddbcab45e4a4904fa9a
  Author: lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
  Date:   Mon Mar 15 01:40:59 2010 +0000

      Merge the same type PCD section.

      git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10243 6f19259b-4bc3-4df7-8a09-765794883524

and before that, to:

  commit 49ba9447c92d6fca214476381107a180d08e59d1
  Author: jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
  Date:   Wed May 27 21:10:18 2009 +0000

      Add initial version of Open Virtual Machine Firmware (OVMF) platform.

      git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8398 6f19259b-4bc3-4df7-8a09-765794883524

In other words, OVMF X64 has always worked like this, since its inception.


(2) PEI code under OvmfPkg itself uses this PCD to identify a 32-bit DXE phase.

    //
    // If DXE is 32-bit, then we're done; PciBusDxe will degrade 64-bit MMIO
    // resources to 32-bit anyway. See DegradeResource() in
    // "PciResourceSupport.c".
    //
  #ifdef MDE_CPU_IA32
    if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
      return FirstNonAddress;
    }
  #endif

and

    //
    // If DXE is 32-bit, then just return the traditional 64 MB cap.
    //
  #ifdef MDE_CPU_IA32
    if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
      return SIZE_64MB;
    }
  #endif

Thanks
Laszlo

> 
>  
> 
> Thank you
> 
> Yao Jiewen
> 
>  
> 
>  
> 
> *From:*Laszlo Ersek [mailto:lersek@redhat.com]
> *Sent:* Wednesday, February 8, 2017 9:52 AM
> *To:* Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo 
> <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; 
> edk2-devel@ml01.01.org
> *Cc:* Tian, Feng <feng.tian@intel.com>; Singh, Brijesh 
> <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
> PcdPteMemoryEncryptionAddressOrMask
> 
>  
> 
> On 02/08/17 18:27, Yao, Jiewen wrote:
>> I believe PcdDxeIplSwitchtoLongMode  == DXE is Long mode.
>> 
>>  
>> 
>> See DEC description:
>> 
>>   #  It is assumed that 64-bit DxeCore is built in firmware if it is 
>> true; otherwise 32-bit DxeCore
>> 
>>   #  is built in firmware.<BR><BR>
> 
> Unfortunately, I have no historical context or background for this 
> PCD; all I can say is that the X64 OVMF platform does not set the PCD.
> 
> It enters long mode, and sets up page tables for the first 4GB of RAM, 
> in SEC. Then SEC decompresses the flash contents to RAM, which covers 
> both PEIFV and DXEFV. PEI runs from RAM.
> 
> This is possible because on QEMU/KVM, there's no need to initialize 
> RAM, thus only SEC runs from flash, in-place.
> 
> Perhaps Jordan can provide more insight.
> 
> If Brijesh and Leo would like to run the X64 OVMF platform as a SEV 
> guest too, then this should be considered, in my opinion.
> 
> One more comment below:
> 
>> 
>>  
>> 
>> And the code MdeModulePkg\Universal\Acpi\S3SaveStateDxe\AcpiS3ContextSave.c:
>> 
>>  
>> 
>> BOOLEAN
>> 
>> IsLongModeWakingVectorSupport (
>> 
>>   IN EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*Facs
>> 
>>   )
>> 
>> {
>> 
>>   if((Facs == NULL) ||
>> 
>>       (Facs->Signature !=
>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ) {
>> 
>>     //
>> 
>>     // Something wrong with FACS.
>> 
>>     //
>> 
>>     returnFALSE;
>> 
>>   }
>> 
>>   if((Facs->Version ==
>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION) &&
>> 
>>       ((Facs->Flags & EFI_ACPI_4_0_64BIT_WAKE_SUPPORTED_F) != 0)) {
>> 
>>     //
>> 
>>     // BIOS supports 64bit waking vector.
>> 
>>     //
>> 
>>     if(FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>> 
>>       returnTRUE;
>> 
>>     }
>> 
>>   }
>> 
>>   returnFALSE;
>> 
>> }
> 
> In practice, it's okay if the OVMF X64 platform is recognized as "not 
> supporting a 64-bit waking vector for S3 resume". All the 64-bit guest 
> OSes that I've tested with OVMF X64 (Linux, and the Windows 7 / 8 / 10 
> families, both client and server) use a real mode (16-bit) waking 
> vector, in practice.
> 
> ... Actually, upon reviewing the above code more carefully, we don't 
> even reach the FeaturePcdGet() call: the FACS that QEMU generates (and 
> OVMF downloads and installs) corresponds to ACPI 1.0, that is, 
> EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION.
> 
> Thanks
> Laszlo
> 
> 
>> 
>>  
>> 
>>  
>> 
>> Thank you
>> 
>> Yao Jiewen
>> 
>>  
>> 
>> *From:*edk2-devel [mailto:edk2-devel-bounces@lists.01.org] *On Behalf 
>> Of *Yao, Jiewen
>> *Sent:* Wednesday, February 8, 2017 9:18 AM
>> *To:* Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com>>; Duran, Leo <leo.duran@amd.com 
> <mailto:leo.duran@amd.com>>;
>> Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org 
> <mailto:edk2-devel@ml01.01.org>
>> *Cc:* Tian, Feng <feng.tian@intel.com <mailto:feng.tian@intel.com>>; 
>> Singh, Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com>>
>> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>> PcdPteMemoryEncryptionAddressOrMask
>> 
>>  
>> 
>> Good reminder. I take back my word.
>> 
>> In this case, we need consume PcdPteMemoryEncryptionAddressOrMask  in IA32 mode to build X64 paging.
>> 
>> We need
>> 
>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>> Sent: Wednesday, February 8, 2017 9:11 AM
>> To: Yao, Jiewen <jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com>>; 
> Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com%0b>> 
> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com 
> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>; 
> edk2-devel@ml01.01.org <mailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org>
>> Cc: Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com>>; Singh, 
> Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com%0b>> 
> <mailto:brijesh.singh@amd.com>>
>> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>> PcdPteMemoryEncryptionAddressOrMask
>> 
>> On 02/08/17 18:05, Yao, Jiewen wrote:
>>> HI Leo
>>>
>>> Thanks to clarify that.
>>>
>>>
>>>
>>> If that is the case, do you think it will be better to limit this 
>>> PCD to
>>> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
>> 
>> Not sure if this is the best place to raise the following 
>> observation, but it should do:
>> 
>> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE 
>> if PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
>> - both PEI and DXE are 32-bit, and
>> - both PEI and DXE are 64-bit.
>> 
>> This doesn't necessarily invalidate anything said thus fair in the 
>> thread, but the following statement from Leo:
>> 
>>     The SEV feature requires 64-bit LongMode, so the
>>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
>> 
>> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
>> 
>> Thanks,
>> Laszlo
>> 
>>>
>>>
>>>
>>> Thank you
>>>
>>> Yao Jiewen
>>>
>>>
>>>
>>> *From:*Duran, Leo [mailto:leo.duran@amd.com]
>>> *Sent:* Wednesday, February 8, 2017 9:00 AM
>>> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com%0b>> 
> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>; 
> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com
> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com%0b>> 
> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Tian, Feng
>>> <feng.tian@intel.com<mailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com%0b>> 
> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>; Singh, 
> Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com%0b>> 
> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Yao,
>>> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com%0b>> 
> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com>>>
>>> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>>
>>>
>>> Pease see reply below.
>>> Leo
>>>
>>>> -----Original Message-----
>>>> From: Zeng, Star [mailto:star.zeng@intel.com]
>>>> Sent: Tuesday, February 07, 2017 8:27 PM
>>>> To: Duran, Leo <leo.duran@amd.com 
>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com 
>>>> %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com 
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com 
> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com 
> %3cmailto:leo.duran@amd.com>>>>; 
> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>> <mailto:edk2-devel@ml01.01.org>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b 
> <mailto:lersek@redhat.com%0b%0b>> 
> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>> 
> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com 
> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b 
> <mailto:feng.tian@intel.com%0b%0b>> 
> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>> 
> <mailto:feng.tian@intel.com>>;
>>>> Singh, Brijesh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b 
> <mailto:brijesh.singh@amd.com%0b%0b>> 
> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>> 
> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com 
> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b 
> <mailto:star.zeng@intel.com%0b%0b>> 
> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>> 
> <mailto:star.zeng@intel.com>>;
>>>> Yao, Jiewen <jiewen.yao@intel.com 
>>>> <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com 
>>>> %3cmailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com 
> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com 
> %3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com 
> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com 
> %3cmailto:jiewen.yao@intel.com>>>>
>>>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>>>
>>>> Thanks,
>>>> Star
>>> [Duran, Leo]
>>> Hi Star,
>>> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>>>
>>> The SEV feature requires 64-bit LongMode, so the 
>>> PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time, in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
>>>
>>>> -----Original Message-----
>>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf 
>>>> Of Leo Duran
>>>> Sent: Wednesday, February 8, 2017 3:54 AM
>>>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>> 
>> <mailto:edk2-devel@ml01.01.org>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b 
> <mailto:lersek@redhat.com%0b%0b>> 
> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>> 
> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com 
> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b 
> <mailto:feng.tian@intel.com%0b%0b>> 
> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>> 
> <mailto:feng.tian@intel.com>>;
>>>> Brijesh Singh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b 
> <mailto:brijesh.singh@amd.com%0b%0b>> 
> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>> 
> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com 
> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b 
> <mailto:star.zeng@intel.com%0b%0b>> 
> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>> 
> <mailto:star.zeng@intel.com>>;
>>>> Leo Duran <leo.duran@amd.com 
>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com 
>>>> %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com 
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com 
> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com 
> %3cmailto:leo.duran@amd.com>>>>
>>>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>> From: Brijesh Singh <brijesh.singh@amd.com 
>>>> <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com 
>>>> %3cmailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com 
> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com 
> %3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com 
> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com 
> %3cmailto:brijesh.singh@amd.com>>>>
>>>>
>>>> This dynamic PCD holds the address mask for page table entries when 
>>>> memory encryption is enabled on AMD processors supporting the 
>>>> Secure Encrypted Virtualization (SEV) feature.
>>>>
>>>> Cc: Feng Tian <feng.tian@intel.com 
>>>> <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com 
>>>> %3cmailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com 
> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com 
> %3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com 
> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com 
> %3cmailto:feng.tian@intel.com>>>>
>>>> Cc: Star Zeng <star.zeng@intel.com 
>>>> <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com 
>>>> %3cmailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com 
> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com 
> %3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com 
> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com 
> %3cmailto:star.zeng@intel.com>>>>
>>>> Cc: Laszlo Ersek <lersek@redhat.com 
>>>> <mailto:lersek@redhat.com<mailto:lersek@redhat.com 
>>>> %3cmailto:lersek@redhat.com
> <mailto:lersek@redhat.com 
> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com 
> %3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com 
> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com 
> %3cmailto:lersek@redhat.com>>>>
>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>> Signed-off-by: Leo Duran <leo.duran@amd.com 
>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com 
>>>> %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com 
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com 
> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com 
> %3cmailto:leo.duran@amd.com>>>>
>>>> ---
>>>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
>>>> ------
>>>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>>>
>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> index 2bc41be..d62bd9b 100644
>>>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> @@ -6,6 +6,8 @@
>>>>  #  needed to run the DXE Foundation.
>>>>  #
>>>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights 
>>>> reserved.<BR>
>>>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> 
>>>> +#
>>>>  #  This program and the accompanying materials  #  are licensed 
>>>> and made available under the terms and conditions of the BSD 
>>>> License  #  which accompanies this distribution.  The full text of 
>>>> the license may be found at @@ -111,7 +113,8 @@ [FeaturePcd]
>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ## 
>>>> CONSUMES
>>>>
>>>>  [Pcd.IA32,Pcd.X64]
>>>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>>>> SOMETIMES_CONSUMES
>>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>>>> SOMETIMES_CONSUMES
>>>> +
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>> ask    ## CONSUMES
>>>>
>>>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>>>> SOMETIMES_CONSUMES
>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> index 790f6ab..2c52389 100644
>>>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> @@ -16,6 +16,8 @@
>>>>      3) IA-32 Intel(R) Architecture Software Developer's Manual 
>>>> Volume 3:System Programmer's Guide, Intel
>>>>
>>>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights 
>>>> reserved.<BR>
>>>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>>> +
>>>>  This program and the accompanying materials  are licensed and made 
>>>> available under the terms and conditions of the BSD License  which 
>>>> accompanies this distribution.  The full text of the license may be 
>>>> found at @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>>>    //
>>>>    // Fill in 2M page entry.
>>>>    //
>>>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P | 
>>>> IA32_PG_RW;
>>>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>
>>>>    PhysicalAddress4K = PhysicalAddress;
>>>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>>>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>>>> SIZE_4KB) {
>>>>      //
>>>>      // Fill in the Page Table entries
>>>>      //
>>>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>>>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64 
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>      PageTableEntry->Bits.ReadWrite = 1;
>>>>      PageTableEntry->Bits.Present = 1;
>>>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < 
>>>> StackBase +
>>>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>>>    //
>>>>    // Fill in 1G page entry.
>>>>    //
>>>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P | 
>>>> IA32_PG_RW;
>>>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>
>>>>    PhysicalAddress2M = PhysicalAddress;
>>>>    for (IndexOfPageDirectoryEntries = 0; 
>>>> IndexOfPageDirectoryEntries < 512;
>>>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, 
>>>> IndexOfPageDirectoryEntries++PhysicalAddress2M
>>>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>>>        //
>>>>        // Fill in the Page Directory entries
>>>>        //
>>>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>>>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>        PageDirectoryEntry->Bits.Present = 1;
>>>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@ 
>>>> CreateIdentityMappingPageTables (
>>>>      //
>>>>      // Make a PML4 Entry
>>>>      //
>>>> -    PageMapLevel4Entry->Uint64 =
>>>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>>>> +    PageMapLevel4Entry->Uint64 =
>>>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64 
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>>>      PageMapLevel4Entry->Bits.Present = 1;
>>>>
>>>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>>>            //
>>>>            // Fill in the Page Directory entries
>>>>            //
>>>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>>>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | 
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>>>            PageDirectory1GEntry->Bits.Present = 1;
>>>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 
>>>> @@ CreateIdentityMappingPageTables (
>>>>          //
>>>>          // Fill in a Page Directory Pointer Entries
>>>>          //
>>>> -        PageDirectoryPointerEntry->Uint64 =
>>>> (UINT64)(UINTN)PageDirectoryEntry;
>>>> +        PageDirectoryPointerEntry->Uint64 = 
>>>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64 
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>>>
>>>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>>>              //
>>>>              // Fill in the Page Directory entries
>>>>              //
>>>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>>>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | 
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>              PageDirectoryEntry->Bits.Present = 1;
>>>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git 
>>>> a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec 
>>>> index 273cd7e..207384f 100644
>>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>>> @@ -6,6 +6,8 @@
>>>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights 
>>>> reserved.<BR>  # Copyright (c) 2016, Linaro Ltd. All rights 
>>>> reserved.<BR>  # (C) Copyright 2016 Hewlett Packard Enterprise 
>>>> Development LP<BR>
>>>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>>  # This program and the accompanying materials are licensed and 
>>>> made available under  # the terms and conditions of the BSD License 
>>>> that accompanies this distribution.
>>>>  # The full text of the license may be found at @@ -1738,5 +1740,11 
>>>> @@ [PcdsDynamic, PcdsDynamicEx]
>>>>    # @Prompt If there is any test key used by the platform.
>>>>
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>>>> 0030003
>>>>
>>>> +  ## This dynamic PCD holds the address mask for page table 
>>>> + entries when memory encryption is  #  enabled on AMD processors 
>>>> + supporting the
>>>> Secure Encrypted Virtualization (SEV) feature.
>>>> +  #  This mask should be applied when creating 1:1 virtual to 
>>>> + physical
>>>> mapping tables.
>>>> +  #
>>>> +
>>>> +
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>> ask|0x0
>>>> + |UINT64|0x00030004
>>>> +
>>>>  [UserExtensions.TianoCore."ExtraFiles"]
>>>>    MdeModulePkgExtra.uni
>>>> --
>>>> 1.9.1
>>>>
>>>> _______________________________________________
>>>> edk2-devel mailing list
>>>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org
> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>
>> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>> 
>> <mailto:edk2-devel@lists.01.org>
>>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>>
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.01.org
> <mailto:edk2-devel@lists.01.org> <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Yao, Jiewen 7 years, 8 months ago
I suggest we evaluate *all* usages of PcdDxeIplSwitchToLongMode because this is an incompatible change.

# It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore

Thank you
Yao Jiewen

From: Zeng, Star
Sent: Wednesday, February 8, 2017 9:12 PM
To: Laszlo Ersek <lersek@redhat.com>; Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo <leo.duran@amd.com>; edk2-devel@ml01.01.org
Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>; Zeng, Star <star.zeng@intel.com>
Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

In fact, X64 DxeIplPeim does not refer PcdDxeIplSwitchToLongMode at all.

DxeIpl.inf:
[FeaturePcd.IA32]
  gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode      ## CONSUMES

As I remember, I did a draft patch below before for the discussion about how to determine DXE is 32BITs or 64BITs in title "[edk2] [PATCH v3 2/4] IntelFrameworkModulePkg: BdsDxe: only allocate below 4 GB if needed", I can't find the archive link any more.

---
 MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c | 5 +++++
 MdeModulePkg/MdeModulePkg.dec                  | 4 +++-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
index 6488880..348e084 100644
--- a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
+++ b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
@@ -43,6 +43,11 @@ HandOffToDxeCore (
   EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;

   //
+  // It should be FALSE for both PEI and DXE are 64-bit.
+  //
+  ASSERT (PcdGetBool (PcdDxeIplSwitchToLongMode) == FALSE);
+
+  //
   // Get Vector Hand-off Info PPI and build Guided HOB
   //
   Status = PeiServicesLocatePpi (
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index af7bcab..4a73f7b 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -712,8 +712,10 @@
   ## Indicates if DxeIpl should switch to long mode to enter DXE phase.
   #  It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore
   #  is built in firmware.<BR><BR>
+  #  And it should be FALSE for both PEI and DXE are 64-bit.
   #   TRUE  - DxeIpl will load a 64-bit DxeCore and switch to long mode to hand over to DxeCore.<BR>
-  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore.<BR>
+  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore,<BR>
+  #           or both PEI and DXE are 64-bit.<BR>
   # @Prompt DxeIpl switch to long mode.
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|TRUE|BOOLEAN|0x0001003b

--


Thanks,
Star
-----Original Message-----
From: Laszlo Ersek [mailto:lersek@redhat.com]
Sent: Thursday, February 9, 2017 3:48 AM
To: Yao, Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com>>; Duran, Leo <leo.duran@amd.com<mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
Cc: Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Justen, Jordan L <jordan.l.justen@intel.com<mailto:jordan.l.justen@intel.com>>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

On 02/08/17 19:20, Yao, Jiewen wrote:
> Got it.
>
>
>
> If the means of PcdDxeIplSwitchtoLongMode  is unclear, we may add more
> description to make it clear.
>
>
>
> If we believe "PcdDxeIplSwitchtoLongMode  == DXE is Long mode" as
> final conclusion, can we treat that as a bug and fix OVMF X64?

I don't know how to "fix" that. What is there to fix?

Flipping the PCD to TRUE in OVMF X64 would break OVMF X64, and likely OVMF Ia32X64 too. For two reasons:


(1) Toggling the PCD would alter the behavior of the DXE IPL PEIM and/or the DXE Core, and that behavior has never ever been tested with OVMF X64.

The PcdDxeIplSwitchToLongMode=FALSE setting in the X64 DSC dates back to:

  commit 8fa729a8b1401f01c6fd8ddbcab45e4a4904fa9a
  Author: lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
  Date:   Mon Mar 15 01:40:59 2010 +0000

      Merge the same type PCD section.

      git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10243 6f19259b-4bc3-4df7-8a09-765794883524

and before that, to:

  commit 49ba9447c92d6fca214476381107a180d08e59d1
  Author: jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
  Date:   Wed May 27 21:10:18 2009 +0000

      Add initial version of Open Virtual Machine Firmware (OVMF) platform.

      git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8398 6f19259b-4bc3-4df7-8a09-765794883524

In other words, OVMF X64 has always worked like this, since its inception.


(2) PEI code under OvmfPkg itself uses this PCD to identify a 32-bit DXE phase.

    //
    // If DXE is 32-bit, then we're done; PciBusDxe will degrade 64-bit MMIO
    // resources to 32-bit anyway. See DegradeResource() in
    // "PciResourceSupport.c".
    //
  #ifdef MDE_CPU_IA32
    if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
      return FirstNonAddress;
    }
  #endif

and

    //
    // If DXE is 32-bit, then just return the traditional 64 MB cap.
    //
  #ifdef MDE_CPU_IA32
    if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
      return SIZE_64MB;
    }
  #endif

Thanks
Laszlo

>
>
>
> Thank you
>
> Yao Jiewen
>
>
>
>
>
> *From:*Laszlo Ersek [mailto:lersek@redhat.com]
> *Sent:* Wednesday, February 8, 2017 9:52 AM
> *To:* Yao, Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com>>; Duran, Leo
> <leo.duran@amd.com<mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>;
> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> *Cc:* Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>; Singh, Brijesh
> <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Justen, Jordan L <jordan.l.justen@intel.com<mailto:jordan.l.justen@intel.com>>
> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
>
>
> On 02/08/17 18:27, Yao, Jiewen wrote:
>> I believe PcdDxeIplSwitchtoLongMode  == DXE is Long mode.
>>
>>
>>
>> See DEC description:
>>
>>   #  It is assumed that 64-bit DxeCore is built in firmware if it is
>> true; otherwise 32-bit DxeCore
>>
>>   #  is built in firmware.<BR><BR>
>
> Unfortunately, I have no historical context or background for this
> PCD; all I can say is that the X64 OVMF platform does not set the PCD.
>
> It enters long mode, and sets up page tables for the first 4GB of RAM,
> in SEC. Then SEC decompresses the flash contents to RAM, which covers
> both PEIFV and DXEFV. PEI runs from RAM.
>
> This is possible because on QEMU/KVM, there's no need to initialize
> RAM, thus only SEC runs from flash, in-place.
>
> Perhaps Jordan can provide more insight.
>
> If Brijesh and Leo would like to run the X64 OVMF platform as a SEV
> guest too, then this should be considered, in my opinion.
>
> One more comment below:
>
>>
>>
>>
>> And the code MdeModulePkg\Universal\Acpi\S3SaveStateDxe\AcpiS3ContextSave.c:
>>
>>
>>
>> BOOLEAN
>>
>> IsLongModeWakingVectorSupport (
>>
>>   IN EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*Facs
>>
>>   )
>>
>> {
>>
>>   if((Facs == NULL) ||
>>
>>       (Facs->Signature !=
>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ) {
>>
>>     //
>>
>>     // Something wrong with FACS.
>>
>>     //
>>
>>     returnFALSE;
>>
>>   }
>>
>>   if((Facs->Version ==
>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION) &&
>>
>>       ((Facs->Flags & EFI_ACPI_4_0_64BIT_WAKE_SUPPORTED_F) != 0)) {
>>
>>     //
>>
>>     // BIOS supports 64bit waking vector.
>>
>>     //
>>
>>     if(FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>>
>>       returnTRUE;
>>
>>     }
>>
>>   }
>>
>>   returnFALSE;
>>
>> }
>
> In practice, it's okay if the OVMF X64 platform is recognized as "not
> supporting a 64-bit waking vector for S3 resume". All the 64-bit guest
> OSes that I've tested with OVMF X64 (Linux, and the Windows 7 / 8 / 10
> families, both client and server) use a real mode (16-bit) waking
> vector, in practice.
>
> ... Actually, upon reviewing the above code more carefully, we don't
> even reach the FeaturePcdGet() call: the FACS that QEMU generates (and
> OVMF downloads and installs) corresponds to ACPI 1.0, that is,
> EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION.
>
> Thanks
> Laszlo
>
>
>>
>>
>>
>>
>>
>> Thank you
>>
>> Yao Jiewen
>>
>>
>>
>> *From:*edk2-devel [mailto:edk2-devel-bounces@lists.01.org] *On Behalf
>> Of *Yao, Jiewen
>> *Sent:* Wednesday, February 8, 2017 9:18 AM
>> *To:* Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com>>; Duran, Leo <leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>> <mailto:leo.duran@amd.com>>;
>> Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> <mailto:edk2-devel@ml01.01.org>
>> *Cc:* Tian, Feng <feng.tian@intel.com <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com>>>;
>> Singh, Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com>>>
>> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>>
>>
>>
>> Good reminder. I take back my word.
>>
>> In this case, we need consume PcdPteMemoryEncryptionAddressOrMask  in IA32 mode to build X64 paging.
>>
>> We need
>>
>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>> Sent: Wednesday, February 8, 2017 9:11 AM
>> To: Yao, Jiewen <jiewen.yao@intel.com
<mailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com>>;
> Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com%0b<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%0b>>>
> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com %0b>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>;
> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org> <mailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org>
>> Cc: Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com>>; Singh,
> Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com%0b<mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com%0b>>>
> <mailto:brijesh.singh@amd.com>>
>> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>>
>> On 02/08/17 18:05, Yao, Jiewen wrote:
>>> HI Leo
>>>
>>> Thanks to clarify that.
>>>
>>>
>>>
>>> If that is the case, do you think it will be better to limit this
>>> PCD to
>>> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
>>
>> Not sure if this is the best place to raise the following
>> observation, but it should do:
>>
>> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE
>> if PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
>> - both PEI and DXE are 32-bit, and
>> - both PEI and DXE are 64-bit.
>>
>> This doesn't necessarily invalidate anything said thus fair in the
>> thread, but the following statement from Leo:
>>
>>     The SEV feature requires 64-bit LongMode, so the
>>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
>>
>> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
>>
>> Thanks,
>> Laszlo
>>
>>>
>>>
>>>
>>> Thank you
>>>
>>> Yao Jiewen
>>>
>>>
>>>
>>> *From:*Duran, Leo [mailto:leo.duran@amd.com]
>>> *Sent:* Wednesday, February 8, 2017 9:00 AM
>>> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com
<mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com%0b>>
> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>;
> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com
<mailto:lersek@redhat.com%3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com%0b>>
> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Tian, Feng
>>> <feng.tian@intel.com<mailto:feng.tian@intel.com
<mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com%0b>>
> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>; Singh,
> Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com%0b>>
> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Yao,
>>> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
<mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com%0b>>
> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com>>>
>>> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>>
>>>
>>> Pease see reply below.
>>> Leo
>>>
>>>> -----Original Message-----
>>>> From: Zeng, Star [mailto:star.zeng@intel.com]
>>>> Sent: Tuesday, February 07, 2017 8:27 PM
>>>> To: Duran, Leo <leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %0b>>>>> %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com>>>>;
> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>> <mailto:edk2-devel@ml01.01.org>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b
<mailto:lersek@redhat.com%0b %0b>> <mailto:lersek@redhat.com%0b%0b>>
> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>>
> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com %0b>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b
<mailto:feng.tian@intel.com%0b %0b>> <mailto:feng.tian@intel.com%0b%0b>>
> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>>
> <mailto:feng.tian@intel.com>>;
>>>> Singh, Brijesh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b
<mailto:brijesh.singh@amd.com%0b %0b>> <mailto:brijesh.singh@amd.com%0b%0b>>
> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>>
> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com %0b>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b
<mailto:star.zeng@intel.com%0b %0b>> <mailto:star.zeng@intel.com%0b%0b>>
> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>>
> <mailto:star.zeng@intel.com>>;
>>>> Yao, Jiewen <jiewen.yao@intel.com
<mailto:jiewen.yao@intel.com %0b>>>>> <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
<mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com %0b>>>>> %3cmailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com
<mailto:jiewen.yao@intel.com %0b>> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com
> %3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com
<mailto:jiewen.yao@intel.com %0b>> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com
> %3cmailto:jiewen.yao@intel.com>>>>
>>>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>>>
>>>> Thanks,
>>>> Star
>>> [Duran, Leo]
>>> Hi Star,
>>> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>>>
>>> The SEV feature requires 64-bit LongMode, so the
>>> PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time, in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
>>>
>>>> -----Original Message-----
>>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf
>>>> Of Leo Duran
>>>> Sent: Wednesday, February 8, 2017 3:54 AM
>>>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>> <mailto:edk2-devel@ml01.01.org>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b
<mailto:lersek@redhat.com%0b %0b>> <mailto:lersek@redhat.com%0b%0b>>
> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>>
> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com %0b>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b
<mailto:feng.tian@intel.com%0b %0b>> <mailto:feng.tian@intel.com%0b%0b>>
> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>>
> <mailto:feng.tian@intel.com>>;
>>>> Brijesh Singh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b
<mailto:brijesh.singh@amd.com%0b %0b>> <mailto:brijesh.singh@amd.com%0b%0b>>
> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>>
> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com %0b>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b
<mailto:star.zeng@intel.com%0b %0b>> <mailto:star.zeng@intel.com%0b%0b>>
> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>>
> <mailto:star.zeng@intel.com>>;
>>>> Leo Duran <leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %0b>>>>> %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com>>>>
>>>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>> From: Brijesh Singh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com %0b>>>>> <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com %0b>>>>> %3cmailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com %0b>> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com
> %3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com %0b>> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com
> %3cmailto:brijesh.singh@amd.com>>>>
>>>>
>>>> This dynamic PCD holds the address mask for page table entries when
>>>> memory encryption is enabled on AMD processors supporting the
>>>> Secure Encrypted Virtualization (SEV) feature.
>>>>
>>>> Cc: Feng Tian <feng.tian@intel.com
<mailto:feng.tian@intel.com %0b>>>>> <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com
<mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com %0b>>>>> %3cmailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com
<mailto:feng.tian@intel.com %0b>> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com
> %3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com
<mailto:feng.tian@intel.com %0b>> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com
> %3cmailto:feng.tian@intel.com>>>>
>>>> Cc: Star Zeng <star.zeng@intel.com
<mailto:star.zeng@intel.com %0b>>>>> <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com
<mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com %0b>>>>> %3cmailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com
<mailto:star.zeng@intel.com %0b>> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com
> %3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com
<mailto:star.zeng@intel.com %0b>> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com
> %3cmailto:star.zeng@intel.com>>>>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com %0b>>>>> <mailto:lersek@redhat.com<mailto:lersek@redhat.com
<mailto:lersek@redhat.com%3cmailto:lersek@redhat.com %0b>>>>> %3cmailto:lersek@redhat.com
> <mailto:lersek@redhat.com
<mailto:lersek@redhat.com %0b>> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com
> %3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com
<mailto:lersek@redhat.com %0b>> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com
> %3cmailto:lersek@redhat.com>>>>
>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>> Signed-off-by: Leo Duran <leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %0b>>>>> %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com>>>>
>>>> ---
>>>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
>>>> ------
>>>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>>>
>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> index 2bc41be..d62bd9b 100644
>>>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> @@ -6,6 +6,8 @@
>>>>  #  needed to run the DXE Foundation.
>>>>  #
>>>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights
>>>> reserved.<BR>
>>>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>>> +#
>>>>  #  This program and the accompanying materials  #  are licensed
>>>> and made available under the terms and conditions of the BSD
>>>> License  #  which accompanies this distribution.  The full text of
>>>> the license may be found at @@ -111,7 +113,8 @@ [FeaturePcd]
>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
>>>> CONSUMES
>>>>
>>>>  [Pcd.IA32,Pcd.X64]
>>>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>>>> SOMETIMES_CONSUMES
>>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>>>> SOMETIMES_CONSUMES
>>>> +
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>> ask    ## CONSUMES
>>>>
>>>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>>>> SOMETIMES_CONSUMES
>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> index 790f6ab..2c52389 100644
>>>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> @@ -16,6 +16,8 @@
>>>>      3) IA-32 Intel(R) Architecture Software Developer's Manual
>>>> Volume 3:System Programmer's Guide, Intel
>>>>
>>>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights
>>>> reserved.<BR>
>>>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>>> +
>>>>  This program and the accompanying materials  are licensed and made
>>>> available under the terms and conditions of the BSD License  which
>>>> accompanies this distribution.  The full text of the license may be
>>>> found at @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>>>    //
>>>>    // Fill in 2M page entry.
>>>>    //
>>>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
>>>> IA32_PG_RW;
>>>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>
>>>>    PhysicalAddress4K = PhysicalAddress;
>>>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>>>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>>>> SIZE_4KB) {
>>>>      //
>>>>      // Fill in the Page Table entries
>>>>      //
>>>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>>>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>      PageTableEntry->Bits.ReadWrite = 1;
>>>>      PageTableEntry->Bits.Present = 1;
>>>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K <
>>>> StackBase +
>>>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>>>    //
>>>>    // Fill in 1G page entry.
>>>>    //
>>>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
>>>> IA32_PG_RW;
>>>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>
>>>>    PhysicalAddress2M = PhysicalAddress;
>>>>    for (IndexOfPageDirectoryEntries = 0;
>>>> IndexOfPageDirectoryEntries < 512;
>>>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++,
>>>> IndexOfPageDirectoryEntries++PhysicalAddress2M
>>>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>>>        //
>>>>        // Fill in the Page Directory entries
>>>>        //
>>>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>>>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>        PageDirectoryEntry->Bits.Present = 1;
>>>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
>>>> CreateIdentityMappingPageTables (
>>>>      //
>>>>      // Make a PML4 Entry
>>>>      //
>>>> -    PageMapLevel4Entry->Uint64 =
>>>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>>>> +    PageMapLevel4Entry->Uint64 =
>>>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>>>      PageMapLevel4Entry->Bits.Present = 1;
>>>>
>>>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>>>            //
>>>>            // Fill in the Page Directory entries
>>>>            //
>>>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>>>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>>>            PageDirectory1GEntry->Bits.Present = 1;
>>>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7
>>>> @@ CreateIdentityMappingPageTables (
>>>>          //
>>>>          // Fill in a Page Directory Pointer Entries
>>>>          //
>>>> -        PageDirectoryPointerEntry->Uint64 =
>>>> (UINT64)(UINTN)PageDirectoryEntry;
>>>> +        PageDirectoryPointerEntry->Uint64 =
>>>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>>>
>>>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>>>              //
>>>>              // Fill in the Page Directory entries
>>>>              //
>>>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>>>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>              PageDirectoryEntry->Bits.Present = 1;
>>>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
>>>> a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
>>>> index 273cd7e..207384f 100644
>>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>>> @@ -6,6 +6,8 @@
>>>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights
>>>> reserved.<BR>  # Copyright (c) 2016, Linaro Ltd. All rights
>>>> reserved.<BR>  # (C) Copyright 2016 Hewlett Packard Enterprise
>>>> Development LP<BR>
>>>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>>  # This program and the accompanying materials are licensed and
>>>> made available under  # the terms and conditions of the BSD License
>>>> that accompanies this distribution.
>>>>  # The full text of the license may be found at @@ -1738,5 +1740,11
>>>> @@ [PcdsDynamic, PcdsDynamicEx]
>>>>    # @Prompt If there is any test key used by the platform.
>>>>
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>>>> 0030003
>>>>
>>>> +  ## This dynamic PCD holds the address mask for page table
>>>> + entries when memory encryption is  #  enabled on AMD processors
>>>> + supporting the
>>>> Secure Encrypted Virtualization (SEV) feature.
>>>> +  #  This mask should be applied when creating 1:1 virtual to
>>>> + physical
>>>> mapping tables.
>>>> +  #
>>>> +
>>>> +
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>> ask|0x0
>>>> + |UINT64|0x00030004
>>>> +
>>>>  [UserExtensions.TianoCore."ExtraFiles"]
>>>>    MdeModulePkgExtra.uni
>>>> --
>>>> 1.9.1
>>>>
>>>> _______________________________________________
>>>> edk2-devel mailing list
>>>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>
> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>
>> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>>
>> <mailto:edk2-devel@lists.01.org>
>>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>>
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
> <mailto:edk2-devel@lists.01.org> <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Zeng, Star 7 years, 8 months ago
Stick to current comments and code, OvmfPkg X64 has bug? :)

PCD comments:
# It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore

Code pieces in S3ResumePei, S3SaveStateDxe, SmmLockBoxPeiLib, etc:
// Both BIOS and OS wants 64bit vector
if (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
  return TRUE;
}

//
// BIOS supports 64bit waking vector.
//
if(FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
  returnTRUE;
}

if ((sizeof(UINTN) == sizeof(UINT32)) && (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) ) {
  //
 // 32 PEI + 64 DXE
 //


According to above, the patch I drafted is wrong.

Thanks,
Star
From: Yao, Jiewen
Sent: Thursday, February 9, 2017 1:23 PM
To: Zeng, Star <star.zeng@intel.com>; Laszlo Ersek <lersek@redhat.com>; Duran, Leo <leo.duran@amd.com>; edk2-devel@ml01.01.org
Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

I suggest we evaluate *all* usages of PcdDxeIplSwitchToLongMode because this is an incompatible change.

# It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore

Thank you
Yao Jiewen

From: Zeng, Star
Sent: Wednesday, February 8, 2017 9:12 PM
To: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Yao, Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com>>; Duran, Leo <leo.duran@amd.com<mailto:leo.duran@amd.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
Cc: Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Justen, Jordan L <jordan.l.justen@intel.com<mailto:jordan.l.justen@intel.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>
Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

In fact, X64 DxeIplPeim does not refer PcdDxeIplSwitchToLongMode at all.

DxeIpl.inf:
[FeaturePcd.IA32]
  gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode      ## CONSUMES

As I remember, I did a draft patch below before for the discussion about how to determine *PEI* is 32BITs or 64BITs in title "[edk2] [PATCH v3 2/4] IntelFrameworkModulePkg: BdsDxe: only allocate below 4 GB if needed", I can't find the archive link any more.

---
 MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c | 5 +++++
 MdeModulePkg/MdeModulePkg.dec                  | 4 +++-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
index 6488880..348e084 100644
--- a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
+++ b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
@@ -43,6 +43,11 @@ HandOffToDxeCore (
   EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;

   //
+  // It should be FALSE for both PEI and DXE are 64-bit.
+  //
+  ASSERT (PcdGetBool (PcdDxeIplSwitchToLongMode) == FALSE);
+
+  //
   // Get Vector Hand-off Info PPI and build Guided HOB
   //
   Status = PeiServicesLocatePpi (
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index af7bcab..4a73f7b 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -712,8 +712,10 @@
   ## Indicates if DxeIpl should switch to long mode to enter DXE phase.
   #  It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore
   #  is built in firmware.<BR><BR>
+  #  And it should be FALSE for both PEI and DXE are 64-bit.
   #   TRUE  - DxeIpl will load a 64-bit DxeCore and switch to long mode to hand over to DxeCore.<BR>
-  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore.<BR>
+  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore,<BR>
+  #           or both PEI and DXE are 64-bit.<BR>
   # @Prompt DxeIpl switch to long mode.
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|TRUE|BOOLEAN|0x0001003b

--


Thanks,
Star
-----Original Message-----
From: Laszlo Ersek [mailto:lersek@redhat.com]
Sent: Thursday, February 9, 2017 3:48 AM
To: Yao, Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com>>; Duran, Leo <leo.duran@amd.com<mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
Cc: Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Justen, Jordan L <jordan.l.justen@intel.com<mailto:jordan.l.justen@intel.com>>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

On 02/08/17 19:20, Yao, Jiewen wrote:
> Got it.
>
>
>
> If the means of PcdDxeIplSwitchtoLongMode  is unclear, we may add more
> description to make it clear.
>
>
>
> If we believe "PcdDxeIplSwitchtoLongMode  == DXE is Long mode" as
> final conclusion, can we treat that as a bug and fix OVMF X64?

I don't know how to "fix" that. What is there to fix?

Flipping the PCD to TRUE in OVMF X64 would break OVMF X64, and likely OVMF Ia32X64 too. For two reasons:


(1) Toggling the PCD would alter the behavior of the DXE IPL PEIM and/or the DXE Core, and that behavior has never ever been tested with OVMF X64.

The PcdDxeIplSwitchToLongMode=FALSE setting in the X64 DSC dates back to:

  commit 8fa729a8b1401f01c6fd8ddbcab45e4a4904fa9a
  Author: lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
  Date:   Mon Mar 15 01:40:59 2010 +0000

      Merge the same type PCD section.

      git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10243 6f19259b-4bc3-4df7-8a09-765794883524

and before that, to:

  commit 49ba9447c92d6fca214476381107a180d08e59d1
  Author: jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
  Date:   Wed May 27 21:10:18 2009 +0000

      Add initial version of Open Virtual Machine Firmware (OVMF) platform.

      git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8398 6f19259b-4bc3-4df7-8a09-765794883524

In other words, OVMF X64 has always worked like this, since its inception.


(2) PEI code under OvmfPkg itself uses this PCD to identify a 32-bit DXE phase.

    //
    // If DXE is 32-bit, then we're done; PciBusDxe will degrade 64-bit MMIO
    // resources to 32-bit anyway. See DegradeResource() in
    // "PciResourceSupport.c".
    //
  #ifdef MDE_CPU_IA32
    if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
      return FirstNonAddress;
    }
  #endif

and

    //
    // If DXE is 32-bit, then just return the traditional 64 MB cap.
    //
  #ifdef MDE_CPU_IA32
    if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
      return SIZE_64MB;
    }
  #endif

Thanks
Laszlo

>
>
>
> Thank you
>
> Yao Jiewen
>
>
>
>
>
> *From:*Laszlo Ersek [mailto:lersek@redhat.com]
> *Sent:* Wednesday, February 8, 2017 9:52 AM
> *To:* Yao, Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com>>; Duran, Leo
> <leo.duran@amd.com<mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>;
> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> *Cc:* Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>; Singh, Brijesh
> <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Justen, Jordan L <jordan.l.justen@intel.com<mailto:jordan.l.justen@intel.com>>
> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
>
>
> On 02/08/17 18:27, Yao, Jiewen wrote:
>> I believe PcdDxeIplSwitchtoLongMode  == DXE is Long mode.
>>
>>
>>
>> See DEC description:
>>
>>   #  It is assumed that 64-bit DxeCore is built in firmware if it is
>> true; otherwise 32-bit DxeCore
>>
>>   #  is built in firmware.<BR><BR>
>
> Unfortunately, I have no historical context or background for this
> PCD; all I can say is that the X64 OVMF platform does not set the PCD.
>
> It enters long mode, and sets up page tables for the first 4GB of RAM,
> in SEC. Then SEC decompresses the flash contents to RAM, which covers
> both PEIFV and DXEFV. PEI runs from RAM.
>
> This is possible because on QEMU/KVM, there's no need to initialize
> RAM, thus only SEC runs from flash, in-place.
>
> Perhaps Jordan can provide more insight.
>
> If Brijesh and Leo would like to run the X64 OVMF platform as a SEV
> guest too, then this should be considered, in my opinion.
>
> One more comment below:
>
>>
>>
>>
>> And the code MdeModulePkg\Universal\Acpi\S3SaveStateDxe\AcpiS3ContextSave.c:
>>
>>
>>
>> BOOLEAN
>>
>> IsLongModeWakingVectorSupport (
>>
>>   IN EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*Facs
>>
>>   )
>>
>> {
>>
>>   if((Facs == NULL) ||
>>
>>       (Facs->Signature !=
>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ) {
>>
>>     //
>>
>>     // Something wrong with FACS.
>>
>>     //
>>
>>     returnFALSE;
>>
>>   }
>>
>>   if((Facs->Version ==
>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION) &&
>>
>>       ((Facs->Flags & EFI_ACPI_4_0_64BIT_WAKE_SUPPORTED_F) != 0)) {
>>
>>     //
>>
>>     // BIOS supports 64bit waking vector.
>>
>>     //
>>
>>     if(FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>>
>>       returnTRUE;
>>
>>     }
>>
>>   }
>>
>>   returnFALSE;
>>
>> }
>
> In practice, it's okay if the OVMF X64 platform is recognized as "not
> supporting a 64-bit waking vector for S3 resume". All the 64-bit guest
> OSes that I've tested with OVMF X64 (Linux, and the Windows 7 / 8 / 10
> families, both client and server) use a real mode (16-bit) waking
> vector, in practice.
>
> ... Actually, upon reviewing the above code more carefully, we don't
> even reach the FeaturePcdGet() call: the FACS that QEMU generates (and
> OVMF downloads and installs) corresponds to ACPI 1.0, that is,
> EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION.
>
> Thanks
> Laszlo
>
>
>>
>>
>>
>>
>>
>> Thank you
>>
>> Yao Jiewen
>>
>>
>>
>> *From:*edk2-devel [mailto:edk2-devel-bounces@lists.01.org] *On Behalf
>> Of *Yao, Jiewen
>> *Sent:* Wednesday, February 8, 2017 9:18 AM
>> *To:* Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com>>; Duran, Leo <leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>> <mailto:leo.duran@amd.com>>;
>> Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> <mailto:edk2-devel@ml01.01.org>
>> *Cc:* Tian, Feng <feng.tian@intel.com <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com>>>;
>> Singh, Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com>>>
>> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>>
>>
>>
>> Good reminder. I take back my word.
>>
>> In this case, we need consume PcdPteMemoryEncryptionAddressOrMask  in IA32 mode to build X64 paging.
>>
>> We need
>>
>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>> Sent: Wednesday, February 8, 2017 9:11 AM
>> To: Yao, Jiewen <jiewen.yao@intel.com
<mailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com>>;
> Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com%0b<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%0b>>>
> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com %0b>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>;
> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org> <mailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org>
>> Cc: Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com>>; Singh,
> Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com%0b<mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com%0b>>>
> <mailto:brijesh.singh@amd.com>>
>> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>>
>> On 02/08/17 18:05, Yao, Jiewen wrote:
>>> HI Leo
>>>
>>> Thanks to clarify that.
>>>
>>>
>>>
>>> If that is the case, do you think it will be better to limit this
>>> PCD to
>>> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
>>
>> Not sure if this is the best place to raise the following
>> observation, but it should do:
>>
>> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE
>> if PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
>> - both PEI and DXE are 32-bit, and
>> - both PEI and DXE are 64-bit.
>>
>> This doesn't necessarily invalidate anything said thus fair in the
>> thread, but the following statement from Leo:
>>
>>     The SEV feature requires 64-bit LongMode, so the
>>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
>>
>> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
>>
>> Thanks,
>> Laszlo
>>
>>>
>>>
>>>
>>> Thank you
>>>
>>> Yao Jiewen
>>>
>>>
>>>
>>> *From:*Duran, Leo [mailto:leo.duran@amd.com]
>>> *Sent:* Wednesday, February 8, 2017 9:00 AM
>>> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com
<mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com%0b>>
> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>;
> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com
<mailto:lersek@redhat.com%3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com%0b>>
> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Tian, Feng
>>> <feng.tian@intel.com<mailto:feng.tian@intel.com
<mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com%0b>>
> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>; Singh,
> Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com%0b>>
> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Yao,
>>> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
<mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com%0b>>
> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com>>>
>>> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>>
>>>
>>> Pease see reply below.
>>> Leo
>>>
>>>> -----Original Message-----
>>>> From: Zeng, Star [mailto:star.zeng@intel.com]
>>>> Sent: Tuesday, February 07, 2017 8:27 PM
>>>> To: Duran, Leo <leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %0b>>>>> %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com>>>>;
> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>> <mailto:edk2-devel@ml01.01.org>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b
<mailto:lersek@redhat.com%0b %0b>> <mailto:lersek@redhat.com%0b%0b>>
> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>>
> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com %0b>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b
<mailto:feng.tian@intel.com%0b %0b>> <mailto:feng.tian@intel.com%0b%0b>>
> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>>
> <mailto:feng.tian@intel.com>>;
>>>> Singh, Brijesh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b
<mailto:brijesh.singh@amd.com%0b %0b>> <mailto:brijesh.singh@amd.com%0b%0b>>
> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>>
> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com %0b>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b
<mailto:star.zeng@intel.com%0b %0b>> <mailto:star.zeng@intel.com%0b%0b>>
> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>>
> <mailto:star.zeng@intel.com>>;
>>>> Yao, Jiewen <jiewen.yao@intel.com
<mailto:jiewen.yao@intel.com %0b>>>>> <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
<mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com %0b>>>>> %3cmailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com
<mailto:jiewen.yao@intel.com %0b>> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com
> %3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com
<mailto:jiewen.yao@intel.com %0b>> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com
> %3cmailto:jiewen.yao@intel.com>>>>
>>>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>>>
>>>> Thanks,
>>>> Star
>>> [Duran, Leo]
>>> Hi Star,
>>> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>>>
>>> The SEV feature requires 64-bit LongMode, so the
>>> PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time, in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
>>>
>>>> -----Original Message-----
>>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf
>>>> Of Leo Duran
>>>> Sent: Wednesday, February 8, 2017 3:54 AM
>>>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>> <mailto:edk2-devel@ml01.01.org>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b
<mailto:lersek@redhat.com%0b %0b>> <mailto:lersek@redhat.com%0b%0b>>
> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>>
> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com %0b>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b
<mailto:feng.tian@intel.com%0b %0b>> <mailto:feng.tian@intel.com%0b%0b>>
> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>>
> <mailto:feng.tian@intel.com>>;
>>>> Brijesh Singh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b
<mailto:brijesh.singh@amd.com%0b %0b>> <mailto:brijesh.singh@amd.com%0b%0b>>
> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>>
> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com %0b>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b
<mailto:star.zeng@intel.com%0b %0b>> <mailto:star.zeng@intel.com%0b%0b>>
> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>>
> <mailto:star.zeng@intel.com>>;
>>>> Leo Duran <leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %0b>>>>> %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com>>>>
>>>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>> From: Brijesh Singh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com %0b>>>>> <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com %0b>>>>> %3cmailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com %0b>> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com
> %3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com %0b>> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com
> %3cmailto:brijesh.singh@amd.com>>>>
>>>>
>>>> This dynamic PCD holds the address mask for page table entries when
>>>> memory encryption is enabled on AMD processors supporting the
>>>> Secure Encrypted Virtualization (SEV) feature.
>>>>
>>>> Cc: Feng Tian <feng.tian@intel.com
<mailto:feng.tian@intel.com %0b>>>>> <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com
<mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com %0b>>>>> %3cmailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com
<mailto:feng.tian@intel.com %0b>> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com
> %3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com
<mailto:feng.tian@intel.com %0b>> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com
> %3cmailto:feng.tian@intel.com>>>>
>>>> Cc: Star Zeng <star.zeng@intel.com
<mailto:star.zeng@intel.com %0b>>>>> <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com
<mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com %0b>>>>> %3cmailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com
<mailto:star.zeng@intel.com %0b>> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com
> %3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com
<mailto:star.zeng@intel.com %0b>> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com
> %3cmailto:star.zeng@intel.com>>>>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com %0b>>>>> <mailto:lersek@redhat.com<mailto:lersek@redhat.com
<mailto:lersek@redhat.com%3cmailto:lersek@redhat.com %0b>>>>> %3cmailto:lersek@redhat.com
> <mailto:lersek@redhat.com
<mailto:lersek@redhat.com %0b>> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com
> %3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com
<mailto:lersek@redhat.com %0b>> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com
> %3cmailto:lersek@redhat.com>>>>
>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>> Signed-off-by: Leo Duran <leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %0b>>>>> %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com
<mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com>>>>
>>>> ---
>>>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
>>>> ------
>>>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>>>
>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> index 2bc41be..d62bd9b 100644
>>>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> @@ -6,6 +6,8 @@
>>>>  #  needed to run the DXE Foundation.
>>>>  #
>>>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights
>>>> reserved.<BR>
>>>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>>> +#
>>>>  #  This program and the accompanying materials  #  are licensed
>>>> and made available under the terms and conditions of the BSD
>>>> License  #  which accompanies this distribution.  The full text of
>>>> the license may be found at @@ -111,7 +113,8 @@ [FeaturePcd]
>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
>>>> CONSUMES
>>>>
>>>>  [Pcd.IA32,Pcd.X64]
>>>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>>>> SOMETIMES_CONSUMES
>>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>>>> SOMETIMES_CONSUMES
>>>> +
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>> ask    ## CONSUMES
>>>>
>>>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>>>> SOMETIMES_CONSUMES
>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> index 790f6ab..2c52389 100644
>>>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> @@ -16,6 +16,8 @@
>>>>      3) IA-32 Intel(R) Architecture Software Developer's Manual
>>>> Volume 3:System Programmer's Guide, Intel
>>>>
>>>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights
>>>> reserved.<BR>
>>>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>>> +
>>>>  This program and the accompanying materials  are licensed and made
>>>> available under the terms and conditions of the BSD License  which
>>>> accompanies this distribution.  The full text of the license may be
>>>> found at @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>>>    //
>>>>    // Fill in 2M page entry.
>>>>    //
>>>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
>>>> IA32_PG_RW;
>>>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>
>>>>    PhysicalAddress4K = PhysicalAddress;
>>>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>>>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>>>> SIZE_4KB) {
>>>>      //
>>>>      // Fill in the Page Table entries
>>>>      //
>>>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>>>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>      PageTableEntry->Bits.ReadWrite = 1;
>>>>      PageTableEntry->Bits.Present = 1;
>>>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K <
>>>> StackBase +
>>>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>>>    //
>>>>    // Fill in 1G page entry.
>>>>    //
>>>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
>>>> IA32_PG_RW;
>>>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>
>>>>    PhysicalAddress2M = PhysicalAddress;
>>>>    for (IndexOfPageDirectoryEntries = 0;
>>>> IndexOfPageDirectoryEntries < 512;
>>>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++,
>>>> IndexOfPageDirectoryEntries++PhysicalAddress2M
>>>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>>>        //
>>>>        // Fill in the Page Directory entries
>>>>        //
>>>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>>>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>        PageDirectoryEntry->Bits.Present = 1;
>>>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
>>>> CreateIdentityMappingPageTables (
>>>>      //
>>>>      // Make a PML4 Entry
>>>>      //
>>>> -    PageMapLevel4Entry->Uint64 =
>>>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>>>> +    PageMapLevel4Entry->Uint64 =
>>>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>>>      PageMapLevel4Entry->Bits.Present = 1;
>>>>
>>>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>>>            //
>>>>            // Fill in the Page Directory entries
>>>>            //
>>>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>>>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>>>            PageDirectory1GEntry->Bits.Present = 1;
>>>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7
>>>> @@ CreateIdentityMappingPageTables (
>>>>          //
>>>>          // Fill in a Page Directory Pointer Entries
>>>>          //
>>>> -        PageDirectoryPointerEntry->Uint64 =
>>>> (UINT64)(UINTN)PageDirectoryEntry;
>>>> +        PageDirectoryPointerEntry->Uint64 =
>>>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>>>
>>>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>>>              //
>>>>              // Fill in the Page Directory entries
>>>>              //
>>>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>>>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>              PageDirectoryEntry->Bits.Present = 1;
>>>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
>>>> a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
>>>> index 273cd7e..207384f 100644
>>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>>> @@ -6,6 +6,8 @@
>>>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights
>>>> reserved.<BR>  # Copyright (c) 2016, Linaro Ltd. All rights
>>>> reserved.<BR>  # (C) Copyright 2016 Hewlett Packard Enterprise
>>>> Development LP<BR>
>>>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>>  # This program and the accompanying materials are licensed and
>>>> made available under  # the terms and conditions of the BSD License
>>>> that accompanies this distribution.
>>>>  # The full text of the license may be found at @@ -1738,5 +1740,11
>>>> @@ [PcdsDynamic, PcdsDynamicEx]
>>>>    # @Prompt If there is any test key used by the platform.
>>>>
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>>>> 0030003
>>>>
>>>> +  ## This dynamic PCD holds the address mask for page table
>>>> + entries when memory encryption is  #  enabled on AMD processors
>>>> + supporting the
>>>> Secure Encrypted Virtualization (SEV) feature.
>>>> +  #  This mask should be applied when creating 1:1 virtual to
>>>> + physical
>>>> mapping tables.
>>>> +  #
>>>> +
>>>> +
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>> ask|0x0
>>>> + |UINT64|0x00030004
>>>> +
>>>>  [UserExtensions.TianoCore."ExtraFiles"]
>>>>    MdeModulePkgExtra.uni
>>>> --
>>>> 1.9.1
>>>>
>>>> _______________________________________________
>>>> edk2-devel mailing list
>>>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>
> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>
>> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>>
>> <mailto:edk2-devel@lists.01.org>
>>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>>
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
> <mailto:edk2-devel@lists.01.org> <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Laszlo Ersek 7 years, 8 months ago
On 02/09/17 06:56, Zeng, Star wrote:
> Stick to current comments and code, OvmfPkg X64 has bug? J
> 
>  
> 
> PCD comments:
> 
> #
> It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore
> 
>  
> 
> Code pieces in S3ResumePei, S3SaveStateDxe, SmmLockBoxPeiLib, etc:
> 
> // Both BIOS and OS wants 64bit vector
> 
> if (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
> 
>   return TRUE;
> 
> }
> 
>  
> 
> //
> 
> // BIOS supports 64bit waking vector.
> //
> 
> if(FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>   returnTRUE;
> 
> }
> 
>  
> 
> if ((sizeof(UINTN) == sizeof(UINT32)) && (FeaturePcdGet
> (PcdDxeIplSwitchToLongMode)) ) {
> 
>   //
> 
>  // 32 PEI + 64 DXE
> 
>  //
> 
>  
> 
>  
> 
> According to above, the patch I drafted is wrong.

That's too bad, because I agreed with it. :(

I can't start working on this right now, but if you guys think it's a
big problem, please file an OvmfPkg BZ, and we'll have to audit all uses
of PcdDxeIplSwitchToLongMode, to see what might break if we flip it to
TRUE for OVMF X64.

Thanks
Laszlo

> 
>  
> 
> Thanks,
> 
> Star
> 
> *From:*Yao, Jiewen
> *Sent:* Thursday, February 9, 2017 1:23 PM
> *To:* Zeng, Star <star.zeng@intel.com>; Laszlo Ersek
> <lersek@redhat.com>; Duran, Leo <leo.duran@amd.com>; edk2-devel@ml01.01.org
> *Cc:* Tian, Feng <feng.tian@intel.com>; Singh, Brijesh
> <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
> 
>  
> 
> I suggest we evaluate **all** usages of PcdDxeIplSwitchToLongModebecause
> this is an incompatible change.
> 
>  
> 
> #
> It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore
> 
>  
> 
> Thank you
> 
> Yao Jiewen
> 
>  
> 
> *From:*Zeng, Star
> *Sent:* Wednesday, February 8, 2017 9:12 PM
> *To:* Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com>>; Yao,
> Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com>>; Duran, Leo
> <leo.duran@amd.com <mailto:leo.duran@amd.com>>; edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org>
> *Cc:* Tian, Feng <feng.tian@intel.com <mailto:feng.tian@intel.com>>;
> Singh, Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com>>;
> Justen, Jordan L <jordan.l.justen@intel.com
> <mailto:jordan.l.justen@intel.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com>>
> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
> 
>  
> 
> In fact, X64 DxeIplPeim does not refer PcdDxeIplSwitchToLongMode at all.
> 
> DxeIpl.inf:
> [FeaturePcd.IA32]
>   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode      ## CONSUMES
> 
> As I remember, I did a draft patch below before for the discussion about how to determine *PEI* is 32BITs or 64BITs in title "[edk2] [PATCH v3 2/4] IntelFrameworkModulePkg: BdsDxe: only allocate below 4 GB if needed", I can't find the archive link any more.
> 
> ---
>  MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c | 5 +++++
>  MdeModulePkg/MdeModulePkg.dec                  | 4 +++-
>  2 files changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
> index 6488880..348e084 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
> @@ -43,6 +43,11 @@ HandOffToDxeCore (
>    EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;
>  
>    //
> +  // It should be FALSE for both PEI and DXE are 64-bit.
> +  //
> +  ASSERT (PcdGetBool (PcdDxeIplSwitchToLongMode) == FALSE);
> +
> +  //
>    // Get Vector Hand-off Info PPI and build Guided HOB
>    //
>    Status = PeiServicesLocatePpi (
> diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
> index af7bcab..4a73f7b 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -712,8 +712,10 @@
>    ## Indicates if DxeIpl should switch to long mode to enter DXE phase.
>    #  It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore
>    #  is built in firmware.<BR><BR>
> +  #  And it should be FALSE for both PEI and DXE are 64-bit.
>    #   TRUE  - DxeIpl will load a 64-bit DxeCore and switch to long mode to hand over to DxeCore.<BR>
> -  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore.<BR>
> +  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore,<BR>
> +  #           or both PEI and DXE are 64-bit.<BR>
>    # @Prompt DxeIpl switch to long mode.
>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|TRUE|BOOLEAN|0x0001003b
>  
> --
> 
> 
> Thanks,
> Star
> -----Original Message-----
> From: Laszlo Ersek [mailto:lersek@redhat.com] 
> Sent: Thursday, February 9, 2017 3:48 AM
> To: Yao, Jiewen <jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com>>; Duran, Leo <leo.duran@amd.com
> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org>
> Cc: Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com>>; Justen, Jordan L <jordan.l.justen@intel.com
> <mailto:jordan.l.justen@intel.com>>
> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
> 
> On 02/08/17 19:20, Yao, Jiewen wrote:
>> Got it.
>> 
>>  
>> 
>> If the means of PcdDxeIplSwitchtoLongMode  is unclear, we may add more 
>> description to make it clear.
>> 
>>  
>> 
>> If we believe “PcdDxeIplSwitchtoLongMode  == DXE is Long mode” as 
>> final conclusion, can we treat that as a bug and fix OVMF X64?
> 
> I don't know how to "fix" that. What is there to fix?
> 
> Flipping the PCD to TRUE in OVMF X64 would break OVMF X64, and likely OVMF Ia32X64 too. For two reasons:
> 
> 
> (1) Toggling the PCD would alter the behavior of the DXE IPL PEIM and/or the DXE Core, and that behavior has never ever been tested with OVMF X64.
> 
> The PcdDxeIplSwitchToLongMode=FALSE setting in the X64 DSC dates back to:
> 
>   commit 8fa729a8b1401f01c6fd8ddbcab45e4a4904fa9a
>   Author: lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
>   Date:   Mon Mar 15 01:40:59 2010 +0000
> 
>       Merge the same type PCD section.
> 
>       git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10243 6f19259b-4bc3-4df7-8a09-765794883524
> 
> and before that, to:
> 
>   commit 49ba9447c92d6fca214476381107a180d08e59d1
>   Author: jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
>   Date:   Wed May 27 21:10:18 2009 +0000
> 
>       Add initial version of Open Virtual Machine Firmware (OVMF) platform.
> 
>       git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8398 6f19259b-4bc3-4df7-8a09-765794883524
> 
> In other words, OVMF X64 has always worked like this, since its inception.
> 
> 
> (2) PEI code under OvmfPkg itself uses this PCD to identify a 32-bit DXE phase.
> 
>     //
>     // If DXE is 32-bit, then we're done; PciBusDxe will degrade 64-bit MMIO
>     // resources to 32-bit anyway. See DegradeResource() in
>     // "PciResourceSupport.c".
>     //
>   #ifdef MDE_CPU_IA32
>     if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>       return FirstNonAddress;
>     }
>   #endif
> 
> and
> 
>     //
>     // If DXE is 32-bit, then just return the traditional 64 MB cap.
>     //
>   #ifdef MDE_CPU_IA32
>     if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>       return SIZE_64MB;
>     }
>   #endif
> 
> Thanks
> Laszlo
> 
>> 
>>  
>> 
>> Thank you
>> 
>> Yao Jiewen
>> 
>>  
>> 
>>  
>> 
>> *From:*Laszlo Ersek [mailto:lersek@redhat.com]
>> *Sent:* Wednesday, February 8, 2017 9:52 AM
>> *To:* Yao, Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com>>; Duran, Leo 
>> <leo.duran@amd.com
> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com>>; 
>> edk2-devel@ml01.01.org <mailto:edk2-devel@ml01.01.org>
>> *Cc:* Tian, Feng <feng.tian@intel.com <mailto:feng.tian@intel.com>>; Singh, Brijesh 
>> <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com>>; Justen, Jordan L <jordan.l.justen@intel.com
> <mailto:jordan.l.justen@intel.com>>
>> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>> PcdPteMemoryEncryptionAddressOrMask
>> 
>>  
>> 
>> On 02/08/17 18:27, Yao, Jiewen wrote:
>>> I believe PcdDxeIplSwitchtoLongMode  == DXE is Long mode.
>>> 
>>>  
>>> 
>>> See DEC description:
>>> 
>>>   #  It is assumed that 64-bit DxeCore is built in firmware if it is 
>>> true; otherwise 32-bit DxeCore
>>> 
>>>   #  is built in firmware.<BR><BR>
>> 
>> Unfortunately, I have no historical context or background for this 
>> PCD; all I can say is that the X64 OVMF platform does not set the PCD.
>> 
>> It enters long mode, and sets up page tables for the first 4GB of RAM, 
>> in SEC. Then SEC decompresses the flash contents to RAM, which covers 
>> both PEIFV and DXEFV. PEI runs from RAM.
>> 
>> This is possible because on QEMU/KVM, there's no need to initialize 
>> RAM, thus only SEC runs from flash, in-place.
>> 
>> Perhaps Jordan can provide more insight.
>> 
>> If Brijesh and Leo would like to run the X64 OVMF platform as a SEV 
>> guest too, then this should be considered, in my opinion.
>> 
>> One more comment below:
>> 
>>> 
>>>  
>>> 
>>> And the code MdeModulePkg\Universal\Acpi\S3SaveStateDxe\AcpiS3ContextSave.c:
>>> 
>>>  
>>> 
>>> BOOLEAN
>>> 
>>> IsLongModeWakingVectorSupport (
>>> 
>>>   IN EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*Facs
>>> 
>>>   )
>>> 
>>> {
>>> 
>>>   if((Facs == NULL) ||
>>> 
>>>       (Facs->Signature !=
>>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ) {
>>> 
>>>     //
>>> 
>>>     // Something wrong with FACS.
>>> 
>>>     //
>>> 
>>>     returnFALSE;
>>> 
>>>   }
>>> 
>>>   if((Facs->Version ==
>>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION) &&
>>> 
>>>       ((Facs->Flags & EFI_ACPI_4_0_64BIT_WAKE_SUPPORTED_F) != 0)) {
>>> 
>>>     //
>>> 
>>>     // BIOS supports 64bit waking vector.
>>> 
>>>     //
>>> 
>>>     if(FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>>> 
>>>       returnTRUE;
>>> 
>>>     }
>>> 
>>>   }
>>> 
>>>   returnFALSE;
>>> 
>>> }
>> 
>> In practice, it's okay if the OVMF X64 platform is recognized as "not 
>> supporting a 64-bit waking vector for S3 resume". All the 64-bit guest 
>> OSes that I've tested with OVMF X64 (Linux, and the Windows 7 / 8 / 10 
>> families, both client and server) use a real mode (16-bit) waking 
>> vector, in practice.
>> 
>> ... Actually, upon reviewing the above code more carefully, we don't 
>> even reach the FeaturePcdGet() call: the FACS that QEMU generates (and 
>> OVMF downloads and installs) corresponds to ACPI 1.0, that is, 
>> EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION.
>> 
>> Thanks
>> Laszlo
>> 
>> 
>>> 
>>>  
>>> 
>>>  
>>> 
>>> Thank you
>>> 
>>> Yao Jiewen
>>> 
>>>  
>>> 
>>> *From:*edk2-devel [mailto:edk2-devel-bounces@lists.01.org] *On Behalf 
>>> Of *Yao, Jiewen
>>> *Sent:* Wednesday, February 8, 2017 9:18 AM
>>> *To:* Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com>>; Duran, Leo <leo.duran@amd.com 
> <mailto:leo.duran@amd.com %0b>> <mailto:leo.duran@amd.com>>;
>>> Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org> 
>> <mailto:edk2-devel@ml01.01.org>
>>> *Cc:* Tian, Feng <feng.tian@intel.com <mailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com>>>; 
>>> Singh, Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com>>>
>>> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>> PcdPteMemoryEncryptionAddressOrMask
>>> 
>>>  
>>> 
>>> Good reminder. I take back my word.
>>> 
>>> In this case, we need consume PcdPteMemoryEncryptionAddressOrMask  in IA32 mode to build X64 paging.
>>> 
>>> We need
>>> 
>>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>>> Sent: Wednesday, February 8, 2017 9:11 AM
>>> To: Yao, Jiewen <jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com>>; 
>> Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com%0b
> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%0b>>> 
>> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com 
> <mailto:star.zeng@intel.com %0b>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>; 
>> edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org> <mailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org>
>>> Cc: Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com>>; Singh, 
>> Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com%0b
> <mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com%0b>>> 
>> <mailto:brijesh.singh@amd.com>>
>>> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>> PcdPteMemoryEncryptionAddressOrMask
>>> 
>>> On 02/08/17 18:05, Yao, Jiewen wrote:
>>>> HI Leo
>>>>
>>>> Thanks to clarify that.
>>>>
>>>>
>>>>
>>>> If that is the case, do you think it will be better to limit this 
>>>> PCD to
>>>> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
>>> 
>>> Not sure if this is the best place to raise the following 
>>> observation, but it should do:
>>> 
>>> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE 
>>> if PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
>>> - both PEI and DXE are 32-bit, and
>>> - both PEI and DXE are 64-bit.
>>> 
>>> This doesn't necessarily invalidate anything said thus fair in the 
>>> thread, but the following statement from Leo:
>>> 
>>>     The SEV feature requires 64-bit LongMode, so the
>>>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
>>> 
>>> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
>>> 
>>> Thanks,
>>> Laszlo
>>> 
>>>>
>>>>
>>>>
>>>> Thank you
>>>>
>>>> Yao Jiewen
>>>>
>>>>
>>>>
>>>> *From:*Duran, Leo [mailto:leo.duran@amd.com]
>>>> *Sent:* Wednesday, February 8, 2017 9:00 AM
>>>> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com%0b>> 
>> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>; 
>> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>>> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com
> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com%0b>> 
>> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Tian, Feng
>>>> <feng.tian@intel.com<mailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com%0b>> 
>> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>; Singh, 
>> Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com%0b>> 
>> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Yao,
>>>> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com%0b>> 
>> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com>>>
>>>> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>>
>>>>
>>>> Pease see reply below.
>>>> Leo
>>>>
>>>>> -----Original Message-----
>>>>> From: Zeng, Star [mailto:star.zeng@intel.com]
>>>>> Sent: Tuesday, February 07, 2017 8:27 PM
>>>>> To: Duran, Leo <leo.duran@amd.com 
> <mailto:leo.duran@amd.com %0b>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com 
> <mailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %0b>>>>> %3cmailto:leo.duran@amd.com
>> <mailto:leo.duran@amd.com 
> <mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com 
>> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
> <mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com 
>> %3cmailto:leo.duran@amd.com>>>>; 
>> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>>> <mailto:edk2-devel@ml01.01.org>
>>>>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b 
> <mailto:lersek@redhat.com%0b %0b>> <mailto:lersek@redhat.com%0b%0b>> 
>> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>> 
>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com 
> <mailto:feng.tian@intel.com %0b>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b 
> <mailto:feng.tian@intel.com%0b %0b>> <mailto:feng.tian@intel.com%0b%0b>> 
>> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>> 
>> <mailto:feng.tian@intel.com>>;
>>>>> Singh, Brijesh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b 
> <mailto:brijesh.singh@amd.com%0b %0b>> <mailto:brijesh.singh@amd.com%0b%0b>> 
>> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>> 
>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com 
> <mailto:star.zeng@intel.com %0b>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b 
> <mailto:star.zeng@intel.com%0b %0b>> <mailto:star.zeng@intel.com%0b%0b>> 
>> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>> 
>> <mailto:star.zeng@intel.com>>;
>>>>> Yao, Jiewen <jiewen.yao@intel.com 
> <mailto:jiewen.yao@intel.com %0b>>>>> <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com 
> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com %0b>>>>> %3cmailto:jiewen.yao@intel.com
>> <mailto:jiewen.yao@intel.com 
> <mailto:jiewen.yao@intel.com %0b>> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com 
>> %3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com 
> <mailto:jiewen.yao@intel.com %0b>> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com 
>> %3cmailto:jiewen.yao@intel.com>>>>
>>>>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>>
>>>>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>>>>
>>>>> Thanks,
>>>>> Star
>>>> [Duran, Leo]
>>>> Hi Star,
>>>> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>>>>
>>>> The SEV feature requires 64-bit LongMode, so the 
>>>> PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time, in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
>>>>
>>>>> -----Original Message-----
>>>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf 
>>>>> Of Leo Duran
>>>>> Sent: Wednesday, February 8, 2017 3:54 AM
>>>>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>> 
>>> <mailto:edk2-devel@ml01.01.org>
>>>>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b 
> <mailto:lersek@redhat.com%0b %0b>> <mailto:lersek@redhat.com%0b%0b>> 
>> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>> 
>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com 
> <mailto:feng.tian@intel.com %0b>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b 
> <mailto:feng.tian@intel.com%0b %0b>> <mailto:feng.tian@intel.com%0b%0b>> 
>> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>> 
>> <mailto:feng.tian@intel.com>>;
>>>>> Brijesh Singh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b 
> <mailto:brijesh.singh@amd.com%0b %0b>> <mailto:brijesh.singh@amd.com%0b%0b>> 
>> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>> 
>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com 
> <mailto:star.zeng@intel.com %0b>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b 
> <mailto:star.zeng@intel.com%0b %0b>> <mailto:star.zeng@intel.com%0b%0b>> 
>> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>> 
>> <mailto:star.zeng@intel.com>>;
>>>>> Leo Duran <leo.duran@amd.com 
> <mailto:leo.duran@amd.com %0b>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com 
> <mailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %0b>>>>> %3cmailto:leo.duran@amd.com
>> <mailto:leo.duran@amd.com 
> <mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com 
>> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
> <mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com 
>> %3cmailto:leo.duran@amd.com>>>>
>>>>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>>
>>>>> From: Brijesh Singh <brijesh.singh@amd.com 
> <mailto:brijesh.singh@amd.com %0b>>>>> <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com 
> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com %0b>>>>> %3cmailto:brijesh.singh@amd.com
>> <mailto:brijesh.singh@amd.com 
> <mailto:brijesh.singh@amd.com %0b>> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com 
>> %3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com 
> <mailto:brijesh.singh@amd.com %0b>> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com 
>> %3cmailto:brijesh.singh@amd.com>>>>
>>>>>
>>>>> This dynamic PCD holds the address mask for page table entries when 
>>>>> memory encryption is enabled on AMD processors supporting the 
>>>>> Secure Encrypted Virtualization (SEV) feature.
>>>>>
>>>>> Cc: Feng Tian <feng.tian@intel.com 
> <mailto:feng.tian@intel.com %0b>>>>> <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com 
> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com %0b>>>>> %3cmailto:feng.tian@intel.com
>> <mailto:feng.tian@intel.com 
> <mailto:feng.tian@intel.com %0b>> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com 
>> %3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com 
> <mailto:feng.tian@intel.com %0b>> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com 
>> %3cmailto:feng.tian@intel.com>>>>
>>>>> Cc: Star Zeng <star.zeng@intel.com 
> <mailto:star.zeng@intel.com %0b>>>>> <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com 
> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com %0b>>>>> %3cmailto:star.zeng@intel.com
>> <mailto:star.zeng@intel.com 
> <mailto:star.zeng@intel.com %0b>> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com 
>> %3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com 
> <mailto:star.zeng@intel.com %0b>> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com 
>> %3cmailto:star.zeng@intel.com>>>>
>>>>> Cc: Laszlo Ersek <lersek@redhat.com 
> <mailto:lersek@redhat.com %0b>>>>> <mailto:lersek@redhat.com<mailto:lersek@redhat.com 
> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com %0b>>>>> %3cmailto:lersek@redhat.com
>> <mailto:lersek@redhat.com 
> <mailto:lersek@redhat.com %0b>> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com 
>> %3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com 
> <mailto:lersek@redhat.com %0b>> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com 
>> %3cmailto:lersek@redhat.com>>>>
>>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>>> Signed-off-by: Leo Duran <leo.duran@amd.com 
> <mailto:leo.duran@amd.com %0b>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com 
> <mailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %0b>>>>> %3cmailto:leo.duran@amd.com
>> <mailto:leo.duran@amd.com 
> <mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com 
>> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
> <mailto:leo.duran@amd.com %0b>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com 
>> %3cmailto:leo.duran@amd.com>>>>
>>>>> ---
>>>>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>>>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
>>>>> ------
>>>>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>>>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>>>>
>>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> index 2bc41be..d62bd9b 100644
>>>>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> @@ -6,6 +6,8 @@
>>>>>  #  needed to run the DXE Foundation.
>>>>>  #
>>>>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights 
>>>>> reserved.<BR>
>>>>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> 
>>>>> +#
>>>>>  #  This program and the accompanying materials  #  are licensed 
>>>>> and made available under the terms and conditions of the BSD 
>>>>> License  #  which accompanies this distribution.  The full text of 
>>>>> the license may be found at @@ -111,7 +113,8 @@ [FeaturePcd]
>>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ## 
>>>>> CONSUMES
>>>>>
>>>>>  [Pcd.IA32,Pcd.X64]
>>>>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>>>>> SOMETIMES_CONSUMES
>>>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>>>>> SOMETIMES_CONSUMES
>>>>> +
>>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>>> ask    ## CONSUMES
>>>>>
>>>>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>>>>> SOMETIMES_CONSUMES
>>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> index 790f6ab..2c52389 100644
>>>>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> @@ -16,6 +16,8 @@
>>>>>      3) IA-32 Intel(R) Architecture Software Developer's Manual 
>>>>> Volume 3:System Programmer's Guide, Intel
>>>>>
>>>>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights 
>>>>> reserved.<BR>
>>>>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>>>> +
>>>>>  This program and the accompanying materials  are licensed and made 
>>>>> available under the terms and conditions of the BSD License  which 
>>>>> accompanies this distribution.  The full text of the license may be 
>>>>> found at @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>>>>    //
>>>>>    // Fill in 2M page entry.
>>>>>    //
>>>>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P | 
>>>>> IA32_PG_RW;
>>>>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>>
>>>>>    PhysicalAddress4K = PhysicalAddress;
>>>>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>>>>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>>>>> SIZE_4KB) {
>>>>>      //
>>>>>      // Fill in the Page Table entries
>>>>>      //
>>>>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>>>>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64 
>>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>>      PageTableEntry->Bits.ReadWrite = 1;
>>>>>      PageTableEntry->Bits.Present = 1;
>>>>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < 
>>>>> StackBase +
>>>>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>>>>    //
>>>>>    // Fill in 1G page entry.
>>>>>    //
>>>>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P | 
>>>>> IA32_PG_RW;
>>>>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>>
>>>>>    PhysicalAddress2M = PhysicalAddress;
>>>>>    for (IndexOfPageDirectoryEntries = 0; 
>>>>> IndexOfPageDirectoryEntries < 512;
>>>>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, 
>>>>> IndexOfPageDirectoryEntries++PhysicalAddress2M
>>>>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>>>>        //
>>>>>        // Fill in the Page Directory entries
>>>>>        //
>>>>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>>>>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>>        PageDirectoryEntry->Bits.Present = 1;
>>>>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@ 
>>>>> CreateIdentityMappingPageTables (
>>>>>      //
>>>>>      // Make a PML4 Entry
>>>>>      //
>>>>> -    PageMapLevel4Entry->Uint64 =
>>>>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>>>>> +    PageMapLevel4Entry->Uint64 =
>>>>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64 
>>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>>>>      PageMapLevel4Entry->Bits.Present = 1;
>>>>>
>>>>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>>>>            //
>>>>>            // Fill in the Page Directory entries
>>>>>            //
>>>>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>>>>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | 
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>>>>            PageDirectory1GEntry->Bits.Present = 1;
>>>>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 
>>>>> @@ CreateIdentityMappingPageTables (
>>>>>          //
>>>>>          // Fill in a Page Directory Pointer Entries
>>>>>          //
>>>>> -        PageDirectoryPointerEntry->Uint64 =
>>>>> (UINT64)(UINTN)PageDirectoryEntry;
>>>>> +        PageDirectoryPointerEntry->Uint64 = 
>>>>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64 
>>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>>>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>>>>
>>>>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>>>>              //
>>>>>              // Fill in the Page Directory entries
>>>>>              //
>>>>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>>>>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | 
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>>              PageDirectoryEntry->Bits.Present = 1;
>>>>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git 
>>>>> a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec 
>>>>> index 273cd7e..207384f 100644
>>>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>>>> @@ -6,6 +6,8 @@
>>>>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights 
>>>>> reserved.<BR>  # Copyright (c) 2016, Linaro Ltd. All rights 
>>>>> reserved.<BR>  # (C) Copyright 2016 Hewlett Packard Enterprise 
>>>>> Development LP<BR>
>>>>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>>>  # This program and the accompanying materials are licensed and 
>>>>> made available under  # the terms and conditions of the BSD License 
>>>>> that accompanies this distribution.
>>>>>  # The full text of the license may be found at @@ -1738,5 +1740,11 
>>>>> @@ [PcdsDynamic, PcdsDynamicEx]
>>>>>    # @Prompt If there is any test key used by the platform.
>>>>>
>>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>>>>> 0030003
>>>>>
>>>>> +  ## This dynamic PCD holds the address mask for page table 
>>>>> + entries when memory encryption is  #  enabled on AMD processors 
>>>>> + supporting the
>>>>> Secure Encrypted Virtualization (SEV) feature.
>>>>> +  #  This mask should be applied when creating 1:1 virtual to 
>>>>> + physical
>>>>> mapping tables.
>>>>> +  #
>>>>> +
>>>>> +
>>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>>> ask|0x0
>>>>> + |UINT64|0x00030004
>>>>> +
>>>>>  [UserExtensions.TianoCore."ExtraFiles"]
>>>>>    MdeModulePkgExtra.uni
>>>>> --
>>>>> 1.9.1
>>>>>
>>>>> _______________________________________________
>>>>> edk2-devel mailing list
>>>>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org
> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>
>> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>
>>> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>> 
>>> <mailto:edk2-devel@lists.01.org>
>>>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>>>
>>> _______________________________________________
>>> edk2-devel mailing list
>>> edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org>
>> <mailto:edk2-devel@lists.01.org> <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Zeng, Star 7 years, 8 months ago
Seemingly not big problem since OVMF does not support 64BITs waking vector.

Thanks,
Star
-----Original Message-----
From: Laszlo Ersek [mailto:lersek@redhat.com] 
Sent: Thursday, February 9, 2017 5:10 PM
To: Zeng, Star <star.zeng@intel.com>; Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo <leo.duran@amd.com>; edk2-devel@ml01.01.org
Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

On 02/09/17 06:56, Zeng, Star wrote:
> Stick to current comments and code, OvmfPkg X64 has bug? J
> 
>  
> 
> PCD comments:
> 
> #
> It is assumed that 64-bit DxeCore is built in firmware if it is true; 
> otherwise 32-bit DxeCore
> 
>  
> 
> Code pieces in S3ResumePei, S3SaveStateDxe, SmmLockBoxPeiLib, etc:
> 
> // Both BIOS and OS wants 64bit vector
> 
> if (FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
> 
>   return TRUE;
> 
> }
> 
>  
> 
> //
> 
> // BIOS supports 64bit waking vector.
> //
> 
> if(FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>   returnTRUE;
> 
> }
> 
>  
> 
> if ((sizeof(UINTN) == sizeof(UINT32)) && (FeaturePcdGet
> (PcdDxeIplSwitchToLongMode)) ) {
> 
>   //
> 
>  // 32 PEI + 64 DXE
> 
>  //
> 
>  
> 
>  
> 
> According to above, the patch I drafted is wrong.

That's too bad, because I agreed with it. :(

I can't start working on this right now, but if you guys think it's a big problem, please file an OvmfPkg BZ, and we'll have to audit all uses of PcdDxeIplSwitchToLongMode, to see what might break if we flip it to TRUE for OVMF X64.

Thanks
Laszlo

> 
>  
> 
> Thanks,
> 
> Star
> 
> *From:*Yao, Jiewen
> *Sent:* Thursday, February 9, 2017 1:23 PM
> *To:* Zeng, Star <star.zeng@intel.com>; Laszlo Ersek 
> <lersek@redhat.com>; Duran, Leo <leo.duran@amd.com>; 
> edk2-devel@ml01.01.org
> *Cc:* Tian, Feng <feng.tian@intel.com>; Singh, Brijesh 
> <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
> PcdPteMemoryEncryptionAddressOrMask
> 
>  
> 
> I suggest we evaluate **all** usages of 
> PcdDxeIplSwitchToLongModebecause this is an incompatible change.
> 
>  
> 
> #
> It is assumed that 64-bit DxeCore is built in firmware if it is true; 
> otherwise 32-bit DxeCore
> 
>  
> 
> Thank you
> 
> Yao Jiewen
> 
>  
> 
> *From:*Zeng, Star
> *Sent:* Wednesday, February 8, 2017 9:12 PM
> *To:* Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com>>; 
> Yao, Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com>>; 
> Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com>>; 
> edk2-devel@ml01.01.org <mailto:edk2-devel@ml01.01.org>
> *Cc:* Tian, Feng <feng.tian@intel.com <mailto:feng.tian@intel.com>>; 
> Singh, Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com>>; 
> Justen, Jordan L <jordan.l.justen@intel.com 
> <mailto:jordan.l.justen@intel.com>>; Zeng, Star <star.zeng@intel.com 
> <mailto:star.zeng@intel.com>>
> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
> PcdPteMemoryEncryptionAddressOrMask
> 
>  
> 
> In fact, X64 DxeIplPeim does not refer PcdDxeIplSwitchToLongMode at all.
> 
> DxeIpl.inf:
> [FeaturePcd.IA32]
>   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode      ## CONSUMES
> 
> As I remember, I did a draft patch below before for the discussion about how to determine *PEI* is 32BITs or 64BITs in title "[edk2] [PATCH v3 2/4] IntelFrameworkModulePkg: BdsDxe: only allocate below 4 GB if needed", I can't find the archive link any more.
> 
> ---
>  MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c | 5 +++++
>  MdeModulePkg/MdeModulePkg.dec                  | 4 +++-
>  2 files changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c 
> b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
> index 6488880..348e084 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
> @@ -43,6 +43,11 @@ HandOffToDxeCore (
>    EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;
>  
>    //
> +  // It should be FALSE for both PEI and DXE are 64-bit.
> +  //
> +  ASSERT (PcdGetBool (PcdDxeIplSwitchToLongMode) == FALSE);
> +
> +  //
>    // Get Vector Hand-off Info PPI and build Guided HOB
>    //
>    Status = PeiServicesLocatePpi (
> diff --git a/MdeModulePkg/MdeModulePkg.dec 
> b/MdeModulePkg/MdeModulePkg.dec index af7bcab..4a73f7b 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -712,8 +712,10 @@
>    ## Indicates if DxeIpl should switch to long mode to enter DXE phase.
>    #  It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore
>    #  is built in firmware.<BR><BR>
> +  #  And it should be FALSE for both PEI and DXE are 64-bit.
>    #   TRUE  - DxeIpl will load a 64-bit DxeCore and switch to long mode to hand over to DxeCore.<BR>
> -  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore.<BR>
> +  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore,<BR>
> +  #           or both PEI and DXE are 64-bit.<BR>
>    # @Prompt DxeIpl switch to long mode.
>    
> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|TRUE|BOOLEAN|
> 0x0001003b
>  
> --
> 
> 
> Thanks,
> Star
> -----Original Message-----
> From: Laszlo Ersek [mailto:lersek@redhat.com]
> Sent: Thursday, February 9, 2017 3:48 AM
> To: Yao, Jiewen <jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com>>; Duran, Leo <leo.duran@amd.com 
> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com 
> <mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org 
> <mailto:edk2-devel@ml01.01.org>
> Cc: Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com 
> <mailto:brijesh.singh@amd.com>>; Justen, Jordan L 
> <jordan.l.justen@intel.com <mailto:jordan.l.justen@intel.com>>
> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
> PcdPteMemoryEncryptionAddressOrMask
> 
> On 02/08/17 19:20, Yao, Jiewen wrote:
>> Got it.
>> 
>>  
>> 
>> If the means of PcdDxeIplSwitchtoLongMode  is unclear, we may add 
>> more description to make it clear.
>> 
>>  
>> 
>> If we believe "PcdDxeIplSwitchtoLongMode  == DXE is Long mode" as 
>> final conclusion, can we treat that as a bug and fix OVMF X64?
> 
> I don't know how to "fix" that. What is there to fix?
> 
> Flipping the PCD to TRUE in OVMF X64 would break OVMF X64, and likely OVMF Ia32X64 too. For two reasons:
> 
> 
> (1) Toggling the PCD would alter the behavior of the DXE IPL PEIM and/or the DXE Core, and that behavior has never ever been tested with OVMF X64.
> 
> The PcdDxeIplSwitchToLongMode=FALSE setting in the X64 DSC dates back to:
> 
>   commit 8fa729a8b1401f01c6fd8ddbcab45e4a4904fa9a
>   Author: lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
>   Date:   Mon Mar 15 01:40:59 2010 +0000
> 
>       Merge the same type PCD section.
> 
>       git-svn-id: 
> https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10243 
> 6f19259b-4bc3-4df7-8a09-765794883524
> 
> and before that, to:
> 
>   commit 49ba9447c92d6fca214476381107a180d08e59d1
>   Author: jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
>   Date:   Wed May 27 21:10:18 2009 +0000
> 
>       Add initial version of Open Virtual Machine Firmware (OVMF) platform.
> 
>       git-svn-id: 
> https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8398 
> 6f19259b-4bc3-4df7-8a09-765794883524
> 
> In other words, OVMF X64 has always worked like this, since its inception.
> 
> 
> (2) PEI code under OvmfPkg itself uses this PCD to identify a 32-bit DXE phase.
> 
>     //
>     // If DXE is 32-bit, then we're done; PciBusDxe will degrade 64-bit MMIO
>     // resources to 32-bit anyway. See DegradeResource() in
>     // "PciResourceSupport.c".
>     //
>   #ifdef MDE_CPU_IA32
>     if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>       return FirstNonAddress;
>     }
>   #endif
> 
> and
> 
>     //
>     // If DXE is 32-bit, then just return the traditional 64 MB cap.
>     //
>   #ifdef MDE_CPU_IA32
>     if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>       return SIZE_64MB;
>     }
>   #endif
> 
> Thanks
> Laszlo
> 
>> 
>>  
>> 
>> Thank you
>> 
>> Yao Jiewen
>> 
>>  
>> 
>>  
>> 
>> *From:*Laszlo Ersek [mailto:lersek@redhat.com]
>> *Sent:* Wednesday, February 8, 2017 9:52 AM
>> *To:* Yao, Jiewen <jiewen.yao@intel.com 
>> <mailto:jiewen.yao@intel.com>>; Duran, Leo <leo.duran@amd.com
> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com 
> <mailto:star.zeng@intel.com>>;
>> edk2-devel@ml01.01.org <mailto:edk2-devel@ml01.01.org>
>> *Cc:* Tian, Feng <feng.tian@intel.com <mailto:feng.tian@intel.com>>; 
>> Singh, Brijesh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com>>; Justen, Jordan L 
> <jordan.l.justen@intel.com <mailto:jordan.l.justen@intel.com>>
>> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>> PcdPteMemoryEncryptionAddressOrMask
>> 
>>  
>> 
>> On 02/08/17 18:27, Yao, Jiewen wrote:
>>> I believe PcdDxeIplSwitchtoLongMode  == DXE is Long mode.
>>> 
>>>  
>>> 
>>> See DEC description:
>>> 
>>>   #  It is assumed that 64-bit DxeCore is built in firmware if it is 
>>> true; otherwise 32-bit DxeCore
>>> 
>>>   #  is built in firmware.<BR><BR>
>> 
>> Unfortunately, I have no historical context or background for this 
>> PCD; all I can say is that the X64 OVMF platform does not set the PCD.
>> 
>> It enters long mode, and sets up page tables for the first 4GB of 
>> RAM, in SEC. Then SEC decompresses the flash contents to RAM, which 
>> covers both PEIFV and DXEFV. PEI runs from RAM.
>> 
>> This is possible because on QEMU/KVM, there's no need to initialize 
>> RAM, thus only SEC runs from flash, in-place.
>> 
>> Perhaps Jordan can provide more insight.
>> 
>> If Brijesh and Leo would like to run the X64 OVMF platform as a SEV 
>> guest too, then this should be considered, in my opinion.
>> 
>> One more comment below:
>> 
>>> 
>>>  
>>> 
>>> And the code MdeModulePkg\Universal\Acpi\S3SaveStateDxe\AcpiS3ContextSave.c:
>>> 
>>>  
>>> 
>>> BOOLEAN
>>> 
>>> IsLongModeWakingVectorSupport (
>>> 
>>>   IN EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*Facs
>>> 
>>>   )
>>> 
>>> {
>>> 
>>>   if((Facs == NULL) ||
>>> 
>>>       (Facs->Signature !=
>>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ) {
>>> 
>>>     //
>>> 
>>>     // Something wrong with FACS.
>>> 
>>>     //
>>> 
>>>     returnFALSE;
>>> 
>>>   }
>>> 
>>>   if((Facs->Version ==
>>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION) &&
>>> 
>>>       ((Facs->Flags & EFI_ACPI_4_0_64BIT_WAKE_SUPPORTED_F) != 0)) {
>>> 
>>>     //
>>> 
>>>     // BIOS supports 64bit waking vector.
>>> 
>>>     //
>>> 
>>>     if(FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>>> 
>>>       returnTRUE;
>>> 
>>>     }
>>> 
>>>   }
>>> 
>>>   returnFALSE;
>>> 
>>> }
>> 
>> In practice, it's okay if the OVMF X64 platform is recognized as "not 
>> supporting a 64-bit waking vector for S3 resume". All the 64-bit 
>> guest OSes that I've tested with OVMF X64 (Linux, and the Windows 7 / 
>> 8 / 10 families, both client and server) use a real mode (16-bit) 
>> waking vector, in practice.
>> 
>> ... Actually, upon reviewing the above code more carefully, we don't 
>> even reach the FeaturePcdGet() call: the FACS that QEMU generates 
>> (and OVMF downloads and installs) corresponds to ACPI 1.0, that is, 
>> EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION.
>> 
>> Thanks
>> Laszlo
>> 
>> 
>>> 
>>>  
>>> 
>>>  
>>> 
>>> Thank you
>>> 
>>> Yao Jiewen
>>> 
>>>  
>>> 
>>> *From:*edk2-devel [mailto:edk2-devel-bounces@lists.01.org] *On 
>>> Behalf Of *Yao, Jiewen
>>> *Sent:* Wednesday, February 8, 2017 9:18 AM
>>> *To:* Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com>>; Duran, Leo 
> <leo.duran@amd.com <mailto:leo.duran@amd.com %0b>> 
> <mailto:leo.duran@amd.com>>;
>>> Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>; 
> edk2-devel@ml01.01.org <mailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org>
>>> *Cc:* Tian, Feng <feng.tian@intel.com <mailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com>>>;
>>> Singh, Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com>>>
>>> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>> PcdPteMemoryEncryptionAddressOrMask
>>> 
>>>  
>>> 
>>> Good reminder. I take back my word.
>>> 
>>> In this case, we need consume PcdPteMemoryEncryptionAddressOrMask  in IA32 mode to build X64 paging.
>>> 
>>> We need
>>> 
>>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>>> Sent: Wednesday, February 8, 2017 9:11 AM
>>> To: Yao, Jiewen <jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com%0b>> 
> <mailto:jiewen.yao@intel.com>>;
>> Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com%0b
> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com%0b>>>
>> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com %0b>> <mailto:star.zeng@intel.com%0b>> 
> <mailto:star.zeng@intel.com>>;
>> edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org> <mailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org>
>>> Cc: Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b>> 
> <mailto:feng.tian@intel.com>>; Singh,
>> Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com%0b
> <mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com%0b>>>
>> <mailto:brijesh.singh@amd.com>>
>>> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>> PcdPteMemoryEncryptionAddressOrMask
>>> 
>>> On 02/08/17 18:05, Yao, Jiewen wrote:
>>>> HI Leo
>>>>
>>>> Thanks to clarify that.
>>>>
>>>>
>>>>
>>>> If that is the case, do you think it will be better to limit this 
>>>> PCD to
>>>> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
>>> 
>>> Not sure if this is the best place to raise the following 
>>> observation, but it should do:
>>> 
>>> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE 
>>> if PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
>>> - both PEI and DXE are 32-bit, and
>>> - both PEI and DXE are 64-bit.
>>> 
>>> This doesn't necessarily invalidate anything said thus fair in the 
>>> thread, but the following statement from Leo:
>>> 
>>>     The SEV feature requires 64-bit LongMode, so the
>>>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
>>> 
>>> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
>>> 
>>> Thanks,
>>> Laszlo
>>> 
>>>>
>>>>
>>>>
>>>> Thank you
>>>>
>>>> Yao Jiewen
>>>>
>>>>
>>>>
>>>> *From:*Duran, Leo [mailto:leo.duran@amd.com]
>>>> *Sent:* Wednesday, February 8, 2017 9:00 AM
>>>> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com%0b>> 
> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com%0b>>
>> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>;
>> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>>> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com
> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com%0b>> 
> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com%0b>>
>> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Tian, Feng
>>>> <feng.tian@intel.com<mailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com%0b>> 
> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com%0b>>
>> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>; Singh, 
>> Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com%0b>> 
> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com%0b>>
>> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Yao,
>>>> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com%0b>> 
> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com%0b>>
>> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com>>>
>>>> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>>
>>>>
>>>> Pease see reply below.
>>>> Leo
>>>>
>>>>> -----Original Message-----
>>>>> From: Zeng, Star [mailto:star.zeng@intel.com]
>>>>> Sent: Tuesday, February 07, 2017 8:27 PM
>>>>> To: Duran, Leo <leo.duran@amd.com
> <mailto:leo.duran@amd.com %0b>>>>> 
> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %0b>>>>> 
> %3cmailto:leo.duran@amd.com
>> <mailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com %0b>> 
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com %0b>> 
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com>>>>;
>> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>>> <mailto:edk2-devel@ml01.01.org>
>>>>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b>> 
> <mailto:lersek@redhat.com%0b <mailto:lersek@redhat.com%0b %0b>> 
> <mailto:lersek@redhat.com%0b%0b>>
>> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>>
>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com %0b>> <mailto:feng.tian@intel.com%0b>> 
> <mailto:feng.tian@intel.com%0b <mailto:feng.tian@intel.com%0b %0b>> 
> <mailto:feng.tian@intel.com%0b%0b>>
>> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>>
>> <mailto:feng.tian@intel.com>>;
>>>>> Singh, Brijesh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b>> 
> <mailto:brijesh.singh@amd.com%0b <mailto:brijesh.singh@amd.com%0b 
> %0b>> <mailto:brijesh.singh@amd.com%0b%0b>>
>> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>>
>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com %0b>> <mailto:star.zeng@intel.com%0b>> 
> <mailto:star.zeng@intel.com%0b <mailto:star.zeng@intel.com%0b %0b>> 
> <mailto:star.zeng@intel.com%0b%0b>>
>> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>>
>> <mailto:star.zeng@intel.com>>;
>>>>> Yao, Jiewen <jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com %0b>>>>> 
> <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com %0b>>>>> 
> %3cmailto:jiewen.yao@intel.com
>> <mailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com %0b>> 
> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com
>> %3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com %0b>> 
> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com
>> %3cmailto:jiewen.yao@intel.com>>>>
>>>>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>>
>>>>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>>>>
>>>>> Thanks,
>>>>> Star
>>>> [Duran, Leo]
>>>> Hi Star,
>>>> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>>>>
>>>> The SEV feature requires 64-bit LongMode, so the 
>>>> PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time, in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
>>>>
>>>>> -----Original Message-----
>>>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On 
>>>>> Behalf Of Leo Duran
>>>>> Sent: Wednesday, February 8, 2017 3:54 AM
>>>>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>> <mailto:edk2-devel@ml01.01.org>
>>>>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b>> 
> <mailto:lersek@redhat.com%0b <mailto:lersek@redhat.com%0b %0b>> 
> <mailto:lersek@redhat.com%0b%0b>>
>> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>>
>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com %0b>> <mailto:feng.tian@intel.com%0b>> 
> <mailto:feng.tian@intel.com%0b <mailto:feng.tian@intel.com%0b %0b>> 
> <mailto:feng.tian@intel.com%0b%0b>>
>> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>>
>> <mailto:feng.tian@intel.com>>;
>>>>> Brijesh Singh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b>> 
> <mailto:brijesh.singh@amd.com%0b <mailto:brijesh.singh@amd.com%0b 
> %0b>> <mailto:brijesh.singh@amd.com%0b%0b>>
>> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>>
>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com %0b>> <mailto:star.zeng@intel.com%0b>> 
> <mailto:star.zeng@intel.com%0b <mailto:star.zeng@intel.com%0b %0b>> 
> <mailto:star.zeng@intel.com%0b%0b>>
>> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>>
>> <mailto:star.zeng@intel.com>>;
>>>>> Leo Duran <leo.duran@amd.com
> <mailto:leo.duran@amd.com %0b>>>>> 
> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %0b>>>>> 
> %3cmailto:leo.duran@amd.com
>> <mailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com %0b>> 
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com %0b>> 
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com>>>>
>>>>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>>
>>>>> From: Brijesh Singh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com %0b>>>>> 
> <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com %0b>>>>> 
> %3cmailto:brijesh.singh@amd.com
>> <mailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com %0b>> 
> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com
>> %3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com %0b>> 
> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com
>> %3cmailto:brijesh.singh@amd.com>>>>
>>>>>
>>>>> This dynamic PCD holds the address mask for page table entries 
>>>>> when memory encryption is enabled on AMD processors supporting the 
>>>>> Secure Encrypted Virtualization (SEV) feature.
>>>>>
>>>>> Cc: Feng Tian <feng.tian@intel.com
> <mailto:feng.tian@intel.com %0b>>>>> 
> <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com %0b>>>>> 
> %3cmailto:feng.tian@intel.com
>> <mailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com %0b>> 
> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com
>> %3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com %0b>> 
> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com
>> %3cmailto:feng.tian@intel.com>>>>
>>>>> Cc: Star Zeng <star.zeng@intel.com
> <mailto:star.zeng@intel.com %0b>>>>> 
> <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com %0b>>>>> 
> %3cmailto:star.zeng@intel.com
>> <mailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com %0b>> 
> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com
>> %3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com %0b>> 
> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com
>> %3cmailto:star.zeng@intel.com>>>>
>>>>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com %0b>>>>> 
> <mailto:lersek@redhat.com<mailto:lersek@redhat.com
> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com %0b>>>>> 
> %3cmailto:lersek@redhat.com
>> <mailto:lersek@redhat.com
> <mailto:lersek@redhat.com %0b>> 
> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com
>> %3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com
> <mailto:lersek@redhat.com %0b>> 
> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com
>> %3cmailto:lersek@redhat.com>>>>
>>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>>> Signed-off-by: Leo Duran <leo.duran@amd.com
> <mailto:leo.duran@amd.com %0b>>>>> 
> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com %0b>>>>> 
> %3cmailto:leo.duran@amd.com
>> <mailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com %0b>> 
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com %0b>> 
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com>>>>
>>>>> ---
>>>>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>>>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 
>>>>> ++++++++++--
>>>>> ------
>>>>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>>>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>>>>
>>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> index 2bc41be..d62bd9b 100644
>>>>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> @@ -6,6 +6,8 @@
>>>>>  #  needed to run the DXE Foundation.
>>>>>  #
>>>>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights 
>>>>> reserved.<BR>
>>>>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> 
>>>>> +#
>>>>>  #  This program and the accompanying materials  #  are licensed 
>>>>> and made available under the terms and conditions of the BSD 
>>>>> License  #  which accompanies this distribution.  The full text of 
>>>>> the license may be found at @@ -111,7 +113,8 @@ [FeaturePcd]
>>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress 
>>>>> ## CONSUMES
>>>>>
>>>>>  [Pcd.IA32,Pcd.X64]
>>>>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>>>>> SOMETIMES_CONSUMES
>>>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>>>>> SOMETIMES_CONSUMES
>>>>> +
>>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>>> ask    ## CONSUMES
>>>>>
>>>>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>>>>> SOMETIMES_CONSUMES
>>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> index 790f6ab..2c52389 100644
>>>>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> @@ -16,6 +16,8 @@
>>>>>      3) IA-32 Intel(R) Architecture Software Developer's Manual 
>>>>> Volume 3:System Programmer's Guide, Intel
>>>>>
>>>>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights 
>>>>> reserved.<BR>
>>>>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>>>> +
>>>>>  This program and the accompanying materials  are licensed and 
>>>>> made available under the terms and conditions of the BSD License  
>>>>> which accompanies this distribution.  The full text of the license 
>>>>> may be found at @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>>>>    //
>>>>>    // Fill in 2M page entry.
>>>>>    //
>>>>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P | 
>>>>> IA32_PG_RW;
>>>>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>>
>>>>>    PhysicalAddress4K = PhysicalAddress;
>>>>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 
>>>>> 512;
>>>>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>>>>> SIZE_4KB) {
>>>>>      //
>>>>>      // Fill in the Page Table entries
>>>>>      //
>>>>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>>>>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | 
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>      PageTableEntry->Bits.ReadWrite = 1;
>>>>>      PageTableEntry->Bits.Present = 1;
>>>>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < 
>>>>> StackBase +
>>>>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>>>>    //
>>>>>    // Fill in 1G page entry.
>>>>>    //
>>>>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P 
>>>>> | IA32_PG_RW;
>>>>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>>
>>>>>    PhysicalAddress2M = PhysicalAddress;
>>>>>    for (IndexOfPageDirectoryEntries = 0; 
>>>>> IndexOfPageDirectoryEntries < 512;
>>>>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, 
>>>>> IndexOfPageDirectoryEntries++PhysicalAddress2M
>>>>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>>>>        //
>>>>>        // Fill in the Page Directory entries
>>>>>        //
>>>>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>>>>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>>        PageDirectoryEntry->Bits.Present = 1;
>>>>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@ 
>>>>> CreateIdentityMappingPageTables (
>>>>>      //
>>>>>      // Make a PML4 Entry
>>>>>      //
>>>>> -    PageMapLevel4Entry->Uint64 =
>>>>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>>>>> +    PageMapLevel4Entry->Uint64 =
>>>>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64 
>>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>>>>      PageMapLevel4Entry->Bits.Present = 1;
>>>>>
>>>>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>>>>            //
>>>>>            // Fill in the Page Directory entries
>>>>>            //
>>>>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>>>>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress |
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>>>>            PageDirectory1GEntry->Bits.Present = 1;
>>>>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 
>>>>> +282,7 @@ CreateIdentityMappingPageTables (
>>>>>          //
>>>>>          // Fill in a Page Directory Pointer Entries
>>>>>          //
>>>>> -        PageDirectoryPointerEntry->Uint64 =
>>>>> (UINT64)(UINTN)PageDirectoryEntry;
>>>>> +        PageDirectoryPointerEntry->Uint64 = 
>>>>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64 
>>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>>>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>>>>
>>>>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>>>>              //
>>>>>              // Fill in the Page Directory entries
>>>>>              //
>>>>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>>>>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress |
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>>              PageDirectoryEntry->Bits.Present = 1;
>>>>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git 
>>>>> a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec 
>>>>> index 273cd7e..207384f 100644
>>>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>>>> @@ -6,6 +6,8 @@
>>>>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights 
>>>>> reserved.<BR>  # Copyright (c) 2016, Linaro Ltd. All rights 
>>>>> reserved.<BR>  # (C) Copyright 2016 Hewlett Packard Enterprise 
>>>>> Development LP<BR>
>>>>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> 
>>>>> +#
>>>>>  # This program and the accompanying materials are licensed and 
>>>>> made available under  # the terms and conditions of the BSD 
>>>>> License that accompanies this distribution.
>>>>>  # The full text of the license may be found at @@ -1738,5 
>>>>> +1740,11 @@ [PcdsDynamic, PcdsDynamicEx]
>>>>>    # @Prompt If there is any test key used by the platform.
>>>>>
>>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>>>>> 0030003
>>>>>
>>>>> +  ## This dynamic PCD holds the address mask for page table 
>>>>> + entries when memory encryption is  #  enabled on AMD processors 
>>>>> + supporting the
>>>>> Secure Encrypted Virtualization (SEV) feature.
>>>>> +  #  This mask should be applied when creating 1:1 virtual to 
>>>>> + physical
>>>>> mapping tables.
>>>>> +  #
>>>>> +
>>>>> +
>>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>>> ask|0x0
>>>>> + |UINT64|0x00030004
>>>>> +
>>>>>  [UserExtensions.TianoCore."ExtraFiles"]
>>>>>    MdeModulePkgExtra.uni
>>>>> --
>>>>> 1.9.1
>>>>>
>>>>> _______________________________________________
>>>>> edk2-devel mailing list
>>>>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org
> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>
>> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>
>>> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>>
>>> <mailto:edk2-devel@lists.01.org>
>>>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>>>
>>> _______________________________________________
>>> edk2-devel mailing list
>>> edk2-devel@lists.01.org <mailto:edk2-devel@lists.01.org>
>> <mailto:edk2-devel@lists.01.org> <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Zeng, Star 7 years, 8 months ago
Correct typo in below email.

"about how to determine DXE is 32BITs or 64BITs" should be "about how to determine PEI is 32BITs or 64BITs".

At that time, we were discussing if the code needs to allocate <4G ACPI table for PEI phase at S3 resume.

Thanks,
Star
-----Original Message-----
From: Zeng, Star 
Sent: Thursday, February 9, 2017 1:12 PM
To: Laszlo Ersek <lersek@redhat.com>; Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo <leo.duran@amd.com>; edk2-devel@ml01.01.org
Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>; Zeng, Star <star.zeng@intel.com>
Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

In fact, X64 DxeIplPeim does not refer PcdDxeIplSwitchToLongMode at all.

DxeIpl.inf:
[FeaturePcd.IA32]
  gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode      ## CONSUMES

As I remember, I did a draft patch below before for the discussion about how to determine DXE is 32BITs or 64BITs in title "[edk2] [PATCH v3 2/4] IntelFrameworkModulePkg: BdsDxe: only allocate below 4 GB if needed", I can't find the archive link any more.

---
 MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c | 5 +++++
 MdeModulePkg/MdeModulePkg.dec                  | 4 +++-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
index 6488880..348e084 100644
--- a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
+++ b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
@@ -43,6 +43,11 @@ HandOffToDxeCore (
   EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;
 
   //
+  // It should be FALSE for both PEI and DXE are 64-bit.
+  //
+  ASSERT (PcdGetBool (PcdDxeIplSwitchToLongMode) == FALSE);
+
+  //
   // Get Vector Hand-off Info PPI and build Guided HOB
   //
   Status = PeiServicesLocatePpi (
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index af7bcab..4a73f7b 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -712,8 +712,10 @@
   ## Indicates if DxeIpl should switch to long mode to enter DXE phase.
   #  It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore
   #  is built in firmware.<BR><BR>
+  #  And it should be FALSE for both PEI and DXE are 64-bit.
   #   TRUE  - DxeIpl will load a 64-bit DxeCore and switch to long mode to hand over to DxeCore.<BR>
-  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore.<BR>
+  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore,<BR>
+  #           or both PEI and DXE are 64-bit.<BR>
   # @Prompt DxeIpl switch to long mode.
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|TRUE|BOOLEAN|0x0001003b
 
--


Thanks,
Star
-----Original Message-----
From: Laszlo Ersek [mailto:lersek@redhat.com]
Sent: Thursday, February 9, 2017 3:48 AM
To: Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; edk2-devel@ml01.01.org
Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

On 02/08/17 19:20, Yao, Jiewen wrote:
> Got it.
> 
>  
> 
> If the means of PcdDxeIplSwitchtoLongMode  is unclear, we may add more 
> description to make it clear.
> 
>  
> 
> If we believe "PcdDxeIplSwitchtoLongMode  == DXE is Long mode" as 
> final conclusion, can we treat that as a bug and fix OVMF X64?

I don't know how to "fix" that. What is there to fix?

Flipping the PCD to TRUE in OVMF X64 would break OVMF X64, and likely OVMF Ia32X64 too. For two reasons:


(1) Toggling the PCD would alter the behavior of the DXE IPL PEIM and/or the DXE Core, and that behavior has never ever been tested with OVMF X64.

The PcdDxeIplSwitchToLongMode=FALSE setting in the X64 DSC dates back to:

  commit 8fa729a8b1401f01c6fd8ddbcab45e4a4904fa9a
  Author: lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
  Date:   Mon Mar 15 01:40:59 2010 +0000

      Merge the same type PCD section.

      git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10243 6f19259b-4bc3-4df7-8a09-765794883524

and before that, to:

  commit 49ba9447c92d6fca214476381107a180d08e59d1
  Author: jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
  Date:   Wed May 27 21:10:18 2009 +0000

      Add initial version of Open Virtual Machine Firmware (OVMF) platform.

      git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8398 6f19259b-4bc3-4df7-8a09-765794883524

In other words, OVMF X64 has always worked like this, since its inception.


(2) PEI code under OvmfPkg itself uses this PCD to identify a 32-bit DXE phase.

    //
    // If DXE is 32-bit, then we're done; PciBusDxe will degrade 64-bit MMIO
    // resources to 32-bit anyway. See DegradeResource() in
    // "PciResourceSupport.c".
    //
  #ifdef MDE_CPU_IA32
    if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
      return FirstNonAddress;
    }
  #endif

and

    //
    // If DXE is 32-bit, then just return the traditional 64 MB cap.
    //
  #ifdef MDE_CPU_IA32
    if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
      return SIZE_64MB;
    }
  #endif

Thanks
Laszlo

> 
>  
> 
> Thank you
> 
> Yao Jiewen
> 
>  
> 
>  
> 
> *From:*Laszlo Ersek [mailto:lersek@redhat.com]
> *Sent:* Wednesday, February 8, 2017 9:52 AM
> *To:* Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo 
> <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; 
> edk2-devel@ml01.01.org
> *Cc:* Tian, Feng <feng.tian@intel.com>; Singh, Brijesh 
> <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
> PcdPteMemoryEncryptionAddressOrMask
> 
>  
> 
> On 02/08/17 18:27, Yao, Jiewen wrote:
>> I believe PcdDxeIplSwitchtoLongMode  == DXE is Long mode.
>> 
>>  
>> 
>> See DEC description:
>> 
>>   #  It is assumed that 64-bit DxeCore is built in firmware if it is 
>> true; otherwise 32-bit DxeCore
>> 
>>   #  is built in firmware.<BR><BR>
> 
> Unfortunately, I have no historical context or background for this 
> PCD; all I can say is that the X64 OVMF platform does not set the PCD.
> 
> It enters long mode, and sets up page tables for the first 4GB of RAM, 
> in SEC. Then SEC decompresses the flash contents to RAM, which covers 
> both PEIFV and DXEFV. PEI runs from RAM.
> 
> This is possible because on QEMU/KVM, there's no need to initialize 
> RAM, thus only SEC runs from flash, in-place.
> 
> Perhaps Jordan can provide more insight.
> 
> If Brijesh and Leo would like to run the X64 OVMF platform as a SEV 
> guest too, then this should be considered, in my opinion.
> 
> One more comment below:
> 
>> 
>>  
>> 
>> And the code MdeModulePkg\Universal\Acpi\S3SaveStateDxe\AcpiS3ContextSave.c:
>> 
>>  
>> 
>> BOOLEAN
>> 
>> IsLongModeWakingVectorSupport (
>> 
>>   IN EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*Facs
>> 
>>   )
>> 
>> {
>> 
>>   if((Facs == NULL) ||
>> 
>>       (Facs->Signature !=
>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ) {
>> 
>>     //
>> 
>>     // Something wrong with FACS.
>> 
>>     //
>> 
>>     returnFALSE;
>> 
>>   }
>> 
>>   if((Facs->Version ==
>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION) &&
>> 
>>       ((Facs->Flags & EFI_ACPI_4_0_64BIT_WAKE_SUPPORTED_F) != 0)) {
>> 
>>     //
>> 
>>     // BIOS supports 64bit waking vector.
>> 
>>     //
>> 
>>     if(FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>> 
>>       returnTRUE;
>> 
>>     }
>> 
>>   }
>> 
>>   returnFALSE;
>> 
>> }
> 
> In practice, it's okay if the OVMF X64 platform is recognized as "not 
> supporting a 64-bit waking vector for S3 resume". All the 64-bit guest 
> OSes that I've tested with OVMF X64 (Linux, and the Windows 7 / 8 / 10 
> families, both client and server) use a real mode (16-bit) waking 
> vector, in practice.
> 
> ... Actually, upon reviewing the above code more carefully, we don't 
> even reach the FeaturePcdGet() call: the FACS that QEMU generates (and 
> OVMF downloads and installs) corresponds to ACPI 1.0, that is, 
> EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION.
> 
> Thanks
> Laszlo
> 
> 
>> 
>>  
>> 
>>  
>> 
>> Thank you
>> 
>> Yao Jiewen
>> 
>>  
>> 
>> *From:*edk2-devel [mailto:edk2-devel-bounces@lists.01.org] *On Behalf 
>> Of *Yao, Jiewen
>> *Sent:* Wednesday, February 8, 2017 9:18 AM
>> *To:* Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com>>; Duran, Leo <leo.duran@amd.com 
> <mailto:leo.duran@amd.com>>;
>> Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org 
> <mailto:edk2-devel@ml01.01.org>
>> *Cc:* Tian, Feng <feng.tian@intel.com <mailto:feng.tian@intel.com>>; 
>> Singh, Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com>>
>> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>> PcdPteMemoryEncryptionAddressOrMask
>> 
>>  
>> 
>> Good reminder. I take back my word.
>> 
>> In this case, we need consume PcdPteMemoryEncryptionAddressOrMask  in IA32 mode to build X64 paging.
>> 
>> We need
>> 
>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>> Sent: Wednesday, February 8, 2017 9:11 AM
>> To: Yao, Jiewen <jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com>>; 
> Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com%0b>> 
> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com 
> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>; 
> edk2-devel@ml01.01.org <mailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org>
>> Cc: Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com>>; Singh, 
> Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com%0b>>
> <mailto:brijesh.singh@amd.com>>
>> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>> PcdPteMemoryEncryptionAddressOrMask
>> 
>> On 02/08/17 18:05, Yao, Jiewen wrote:
>>> HI Leo
>>>
>>> Thanks to clarify that.
>>>
>>>
>>>
>>> If that is the case, do you think it will be better to limit this 
>>> PCD to
>>> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
>> 
>> Not sure if this is the best place to raise the following 
>> observation, but it should do:
>> 
>> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE 
>> if PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
>> - both PEI and DXE are 32-bit, and
>> - both PEI and DXE are 64-bit.
>> 
>> This doesn't necessarily invalidate anything said thus fair in the 
>> thread, but the following statement from Leo:
>> 
>>     The SEV feature requires 64-bit LongMode, so the
>>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
>> 
>> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
>> 
>> Thanks,
>> Laszlo
>> 
>>>
>>>
>>>
>>> Thank you
>>>
>>> Yao Jiewen
>>>
>>>
>>>
>>> *From:*Duran, Leo [mailto:leo.duran@amd.com]
>>> *Sent:* Wednesday, February 8, 2017 9:00 AM
>>> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com%0b>>
> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>;
> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com
> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com%0b>>
> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Tian, Feng
>>> <feng.tian@intel.com<mailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com%0b>>
> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>; Singh, 
> Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com%0b>>
> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Yao,
>>> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com%0b>>
> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com>>>
>>> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>>
>>>
>>> Pease see reply below.
>>> Leo
>>>
>>>> -----Original Message-----
>>>> From: Zeng, Star [mailto:star.zeng@intel.com]
>>>> Sent: Tuesday, February 07, 2017 8:27 PM
>>>> To: Duran, Leo <leo.duran@amd.com
>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
>>>> %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com>>>>;
> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>> <mailto:edk2-devel@ml01.01.org>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b 
> <mailto:lersek@redhat.com%0b%0b>> 
> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>>
> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com 
> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b 
> <mailto:feng.tian@intel.com%0b%0b>>
> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>>
> <mailto:feng.tian@intel.com>>;
>>>> Singh, Brijesh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b 
> <mailto:brijesh.singh@amd.com%0b%0b>>
> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>>
> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com 
> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b 
> <mailto:star.zeng@intel.com%0b%0b>>
> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>>
> <mailto:star.zeng@intel.com>>;
>>>> Yao, Jiewen <jiewen.yao@intel.com
>>>> <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
>>>> %3cmailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com
> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com
> %3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com 
> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com
> %3cmailto:jiewen.yao@intel.com>>>>
>>>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>>>
>>>> Thanks,
>>>> Star
>>> [Duran, Leo]
>>> Hi Star,
>>> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>>>
>>> The SEV feature requires 64-bit LongMode, so the 
>>> PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time, in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
>>>
>>>> -----Original Message-----
>>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf 
>>>> Of Leo Duran
>>>> Sent: Wednesday, February 8, 2017 3:54 AM
>>>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>> <mailto:edk2-devel@ml01.01.org>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b 
> <mailto:lersek@redhat.com%0b%0b>> 
> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>>
> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com 
> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b 
> <mailto:feng.tian@intel.com%0b%0b>>
> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>>
> <mailto:feng.tian@intel.com>>;
>>>> Brijesh Singh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b 
> <mailto:brijesh.singh@amd.com%0b%0b>>
> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>>
> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com 
> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b 
> <mailto:star.zeng@intel.com%0b%0b>>
> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>>
> <mailto:star.zeng@intel.com>>;
>>>> Leo Duran <leo.duran@amd.com
>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
>>>> %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com>>>>
>>>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>> From: Brijesh Singh <brijesh.singh@amd.com 
>>>> <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
>>>> %3cmailto:brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com
> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com
> %3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com 
> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com
> %3cmailto:brijesh.singh@amd.com>>>>
>>>>
>>>> This dynamic PCD holds the address mask for page table entries when 
>>>> memory encryption is enabled on AMD processors supporting the 
>>>> Secure Encrypted Virtualization (SEV) feature.
>>>>
>>>> Cc: Feng Tian <feng.tian@intel.com 
>>>> <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com
>>>> %3cmailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com
> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com
> %3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com 
> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com
> %3cmailto:feng.tian@intel.com>>>>
>>>> Cc: Star Zeng <star.zeng@intel.com 
>>>> <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com
>>>> %3cmailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com
> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com
> %3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com 
> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com
> %3cmailto:star.zeng@intel.com>>>>
>>>> Cc: Laszlo Ersek <lersek@redhat.com 
>>>> <mailto:lersek@redhat.com<mailto:lersek@redhat.com
>>>> %3cmailto:lersek@redhat.com
> <mailto:lersek@redhat.com
> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com
> %3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com 
> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com
> %3cmailto:lersek@redhat.com>>>>
>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>> Signed-off-by: Leo Duran <leo.duran@amd.com 
>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
>>>> %3cmailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
> %3cmailto:leo.duran@amd.com>>>>
>>>> ---
>>>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
>>>> ------
>>>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>>>
>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> index 2bc41be..d62bd9b 100644
>>>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> @@ -6,6 +6,8 @@
>>>>  #  needed to run the DXE Foundation.
>>>>  #
>>>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights 
>>>> reserved.<BR>
>>>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> 
>>>> +#
>>>>  #  This program and the accompanying materials  #  are licensed 
>>>> and made available under the terms and conditions of the BSD 
>>>> License  #  which accompanies this distribution.  The full text of 
>>>> the license may be found at @@ -111,7 +113,8 @@ [FeaturePcd]
>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ## 
>>>> CONSUMES
>>>>
>>>>  [Pcd.IA32,Pcd.X64]
>>>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>>>> SOMETIMES_CONSUMES
>>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>>>> SOMETIMES_CONSUMES
>>>> +
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>> ask    ## CONSUMES
>>>>
>>>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>>>> SOMETIMES_CONSUMES
>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> index 790f6ab..2c52389 100644
>>>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> @@ -16,6 +16,8 @@
>>>>      3) IA-32 Intel(R) Architecture Software Developer's Manual 
>>>> Volume 3:System Programmer's Guide, Intel
>>>>
>>>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights 
>>>> reserved.<BR>
>>>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>>> +
>>>>  This program and the accompanying materials  are licensed and made 
>>>> available under the terms and conditions of the BSD License  which 
>>>> accompanies this distribution.  The full text of the license may be 
>>>> found at @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>>>    //
>>>>    // Fill in 2M page entry.
>>>>    //
>>>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P | 
>>>> IA32_PG_RW;
>>>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>
>>>>    PhysicalAddress4K = PhysicalAddress;
>>>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>>>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>>>> SIZE_4KB) {
>>>>      //
>>>>      // Fill in the Page Table entries
>>>>      //
>>>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>>>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64 
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>      PageTableEntry->Bits.ReadWrite = 1;
>>>>      PageTableEntry->Bits.Present = 1;
>>>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < 
>>>> StackBase +
>>>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>>>    //
>>>>    // Fill in 1G page entry.
>>>>    //
>>>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P | 
>>>> IA32_PG_RW;
>>>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>
>>>>    PhysicalAddress2M = PhysicalAddress;
>>>>    for (IndexOfPageDirectoryEntries = 0; 
>>>> IndexOfPageDirectoryEntries < 512;
>>>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, 
>>>> IndexOfPageDirectoryEntries++PhysicalAddress2M
>>>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>>>        //
>>>>        // Fill in the Page Directory entries
>>>>        //
>>>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>>>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>        PageDirectoryEntry->Bits.Present = 1;
>>>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@ 
>>>> CreateIdentityMappingPageTables (
>>>>      //
>>>>      // Make a PML4 Entry
>>>>      //
>>>> -    PageMapLevel4Entry->Uint64 =
>>>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>>>> +    PageMapLevel4Entry->Uint64 =
>>>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64 
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>>>      PageMapLevel4Entry->Bits.Present = 1;
>>>>
>>>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>>>            //
>>>>            // Fill in the Page Directory entries
>>>>            //
>>>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>>>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>>>            PageDirectory1GEntry->Bits.Present = 1;
>>>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 
>>>> @@ CreateIdentityMappingPageTables (
>>>>          //
>>>>          // Fill in a Page Directory Pointer Entries
>>>>          //
>>>> -        PageDirectoryPointerEntry->Uint64 =
>>>> (UINT64)(UINTN)PageDirectoryEntry;
>>>> +        PageDirectoryPointerEntry->Uint64 = 
>>>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64 
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>>>
>>>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>>>              //
>>>>              // Fill in the Page Directory entries
>>>>              //
>>>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>>>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>              PageDirectoryEntry->Bits.Present = 1;
>>>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git 
>>>> a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec 
>>>> index 273cd7e..207384f 100644
>>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>>> @@ -6,6 +6,8 @@
>>>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights 
>>>> reserved.<BR>  # Copyright (c) 2016, Linaro Ltd. All rights 
>>>> reserved.<BR>  # (C) Copyright 2016 Hewlett Packard Enterprise 
>>>> Development LP<BR>
>>>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>>  # This program and the accompanying materials are licensed and 
>>>> made available under  # the terms and conditions of the BSD License 
>>>> that accompanies this distribution.
>>>>  # The full text of the license may be found at @@ -1738,5 +1740,11 
>>>> @@ [PcdsDynamic, PcdsDynamicEx]
>>>>    # @Prompt If there is any test key used by the platform.
>>>>
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>>>> 0030003
>>>>
>>>> +  ## This dynamic PCD holds the address mask for page table 
>>>> + entries when memory encryption is  #  enabled on AMD processors 
>>>> + supporting the
>>>> Secure Encrypted Virtualization (SEV) feature.
>>>> +  #  This mask should be applied when creating 1:1 virtual to 
>>>> + physical
>>>> mapping tables.
>>>> +  #
>>>> +
>>>> +
>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>> ask|0x0
>>>> + |UINT64|0x00030004
>>>> +
>>>>  [UserExtensions.TianoCore."ExtraFiles"]
>>>>    MdeModulePkgExtra.uni
>>>> --
>>>> 1.9.1
>>>>
>>>> _______________________________________________
>>>> edk2-devel mailing list
>>>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org
> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>
>> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>>
>> <mailto:edk2-devel@lists.01.org>
>>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>>
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.01.org
> <mailto:edk2-devel@lists.01.org> <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Laszlo Ersek 7 years, 8 months ago
On 02/09/17 06:26, Zeng, Star wrote:
> Correct typo in below email.
> 
> "about how to determine DXE is 32BITs or 64BITs" should be "about how
> to determine PEI is 32BITs or 64BITs".
> 
> At that time, we were discussing if the code needs to allocate <4G
> ACPI table for PEI phase at S3 resume.

Indeed. Although OVMF X64 has a 64-bit PEI phase, that PEI phase can
access only <4G RAM. IIRC one suggestion was to introduce a new HOB for
this, so that PEI can advertise such a limitation to DXE.

Thanks
Laszlo


> 
> Thanks,
> Star
> -----Original Message-----
> From: Zeng, Star 
> Sent: Thursday, February 9, 2017 1:12 PM
> To: Laszlo Ersek <lersek@redhat.com>; Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo <leo.duran@amd.com>; edk2-devel@ml01.01.org
> Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>; Zeng, Star <star.zeng@intel.com>
> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
> 
> In fact, X64 DxeIplPeim does not refer PcdDxeIplSwitchToLongMode at all.
> 
> DxeIpl.inf:
> [FeaturePcd.IA32]
>   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode      ## CONSUMES
> 
> As I remember, I did a draft patch below before for the discussion about how to determine DXE is 32BITs or 64BITs in title "[edk2] [PATCH v3 2/4] IntelFrameworkModulePkg: BdsDxe: only allocate below 4 GB if needed", I can't find the archive link any more.
> 
> ---
>  MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c | 5 +++++
>  MdeModulePkg/MdeModulePkg.dec                  | 4 +++-
>  2 files changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
> index 6488880..348e084 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
> @@ -43,6 +43,11 @@ HandOffToDxeCore (
>    EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;
>  
>    //
> +  // It should be FALSE for both PEI and DXE are 64-bit.
> +  //
> +  ASSERT (PcdGetBool (PcdDxeIplSwitchToLongMode) == FALSE);
> +
> +  //
>    // Get Vector Hand-off Info PPI and build Guided HOB
>    //
>    Status = PeiServicesLocatePpi (
> diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index af7bcab..4a73f7b 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -712,8 +712,10 @@
>    ## Indicates if DxeIpl should switch to long mode to enter DXE phase.
>    #  It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore
>    #  is built in firmware.<BR><BR>
> +  #  And it should be FALSE for both PEI and DXE are 64-bit.
>    #   TRUE  - DxeIpl will load a 64-bit DxeCore and switch to long mode to hand over to DxeCore.<BR>
> -  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore.<BR>
> +  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore,<BR>
> +  #           or both PEI and DXE are 64-bit.<BR>
>    # @Prompt DxeIpl switch to long mode.
>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|TRUE|BOOLEAN|0x0001003b
>  
> --
> 
> 
> Thanks,
> Star
> -----Original Message-----
> From: Laszlo Ersek [mailto:lersek@redhat.com]
> Sent: Thursday, February 9, 2017 3:48 AM
> To: Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; edk2-devel@ml01.01.org
> Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
> 
> On 02/08/17 19:20, Yao, Jiewen wrote:
>> Got it.
>>
>>  
>>
>> If the means of PcdDxeIplSwitchtoLongMode  is unclear, we may add more 
>> description to make it clear.
>>
>>  
>>
>> If we believe "PcdDxeIplSwitchtoLongMode  == DXE is Long mode" as 
>> final conclusion, can we treat that as a bug and fix OVMF X64?
> 
> I don't know how to "fix" that. What is there to fix?
> 
> Flipping the PCD to TRUE in OVMF X64 would break OVMF X64, and likely OVMF Ia32X64 too. For two reasons:
> 
> 
> (1) Toggling the PCD would alter the behavior of the DXE IPL PEIM and/or the DXE Core, and that behavior has never ever been tested with OVMF X64.
> 
> The PcdDxeIplSwitchToLongMode=FALSE setting in the X64 DSC dates back to:
> 
>   commit 8fa729a8b1401f01c6fd8ddbcab45e4a4904fa9a
>   Author: lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
>   Date:   Mon Mar 15 01:40:59 2010 +0000
> 
>       Merge the same type PCD section.
> 
>       git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10243 6f19259b-4bc3-4df7-8a09-765794883524
> 
> and before that, to:
> 
>   commit 49ba9447c92d6fca214476381107a180d08e59d1
>   Author: jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
>   Date:   Wed May 27 21:10:18 2009 +0000
> 
>       Add initial version of Open Virtual Machine Firmware (OVMF) platform.
> 
>       git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8398 6f19259b-4bc3-4df7-8a09-765794883524
> 
> In other words, OVMF X64 has always worked like this, since its inception.
> 
> 
> (2) PEI code under OvmfPkg itself uses this PCD to identify a 32-bit DXE phase.
> 
>     //
>     // If DXE is 32-bit, then we're done; PciBusDxe will degrade 64-bit MMIO
>     // resources to 32-bit anyway. See DegradeResource() in
>     // "PciResourceSupport.c".
>     //
>   #ifdef MDE_CPU_IA32
>     if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>       return FirstNonAddress;
>     }
>   #endif
> 
> and
> 
>     //
>     // If DXE is 32-bit, then just return the traditional 64 MB cap.
>     //
>   #ifdef MDE_CPU_IA32
>     if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>       return SIZE_64MB;
>     }
>   #endif
> 
> Thanks
> Laszlo
> 
>>
>>  
>>
>> Thank you
>>
>> Yao Jiewen
>>
>>  
>>
>>  
>>
>> *From:*Laszlo Ersek [mailto:lersek@redhat.com]
>> *Sent:* Wednesday, February 8, 2017 9:52 AM
>> *To:* Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo 
>> <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; 
>> edk2-devel@ml01.01.org
>> *Cc:* Tian, Feng <feng.tian@intel.com>; Singh, Brijesh 
>> <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
>> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>> PcdPteMemoryEncryptionAddressOrMask
>>
>>  
>>
>> On 02/08/17 18:27, Yao, Jiewen wrote:
>>> I believe PcdDxeIplSwitchtoLongMode  == DXE is Long mode.
>>>
>>>  
>>>
>>> See DEC description:
>>>
>>>   #  It is assumed that 64-bit DxeCore is built in firmware if it is 
>>> true; otherwise 32-bit DxeCore
>>>
>>>   #  is built in firmware.<BR><BR>
>>
>> Unfortunately, I have no historical context or background for this 
>> PCD; all I can say is that the X64 OVMF platform does not set the PCD.
>>
>> It enters long mode, and sets up page tables for the first 4GB of RAM, 
>> in SEC. Then SEC decompresses the flash contents to RAM, which covers 
>> both PEIFV and DXEFV. PEI runs from RAM.
>>
>> This is possible because on QEMU/KVM, there's no need to initialize 
>> RAM, thus only SEC runs from flash, in-place.
>>
>> Perhaps Jordan can provide more insight.
>>
>> If Brijesh and Leo would like to run the X64 OVMF platform as a SEV 
>> guest too, then this should be considered, in my opinion.
>>
>> One more comment below:
>>
>>>
>>>  
>>>
>>> And the code MdeModulePkg\Universal\Acpi\S3SaveStateDxe\AcpiS3ContextSave.c:
>>>
>>>  
>>>
>>> BOOLEAN
>>>
>>> IsLongModeWakingVectorSupport (
>>>
>>>   IN EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*Facs
>>>
>>>   )
>>>
>>> {
>>>
>>>   if((Facs == NULL) ||
>>>
>>>       (Facs->Signature !=
>>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ) {
>>>
>>>     //
>>>
>>>     // Something wrong with FACS.
>>>
>>>     //
>>>
>>>     returnFALSE;
>>>
>>>   }
>>>
>>>   if((Facs->Version ==
>>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION) &&
>>>
>>>       ((Facs->Flags & EFI_ACPI_4_0_64BIT_WAKE_SUPPORTED_F) != 0)) {
>>>
>>>     //
>>>
>>>     // BIOS supports 64bit waking vector.
>>>
>>>     //
>>>
>>>     if(FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>>>
>>>       returnTRUE;
>>>
>>>     }
>>>
>>>   }
>>>
>>>   returnFALSE;
>>>
>>> }
>>
>> In practice, it's okay if the OVMF X64 platform is recognized as "not 
>> supporting a 64-bit waking vector for S3 resume". All the 64-bit guest 
>> OSes that I've tested with OVMF X64 (Linux, and the Windows 7 / 8 / 10 
>> families, both client and server) use a real mode (16-bit) waking 
>> vector, in practice.
>>
>> ... Actually, upon reviewing the above code more carefully, we don't 
>> even reach the FeaturePcdGet() call: the FACS that QEMU generates (and 
>> OVMF downloads and installs) corresponds to ACPI 1.0, that is, 
>> EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION.
>>
>> Thanks
>> Laszlo
>>
>>
>>>
>>>  
>>>
>>>  
>>>
>>> Thank you
>>>
>>> Yao Jiewen
>>>
>>>  
>>>
>>> *From:*edk2-devel [mailto:edk2-devel-bounces@lists.01.org] *On Behalf 
>>> Of *Yao, Jiewen
>>> *Sent:* Wednesday, February 8, 2017 9:18 AM
>>> *To:* Laszlo Ersek <lersek@redhat.com
>> <mailto:lersek@redhat.com>>; Duran, Leo <leo.duran@amd.com 
>> <mailto:leo.duran@amd.com>>;
>>> Zeng, Star <star.zeng@intel.com
>> <mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org 
>> <mailto:edk2-devel@ml01.01.org>
>>> *Cc:* Tian, Feng <feng.tian@intel.com <mailto:feng.tian@intel.com>>; 
>>> Singh, Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com>>
>>> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>>  
>>>
>>> Good reminder. I take back my word.
>>>
>>> In this case, we need consume PcdPteMemoryEncryptionAddressOrMask  in IA32 mode to build X64 paging.
>>>
>>> We need
>>>
>>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>>> Sent: Wednesday, February 8, 2017 9:11 AM
>>> To: Yao, Jiewen <jiewen.yao@intel.com
>> <mailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com>>; 
>> Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com%0b>> 
>> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com 
>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>; 
>> edk2-devel@ml01.01.org <mailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org>
>>> Cc: Tian, Feng <feng.tian@intel.com
>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com>>; Singh, 
>> Brijesh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com%0b>>
>> <mailto:brijesh.singh@amd.com>>
>>> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>> On 02/08/17 18:05, Yao, Jiewen wrote:
>>>> HI Leo
>>>>
>>>> Thanks to clarify that.
>>>>
>>>>
>>>>
>>>> If that is the case, do you think it will be better to limit this 
>>>> PCD to
>>>> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
>>>
>>> Not sure if this is the best place to raise the following 
>>> observation, but it should do:
>>>
>>> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE 
>>> if PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
>>> - both PEI and DXE are 32-bit, and
>>> - both PEI and DXE are 64-bit.
>>>
>>> This doesn't necessarily invalidate anything said thus fair in the 
>>> thread, but the following statement from Leo:
>>>
>>>     The SEV feature requires 64-bit LongMode, so the
>>>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
>>>
>>> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
>>>
>>> Thanks,
>>> Laszlo
>>>
>>>>
>>>>
>>>>
>>>> Thank you
>>>>
>>>> Yao Jiewen
>>>>
>>>>
>>>>
>>>> *From:*Duran, Leo [mailto:leo.duran@amd.com]
>>>> *Sent:* Wednesday, February 8, 2017 9:00 AM
>>>> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com
>> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com%0b>>
>> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>;
>> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>>> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com
>> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com%0b>>
>> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Tian, Feng
>>>> <feng.tian@intel.com<mailto:feng.tian@intel.com
>> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com%0b>>
>> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>; Singh, 
>> Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
>> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com%0b>>
>> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Yao,
>>>> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
>> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com%0b>>
>> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com>>>
>>>> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>>
>>>>
>>>> Pease see reply below.
>>>> Leo
>>>>
>>>>> -----Original Message-----
>>>>> From: Zeng, Star [mailto:star.zeng@intel.com]
>>>>> Sent: Tuesday, February 07, 2017 8:27 PM
>>>>> To: Duran, Leo <leo.duran@amd.com
>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
>>>>> %3cmailto:leo.duran@amd.com
>> <mailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com>>>>;
>> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>>> <mailto:edk2-devel@ml01.01.org>
>>>>> Cc: Laszlo Ersek <lersek@redhat.com
>> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b 
>> <mailto:lersek@redhat.com%0b%0b>> 
>> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>>
>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com 
>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b 
>> <mailto:feng.tian@intel.com%0b%0b>>
>> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>>
>> <mailto:feng.tian@intel.com>>;
>>>>> Singh, Brijesh <brijesh.singh@amd.com
>> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b 
>> <mailto:brijesh.singh@amd.com%0b%0b>>
>> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>>
>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com 
>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b 
>> <mailto:star.zeng@intel.com%0b%0b>>
>> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>>
>> <mailto:star.zeng@intel.com>>;
>>>>> Yao, Jiewen <jiewen.yao@intel.com
>>>>> <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
>>>>> %3cmailto:jiewen.yao@intel.com
>> <mailto:jiewen.yao@intel.com
>> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com
>> %3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com 
>> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com
>> %3cmailto:jiewen.yao@intel.com>>>>
>>>>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>>
>>>>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>>>>
>>>>> Thanks,
>>>>> Star
>>>> [Duran, Leo]
>>>> Hi Star,
>>>> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>>>>
>>>> The SEV feature requires 64-bit LongMode, so the 
>>>> PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time, in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
>>>>
>>>>> -----Original Message-----
>>>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf 
>>>>> Of Leo Duran
>>>>> Sent: Wednesday, February 8, 2017 3:54 AM
>>>>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>> <mailto:edk2-devel@ml01.01.org>
>>>>> Cc: Laszlo Ersek <lersek@redhat.com
>> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b 
>> <mailto:lersek@redhat.com%0b%0b>> 
>> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>>
>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com 
>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b 
>> <mailto:feng.tian@intel.com%0b%0b>>
>> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>>
>> <mailto:feng.tian@intel.com>>;
>>>>> Brijesh Singh <brijesh.singh@amd.com
>> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b 
>> <mailto:brijesh.singh@amd.com%0b%0b>>
>> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>>
>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com 
>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b 
>> <mailto:star.zeng@intel.com%0b%0b>>
>> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>>
>> <mailto:star.zeng@intel.com>>;
>>>>> Leo Duran <leo.duran@amd.com
>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
>>>>> %3cmailto:leo.duran@amd.com
>> <mailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com>>>>
>>>>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>>
>>>>> From: Brijesh Singh <brijesh.singh@amd.com 
>>>>> <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
>>>>> %3cmailto:brijesh.singh@amd.com
>> <mailto:brijesh.singh@amd.com
>> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com
>> %3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com 
>> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com
>> %3cmailto:brijesh.singh@amd.com>>>>
>>>>>
>>>>> This dynamic PCD holds the address mask for page table entries when 
>>>>> memory encryption is enabled on AMD processors supporting the 
>>>>> Secure Encrypted Virtualization (SEV) feature.
>>>>>
>>>>> Cc: Feng Tian <feng.tian@intel.com 
>>>>> <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com
>>>>> %3cmailto:feng.tian@intel.com
>> <mailto:feng.tian@intel.com
>> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com
>> %3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com 
>> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com
>> %3cmailto:feng.tian@intel.com>>>>
>>>>> Cc: Star Zeng <star.zeng@intel.com 
>>>>> <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com
>>>>> %3cmailto:star.zeng@intel.com
>> <mailto:star.zeng@intel.com
>> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com
>> %3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com 
>> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com
>> %3cmailto:star.zeng@intel.com>>>>
>>>>> Cc: Laszlo Ersek <lersek@redhat.com 
>>>>> <mailto:lersek@redhat.com<mailto:lersek@redhat.com
>>>>> %3cmailto:lersek@redhat.com
>> <mailto:lersek@redhat.com
>> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com
>> %3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com 
>> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com
>> %3cmailto:lersek@redhat.com>>>>
>>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>>> Signed-off-by: Leo Duran <leo.duran@amd.com 
>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
>>>>> %3cmailto:leo.duran@amd.com
>> <mailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com>>>>
>>>>> ---
>>>>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>>>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
>>>>> ------
>>>>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>>>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>>>>
>>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> index 2bc41be..d62bd9b 100644
>>>>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> @@ -6,6 +6,8 @@
>>>>>  #  needed to run the DXE Foundation.
>>>>>  #
>>>>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights 
>>>>> reserved.<BR>
>>>>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> 
>>>>> +#
>>>>>  #  This program and the accompanying materials  #  are licensed 
>>>>> and made available under the terms and conditions of the BSD 
>>>>> License  #  which accompanies this distribution.  The full text of 
>>>>> the license may be found at @@ -111,7 +113,8 @@ [FeaturePcd]
>>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ## 
>>>>> CONSUMES
>>>>>
>>>>>  [Pcd.IA32,Pcd.X64]
>>>>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>>>>> SOMETIMES_CONSUMES
>>>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>>>>> SOMETIMES_CONSUMES
>>>>> +
>>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>>> ask    ## CONSUMES
>>>>>
>>>>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>>>>> SOMETIMES_CONSUMES
>>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> index 790f6ab..2c52389 100644
>>>>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> @@ -16,6 +16,8 @@
>>>>>      3) IA-32 Intel(R) Architecture Software Developer's Manual 
>>>>> Volume 3:System Programmer's Guide, Intel
>>>>>
>>>>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights 
>>>>> reserved.<BR>
>>>>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>>>> +
>>>>>  This program and the accompanying materials  are licensed and made 
>>>>> available under the terms and conditions of the BSD License  which 
>>>>> accompanies this distribution.  The full text of the license may be 
>>>>> found at @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>>>>    //
>>>>>    // Fill in 2M page entry.
>>>>>    //
>>>>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P | 
>>>>> IA32_PG_RW;
>>>>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>>
>>>>>    PhysicalAddress4K = PhysicalAddress;
>>>>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>>>>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>>>>> SIZE_4KB) {
>>>>>      //
>>>>>      // Fill in the Page Table entries
>>>>>      //
>>>>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>>>>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64 
>>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>>      PageTableEntry->Bits.ReadWrite = 1;
>>>>>      PageTableEntry->Bits.Present = 1;
>>>>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < 
>>>>> StackBase +
>>>>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>>>>    //
>>>>>    // Fill in 1G page entry.
>>>>>    //
>>>>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P | 
>>>>> IA32_PG_RW;
>>>>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>>
>>>>>    PhysicalAddress2M = PhysicalAddress;
>>>>>    for (IndexOfPageDirectoryEntries = 0; 
>>>>> IndexOfPageDirectoryEntries < 512;
>>>>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, 
>>>>> IndexOfPageDirectoryEntries++PhysicalAddress2M
>>>>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>>>>        //
>>>>>        // Fill in the Page Directory entries
>>>>>        //
>>>>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>>>>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>>        PageDirectoryEntry->Bits.Present = 1;
>>>>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@ 
>>>>> CreateIdentityMappingPageTables (
>>>>>      //
>>>>>      // Make a PML4 Entry
>>>>>      //
>>>>> -    PageMapLevel4Entry->Uint64 =
>>>>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>>>>> +    PageMapLevel4Entry->Uint64 =
>>>>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64 
>>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>>>>      PageMapLevel4Entry->Bits.Present = 1;
>>>>>
>>>>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>>>>            //
>>>>>            // Fill in the Page Directory entries
>>>>>            //
>>>>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>>>>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress |
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>>>>            PageDirectory1GEntry->Bits.Present = 1;
>>>>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 
>>>>> @@ CreateIdentityMappingPageTables (
>>>>>          //
>>>>>          // Fill in a Page Directory Pointer Entries
>>>>>          //
>>>>> -        PageDirectoryPointerEntry->Uint64 =
>>>>> (UINT64)(UINTN)PageDirectoryEntry;
>>>>> +        PageDirectoryPointerEntry->Uint64 = 
>>>>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64 
>>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>>>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>>>>
>>>>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>>>>              //
>>>>>              // Fill in the Page Directory entries
>>>>>              //
>>>>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>>>>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress |
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>>              PageDirectoryEntry->Bits.Present = 1;
>>>>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git 
>>>>> a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec 
>>>>> index 273cd7e..207384f 100644
>>>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>>>> @@ -6,6 +6,8 @@
>>>>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights 
>>>>> reserved.<BR>  # Copyright (c) 2016, Linaro Ltd. All rights 
>>>>> reserved.<BR>  # (C) Copyright 2016 Hewlett Packard Enterprise 
>>>>> Development LP<BR>
>>>>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>>>  # This program and the accompanying materials are licensed and 
>>>>> made available under  # the terms and conditions of the BSD License 
>>>>> that accompanies this distribution.
>>>>>  # The full text of the license may be found at @@ -1738,5 +1740,11 
>>>>> @@ [PcdsDynamic, PcdsDynamicEx]
>>>>>    # @Prompt If there is any test key used by the platform.
>>>>>
>>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>>>>> 0030003
>>>>>
>>>>> +  ## This dynamic PCD holds the address mask for page table 
>>>>> + entries when memory encryption is  #  enabled on AMD processors 
>>>>> + supporting the
>>>>> Secure Encrypted Virtualization (SEV) feature.
>>>>> +  #  This mask should be applied when creating 1:1 virtual to 
>>>>> + physical
>>>>> mapping tables.
>>>>> +  #
>>>>> +
>>>>> +
>>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>>> ask|0x0
>>>>> + |UINT64|0x00030004
>>>>> +
>>>>>  [UserExtensions.TianoCore."ExtraFiles"]
>>>>>    MdeModulePkgExtra.uni
>>>>> --
>>>>> 1.9.1
>>>>>
>>>>> _______________________________________________
>>>>> edk2-devel mailing list
>>>>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org
>> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>
>>> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>>
>>> <mailto:edk2-devel@lists.01.org>
>>>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>>>
>>> _______________________________________________
>>> edk2-devel mailing list
>>> edk2-devel@lists.01.org
>> <mailto:edk2-devel@lists.01.org> <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Zeng, Star 7 years, 8 months ago
EFI_HOB_CPU?
Is there discussion in PIWG for it?

Thanks,
Star
-----Original Message-----
From: Laszlo Ersek [mailto:lersek@redhat.com] 
Sent: Thursday, February 9, 2017 5:13 PM
To: Zeng, Star <star.zeng@intel.com>; Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo <leo.duran@amd.com>; edk2-devel@ml01.01.org
Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

On 02/09/17 06:26, Zeng, Star wrote:
> Correct typo in below email.
> 
> "about how to determine DXE is 32BITs or 64BITs" should be "about how 
> to determine PEI is 32BITs or 64BITs".
> 
> At that time, we were discussing if the code needs to allocate <4G 
> ACPI table for PEI phase at S3 resume.

Indeed. Although OVMF X64 has a 64-bit PEI phase, that PEI phase can access only <4G RAM. IIRC one suggestion was to introduce a new HOB for this, so that PEI can advertise such a limitation to DXE.

Thanks
Laszlo


> 
> Thanks,
> Star
> -----Original Message-----
> From: Zeng, Star
> Sent: Thursday, February 9, 2017 1:12 PM
> To: Laszlo Ersek <lersek@redhat.com>; Yao, Jiewen 
> <jiewen.yao@intel.com>; Duran, Leo <leo.duran@amd.com>; 
> edk2-devel@ml01.01.org
> Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh 
> <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>; 
> Zeng, Star <star.zeng@intel.com>
> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
> PcdPteMemoryEncryptionAddressOrMask
> 
> In fact, X64 DxeIplPeim does not refer PcdDxeIplSwitchToLongMode at all.
> 
> DxeIpl.inf:
> [FeaturePcd.IA32]
>   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode      ## CONSUMES
> 
> As I remember, I did a draft patch below before for the discussion about how to determine DXE is 32BITs or 64BITs in title "[edk2] [PATCH v3 2/4] IntelFrameworkModulePkg: BdsDxe: only allocate below 4 GB if needed", I can't find the archive link any more.
> 
> ---
>  MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c | 5 +++++
>  MdeModulePkg/MdeModulePkg.dec                  | 4 +++-
>  2 files changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c 
> b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
> index 6488880..348e084 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
> @@ -43,6 +43,11 @@ HandOffToDxeCore (
>    EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;
>  
>    //
> +  // It should be FALSE for both PEI and DXE are 64-bit.
> +  //
> +  ASSERT (PcdGetBool (PcdDxeIplSwitchToLongMode) == FALSE);
> +
> +  //
>    // Get Vector Hand-off Info PPI and build Guided HOB
>    //
>    Status = PeiServicesLocatePpi (
> diff --git a/MdeModulePkg/MdeModulePkg.dec 
> b/MdeModulePkg/MdeModulePkg.dec index af7bcab..4a73f7b 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -712,8 +712,10 @@
>    ## Indicates if DxeIpl should switch to long mode to enter DXE phase.
>    #  It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore
>    #  is built in firmware.<BR><BR>
> +  #  And it should be FALSE for both PEI and DXE are 64-bit.
>    #   TRUE  - DxeIpl will load a 64-bit DxeCore and switch to long mode to hand over to DxeCore.<BR>
> -  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore.<BR>
> +  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore,<BR>
> +  #           or both PEI and DXE are 64-bit.<BR>
>    # @Prompt DxeIpl switch to long mode.
>    
> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|TRUE|BOOLEAN|
> 0x0001003b
>  
> --
> 
> 
> Thanks,
> Star
> -----Original Message-----
> From: Laszlo Ersek [mailto:lersek@redhat.com]
> Sent: Thursday, February 9, 2017 3:48 AM
> To: Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo 
> <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; 
> edk2-devel@ml01.01.org
> Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh 
> <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
> PcdPteMemoryEncryptionAddressOrMask
> 
> On 02/08/17 19:20, Yao, Jiewen wrote:
>> Got it.
>>
>>  
>>
>> If the means of PcdDxeIplSwitchtoLongMode  is unclear, we may add 
>> more description to make it clear.
>>
>>  
>>
>> If we believe "PcdDxeIplSwitchtoLongMode  == DXE is Long mode" as 
>> final conclusion, can we treat that as a bug and fix OVMF X64?
> 
> I don't know how to "fix" that. What is there to fix?
> 
> Flipping the PCD to TRUE in OVMF X64 would break OVMF X64, and likely OVMF Ia32X64 too. For two reasons:
> 
> 
> (1) Toggling the PCD would alter the behavior of the DXE IPL PEIM and/or the DXE Core, and that behavior has never ever been tested with OVMF X64.
> 
> The PcdDxeIplSwitchToLongMode=FALSE setting in the X64 DSC dates back to:
> 
>   commit 8fa729a8b1401f01c6fd8ddbcab45e4a4904fa9a
>   Author: lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
>   Date:   Mon Mar 15 01:40:59 2010 +0000
> 
>       Merge the same type PCD section.
> 
>       git-svn-id: 
> https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10243 
> 6f19259b-4bc3-4df7-8a09-765794883524
> 
> and before that, to:
> 
>   commit 49ba9447c92d6fca214476381107a180d08e59d1
>   Author: jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
>   Date:   Wed May 27 21:10:18 2009 +0000
> 
>       Add initial version of Open Virtual Machine Firmware (OVMF) platform.
> 
>       git-svn-id: 
> https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8398 
> 6f19259b-4bc3-4df7-8a09-765794883524
> 
> In other words, OVMF X64 has always worked like this, since its inception.
> 
> 
> (2) PEI code under OvmfPkg itself uses this PCD to identify a 32-bit DXE phase.
> 
>     //
>     // If DXE is 32-bit, then we're done; PciBusDxe will degrade 64-bit MMIO
>     // resources to 32-bit anyway. See DegradeResource() in
>     // "PciResourceSupport.c".
>     //
>   #ifdef MDE_CPU_IA32
>     if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>       return FirstNonAddress;
>     }
>   #endif
> 
> and
> 
>     //
>     // If DXE is 32-bit, then just return the traditional 64 MB cap.
>     //
>   #ifdef MDE_CPU_IA32
>     if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>       return SIZE_64MB;
>     }
>   #endif
> 
> Thanks
> Laszlo
> 
>>
>>  
>>
>> Thank you
>>
>> Yao Jiewen
>>
>>  
>>
>>  
>>
>> *From:*Laszlo Ersek [mailto:lersek@redhat.com]
>> *Sent:* Wednesday, February 8, 2017 9:52 AM
>> *To:* Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo 
>> <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; 
>> edk2-devel@ml01.01.org
>> *Cc:* Tian, Feng <feng.tian@intel.com>; Singh, Brijesh 
>> <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
>> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>> PcdPteMemoryEncryptionAddressOrMask
>>
>>  
>>
>> On 02/08/17 18:27, Yao, Jiewen wrote:
>>> I believe PcdDxeIplSwitchtoLongMode  == DXE is Long mode.
>>>
>>>  
>>>
>>> See DEC description:
>>>
>>>   #  It is assumed that 64-bit DxeCore is built in firmware if it is 
>>> true; otherwise 32-bit DxeCore
>>>
>>>   #  is built in firmware.<BR><BR>
>>
>> Unfortunately, I have no historical context or background for this 
>> PCD; all I can say is that the X64 OVMF platform does not set the PCD.
>>
>> It enters long mode, and sets up page tables for the first 4GB of 
>> RAM, in SEC. Then SEC decompresses the flash contents to RAM, which 
>> covers both PEIFV and DXEFV. PEI runs from RAM.
>>
>> This is possible because on QEMU/KVM, there's no need to initialize 
>> RAM, thus only SEC runs from flash, in-place.
>>
>> Perhaps Jordan can provide more insight.
>>
>> If Brijesh and Leo would like to run the X64 OVMF platform as a SEV 
>> guest too, then this should be considered, in my opinion.
>>
>> One more comment below:
>>
>>>
>>>  
>>>
>>> And the code MdeModulePkg\Universal\Acpi\S3SaveStateDxe\AcpiS3ContextSave.c:
>>>
>>>  
>>>
>>> BOOLEAN
>>>
>>> IsLongModeWakingVectorSupport (
>>>
>>>   IN EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*Facs
>>>
>>>   )
>>>
>>> {
>>>
>>>   if((Facs == NULL) ||
>>>
>>>       (Facs->Signature !=
>>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ) {
>>>
>>>     //
>>>
>>>     // Something wrong with FACS.
>>>
>>>     //
>>>
>>>     returnFALSE;
>>>
>>>   }
>>>
>>>   if((Facs->Version ==
>>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION) &&
>>>
>>>       ((Facs->Flags & EFI_ACPI_4_0_64BIT_WAKE_SUPPORTED_F) != 0)) {
>>>
>>>     //
>>>
>>>     // BIOS supports 64bit waking vector.
>>>
>>>     //
>>>
>>>     if(FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>>>
>>>       returnTRUE;
>>>
>>>     }
>>>
>>>   }
>>>
>>>   returnFALSE;
>>>
>>> }
>>
>> In practice, it's okay if the OVMF X64 platform is recognized as "not 
>> supporting a 64-bit waking vector for S3 resume". All the 64-bit 
>> guest OSes that I've tested with OVMF X64 (Linux, and the Windows 7 / 
>> 8 / 10 families, both client and server) use a real mode (16-bit) 
>> waking vector, in practice.
>>
>> ... Actually, upon reviewing the above code more carefully, we don't 
>> even reach the FeaturePcdGet() call: the FACS that QEMU generates 
>> (and OVMF downloads and installs) corresponds to ACPI 1.0, that is, 
>> EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION.
>>
>> Thanks
>> Laszlo
>>
>>
>>>
>>>  
>>>
>>>  
>>>
>>> Thank you
>>>
>>> Yao Jiewen
>>>
>>>  
>>>
>>> *From:*edk2-devel [mailto:edk2-devel-bounces@lists.01.org] *On 
>>> Behalf Of *Yao, Jiewen
>>> *Sent:* Wednesday, February 8, 2017 9:18 AM
>>> *To:* Laszlo Ersek <lersek@redhat.com
>> <mailto:lersek@redhat.com>>; Duran, Leo <leo.duran@amd.com 
>> <mailto:leo.duran@amd.com>>;
>>> Zeng, Star <star.zeng@intel.com
>> <mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org 
>> <mailto:edk2-devel@ml01.01.org>
>>> *Cc:* Tian, Feng <feng.tian@intel.com <mailto:feng.tian@intel.com>>; 
>>> Singh, Brijesh <brijesh.singh@amd.com 
>>> <mailto:brijesh.singh@amd.com>>
>>> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>>  
>>>
>>> Good reminder. I take back my word.
>>>
>>> In this case, we need consume PcdPteMemoryEncryptionAddressOrMask  in IA32 mode to build X64 paging.
>>>
>>> We need
>>>
>>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>>> Sent: Wednesday, February 8, 2017 9:11 AM
>>> To: Yao, Jiewen <jiewen.yao@intel.com
>> <mailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com>>; 
>> Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com%0b>> 
>> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com 
>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>; 
>> edk2-devel@ml01.01.org <mailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org>
>>> Cc: Tian, Feng <feng.tian@intel.com
>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com>>; 
>> Singh, Brijesh <brijesh.singh@amd.com 
>> <mailto:brijesh.singh@amd.com%0b>>
>> <mailto:brijesh.singh@amd.com>>
>>> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>> On 02/08/17 18:05, Yao, Jiewen wrote:
>>>> HI Leo
>>>>
>>>> Thanks to clarify that.
>>>>
>>>>
>>>>
>>>> If that is the case, do you think it will be better to limit this 
>>>> PCD to
>>>> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
>>>
>>> Not sure if this is the best place to raise the following 
>>> observation, but it should do:
>>>
>>> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE 
>>> if PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
>>> - both PEI and DXE are 32-bit, and
>>> - both PEI and DXE are 64-bit.
>>>
>>> This doesn't necessarily invalidate anything said thus fair in the 
>>> thread, but the following statement from Leo:
>>>
>>>     The SEV feature requires 64-bit LongMode, so the
>>>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
>>>
>>> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
>>>
>>> Thanks,
>>> Laszlo
>>>
>>>>
>>>>
>>>>
>>>> Thank you
>>>>
>>>> Yao Jiewen
>>>>
>>>>
>>>>
>>>> *From:*Duran, Leo [mailto:leo.duran@amd.com]
>>>> *Sent:* Wednesday, February 8, 2017 9:00 AM
>>>> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com
>> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com%0b>>
>> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>;
>> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>>> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com
>> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com%0b>>
>> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Tian, Feng
>>>> <feng.tian@intel.com<mailto:feng.tian@intel.com
>> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com%0b>>
>> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>; Singh, 
>> Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
>> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com%0b>>
>> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Yao,
>>>> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
>> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com%0b>>
>> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com>>>
>>>> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>>
>>>>
>>>> Pease see reply below.
>>>> Leo
>>>>
>>>>> -----Original Message-----
>>>>> From: Zeng, Star [mailto:star.zeng@intel.com]
>>>>> Sent: Tuesday, February 07, 2017 8:27 PM
>>>>> To: Duran, Leo <leo.duran@amd.com
>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
>>>>> %3cmailto:leo.duran@amd.com
>> <mailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com>>>>;
>> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>>> <mailto:edk2-devel@ml01.01.org>
>>>>> Cc: Laszlo Ersek <lersek@redhat.com
>> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b 
>> <mailto:lersek@redhat.com%0b%0b>> 
>> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>>
>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com 
>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b 
>> <mailto:feng.tian@intel.com%0b%0b>>
>> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>>
>> <mailto:feng.tian@intel.com>>;
>>>>> Singh, Brijesh <brijesh.singh@amd.com
>> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b 
>> <mailto:brijesh.singh@amd.com%0b%0b>>
>> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>>
>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com 
>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b 
>> <mailto:star.zeng@intel.com%0b%0b>>
>> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>>
>> <mailto:star.zeng@intel.com>>;
>>>>> Yao, Jiewen <jiewen.yao@intel.com
>>>>> <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
>>>>> %3cmailto:jiewen.yao@intel.com
>> <mailto:jiewen.yao@intel.com
>> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com
>> %3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com 
>> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com
>> %3cmailto:jiewen.yao@intel.com>>>>
>>>>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>>
>>>>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>>>>
>>>>> Thanks,
>>>>> Star
>>>> [Duran, Leo]
>>>> Hi Star,
>>>> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>>>>
>>>> The SEV feature requires 64-bit LongMode, so the 
>>>> PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time, in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
>>>>
>>>>> -----Original Message-----
>>>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On 
>>>>> Behalf Of Leo Duran
>>>>> Sent: Wednesday, February 8, 2017 3:54 AM
>>>>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>> <mailto:edk2-devel@ml01.01.org>
>>>>> Cc: Laszlo Ersek <lersek@redhat.com
>> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b 
>> <mailto:lersek@redhat.com%0b%0b>> 
>> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>>
>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com 
>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b 
>> <mailto:feng.tian@intel.com%0b%0b>>
>> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>>
>> <mailto:feng.tian@intel.com>>;
>>>>> Brijesh Singh <brijesh.singh@amd.com
>> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b 
>> <mailto:brijesh.singh@amd.com%0b%0b>>
>> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>>
>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com 
>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b 
>> <mailto:star.zeng@intel.com%0b%0b>>
>> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>>
>> <mailto:star.zeng@intel.com>>;
>>>>> Leo Duran <leo.duran@amd.com
>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
>>>>> %3cmailto:leo.duran@amd.com
>> <mailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com>>>>
>>>>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>>
>>>>> From: Brijesh Singh <brijesh.singh@amd.com 
>>>>> <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
>>>>> %3cmailto:brijesh.singh@amd.com
>> <mailto:brijesh.singh@amd.com
>> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com
>> %3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com 
>> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com
>> %3cmailto:brijesh.singh@amd.com>>>>
>>>>>
>>>>> This dynamic PCD holds the address mask for page table entries 
>>>>> when memory encryption is enabled on AMD processors supporting the 
>>>>> Secure Encrypted Virtualization (SEV) feature.
>>>>>
>>>>> Cc: Feng Tian <feng.tian@intel.com 
>>>>> <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com
>>>>> %3cmailto:feng.tian@intel.com
>> <mailto:feng.tian@intel.com
>> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com
>> %3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com 
>> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com
>> %3cmailto:feng.tian@intel.com>>>>
>>>>> Cc: Star Zeng <star.zeng@intel.com 
>>>>> <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com
>>>>> %3cmailto:star.zeng@intel.com
>> <mailto:star.zeng@intel.com
>> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com
>> %3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com 
>> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com
>> %3cmailto:star.zeng@intel.com>>>>
>>>>> Cc: Laszlo Ersek <lersek@redhat.com 
>>>>> <mailto:lersek@redhat.com<mailto:lersek@redhat.com
>>>>> %3cmailto:lersek@redhat.com
>> <mailto:lersek@redhat.com
>> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com
>> %3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com 
>> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com
>> %3cmailto:lersek@redhat.com>>>>
>>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>>> Signed-off-by: Leo Duran <leo.duran@amd.com 
>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
>>>>> %3cmailto:leo.duran@amd.com
>> <mailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>> %3cmailto:leo.duran@amd.com>>>>
>>>>> ---
>>>>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>>>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 
>>>>> ++++++++++--
>>>>> ------
>>>>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>>>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>>>>
>>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> index 2bc41be..d62bd9b 100644
>>>>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> @@ -6,6 +6,8 @@
>>>>>  #  needed to run the DXE Foundation.
>>>>>  #
>>>>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights 
>>>>> reserved.<BR>
>>>>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> 
>>>>> +#
>>>>>  #  This program and the accompanying materials  #  are licensed 
>>>>> and made available under the terms and conditions of the BSD 
>>>>> License  #  which accompanies this distribution.  The full text of 
>>>>> the license may be found at @@ -111,7 +113,8 @@ [FeaturePcd]
>>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress 
>>>>> ## CONSUMES
>>>>>
>>>>>  [Pcd.IA32,Pcd.X64]
>>>>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>>>>> SOMETIMES_CONSUMES
>>>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>>>>> SOMETIMES_CONSUMES
>>>>> +
>>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>>> ask    ## CONSUMES
>>>>>
>>>>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>>>>> SOMETIMES_CONSUMES
>>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> index 790f6ab..2c52389 100644
>>>>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> @@ -16,6 +16,8 @@
>>>>>      3) IA-32 Intel(R) Architecture Software Developer's Manual 
>>>>> Volume 3:System Programmer's Guide, Intel
>>>>>
>>>>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights 
>>>>> reserved.<BR>
>>>>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>>>> +
>>>>>  This program and the accompanying materials  are licensed and 
>>>>> made available under the terms and conditions of the BSD License  
>>>>> which accompanies this distribution.  The full text of the license 
>>>>> may be found at @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>>>>    //
>>>>>    // Fill in 2M page entry.
>>>>>    //
>>>>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P | 
>>>>> IA32_PG_RW;
>>>>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>>
>>>>>    PhysicalAddress4K = PhysicalAddress;
>>>>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 
>>>>> 512;
>>>>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>>>>> SIZE_4KB) {
>>>>>      //
>>>>>      // Fill in the Page Table entries
>>>>>      //
>>>>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>>>>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | 
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>      PageTableEntry->Bits.ReadWrite = 1;
>>>>>      PageTableEntry->Bits.Present = 1;
>>>>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < 
>>>>> StackBase +
>>>>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>>>>    //
>>>>>    // Fill in 1G page entry.
>>>>>    //
>>>>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P 
>>>>> | IA32_PG_RW;
>>>>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>>
>>>>>    PhysicalAddress2M = PhysicalAddress;
>>>>>    for (IndexOfPageDirectoryEntries = 0; 
>>>>> IndexOfPageDirectoryEntries < 512;
>>>>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, 
>>>>> IndexOfPageDirectoryEntries++PhysicalAddress2M
>>>>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>>>>        //
>>>>>        // Fill in the Page Directory entries
>>>>>        //
>>>>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>>>>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>>        PageDirectoryEntry->Bits.Present = 1;
>>>>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@ 
>>>>> CreateIdentityMappingPageTables (
>>>>>      //
>>>>>      // Make a PML4 Entry
>>>>>      //
>>>>> -    PageMapLevel4Entry->Uint64 =
>>>>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>>>>> +    PageMapLevel4Entry->Uint64 =
>>>>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64 
>>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>>>>      PageMapLevel4Entry->Bits.Present = 1;
>>>>>
>>>>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>>>>            //
>>>>>            // Fill in the Page Directory entries
>>>>>            //
>>>>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>>>>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress |
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>>>>            PageDirectory1GEntry->Bits.Present = 1;
>>>>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 
>>>>> +282,7 @@ CreateIdentityMappingPageTables (
>>>>>          //
>>>>>          // Fill in a Page Directory Pointer Entries
>>>>>          //
>>>>> -        PageDirectoryPointerEntry->Uint64 =
>>>>> (UINT64)(UINTN)PageDirectoryEntry;
>>>>> +        PageDirectoryPointerEntry->Uint64 = 
>>>>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64 
>>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>>>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>>>>
>>>>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>>>>              //
>>>>>              // Fill in the Page Directory entries
>>>>>              //
>>>>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>>>>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress |
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>>              PageDirectoryEntry->Bits.Present = 1;
>>>>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git 
>>>>> a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec 
>>>>> index 273cd7e..207384f 100644
>>>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>>>> @@ -6,6 +6,8 @@
>>>>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights 
>>>>> reserved.<BR>  # Copyright (c) 2016, Linaro Ltd. All rights 
>>>>> reserved.<BR>  # (C) Copyright 2016 Hewlett Packard Enterprise 
>>>>> Development LP<BR>
>>>>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> 
>>>>> +#
>>>>>  # This program and the accompanying materials are licensed and 
>>>>> made available under  # the terms and conditions of the BSD 
>>>>> License that accompanies this distribution.
>>>>>  # The full text of the license may be found at @@ -1738,5 
>>>>> +1740,11 @@ [PcdsDynamic, PcdsDynamicEx]
>>>>>    # @Prompt If there is any test key used by the platform.
>>>>>
>>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>>>>> 0030003
>>>>>
>>>>> +  ## This dynamic PCD holds the address mask for page table 
>>>>> + entries when memory encryption is  #  enabled on AMD processors 
>>>>> + supporting the
>>>>> Secure Encrypted Virtualization (SEV) feature.
>>>>> +  #  This mask should be applied when creating 1:1 virtual to 
>>>>> + physical
>>>>> mapping tables.
>>>>> +  #
>>>>> +
>>>>> +
>>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>>> ask|0x0
>>>>> + |UINT64|0x00030004
>>>>> +
>>>>>  [UserExtensions.TianoCore."ExtraFiles"]
>>>>>    MdeModulePkgExtra.uni
>>>>> --
>>>>> 1.9.1
>>>>>
>>>>> _______________________________________________
>>>>> edk2-devel mailing list
>>>>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org
>> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>
>>> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>>
>>> <mailto:edk2-devel@lists.01.org>
>>>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>>>
>>> _______________________________________________
>>> edk2-devel mailing list
>>> edk2-devel@lists.01.org
>> <mailto:edk2-devel@lists.01.org> <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Laszlo Ersek 7 years, 8 months ago
On 02/09/17 10:17, Zeng, Star wrote:
> EFI_HOB_CPU?
> Is there discussion in PIWG for it?

None that I'm aware of.

Thanks
Laszlo

> 
> Thanks,
> Star
> -----Original Message-----
> From: Laszlo Ersek [mailto:lersek@redhat.com] 
> Sent: Thursday, February 9, 2017 5:13 PM
> To: Zeng, Star <star.zeng@intel.com>; Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo <leo.duran@amd.com>; edk2-devel@ml01.01.org
> Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
> 
> On 02/09/17 06:26, Zeng, Star wrote:
>> Correct typo in below email.
>>
>> "about how to determine DXE is 32BITs or 64BITs" should be "about how 
>> to determine PEI is 32BITs or 64BITs".
>>
>> At that time, we were discussing if the code needs to allocate <4G 
>> ACPI table for PEI phase at S3 resume.
> 
> Indeed. Although OVMF X64 has a 64-bit PEI phase, that PEI phase can access only <4G RAM. IIRC one suggestion was to introduce a new HOB for this, so that PEI can advertise such a limitation to DXE.
> 
> Thanks
> Laszlo
> 
> 
>>
>> Thanks,
>> Star
>> -----Original Message-----
>> From: Zeng, Star
>> Sent: Thursday, February 9, 2017 1:12 PM
>> To: Laszlo Ersek <lersek@redhat.com>; Yao, Jiewen 
>> <jiewen.yao@intel.com>; Duran, Leo <leo.duran@amd.com>; 
>> edk2-devel@ml01.01.org
>> Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh 
>> <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>; 
>> Zeng, Star <star.zeng@intel.com>
>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>> PcdPteMemoryEncryptionAddressOrMask
>>
>> In fact, X64 DxeIplPeim does not refer PcdDxeIplSwitchToLongMode at all.
>>
>> DxeIpl.inf:
>> [FeaturePcd.IA32]
>>   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode      ## CONSUMES
>>
>> As I remember, I did a draft patch below before for the discussion about how to determine DXE is 32BITs or 64BITs in title "[edk2] [PATCH v3 2/4] IntelFrameworkModulePkg: BdsDxe: only allocate below 4 GB if needed", I can't find the archive link any more.
>>
>> ---
>>  MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c | 5 +++++
>>  MdeModulePkg/MdeModulePkg.dec                  | 4 +++-
>>  2 files changed, 8 insertions(+), 1 deletion(-)
>>
>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c 
>> b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
>> index 6488880..348e084 100644
>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/DxeLoadFunc.c
>> @@ -43,6 +43,11 @@ HandOffToDxeCore (
>>    EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;
>>  
>>    //
>> +  // It should be FALSE for both PEI and DXE are 64-bit.
>> +  //
>> +  ASSERT (PcdGetBool (PcdDxeIplSwitchToLongMode) == FALSE);
>> +
>> +  //
>>    // Get Vector Hand-off Info PPI and build Guided HOB
>>    //
>>    Status = PeiServicesLocatePpi (
>> diff --git a/MdeModulePkg/MdeModulePkg.dec 
>> b/MdeModulePkg/MdeModulePkg.dec index af7bcab..4a73f7b 100644
>> --- a/MdeModulePkg/MdeModulePkg.dec
>> +++ b/MdeModulePkg/MdeModulePkg.dec
>> @@ -712,8 +712,10 @@
>>    ## Indicates if DxeIpl should switch to long mode to enter DXE phase.
>>    #  It is assumed that 64-bit DxeCore is built in firmware if it is true; otherwise 32-bit DxeCore
>>    #  is built in firmware.<BR><BR>
>> +  #  And it should be FALSE for both PEI and DXE are 64-bit.
>>    #   TRUE  - DxeIpl will load a 64-bit DxeCore and switch to long mode to hand over to DxeCore.<BR>
>> -  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore.<BR>
>> +  #   FALSE - DxeIpl will load a 32-bit DxeCore and perform stack switch to hand over to DxeCore,<BR>
>> +  #           or both PEI and DXE are 64-bit.<BR>
>>    # @Prompt DxeIpl switch to long mode.
>>    
>> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode|TRUE|BOOLEAN|
>> 0x0001003b
>>  
>> --
>>
>>
>> Thanks,
>> Star
>> -----Original Message-----
>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>> Sent: Thursday, February 9, 2017 3:48 AM
>> To: Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo 
>> <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; 
>> edk2-devel@ml01.01.org
>> Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh 
>> <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
>> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>> PcdPteMemoryEncryptionAddressOrMask
>>
>> On 02/08/17 19:20, Yao, Jiewen wrote:
>>> Got it.
>>>
>>>  
>>>
>>> If the means of PcdDxeIplSwitchtoLongMode  is unclear, we may add 
>>> more description to make it clear.
>>>
>>>  
>>>
>>> If we believe "PcdDxeIplSwitchtoLongMode  == DXE is Long mode" as 
>>> final conclusion, can we treat that as a bug and fix OVMF X64?
>>
>> I don't know how to "fix" that. What is there to fix?
>>
>> Flipping the PCD to TRUE in OVMF X64 would break OVMF X64, and likely OVMF Ia32X64 too. For two reasons:
>>
>>
>> (1) Toggling the PCD would alter the behavior of the DXE IPL PEIM and/or the DXE Core, and that behavior has never ever been tested with OVMF X64.
>>
>> The PcdDxeIplSwitchToLongMode=FALSE setting in the X64 DSC dates back to:
>>
>>   commit 8fa729a8b1401f01c6fd8ddbcab45e4a4904fa9a
>>   Author: lgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
>>   Date:   Mon Mar 15 01:40:59 2010 +0000
>>
>>       Merge the same type PCD section.
>>
>>       git-svn-id: 
>> https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10243 
>> 6f19259b-4bc3-4df7-8a09-765794883524
>>
>> and before that, to:
>>
>>   commit 49ba9447c92d6fca214476381107a180d08e59d1
>>   Author: jljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
>>   Date:   Wed May 27 21:10:18 2009 +0000
>>
>>       Add initial version of Open Virtual Machine Firmware (OVMF) platform.
>>
>>       git-svn-id: 
>> https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8398 
>> 6f19259b-4bc3-4df7-8a09-765794883524
>>
>> In other words, OVMF X64 has always worked like this, since its inception.
>>
>>
>> (2) PEI code under OvmfPkg itself uses this PCD to identify a 32-bit DXE phase.
>>
>>     //
>>     // If DXE is 32-bit, then we're done; PciBusDxe will degrade 64-bit MMIO
>>     // resources to 32-bit anyway. See DegradeResource() in
>>     // "PciResourceSupport.c".
>>     //
>>   #ifdef MDE_CPU_IA32
>>     if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>>       return FirstNonAddress;
>>     }
>>   #endif
>>
>> and
>>
>>     //
>>     // If DXE is 32-bit, then just return the traditional 64 MB cap.
>>     //
>>   #ifdef MDE_CPU_IA32
>>     if (!FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>>       return SIZE_64MB;
>>     }
>>   #endif
>>
>> Thanks
>> Laszlo
>>
>>>
>>>  
>>>
>>> Thank you
>>>
>>> Yao Jiewen
>>>
>>>  
>>>
>>>  
>>>
>>> *From:*Laszlo Ersek [mailto:lersek@redhat.com]
>>> *Sent:* Wednesday, February 8, 2017 9:52 AM
>>> *To:* Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo 
>>> <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; 
>>> edk2-devel@ml01.01.org
>>> *Cc:* Tian, Feng <feng.tian@intel.com>; Singh, Brijesh 
>>> <brijesh.singh@amd.com>; Justen, Jordan L <jordan.l.justen@intel.com>
>>> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>>  
>>>
>>> On 02/08/17 18:27, Yao, Jiewen wrote:
>>>> I believe PcdDxeIplSwitchtoLongMode  == DXE is Long mode.
>>>>
>>>>  
>>>>
>>>> See DEC description:
>>>>
>>>>   #  It is assumed that 64-bit DxeCore is built in firmware if it is 
>>>> true; otherwise 32-bit DxeCore
>>>>
>>>>   #  is built in firmware.<BR><BR>
>>>
>>> Unfortunately, I have no historical context or background for this 
>>> PCD; all I can say is that the X64 OVMF platform does not set the PCD.
>>>
>>> It enters long mode, and sets up page tables for the first 4GB of 
>>> RAM, in SEC. Then SEC decompresses the flash contents to RAM, which 
>>> covers both PEIFV and DXEFV. PEI runs from RAM.
>>>
>>> This is possible because on QEMU/KVM, there's no need to initialize 
>>> RAM, thus only SEC runs from flash, in-place.
>>>
>>> Perhaps Jordan can provide more insight.
>>>
>>> If Brijesh and Leo would like to run the X64 OVMF platform as a SEV 
>>> guest too, then this should be considered, in my opinion.
>>>
>>> One more comment below:
>>>
>>>>
>>>>  
>>>>
>>>> And the code MdeModulePkg\Universal\Acpi\S3SaveStateDxe\AcpiS3ContextSave.c:
>>>>
>>>>  
>>>>
>>>> BOOLEAN
>>>>
>>>> IsLongModeWakingVectorSupport (
>>>>
>>>>   IN EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE*Facs
>>>>
>>>>   )
>>>>
>>>> {
>>>>
>>>>   if((Facs == NULL) ||
>>>>
>>>>       (Facs->Signature !=
>>>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) ) {
>>>>
>>>>     //
>>>>
>>>>     // Something wrong with FACS.
>>>>
>>>>     //
>>>>
>>>>     returnFALSE;
>>>>
>>>>   }
>>>>
>>>>   if((Facs->Version ==
>>>> EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION) &&
>>>>
>>>>       ((Facs->Flags & EFI_ACPI_4_0_64BIT_WAKE_SUPPORTED_F) != 0)) {
>>>>
>>>>     //
>>>>
>>>>     // BIOS supports 64bit waking vector.
>>>>
>>>>     //
>>>>
>>>>     if(FeaturePcdGet (PcdDxeIplSwitchToLongMode)) {
>>>>
>>>>       returnTRUE;
>>>>
>>>>     }
>>>>
>>>>   }
>>>>
>>>>   returnFALSE;
>>>>
>>>> }
>>>
>>> In practice, it's okay if the OVMF X64 platform is recognized as "not 
>>> supporting a 64-bit waking vector for S3 resume". All the 64-bit 
>>> guest OSes that I've tested with OVMF X64 (Linux, and the Windows 7 / 
>>> 8 / 10 families, both client and server) use a real mode (16-bit) 
>>> waking vector, in practice.
>>>
>>> ... Actually, upon reviewing the above code more carefully, we don't 
>>> even reach the FeaturePcdGet() call: the FACS that QEMU generates 
>>> (and OVMF downloads and installs) corresponds to ACPI 1.0, that is, 
>>> EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION.
>>>
>>> Thanks
>>> Laszlo
>>>
>>>
>>>>
>>>>  
>>>>
>>>>  
>>>>
>>>> Thank you
>>>>
>>>> Yao Jiewen
>>>>
>>>>  
>>>>
>>>> *From:*edk2-devel [mailto:edk2-devel-bounces@lists.01.org] *On 
>>>> Behalf Of *Yao, Jiewen
>>>> *Sent:* Wednesday, February 8, 2017 9:18 AM
>>>> *To:* Laszlo Ersek <lersek@redhat.com
>>> <mailto:lersek@redhat.com>>; Duran, Leo <leo.duran@amd.com 
>>> <mailto:leo.duran@amd.com>>;
>>>> Zeng, Star <star.zeng@intel.com
>>> <mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org 
>>> <mailto:edk2-devel@ml01.01.org>
>>>> *Cc:* Tian, Feng <feng.tian@intel.com <mailto:feng.tian@intel.com>>; 
>>>> Singh, Brijesh <brijesh.singh@amd.com 
>>>> <mailto:brijesh.singh@amd.com>>
>>>> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>>  
>>>>
>>>> Good reminder. I take back my word.
>>>>
>>>> In this case, we need consume PcdPteMemoryEncryptionAddressOrMask  in IA32 mode to build X64 paging.
>>>>
>>>> We need
>>>>
>>>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>>>> Sent: Wednesday, February 8, 2017 9:11 AM
>>>> To: Yao, Jiewen <jiewen.yao@intel.com
>>> <mailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com>>; 
>>> Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com%0b>> 
>>> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com 
>>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>; 
>>> edk2-devel@ml01.01.org <mailto:edk2-devel@ml01.01.org>
>>>> <mailto:edk2-devel@ml01.01.org>
>>>> Cc: Tian, Feng <feng.tian@intel.com
>>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com>>; 
>>> Singh, Brijesh <brijesh.singh@amd.com 
>>> <mailto:brijesh.singh@amd.com%0b>>
>>> <mailto:brijesh.singh@amd.com>>
>>>> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>> On 02/08/17 18:05, Yao, Jiewen wrote:
>>>>> HI Leo
>>>>>
>>>>> Thanks to clarify that.
>>>>>
>>>>>
>>>>>
>>>>> If that is the case, do you think it will be better to limit this 
>>>>> PCD to
>>>>> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
>>>>
>>>> Not sure if this is the best place to raise the following 
>>>> observation, but it should do:
>>>>
>>>> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE 
>>>> if PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
>>>> - both PEI and DXE are 32-bit, and
>>>> - both PEI and DXE are 64-bit.
>>>>
>>>> This doesn't necessarily invalidate anything said thus fair in the 
>>>> thread, but the following statement from Leo:
>>>>
>>>>     The SEV feature requires 64-bit LongMode, so the
>>>>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
>>>>
>>>> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
>>>>
>>>> Thanks,
>>>> Laszlo
>>>>
>>>>>
>>>>>
>>>>>
>>>>> Thank you
>>>>>
>>>>> Yao Jiewen
>>>>>
>>>>>
>>>>>
>>>>> *From:*Duran, Leo [mailto:leo.duran@amd.com]
>>>>> *Sent:* Wednesday, February 8, 2017 9:00 AM
>>>>> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com
>>> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com%0b>>
>>> <mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>;
>>> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>>>> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com
>>> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com%0b>>
>>> <mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Tian, Feng
>>>>> <feng.tian@intel.com<mailto:feng.tian@intel.com
>>> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com%0b>>
>>> <mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>; Singh, 
>>> Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
>>> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com%0b>>
>>> <mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Yao,
>>>>> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
>>> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com%0b>>
>>> <mailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com>>>
>>>>> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>>
>>>>>
>>>>>
>>>>> Pease see reply below.
>>>>> Leo
>>>>>
>>>>>> -----Original Message-----
>>>>>> From: Zeng, Star [mailto:star.zeng@intel.com]
>>>>>> Sent: Tuesday, February 07, 2017 8:27 PM
>>>>>> To: Duran, Leo <leo.duran@amd.com
>>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
>>>>>> %3cmailto:leo.duran@amd.com
>>> <mailto:leo.duran@amd.com
>>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>>> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
>>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>>> %3cmailto:leo.duran@amd.com>>>>;
>>> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>>>> <mailto:edk2-devel@ml01.01.org>
>>>>>> Cc: Laszlo Ersek <lersek@redhat.com
>>> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b 
>>> <mailto:lersek@redhat.com%0b%0b>> 
>>> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>>
>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com 
>>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b 
>>> <mailto:feng.tian@intel.com%0b%0b>>
>>> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>>
>>> <mailto:feng.tian@intel.com>>;
>>>>>> Singh, Brijesh <brijesh.singh@amd.com
>>> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b 
>>> <mailto:brijesh.singh@amd.com%0b%0b>>
>>> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>>
>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com 
>>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b 
>>> <mailto:star.zeng@intel.com%0b%0b>>
>>> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>>
>>> <mailto:star.zeng@intel.com>>;
>>>>>> Yao, Jiewen <jiewen.yao@intel.com
>>>>>> <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com
>>>>>> %3cmailto:jiewen.yao@intel.com
>>> <mailto:jiewen.yao@intel.com
>>> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com
>>> %3cmailto:jiewen.yao@intel.com%0b>> <mailto:jiewen.yao@intel.com 
>>> %3cmailto:jiewen.yao@intel.com%3cmailto:jiewen.yao@intel.com
>>> %3cmailto:jiewen.yao@intel.com>>>>
>>>>>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>>>
>>>>>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>>>>>
>>>>>> Thanks,
>>>>>> Star
>>>>> [Duran, Leo]
>>>>> Hi Star,
>>>>> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>>>>>
>>>>> The SEV feature requires 64-bit LongMode, so the 
>>>>> PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time, in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
>>>>>
>>>>>> -----Original Message-----
>>>>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On 
>>>>>> Behalf Of Leo Duran
>>>>>> Sent: Wednesday, February 8, 2017 3:54 AM
>>>>>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org
>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>
>>>> <mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
>>>> <mailto:edk2-devel@ml01.01.org>
>>>>>> Cc: Laszlo Ersek <lersek@redhat.com
>>> <mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com%0b 
>>> <mailto:lersek@redhat.com%0b%0b>> 
>>> <mailto:lersek@redhat.com%0b%3cmailto:lersek@redhat.com%0b>>>
>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com 
>>> <mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com%0b 
>>> <mailto:feng.tian@intel.com%0b%0b>>
>>> <mailto:feng.tian@intel.com%0b%3cmailto:feng.tian@intel.com%0b>>>
>>> <mailto:feng.tian@intel.com>>;
>>>>>> Brijesh Singh <brijesh.singh@amd.com
>>> <mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com%0b 
>>> <mailto:brijesh.singh@amd.com%0b%0b>>
>>> <mailto:brijesh.singh@amd.com%0b%3cmailto:brijesh.singh@amd.com%0b>>>
>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com 
>>> <mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com%0b 
>>> <mailto:star.zeng@intel.com%0b%0b>>
>>> <mailto:star.zeng@intel.com%0b%3cmailto:star.zeng@intel.com%0b>>>
>>> <mailto:star.zeng@intel.com>>;
>>>>>> Leo Duran <leo.duran@amd.com
>>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
>>>>>> %3cmailto:leo.duran@amd.com
>>> <mailto:leo.duran@amd.com
>>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>>> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
>>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>>> %3cmailto:leo.duran@amd.com>>>>
>>>>>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD 
>>>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>>>
>>>>>> From: Brijesh Singh <brijesh.singh@amd.com 
>>>>>> <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com
>>>>>> %3cmailto:brijesh.singh@amd.com
>>> <mailto:brijesh.singh@amd.com
>>> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com
>>> %3cmailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com 
>>> %3cmailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com
>>> %3cmailto:brijesh.singh@amd.com>>>>
>>>>>>
>>>>>> This dynamic PCD holds the address mask for page table entries 
>>>>>> when memory encryption is enabled on AMD processors supporting the 
>>>>>> Secure Encrypted Virtualization (SEV) feature.
>>>>>>
>>>>>> Cc: Feng Tian <feng.tian@intel.com 
>>>>>> <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com
>>>>>> %3cmailto:feng.tian@intel.com
>>> <mailto:feng.tian@intel.com
>>> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com
>>> %3cmailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com 
>>> %3cmailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com
>>> %3cmailto:feng.tian@intel.com>>>>
>>>>>> Cc: Star Zeng <star.zeng@intel.com 
>>>>>> <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com
>>>>>> %3cmailto:star.zeng@intel.com
>>> <mailto:star.zeng@intel.com
>>> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com
>>> %3cmailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com 
>>> %3cmailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com
>>> %3cmailto:star.zeng@intel.com>>>>
>>>>>> Cc: Laszlo Ersek <lersek@redhat.com 
>>>>>> <mailto:lersek@redhat.com<mailto:lersek@redhat.com
>>>>>> %3cmailto:lersek@redhat.com
>>> <mailto:lersek@redhat.com
>>> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com
>>> %3cmailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com 
>>> %3cmailto:lersek@redhat.com%3cmailto:lersek@redhat.com
>>> %3cmailto:lersek@redhat.com>>>>
>>>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>>>> Signed-off-by: Leo Duran <leo.duran@amd.com 
>>>>>> <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com
>>>>>> %3cmailto:leo.duran@amd.com
>>> <mailto:leo.duran@amd.com
>>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>>> %3cmailto:leo.duran@amd.com%0b>> <mailto:leo.duran@amd.com 
>>> %3cmailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com
>>> %3cmailto:leo.duran@amd.com>>>>
>>>>>> ---
>>>>>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>>>>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 
>>>>>> ++++++++++--
>>>>>> ------
>>>>>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>>>>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>>>>>
>>>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>>> index 2bc41be..d62bd9b 100644
>>>>>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>>> @@ -6,6 +6,8 @@
>>>>>>  #  needed to run the DXE Foundation.
>>>>>>  #
>>>>>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights 
>>>>>> reserved.<BR>
>>>>>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> 
>>>>>> +#
>>>>>>  #  This program and the accompanying materials  #  are licensed 
>>>>>> and made available under the terms and conditions of the BSD 
>>>>>> License  #  which accompanies this distribution.  The full text of 
>>>>>> the license may be found at @@ -111,7 +113,8 @@ [FeaturePcd]
>>>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress 
>>>>>> ## CONSUMES
>>>>>>
>>>>>>  [Pcd.IA32,Pcd.X64]
>>>>>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>>>>>> SOMETIMES_CONSUMES
>>>>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>>>>>> SOMETIMES_CONSUMES
>>>>>> +
>>>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>>>> ask    ## CONSUMES
>>>>>>
>>>>>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>>>>>> SOMETIMES_CONSUMES
>>>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>>> index 790f6ab..2c52389 100644
>>>>>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>>> @@ -16,6 +16,8 @@
>>>>>>      3) IA-32 Intel(R) Architecture Software Developer's Manual 
>>>>>> Volume 3:System Programmer's Guide, Intel
>>>>>>
>>>>>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights 
>>>>>> reserved.<BR>
>>>>>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>>>>> +
>>>>>>  This program and the accompanying materials  are licensed and 
>>>>>> made available under the terms and conditions of the BSD License  
>>>>>> which accompanies this distribution.  The full text of the license 
>>>>>> may be found at @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>>>>>    //
>>>>>>    // Fill in 2M page entry.
>>>>>>    //
>>>>>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P | 
>>>>>> IA32_PG_RW;
>>>>>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>>>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>>>
>>>>>>    PhysicalAddress4K = PhysicalAddress;
>>>>>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 
>>>>>> 512;
>>>>>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>>>>>> SIZE_4KB) {
>>>>>>      //
>>>>>>      // Fill in the Page Table entries
>>>>>>      //
>>>>>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>>>>>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | 
>>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>>      PageTableEntry->Bits.ReadWrite = 1;
>>>>>>      PageTableEntry->Bits.Present = 1;
>>>>>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < 
>>>>>> StackBase +
>>>>>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>>>>>    //
>>>>>>    // Fill in 1G page entry.
>>>>>>    //
>>>>>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P 
>>>>>> | IA32_PG_RW;
>>>>>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>>>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>>>>>
>>>>>>    PhysicalAddress2M = PhysicalAddress;
>>>>>>    for (IndexOfPageDirectoryEntries = 0; 
>>>>>> IndexOfPageDirectoryEntries < 512;
>>>>>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, 
>>>>>> IndexOfPageDirectoryEntries++PhysicalAddress2M
>>>>>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>>>>>        //
>>>>>>        // Fill in the Page Directory entries
>>>>>>        //
>>>>>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>>>>>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>>>        PageDirectoryEntry->Bits.Present = 1;
>>>>>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@ 
>>>>>> CreateIdentityMappingPageTables (
>>>>>>      //
>>>>>>      // Make a PML4 Entry
>>>>>>      //
>>>>>> -    PageMapLevel4Entry->Uint64 =
>>>>>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>>>>>> +    PageMapLevel4Entry->Uint64 =
>>>>>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64 
>>>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>>>>>      PageMapLevel4Entry->Bits.Present = 1;
>>>>>>
>>>>>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>>>>>            //
>>>>>>            // Fill in the Page Directory entries
>>>>>>            //
>>>>>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>>>>>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress |
>>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>>>>>            PageDirectory1GEntry->Bits.Present = 1;
>>>>>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 
>>>>>> +282,7 @@ CreateIdentityMappingPageTables (
>>>>>>          //
>>>>>>          // Fill in a Page Directory Pointer Entries
>>>>>>          //
>>>>>> -        PageDirectoryPointerEntry->Uint64 =
>>>>>> (UINT64)(UINTN)PageDirectoryEntry;
>>>>>> +        PageDirectoryPointerEntry->Uint64 = 
>>>>>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64 
>>>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>>>>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>>>>>
>>>>>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>>>>>              //
>>>>>>              // Fill in the Page Directory entries
>>>>>>              //
>>>>>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>>>>>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress |
>>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>>>              PageDirectoryEntry->Bits.Present = 1;
>>>>>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git 
>>>>>> a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec 
>>>>>> index 273cd7e..207384f 100644
>>>>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>>>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>>>>> @@ -6,6 +6,8 @@
>>>>>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights 
>>>>>> reserved.<BR>  # Copyright (c) 2016, Linaro Ltd. All rights 
>>>>>> reserved.<BR>  # (C) Copyright 2016 Hewlett Packard Enterprise 
>>>>>> Development LP<BR>
>>>>>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> 
>>>>>> +#
>>>>>>  # This program and the accompanying materials are licensed and 
>>>>>> made available under  # the terms and conditions of the BSD 
>>>>>> License that accompanies this distribution.
>>>>>>  # The full text of the license may be found at @@ -1738,5 
>>>>>> +1740,11 @@ [PcdsDynamic, PcdsDynamicEx]
>>>>>>    # @Prompt If there is any test key used by the platform.
>>>>>>
>>>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>>>>>> 0030003
>>>>>>
>>>>>> +  ## This dynamic PCD holds the address mask for page table 
>>>>>> + entries when memory encryption is  #  enabled on AMD processors 
>>>>>> + supporting the
>>>>>> Secure Encrypted Virtualization (SEV) feature.
>>>>>> +  #  This mask should be applied when creating 1:1 virtual to 
>>>>>> + physical
>>>>>> mapping tables.
>>>>>> +  #
>>>>>> +
>>>>>> +
>>>>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>>>> ask|0x0
>>>>>> + |UINT64|0x00030004
>>>>>> +
>>>>>>  [UserExtensions.TianoCore."ExtraFiles"]
>>>>>>    MdeModulePkgExtra.uni
>>>>>> --
>>>>>> 1.9.1
>>>>>>
>>>>>> _______________________________________________
>>>>>> edk2-devel mailing list
>>>>>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org
>>> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>
>>>> <mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>>
>>>> <mailto:edk2-devel@lists.01.org>
>>>>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>>>>
>>>> _______________________________________________
>>>> edk2-devel mailing list
>>>> edk2-devel@lists.01.org
>>> <mailto:edk2-devel@lists.01.org> <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Duran, Leo 7 years, 8 months ago
Agreed.
Leo

From: Yao, Jiewen [mailto:jiewen.yao@intel.com]
Sent: Wednesday, February 08, 2017 11:18 AM
To: Laszlo Ersek <lersek@redhat.com>; Duran, Leo <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; edk2-devel@ml01.01.org
Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>
Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

Good reminder. I take back my word.

In this case, we need consume PcdPteMemoryEncryptionAddressOrMask  in IA32 mode to build X64 paging.

We need
[Duran, Leo] Agreed :).

From: Laszlo Ersek [mailto:lersek@redhat.com]
Sent: Wednesday, February 8, 2017 9:11 AM
To: Yao, Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com>>; Duran, Leo <leo.duran@amd.com<mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
Cc: Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

On 02/08/17 18:05, Yao, Jiewen wrote:
> HI Leo
>
> Thanks to clarify that.
>
>
>
> If that is the case, do you think it will be better to limit this PCD to
> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]

Not sure if this is the best place to raise the following observation,
but it should do:

please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE if
PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
- both PEI and DXE are 32-bit, and
- both PEI and DXE are 64-bit.

This doesn't necessarily invalidate anything said thus fair in the
thread, but the following statement from Leo:

    The SEV feature requires 64-bit LongMode, so the
    PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time

does not follow. The PCD is FALSE in OvmfPkgX64.dsc.

Thanks,
Laszlo

>
>
>
> Thank you
>
> Yao Jiewen
>
>
>
> *From:*Duran, Leo [mailto:leo.duran@amd.com]
> *Sent:* Wednesday, February 8, 2017 9:00 AM
> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Tian, Feng
> <feng.tian@intel.com<mailto:feng.tian@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Yao,
> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com>>
> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
>
>
> Pease see reply below.
> Leo
>
>> -----Original Message-----
>> From: Zeng, Star [mailto:star.zeng@intel.com]
>> Sent: Tuesday, February 07, 2017 8:27 PM
>> To: Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> <mailto:edk2-devel@ml01.01.org>
>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com>>;
>> Singh, Brijesh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>;
>> Yao, Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com>>>
>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>>
>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>
>> Thanks,
>> Star
> [Duran, Leo]
> Hi Star,
> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>
> The SEV feature requires 64-bit LongMode, so the PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time,
> in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().
>
>> -----Original Message-----
>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
>> Leo Duran
>> Sent: Wednesday, February 8, 2017 3:54 AM
>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org> <mailto:edk2-devel@ml01.01.org>
>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com%0b>> <mailto:feng.tian@intel.com>>;
>> Brijesh Singh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com%0b>> <mailto:star.zeng@intel.com>>;
>> Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>
>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>>
>> From: Brijesh Singh <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com %3cmailto:brijesh.singh@amd.com>>>
>>
>> This dynamic PCD holds the address mask for page table entries when
>> memory encryption is enabled on AMD processors supporting the Secure
>> Encrypted Virtualization (SEV) feature.
>>
>> Cc: Feng Tian <feng.tian@intel.com <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com>>>
>> Cc: Star Zeng <star.zeng@intel.com <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com>>>
>> Cc: Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com<mailto:lersek@redhat.com %3cmailto:lersek@redhat.com>>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>
>> ---
>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
>> ------
>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>
>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> index 2bc41be..d62bd9b 100644
>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>> @@ -6,6 +6,8 @@
>>  #  needed to run the DXE Foundation.
>>  #
>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>  #  This program and the accompanying materials  #  are licensed and made
>> available under the terms and conditions of the BSD License  #  which
>> accompanies this distribution.  The full text of the license may be found at
>> @@ -111,7 +113,8 @@ [FeaturePcd]
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
>> CONSUMES
>>
>>  [Pcd.IA32,Pcd.X64]
>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>> SOMETIMES_CONSUMES
>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>> SOMETIMES_CONSUMES
>> +
>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>> ask    ## CONSUMES
>>
>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>> SOMETIMES_CONSUMES
>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> index 790f6ab..2c52389 100644
>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>> @@ -16,6 +16,8 @@
>>      3) IA-32 Intel(R) Architecture Software Developer's Manual Volume
>> 3:System Programmer's Guide, Intel
>>
>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>> +
>>  This program and the accompanying materials  are licensed and made
>> available under the terms and conditions of the BSD License  which
>> accompanies this distribution.  The full text of the license may be found at
>> @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>    //
>>    // Fill in 2M page entry.
>>    //
>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
>> IA32_PG_RW;
>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>
>>    PhysicalAddress4K = PhysicalAddress;
>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>> SIZE_4KB) {
>>      //
>>      // Fill in the Page Table entries
>>      //
>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>      PageTableEntry->Bits.ReadWrite = 1;
>>      PageTableEntry->Bits.Present = 1;
>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase +
>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>    //
>>    // Fill in 1G page entry.
>>    //
>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
>> IA32_PG_RW;
>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>>
>>    PhysicalAddress2M = PhysicalAddress;
>>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512;
>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M
>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>        //
>>        // Fill in the Page Directory entries
>>        //
>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>        PageDirectoryEntry->Bits.Present = 1;
>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
>> CreateIdentityMappingPageTables (
>>      //
>>      // Make a PML4 Entry
>>      //
>> -    PageMapLevel4Entry->Uint64 =
>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>> +    PageMapLevel4Entry->Uint64 =
>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>      PageMapLevel4Entry->Bits.Present = 1;
>>
>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>            //
>>            // Fill in the Page Directory entries
>>            //
>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>            PageDirectory1GEntry->Bits.Present = 1;
>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 @@
>> CreateIdentityMappingPageTables (
>>          //
>>          // Fill in a Page Directory Pointer Entries
>>          //
>> -        PageDirectoryPointerEntry->Uint64 =
>> (UINT64)(UINTN)PageDirectoryEntry;
>> +        PageDirectoryPointerEntry->Uint64 =
>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>
>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>              //
>>              // Fill in the Page Directory entries
>>              //
>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64
>> + (PcdPteMemoryEncryptionAddressOrMask);
>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>              PageDirectoryEntry->Bits.Present = 1;
>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
>> a/MdeModulePkg/MdeModulePkg.dec
>> b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
>> --- a/MdeModulePkg/MdeModulePkg.dec
>> +++ b/MdeModulePkg/MdeModulePkg.dec
>> @@ -6,6 +6,8 @@
>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>  #
>> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>  # (C) Copyright 2016
>> Hewlett Packard Enterprise Development LP<BR>
>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>  # This program and the accompanying materials are licensed and made
>> available under  # the terms and conditions of the BSD License that
>> accompanies this distribution.
>>  # The full text of the license may be found at @@ -1738,5 +1740,11 @@
>> [PcdsDynamic, PcdsDynamicEx]
>>    # @Prompt If there is any test key used by the platform.
>>
>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>> 0030003
>>
>> +  ## This dynamic PCD holds the address mask for page table entries
>> + when memory encryption is  #  enabled on AMD processors supporting the
>> Secure Encrypted Virtualization (SEV) feature.
>> +  #  This mask should be applied when creating 1:1 virtual to physical
>> mapping tables.
>> +  #
>> +
>> +
>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>> ask|0x0
>> + |UINT64|0x00030004
>> +
>>  [UserExtensions.TianoCore."ExtraFiles"]
>>    MdeModulePkgExtra.uni
>> --
>> 1.9.1
>>
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org> <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Duran, Leo 7 years, 8 months ago
Lazlo, et al,
Please see reply below.
Lleo

> -----Original Message-----
> From: Laszlo Ersek [mailto:lersek@redhat.com]
> Sent: Wednesday, February 08, 2017 11:11 AM
> To: Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo
> <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; edk2-
> devel@ml01.01.org
> Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh
> <brijesh.singh@amd.com>
> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
> 
> On 02/08/17 18:05, Yao, Jiewen wrote:
> > HI Leo
> >
> > Thanks to clarify that.
> >
> >
> >
> > If that is the case, do you think it will be better to limit this PCD
> > to
> > X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
> 
> Not sure if this is the best place to raise the following observation, but it
> should do:
> 
> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE
> if PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
> - both PEI and DXE are 32-bit, and
> - both PEI and DXE are 64-bit.
> 
> This doesn't necessarily invalidate anything said thus fair in the thread, but
> the following statement from Leo:
> 
>     The SEV feature requires 64-bit LongMode, so the
>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
> 
> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
[Duran, Leo] 
Good points... I should have provided more context.
1) I had referred the "PEI is 32-bit and DXE is 64-bit."
2) If both PEI and DXE are 64-bit, then you would be executing the X64 of HandOffToDxe(), which does *not* call Create4GPageTables().

That is, Create4GPageTables() only gets called in the "PEI is 32-bit" case.

> 
> Thanks,
> Laszlo
> 
> >
> >
> >
> > Thank you
> >
> > Yao Jiewen
> >
> >
> >
> > *From:*Duran, Leo [mailto:leo.duran@amd.com]
> > *Sent:* Wednesday, February 8, 2017 9:00 AM
> > *To:* Zeng, Star <star.zeng@intel.com>; edk2-devel@ml01.01.org
> > *Cc:* Laszlo Ersek <lersek@redhat.com>; Tian, Feng
> > <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Yao,
> > Jiewen <jiewen.yao@intel.com>
> > *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> > PcdPteMemoryEncryptionAddressOrMask
> >
> >
> >
> > Pease see reply below.
> > Leo
> >
> >> -----Original Message-----
> >> From: Zeng, Star [mailto:star.zeng@intel.com]
> >> Sent: Tuesday, February 07, 2017 8:27 PM
> >> To: Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com>>;
> >> edk2-devel@ml01.01.org
> > <mailto:edk2-devel@ml01.01.org>
> >> Cc: Laszlo Ersek <lersek@redhat.com
> > <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
> > <mailto:feng.tian@intel.com>>;
> >> Singh, Brijesh <brijesh.singh@amd.com
> > <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
> > <mailto:star.zeng@intel.com>>;
> >> Yao, Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com>>
> >> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> >> PcdPteMemoryEncryptionAddressOrMask
> >>
> >> Does Create4GPageTablesIa32Pae() also need to be updated?
> >>
> >> Thanks,
> >> Star
> > [Duran, Leo]
> > Hi Star,
> > No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
> >
> > The SEV feature requires 64-bit LongMode, so the
> > PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time, in which
> case Create4GPageTablesIa32Pae() would *not* be called by
> HandOffToDxeCore().
> >
> >> -----Original Message-----
> >> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf
> >> Of Leo Duran
> >> Sent: Wednesday, February 8, 2017 3:54 AM
> >> To: edk2-devel@ml01.01.org <mailto:edk2-devel@ml01.01.org>
> >> Cc: Laszlo Ersek <lersek@redhat.com
> > <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
> > <mailto:feng.tian@intel.com>>;
> >> Brijesh Singh <brijesh.singh@amd.com
> > <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
> > <mailto:star.zeng@intel.com>>;
> >> Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com>>
> >> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> >> PcdPteMemoryEncryptionAddressOrMask
> >>
> >> From: Brijesh Singh <brijesh.singh@amd.com
> >> <mailto:brijesh.singh@amd.com>>
> >>
> >> This dynamic PCD holds the address mask for page table entries when
> >> memory encryption is enabled on AMD processors supporting the Secure
> >> Encrypted Virtualization (SEV) feature.
> >>
> >> Cc: Feng Tian <feng.tian@intel.com <mailto:feng.tian@intel.com>>
> >> Cc: Star Zeng <star.zeng@intel.com <mailto:star.zeng@intel.com>>
> >> Cc: Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com>>
> >> Contributed-under: TianoCore Contribution Agreement 1.0
> >> Signed-off-by: Leo Duran <leo.duran@amd.com
> >> <mailto:leo.duran@amd.com>>
> >> ---
> >>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
> >>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18
> ++++++++++--
> >> ------
> >>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
> >>  3 files changed, 22 insertions(+), 9 deletions(-)
> >>
> >> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> >> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> >> index 2bc41be..d62bd9b 100644
> >> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> >> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> >> @@ -6,6 +6,8 @@
> >>  #  needed to run the DXE Foundation.
> >>  #
> >>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights
> >> reserved.<BR>
> >> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
> >>  #  This program and the accompanying materials  #  are licensed and
> >> made available under the terms and conditions of the BSD License  #
> >> which accompanies this distribution.  The full text of the license
> >> may be found at @@ -111,7 +113,8 @@ [FeaturePcd]
> >>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress
> ##
> >> CONSUMES
> >>
> >>  [Pcd.IA32,Pcd.X64]
> >> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
> >> SOMETIMES_CONSUMES
> >> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
> >> SOMETIMES_CONSUMES
> >> +
> >>
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> >> ask    ## CONSUMES
> >>
> >>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
> >>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
> >> SOMETIMES_CONSUMES
> >> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> >> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> >> index 790f6ab..2c52389 100644
> >> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> >> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> >> @@ -16,6 +16,8 @@
> >>      3) IA-32 Intel(R) Architecture Software Developer's Manual
> >> Volume 3:System Programmer's Guide, Intel
> >>
> >>  Copyright (c) 2006 - 2016, Intel Corporation. All rights
> >> reserved.<BR>
> >> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> >> +
> >>  This program and the accompanying materials  are licensed and made
> >> available under the terms and conditions of the BSD License  which
> >> accompanies this distribution.  The full text of the license may be
> >> found at @@ -71,14 +73,14 @@ Split2MPageTo4K (
> >>    //
> >>    // Fill in 2M page entry.
> >>    //
> >> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
> >> IA32_PG_RW;
> >> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
> >> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P |
> IA32_PG_RW;
> >>
> >>    PhysicalAddress4K = PhysicalAddress;
> >>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
> >> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
> >> SIZE_4KB) {
> >>      //
> >>      // Fill in the Page Table entries
> >>      //
> >> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
> >> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
> >> + (PcdPteMemoryEncryptionAddressOrMask);
> >>      PageTableEntry->Bits.ReadWrite = 1;
> >>      PageTableEntry->Bits.Present = 1;
> >>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K <
> >> StackBase +
> >> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
> >>    //
> >>    // Fill in 1G page entry.
> >>    //
> >> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
> >> IA32_PG_RW;
> >> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
> >> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P |
> IA32_PG_RW;
> >>
> >>    PhysicalAddress2M = PhysicalAddress;
> >>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries
> >> < 512;
> >> IndexOfPageDirectoryEntries++, PageDirectoryEntry++,
> >> IndexOfPageDirectoryEntries++PhysicalAddress2M
> >> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
> >>        //
> >>        // Fill in the Page Directory entries
> >>        //
> >> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
> >> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
> >> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
> >>        PageDirectoryEntry->Bits.ReadWrite = 1;
> >>        PageDirectoryEntry->Bits.Present = 1;
> >>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
> >> CreateIdentityMappingPageTables (
> >>      //
> >>      // Make a PML4 Entry
> >>      //
> >> -    PageMapLevel4Entry->Uint64 =
> >> (UINT64)(UINTN)PageDirectoryPointerEntry;
> >> +    PageMapLevel4Entry->Uint64 =
> >> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
> >> + (PcdPteMemoryEncryptionAddressOrMask);
> >>      PageMapLevel4Entry->Bits.ReadWrite = 1;
> >>      PageMapLevel4Entry->Bits.Present = 1;
> >>
> >> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
> >>            //
> >>            // Fill in the Page Directory entries
> >>            //
> >> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
> >> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress |
> >> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
> >>            PageDirectory1GEntry->Bits.ReadWrite = 1;
> >>            PageDirectory1GEntry->Bits.Present = 1;
> >>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7
> >> @@ CreateIdentityMappingPageTables (
> >>          //
> >>          // Fill in a Page Directory Pointer Entries
> >>          //
> >> -        PageDirectoryPointerEntry->Uint64 =
> >> (UINT64)(UINTN)PageDirectoryEntry;
> >> +        PageDirectoryPointerEntry->Uint64 =
> >> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
> >> + (PcdPteMemoryEncryptionAddressOrMask);
> >>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
> >>          PageDirectoryPointerEntry->Bits.Present = 1;
> >>
> >> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
> >>              //
> >>              // Fill in the Page Directory entries
> >>              //
> >> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
> >> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress |
> >> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
> >>              PageDirectoryEntry->Bits.ReadWrite = 1;
> >>              PageDirectoryEntry->Bits.Present = 1;
> >>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
> >> a/MdeModulePkg/MdeModulePkg.dec
> b/MdeModulePkg/MdeModulePkg.dec index
> >> 273cd7e..207384f 100644
> >> --- a/MdeModulePkg/MdeModulePkg.dec
> >> +++ b/MdeModulePkg/MdeModulePkg.dec
> >> @@ -6,6 +6,8 @@
> >>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights
> >> reserved.<BR>  # Copyright (c) 2016, Linaro Ltd. All rights
> >> reserved.<BR>  # (C) Copyright 2016 Hewlett Packard Enterprise
> >> Development LP<BR>
> >> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
> >>  # This program and the accompanying materials are licensed and made
> >> available under  # the terms and conditions of the BSD License that
> >> accompanies this distribution.
> >>  # The full text of the license may be found at @@ -1738,5 +1740,11
> >> @@ [PcdsDynamic, PcdsDynamicEx]
> >>    # @Prompt If there is any test key used by the platform.
> >>
> >>
> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
> >> 0030003
> >>
> >> +  ## This dynamic PCD holds the address mask for page table entries
> >> + when memory encryption is  #  enabled on AMD processors supporting
> >> + the
> >> Secure Encrypted Virtualization (SEV) feature.
> >> +  #  This mask should be applied when creating 1:1 virtual to
> >> + physical
> >> mapping tables.
> >> +  #
> >> +
> >> +
> >>
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> >> ask|0x0
> >> + |UINT64|0x00030004
> >> +
> >>  [UserExtensions.TianoCore."ExtraFiles"]
> >>    MdeModulePkgExtra.uni
> >> --
> >> 1.9.1
> >>
> >> _______________________________________________
> >> edk2-devel mailing list
> >> edk2-devel@lists.01.org <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Laszlo Ersek 7 years, 8 months ago
On 02/08/17 18:28, Duran, Leo wrote:
> Lazlo, et al,
> Please see reply below.
> Lleo
> 
>> -----Original Message-----
>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>> Sent: Wednesday, February 08, 2017 11:11 AM
>> To: Yao, Jiewen <jiewen.yao@intel.com>; Duran, Leo
>> <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; edk2-
>> devel@ml01.01.org
>> Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh
>> <brijesh.singh@amd.com>
>> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>>
>> On 02/08/17 18:05, Yao, Jiewen wrote:
>>> HI Leo
>>>
>>> Thanks to clarify that.
>>>
>>>
>>>
>>> If that is the case, do you think it will be better to limit this PCD
>>> to
>>> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
>>
>> Not sure if this is the best place to raise the following observation, but it
>> should do:
>>
>> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE
>> if PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
>> - both PEI and DXE are 32-bit, and
>> - both PEI and DXE are 64-bit.
>>
>> This doesn't necessarily invalidate anything said thus fair in the thread, but
>> the following statement from Leo:
>>
>>     The SEV feature requires 64-bit LongMode, so the
>>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
>>
>> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
> [Duran, Leo] 
> Good points... I should have provided more context.
> 1) I had referred the "PEI is 32-bit and DXE is 64-bit."
> 2) If both PEI and DXE are 64-bit, then you would be executing the X64 of HandOffToDxe(), which does *not* call Create4GPageTables().
> 
> That is, Create4GPageTables() only gets called in the "PEI is 32-bit" case.

Right. Now that you mention the function name HandOffToDxe(), I'm pretty
sure that I've looked at this several times in the past, I just couldn't
/ can't recall it now, without looking.

My goal was to ensure that all cases would be considered. Looks like
they have been. :) It would be nice if both the Ia32X64 and the X64 OVMF
platforms could work under SEV.

Thanks!
Laszlo




> 
>>
>> Thanks,
>> Laszlo
>>
>>>
>>>
>>>
>>> Thank you
>>>
>>> Yao Jiewen
>>>
>>>
>>>
>>> *From:*Duran, Leo [mailto:leo.duran@amd.com]
>>> *Sent:* Wednesday, February 8, 2017 9:00 AM
>>> *To:* Zeng, Star <star.zeng@intel.com>; edk2-devel@ml01.01.org
>>> *Cc:* Laszlo Ersek <lersek@redhat.com>; Tian, Feng
>>> <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Yao,
>>> Jiewen <jiewen.yao@intel.com>
>>> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>>
>>>
>>> Pease see reply below.
>>> Leo
>>>
>>>> -----Original Message-----
>>>> From: Zeng, Star [mailto:star.zeng@intel.com]
>>>> Sent: Tuesday, February 07, 2017 8:27 PM
>>>> To: Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com>>;
>>>> edk2-devel@ml01.01.org
>>> <mailto:edk2-devel@ml01.01.org>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
>>> <mailto:feng.tian@intel.com>>;
>>>> Singh, Brijesh <brijesh.singh@amd.com
>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
>>> <mailto:star.zeng@intel.com>>;
>>>> Yao, Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com>>
>>>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>>>
>>>> Thanks,
>>>> Star
>>> [Duran, Leo]
>>> Hi Star,
>>> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>>>
>>> The SEV feature requires 64-bit LongMode, so the
>>> PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time, in which
>> case Create4GPageTablesIa32Pae() would *not* be called by
>> HandOffToDxeCore().
>>>
>>>> -----Original Message-----
>>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf
>>>> Of Leo Duran
>>>> Sent: Wednesday, February 8, 2017 3:54 AM
>>>> To: edk2-devel@ml01.01.org <mailto:edk2-devel@ml01.01.org>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
>>> <mailto:feng.tian@intel.com>>;
>>>> Brijesh Singh <brijesh.singh@amd.com
>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
>>> <mailto:star.zeng@intel.com>>;
>>>> Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com>>
>>>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>> From: Brijesh Singh <brijesh.singh@amd.com
>>>> <mailto:brijesh.singh@amd.com>>
>>>>
>>>> This dynamic PCD holds the address mask for page table entries when
>>>> memory encryption is enabled on AMD processors supporting the Secure
>>>> Encrypted Virtualization (SEV) feature.
>>>>
>>>> Cc: Feng Tian <feng.tian@intel.com <mailto:feng.tian@intel.com>>
>>>> Cc: Star Zeng <star.zeng@intel.com <mailto:star.zeng@intel.com>>
>>>> Cc: Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com>>
>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>> Signed-off-by: Leo Duran <leo.duran@amd.com
>>>> <mailto:leo.duran@amd.com>>
>>>> ---
>>>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18
>> ++++++++++--
>>>> ------
>>>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>>>
>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> index 2bc41be..d62bd9b 100644
>>>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> @@ -6,6 +6,8 @@
>>>>  #  needed to run the DXE Foundation.
>>>>  #
>>>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights
>>>> reserved.<BR>
>>>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>>  #  This program and the accompanying materials  #  are licensed and
>>>> made available under the terms and conditions of the BSD License  #
>>>> which accompanies this distribution.  The full text of the license
>>>> may be found at @@ -111,7 +113,8 @@ [FeaturePcd]
>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress
>> ##
>>>> CONSUMES
>>>>
>>>>  [Pcd.IA32,Pcd.X64]
>>>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>>>> SOMETIMES_CONSUMES
>>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>>>> SOMETIMES_CONSUMES
>>>> +
>>>>
>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>> ask    ## CONSUMES
>>>>
>>>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>>>> SOMETIMES_CONSUMES
>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> index 790f6ab..2c52389 100644
>>>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> @@ -16,6 +16,8 @@
>>>>      3) IA-32 Intel(R) Architecture Software Developer's Manual
>>>> Volume 3:System Programmer's Guide, Intel
>>>>
>>>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights
>>>> reserved.<BR>
>>>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>>> +
>>>>  This program and the accompanying materials  are licensed and made
>>>> available under the terms and conditions of the BSD License  which
>>>> accompanies this distribution.  The full text of the license may be
>>>> found at @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>>>    //
>>>>    // Fill in 2M page entry.
>>>>    //
>>>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
>>>> IA32_PG_RW;
>>>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P |
>> IA32_PG_RW;
>>>>
>>>>    PhysicalAddress4K = PhysicalAddress;
>>>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>>>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>>>> SIZE_4KB) {
>>>>      //
>>>>      // Fill in the Page Table entries
>>>>      //
>>>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>>>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>      PageTableEntry->Bits.ReadWrite = 1;
>>>>      PageTableEntry->Bits.Present = 1;
>>>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K <
>>>> StackBase +
>>>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>>>    //
>>>>    // Fill in 1G page entry.
>>>>    //
>>>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
>>>> IA32_PG_RW;
>>>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P |
>> IA32_PG_RW;
>>>>
>>>>    PhysicalAddress2M = PhysicalAddress;
>>>>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries
>>>> < 512;
>>>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++,
>>>> IndexOfPageDirectoryEntries++PhysicalAddress2M
>>>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>>>        //
>>>>        // Fill in the Page Directory entries
>>>>        //
>>>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>>>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>        PageDirectoryEntry->Bits.Present = 1;
>>>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
>>>> CreateIdentityMappingPageTables (
>>>>      //
>>>>      // Make a PML4 Entry
>>>>      //
>>>> -    PageMapLevel4Entry->Uint64 =
>>>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>>>> +    PageMapLevel4Entry->Uint64 =
>>>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>>>      PageMapLevel4Entry->Bits.Present = 1;
>>>>
>>>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>>>            //
>>>>            // Fill in the Page Directory entries
>>>>            //
>>>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>>>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>>>            PageDirectory1GEntry->Bits.Present = 1;
>>>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7
>>>> @@ CreateIdentityMappingPageTables (
>>>>          //
>>>>          // Fill in a Page Directory Pointer Entries
>>>>          //
>>>> -        PageDirectoryPointerEntry->Uint64 =
>>>> (UINT64)(UINTN)PageDirectoryEntry;
>>>> +        PageDirectoryPointerEntry->Uint64 =
>>>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>>>
>>>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>>>              //
>>>>              // Fill in the Page Directory entries
>>>>              //
>>>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>>>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>              PageDirectoryEntry->Bits.Present = 1;
>>>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
>>>> a/MdeModulePkg/MdeModulePkg.dec
>> b/MdeModulePkg/MdeModulePkg.dec index
>>>> 273cd7e..207384f 100644
>>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>>> @@ -6,6 +6,8 @@
>>>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights
>>>> reserved.<BR>  # Copyright (c) 2016, Linaro Ltd. All rights
>>>> reserved.<BR>  # (C) Copyright 2016 Hewlett Packard Enterprise
>>>> Development LP<BR>
>>>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>>  # This program and the accompanying materials are licensed and made
>>>> available under  # the terms and conditions of the BSD License that
>>>> accompanies this distribution.
>>>>  # The full text of the license may be found at @@ -1738,5 +1740,11
>>>> @@ [PcdsDynamic, PcdsDynamicEx]
>>>>    # @Prompt If there is any test key used by the platform.
>>>>
>>>>
>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>>>> 0030003
>>>>
>>>> +  ## This dynamic PCD holds the address mask for page table entries
>>>> + when memory encryption is  #  enabled on AMD processors supporting
>>>> + the
>>>> Secure Encrypted Virtualization (SEV) feature.
>>>> +  #  This mask should be applied when creating 1:1 virtual to
>>>> + physical
>>>> mapping tables.
>>>> +  #
>>>> +
>>>> +
>>>>
>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>> ask|0x0
>>>> + |UINT64|0x00030004
>>>> +
>>>>  [UserExtensions.TianoCore."ExtraFiles"]
>>>>    MdeModulePkgExtra.uni
>>>> --
>>>> 1.9.1
>>>>
>>>> _______________________________________________
>>>> edk2-devel mailing list
>>>> edk2-devel@lists.01.org <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Yao, Jiewen 7 years, 8 months ago
I think X64 DXEIPL *may* create page table for X64 DXE. It is controlled by PcdDxeIplBuildPageTables.

  if (FeaturePcdGet (PcdDxeIplBuildPageTables)) {
    //
    // Create page table and save PageMapLevel4 to CR3
    //
    PageTables = CreateIdentityMappingPageTables ((EFI_PHYSICAL_ADDRESS) (UINTN) BaseOfStack, STACK_SIZE);

Thank you
Yao Jiewen


From: Laszlo Ersek [mailto:lersek@redhat.com]
Sent: Wednesday, February 8, 2017 9:56 AM
To: Duran, Leo <leo.duran@amd.com>; Yao, Jiewen <jiewen.yao@intel.com>; Zeng, Star <star.zeng@intel.com>; edk2-devel@ml01.01.org
Cc: Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

On 02/08/17 18:28, Duran, Leo wrote:
> Lazlo, et al,
> Please see reply below.
> Lleo
>
>> -----Original Message-----
>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>> Sent: Wednesday, February 08, 2017 11:11 AM
>> To: Yao, Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com>>; Duran, Leo
>> <leo.duran@amd.com<mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>; edk2-
>> devel@ml01.01.org<mailto:devel@ml01.01.org>
>> Cc: Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>; Singh, Brijesh
>> <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>
>> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>> PcdPteMemoryEncryptionAddressOrMask
>>
>> On 02/08/17 18:05, Yao, Jiewen wrote:
>>> HI Leo
>>>
>>> Thanks to clarify that.
>>>
>>>
>>>
>>> If that is the case, do you think it will be better to limit this PCD
>>> to
>>> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
>>
>> Not sure if this is the best place to raise the following observation, but it
>> should do:
>>
>> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE
>> if PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
>> - both PEI and DXE are 32-bit, and
>> - both PEI and DXE are 64-bit.
>>
>> This doesn't necessarily invalidate anything said thus fair in the thread, but
>> the following statement from Leo:
>>
>>     The SEV feature requires 64-bit LongMode, so the
>>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
>>
>> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
> [Duran, Leo]
> Good points... I should have provided more context.
> 1) I had referred the "PEI is 32-bit and DXE is 64-bit."
> 2) If both PEI and DXE are 64-bit, then you would be executing the X64 of HandOffToDxe(), which does *not* call Create4GPageTables().
>
> That is, Create4GPageTables() only gets called in the "PEI is 32-bit" case.

Right. Now that you mention the function name HandOffToDxe(), I'm pretty
sure that I've looked at this several times in the past, I just couldn't
/ can't recall it now, without looking.

My goal was to ensure that all cases would be considered. Looks like
they have been. :) It would be nice if both the Ia32X64 and the X64 OVMF
platforms could work under SEV.

Thanks!
Laszlo




>
>>
>> Thanks,
>> Laszlo
>>
>>>
>>>
>>>
>>> Thank you
>>>
>>> Yao Jiewen
>>>
>>>
>>>
>>> *From:*Duran, Leo [mailto:leo.duran@amd.com]
>>> *Sent:* Wednesday, February 8, 2017 9:00 AM
>>> *To:* Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
>>> *Cc:* Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Tian, Feng
>>> <feng.tian@intel.com<mailto:feng.tian@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Yao,
>>> Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com>>
>>> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>>
>>>
>>> Pease see reply below.
>>> Leo
>>>
>>>> -----Original Message-----
>>>> From: Zeng, Star [mailto:star.zeng@intel.com]
>>>> Sent: Tuesday, February 07, 2017 8:27 PM
>>>> To: Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>;
>>>> edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
>>> <mailto:edk2-devel@ml01.01.org>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b>>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com%0b>>>> <mailto:feng.tian@intel.com>>;
>>>> Singh, Brijesh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b>>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com%0b>>>> <mailto:star.zeng@intel.com>>;
>>>> Yao, Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com<mailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com>>>
>>>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>>>
>>>> Thanks,
>>>> Star
>>> [Duran, Leo]
>>> Hi Star,
>>> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>>>
>>> The SEV feature requires 64-bit LongMode, so the
>>> PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time, in which
>> case Create4GPageTablesIa32Pae() would *not* be called by
>> HandOffToDxeCore().
>>>
>>>> -----Original Message-----
>>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf
>>>> Of Leo Duran
>>>> Sent: Wednesday, February 8, 2017 3:54 AM
>>>> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org> <mailto:edk2-devel@ml01.01.org>
>>>> Cc: Laszlo Ersek <lersek@redhat.com
<mailto:lersek@redhat.com%0b>>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
<mailto:feng.tian@intel.com%0b>>>> <mailto:feng.tian@intel.com>>;
>>>> Brijesh Singh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b>>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
<mailto:star.zeng@intel.com%0b>>>> <mailto:star.zeng@intel.com>>;
>>>> Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com<mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>
>>>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>> From: Brijesh Singh <brijesh.singh@amd.com
<mailto:brijesh.singh@amd.com%0b>>>>> <mailto:brijesh.singh@amd.com>>
>>>>
>>>> This dynamic PCD holds the address mask for page table entries when
>>>> memory encryption is enabled on AMD processors supporting the Secure
>>>> Encrypted Virtualization (SEV) feature.
>>>>
>>>> Cc: Feng Tian <feng.tian@intel.com <mailto:feng.tian@intel.com<mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com>>>
>>>> Cc: Star Zeng <star.zeng@intel.com <mailto:star.zeng@intel.com<mailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com>>>
>>>> Cc: Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com<mailto:lersek@redhat.com %3cmailto:lersek@redhat.com>>>
>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>> Signed-off-by: Leo Duran <leo.duran@amd.com
<mailto:leo.duran@amd.com%0b>>>>> <mailto:leo.duran@amd.com>>
>>>> ---
>>>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18
>> ++++++++++--
>>>> ------
>>>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>>>
>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> index 2bc41be..d62bd9b 100644
>>>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>> @@ -6,6 +6,8 @@
>>>>  #  needed to run the DXE Foundation.
>>>>  #
>>>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights
>>>> reserved.<BR>
>>>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>>  #  This program and the accompanying materials  #  are licensed and
>>>> made available under the terms and conditions of the BSD License  #
>>>> which accompanies this distribution.  The full text of the license
>>>> may be found at @@ -111,7 +113,8 @@ [FeaturePcd]
>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress
>> ##
>>>> CONSUMES
>>>>
>>>>  [Pcd.IA32,Pcd.X64]
>>>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>>>> SOMETIMES_CONSUMES
>>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>>>> SOMETIMES_CONSUMES
>>>> +
>>>>
>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>> ask    ## CONSUMES
>>>>
>>>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>>>> SOMETIMES_CONSUMES
>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> index 790f6ab..2c52389 100644
>>>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>> @@ -16,6 +16,8 @@
>>>>      3) IA-32 Intel(R) Architecture Software Developer's Manual
>>>> Volume 3:System Programmer's Guide, Intel
>>>>
>>>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights
>>>> reserved.<BR>
>>>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>>> +
>>>>  This program and the accompanying materials  are licensed and made
>>>> available under the terms and conditions of the BSD License  which
>>>> accompanies this distribution.  The full text of the license may be
>>>> found at @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>>>    //
>>>>    // Fill in 2M page entry.
>>>>    //
>>>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
>>>> IA32_PG_RW;
>>>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P |
>> IA32_PG_RW;
>>>>
>>>>    PhysicalAddress4K = PhysicalAddress;
>>>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>>>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>>>> SIZE_4KB) {
>>>>      //
>>>>      // Fill in the Page Table entries
>>>>      //
>>>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>>>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>      PageTableEntry->Bits.ReadWrite = 1;
>>>>      PageTableEntry->Bits.Present = 1;
>>>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K <
>>>> StackBase +
>>>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>>>    //
>>>>    // Fill in 1G page entry.
>>>>    //
>>>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
>>>> IA32_PG_RW;
>>>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P |
>> IA32_PG_RW;
>>>>
>>>>    PhysicalAddress2M = PhysicalAddress;
>>>>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries
>>>> < 512;
>>>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++,
>>>> IndexOfPageDirectoryEntries++PhysicalAddress2M
>>>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>>>        //
>>>>        // Fill in the Page Directory entries
>>>>        //
>>>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>>>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>        PageDirectoryEntry->Bits.Present = 1;
>>>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
>>>> CreateIdentityMappingPageTables (
>>>>      //
>>>>      // Make a PML4 Entry
>>>>      //
>>>> -    PageMapLevel4Entry->Uint64 =
>>>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>>>> +    PageMapLevel4Entry->Uint64 =
>>>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>>>      PageMapLevel4Entry->Bits.Present = 1;
>>>>
>>>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>>>            //
>>>>            // Fill in the Page Directory entries
>>>>            //
>>>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>>>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>>>            PageDirectory1GEntry->Bits.Present = 1;
>>>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7
>>>> @@ CreateIdentityMappingPageTables (
>>>>          //
>>>>          // Fill in a Page Directory Pointer Entries
>>>>          //
>>>> -        PageDirectoryPointerEntry->Uint64 =
>>>> (UINT64)(UINTN)PageDirectoryEntry;
>>>> +        PageDirectoryPointerEntry->Uint64 =
>>>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>>>
>>>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>>>              //
>>>>              // Fill in the Page Directory entries
>>>>              //
>>>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>>>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress |
>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>              PageDirectoryEntry->Bits.Present = 1;
>>>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
>>>> a/MdeModulePkg/MdeModulePkg.dec
>> b/MdeModulePkg/MdeModulePkg.dec index
>>>> 273cd7e..207384f 100644
>>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>>> @@ -6,6 +6,8 @@
>>>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights
>>>> reserved.<BR>  # Copyright (c) 2016, Linaro Ltd. All rights
>>>> reserved.<BR>  # (C) Copyright 2016 Hewlett Packard Enterprise
>>>> Development LP<BR>
>>>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>>  # This program and the accompanying materials are licensed and made
>>>> available under  # the terms and conditions of the BSD License that
>>>> accompanies this distribution.
>>>>  # The full text of the license may be found at @@ -1738,5 +1740,11
>>>> @@ [PcdsDynamic, PcdsDynamicEx]
>>>>    # @Prompt If there is any test key used by the platform.
>>>>
>>>>
>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>>>> 0030003
>>>>
>>>> +  ## This dynamic PCD holds the address mask for page table entries
>>>> + when memory encryption is  #  enabled on AMD processors supporting
>>>> + the
>>>> Secure Encrypted Virtualization (SEV) feature.
>>>> +  #  This mask should be applied when creating 1:1 virtual to
>>>> + physical
>>>> mapping tables.
>>>> +  #
>>>> +
>>>> +
>>>>
>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>> ask|0x0
>>>> + |UINT64|0x00030004
>>>> +
>>>>  [UserExtensions.TianoCore."ExtraFiles"]
>>>>    MdeModulePkgExtra.uni
>>>> --
>>>> 1.9.1
>>>>
>>>> _______________________________________________
>>>> edk2-devel mailing list
>>>> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org> <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Laszlo Ersek 7 years, 8 months ago
On 02/08/17 19:13, Yao, Jiewen wrote:
> I think X64 DXEIPL **may** create page table for X64 DXE. It is
> controlled by PcdDxeIplBuildPageTables.
> 
>  
> 
>   if(FeaturePcdGet (PcdDxeIplBuildPageTables)) {
> 
>     //
> 
>     // Create page table and save PageMapLevel4 to CR3
> 
>     //
> 
>     PageTables = CreateIdentityMappingPageTables ((EFI_PHYSICAL_ADDRESS)
> (UINTN) BaseOfStack, STACK_SIZE);

That's a good find:

  ## Indicates if DxeIpl should rebuild page tables. This flag only
  #  makes sense in the case where the DxeIpl and the DxeCore are both X64.<BR><BR>
  #   TRUE  - DxeIpl will rebuild page tables.<BR>
  #   FALSE - DxeIpl will not rebuild page tables.<BR>
  # @Prompt DxeIpl rebuild page tables.
  gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables|TRUE|BOOLEAN|0x0001003c

OVMF (all three platforms) inherit the DEC default without change.

For more confirmation, there's also:

  ## Indicates if to set NX for stack.<BR><BR>
  #  For the DxeIpl and the DxeCore are both X64, set NX for stack feature also require PcdDxeIplBuildPageTables be TRUE.<BR>
  #  For the DxeIpl and the DxeCore are both IA32 (PcdDxeIplSwitchToLongMode is FALSE), set NX for stack feature also require
  #  IA32 PAE is supported and Execute Disable Bit is available.<BR>
  #   TRUE  - to set NX for stack.<BR>
  #   FALSE - Not to set NX for stack.<BR>
  # @Prompt Set NX for stack.
  gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack|FALSE|BOOLEAN|0x0001006f

And in OVMF, all three platforms support NX-for-stack. It can be controlled dynamically, from the QEMU command line. We used to enable it by default, but it caused some old UEFI boot loaders to crash (because they were executing code from the stack), so we flipped it off, and exposed it on the QEMU command line.

  901c58c59412 MdeModulePkg: PcdSetNxForStack: enable dynamism
  d26753f8358c OvmfPkg: make PcdSetNxForStack dynamic
  c075d250f6f2 OvmfPkg: make PcdPropertiesTableEnable dynamic
  ab081a50e565 OvmfPkg: PlatformPei: take no-exec DXE settings from the QEMU command line
  d20b06a3afdf OvmfPkg: disable no-exec DXE stack by default

Either way, the point is that OVMF X64 keeps PcdDxeIplBuildPageTables=TRUE.

Thank you!
Laszlo


> 
>  
> 
> Thank you
> 
> Yao Jiewen
> 
>  
> 
>  
> 
> *From:*Laszlo Ersek [mailto:lersek@redhat.com]
> *Sent:* Wednesday, February 8, 2017 9:56 AM
> *To:* Duran, Leo <leo.duran@amd.com>; Yao, Jiewen
> <jiewen.yao@intel.com>; Zeng, Star <star.zeng@intel.com>;
> edk2-devel@ml01.01.org
> *Cc:* Tian, Feng <feng.tian@intel.com>; Singh, Brijesh
> <brijesh.singh@amd.com>
> *Subject:* Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
> 
>  
> 
> On 02/08/17 18:28, Duran, Leo wrote:
>> Lazlo, et al,
>> Please see reply below.
>> Lleo
>> 
>>> -----Original Message-----
>>> From: Laszlo Ersek [mailto:lersek@redhat.com]
>>> Sent: Wednesday, February 08, 2017 11:11 AM
>>> To: Yao, Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com>>; Duran, Leo
>>> <leo.duran@amd.com
> <mailto:leo.duran@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com>>; edk2-
>>> devel@ml01.01.org <mailto:devel@ml01.01.org>
>>> Cc: Tian, Feng <feng.tian@intel.com <mailto:feng.tian@intel.com>>; Singh, Brijesh
>>> <brijesh.singh@amd.com <mailto:brijesh.singh@amd.com>>
>>> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>> PcdPteMemoryEncryptionAddressOrMask
>>>
>>> On 02/08/17 18:05, Yao, Jiewen wrote:
>>>> HI Leo
>>>>
>>>> Thanks to clarify that.
>>>>
>>>>
>>>>
>>>> If that is the case, do you think it will be better to limit this PCD
>>>> to
>>>> X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
>>>
>>> Not sure if this is the best place to raise the following observation, but it
>>> should do:
>>>
>>> please everyone remember that PcdDxeIplSwitchToLongMode is only TRUE
>>> if PEI is 32-bit and DXE is 64-bit. It is FALSE in *two* cases:
>>> - both PEI and DXE are 32-bit, and
>>> - both PEI and DXE are 64-bit.
>>>
>>> This doesn't necessarily invalidate anything said thus fair in the thread, but
>>> the following statement from Leo:
>>>
>>>     The SEV feature requires 64-bit LongMode, so the
>>>     PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time
>>>
>>> does not follow. The PCD is FALSE in OvmfPkgX64.dsc.
>> [Duran, Leo] 
>> Good points... I should have provided more context.
>> 1) I had referred the "PEI is 32-bit and DXE is 64-bit."
>> 2) If both PEI and DXE are 64-bit, then you would be executing the X64 of HandOffToDxe(), which does *not* call Create4GPageTables().
>> 
>> That is, Create4GPageTables() only gets called in the "PEI is 32-bit" case.
> 
> Right. Now that you mention the function name HandOffToDxe(), I'm pretty
> sure that I've looked at this several times in the past, I just couldn't
> / can't recall it now, without looking.
> 
> My goal was to ensure that all cases would be considered. Looks like
> they have been. :) It would be nice if both the Ia32X64 and the X64 OVMF
> platforms could work under SEV.
> 
> Thanks!
> Laszlo
> 
> 
> 
> 
>> 
>>>
>>> Thanks,
>>> Laszlo
>>>
>>>>
>>>>
>>>>
>>>> Thank you
>>>>
>>>> Yao Jiewen
>>>>
>>>>
>>>>
>>>> *From:*Duran, Leo [mailto:leo.duran@amd.com]
>>>> *Sent:* Wednesday, February 8, 2017 9:00 AM
>>>> *To:* Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org>
>>>> *Cc:* Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com>>; Tian, Feng
>>>> <feng.tian@intel.com
> <mailto:feng.tian@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com>>; Yao,
>>>> Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com>>
>>>> *Subject:* RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>
>>>>
>>>>
>>>> Pease see reply below.
>>>> Leo
>>>>
>>>>> -----Original Message-----
>>>>> From: Zeng, Star [mailto:star.zeng@intel.com]
>>>>> Sent: Tuesday, February 07, 2017 8:27 PM
>>>>> To: Duran, Leo <leo.duran@amd.com <mailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>;
>>>>> edk2-devel@ml01.01.org <mailto:edk2-devel@ml01.01.org>
>>>> <mailto:edk2-devel@ml01.01.org>
>>>>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b>>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com%0b>>>> <mailto:feng.tian@intel.com>>;
>>>>> Singh, Brijesh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b>>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com%0b>>>> <mailto:star.zeng@intel.com>>;
>>>>> Yao, Jiewen <jiewen.yao@intel.com <mailto:jiewen.yao@intel.com
> <mailto:jiewen.yao@intel.com %3cmailto:jiewen.yao@intel.com>>>
>>>>> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>>
>>>>> Does Create4GPageTablesIa32Pae() also need to be updated?
>>>>>
>>>>> Thanks,
>>>>> Star
>>>> [Duran, Leo]
>>>> Hi Star,
>>>> No, I do not think Create4GPageTablesIa32Pae() is in the execution path.
>>>>
>>>> The SEV feature requires 64-bit LongMode, so the
>>>> PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time, in which
>>> case Create4GPageTablesIa32Pae() would *not* be called by
>>> HandOffToDxeCore().
>>>>
>>>>> -----Original Message-----
>>>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf
>>>>> Of Leo Duran
>>>>> Sent: Wednesday, February 8, 2017 3:54 AM
>>>>> To: edk2-devel@ml01.01.org
> <mailto:edk2-devel@ml01.01.org> <mailto:edk2-devel@ml01.01.org>
>>>>> Cc: Laszlo Ersek <lersek@redhat.com
> <mailto:lersek@redhat.com%0b>>>> <mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com
> <mailto:feng.tian@intel.com%0b>>>> <mailto:feng.tian@intel.com>>;
>>>>> Brijesh Singh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b>>>> <mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com
> <mailto:star.zeng@intel.com%0b>>>> <mailto:star.zeng@intel.com>>;
>>>>> Leo Duran <leo.duran@amd.com <mailto:leo.duran@amd.com
> <mailto:leo.duran@amd.com %3cmailto:leo.duran@amd.com>>>
>>>>> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
>>>>> PcdPteMemoryEncryptionAddressOrMask
>>>>>
>>>>> From: Brijesh Singh <brijesh.singh@amd.com
> <mailto:brijesh.singh@amd.com%0b>>>>> <mailto:brijesh.singh@amd.com>>
>>>>>
>>>>> This dynamic PCD holds the address mask for page table entries when
>>>>> memory encryption is enabled on AMD processors supporting the Secure
>>>>> Encrypted Virtualization (SEV) feature.
>>>>>
>>>>> Cc: Feng Tian <feng.tian@intel.com <mailto:feng.tian@intel.com
> <mailto:feng.tian@intel.com %3cmailto:feng.tian@intel.com>>>
>>>>> Cc: Star Zeng <star.zeng@intel.com <mailto:star.zeng@intel.com
> <mailto:star.zeng@intel.com %3cmailto:star.zeng@intel.com>>>
>>>>> Cc: Laszlo Ersek <lersek@redhat.com <mailto:lersek@redhat.com
> <mailto:lersek@redhat.com %3cmailto:lersek@redhat.com>>>
>>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>>> Signed-off-by: Leo Duran <leo.duran@amd.com
> <mailto:leo.duran@amd.com%0b>>>>> <mailto:leo.duran@amd.com>>
>>>>> ---
>>>>>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>>>>>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18
>>> ++++++++++--
>>>>> ------
>>>>>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>>>>>  3 files changed, 22 insertions(+), 9 deletions(-)
>>>>>
>>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> index 2bc41be..d62bd9b 100644
>>>>> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>>>> @@ -6,6 +6,8 @@
>>>>>  #  needed to run the DXE Foundation.
>>>>>  #
>>>>>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights
>>>>> reserved.<BR>
>>>>> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>>>  #  This program and the accompanying materials  #  are licensed and
>>>>> made available under the terms and conditions of the BSD License  #
>>>>> which accompanies this distribution.  The full text of the license
>>>>> may be found at @@ -111,7 +113,8 @@ [FeaturePcd]
>>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress
>>> ##
>>>>> CONSUMES
>>>>>
>>>>>  [Pcd.IA32,Pcd.X64]
>>>>> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
>>>>> SOMETIMES_CONSUMES
>>>>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
>>>>> SOMETIMES_CONSUMES
>>>>> +
>>>>>
>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>>> ask    ## CONSUMES
>>>>>
>>>>>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
>>>>> SOMETIMES_CONSUMES
>>>>> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> index 790f6ab..2c52389 100644
>>>>> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
>>>>> @@ -16,6 +16,8 @@
>>>>>      3) IA-32 Intel(R) Architecture Software Developer's Manual
>>>>> Volume 3:System Programmer's Guide, Intel
>>>>>
>>>>>  Copyright (c) 2006 - 2016, Intel Corporation. All rights
>>>>> reserved.<BR>
>>>>> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>>>>> +
>>>>>  This program and the accompanying materials  are licensed and made
>>>>> available under the terms and conditions of the BSD License  which
>>>>> accompanies this distribution.  The full text of the license may be
>>>>> found at @@ -71,14 +73,14 @@ Split2MPageTo4K (
>>>>>    //
>>>>>    // Fill in 2M page entry.
>>>>>    //
>>>>> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
>>>>> IA32_PG_RW;
>>>>> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
>>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P |
>>> IA32_PG_RW;
>>>>>
>>>>>    PhysicalAddress4K = PhysicalAddress;
>>>>>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
>>>>> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
>>>>> SIZE_4KB) {
>>>>>      //
>>>>>      // Fill in the Page Table entries
>>>>>      //
>>>>> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
>>>>> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
>>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>>      PageTableEntry->Bits.ReadWrite = 1;
>>>>>      PageTableEntry->Bits.Present = 1;
>>>>>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K <
>>>>> StackBase +
>>>>> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>>>>>    //
>>>>>    // Fill in 1G page entry.
>>>>>    //
>>>>> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
>>>>> IA32_PG_RW;
>>>>> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
>>>>> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P |
>>> IA32_PG_RW;
>>>>>
>>>>>    PhysicalAddress2M = PhysicalAddress;
>>>>>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries
>>>>> < 512;
>>>>> IndexOfPageDirectoryEntries++, PageDirectoryEntry++,
>>>>> IndexOfPageDirectoryEntries++PhysicalAddress2M
>>>>> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>>>>>        //
>>>>>        // Fill in the Page Directory entries
>>>>>        //
>>>>> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
>>>>> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>        PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>>        PageDirectoryEntry->Bits.Present = 1;
>>>>>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
>>>>> CreateIdentityMappingPageTables (
>>>>>      //
>>>>>      // Make a PML4 Entry
>>>>>      //
>>>>> -    PageMapLevel4Entry->Uint64 =
>>>>> (UINT64)(UINTN)PageDirectoryPointerEntry;
>>>>> +    PageMapLevel4Entry->Uint64 =
>>>>> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
>>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>>>>>      PageMapLevel4Entry->Bits.Present = 1;
>>>>>
>>>>> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>>>>>            //
>>>>>            // Fill in the Page Directory entries
>>>>>            //
>>>>> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
>>>>> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress |
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>>>>>            PageDirectory1GEntry->Bits.Present = 1;
>>>>>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7
>>>>> @@ CreateIdentityMappingPageTables (
>>>>>          //
>>>>>          // Fill in a Page Directory Pointer Entries
>>>>>          //
>>>>> -        PageDirectoryPointerEntry->Uint64 =
>>>>> (UINT64)(UINTN)PageDirectoryEntry;
>>>>> +        PageDirectoryPointerEntry->Uint64 =
>>>>> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
>>>>> + (PcdPteMemoryEncryptionAddressOrMask);
>>>>>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>>>>>          PageDirectoryPointerEntry->Bits.Present = 1;
>>>>>
>>>>> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>>>>>              //
>>>>>              // Fill in the Page Directory entries
>>>>>              //
>>>>> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
>>>>> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress |
>>>>> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>>>>>              PageDirectoryEntry->Bits.ReadWrite = 1;
>>>>>              PageDirectoryEntry->Bits.Present = 1;
>>>>>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
>>>>> a/MdeModulePkg/MdeModulePkg.dec
>>> b/MdeModulePkg/MdeModulePkg.dec index
>>>>> 273cd7e..207384f 100644
>>>>> --- a/MdeModulePkg/MdeModulePkg.dec
>>>>> +++ b/MdeModulePkg/MdeModulePkg.dec
>>>>> @@ -6,6 +6,8 @@
>>>>>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights
>>>>> reserved.<BR>  # Copyright (c) 2016, Linaro Ltd. All rights
>>>>> reserved.<BR>  # (C) Copyright 2016 Hewlett Packard Enterprise
>>>>> Development LP<BR>
>>>>> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>>>>>  # This program and the accompanying materials are licensed and made
>>>>> available under  # the terms and conditions of the BSD License that
>>>>> accompanies this distribution.
>>>>>  # The full text of the license may be found at @@ -1738,5 +1740,11
>>>>> @@ [PcdsDynamic, PcdsDynamicEx]
>>>>>    # @Prompt If there is any test key used by the platform.
>>>>>
>>>>>
>>> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
>>>>> 0030003
>>>>>
>>>>> +  ## This dynamic PCD holds the address mask for page table entries
>>>>> + when memory encryption is  #  enabled on AMD processors supporting
>>>>> + the
>>>>> Secure Encrypted Virtualization (SEV) feature.
>>>>> +  #  This mask should be applied when creating 1:1 virtual to
>>>>> + physical
>>>>> mapping tables.
>>>>> +  #
>>>>> +
>>>>> +
>>>>>
>>> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
>>>>> ask|0x0
>>>>> + |UINT64|0x00030004
>>>>> +
>>>>>  [UserExtensions.TianoCore."ExtraFiles"]
>>>>>    MdeModulePkgExtra.uni
>>>>> --
>>>>> 1.9.1
>>>>>
>>>>> _______________________________________________
>>>>> edk2-devel mailing list
>>>>> edk2-devel@lists.01.org
> <mailto:edk2-devel@lists.01.org> <mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Duran, Leo 7 years, 8 months ago
Please see below.
Leo.

From: Yao, Jiewen [mailto:jiewen.yao@intel.com]
Sent: Wednesday, February 08, 2017 11:05 AM
To: Duran, Leo <leo.duran@amd.com>; Zeng, Star <star.zeng@intel.com>; edk2-devel@ml01.01.org
Cc: Laszlo Ersek <lersek@redhat.com>; Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>
Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

HI Leo
Thanks to clarify that.

If that is the case, do you think it will be better to limit this PCD to X64 only in DEC file. Such as [PcdsDynamic.X64, PcdsDynamicEx.X64]
[Duran, Leo] I think we need to check the PCD from 32-bit PEI.

Thank you
Yao Jiewen

From: Duran, Leo [mailto:leo.duran@amd.com]
Sent: Wednesday, February 8, 2017 9:00 AM
To: Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>; Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Yao, Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com>>
Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

Pease see reply below.
Leo

> -----Original Message-----
> From: Zeng, Star [mailto:star.zeng@intel.com]
> Sent: Tuesday, February 07, 2017 8:27 PM
> To: Duran, Leo <leo.duran@amd.com<mailto:leo.duran@amd.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>;
> Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>;
> Yao, Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com>>
> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
> Does Create4GPageTablesIa32Pae() also need to be updated?
>
> Thanks,
> Star
[Duran, Leo]
Hi Star,
No, I do not think Create4GPageTablesIa32Pae() is in the execution path.

The SEV feature requires 64-bit LongMode, so the PcdDxeIplSwitchtoLongMode *must* set to TRUE at build-time,
in which case Create4GPageTablesIa32Pae() would *not* be called by HandOffToDxeCore().

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Leo Duran
> Sent: Wednesday, February 8, 2017 3:54 AM
> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>;
> Brijesh Singh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>;
> Leo Duran <leo.duran@amd.com<mailto:leo.duran@amd.com>>
> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
> From: Brijesh Singh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>
>
> This dynamic PCD holds the address mask for page table entries when
> memory encryption is enabled on AMD processors supporting the Secure
> Encrypted Virtualization (SEV) feature.
>
> Cc: Feng Tian <feng.tian@intel.com<mailto:feng.tian@intel.com>>
> Cc: Star Zeng <star.zeng@intel.com<mailto:star.zeng@intel.com>>
> Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Leo Duran <leo.duran@amd.com<mailto:leo.duran@amd.com>>
> ---
>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
> ------
>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>  3 files changed, 22 insertions(+), 9 deletions(-)
>
> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> index 2bc41be..d62bd9b 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> @@ -6,6 +6,8 @@
>  #  needed to run the DXE Foundation.
>  #
>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>  #  This program and the accompanying materials  #  are licensed and made
> available under the terms and conditions of the BSD License  #  which
> accompanies this distribution.  The full text of the license may be found at
> @@ -111,7 +113,8 @@ [FeaturePcd]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
> CONSUMES
>
>  [Pcd.IA32,Pcd.X64]
> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
> SOMETIMES_CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
> SOMETIMES_CONSUMES
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask    ## CONSUMES
>
>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
> SOMETIMES_CONSUMES
> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> index 790f6ab..2c52389 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> @@ -16,6 +16,8 @@
>      3) IA-32 Intel(R) Architecture Software Developer's Manual Volume
> 3:System Programmer's Guide, Intel
>
>  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> +
>  This program and the accompanying materials  are licensed and made
> available under the terms and conditions of the BSD License  which
> accompanies this distribution.  The full text of the license may be found at
> @@ -71,14 +73,14 @@ Split2MPageTo4K (
>    //
>    // Fill in 2M page entry.
>    //
> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
> IA32_PG_RW;
> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>
>    PhysicalAddress4K = PhysicalAddress;
>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
> SIZE_4KB) {
>      //
>      // Fill in the Page Table entries
>      //
> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>      PageTableEntry->Bits.ReadWrite = 1;
>      PageTableEntry->Bits.Present = 1;
>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase +
> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>    //
>    // Fill in 1G page entry.
>    //
> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
> IA32_PG_RW;
> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>
>    PhysicalAddress2M = PhysicalAddress;
>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512;
> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M
> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>        //
>        // Fill in the Page Directory entries
>        //
> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>        PageDirectoryEntry->Bits.ReadWrite = 1;
>        PageDirectoryEntry->Bits.Present = 1;
>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
> CreateIdentityMappingPageTables (
>      //
>      // Make a PML4 Entry
>      //
> -    PageMapLevel4Entry->Uint64 =
> (UINT64)(UINTN)PageDirectoryPointerEntry;
> +    PageMapLevel4Entry->Uint64 =
> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>      PageMapLevel4Entry->Bits.Present = 1;
>
> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>            //
>            // Fill in the Page Directory entries
>            //
> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>            PageDirectory1GEntry->Bits.Present = 1;
>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 @@
> CreateIdentityMappingPageTables (
>          //
>          // Fill in a Page Directory Pointer Entries
>          //
> -        PageDirectoryPointerEntry->Uint64 =
> (UINT64)(UINTN)PageDirectoryEntry;
> +        PageDirectoryPointerEntry->Uint64 =
> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>          PageDirectoryPointerEntry->Bits.Present = 1;
>
> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>              //
>              // Fill in the Page Directory entries
>              //
> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>              PageDirectoryEntry->Bits.ReadWrite = 1;
>              PageDirectoryEntry->Bits.Present = 1;
>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
> a/MdeModulePkg/MdeModulePkg.dec
> b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -6,6 +6,8 @@
>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>  #
> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>  # (C) Copyright 2016
> Hewlett Packard Enterprise Development LP<BR>
> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>  # This program and the accompanying materials are licensed and made
> available under  # the terms and conditions of the BSD License that
> accompanies this distribution.
>  # The full text of the license may be found at @@ -1738,5 +1740,11 @@
> [PcdsDynamic, PcdsDynamicEx]
>    # @Prompt If there is any test key used by the platform.
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
> 0030003
>
> +  ## This dynamic PCD holds the address mask for page table entries
> + when memory encryption is  #  enabled on AMD processors supporting the
> Secure Encrypted Virtualization (SEV) feature.
> +  #  This mask should be applied when creating 1:1 virtual to physical
> mapping tables.
> +  #
> +
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask|0x0
> + |UINT64|0x00030004
> +
>  [UserExtensions.TianoCore."ExtraFiles"]
>    MdeModulePkgExtra.uni
> --
> 1.9.1
>
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org<mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Laszlo Ersek 7 years, 8 months ago
On 02/07/17 20:53, Leo Duran wrote:
> From: Brijesh Singh <brijesh.singh@amd.com>
> 
> This dynamic PCD holds the address mask for page table entries when memory
> encryption is enabled on AMD processors supporting the Secure Encrypted
> Virtualization (SEV) feature.
> 
> Cc: Feng Tian <feng.tian@intel.com>
> Cc: Star Zeng <star.zeng@intel.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Leo Duran <leo.duran@amd.com>
> ---
>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--------
>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>  3 files changed, 22 insertions(+), 9 deletions(-)

[snip]

> diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
> index 273cd7e..207384f 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -6,6 +6,8 @@
>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
>  # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
>  # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> +#
>  # This program and the accompanying materials are licensed and made available under
>  # the terms and conditions of the BSD License that accompanies this distribution.
>  # The full text of the license may be found at
> @@ -1738,5 +1740,11 @@ [PcdsDynamic, PcdsDynamicEx]
>    # @Prompt If there is any test key used by the platform.
>    gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x00030003
>  
> +  ## This dynamic PCD holds the address mask for page table entries when memory encryption is
> +  #  enabled on AMD processors supporting the Secure Encrypted Virtualization (SEV) feature.
> +  #  This mask should be applied when creating 1:1 virtual to physical mapping tables.
> +  #
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask|0x0|UINT64|0x00030004
> +
>  [UserExtensions.TianoCore."ExtraFiles"]
>    MdeModulePkgExtra.uni
> 

I think this PCD should be added to the following section of the DEC file:

  [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]

Although OVMF will use the PCD as a dynamic one, I see no reason why the
DEC file should prohibit setting the PCD as a fixed one.

Looking at other PCDs in the

  [PcdsDynamic, PcdsDynamicEx]

section, most of those seem to stand for data that are impossible to
determine at build time. Is the new PCD impossible to determine at build
time, for any platform at all?

... Of course, if it can be proved that any given platform will either
(a) set this new PCD dynamically, or
(b) not even *include* the PCD -- with a dynamic default value -- in
    its platform DSC file,
then this patch can work too.

Thanks
Laszlo
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Duran, Leo 7 years, 8 months ago
Lazlo, et al,
Please reply below.
Leo.

> -----Original Message-----
> From: Laszlo Ersek [mailto:lersek@redhat.com]
> Sent: Wednesday, February 08, 2017 2:39 AM
> To: Duran, Leo <leo.duran@amd.com>; edk2-devel@ml01.01.org
> Cc: Feng Tian <feng.tian@intel.com>; Singh, Brijesh
> <brijesh.singh@amd.com>; Star Zeng <star.zeng@intel.com>
> Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
> 
> On 02/07/17 20:53, Leo Duran wrote:
> > From: Brijesh Singh <brijesh.singh@amd.com>
> >
> > This dynamic PCD holds the address mask for page table entries when
> > memory encryption is enabled on AMD processors supporting the Secure
> > Encrypted Virtualization (SEV) feature.
> >
> > Cc: Feng Tian <feng.tian@intel.com>
> > Cc: Star Zeng <star.zeng@intel.com>
> > Cc: Laszlo Ersek <lersek@redhat.com>
> > Contributed-under: TianoCore Contribution Agreement 1.0
> > Signed-off-by: Leo Duran <leo.duran@amd.com>
> > ---
> >  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
> >  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18
> ++++++++++--------
> >  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
> >  3 files changed, 22 insertions(+), 9 deletions(-)
> 
> [snip]
> 
> > diff --git a/MdeModulePkg/MdeModulePkg.dec
> > b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
> > --- a/MdeModulePkg/MdeModulePkg.dec
> > +++ b/MdeModulePkg/MdeModulePkg.dec
> > @@ -6,6 +6,8 @@
> >  # Copyright (c) 2007 - 2017, Intel Corporation. All rights
> > reserved.<BR>  # Copyright (c) 2016, Linaro Ltd. All rights
> > reserved.<BR>  # (C) Copyright 2016 Hewlett Packard Enterprise
> > Development LP<BR>
> > +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
> >  # This program and the accompanying materials are licensed and made
> > available under  # the terms and conditions of the BSD License that
> accompanies this distribution.
> >  # The full text of the license may be found at @@ -1738,5 +1740,11 @@
> > [PcdsDynamic, PcdsDynamicEx]
> >    # @Prompt If there is any test key used by the platform.
> >
> >
> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
> 0030003
> >
> > +  ## This dynamic PCD holds the address mask for page table entries
> > + when memory encryption is  #  enabled on AMD processors supporting
> the Secure Encrypted Virtualization (SEV) feature.
> > +  #  This mask should be applied when creating 1:1 virtual to physical
> mapping tables.
> > +  #
> > +
> > +
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask|0
> > + x0|UINT64|0x00030004
> > +
> >  [UserExtensions.TianoCore."ExtraFiles"]
> >    MdeModulePkgExtra.uni
> >
> 
> I think this PCD should be added to the following section of the DEC file:
> 
>   [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
> 
> Although OVMF will use the PCD as a dynamic one, I see no reason why the
> DEC file should prohibit setting the PCD as a fixed one.
> 
> Looking at other PCDs in the
> 
>   [PcdsDynamic, PcdsDynamicEx]
> 
> section, most of those seem to stand for data that are impossible to
> determine at build time. Is the new PCD impossible to determine at build
> time, for any platform at all?
> 
[Duran, Leo] 
The PCD should be determined at runtime using CPUID.
However, I suppose you may 'know' about your platform at build time.

So to your point, I think it's reasonable to allow fixed, etc.

> ... Of course, if it can be proved that any given platform will either
> (a) set this new PCD dynamically, or
> (b) not even *include* the PCD -- with a dynamic default value -- in
>     its platform DSC file,
> then this patch can work too.
> 
> Thanks
> Laszlo
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Gao, Liming 7 years, 8 months ago
Leo:
  MdeModulePkg CapsulePei and UefiCpuPkg S3Resume2 also create PageTable to run X64 code. Do they require this change?

Thanks
Liming
-----Original Message-----
From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Leo Duran
Sent: Wednesday, February 8, 2017 3:54 AM
To: edk2-devel@ml01.01.org
Cc: Laszlo Ersek <lersek@redhat.com>; Tian, Feng <feng.tian@intel.com>; Brijesh Singh <brijesh.singh@amd.com>; Zeng, Star <star.zeng@intel.com>; Leo Duran <leo.duran@amd.com>
Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

From: Brijesh Singh <brijesh.singh@amd.com>

This dynamic PCD holds the address mask for page table entries when memory
encryption is enabled on AMD processors supporting the Secure Encrypted
Virtualization (SEV) feature.

Cc: Feng Tian <feng.tian@intel.com>
Cc: Star Zeng <star.zeng@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Leo Duran <leo.duran@amd.com>
---
 MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
 MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--------
 MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
 3 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
index 2bc41be..d62bd9b 100644
--- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
+++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
@@ -6,6 +6,8 @@
 #  needed to run the DXE Foundation.
 #
 #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
+#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
+#
 #  This program and the accompanying materials
 #  are licensed and made available under the terms and conditions of the BSD License
 #  which accompanies this distribution.  The full text of the license may be found at
@@ -111,7 +113,8 @@ [FeaturePcd]
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ## CONSUMES
 
 [Pcd.IA32,Pcd.X64]
-  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ## SOMETIMES_CONSUMES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ## SOMETIMES_CONSUMES
+  gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask    ## CONSUMES
 
 [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
   gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ## SOMETIMES_CONSUMES
diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
index 790f6ab..2c52389 100644
--- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
+++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
@@ -16,6 +16,8 @@
     3) IA-32 Intel(R) Architecture Software Developer's Manual Volume 3:System Programmer's Guide, Intel
 
 Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
+
 This program and the accompanying materials
 are licensed and made available under the terms and conditions of the BSD License
 which accompanies this distribution.  The full text of the license may be found at
@@ -71,14 +73,14 @@ Split2MPageTo4K (
   //
   // Fill in 2M page entry.
   //
-  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P | IA32_PG_RW;
+  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
 
   PhysicalAddress4K = PhysicalAddress;
   for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512; IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K += SIZE_4KB) {
     //
     // Fill in the Page Table entries
     //
-    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
+    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
     PageTableEntry->Bits.ReadWrite = 1;
     PageTableEntry->Bits.Present = 1;
     if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase + StackSize)) {
@@ -116,7 +118,7 @@ Split1GPageTo2M (
   //
   // Fill in 1G page entry.
   //
-  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P | IA32_PG_RW;
+  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
 
   PhysicalAddress2M = PhysicalAddress;
   for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512; IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M += SIZE_2MB) {
@@ -129,7 +131,7 @@ Split1GPageTo2M (
       //
       // Fill in the Page Directory entries
       //
-      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
+      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
       PageDirectoryEntry->Bits.ReadWrite = 1;
       PageDirectoryEntry->Bits.Present = 1;
       PageDirectoryEntry->Bits.MustBe1 = 1;
@@ -248,7 +250,7 @@ CreateIdentityMappingPageTables (
     //
     // Make a PML4 Entry
     //
-    PageMapLevel4Entry->Uint64 = (UINT64)(UINTN)PageDirectoryPointerEntry;
+    PageMapLevel4Entry->Uint64 = (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
     PageMapLevel4Entry->Bits.ReadWrite = 1;
     PageMapLevel4Entry->Bits.Present = 1;
 
@@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
           //
           // Fill in the Page Directory entries
           //
-          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
+          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
           PageDirectory1GEntry->Bits.ReadWrite = 1;
           PageDirectory1GEntry->Bits.Present = 1;
           PageDirectory1GEntry->Bits.MustBe1 = 1;
@@ -280,7 +282,7 @@ CreateIdentityMappingPageTables (
         //
         // Fill in a Page Directory Pointer Entries
         //
-        PageDirectoryPointerEntry->Uint64 = (UINT64)(UINTN)PageDirectoryEntry;
+        PageDirectoryPointerEntry->Uint64 = (UINT64)(UINTN)PageDirectoryEntry | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
         PageDirectoryPointerEntry->Bits.ReadWrite = 1;
         PageDirectoryPointerEntry->Bits.Present = 1;
 
@@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
             //
             // Fill in the Page Directory entries
             //
-            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
+            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
             PageDirectoryEntry->Bits.ReadWrite = 1;
             PageDirectoryEntry->Bits.Present = 1;
             PageDirectoryEntry->Bits.MustBe1 = 1;
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index 273cd7e..207384f 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -6,6 +6,8 @@
 # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
 # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
 # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
+# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
+#
 # This program and the accompanying materials are licensed and made available under
 # the terms and conditions of the BSD License that accompanies this distribution.
 # The full text of the license may be found at
@@ -1738,5 +1740,11 @@ [PcdsDynamic, PcdsDynamicEx]
   # @Prompt If there is any test key used by the platform.
   gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x00030003
 
+  ## This dynamic PCD holds the address mask for page table entries when memory encryption is
+  #  enabled on AMD processors supporting the Secure Encrypted Virtualization (SEV) feature.
+  #  This mask should be applied when creating 1:1 virtual to physical mapping tables.
+  #
+  gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrMask|0x0|UINT64|0x00030004
+
 [UserExtensions.TianoCore."ExtraFiles"]
   MdeModulePkgExtra.uni
-- 
1.9.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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Duran, Leo 7 years, 8 months ago
Please see replies below.
Thanks,
Leo

> -----Original Message-----
> From: Gao, Liming [mailto:liming.gao@intel.com]
> Sent: Wednesday, February 08, 2017 9:19 AM
> To: Duran, Leo <leo.duran@amd.com>; edk2-devel@ml01.01.org
> Cc: Laszlo Ersek <lersek@redhat.com>; Tian, Feng <feng.tian@intel.com>;
> Singh, Brijesh <brijesh.singh@amd.com>; Zeng, Star <star.zeng@intel.com>
> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
> 
> Leo:
>   MdeModulePkg CapsulePei and UefiCpuPkg S3Resume2 also create
> PageTable to run X64 code. Do they require this change?
> 
> Thanks
> Liming
[Duran, Leo] 
1) MedModelePkg/Universal/CapsulePei:
Does not seem applicable for MDE_XPU_X64 compile-time option, which is required for SEV.
- ModeSwitch() calls Thunk32To64(), which in turn may call Create4GPageTables()
- However, ModeSwitch() is called only under #ifdef MDE_CPU_IA32

2)  UefiCpuPkg/Universal/Acpi/S3Resume2Pei:
Agreed. Will incorporate changes in 'v2' of the patch.

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Leo Duran
> Sent: Wednesday, February 8, 2017 3:54 AM
> To: edk2-devel@ml01.01.org
> Cc: Laszlo Ersek <lersek@redhat.com>; Tian, Feng <feng.tian@intel.com>;
> Brijesh Singh <brijesh.singh@amd.com>; Zeng, Star <star.zeng@intel.com>;
> Leo Duran <leo.duran@amd.com>
> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
> 
> From: Brijesh Singh <brijesh.singh@amd.com>
> 
> This dynamic PCD holds the address mask for page table entries when
> memory encryption is enabled on AMD processors supporting the Secure
> Encrypted Virtualization (SEV) feature.
> 
> Cc: Feng Tian <feng.tian@intel.com>
> Cc: Star Zeng <star.zeng@intel.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Leo Duran <leo.duran@amd.com>
> ---
>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
> ------
>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>  3 files changed, 22 insertions(+), 9 deletions(-)
> 
> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> index 2bc41be..d62bd9b 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> @@ -6,6 +6,8 @@
>  #  needed to run the DXE Foundation.
>  #
>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>  #  This program and the accompanying materials  #  are licensed and made
> available under the terms and conditions of the BSD License  #  which
> accompanies this distribution.  The full text of the license may be found at
> @@ -111,7 +113,8 @@ [FeaturePcd]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
> CONSUMES
> 
>  [Pcd.IA32,Pcd.X64]
> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
> SOMETIMES_CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
> SOMETIMES_CONSUMES
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask    ## CONSUMES
> 
>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
> SOMETIMES_CONSUMES
> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> index 790f6ab..2c52389 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> @@ -16,6 +16,8 @@
>      3) IA-32 Intel(R) Architecture Software Developer's Manual Volume
> 3:System Programmer's Guide, Intel
> 
>  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> +
>  This program and the accompanying materials  are licensed and made
> available under the terms and conditions of the BSD License  which
> accompanies this distribution.  The full text of the license may be found at
> @@ -71,14 +73,14 @@ Split2MPageTo4K (
>    //
>    // Fill in 2M page entry.
>    //
> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
> IA32_PG_RW;
> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
> 
>    PhysicalAddress4K = PhysicalAddress;
>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
> SIZE_4KB) {
>      //
>      // Fill in the Page Table entries
>      //
> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>      PageTableEntry->Bits.ReadWrite = 1;
>      PageTableEntry->Bits.Present = 1;
>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase +
> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>    //
>    // Fill in 1G page entry.
>    //
> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
> IA32_PG_RW;
> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
> 
>    PhysicalAddress2M = PhysicalAddress;
>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512;
> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M
> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>        //
>        // Fill in the Page Directory entries
>        //
> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>        PageDirectoryEntry->Bits.ReadWrite = 1;
>        PageDirectoryEntry->Bits.Present = 1;
>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
> CreateIdentityMappingPageTables (
>      //
>      // Make a PML4 Entry
>      //
> -    PageMapLevel4Entry->Uint64 =
> (UINT64)(UINTN)PageDirectoryPointerEntry;
> +    PageMapLevel4Entry->Uint64 =
> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>      PageMapLevel4Entry->Bits.Present = 1;
> 
> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>            //
>            // Fill in the Page Directory entries
>            //
> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>            PageDirectory1GEntry->Bits.Present = 1;
>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 @@
> CreateIdentityMappingPageTables (
>          //
>          // Fill in a Page Directory Pointer Entries
>          //
> -        PageDirectoryPointerEntry->Uint64 =
> (UINT64)(UINTN)PageDirectoryEntry;
> +        PageDirectoryPointerEntry->Uint64 =
> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>          PageDirectoryPointerEntry->Bits.Present = 1;
> 
> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>              //
>              // Fill in the Page Directory entries
>              //
> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>              PageDirectoryEntry->Bits.ReadWrite = 1;
>              PageDirectoryEntry->Bits.Present = 1;
>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
> a/MdeModulePkg/MdeModulePkg.dec
> b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -6,6 +6,8 @@
>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>  #
> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>  # (C) Copyright 2016
> Hewlett Packard Enterprise Development LP<BR>
> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>  # This program and the accompanying materials are licensed and made
> available under  # the terms and conditions of the BSD License that
> accompanies this distribution.
>  # The full text of the license may be found at @@ -1738,5 +1740,11 @@
> [PcdsDynamic, PcdsDynamicEx]
>    # @Prompt If there is any test key used by the platform.
> 
> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
> 0030003
> 
> +  ## This dynamic PCD holds the address mask for page table entries
> + when memory encryption is  #  enabled on AMD processors supporting the
> Secure Encrypted Virtualization (SEV) feature.
> +  #  This mask should be applied when creating 1:1 virtual to physical
> mapping tables.
> +  #
> +
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask|0x0
> + |UINT64|0x00030004
> +
>  [UserExtensions.TianoCore."ExtraFiles"]
>    MdeModulePkgExtra.uni
> --
> 1.9.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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Yao, Jiewen 7 years, 8 months ago
Comments below:


From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Duran, Leo
Sent: Wednesday, February 8, 2017 9:12 AM
To: Gao, Liming <liming.gao@intel.com>; edk2-devel@ml01.01.org
Cc: Singh, Brijesh <brijesh.singh@amd.com>; Tian, Feng <feng.tian@intel.com>; Laszlo Ersek <lersek@redhat.com>; Zeng, Star <star.zeng@intel.com>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

Please see replies below.
Thanks,
Leo

> -----Original Message-----
> From: Gao, Liming [mailto:liming.gao@intel.com]
> Sent: Wednesday, February 08, 2017 9:19 AM
> To: Duran, Leo <leo.duran@amd.com<mailto:leo.duran@amd.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>;
> Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>
> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
> Leo:
>   MdeModulePkg CapsulePei and UefiCpuPkg S3Resume2 also create
> PageTable to run X64 code. Do they require this change?
>
> Thanks
> Liming
[Duran, Leo]
1) MedModelePkg/Universal/CapsulePei:
Does not seem applicable for MDE_XPU_X64 compile-time option, which is required for SEV.
- ModeSwitch() calls Thunk32To64(), which in turn may call Create4GPageTables()
- However, ModeSwitch() is called only under #ifdef MDE_CPU_IA32
[Jiewen] The IA32 capsule code creates X64 page tables, then switch to X64.
So the page table is for X64. Would you please double check if this PCD is needed?


2)  UefiCpuPkg/Universal/Acpi/S3Resume2Pei:
Agreed. Will incorporate changes in 'v2' of the patch.

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Leo Duran
> Sent: Wednesday, February 8, 2017 3:54 AM
> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>;
> Brijesh Singh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>;
> Leo Duran <leo.duran@amd.com<mailto:leo.duran@amd.com>>
> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
> From: Brijesh Singh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>
>
> This dynamic PCD holds the address mask for page table entries when
> memory encryption is enabled on AMD processors supporting the Secure
> Encrypted Virtualization (SEV) feature.
>
> Cc: Feng Tian <feng.tian@intel.com<mailto:feng.tian@intel.com>>
> Cc: Star Zeng <star.zeng@intel.com<mailto:star.zeng@intel.com>>
> Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Leo Duran <leo.duran@amd.com<mailto:leo.duran@amd.com>>
> ---
>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
> ------
>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>  3 files changed, 22 insertions(+), 9 deletions(-)
>
> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> index 2bc41be..d62bd9b 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> @@ -6,6 +6,8 @@
>  #  needed to run the DXE Foundation.
>  #
>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>  #  This program and the accompanying materials  #  are licensed and made
> available under the terms and conditions of the BSD License  #  which
> accompanies this distribution.  The full text of the license may be found at
> @@ -111,7 +113,8 @@ [FeaturePcd]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
> CONSUMES
>
>  [Pcd.IA32,Pcd.X64]
> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
> SOMETIMES_CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
> SOMETIMES_CONSUMES
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask    ## CONSUMES
>
>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
> SOMETIMES_CONSUMES
> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> index 790f6ab..2c52389 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> @@ -16,6 +16,8 @@
>      3) IA-32 Intel(R) Architecture Software Developer's Manual Volume
> 3:System Programmer's Guide, Intel
>
>  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> +
>  This program and the accompanying materials  are licensed and made
> available under the terms and conditions of the BSD License  which
> accompanies this distribution.  The full text of the license may be found at
> @@ -71,14 +73,14 @@ Split2MPageTo4K (
>    //
>    // Fill in 2M page entry.
>    //
> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
> IA32_PG_RW;
> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>
>    PhysicalAddress4K = PhysicalAddress;
>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
> SIZE_4KB) {
>      //
>      // Fill in the Page Table entries
>      //
> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>      PageTableEntry->Bits.ReadWrite = 1;
>      PageTableEntry->Bits.Present = 1;
>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase +
> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>    //
>    // Fill in 1G page entry.
>    //
> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
> IA32_PG_RW;
> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>
>    PhysicalAddress2M = PhysicalAddress;
>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512;
> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M
> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>        //
>        // Fill in the Page Directory entries
>        //
> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>        PageDirectoryEntry->Bits.ReadWrite = 1;
>        PageDirectoryEntry->Bits.Present = 1;
>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
> CreateIdentityMappingPageTables (
>      //
>      // Make a PML4 Entry
>      //
> -    PageMapLevel4Entry->Uint64 =
> (UINT64)(UINTN)PageDirectoryPointerEntry;
> +    PageMapLevel4Entry->Uint64 =
> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>      PageMapLevel4Entry->Bits.Present = 1;
>
> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>            //
>            // Fill in the Page Directory entries
>            //
> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>            PageDirectory1GEntry->Bits.Present = 1;
>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 @@
> CreateIdentityMappingPageTables (
>          //
>          // Fill in a Page Directory Pointer Entries
>          //
> -        PageDirectoryPointerEntry->Uint64 =
> (UINT64)(UINTN)PageDirectoryEntry;
> +        PageDirectoryPointerEntry->Uint64 =
> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>          PageDirectoryPointerEntry->Bits.Present = 1;
>
> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>              //
>              // Fill in the Page Directory entries
>              //
> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>              PageDirectoryEntry->Bits.ReadWrite = 1;
>              PageDirectoryEntry->Bits.Present = 1;
>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
> a/MdeModulePkg/MdeModulePkg.dec
> b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -6,6 +6,8 @@
>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>  #
> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>  # (C) Copyright 2016
> Hewlett Packard Enterprise Development LP<BR>
> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>  # This program and the accompanying materials are licensed and made
> available under  # the terms and conditions of the BSD License that
> accompanies this distribution.
>  # The full text of the license may be found at @@ -1738,5 +1740,11 @@
> [PcdsDynamic, PcdsDynamicEx]
>    # @Prompt If there is any test key used by the platform.
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
> 0030003
>
> +  ## This dynamic PCD holds the address mask for page table entries
> + when memory encryption is  #  enabled on AMD processors supporting the
> Secure Encrypted Virtualization (SEV) feature.
> +  #  This mask should be applied when creating 1:1 virtual to physical
> mapping tables.
> +  #
> +
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask|0x0
> + |UINT64|0x00030004
> +
>  [UserExtensions.TianoCore."ExtraFiles"]
>    MdeModulePkgExtra.uni
> --
> 1.9.1
>
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org<mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Duran, Leo 7 years, 8 months ago
[Jiewen] The IA32 capsule code creates X64 page tables, then switch to X64.
So the page table is for X64. Would you please double check if this PCD is needed?

Regarding: MedModelePkg/Universal/CapsulePei/UefiCapsule.c
Create4GPageTables() explicitly sets PhysicalAddressBits = 32;

So it seems like the address space is restricted to 4GB's even after switching to LongMode.
However, to your point, SEV just requires LongMode... so I'll make the change.

Leo.


From: Yao, Jiewen [mailto:jiewen.yao@intel.com]
Sent: Wednesday, February 08, 2017 11:30 AM
To: Duran, Leo <leo.duran@amd.com>; Gao, Liming <liming.gao@intel.com>; edk2-devel@ml01.01.org
Cc: Singh, Brijesh <brijesh.singh@amd.com>; Tian, Feng <feng.tian@intel.com>; Laszlo Ersek <lersek@redhat.com>; Zeng, Star <star.zeng@intel.com>; Yao, Jiewen <jiewen.yao@intel.com>
Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

Comments below:


From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Duran, Leo
Sent: Wednesday, February 8, 2017 9:12 AM
To: Gao, Liming <liming.gao@intel.com<mailto:liming.gao@intel.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
Cc: Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>; Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

Please see replies below.
Thanks,
Leo

> -----Original Message-----
> From: Gao, Liming [mailto:liming.gao@intel.com]
> Sent: Wednesday, February 08, 2017 9:19 AM
> To: Duran, Leo <leo.duran@amd.com<mailto:leo.duran@amd.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>;
> Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>
> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
> Leo:
>   MdeModulePkg CapsulePei and UefiCpuPkg S3Resume2 also create
> PageTable to run X64 code. Do they require this change?
>
> Thanks
> Liming
[Duran, Leo]
1) MedModelePkg/Universal/CapsulePei:
Does not seem applicable for MDE_XPU_X64 compile-time option, which is required for SEV.
- ModeSwitch() calls Thunk32To64(), which in turn may call Create4GPageTables()
- However, ModeSwitch() is called only under #ifdef MDE_CPU_IA32
[Jiewen] The IA32 capsule code creates X64 page tables, then switch to X64.
So the page table is for X64. Would you please double check if this PCD is needed?


2)  UefiCpuPkg/Universal/Acpi/S3Resume2Pei:
Agreed. Will incorporate changes in 'v2' of the patch.

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Leo Duran
> Sent: Wednesday, February 8, 2017 3:54 AM
> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
> Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>;
> Brijesh Singh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>;
> Leo Duran <leo.duran@amd.com<mailto:leo.duran@amd.com>>
> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
> From: Brijesh Singh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>
>
> This dynamic PCD holds the address mask for page table entries when
> memory encryption is enabled on AMD processors supporting the Secure
> Encrypted Virtualization (SEV) feature.
>
> Cc: Feng Tian <feng.tian@intel.com<mailto:feng.tian@intel.com>>
> Cc: Star Zeng <star.zeng@intel.com<mailto:star.zeng@intel.com>>
> Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Leo Duran <leo.duran@amd.com<mailto:leo.duran@amd.com>>
> ---
>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
> ------
>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>  3 files changed, 22 insertions(+), 9 deletions(-)
>
> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> index 2bc41be..d62bd9b 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> @@ -6,6 +6,8 @@
>  #  needed to run the DXE Foundation.
>  #
>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>  #  This program and the accompanying materials  #  are licensed and made
> available under the terms and conditions of the BSD License  #  which
> accompanies this distribution.  The full text of the license may be found at
> @@ -111,7 +113,8 @@ [FeaturePcd]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
> CONSUMES
>
>  [Pcd.IA32,Pcd.X64]
> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
> SOMETIMES_CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
> SOMETIMES_CONSUMES
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask    ## CONSUMES
>
>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
> SOMETIMES_CONSUMES
> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> index 790f6ab..2c52389 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> @@ -16,6 +16,8 @@
>      3) IA-32 Intel(R) Architecture Software Developer's Manual Volume
> 3:System Programmer's Guide, Intel
>
>  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> +
>  This program and the accompanying materials  are licensed and made
> available under the terms and conditions of the BSD License  which
> accompanies this distribution.  The full text of the license may be found at
> @@ -71,14 +73,14 @@ Split2MPageTo4K (
>    //
>    // Fill in 2M page entry.
>    //
> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
> IA32_PG_RW;
> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>
>    PhysicalAddress4K = PhysicalAddress;
>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
> SIZE_4KB) {
>      //
>      // Fill in the Page Table entries
>      //
> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>      PageTableEntry->Bits.ReadWrite = 1;
>      PageTableEntry->Bits.Present = 1;
>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase +
> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>    //
>    // Fill in 1G page entry.
>    //
> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
> IA32_PG_RW;
> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>
>    PhysicalAddress2M = PhysicalAddress;
>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512;
> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M
> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>        //
>        // Fill in the Page Directory entries
>        //
> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>        PageDirectoryEntry->Bits.ReadWrite = 1;
>        PageDirectoryEntry->Bits.Present = 1;
>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
> CreateIdentityMappingPageTables (
>      //
>      // Make a PML4 Entry
>      //
> -    PageMapLevel4Entry->Uint64 =
> (UINT64)(UINTN)PageDirectoryPointerEntry;
> +    PageMapLevel4Entry->Uint64 =
> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>      PageMapLevel4Entry->Bits.Present = 1;
>
> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>            //
>            // Fill in the Page Directory entries
>            //
> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>            PageDirectory1GEntry->Bits.Present = 1;
>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 @@
> CreateIdentityMappingPageTables (
>          //
>          // Fill in a Page Directory Pointer Entries
>          //
> -        PageDirectoryPointerEntry->Uint64 =
> (UINT64)(UINTN)PageDirectoryEntry;
> +        PageDirectoryPointerEntry->Uint64 =
> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>          PageDirectoryPointerEntry->Bits.Present = 1;
>
> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>              //
>              // Fill in the Page Directory entries
>              //
> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>              PageDirectoryEntry->Bits.ReadWrite = 1;
>              PageDirectoryEntry->Bits.Present = 1;
>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
> a/MdeModulePkg/MdeModulePkg.dec
> b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -6,6 +6,8 @@
>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>  #
> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>  # (C) Copyright 2016
> Hewlett Packard Enterprise Development LP<BR>
> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>  # This program and the accompanying materials are licensed and made
> available under  # the terms and conditions of the BSD License that
> accompanies this distribution.
>  # The full text of the license may be found at @@ -1738,5 +1740,11 @@
> [PcdsDynamic, PcdsDynamicEx]
>    # @Prompt If there is any test key used by the platform.
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
> 0030003
>
> +  ## This dynamic PCD holds the address mask for page table entries
> + when memory encryption is  #  enabled on AMD processors supporting the
> Secure Encrypted Virtualization (SEV) feature.
> +  #  This mask should be applied when creating 1:1 virtual to physical
> mapping tables.
> +  #
> +
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask|0x0
> + |UINT64|0x00030004
> +
>  [UserExtensions.TianoCore."ExtraFiles"]
>    MdeModulePkgExtra.uni
> --
> 1.9.1
>
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org<mailto: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
Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask
Posted by Yao, Jiewen 7 years, 8 months ago
Comments below:

From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Duran, Leo
Sent: Wednesday, February 8, 2017 10:31 AM
To: Yao, Jiewen <jiewen.yao@intel.com>; Gao, Liming <liming.gao@intel.com>; edk2-devel@ml01.01.org
Cc: Laszlo Ersek <lersek@redhat.com>; Tian, Feng <feng.tian@intel.com>; Singh, Brijesh <brijesh.singh@amd.com>; Zeng, Star <star.zeng@intel.com>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

[Jiewen] The IA32 capsule code creates X64 page tables, then switch to X64.
So the page table is for X64. Would you please double check if this PCD is needed?

Regarding: MedModelePkg/Universal/CapsulePei/UefiCapsule.c
Create4GPageTables() explicitly sets PhysicalAddressBits = 32;

So it seems like the address space is restricted to 4GB's even after switching to LongMode.
[Jiewen] We use page fault to handler above 4GiB access. :)

However, to your point, SEV just requires LongMode... so I'll make the change.
[Jiewen] Thank you.

Leo.


From: Yao, Jiewen [mailto:jiewen.yao@intel.com]
Sent: Wednesday, February 08, 2017 11:30 AM
To: Duran, Leo <leo.duran@amd.com<mailto:leo.duran@amd.com>>; Gao, Liming <liming.gao@intel.com<mailto:liming.gao@intel.com>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org>
Cc: Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com>>; Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com>>; Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com>>; Yao, Jiewen <jiewen.yao@intel.com<mailto:jiewen.yao@intel.com>>
Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

Comments below:


From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Duran, Leo
Sent: Wednesday, February 8, 2017 9:12 AM
To: Gao, Liming <liming.gao@intel.com<mailto:liming.gao@intel.com<mailto:liming.gao@intel.com%3cmailto:liming.gao@intel.com>>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
Cc: Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com<mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>; Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com<mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com<mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>
Subject: Re: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD PcdPteMemoryEncryptionAddressOrMask

Please see replies below.
Thanks,
Leo

> -----Original Message-----
> From: Gao, Liming [mailto:liming.gao@intel.com]
> Sent: Wednesday, February 08, 2017 9:19 AM
> To: Duran, Leo <leo.duran@amd.com<mailto:leo.duran@amd.com<mailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com>>>; edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
> Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com<mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com<mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>;
> Singh, Brijesh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com<mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>
> Subject: RE: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
> Leo:
>   MdeModulePkg CapsulePei and UefiCpuPkg S3Resume2 also create
> PageTable to run X64 code. Do they require this change?
>
> Thanks
> Liming
[Duran, Leo]
1) MedModelePkg/Universal/CapsulePei:
Does not seem applicable for MDE_XPU_X64 compile-time option, which is required for SEV.
- ModeSwitch() calls Thunk32To64(), which in turn may call Create4GPageTables()
- However, ModeSwitch() is called only under #ifdef MDE_CPU_IA32
[Jiewen] The IA32 capsule code creates X64 page tables, then switch to X64.
So the page table is for X64. Would you please double check if this PCD is needed?


2)  UefiCpuPkg/Universal/Acpi/S3Resume2Pei:
Agreed. Will incorporate changes in 'v2' of the patch.

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Leo Duran
> Sent: Wednesday, February 8, 2017 3:54 AM
> To: edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org<mailto:edk2-devel@ml01.01.org%3cmailto:edk2-devel@ml01.01.org>>
> Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com<mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>; Tian, Feng <feng.tian@intel.com<mailto:feng.tian@intel.com<mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>;
> Brijesh Singh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>; Zeng, Star <star.zeng@intel.com<mailto:star.zeng@intel.com<mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>;
> Leo Duran <leo.duran@amd.com<mailto:leo.duran@amd.com<mailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com>>>
> Subject: [edk2] [PATCH] MdeModulePkg: Add dynamic PCD
> PcdPteMemoryEncryptionAddressOrMask
>
> From: Brijesh Singh <brijesh.singh@amd.com<mailto:brijesh.singh@amd.com<mailto:brijesh.singh@amd.com%3cmailto:brijesh.singh@amd.com>>>
>
> This dynamic PCD holds the address mask for page table entries when
> memory encryption is enabled on AMD processors supporting the Secure
> Encrypted Virtualization (SEV) feature.
>
> Cc: Feng Tian <feng.tian@intel.com<mailto:feng.tian@intel.com<mailto:feng.tian@intel.com%3cmailto:feng.tian@intel.com>>>
> Cc: Star Zeng <star.zeng@intel.com<mailto:star.zeng@intel.com<mailto:star.zeng@intel.com%3cmailto:star.zeng@intel.com>>>
> Cc: Laszlo Ersek <lersek@redhat.com<mailto:lersek@redhat.com<mailto:lersek@redhat.com%3cmailto:lersek@redhat.com>>>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Leo Duran <leo.duran@amd.com<mailto:leo.duran@amd.com<mailto:leo.duran@amd.com%3cmailto:leo.duran@amd.com>>>
> ---
>  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf          |  5 ++++-
>  MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c | 18 ++++++++++--
> ------
>  MdeModulePkg/MdeModulePkg.dec                    |  8 ++++++++
>  3 files changed, 22 insertions(+), 9 deletions(-)
>
> diff --git a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> index 2bc41be..d62bd9b 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> +++ b/MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
> @@ -6,6 +6,8 @@
>  #  needed to run the DXE Foundation.
>  #
>  #  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>  #  This program and the accompanying materials  #  are licensed and made
> available under the terms and conditions of the BSD License  #  which
> accompanies this distribution.  The full text of the license may be found at
> @@ -111,7 +113,8 @@ [FeaturePcd]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSupportUefiDecompress ##
> CONSUMES
>
>  [Pcd.IA32,Pcd.X64]
> -  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable              ##
> SOMETIMES_CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable                      ##
> SOMETIMES_CONSUMES
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask    ## CONSUMES
>
>  [Pcd.IA32,Pcd.X64,Pcd.ARM,Pcd.AARCH64]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack               ##
> SOMETIMES_CONSUMES
> diff --git a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> index 790f6ab..2c52389 100644
> --- a/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> +++ b/MdeModulePkg/Core/DxeIplPeim/X64/VirtualMemory.c
> @@ -16,6 +16,8 @@
>      3) IA-32 Intel(R) Architecture Software Developer's Manual Volume
> 3:System Programmer's Guide, Intel
>
>  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> +
>  This program and the accompanying materials  are licensed and made
> available under the terms and conditions of the BSD License  which
> accompanies this distribution.  The full text of the license may be found at
> @@ -71,14 +73,14 @@ Split2MPageTo4K (
>    //
>    // Fill in 2M page entry.
>    //
> -  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | IA32_PG_P |
> IA32_PG_RW;
> +  *PageEntry2M = (UINT64) (UINTN) PageTableEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>
>    PhysicalAddress4K = PhysicalAddress;
>    for (IndexOfPageTableEntries = 0; IndexOfPageTableEntries < 512;
> IndexOfPageTableEntries++, PageTableEntry++, PhysicalAddress4K +=
> SIZE_4KB) {
>      //
>      // Fill in the Page Table entries
>      //
> -    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K;
> +    PageTableEntry->Uint64 = (UINT64) PhysicalAddress4K | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>      PageTableEntry->Bits.ReadWrite = 1;
>      PageTableEntry->Bits.Present = 1;
>      if ((PhysicalAddress4K >= StackBase) && (PhysicalAddress4K < StackBase +
> StackSize)) { @@ -116,7 +118,7 @@ Split1GPageTo2M (
>    //
>    // Fill in 1G page entry.
>    //
> -  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | IA32_PG_P |
> IA32_PG_RW;
> +  *PageEntry1G = (UINT64) (UINTN) PageDirectoryEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask) | IA32_PG_P | IA32_PG_RW;
>
>    PhysicalAddress2M = PhysicalAddress;
>    for (IndexOfPageDirectoryEntries = 0; IndexOfPageDirectoryEntries < 512;
> IndexOfPageDirectoryEntries++, PageDirectoryEntry++, PhysicalAddress2M
> += SIZE_2MB) { @@ -129,7 +131,7 @@ Split1GPageTo2M (
>        //
>        // Fill in the Page Directory entries
>        //
> -      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M;
> +      PageDirectoryEntry->Uint64 = (UINT64) PhysicalAddress2M |
> + PcdGet64 (PcdPteMemoryEncryptionAddressOrMask);
>        PageDirectoryEntry->Bits.ReadWrite = 1;
>        PageDirectoryEntry->Bits.Present = 1;
>        PageDirectoryEntry->Bits.MustBe1 = 1; @@ -248,7 +250,7 @@
> CreateIdentityMappingPageTables (
>      //
>      // Make a PML4 Entry
>      //
> -    PageMapLevel4Entry->Uint64 =
> (UINT64)(UINTN)PageDirectoryPointerEntry;
> +    PageMapLevel4Entry->Uint64 =
> + (UINT64)(UINTN)PageDirectoryPointerEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>      PageMapLevel4Entry->Bits.ReadWrite = 1;
>      PageMapLevel4Entry->Bits.Present = 1;
>
> @@ -262,7 +264,7 @@ CreateIdentityMappingPageTables (
>            //
>            // Fill in the Page Directory entries
>            //
> -          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress;
> +          PageDirectory1GEntry->Uint64 = (UINT64)PageAddress | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>            PageDirectory1GEntry->Bits.ReadWrite = 1;
>            PageDirectory1GEntry->Bits.Present = 1;
>            PageDirectory1GEntry->Bits.MustBe1 = 1; @@ -280,7 +282,7 @@
> CreateIdentityMappingPageTables (
>          //
>          // Fill in a Page Directory Pointer Entries
>          //
> -        PageDirectoryPointerEntry->Uint64 =
> (UINT64)(UINTN)PageDirectoryEntry;
> +        PageDirectoryPointerEntry->Uint64 =
> + (UINT64)(UINTN)PageDirectoryEntry | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>          PageDirectoryPointerEntry->Bits.ReadWrite = 1;
>          PageDirectoryPointerEntry->Bits.Present = 1;
>
> @@ -294,7 +296,7 @@ CreateIdentityMappingPageTables (
>              //
>              // Fill in the Page Directory entries
>              //
> -            PageDirectoryEntry->Uint64 = (UINT64)PageAddress;
> +            PageDirectoryEntry->Uint64 = (UINT64)PageAddress | PcdGet64
> + (PcdPteMemoryEncryptionAddressOrMask);
>              PageDirectoryEntry->Bits.ReadWrite = 1;
>              PageDirectoryEntry->Bits.Present = 1;
>              PageDirectoryEntry->Bits.MustBe1 = 1; diff --git
> a/MdeModulePkg/MdeModulePkg.dec
> b/MdeModulePkg/MdeModulePkg.dec index 273cd7e..207384f 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -6,6 +6,8 @@
>  # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>  #
> Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>  # (C) Copyright 2016
> Hewlett Packard Enterprise Development LP<BR>
> +# Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR> #
>  # This program and the accompanying materials are licensed and made
> available under  # the terms and conditions of the BSD License that
> accompanies this distribution.
>  # The full text of the license may be found at @@ -1738,5 +1740,11 @@
> [PcdsDynamic, PcdsDynamicEx]
>    # @Prompt If there is any test key used by the platform.
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdTestKeyUsed|FALSE|BOOLEAN|0x0
> 0030003
>
> +  ## This dynamic PCD holds the address mask for page table entries
> + when memory encryption is  #  enabled on AMD processors supporting the
> Secure Encrypted Virtualization (SEV) feature.
> +  #  This mask should be applied when creating 1:1 virtual to physical
> mapping tables.
> +  #
> +
> +
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask|0x0
> + |UINT64|0x00030004
> +
>  [UserExtensions.TianoCore."ExtraFiles"]
>    MdeModulePkgExtra.uni
> --
> 1.9.1
>
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>>
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org%3cmailto:edk2-devel@lists.01.org>>
https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org<mailto: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