From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM10-BN7-obe.outbound.protection.outlook.com (NAM10-BN7-obe.outbound.protection.outlook.com [40.107.92.54]) by mx.groups.io with SMTP id smtpd.web09.14607.1624902221778448138 for ; Mon, 28 Jun 2021 10:43:42 -0700 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@amd.com header.s=selector1 header.b=AW00NfjO; spf=permerror, err=parse error for token &{10 18 %{i}._ip.%{h}._ehlo.%{d}._spf.vali.email}: invalid domain name (domain: amd.com, ip: 40.107.92.54, mailfrom: brijesh.singh@amd.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=M+6anpM2C0m5HiHmXnDo8e9/J28uwyc3WWymR8TQ9+qX7NTIsPGxDsbt81cJ4laG3CqvE+FPz/3XZ3qIyiv5RTaZ7YAk1ApgsrwSPiMHScUZlKKm1otKksKRUzuYN8G1jYfBJKYjF2H5ky/JUuv/PEX+jnEKLbkoxk2QvVuP7EzWZt5Lur3LLzFfifQPfR8NQGx5zlI4iIXUmDQIm++OuYIJrOkFZbDRfaKW+wRQ+HTEwGFnFSW9hgs2T5dHWyZUTukOrbuLqdXCkhAaqc0asbmWJCo1T0KlIvR+vcqXa4k5CWiFmnfE2H7PdO71QSt2ZH0Laa6x9DR0FRhgSxosWA== 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=X4x7TaASwfTqzc0ULE5Yhp7i1E9LcUSyA6138RpOmq0=; b=UY29KComBnemgmqJmiUsaMrrXCS4jH0bC87xbVhGy0KOTlxLjyXr3iOB6ZTYxqBujK/za8raS8Xxg63T0yWu1vYpVYGQ/cGuwB1Xs9KYtXt93fRYwWdn/ZBS5sdjZf87LBi+TpFERYlkMdoLhB6WjVNtn7TfoQWaIhcl7rWTAh5/OiLv6fvcTSeCJy1XULhVpYQi1m09UDvY4P2uRM0+we9QpqKPlA/CQxKUZsoNfJk/gCPFg8hlC/OmjvrdCahUiSs+HqQSa/PmqEaaci71Y7eJzVzQA/8g0fPr6xXivc6QfRiPI8hs9u9oxUYSccpAbHqHEupUbRa017BvCjvpNw== 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 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=X4x7TaASwfTqzc0ULE5Yhp7i1E9LcUSyA6138RpOmq0=; b=AW00NfjOU4lWn1f9rY1ib5jnjqAu6mJtnp6Xel44UZ+MhS6eM41/hzy7uQgRLT7AtjwHmFTDaCv+z9T5D0ZvfVEb13EuG2kfd2XRyOPHnuwJ4CprF1YlHbZdsg7olhM3k6RJnONIbVa+V7etQi0SQKptQnOifM80p6mswKmsSwQ= Authentication-Results: edk2.groups.io; dkim=none (message not signed) header.d=none;edk2.groups.io; dmarc=none action=none header.from=amd.com; Received: from DM6PR12MB2714.namprd12.prod.outlook.com (2603:10b6:5:42::18) by DM6PR12MB4371.namprd12.prod.outlook.com (2603:10b6:5:2a3::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4264.18; Mon, 28 Jun 2021 17:43:40 +0000 Received: from DM6PR12MB2714.namprd12.prod.outlook.com ([fe80::7df8:b0cd:fe1b:ae7b]) by DM6PR12MB2714.namprd12.prod.outlook.com ([fe80::7df8:b0cd:fe1b:ae7b%5]) with mapi id 15.20.4264.026; Mon, 28 Jun 2021 17:43:40 +0000 From: "Brijesh Singh" To: devel@edk2.groups.io CC: James Bottomley , Min Xu , Jiewen Yao , Tom Lendacky , Jordan Justen , Ard Biesheuvel , Laszlo Ersek , Erdem Aktas , Eric Dong , Ray Ni , Rahul Kumar , Michael D Kinney , Liming Gao , Zhiguang Liu , Michael Roth , Brijesh Singh Subject: [RFC PATCH v4 16/27] OvmfPkg/MemEncryptSevLib: add support to validate > 4GB memory in PEI phase Date: Mon, 28 Jun 2021 12:42:12 -0500 Message-ID: <20210628174223.1302-17-brijesh.singh@amd.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210628174223.1302-1-brijesh.singh@amd.com> References: <20210628174223.1302-1-brijesh.singh@amd.com> X-Originating-IP: [165.204.77.1] X-ClientProxiedBy: SN4PR0601CA0020.namprd06.prod.outlook.com (2603:10b6:803:2f::30) To DM6PR12MB2714.namprd12.prod.outlook.com (2603:10b6:5:42::18) Return-Path: brijesh.singh@amd.com MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from sbrijesh-desktop.amd.com (165.204.77.1) by SN4PR0601CA0020.namprd06.prod.outlook.com (2603:10b6:803:2f::30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4264.19 via Frontend Transport; Mon, 28 Jun 2021 17:43:39 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 95c03355-240d-4455-5b6a-08d93a5c43c9 X-MS-TrafficTypeDiagnostic: DM6PR12MB4371: 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: BCL:0; X-Microsoft-Antispam-Message-Info: A6851QQFMo0rstfBBM5qGeJgF++lYm41Jer9B/A6JFVDhaC6r/mCqMG4Us1P7/jsKYEeVhFJVT1C6rYsEMXsRWtBdeM3lln9I3cOoYncEI6V+0oQJ3HALdhgFZC/EUzLSZlH3IzzUR8devqe9JVBbAkluxPZK1D0ivL87RC3HujFVOK7GZpmL9+e4PMrMVCVx6tQb4o0m423cuOZTTxXQQ6t4pY3V5NA0aFaQv9j8N6C8jomBuXWtN6v9nZJUTJ8Pd29BgK21Fp0wAz5YewqDroS5EeOwobMcrN3MlTuduA6FQYLPagbXNevP5TutvFXP34L5SaR1o/xARCFVyce6argi/qzoo4cEUIUcCfQNxrMGs+uoaRVqPrMLfScOtPxHtmeLF1hm7b9Lr8oLgP8BbGMDZZuCi/ZGmPz3/dKedByMx61MLFH8LluAJXEUtYTR4MfhB0YrH9owR+yiTkhzXiQGi+gBCmdmDO/YYkgJSpYCfkFbygMEPIgaIuUXOMLBdcuw2POh1h3gaIrqfAZh95itmNcjY6IBNIcvjuSJhFDJ9lnLnpuM1NXQHSvUlJdtHrfXYFF62msgLBHCA18s5e3uICj6xtf4gedTmwB/xJGNKc4iuZwMgS+6+CL4CgEzmGaJZgWqkx6FYNo4E0sjIK1kQfa027E60FZVIzKL2VZ6VaK84mBeyhU6KAVQ4DDtXeP+VqtPZhF83AZxM/I3y3ybX/ftt9jw7FLVLxAMNuG/0bo98JHGZsEdqDHR57O1ZNMbsWDHLfEPjV28zZEVaI4QaDx8v3jQoTQjS3pzZkKO84wzXj/o95B6+Cgm00a X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR12MB2714.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(4636009)(39860400002)(136003)(376002)(396003)(346002)(366004)(8676002)(15650500001)(8936002)(83380400001)(7416002)(66946007)(1076003)(36756003)(478600001)(7696005)(19627235002)(38100700002)(186003)(38350700002)(2906002)(26005)(44832011)(52116002)(16526019)(966005)(6666004)(6916009)(4326008)(54906003)(86362001)(5660300002)(2616005)(66556008)(956004)(66476007)(6486002)(316002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?M0cxiU81osARlrbzXcKu22H8d6ryaVwb6KtwT3GKW1+JWNtg4FYeQW7+HpfM?= =?us-ascii?Q?FothnQj1Mz3j69LcKAeeE1HtM9it/MCPiEvlKoxoaQRdBdOdOwVKvKiCmZqS?= =?us-ascii?Q?TUoRRrPQGRH8D9JOZt5wmkjl9XB7TTHn8h9IJifWmGG0kxp7BE/0evnOpvv9?= =?us-ascii?Q?IwNoluPr+K8J9jY6rbjqlzraqQyeKSmP1Vuxbz0E6IJoDen2XT/Z0VljvqO+?= =?us-ascii?Q?pK23756K3qCbedfst52P8Xy7VmTx39wOXAHn1ITM0HjdMVTIDQjM5SebRQTL?= =?us-ascii?Q?sQI4WOFMmo3eV/18mvKy6v98nEQiaE8weW6CzhXnmbik9O7bik6p6/qyIj2J?= =?us-ascii?Q?tNtWcMg14K2k8janY0joOUJ90r7O09YtEcK9rNTq0siFOcZsGehutWlUepa/?= =?us-ascii?Q?Tyq1JduParFnHh6gzbJH1qv0/YwKn8DQfzGPx77I1I2Kh4+TEwHHvkGBI8+I?= =?us-ascii?Q?T5MwIET619MXXLZlP0spmIDE30XjBM/yOIlwJ/mObszXGiTjdGO5dFA1Kpo1?= =?us-ascii?Q?q/BxrxFxeANvjL4C5dUFzcDmQm2K2cBLla11OXMS9b08bU44xjKNVt1s8MqK?= =?us-ascii?Q?AnjtHfiXM8JQAQz3q0QBdlBGeVAjp3siy/xhGqL0vehMEmYgw6m66F+TtupQ?= =?us-ascii?Q?UxsXuAzRuqYfbKWbpvZJkQjPCxEo0pwJTXguZumVz3Q40/GgVBtT1NSU90Nm?= =?us-ascii?Q?ReerCOKB1Vi/fYxulG47eyXQdeWo59iCO+YJJHZp0s1QPRI4OfcNYqMN+Whi?= =?us-ascii?Q?CZKilA/k7kEByi+uFK416LG4rhsyPXSimK4Fd8b4aBAhqosL61/DXMEDtGmn?= =?us-ascii?Q?R2U5MLv2VMxAOrJ91TNNjZ+rohqlv+7qRHlD45UAhJbF/j9B8E+YSAexoOQa?= =?us-ascii?Q?iLJYLNk3WhXXqcAlS0ayXXSM7amqwGxP0lw6rlKTJ3i43NF4qNAFVK3/T2/E?= =?us-ascii?Q?I8S/XqvbY8osuDKvDu5MBe1pPVBqILqJ9iX2uHSYipmXJQwqurWuImXGBNEQ?= =?us-ascii?Q?VhnODIq+gApxJWabNTg3kFrX5jVgvCGFIUUNW4vu+qXeEuAya4R7eBstDwUP?= =?us-ascii?Q?xUKl3TzbIAK30FtGcYxWy8WJxhBlgQte+3g9gng5WGys25iJXR6lvbD+2FLx?= =?us-ascii?Q?k1bm4mBX63kXJl0u+pEZmvqBCtVXSWpLPGE5+1gdCU2hBJdBIjHFfJBOe0rZ?= =?us-ascii?Q?F9pJSXaPJiXNThzm5wwsl47A7tNX2q+QWYQLPpXJR0R4NubjqNgEEAtbMpPN?= =?us-ascii?Q?jxU+ZGdW840yif/fI91Y8vKZzvjqe+lDXGE6fIUl7g6gbbhkDwuJHYoZNGpO?= =?us-ascii?Q?LPNrlq3YvD2pdL29bBqUhJgF?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 95c03355-240d-4455-5b6a-08d93a5c43c9 X-MS-Exchange-CrossTenant-AuthSource: DM6PR12MB2714.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Jun 2021 17:43:39.9556 (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: q/WB69QrsXKGn0QgFxK4UbChxeKOvXMk0HiUbjAWj8g2erSwpIr8jhutJWTRiWCWNTrZZ4uxy8gaz/lfj/AC+Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4371 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain 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 --- .../BaseMemEncryptSevLib/X64/VirtualMemory.h | 19 +++ .../X64/PeiDxeVirtualMemory.c | 115 ++++++++++++++++++ .../X64/PeiSnpSystemRamValidate.c | 22 ++++ 3 files changed, 156 insertions(+) diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h b/Ovm= fPkg/Library/BaseMemEncryptSevLib/X64/VirtualMemory.h index 21bbbd1c4f9c..aefef68c30c0 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 diff --git a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c= b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/PeiDxeVirtualMemory.c index c696745f9d26..f146f6d61cc5 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 3e692a3b869d..69ffb79633c4 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. --=20 2.17.1