public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Brijesh Singh" <brijesh.singh@amd.com>
To: <devel@edk2.groups.io>
Cc: James Bottomley <jejb@linux.ibm.com>, Min Xu <min.m.xu@intel.com>,
	"Jiewen Yao" <jiewen.yao@intel.com>,
	Tom Lendacky <thomas.lendacky@amd.com>,
	"Jordan Justen" <jordan.l.justen@intel.com>,
	Ard Biesheuvel <ardb+tianocore@kernel.org>,
	Erdem Aktas <erdemaktas@google.com>,
	"Michael Roth" <Michael.Roth@amd.com>,
	Gerd Hoffmann <kraxel@redhat.com>,
	Brijesh Singh <brijesh.singh@amd.com>,
	Michael Roth <michael.roth@amd.com>,
	Jiewen Yao <Jiewen.yao@intel.com>
Subject: [PATCH v9 19/32] OvmfPkg/PlatformPei: validate the system RAM when SNP is active
Date: Wed, 13 Oct 2021 11:57:00 -0500	[thread overview]
Message-ID: <20211013165713.727815-20-brijesh.singh@amd.com> (raw)
In-Reply-To: <20211013165713.727815-1-brijesh.singh@amd.com>

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3275

When SEV-SNP is active, a memory region mapped encrypted in the page
table must be validated before access. There are two approaches that
can be taken to validate the system RAM detected during the PEI phase:

1) Validate on-demand
OR
2) Validate before access

On-demand
=========
If memory is not validated before access, it will cause a #VC
exception with the page-not-validated error code. The VC exception
handler can perform the validation steps.

The pages that have been validated will need to be tracked to avoid
the double validation scenarios. The range of memory that has not
been validated will need to be communicated to the OS through the
recently introduced unaccepted memory type
https://github.com/microsoft/mu_basecore/pull/66, so that OS can
validate those ranges before using them.

Validate before access
======================
Since the PEI phase detects all the available system RAM, use the
MemEncryptSevSnpValidateSystemRam() function to pre-validate the
system RAM in the PEI phase.

For now, choose option 2 due to the dependency and the complexity
of the on-demand validation.

Cc: Michael Roth <michael.roth@amd.com>
Cc: James Bottomley <jejb@linux.ibm.com>
Cc: Min Xu <min.m.xu@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Erdem Aktas <erdemaktas@google.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Jiewen Yao <Jiewen.yao@intel.com>
Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
---
 OvmfPkg/PlatformPei/AmdSev.c | 42 ++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/OvmfPkg/PlatformPei/AmdSev.c b/OvmfPkg/PlatformPei/AmdSev.c
index de876fdb478e..391e7bbb7dbd 100644
--- a/OvmfPkg/PlatformPei/AmdSev.c
+++ b/OvmfPkg/PlatformPei/AmdSev.c
@@ -23,6 +23,40 @@
 
 #include "Platform.h"
 
