From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) by mx.groups.io with SMTP id smtpd.web10.85298.1674764846236540136 for ; Thu, 26 Jan 2023 12:27:26 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@google.com header.s=20210112 header.b=qSsb7WjA; spf=pass (domain: flex--lisik.bounces.google.com, ip: 209.85.216.73, mailfrom: 3lelsywukbwilisikgoogle.comdeveledkc.groups.io@flex--lisik.bounces.google.com) Received: by mail-pj1-f73.google.com with SMTP id a20-20020a17090ad81400b0022c3185ebbeso855038pjv.3 for ; Thu, 26 Jan 2023 12:27:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=2kNIWeRFr7NcqvzHn+M3UxpSIXyRuPRilq5p2Dv0hPQ=; b=qSsb7WjAaxOkXL5WbXSs4C8A1TvY2K4dgcN4hGgZ1U1i+mQzkPU38a1vXIWjtjJ52K XyFOT3smPJsFjDOwnlZd2m+g3dgv4bRRifTxEKV6qnY6J/CVyy2zpbaoeZdG8XnHF2q/ /JVRAB7q1w29fKjSH/676HGDaTZmjQerGtFSPpb13pNGMYejzQUs5zAddgNZHM3SpE8z ePuExl1KbXov332wxQhjIQJToHYWvC5yOwOzqj44p+XhpCrURwXfrzqkaFqoIWlcxCuY lpFpakCVCjTTTUu4BmLeA9+AXhuQ+6KScHF2XP++4KOPBWHPIe+UX+cUyGCiRkrQzYiM L2Yw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=2kNIWeRFr7NcqvzHn+M3UxpSIXyRuPRilq5p2Dv0hPQ=; b=cxqT0nFGxPFnw9idqzRwCVy7eJDezHyy5hcqySKA4yGuqEQOEJgsQpyZpjlTYXSrKM aVR5urMeKcTajQj+5ok2kd61BiKbsRKzbHpML8QA4Ur4t9/JZplU7iovRxeQsuwfFe0S 0Qhy5jy9c4tlJz5M9B5yYpjzVn1ugHqHl5Jo8XT5CuoSE1XpMbRkl99Zh0axYbt8D1Ku XR7TRt/EMv6Ebnmgv8+/bb2SivJ0J67P8Nu0+IjP2ZGxQcYWUJVwZL28Mczpo67ujHm+ 7o2M5ZBYqGZP3HjCoBoFmq1upaQ7HOLm+kd91anP8WUUr7PvLgUpZlG7hnYDO5ZobCqQ mcvw== X-Gm-Message-State: AO0yUKUBIacPCcG2Vfohz5OEHQrqyO/r3neaXHrS8GIcHDA5YuVjcv4a Xtj6D0oFgxOn7Cu/xX/n9wX1/+qXxkDyGJjhT454Bgx+L+IKJMMhNiLBHArMHKGYsUKeLvrmyHH tlz6Dtz6cbd/RBbk0+qKHKEiMuyEC7FuBIl0vkI9rMhXXLBfPP6364fVU X-Google-Smtp-Source: AK7set+xkZ4PmXWQsnn0XohcGAKtb/ZRr7v6v/6VM1foq43Phwi6mNxcUMwJmHpFr2A+MmduC62e6jnAHw== X-Received: from lisik.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:6647]) (user=lisik job=sendgmr) by 2002:a17:903:41cd:b0:196:237f:164d with SMTP id u13-20020a17090341cd00b00196237f164dmr1117820ple.14.1674764845282; Thu, 26 Jan 2023 12:27:25 -0800 (PST) Date: Thu, 26 Jan 2023 20:26:40 +0000 Mime-Version: 1.0 X-Mailer: git-send-email 2.39.1.456.gfc5497dd1b-goog Message-ID: Subject: [PATCH v2] OvmfPkg: Create additional PML1 entries for large SEV-SNP VMs From: "Mikolaj Lisik" To: devel@edk2.groups.io Cc: pedro.falcato@gmail.com, erdemaktas@google.com, jejb@linux.ibm.com, jiewen.yao@intel.com, min.m.xu@intel.com, thomas.lendacky@amd.com, michael.roth@amd.com, Mikolaj Lisik Content-Type: text/plain; charset="UTF-8" Edk2 was failing, rather than creating more PML4 entries, when they weren't present in the initial memory acceptance flow. Because of that VMs with more than 512G memory were crashing. This code fixes that. This change affects only SEV-SNP VMs. The code was tested by successfully booting a 512G SEV-SNP VM. Signed-off-by: Mikolaj Lisik --- .../X64/PeiDxeVirtualMemory.c | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c index b9c0a5b25a..75c2c36bb4 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c @@ -548,6 +548,7 @@ InternalMemEncryptSevCreateIdentityMap1G ( PAGE_MAP_AND_DIRECTORY_POINTER *PageMapLevel4Entry; PAGE_TABLE_1G_ENTRY *PageDirectory1GEntry; UINT64 PgTableMask; + UINT64 *NewPageTable; UINT64 AddressEncMask; BOOLEAN IsWpEnabled; RETURN_STATUS Status; @@ -602,15 +603,22 @@ InternalMemEncryptSevCreateIdentityMap1G ( PageMapLevel4Entry = (VOID *)(Cr3BaseAddress & ~PgTableMask); PageMapLevel4Entry += PML4_OFFSET (PhysicalAddress); if (!PageMapLevel4Entry->Bits.Present) { - DEBUG (( - DEBUG_ERROR, - "%a:%a: bad PML4 for Physical=0x%Lx\n", - gEfiCallerBaseName, - __FUNCTION__, - PhysicalAddress - )); - Status = RETURN_NO_MAPPING; - goto Done; + NewPageTable = AllocatePageTableMemory (1); + if (NewPageTable == NULL) { + DEBUG (( + DEBUG_ERROR, + "%a:%a: failed to allocate a new PML4 entry\n", + gEfiCallerBaseName, + __FUNCTION__ + )); + Status = RETURN_NO_MAPPING; + goto Done; + } + SetMem (NewPageTable, EFI_PAGE_SIZE, 0); + PageMapLevel4Entry->Uint64 = (UINT64)(UINTN)NewPageTable | AddressEncMask; + PageMapLevel4Entry->Bits.MustBeZero = 0; + PageMapLevel4Entry->Bits.ReadWrite = 1; + PageMapLevel4Entry->Bits.Present = 1; } PageDirectory1GEntry = (VOID *)( -- 2.39.1.456.gfc5497dd1b-goog