From nobody Sat Apr 20 08:23:47 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+74650+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+74650+1787277+3901457@groups.io; arc=fail (BodyHash is different from the expected one); dmarc=fail(p=none dis=none) header.from=amd.com Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1619783565939322.6155673898551; Fri, 30 Apr 2021 04:52:45 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id SXMbYY1788612x4fMGPGWWuZ; Fri, 30 Apr 2021 04:52:45 -0700 X-Received: from NAM10-BN7-obe.outbound.protection.outlook.com (NAM10-BN7-obe.outbound.protection.outlook.com []) by mx.groups.io with SMTP id smtpd.web12.10214.1619783548337545009 for ; Fri, 30 Apr 2021 04:52:34 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=az75ZLrTO1DmRmjQQ5DnA8MjtPrVG7C4gj/d476+FjrJkYY/uXlrNqiTZ5wA2EozH02a3qer3SZ8t/NRw1boYNEd8xAn7q+eOSo6qajURNGfgNM0K+Ahv5RYVTlbFY3vGZimqsqpOdYNCfwHbLvG7T5W7AubY7PmopFE9d+xNdDQtBNC3SH/UeyhTohnNF60bgEDdTY08OceRQ8YKa8LJ3fLnJtOEqu2cONBBtvanWKBEvFSIS6+HlW+voWoO3t+phkZRUP97ZEmafHwCZWQE5Zw10zQBOo/AomFoIIUhxpBLC8cPZ6EqIGK4tfd8d7MX/sXIkDC7w57x5eedKnNBg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=RFODU3l7Yydv8RQ8TUN20YOP3Hvnu7ckfSWlCwcS7bA=; b=ElGKU/ge5JVbhAGxIvfcerBSHC4ys78NgU+ucEaUbBdEQVoyYZwxFxVS7pPHyz5UgtZG2qxJdt5mSZ+7mn19T2ojg6WhCvkOPtwZKCo+X6zo2OUcFI7a5jtjGqlHiQJrNBbClPwbuKTXYwLK4jYHawE+guYy53Ny99B7C/7b2NGFWxwceF8g5ZVIddQPvvn0I0q1x8H15uuteUu4F4Kze5HRp6xaXTdg3D8Ndc048oQH4/KbH9jo5J06K5q/CT34O26EAVZ8+xHq8u3l/ZCFTAj9qRgDECua4GSx1Ja8NPOzLIPK5Hb1ArMGLUogVlq9dVs5XLvRjGiTtVaXxp3k1w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none X-Received: from SN6PR12MB2718.namprd12.prod.outlook.com (2603:10b6:805:6f::22) by SN6PR12MB2783.namprd12.prod.outlook.com (2603:10b6:805:78::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4065.25; Fri, 30 Apr 2021 11:52:32 +0000 X-Received: from SN6PR12MB2718.namprd12.prod.outlook.com ([fe80::9898:5b48:a062:db94]) by SN6PR12MB2718.namprd12.prod.outlook.com ([fe80::9898:5b48:a062:db94%6]) with mapi id 15.20.4065.027; Fri, 30 Apr 2021 11:52:32 +0000 From: "Brijesh Singh" To: devel@edk2.groups.io Cc: Brijesh Singh , James Bottomley , Min Xu , Jiewen Yao , Tom Lendacky , Jordan Justen , Ard Biesheuvel , Laszlo Ersek , Erdem Aktas Subject: [edk2-devel] [PATCH RFC v2 23/28] OvmfPkg/MemEncryptSevLib: Add support to validate > 4GB memory in PEI phase Date: Fri, 30 Apr 2021 06:51:43 -0500 Message-Id: <20210430115148.22267-24-brijesh.singh@amd.com> In-Reply-To: <20210430115148.22267-1-brijesh.singh@amd.com> References: <20210430115148.22267-1-brijesh.singh@amd.com> X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: SA0PR12CA0006.namprd12.prod.outlook.com (2603:10b6:806:6f::11) To SN6PR12MB2718.namprd12.prod.outlook.com (2603:10b6:805:6f::22) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-Received: from sbrijesh-desktop.amd.com (165.204.77.1) by SA0PR12CA0006.namprd12.prod.outlook.com (2603:10b6:806:6f::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4087.27 via Frontend Transport; Fri, 30 Apr 2021 11:52:29 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 88fc6cac-4d94-4123-10ec-08d90bce6eed X-MS-TrafficTypeDiagnostic: SN6PR12MB2783: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:8273; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: P55PHuqt0Sm26IxI/WYHNJ+ufQtwWYZpuknqNxq7yjiBQd0l4a0zgNTUZ/MzKlbkqBTF/wC8dyUQARCEL6/fHcMFHqjS4N1B4iosJvWb9rpmAO+VQ8a/ADy3Is1R8wVNyoCouzd0zdV6w01HPgR7qPaFTvhsZ48ejnVTjPZYygmkQAZN2jESzHqScpEXWQnkGh6vuaEiUoppFK8rsTSHaK+ItojyNXqSKdnQtcLV/2IFOEWHFuadLRUX/U9n13BR60zDpS5OIEn/hPpjGMvDMcrYBSS7QAsRhdzK7q/0T142LzmZHqPnRcTUaLzChZc6PP+iWyXdpBHUuZ1ix6F9nH3TSWKa0OTx/MimeOeTwMtPJ0sf40rt5rmi+3pRtRKcFfUx+CwbIhFDSdLXF2ReV0u4cJWlh8leHJoYCtU/nn7J4JtOU1p+z9yBP6hbv3a0F/SZNh8OtbUo+9NatbtsXaiCaTJq4S2KDewW+UMNBieqIeSB0H5QT/XZFKr3XdLwbYgKZvxFjQtLIF1DlJI18dHdGdwz/gaw/m60Gvjnli8p1QNQdAFEfpKQkRfXeI65Sn5O2RpQ5o9nqYeHMXPNGknglBm5zm5K482Z3zbf7tLWtUiFHyGG28TBEgRxoJXFNLkegyHhZMnCc1Ny6bub567uxREGsW0oD+4P48zBN+EypLzLfVSyzIuFUPPpCFZ5jkfWOCMdSbrMHHwfocCepr04w4TFT9wALu9J1lQPFgM= X-MS-Exchange-AntiSpam-MessageData: =?us-ascii?Q?tRd6V6no77OsPkuT7UfCMWCNN44NOLpZwFCL8jVu6zDFsTe8VTSnt9tOFrD7?= =?us-ascii?Q?lD0dp67xOzm4ePtDsVvxFTbAGz5cqpp3a4qGtJoSRqkhu8sJ+5wFWe6GGy7W?= =?us-ascii?Q?nsbM0D94cy+fTrgEquOoFuc7rje2b1R5p2C7bHSxaH+gXq78XXPJxflLbslS?= =?us-ascii?Q?+wAoXGXwlx7vIetblF4YqhX7Ws46jVL8GtgB245xNN9nPTuQbbSD9n1EIAic?= =?us-ascii?Q?M1HYsWqeIeFT7+Y368zB/IJoiz5Mh3+Gw8u2SeUxOT94g5EpDWhBzzZdUdn6?= =?us-ascii?Q?rfZMSNld9Miuz0P5+52qXI/vZYW2h7bAsMGwVIk8kT1ciMXkQlk0HvZQfE8E?= =?us-ascii?Q?g86YkD+2uFkcHN45KhxX2tWvDsU50dIrxuraA70HjyAAEzVROqsUtQAdP0n1?= =?us-ascii?Q?s3wuyH5hFBb0E9m2gFDXHhV6PaMb+jY7mxNls8URG5CpWFBKb8ny15+Rudue?= =?us-ascii?Q?OJgTlHWM8XPgI2sBJBE6jtRGSW4+ZfEO78+tEglqwCzWud3EUuRKZnpj7LxG?= =?us-ascii?Q?ntpMiB7nRtoHRxOHk0N28JQCe1d3udlvsDu8ENsAr7D1fRipJ+PpAcKLc1zO?= =?us-ascii?Q?dPoFYhy8dJ1wojtHve8tfNMJnUTVFDoJ4EK6kQsfmR1Fhbg9NcmUnmHP1Vxw?= =?us-ascii?Q?zeIx5WulALonc4SKHTxB3rRiVEAJ0by8yIw/zh+bPBZG/68YDTG8hf1iXwEY?= =?us-ascii?Q?EnMEEytjRxh8NgZlAuhTIEXkweWlske38gOwfoSUDzp1DGoJp/tIt5uJs5Zd?= =?us-ascii?Q?XvO8o6FpmnCmDbru12Z/BUSIOwsQOCM/fmc1bZsK6zGjw2AAC5x+ob3HKyHn?= =?us-ascii?Q?RRzG2uL9mjKYouo6C0qzLllfiQAjOgOe+E3nsyj+VvgM7cpfeytGFinA+Iho?= =?us-ascii?Q?O3A22qnbMz6j7WPELxDVZyjV43fsWGRI2l0P5WPPmKcyg5wxr/kv97G+47X3?= =?us-ascii?Q?Esyh1aglOAEjzpOs1tN6KEA2GO2VwrJazo/yM52lABRGl2DyMI7uFg3nt91+?= =?us-ascii?Q?8oClfQMhCo0N9ZS8963xw46VxYlMLxuNNr+tF4h1l5EToqbRtvKnGsqeNQ/T?= =?us-ascii?Q?04rH6rIcGa7EPpSVfle2BOXMBm/V9vZRokPPU3gvu8DxJz0lBWBsQ9/cnl9h?= =?us-ascii?Q?l6Urkg79fHoqlS360K2D/gtDeCkJ8jY9grj7HoTij3tnYk+VHOx3SMLrysKy?= =?us-ascii?Q?3IaFedlfXxAh4dQIC8e/A6AKYR/9AOjy1lWReFbsYLx2SCYeNJbdUZw0MKjK?= =?us-ascii?Q?Wj+qEgMheIcbLMzJ/gY89/GVUBMdCRL9JaeKjbsZgTESImfC7N1doriK1jD4?= =?us-ascii?Q?Bz7+34AYaF5qFUCRYVOHwyB8?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 88fc6cac-4d94-4123-10ec-08d90bce6eed X-MS-Exchange-CrossTenant-AuthSource: SN6PR12MB2718.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Apr 2021 11:52:30.3283 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: bRvE2NXalrIqMQm4c07/phRv5tazs/2FIL+kCnO9QRhjEJmE7N+93+ZfZbGJ7bk5TlILOKPQTmESfLwj0OokrQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN6PR12MB2783 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,brijesh.singh@amd.com X-Gm-Message-State: Ewjk3vb1okV6O1BRXFtmW3Vhx1787277AA= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1619783565; bh=hTGGKAhJ1R0915kgJ5RZpGNOPqJUy4M/Cz9uosiWIbc=; h=Cc:Content-Type:Date:From:Reply-To:Subject:To; b=LforOngnUjUBbcl67Z3B91oNncmPb8SZ8HRwzcogYHcEzpIJIwYF1DXHMZIOkyqffNQ BVg3i14HWqKobL4TPKBzi49Fj9HHRzEwsHcy+wYeF5TNFpVxvRQMRIVszpTW5uGl0L/3x 2Tit+jOBSGXt3Sd9lpXRPw2OOqp2nPUYezg= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3275 The initial page built during the SEC phase is used by the MemEncryptSevSnpValidateSystemRam() for the system RAM validation. The page validation process requires using the PVALIDATE instruction; the instruction accepts a virtual address of the memory region that needs to be validated. If hardware encounters a page table walk failure (due to page-not-present) then it raises #GP. The initial page table built in SEC phase address up to 4GB. Add an internal function to extend the page table to cover > 4GB. The function builds 1GB entries in the page table for access > 4GB. This will provide the support to call PVALIDATE instruction for the virtual address > 4GB in PEI phase. Cc: James Bottomley Cc: Min Xu Cc: Jiewen Yao Cc: Tom Lendacky Cc: Jordan Justen Cc: Ard Biesheuvel Cc: Laszlo Ersek Cc: Erdem Aktas Signed-off-by: Brijesh Singh --- OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c | 115 += +++++++++++++++++++ OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiSnpSystemRamValidate.c | 22 += +++ OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h | 19 += +++ 3 files changed, 156 insertions(+) diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c= b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c index 707db5a74a..996a319b26 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c @@ -536,6 +536,121 @@ EnableReadOnlyPageWriteProtect ( AsmWriteCr0 (AsmReadCr0() | BIT16); } =20 +RETURN_STATUS +EFIAPI +InternalMemEncryptSevCreateIdentityMap1G ( + IN PHYSICAL_ADDRESS Cr3BaseAddress, + IN PHYSICAL_ADDRESS PhysicalAddress, + IN UINTN Length + ) +{ + PAGE_MAP_AND_DIRECTORY_POINTER *PageMapLevel4Entry; + PAGE_TABLE_1G_ENTRY *PageDirectory1GEntry; + UINT64 PgTableMask; + UINT64 AddressEncMask; + BOOLEAN IsWpEnabled; + RETURN_STATUS Status; + + // + // Set PageMapLevel4Entry to suppress incorrect compiler/analyzer warnin= gs. + // + PageMapLevel4Entry =3D NULL; + + DEBUG (( + DEBUG_VERBOSE, + "%a:%a: Cr3Base=3D0x%Lx Physical=3D0x%Lx Length=3D0x%Lx\n", + gEfiCallerBaseName, + __FUNCTION__, + Cr3BaseAddress, + PhysicalAddress, + (UINT64)Length + )); + + if (Length =3D=3D 0) { + return RETURN_INVALID_PARAMETER; + } + + // + // Check if we have a valid memory encryption mask + // + AddressEncMask =3D InternalGetMemEncryptionAddressMask (); + if (!AddressEncMask) { + return RETURN_ACCESS_DENIED; + } + + PgTableMask =3D AddressEncMask | EFI_PAGE_MASK; + + + // + // Make sure that the page table is changeable. + // + IsWpEnabled =3D IsReadOnlyPageWriteProtected (); + if (IsWpEnabled) { + DisableReadOnlyPageWriteProtect (); + } + + Status =3D EFI_SUCCESS; + + while (Length) + { + // + // If Cr3BaseAddress is not specified then read the current CR3 + // + if (Cr3BaseAddress =3D=3D 0) { + Cr3BaseAddress =3D AsmReadCr3(); + } + + PageMapLevel4Entry =3D (VOID*) (Cr3BaseAddress & ~PgTableMask); + PageMapLevel4Entry +=3D PML4_OFFSET(PhysicalAddress); + if (!PageMapLevel4Entry->Bits.Present) { + DEBUG (( + DEBUG_ERROR, + "%a:%a: bad PML4 for Physical=3D0x%Lx\n", + gEfiCallerBaseName, + __FUNCTION__, + PhysicalAddress + )); + Status =3D RETURN_NO_MAPPING; + goto Done; + } + + PageDirectory1GEntry =3D (VOID *)( + (PageMapLevel4Entry->Bits.PageTableBaseAddres= s << + 12) & ~PgTableMask + ); + PageDirectory1GEntry +=3D PDP_OFFSET(PhysicalAddress); + if (!PageDirectory1GEntry->Bits.Present) { + PageDirectory1GEntry->Bits.Present =3D 1; + PageDirectory1GEntry->Bits.MustBe1 =3D 1; + PageDirectory1GEntry->Bits.MustBeZero =3D 0; + PageDirectory1GEntry->Bits.ReadWrite =3D 1; + PageDirectory1GEntry->Uint64 |=3D (UINT64)PhysicalAddress | AddressE= ncMask; + } + + if (Length <=3D BIT30) { + Length =3D 0; + } else { + Length -=3D BIT30; + } + + PhysicalAddress +=3D BIT30; + } + + // + // Flush TLB + // + CpuFlushTlb(); + +Done: + // + // Restore page table write protection, if any. + // + if (IsWpEnabled) { + EnableReadOnlyPageWriteProtect (); + } + + return Status; +} =20 /** This function either sets or clears memory encryption bit for the memory diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiSnpSystemRamValida= te.c b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiSnpSystemRamValidate.c index 1fc3337f7c..ff4c0742ed 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiSnpSystemRamValidate.c +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiSnpSystemRamValidate.c @@ -10,9 +10,12 @@ =20 #include #include +#include +#include #include =20 #include "SnpPageStateChange.h" +#include "VirtualMemory.h" =20 typedef struct { UINT64 StartAddress; @@ -68,6 +71,7 @@ MemEncryptSevSnpPreValidateSystemRam ( { PHYSICAL_ADDRESS EndAddress; SNP_PRE_VALIDATED_RANGE OverlapRange; + EFI_STATUS Status; =20 if (!MemEncryptSevSnpIsEnabled ()) { return; @@ -75,6 +79,24 @@ MemEncryptSevSnpPreValidateSystemRam ( =20 EndAddress =3D BaseAddress + EFI_PAGES_TO_SIZE (NumPages); =20 + // + // The page table used in PEI can address up to 4GB memory. If we are as= ked to + // validate a range above the 4GB, then create an identity mapping so th= at the + // PVALIDATE instruction can execute correctly. If the page table entry = is not + // present then PVALIDATE will #GP. + // + if (BaseAddress >=3D SIZE_4GB) { + Status =3D InternalMemEncryptSevCreateIdentityMap1G ( + 0, + BaseAddress, + EFI_PAGES_TO_SIZE (NumPages) + ); + if (EFI_ERROR (Status)) { + ASSERT (FALSE); + CpuDeadLoop (); + } + } + while (BaseAddress < EndAddress) { // // Check if the range overlaps with the pre-validated ranges. diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h b/Ovm= fPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h index 832ff10a33..25de939797 100644 --- a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h +++ b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h @@ -143,4 +143,23 @@ InternalMemEncryptSevClearMmioPageEncMask ( IN PHYSICAL_ADDRESS PhysicalAddress, IN UINTN Length ); + +/** + Create 1GB identity mapping for the specified virtual address range. + + @param[in] Cr3BaseAddress Cr3 Base Address (if zero then use + current CR3) + @param[in] VirtualAddress Virtual address + @param[in] Length Length of virtual address range + + @retval RETURN_INVALID_PARAMETER Number of pages is zero. + +**/ +RETURN_STATUS +EFIAPI +InternalMemEncryptSevCreateIdentityMap1G ( + IN PHYSICAL_ADDRESS Cr3BaseAddress, + IN PHYSICAL_ADDRESS PhysicalAddress, + IN UINTN Length + ); #endif --=20 2.17.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#74650): https://edk2.groups.io/g/devel/message/74650 Mute This Topic: https://groups.io/mt/82479076/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-