+/**
+  Initialize SEV-SNP support if running as an SEV-SNP guest.
+
+**/
+STATIC
+VOID
+AmdSevSnpInitialize (
+  VOID
+  )
+{
+  EFI_PEI_HOB_POINTERS          Hob;
+  EFI_HOB_RESOURCE_DESCRIPTOR   *ResourceHob;
+
+  if (!MemEncryptSevSnpIsEnabled ()) {
+    return;
+  }
+
+  //
+  // Iterate through the system RAM and validate it.
+  //
+  for (Hob.Raw = GetHobList (); !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
+    if (Hob.Raw != NULL && GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
+      ResourceHob = Hob.ResourceDescriptor;
+
+      if (ResourceHob->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {
+        MemEncryptSevSnpPreValidateSystemRam (
+          ResourceHob->PhysicalStart,
+          EFI_SIZE_TO_PAGES ((UINTN) ResourceHob->ResourceLength)
+          );
+      }
+    }
+  }
+}
+
 /**
   Handle an SEV-SNP/GHCB protocol check failure.
 
@@ -240,6 +274,14 @@ AmdSevInitialize (
     return;
   }
 
+  //
+  // Check and perform SEV-SNP initialization if required. This need to be
+  // done before the GHCB page is made shared in the AmdSevEsInitialize(). This
+  // is because the system RAM must be validated before it is made shared.
+  // The AmdSevSnpInitialize() validates the system RAM.
+  //
+  AmdSevSnpInitialize ();
+
   //
   // Set Memory Encryption Mask PCD
   //
-- 
2.25.1


  parent reply	other threads:[~2021-10-13 16:58 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-13 16:56 [PATCH v9 00/32] Add AMD Secure Nested Paging (SEV-SNP) support Brijesh Singh
2021-10-13 16:56 ` [PATCH v9 01/32] OvmfPkg/SecMain: move SEV specific routines in AmdSev.c Brijesh Singh
2021-10-14  6:59   ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 02/32] UefiCpuPkg/MpInitLib: " Brijesh Singh
2021-10-14  7:00   ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 03/32] OvmfPkg/ResetVector: move clearing GHCB in SecMain Brijesh Singh
2021-10-14  7:02   ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 04/32] OvmfPkg/ResetVector: introduce SEV metadata descriptor for VMM use Brijesh Singh
2021-10-14  7:08   ` Gerd Hoffmann
2021-10-14 19:51     ` Brijesh Singh
2021-10-15  5:08       ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 05/32] OvmfPkg: reserve SNP secrets page Brijesh Singh
2021-10-14  7:09   ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 06/32] OvmfPkg: reserve CPUID page Brijesh Singh
2021-10-14  7:10   ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 07/32] OvmfPkg/ResetVector: pre-validate the data pages used in SEC phase Brijesh Singh
2021-10-14  7:13   ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 08/32] OvmfPkg/ResetVector: use SEV-SNP-validated CPUID values Brijesh Singh
2021-10-14  7:15   ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 09/32] OvmfPkg/MemEncryptSevLib: add MemEncryptSevSnpEnabled() Brijesh Singh
2021-10-14  7:42   ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 10/32] OvmfPkg/SecMain: register GHCB gpa for the SEV-SNP guest Brijesh Singh
2021-10-14  7:44   ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 11/32] OvmfPkg/VmgExitLib: use SEV-SNP-validated CPUID values Brijesh Singh
2021-10-14  7:47   ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 12/32] OvmfPkg/PlatformPei: register GHCB gpa for the SEV-SNP guest Brijesh Singh
2021-10-14  7:48   ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 13/32] OvmfPkg/AmdSevDxe: do not use extended PCI config space Brijesh Singh
2021-10-14  7:50   ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 14/32] OvmfPkg/MemEncryptSevLib: add support to validate system RAM Brijesh Singh
2021-10-14  8:02   ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 15/32] OvmfPkg/MemEncryptSevLib: add function to check the VMPL0 Brijesh Singh
2021-10-14  8:03   ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 16/32] OvmfPkg/BaseMemEncryptSevLib: skip the pre-validated system RAM Brijesh Singh
2021-10-14  8:19   ` Gerd Hoffmann
2021-10-13 16:56 ` [PATCH v9 17/32] OvmfPkg/MemEncryptSevLib: add support to validate > 4GB memory in PEI phase Brijesh Singh
2021-10-14  8:31   ` Gerd Hoffmann
2021-10-14 19:59     ` Brijesh Singh
2021-10-13 16:56 ` [PATCH v9 18/32] OvmfPkg/SecMain: validate the memory used for decompressing Fv Brijesh Singh
2021-10-14  8:33   ` Gerd Hoffmann
2021-10-13 16:57 ` Brijesh Singh [this message]
2021-10-14  8:34   ` [PATCH v9 19/32] OvmfPkg/PlatformPei: validate the system RAM when SNP is active Gerd Hoffmann
2021-10-13 16:57 ` [PATCH v9 20/32] UefiCpuPkg: Define ConfidentialComputingGuestAttr Brijesh Singh
2021-10-14  8:38   ` Gerd Hoffmann
2021-10-14 20:11     ` Brijesh Singh
2021-10-13 16:57 ` [PATCH v9 21/32] OvmfPkg/PlatformPei: set PcdConfidentialComputingAttr when SEV is active Brijesh Singh
2021-10-14  8:39   ` Gerd Hoffmann
2021-10-13 16:57 ` [PATCH v9 22/32] UefiCpuPkg/MpInitLib: use PcdConfidentialComputingAttr to check SEV status Brijesh Singh
2021-10-14  8:41   ` Gerd Hoffmann
2021-10-14 21:58     ` [edk2-devel] " Brijesh Singh
2021-10-13 16:57 ` [PATCH v9 23/32] UefiCpuPkg: add PcdGhcbHypervisorFeatures Brijesh Singh
2021-10-14  8:42   ` Gerd Hoffmann
2021-10-13 16:57 ` [PATCH v9 24/32] OvmfPkg/PlatformPei: set the Hypervisor Features PCD Brijesh Singh
2021-10-14  8:43   ` Gerd Hoffmann
2021-10-13 16:57 ` [PATCH v9 25/32] MdePkg/GHCB: increase the GHCB protocol max version Brijesh Singh
2021-10-14  8:43   ` Gerd Hoffmann
2021-10-13 16:57 ` [PATCH v9 26/32] UefiCpuPkg/MpLib: add support to register GHCB GPA when SEV-SNP is enabled Brijesh Singh
2021-10-14  8:44   ` Gerd Hoffmann
2021-10-13 16:57 ` [PATCH v9 27/32] UefiCpuPkg/MpInitLib: use BSP to do extended topology check Brijesh Singh
2021-10-14  8:48   ` Gerd Hoffmann
2021-10-13 16:57 ` [PATCH v9 28/32] OvmfPkg/MemEncryptSevLib: change the page state in the RMP table Brijesh Singh
2021-10-14  8:52   ` Gerd Hoffmann
2021-10-13 16:57 ` [PATCH v9 29/32] OvmfPkg/MemEncryptSevLib: skip page state change for Mmio address Brijesh Singh
2021-10-14  8:53   ` Gerd Hoffmann
2021-10-13 16:57 ` [PATCH v9 30/32] OvmfPkg/PlatformPei: mark cpuid and secrets memory reserved in EFI map Brijesh Singh
2021-10-14  8:58   ` Gerd Hoffmann
2021-10-14 22:11     ` Brijesh Singh
2021-10-15  5:26       ` Gerd Hoffmann
2021-10-15 15:46         ` Brijesh Singh
2021-10-18  6:01           ` Gerd Hoffmann
2021-10-19 14:36             ` Brijesh Singh
2021-10-20  4:46               ` Gerd Hoffmann
2021-10-13 16:57 ` [PATCH v9 31/32] OvmfPkg/AmdSev: expose the SNP reserved pages through configuration table Brijesh Singh
2021-10-14  8:59   ` Gerd Hoffmann
2021-10-13 16:57 ` [PATCH v9 32/32] UefiCpuPkg/MpInitLib: Use SEV-SNP AP Creation NAE event to launch APs Brijesh Singh
2021-10-14  9:02   ` Gerd Hoffmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211013165713.727815-20-brijesh.singh@amd.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox