]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/SecMain: validate the memory used for decompressing Fv
authorBrijesh Singh <brijesh.singh@amd.com>
Thu, 9 Dec 2021 03:27:46 +0000 (11:27 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 9 Dec 2021 06:28:10 +0000 (06:28 +0000)
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3275

The VMM launch sequence should have pre-validated all the data pages used
in the Reset vector. The range does not cover the data pages used during
the SEC phase (mainly PEI and DXE firmware volume decompression memory).

When SEV-SNP is active, the memory must be pre-validated before the access.
Add support to pre-validate the memory range from SnpSecPreValidatedStart
to SnpSecPreValidatedEnd. This should be sufficent to enter into the PEI
phase.

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>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
OvmfPkg/FvmainCompactScratchEnd.fdf.inc
OvmfPkg/Library/BaseMemEncryptSevLib/PeiMemEncryptSevLib.inf
OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiSnpSystemRamValidate.c
OvmfPkg/OvmfPkg.dec
OvmfPkg/Sec/AmdSev.c
OvmfPkg/Sec/AmdSev.h
OvmfPkg/Sec/SecMain.c
OvmfPkg/Sec/SecMain.inf

index 46f52583297c7f86de015b155cc82a1c2c097d2f..d8d45fc9aa6d133f148a189474050ab357b91473 100644 (file)
@@ -63,3 +63,8 @@ DEFINE DECOMP_SCRATCH_BASE_MASK      = 0xFFF00000
 DEFINE DECOMP_SCRATCH_BASE           = (($(DECOMP_SCRATCH_BASE_UNALIGNED) + $(DECOMP_SCRATCH_BASE_ALIGNMENT)) & $(DECOMP_SCRATCH_BASE_MASK))\r
 \r
 SET gUefiOvmfPkgTokenSpaceGuid.PcdOvmfDecompressionScratchEnd = $(DECOMP_SCRATCH_BASE) + $(DECOMP_SCRATCH_SIZE)\r
+\r
+#\r
+# The range of pages that should be pre-validated during the SEC phase when SEV-SNP is active in the guest VM.\r
+SET gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecValidatedStart = $(MEMFD_BASE_ADDRESS) + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase\r
+SET gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecValidatedEnd = $(DECOMP_SCRATCH_BASE) + $(DECOMP_SCRATCH_SIZE)\r
index 49d5bd1beff15e27ea982b85bb870b02a23621ff..50c83859d7e71ceebcba9666f32f6804f8b42eed 100644 (file)
@@ -60,3 +60,5 @@
   gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecValidatedEnd\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecValidatedStart\r
index 0e3eba3c5121e02149edc04edf4f903dcf560e3d..497016544482b95ce4db54669e8acc0b6dce3213 100644 (file)
@@ -29,6 +29,11 @@ STATIC SNP_PRE_VALIDATED_RANGE  mPreValidatedRange[] = {
     FixedPcdGet32 (PcdOvmfSecPageTablesBase),\r
     FixedPcdGet32 (PcdOvmfPeiMemFvBase),\r
   },\r
+  // The below range is pre-validated by the Sec/SecMain.c\r
+  {\r
+    FixedPcdGet32 (PcdOvmfSecValidatedStart),\r
+    FixedPcdGet32 (PcdOvmfSecValidatedEnd)\r
+  },\r
 };\r
 \r
 STATIC\r
index bc14cf2ed4030ddb45d30cd9a3b917845aafcf60..c22b846cd66390a221165bf5ad64746588c22cba 100644 (file)
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCpuidBase|0|UINT32|0x60\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfCpuidSize|0|UINT32|0x61\r
 \r
+  ## The range of memory that is validated by the SEC phase.\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecValidatedStart|0|UINT32|0x62\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecValidatedEnd|0|UINT32|0x63\r
+\r
 [PcdsDynamic, PcdsDynamicEx]\r
   gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|2\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashVariablesEnable|FALSE|BOOLEAN|0x10\r
index aa655fd9cbaef7dc196130623a7f51765f9d38a0..499d0c27d8fa03b808c3e58ede1670806e2a5171 100644 (file)
@@ -55,7 +55,6 @@ SevEsProtocolFailure (
   @retval FALSE  SEV-SNP is not enabled\r
 \r
 **/\r
-STATIC\r
 BOOLEAN\r
 SevSnpIsEnabled (\r
   VOID\r
@@ -281,3 +280,24 @@ SevEsIsEnabled (
 \r
   return (SevEsWorkArea->SevEsEnabled != 0);\r
 }\r
+\r
+/**\r
+ Validate System RAM used for decompressing the PEI and DXE firmware volumes\r
+ when SEV-SNP is active. The PCDs SecValidatedStart and SecValidatedEnd are\r
+ set in OvmfPkg/FvmainCompactScratchEnd.fdf.inc.\r
+\r
+**/\r
+VOID\r
+SecValidateSystemRam (\r
+  VOID\r
+  )\r
+{\r
+  PHYSICAL_ADDRESS  Start, End;\r
+\r
+  if (IsSevGuest () && SevSnpIsEnabled ()) {\r
+    Start = (EFI_PHYSICAL_ADDRESS)(UINTN)PcdGet32 (PcdOvmfSecValidatedStart);\r
+    End   = (EFI_PHYSICAL_ADDRESS)(UINTN)PcdGet32 (PcdOvmfSecValidatedEnd);\r
+\r
+    MemEncryptSevSnpPreValidateSystemRam (Start, EFI_SIZE_TO_PAGES ((UINTN)(End - Start)));\r
+  }\r
+}\r
index c0b1ca96183df6c9024456a6fa93f2821c980458..dffd2ceb9656e3d6a3a5e35dbc23f3da440171f3 100644 (file)
@@ -68,4 +68,27 @@ SevEsIsEnabled (
   VOID\r
   );\r
 \r
+/**\r
+ Validate System RAM used for decompressing the PEI and DXE firmware volumes\r
+ when SEV-SNP is active. The PCDs SecValidatedStart and SecValidatedEnd are\r
+ set in OvmfPkg/FvmainCompactScratchEnd.fdf.inc.\r
+\r
+**/\r
+VOID\r
+SecValidateSystemRam (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Determine if SEV-SNP is active.\r
+\r
+  @retval TRUE   SEV-SNP is enabled\r
+  @retval FALSE  SEV-SNP is not enabled\r
+\r
+**/\r
+BOOLEAN\r
+SevSnpIsEnabled (\r
+  VOID\r
+  );\r
+\r
 #endif\r
index 58e3b923b40e08352e1c0c02396f81c5c0108c26..2c5561661ef34fa178b9d8db91bf802bb8932388 100644 (file)
@@ -860,6 +860,11 @@ SecCoreStartupWithStack (
   SecCoreData.BootFirmwareVolumeBase = BootFv;\r
   SecCoreData.BootFirmwareVolumeSize = (UINTN)BootFv->FvLength;\r
 \r
+  //\r
+  // Validate the System RAM used in the SEC Phase\r
+  //\r
+  SecValidateSystemRam ();\r
+\r
   //\r
   // Make sure the 8259 is masked before initializing the Debug Agent and the debug timer is enabled\r
   //\r
index 41dcdba1209ada89a58aa1de9b7b04b931d4fa55..95cf0025e100c34961339ce5cd37431ec4c5f9a7 100644 (file)
@@ -52,6 +52,7 @@
   PeCoffExtraActionLib\r
   ExtractGuidedSectionLib\r
   LocalApicLib\r
+  MemEncryptSevLib\r
   CpuExceptionHandlerLib\r
 \r
 [Ppis]\r
@@ -74,6 +75,8 @@
   gEfiMdeModulePkgTokenSpaceGuid.PcdInitValueInTempStack\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfConfidentialComputingWorkAreaHeader\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecValidatedStart\r
+  gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecValidatedEnd\r
 \r
 [FeaturePcd]\r
   gUefiOvmfPkgTokenSpaceGuid.PcdSmmSmramRequire\r